mirror of
https://github.com/badvision/lawless-legends.git
synced 2024-12-26 19:29:27 +00:00
Started on 2D tile routines, starting with the loading and boundary crossing logic
This commit is contained in:
parent
278d769ade
commit
68d9767947
321
Platform/Apple/virtual/src/tile/tile.s
Normal file
321
Platform/Apple/virtual/src/tile/tile.s
Normal file
@ -0,0 +1,321 @@
|
||||
;@com.wudsn.ide.asm.hardware=APPLE2
|
||||
; Tile routines
|
||||
; ------------------
|
||||
;
|
||||
|
||||
* = $6000
|
||||
; Global definitions
|
||||
!source "../include/global.i"
|
||||
!source "../include/mem.i"
|
||||
!source "../include/plasma.i"
|
||||
|
||||
HEADER_LENGTH=6
|
||||
SECTION_WIDTH=22
|
||||
SECTION_HEIGHT=23
|
||||
VIEWPORT_WIDTH=9
|
||||
VIEWPORT_HEIGHT=9
|
||||
VIEWPORT_VERT_PAD=0 ; This is the distance between the center of the viewport and the top/bottom
|
||||
VIEWPORT_HORIZ_PAD=4 ; This is the distance between the center of the viewport and the left/right
|
||||
MAX_MAP_ID=254 ; This means that the total map area can be as big as 5588x5842 tiles!
|
||||
|
||||
REL_X=$50 ; Will always be in the range 0-43
|
||||
REL_Y=$51 ; Will always be in the range 0-45
|
||||
; Map quadrant data pointers
|
||||
NW_MAP_LOC=$52
|
||||
NE_MAP_LOC=$54
|
||||
SW_MAP_LOC=$56
|
||||
SE_MAP_LOC=$58
|
||||
; Map section IDs (255 = not loaded)
|
||||
NOT_LOADED=$FF
|
||||
NW_MAP_ID=$5A
|
||||
NE_MAP_ID=$5B
|
||||
SW_MAP_ID=$5C
|
||||
SE_MAP_ID=$5D
|
||||
|
||||
NORTH =0
|
||||
EAST =1
|
||||
SOUTH =2
|
||||
WEST =3
|
||||
|
||||
; >> INIT (reset map drawing vars)
|
||||
INIT
|
||||
LDA #NOT_LOADED
|
||||
STA NW_MAP_ID
|
||||
STA NE_MAP_ID
|
||||
STA SW_MAP_ID
|
||||
STA SE_MAP_ID
|
||||
LDX VIEWPORT_HORIZ_PAD
|
||||
LDY VIEWPORT_VERT_PAD
|
||||
JSR SET_XY
|
||||
RTS
|
||||
;----------------------------------------------------------------------
|
||||
; >> LOAD MAP SECTION
|
||||
; Section number is in A
|
||||
; Returns location of loaded data (Y = hi, X = lo)
|
||||
; First 6 bytes are header information
|
||||
; 0 Resource ID of next map section (north), FF = none
|
||||
; 1 Resource ID of next map section (east), FF = none
|
||||
; 2 Resource ID of next map section (south), FF = none
|
||||
; 3 Resource ID of next map section (west), FF = none
|
||||
; 4 Tileset resouce id
|
||||
; 5 Resource ID of script library (if any)
|
||||
LOAD_SECTION
|
||||
CMP #$FF
|
||||
BNE .doLoad
|
||||
LDX #00 ; This is a bogus map section, don't load
|
||||
LDY #00
|
||||
RTS
|
||||
.doLoad
|
||||
;INSERT LOADER HERE
|
||||
RTS
|
||||
!loadSection ptr {
|
||||
JSR LOAD_SECTION
|
||||
STX ptr
|
||||
STY ptr+1
|
||||
}
|
||||
;----------------------------------------------------------------------
|
||||
; >> RELEASE MAP SECTION
|
||||
!macro releaseMapSection resourceId {
|
||||
; --> free up unused resource
|
||||
}
|
||||
;----------------------------------------------------------------------
|
||||
; >> LOAD TILES
|
||||
; Load tile resource (A = Resource ID)
|
||||
;----------------------------------------------------------------------
|
||||
; >> MOVE NORTH
|
||||
; Check for boundary
|
||||
; If none, check for map boundary
|
||||
; If so, move to bottom of next map
|
||||
; If not at boundary
|
||||
; Move up one row
|
||||
; Check to see if viewport is crossing section boundary;
|
||||
; Does new location have a script assigned?
|
||||
; execute script
|
||||
;----------------------------------------------------------------------
|
||||
; >> MOVE EAST
|
||||
; (same as move north, might be able to overlap functionality)
|
||||
;----------------------------------------------------------------------
|
||||
; >> MOVE SOUTH
|
||||
; (same as move north, might be able to overlap functionality)
|
||||
;----------------------------------------------------------------------
|
||||
; >> MOVE WEST
|
||||
; (same as move north, might be able to overlap functionality)
|
||||
;----------------------------------------------------------------------
|
||||
; >> GET TILE IN CARDINAL DIRECTION AND FLAGS
|
||||
; (Returns Tile # in Y, Flags in A)
|
||||
; Each tile in memory can be 0-64, the flags are the upper 3 bits
|
||||
; 0 0 0
|
||||
; | | `- Boundary (Can not cross)
|
||||
; | `--- Requires special (rope, raft, etc)
|
||||
; `----- Script assigned, triggers script lookup
|
||||
;----------------------------------------------------------------------
|
||||
; >> SET X,Y COORDINATES
|
||||
SET_XY
|
||||
STX REL_X
|
||||
STY REL_Y
|
||||
RTS
|
||||
;----------------------------------------------------------------------
|
||||
; >> TRIGGER SCRIPT AT TILE (X,Y = Coordinates in section)
|
||||
;----------------------------------------------------------------------
|
||||
!macro move_zp_word from, to {
|
||||
ldx #from
|
||||
ldy #to
|
||||
jsr move_zp_word
|
||||
}
|
||||
|
||||
!macro move_byte from, to {
|
||||
LDX from
|
||||
STX to
|
||||
}
|
||||
|
||||
move_zp_word
|
||||
; Move a two-byte word from (X) to (Y)
|
||||
lda $00,X
|
||||
sta $00,Y
|
||||
lda $01,X
|
||||
sta $01,Y
|
||||
rts
|
||||
|
||||
; >> CROSS NORTH BOUNDARY (Load next section to the north)
|
||||
!zone
|
||||
CROSS_NORTH
|
||||
!releaseMapSection SW_MAP_ID
|
||||
!releaseMapSection SE_MAP_ID
|
||||
LDA REL_Y
|
||||
CLC
|
||||
ADC #SECTION_HEIGHT
|
||||
STA REL_Y
|
||||
!move_byte NW_MAP_ID, SW_MAP_ID
|
||||
!movezp_word NW_MAP_LOC, SW_MAP_LOC
|
||||
!move_byte NE_MAP_ID, SE_MAP_ID
|
||||
!movezp_word NE_MAP_LOC, SE_MAP_LOC
|
||||
LDA REL_X
|
||||
CMP SECTION_WIDTH+VIEWPORT_HORIZ_PAD
|
||||
BGE .1
|
||||
.nw ; Get new NW section
|
||||
LDA (SW_MAP_LOC)
|
||||
STA NW_MAP_ID
|
||||
!loadSection NW_MAP_LOC
|
||||
LDA REL_X
|
||||
CMP SECTION_WIDTH-VIEWPORT_HORIZ_PAD
|
||||
BGE .2
|
||||
; Skip the NE quadrant if not visible
|
||||
LDA #$FF
|
||||
STA NE_MAP_ID
|
||||
RTS
|
||||
; Skip the NW quadrant if not visible
|
||||
.1 LDA #$FF
|
||||
STA NW_MAP_ID
|
||||
.2 ; Get the new NE section
|
||||
LDA (SE_MAP_LOC)
|
||||
STA NE_MAP_ID
|
||||
!loadSection NE_MAP_LOC
|
||||
RTS
|
||||
;----------------------------------------------------------------------
|
||||
; >> CROSS EAST BOUNDARY (Load next section to the east)
|
||||
!zone
|
||||
CROSS_EAST
|
||||
!releaseMapSection NW_MAP_ID
|
||||
!releaseMapSection SW_MAP_ID
|
||||
LDA REL_X
|
||||
SEC
|
||||
SBC #SECTION_WIDTH
|
||||
STA REL_X
|
||||
!move_byte NE_MAP_ID, NW_MAP_ID
|
||||
!movezp_word NE_MAP_LOC, NW_MAP_LOC
|
||||
!move_byte SE_MAP_ID, SW_MAP_ID
|
||||
!movezp_word SE_MAP_LOC, SW_MAP_LOC
|
||||
LDA REL_Y
|
||||
CMP SECTION_HEIGHT+VIEWPORT_VERT_PAD
|
||||
BGE .1
|
||||
; Get new NE section
|
||||
LDY #EAST
|
||||
LDA (NW_MAP_LOC),Y
|
||||
STA NE_MAP_ID
|
||||
!loadSection NE_MAP_LOC
|
||||
LDA REL_Y
|
||||
CMP SECTION_HEIGHT-VIEWPORT_VERT_PAD
|
||||
BGE .2
|
||||
; Skip the SE quadrant if not visible
|
||||
LDA #$FF
|
||||
STA SE_MAP_ID
|
||||
RTS
|
||||
; Skip the NE quadrant if not visible
|
||||
.1 LDA #$FF
|
||||
STA NE_MAP_ID
|
||||
.2 ; Get the new SE section
|
||||
LDY #EAST
|
||||
LDA (SW_MAP_LOC),Y
|
||||
STA SE_MAP_ID
|
||||
!loadSection SE_MAP_LOC
|
||||
RTS
|
||||
;----------------------------------------------------------------------
|
||||
; >> CROSS SOUTH BOUNDARY (Load next section to the south)
|
||||
!zone
|
||||
CROSS_SOUTH
|
||||
!releaseMapSection NW_MAP_ID
|
||||
!releaseMapSection NE_MAP_ID
|
||||
LDA REL_Y
|
||||
SEC
|
||||
SBC #SECTION_HEIGHT
|
||||
STA REL_Y
|
||||
!move_byte SW_MAP_ID, NW_MAP_ID
|
||||
!movezp_word SW_MAP_LOC, NW_MAP_LOC
|
||||
!move_byte SE_MAP_ID, NE_MAP_ID
|
||||
!movezp_word SE_MAP_LOC, NE_MAP_LOC
|
||||
LDA REL_X
|
||||
CMP SECTION_WIDTH+VIEWPORT_HORIZ_PAD
|
||||
BGE .1
|
||||
; Get new SW section
|
||||
LDY #SOUTH
|
||||
LDA (NW_MAP_LOC),Y
|
||||
STA SW_MAP_ID
|
||||
!loadSection SW_MAP_LOC
|
||||
LDA REL_X
|
||||
CMP SECTION_WIDTH-VIEWPORT_HORIZ_PAD
|
||||
BGE .2
|
||||
; Skip the NE quadrant if not visible
|
||||
LDA #$FF
|
||||
STA SE_MAP_ID
|
||||
RTS
|
||||
; Skip the NW quadrant if not visible
|
||||
.1 LDA #$FF
|
||||
STA SW_MAP_ID
|
||||
.2 ; Get the new SE section
|
||||
LDY #SOUTH
|
||||
LDA (SE_MAP_LOC),Y
|
||||
STA SE_MAP_ID
|
||||
!loadSection SE_MAP_LOC
|
||||
RTS
|
||||
;----------------------------------------------------------------------
|
||||
; >> CROSS WEST BOUNDARY (load next section to the west)
|
||||
!zone
|
||||
CROSS_WEST
|
||||
!releaseMapSection NE_MAP_ID
|
||||
!releaseMapSection SE_MAP_ID
|
||||
LDA REL_X
|
||||
CLC
|
||||
ADC #SECTION_WIDTH
|
||||
STA REL_X
|
||||
!move_byte NW_MAP_ID, NE_MAP_ID
|
||||
!movezp_word NW_MAP_LOC, NE_MAP_LOC
|
||||
!move_byte SW_MAP_ID, SE_MAP_ID
|
||||
!movezp_word SW_MAP_LOC, SE_MAP_LOC
|
||||
LDA REL_Y
|
||||
CMP SECTION_HEIGHT+VIEWPORT_VERT_PAD
|
||||
BGE .1
|
||||
; Get new NW section
|
||||
LDY #WEST
|
||||
LDA (NE_MAP_LOC),Y
|
||||
STA NW_MAP_ID
|
||||
!loadSection NW_MAP_LOC
|
||||
LDA REL_Y
|
||||
CMP SECTION_HEIGHT-VIEWPORT_VERT_PAD
|
||||
BGE .2
|
||||
; Skip the SW quadrant if not visible
|
||||
LDA #$FF
|
||||
STA SW_MAP_ID
|
||||
RTS
|
||||
; Skip the NE quadrant if not visible
|
||||
.1 LDA #$FF
|
||||
STA NW_MAP_ID
|
||||
.2 ; Get the new SE section
|
||||
LDY #WEST
|
||||
LDA (SE_MAP_LOC),Y
|
||||
STA SW_MAP_ID
|
||||
!loadSection SW_MAP_LOC
|
||||
RTS
|
||||
;----------------------------------------------------------------------
|
||||
; >> SET PLAYER TILE (A = tile)
|
||||
;----------------------------------------------------------------------
|
||||
; >> SET NPC TILE (A = tile, X,Y = coordinates in section)
|
||||
;----------------------------------------------------------------------
|
||||
; >> DRAW
|
||||
!zone draw
|
||||
DRAW
|
||||
; For each quadrant, display relevant parts of screen
|
||||
.checkNorthQuads
|
||||
LDA REL_Y
|
||||
CMP SECTION_HEIGHT+VIEWPORT_VERT_PAD
|
||||
BGE .checkSouthQuads
|
||||
; Check for NW quadrant area
|
||||
; Check for NE quadrant area
|
||||
.checkSouthQuads
|
||||
; Check for SW quadrant area
|
||||
; Check for SE quadrand area
|
||||
RTS
|
||||
.mainDraw
|
||||
; Identify start of map data (upper left)
|
||||
; Display row of tiles
|
||||
; Get tile
|
||||
; Is there a NPC there?
|
||||
; No, use map tile
|
||||
; Yes, use NPC tile
|
||||
; Compare tile to last-drawn tile
|
||||
; Skip if no change
|
||||
; Is this the first time we're drawing this row?
|
||||
; -- It is, update the draw pointers
|
||||
; If tile is different then redraw
|
||||
; -- unrolled loop for 16 rows at a time
|
||||
; Increment row
|
||||
; Draw player
|
Loading…
Reference in New Issue
Block a user