Added texture control, so we can swap out textures in 3D mode to make room for a portrait.

This commit is contained in:
Martin Haye
2015-12-28 10:20:28 -08:00
parent d5d30639d6
commit c4e88d3873
3 changed files with 77 additions and 15 deletions

View File

@@ -60,7 +60,7 @@ byte isPlural = FALSE
word skyNum = 9 word skyNum = 9
word groundNum = 10 word groundNum = 10
byte portraitNum = 1 byte portraitNum = 0
word triggerOriginX, triggerOriginY word triggerOriginX, triggerOriginY
word triggerTbl word triggerTbl
@@ -181,6 +181,10 @@ asm render // no params
+asmPlasm 0 +asmPlasm 0
jmp $6018 jmp $6018
end end
asm texControl // params: load (1=load, 0=unload)
+asmPlasm 1
jmp $601B
end
/////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////
asm setAuxCopy asm setAuxCopy
@@ -1267,6 +1271,7 @@ def clearPortrait()
if curPortrait if curPortrait
auxMmgr(FREE_MEMORY, curPortrait) auxMmgr(FREE_MEMORY, curPortrait)
curPortrait = 0 curPortrait = 0
texControl(1) // 1=load
needRender = TRUE needRender = TRUE
fin fin
end end
@@ -1666,6 +1671,9 @@ def _setPortrait(portraitNum)
// We're going to switch windows. Save the cursor pos in the text window. // We're going to switch windows. Save the cursor pos in the text window.
saveCursor() saveCursor()
// Make room by unloading the textures
texControl(0)
// Now clear out the map area // Now clear out the map area
setMapWindow() setMapWindow()
clearWindow() clearWindow()
@@ -1686,20 +1694,25 @@ def _setPortrait(portraitNum)
// And show the first frame // And show the first frame
showAnimFrame() showAnimFrame()
end
/////////////////////////////////////////////////////////////////////////////////////////////////// // Do not render over the portrait
// Clear the displayed portrait drawing needRender = FALSE
def clrPortrait()
doRender()
end end
/////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////
// Test out portrait drawing // Test out portrait drawing
def testPortrait() def nextPortrait()
setPortrait(portraitNum)
portraitNum = portraitNum + 1 portraitNum = portraitNum + 1
needRender = FALSE setPortrait(portraitNum)
end
///////////////////////////////////////////////////////////////////////////////////////////////////
// Test out portrait drawing
def prevPortrait()
if portraitNum > 1
portraitNum = portraitNum - 1
fin
setPortrait(portraitNum)
end end
/////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1883,7 +1896,8 @@ def initCmds()
// Commands common to both 2D and 3D // Commands common to both 2D and 3D
initCmd('T', @kbdTeleport) initCmd('T', @kbdTeleport)
initCmd('P', @showPos) initCmd('P', @showPos)
initCmd('/', @testPortrait) initCmd('/', @nextPortrait)
initCmd('?', @prevPortrait)
initCmd('!', @testCombat) initCmd('!', @testCombat)
initCmd('1', @showPlayer1) initCmd('1', @showPlayer1)
initCmd('2', @showPlayer2) initCmd('2', @showPlayer2)
@@ -2011,7 +2025,7 @@ def setCallbacks()
// $31E // $31E
callbacks.30 = $4c callbacks.30 = $4c
callbacks:31 = @clrPortrait callbacks:31 = @clearPortrait
// $321 // $321
callbacks.33 = $4c callbacks.33 = $4c

View File

