More work on 2D script triggers.

This commit is contained in:
Martin Haye 2015-03-03 09:03:22 -08:00
parent 152fa2bd8b
commit 315c6b6936
4 changed files with 96 additions and 39 deletions

View File

@ -32,7 +32,7 @@
<!-- Build sub-projects -->
<echo>Building core.</echo>
<ant dir="${src.dir}/core" target="build" useNativeBasedir="true" inheritAll="false"/>
<echo>Building PLASMA.</echo>
<echo>Building game loop.</echo>
<ant dir="${src.dir}/plasma" target="build" useNativeBasedir="true" inheritAll="false"/>
<echo>Building raycast.</echo>
<ant dir="${src.dir}/raycast" target="build" useNativeBasedir="true" inheritAll="false"/>

View File

@ -88,7 +88,7 @@ partFileRef: !byte 0
fixupHint: !word 0
;------------------------------------------------------------------------------
!source "../include/debug.i"
!if DEBUG { !source "../include/debug.i" }
;------------------------------------------------------------------------------
grabSegment: !zone
@ -238,9 +238,11 @@ main_dispatch: !zone
+ cmp #FREE_MEMORY
bne +
jmp main_free
!if DEBUG {
+ cmp #DEBUG_MEM
bne +
jmp main_debug
}
+ cmp #CALC_FREE
bne shared_dispatch
jmp main_calcFree
@ -276,9 +278,11 @@ aux_dispatch: !zone
+ cmp #FREE_MEMORY
bne +
jmp aux_free
!if DEBUG {
+ cmp #DEBUG_MEM
bne +
jmp aux_debug
}
+ cmp #CALC_FREE
bne +
jmp aux_calcFree
@ -287,7 +291,7 @@ aux_dispatch: !zone
;------------------------------------------------------------------------------
; Sanity check mode
!if SANITY_CHECK {
saneStart: !zone
saneStart: !zone {
pha
tya
pha
@ -298,23 +302,33 @@ saneStart: !zone
tax
pla
tay
+prChr 'M'+$80
+prChr 'M'
pla : pha : +prA
+prX : +prY
pla
rts
}
saneCheck: !zone
rts
saneCheck: !zone {
lda $BF00
cmp #$4C
beq +
brk
+ lda $E1
cmp #$BE
bcc +
brk
+ rts
}
saneEnd: !zone
saneEnd: !zone {
pha
tya
pha
txa
pha
jsr saneCheck
+prChr 'm'+$80
+prChr 'm'
+crout
pla
tax
@ -323,6 +337,7 @@ saneEnd: !zone
pla
rts
}
}
;------------------------------------------------------------------------------
; Print fatal error message (custom or predefined) and print the
@ -397,7 +412,13 @@ fatalError: !zone
init: !zone
; put something interesting on the screen :)
jsr home
+prStr : !text "Welcome to MythOS.",0
ldx #0
- lda .welcomeStr,x
beq +
jsr cout
inx
bne -
+
; close all files
lda #0
jsr closeFile
@ -489,14 +510,20 @@ init: !zone
cpy #MAX_SEGS ; did all segments yet?
bne .loop ; no, loop again
; Allocate space for the PLASMA frame stack
!if SANITY_CHECK {
lda #$20
sta framePtr+1 ; because sanity check verifies it's not $BE or $BF
}
ldx #0
ldy #2 ; 2 pages
lda #REQUEST_MEMORY
jsr mainLoader
stx framePtr
stx outerFramePtr
iny ; twice for 2 pages: initial pointer at top of new space
iny
sty framePtr+1
sty outerFramePtr+1
dey
dey
lda #LOCK_MEMORY ; lock it in place forever
@ -518,8 +545,10 @@ init: !zone
jsr mainLoader
ldx #$10 ; initial eval stack index
.gomod: jmp $1111 ; jump to module for further bootstrapping
.welcomeStr !text "Welcome to MythOS.",$8D,0
;------------------------------------------------------------------------------
!if DEBUG {
printMem: !zone
jsr main_debug
jmp aux_debug
@ -561,6 +590,7 @@ aux_debug:
jsr cout
txa
jmp prbyte
}
;------------------------------------------------------------------------------
reset: !zone

View File

@ -2,3 +2,4 @@
evalStkL = $C0
evalStkH = $D0
framePtr = $E0
outerFramePtr = $E2

View File