@@ -29,6 +29,7 @@ start:
jmp pl_advance ; params: none; return: 0 if same, 1 if new map tile, 2 if new and scripted jmp pl_advance ; params: none; return: 0 if same, 1 if new map tile, 2 if new and scripted
jmp pl_setColor ; params: slot (0=sky/1=ground), color (0-15); return: nothing jmp pl_setColor ; params: slot (0=sky/1=ground), color (0-15); return: nothing
jmp pl_render ; params: none jmp pl_render ; params: none
jmp pl_texControl ; params: 0=unload textures, 1=load textures
; Conditional assembly flags ; Conditional assembly flags
DOUBLE_BUFFER = 1 ; whether to double-buffer DOUBLE_BUFFER = 1 ; whether to double-buffer
@@ -72,6 +73,7 @@ mapNum: !byte 1
nMapSprites: !byte 0 ; number of sprite entries on map to fix up nMapSprites: !byte 0 ; number of sprite entries on map to fix up
nextLink: !byte 0 ; next link to allocate nextLink: !byte 0 ; next link to allocate
plasmaStk: !byte 0 plasmaStk: !byte 0
nTextures: !byte 0
skyColorEven: !byte $20 skyColorEven: !byte $20
skyColorOdd: !byte $22 skyColorOdd: !byte $22
@@ -1562,10 +1564,12 @@ getTileFlags: !zone
rts rts
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
; Parse map header, and load the textures into aux mem. Also loads the script ; Parse map header, and load the textures into aux mem. Also, loads the script
; module and inits it. ; module, and if A-reg is nonzero, inits it.
loadTextures: !zone loadTextures: !zone
!if DEBUG { +prStr : !text "Loading textures.",0 } !if DEBUG { +prStr : !text "Loading textures.",0 }
; Save parameter (non-zero: init scripts)
pha
; Scan the map header ; Scan the map header
lda mapHeader lda mapHeader
sta .get+1 sta .get+1
@@ -1603,6 +1607,8 @@ loadTextures: !zone
+ stx txNum + stx txNum
jmp .lup jmp .lup
.done: ; end of texture numbers is the list of tile flags .done: ; end of texture numbers is the list of tile flags
lda txNum
sta nTextures
lda .get+1 lda .get+1
sta getTileFlags+2 sta getTileFlags+2
lda .get+2 lda .get+2
@@ -1621,17 +1627,51 @@ loadTextures: !zone
ldx #0 ldx #0
jsr mainLoader jsr mainLoader
; finally, init the scripts. ; finally, init the scripts.
pla
beq .fin
!if DEBUG { +prStr : !text "Calling script init ",0 : +prWord .scInit+1 : +crout } !if DEBUG { +prStr : !text "Calling script init ",0 : +prWord .scInit+1 : +crout }
ldx plasmaStk ldx plasmaStk
.scInit jsr $1111 ; self-modified earlier .scInit jsr $1111 ; self-modified earlier
!if DEBUG { +prStr : !text "Back from script init. ",0 } !if DEBUG { +prStr : !text "Back from script init. ",0 }
rts .fin rts
.get: lda $1111 .get: lda $1111
inc .get+1 inc .get+1
bne + bne +
inc .get+2 inc .get+2
+ rts + rts
;-------------------------------------------------------------------------------
; Plasma interface to texture control: 1 to load textures, 0 to unload
pl_texControl: !zone {
cmp #0
beq .unload
lda #0 ; don't re-init scripts
jmp loadTextures
.unload ldx #0
- txa
pha
ldy texAddrHi,x
lda texAddrLo,x
+prStr : !text "tex ",0
+prX
+prYA
+crout
tax
lda #FREE_MEMORY
jsr auxLoader
pla
tax
lda #0
sta texAddrLo,x
sta texAddrHi,x
inx
cpx nTextures
bne -
rts
}
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
; Set up front and back buffers, go to hires mode, and clear for first blit. ; Set up front and back buffers, go to hires mode, and clear for first blit.
graphInit: !zone graphInit: !zone
@@ -2033,6 +2073,7 @@ pl_initMap: !zone
ldy #>(tableEnd-tableStart) ldy #>(tableEnd-tableStart)
jsr mainLoader jsr mainLoader
; Proceed with loading ; Proceed with loading
lda #1 ; non-zero to init scripts also
jsr loadTextures jsr loadTextures
jsr copyScreen jsr copyScreen
; Build all the unrolls and tables ; Build all the unrolls and tables

View File

@@ -112,7 +112,8 @@ next_zp = $AB
JMP pl_setDir ; params: dir (0-15); return: nothing JMP pl_setDir ; params: dir (0-15); return: nothing
JMP pl_advance ; params: none; return: 0 if same, 1 if new map tile, 2 if new and scripted JMP pl_advance ; params: none; return: 0 if same, 1 if new map tile, 2 if new and scripted
JMP pl_setColor ; params: slot (0=sky/1=ground), color (0-15); return: nothing JMP pl_setColor ; params: slot (0=sky/1=ground), color (0-15); return: nothing
jmp pl_render ; params: none JMP pl_render ; params: none
JMP pl_texControl ; params: 1=load, 0=unload
;---------------------------------------------------------------------- ;----------------------------------------------------------------------
; >> START LOADING MAP SECTIONS ; >> START LOADING MAP SECTIONS
@@ -1221,6 +1222,12 @@ pl_setDir:
STA AVATAR_DIR STA AVATAR_DIR
RTS RTS
;----------------------------------------------------------------------
; >> pl_texControl
; No-op, because in 2D there aren't textures
pl_texControl:
rts
;---------------------------------------------------------------------- ;----------------------------------------------------------------------
INNER_ADVANCE: !zone { INNER_ADVANCE: !zone {
LDA AVATAR_DIR LDA AVATAR_DIR