@ -98,10 +98,6 @@ const wndbtm = $73 // bottom+1 of text window
const cursh = $74 // Cursor H-pos 0-39
const cursv = $75 // Cursor V-pos 0-23
///////////////////////////////////////////////////////////////////////////////////////////////////
// Strings.
byte helloStr[] = "Loading Lawless Legends.\n"
///////////////////////////////////////////////////////////////////////////////////////////////////
// Global variables
byte mapNum = OVERMAP_NUM
@ -121,7 +117,7 @@ byte cacheSky, cacheGround
word cacheX, cacheY
byte cacheDir
byte resetLocFromCache = FALSE
byte anyText = FALSE
byte textDrawn = FALSE
// Movement amounts when walking at each angle
// Each entry consists of an X bump and a Y bump, in 8.8 fixed point
@ -448,6 +444,14 @@ asm goMon
jmp $FF69
end
///////////////////////////////////////////////////////////////////////////////////////////////////
// Jump straight to the system monitor
// Params: None
asm brk
bit setROM
brk
end
///////////////////////////////////////////////////////////////////////////////////////////////////
// Use the font engine to clear the current text window
// Params: None
@ -470,9 +474,6 @@ asm displayStr
bit setROM
txa
pha
; record that text was drawn - for clear window on next script phase
lda #1
sta textDrawn
lda evalStkL,x
sta pTmp
lda evalStkH,x
@ -569,6 +570,9 @@ end
///////////////////////////////////////////////////////////////////////////////////////////////////
// Is there a script attached to the player's current position?
def isScripted()
puts("avatarTile=")
printHex(^avatarTile)
crout()
return ^avatarTile & $20
end
@ -700,7 +704,7 @@ def initMap3D()
// Initialize the map scripts
setWindow2()
clearWindow()
anyText = FALSE
textDrawn = FALSE
prevX = -1
prevY = -1
@ -760,16 +764,17 @@ def initMap2D()
// Start up the font engine
initFontEngine(pFont)
// Start up the tile engine
initDisplayEngine(mapNum)
// For now
prevX = -1
prevY = -1
triggerTbl = NULL
prevMapNum = mapNum
prevMapIs3D = mapIs3D
pScripts = NULL
// Start up the tile engine
initDisplayEngine(mapNum)
// And do the first draw.
renderFrame()
redraw = FALSE
end
@ -832,15 +837,17 @@ def callScripts(x, y)
word p
word pNext
word script
printHex($1001)
puts("callScripts: x=")
printHex(x)
crout()
p = triggerTbl
while TRUE
printHex($1002)
^$c051
puts("y loop, p=")
printHex(p)
puts("^p=")
printHex(^p)
crout()
getUpperKey
@ -848,22 +855,33 @@ def callScripts(x, y)
if ^p == $FF
return
fin
pNext = p + p.1
pNext = p + p->1
puts("p->1=")
printHex(p->1)
crout()
puts("pNext=")
printHex(pNext)
crout()
if ^p == y
p = p + 2
while p < pNext
printHex($1003)
puts(" x loop, p=")
printHex(p)
puts("^p=")
printHex(^p)
puts("x=")
printHex(x)
crout()
if ^p == x
script = p:1
printHex($1004)
if x == ^p
script = p->>x
puts(" script=")
printHex(script)
crout()
*script
fin
p = p + 3
getUpperKey
loop
fin
p = pNext
@ -875,6 +893,9 @@ end
def checkScripts()
word x
word y
puts("checkScripts: triggerTbl=")
printHex(triggerTbl)
crout()
if !triggerTbl
return
fin
@ -885,17 +906,20 @@ def checkScripts()
x = ^avatarX
y = ^avatarY
fin
puts("x=")
printHex(x)
puts(", y=")
printHex(y)
crout()
if x <> prevX or y <> prevY
prevX = x
prevY = y
if anyText
if textDrawn
clearWindow()
anyText = FALSE
textDrawn = FALSE
fin
if isScripted()
textDrawn = FALSE
callScripts(x, y)
anyText = ^textDrawn
fin
fin
if (mapNum <> prevMapNum) or (mapIs3D <> prevMapIs3D)
@ -1018,7 +1042,7 @@ def teleport(x, y, dir)
prevX = x
prevY = y
clearWindow()
anyText = FALSE
textDrawn = FALSE
^playerDir = dir
redraw = TRUE
end
@ -1056,7 +1080,7 @@ end
// Called by scripts to display a string. We set the flag noting that something has been
// displayed, then use an assembly routine to do the work.
def scriptDisplayStr(str)
anyText = TRUE
textDrawn = TRUE
displayStr(str)
end
@ -1070,7 +1094,7 @@ def getYN()
return 1
elsif key == 'N'
clearWindow()
anyText = FALSE
textDrawn = FALSE
return 0
fin
beep()
@ -1119,14 +1143,16 @@ end
///////////////////////////////////////////////////////////////////////////////////////////////////
// Load and display the title screen.
def loadTitle()
puts(@helloStr)
puts("Loading Lawless Legends.\n")
// Load the title screen
puts("Loading title screen.\n")
loader(SET_MEM_TARGET, MAIN_MEM, $2000)
loader(QUEUE_LOAD, MAIN_MEM, 1<<8 | RES_TYPE_SCREEN) // title screen is fixed at #1
loader(LOCK_MEMORY, MAIN_MEM, $2000)
loader(FINISH_LOAD, MAIN_MEM, 1) // 1 = keep open
titleLoaded = TRUE
puts("Title loaded.\n")
^$c050
^$c057
^$c054