mirror of https://git.sr.ht/~rabbits/oquonie
1413 lines
23 KiB
Tal
1413 lines
23 KiB
Tal
( Oquonie )
|
|
|
|
( TODOs
|
|
> dialog event
|
|
> spellbook
|
|
> idle timer
|
|
> camera follow
|
|
> walking animation
|
|
> gate event locked/unlocked
|
|
> load room theme on enter
|
|
> add event orientation byte
|
|
> wizards
|
|
> add red in necomedre world
|
|
> warp animation
|
|
> transform animation
|
|
)
|
|
|
|
|00 @System &vector $2 &pad $6 &r $2 &g $2 &b $2
|
|
|10 @Console &vector $2 &read $1 &pad $5 &write $1
|
|
|20 @Screen &vector $2 &width $2 &height $2 &auto $1 &pad $1 &x $2 &y $2 &addr $2 &pixel $1 &sprite $1
|
|
|80 @Controller &vector $2 &button $1 &key $1
|
|
|90 @Mouse &vector $2 &x $2 &y $2 &state $1 &chord $1
|
|
|a0 @File &vector $2 &success $2 &stat $2 &delete $1 &append $1 &name $2 &length $2 &read $2 &write $2
|
|
|
|
( enums )
|
|
|
|
|00 @ambience
|
|
( special ) &lobby $1 &pillar $1 &warp $1
|
|
( worlds ) &necom $1 &nepht $1 &neom $1 &nesto $1 &nemed $1 &nasta $1
|
|
|00 @theme
|
|
( special ) &white $1 &pillar $1 &warp $1
|
|
|00 @spell
|
|
&necomedre $1 &nephtaline $1 &neomine $1
|
|
&nestorine $1 &nemedique $1 &nastazie $1
|
|
|
|
|0000
|
|
|
|
@cursor &x $2 &y $2
|
|
@center &x $2 &y $2
|
|
@camera &x $2 &y $2
|
|
@player &pos $1 &dir $1 &char $1 &room $2
|
|
@anim
|
|
&player/real/x $2 &player/real/y $2
|
|
&player/target/x $2 &player/target/y $2
|
|
|
|
|0100 ( -> )
|
|
|
|
( meta )
|
|
;meta #06 DEO2
|
|
( theme )
|
|
#ca0f .System/r DEO2
|
|
#ca0f .System/g DEO2
|
|
#ca0f .System/b DEO2
|
|
( playdate size 0190x00f0 )
|
|
#0190 .Screen/width DEO2
|
|
#00f0 .Screen/height DEO2
|
|
( print space left )
|
|
#0000 ;end SUB2 pdec ;&space-txt pstr #0a18 DEO
|
|
|
|
.Screen/width DEI2 #01 SFT2 .center/x STZ2
|
|
.Screen/height DEI2 #01 SFT2 #0020 ADD2 .center/y STZ2
|
|
|
|
#00 set-character
|
|
;necom/1 #0c00 enter-room/no-fade
|
|
|
|
( unlock )
|
|
;on-frame .Screen/vector DEO2
|
|
;on-mouse .Mouse/vector DEO2
|
|
;on-control .Controller/vector DEO2
|
|
|
|
BRK
|
|
&space-txt 20 "bytes 20 "left. $1
|
|
|
|
@meta 00
|
|
( name ) "Oquonie 0a
|
|
( details ) "A 20 "Puzzle 20 "Game 0a
|
|
( author ) "By 20 "Hundred 20 "Rabbits 0a
|
|
( date ) "Jan 20 "27, 20 "2023 00
|
|
00
|
|
|
|
(
|
|
@|vectors )
|
|
|
|
@on-frame ( -> )
|
|
|
|
request-animation
|
|
|
|
BRK
|
|
|
|
@on-control ( -> )
|
|
|
|
.Controller/button DEI
|
|
DUP #10 NEQ ?&no-u move-up &no-u
|
|
DUP #20 NEQ ?&no-d move-down &no-d
|
|
DUP #40 NEQ ?&no-l move-left &no-l
|
|
DUP #80 NEQ ?&no-r move-right &no-r
|
|
POP
|
|
|
|
BRK
|
|
|
|
@on-mouse ( -> )
|
|
|
|
( clear last cursor )
|
|
#40 draw-cursor
|
|
|
|
( draw new cursor )
|
|
.Mouse/x DEI2 .cursor/x STZ2
|
|
.Mouse/y DEI2 .cursor/y STZ2
|
|
;cursor-icn .Screen/addr DEO2
|
|
#42 .Mouse/state DEI #00 NEQ ADD draw-cursor
|
|
|
|
( route )
|
|
.Mouse/state DEI ,&on-mouse-touch JCN
|
|
|
|
BRK
|
|
|
|
&on-mouse-touch ( -> )
|
|
|
|
.Mouse/y DEI2 #03 SFT2 NIP
|
|
DUP #1a EQU ?&edit-wall
|
|
DUP #1b EQU ?&edit-floor
|
|
DUP #1c EQU ?&edit-step
|
|
|
|
BRK
|
|
|
|
&edit-wall ( y -> )
|
|
|
|
clear-room
|
|
POP .Mouse/x DEI2 #0018 DIV2 NIP
|
|
DUP get-wall #01ff .Mouse/state DEI #01 EQU JMP SWP POP ADD SWP set-wall
|
|
#00 .Mouse/state DEO
|
|
.player/room LDZ2 .player LDZ2 enter-room
|
|
|
|
BRK
|
|
|
|
&edit-floor ( y -> )
|
|
|
|
clear-room
|
|
POP .Mouse/x DEI2 #0018 DIV2 NIP
|
|
DUP get-floor #01ff .Mouse/state DEI #01 EQU JMP SWP POP ADD SWP set-floor
|
|
#00 .Mouse/state DEO
|
|
.player/room LDZ2 .player LDZ2 enter-room
|
|
|
|
BRK
|
|
|
|
&edit-step ( y -> )
|
|
|
|
clear-room
|
|
POP .Mouse/x DEI2 #0018 DIV2 NIP
|
|
DUP get-step #01ff .Mouse/state DEI #01 EQU JMP SWP POP ADD SWP set-step
|
|
#00 .Mouse/state DEO
|
|
.player/room LDZ2 .player LDZ2 enter-room
|
|
|
|
BRK
|
|
|
|
(
|
|
@|camera )
|
|
|
|
@look-at ( x* y* -- )
|
|
|
|
clear-room
|
|
.center/y LDZ2 ADD2 #0050 SUB2 .camera/y STZ2
|
|
.center/x LDZ2 ADD2 #00a0 SUB2 .camera/x STZ2
|
|
debug
|
|
draw-room
|
|
|
|
JMP2r
|
|
|
|
(
|
|
@|assets )
|
|
|
|
@load-assets ( room* -- )
|
|
|
|
load-reset
|
|
( walls )
|
|
INC2 INC2 STH2
|
|
#0006 #0000
|
|
&lw
|
|
DUP get-wall #00 EQU ?&skip-wall
|
|
DUP2 STH2kr OVR2 #03c0 MUL2 ;cache/w ADD2 STH2
|
|
ADD2 LDA STH2r #03c0 ;res/w fetch-asset
|
|
&skip-wall
|
|
INC2 GTH2k ?&lw
|
|
POP2 STH2 ADD2r
|
|
( floors )
|
|
#0009 #0000
|
|
&lf
|
|
DUP get-floor #00 EQU ?&skip-floor
|
|
DUP2 STH2kr OVR2 #0280 MUL2 ;cache/f ADD2 STH2
|
|
ADD2 LDA STH2r #0280 ;res/f fetch-asset
|
|
&skip-floor
|
|
INC2 GTH2k ?&lf
|
|
POP2 STH2 ADD2r
|
|
( steps )
|
|
#0006 #0000
|
|
&ls
|
|
DUP get-step #00 EQU ?&skip-step
|
|
DUP2 STH2kr OVR2 #0280 MUL2 ;cache/s ADD2 STH2
|
|
ADD2 LDA STH2r #0280 ;res/s fetch-asset
|
|
&skip-step
|
|
INC2 GTH2k ?&ls
|
|
POP2 STH2 ADD2r
|
|
( events )
|
|
STH2kr INC2r
|
|
LDA #00
|
|
&le
|
|
#00 OVR #30 SFT2 STH2kr ADD2 load-event
|
|
INC GTHk ?&le
|
|
POP2
|
|
POP2r
|
|
|
|
JMP2r
|
|
|
|
@load-event ( event* -- )
|
|
|
|
INC2k LDA2 #0004 ADD2 LDA2 JSR2
|
|
|
|
JMP2r
|
|
|
|
@load-character ( char -- )
|
|
|
|
;res/c .File/name DEO2
|
|
#2d00 .File/length DEO2
|
|
;cache/c .File/read DEO2
|
|
|
|
JMP2r
|
|
|
|
@load-reset ( -- )
|
|
|
|
;heap ,load-request/ptr STR2
|
|
|
|
JMP2r
|
|
|
|
@load-request ( length* -- ptr* )
|
|
|
|
[ LIT2 &ptr =heap ] STH2k ADD2 ,&ptr STR2
|
|
STH2r
|
|
|
|
JMP2r
|
|
|
|
@fetch-asset ( id dst* length* name* -- )
|
|
|
|
.File/name DEO2
|
|
.File/length DEO2
|
|
,&dst STR2
|
|
#00 EQUk ?&skip
|
|
&l
|
|
[ LIT2 &dst $2 ] .File/read DEO2
|
|
INC GTHk ?&l
|
|
&skip
|
|
POP2
|
|
|
|
JMP2r
|
|
|
|
(
|
|
@|character )
|
|
|
|
@set-character ( id -- )
|
|
|
|
DUP .player/char STZ
|
|
load-character
|
|
|
|
JMP2r
|
|
|
|
(
|
|
@|controls )
|
|
|
|
@enter-room ( id* pos state -- )
|
|
|
|
( TODO: wrap in a function )
|
|
#cccc .System/r DEO2
|
|
#cccc .System/g DEO2
|
|
#cccc .System/b DEO2
|
|
;animation-enter .Screen/vector DEO2
|
|
|
|
&no-fade
|
|
|
|
set-posdir
|
|
DUP2 .player/room STZ2
|
|
load-assets
|
|
#0000 DUP2 look-at
|
|
|
|
JMP2r
|
|
|
|
@move-pos ( pos -- )
|
|
|
|
DUP .player/pos STZ
|
|
get-coordinates
|
|
#0038 SUB2 .anim/player/target/y STZ2
|
|
.anim/player/target/x STZ2
|
|
debug
|
|
|
|
JMP2r
|
|
|
|
@set-posdir ( pos dir -- )
|
|
|
|
.player/dir STZ
|
|
DUP .player/pos STZ
|
|
get-coordinates
|
|
#0038 SUB2
|
|
DUP2 .anim/player/target/y STZ2
|
|
.anim/player/real/y STZ2
|
|
DUP2 .anim/player/target/x STZ2
|
|
.anim/player/real/x STZ2
|
|
debug
|
|
|
|
JMP2r
|
|
|
|
@move-up ( -- )
|
|
|
|
#01 .player/dir STZ
|
|
.player/pos LDZ #05 SUB try-move
|
|
|
|
JMP2r
|
|
|
|
@move-down ( -- )
|
|
|
|
#02 .player/dir STZ
|
|
.player/pos LDZ #05 ADD try-move
|
|
|
|
JMP2r
|
|
|
|
@move-left ( -- )
|
|
|
|
#00 .player/dir STZ
|
|
.player/pos LDZ INC try-move
|
|
|
|
JMP2r
|
|
|
|
@move-right ( -- )
|
|
|
|
#03 .player/dir STZ
|
|
.player/pos LDZ #01 SUB try-move
|
|
|
|
JMP2r
|
|
|
|
@try-move ( tile -- )
|
|
|
|
clear-room
|
|
DUP get-event DUP2 #ffff NEQ2
|
|
?&bump
|
|
POP2
|
|
( tile to floor ) #00 OVR ;floor-lut ADD2 LDA
|
|
DUP #ff EQU ?&wall
|
|
get-floor #00 EQU ?&hole
|
|
move-pos
|
|
debug
|
|
draw-room
|
|
|
|
JMP2r
|
|
&wall ( tile floor -- )
|
|
POP2 draw-room
|
|
JMP2r
|
|
&hole ( tile -- )
|
|
POP draw-room
|
|
JMP2r
|
|
&bump ( tile event* -- )
|
|
INC2k LDA2 INC2 INC2 LDA2 JSR2
|
|
POP
|
|
JMP2r
|
|
|
|
@get-event ( tile -- <event*> )
|
|
|
|
,&t STR
|
|
.player/room LDZ2 #0017 ADD2 INC2k ,&s STR2
|
|
LDA #00
|
|
&l
|
|
#00 OVR #30 SFT2 [ LIT2 &s $2 ] ADD2 LDAk [ LIT &t $1 ] NEQ ?&continue
|
|
NIP2 JMP2r
|
|
&continue
|
|
POP2
|
|
INC GTHk ?&l
|
|
POP2
|
|
,&t LDR .player/pos LDZ EQU ?&player
|
|
#ffff
|
|
|
|
JMP2r
|
|
&player #fffe JMP2r
|
|
|
|
(
|
|
@|events )
|
|
|
|
@e/blocker =&draw =&collide =&load
|
|
|
|
&draw ( e* -- )
|
|
|
|
( loc ) LDA get-coordinates
|
|
#0020 SUB2 .Screen/y DEO2
|
|
.Screen/x DEO2
|
|
[ LIT2 &sprite $2 ] draw-blocker
|
|
|
|
JMP2r
|
|
|
|
&collide ( e* -- )
|
|
|
|
POP2 #1234 phex #0a18 DEO
|
|
draw-room
|
|
|
|
JMP2r
|
|
|
|
&load ( e* -- )
|
|
|
|
POP2
|
|
#0500 load-request STH2k ,&sprite STR2
|
|
#01 STH2r #0500 ;res/b fetch-asset
|
|
|
|
JMP2r
|
|
|
|
@e/door =&draw =&collide =&load
|
|
|
|
&draw ( event* -- )
|
|
|
|
POP2
|
|
|
|
JMP2r
|
|
|
|
&collide ( e* -- )
|
|
|
|
#0003 ADD2
|
|
INC2k INC2 LDA .player/dir LDZ
|
|
SWP2 LDA2 SWP2 enter-room
|
|
|
|
JMP2r
|
|
|
|
&load ( e* -- )
|
|
|
|
POP2
|
|
|
|
JMP2r
|
|
|
|
@e/gate =&draw =&collide =&load
|
|
|
|
&draw ( event* -- )
|
|
|
|
POP2
|
|
|
|
JMP2r
|
|
|
|
&collide ( e* -- )
|
|
|
|
#0003 ADD2
|
|
INC2k INC2 LDA .player/dir LDZ
|
|
SWP2 LDA2 SWP2 enter-room
|
|
|
|
JMP2r
|
|
|
|
&load ( e* -- )
|
|
|
|
POP2
|
|
|
|
JMP2r
|
|
|
|
@e/ramen =&draw =&collide =&load
|
|
|
|
&draw ( event* -- )
|
|
|
|
LDA get-coordinates
|
|
#0038 SUB2 .Screen/y DEO2
|
|
.Screen/x DEO2
|
|
[ LIT2 &sprite $2 ] draw-character
|
|
|
|
JMP2r
|
|
|
|
&collide ( e* -- )
|
|
|
|
POP2 draw-room start-dialog
|
|
|
|
JMP2r
|
|
|
|
&load ( e* -- )
|
|
|
|
POP2
|
|
#0500 load-request STH2k ,&sprite STR2
|
|
#06 STH2r #0500 ;res/e fetch-asset
|
|
|
|
JMP2r
|
|
|
|
@e/base =&draw =&collide =&load
|
|
|
|
&draw ( event* -- )
|
|
|
|
LDA get-coordinates
|
|
#0038 SUB2 .Screen/y DEO2
|
|
.Screen/x DEO2
|
|
[ LIT2 &sprite $2 ] draw-character
|
|
|
|
JMP2r
|
|
|
|
&collide ( e* -- )
|
|
|
|
POP2 draw-room start-dialog
|
|
|
|
JMP2r
|
|
|
|
&load ( e* -- )
|
|
|
|
POP2
|
|
#0500 load-request STH2k ,&sprite STR2
|
|
#08 STH2r #0500 ;res/e fetch-asset
|
|
|
|
JMP2r
|
|
|
|
@e/map =&draw =&collide =&load
|
|
|
|
&draw ( event* -- )
|
|
|
|
POP2
|
|
|
|
JMP2r
|
|
|
|
&collide ( e* -- )
|
|
|
|
POP2 draw-room start-dialog
|
|
|
|
JMP2r
|
|
|
|
&load ( e* -- )
|
|
|
|
POP2
|
|
|
|
JMP2r
|
|
|
|
@e/owl =&draw =&collide =&load
|
|
|
|
&draw ( event* -- )
|
|
|
|
LDA get-coordinates
|
|
#0038 SUB2 .Screen/y DEO2
|
|
.Screen/x DEO2
|
|
[ LIT2 &sprite $2 ] draw-character
|
|
|
|
JMP2r
|
|
|
|
&collide ( e* -- )
|
|
|
|
POP2 draw-room start-dialog
|
|
|
|
JMP2r
|
|
|
|
&load ( e* -- )
|
|
|
|
POP2
|
|
#0500 load-request STH2k ,&sprite STR2
|
|
#01 STH2r #0500 ;res/e fetch-asset
|
|
|
|
JMP2r
|
|
|
|
@e/tree =&draw =&collide =&load
|
|
|
|
&draw ( event* -- )
|
|
|
|
LDA get-coordinates
|
|
#0038 SUB2 .Screen/y DEO2
|
|
.Screen/x DEO2
|
|
[ LIT2 &sprite $2 ] draw-character
|
|
|
|
JMP2r
|
|
|
|
&collide ( e* -- )
|
|
|
|
POP2 draw-room start-dialog
|
|
|
|
JMP2r
|
|
|
|
&load ( e* -- )
|
|
|
|
POP2
|
|
#0500 load-request STH2k ,&sprite STR2
|
|
#07 STH2r #0500 ;res/e fetch-asset
|
|
|
|
JMP2r
|
|
|
|
@e/wizard =&draw =&collide =&load ( spell orientation )
|
|
|
|
&draw ( event* -- )
|
|
|
|
LDAk get-coordinates
|
|
#0038 SUB2 .Screen/y DEO2
|
|
.Screen/x DEO2
|
|
#0004 ADD2 LDA #00 NEQ STH
|
|
[ LIT2 &sprite $2 ] ;draw-character/flip ;draw-character
|
|
STHr [ JMP SWP2 POP2 ] JSR2
|
|
|
|
JMP2r
|
|
|
|
&collide ( e* -- )
|
|
|
|
POP2 draw-room start-dialog
|
|
|
|
JMP2r
|
|
|
|
&load ( e* -- )
|
|
|
|
POP2
|
|
#0500 load-request STH2k ,&sprite STR2
|
|
#0b STH2r #0500 ;res/e fetch-asset
|
|
|
|
JMP2r
|
|
|
|
@e/soap =&draw =&collide =&load
|
|
|
|
&draw ( event* -- )
|
|
|
|
LDA get-coordinates
|
|
#0038 SUB2 .Screen/y DEO2
|
|
.Screen/x DEO2
|
|
[ LIT2 &sprite $2 ] draw-character/flip
|
|
|
|
JMP2r
|
|
|
|
&collide ( e* -- )
|
|
|
|
POP2 draw-room start-dialog
|
|
|
|
JMP2r
|
|
|
|
&load ( e* -- )
|
|
|
|
POP2
|
|
#0500 load-request STH2k ,&sprite STR2
|
|
#05 STH2r #0500 ;res/e fetch-asset
|
|
|
|
JMP2r
|
|
|
|
@e/music =&draw =&collide =&load
|
|
|
|
&draw ( event* -- )
|
|
|
|
LDA get-coordinates
|
|
#0038 SUB2 .Screen/y DEO2
|
|
.Screen/x DEO2
|
|
[ LIT2 &sprite $2 ] draw-character
|
|
|
|
JMP2r
|
|
|
|
&collide ( e* -- )
|
|
|
|
POP2 draw-room start-dialog
|
|
|
|
JMP2r
|
|
|
|
&load ( e* -- )
|
|
|
|
POP2
|
|
#0500 load-request STH2k ,&sprite STR2
|
|
#04 STH2r #0500 ;res/e fetch-asset
|
|
|
|
JMP2r
|
|
|
|
@e/shark =&draw =&collide =&load
|
|
|
|
&draw ( event* -- )
|
|
|
|
LDA get-coordinates
|
|
#0038 SUB2 .Screen/y DEO2
|
|
.Screen/x DEO2
|
|
[ LIT2 &sprite $2 ] draw-character
|
|
|
|
JMP2r
|
|
|
|
&collide ( e* -- )
|
|
|
|
POP2 draw-room start-dialog
|
|
|
|
JMP2r
|
|
|
|
&load ( e* -- )
|
|
|
|
POP2
|
|
#0500 load-request STH2k ,&sprite STR2
|
|
#02 STH2r #0500 ;res/e fetch-asset
|
|
|
|
JMP2r
|
|
|
|
@e/pillar =&draw =&collide =&load
|
|
|
|
&draw ( event* -- )
|
|
|
|
LDA get-coordinates
|
|
#0038 SUB2 .Screen/y DEO2
|
|
.Screen/x DEO2
|
|
[ LIT2 &sprite $2 ] draw-character
|
|
|
|
JMP2r
|
|
|
|
&collide ( e* -- )
|
|
|
|
POP2 draw-room start-dialog
|
|
|
|
JMP2r
|
|
|
|
&load ( e* -- )
|
|
|
|
POP2
|
|
#0500 load-request STH2k ,&sprite STR2
|
|
#09 STH2r #0500 ;res/e fetch-asset
|
|
|
|
JMP2r
|
|
|
|
@e/warp =&draw =&collide =&load
|
|
|
|
&draw ( event* -- )
|
|
|
|
POP2
|
|
|
|
JMP2r
|
|
|
|
&collide ( e* -- )
|
|
|
|
POP2 draw-room start-dialog
|
|
|
|
JMP2r
|
|
|
|
&load ( e* -- )
|
|
|
|
POP2
|
|
|
|
JMP2r
|
|
|
|
(
|
|
@|dialog )
|
|
|
|
@start-dialog ( -- )
|
|
|
|
( ;patt-icns/4 #0a fill-screen )
|
|
#1234 phex #0a18 DEO
|
|
|
|
JMP2r
|
|
|
|
@fill-screen ( patt* color -- )
|
|
|
|
,&color STR .Screen/addr DEO2
|
|
#01 .Screen/auto DEO
|
|
#0000 .Screen/y DEO2
|
|
.Screen/width DEI2 #03 SFT2 NIP ,&x STR
|
|
.Screen/height DEI2 #03 SFT2 NIP #00
|
|
&h
|
|
#0000 .Screen/x DEO2
|
|
[ LIT &x $1 ] #00
|
|
&w
|
|
[ LIT &color $1 ] .Screen/sprite DEO
|
|
INC GTHk ?&w
|
|
.Screen/y DEI2k #0008 ADD2 ROT DEO2
|
|
POP2
|
|
|
|
INC GTHk ?&h
|
|
POP2
|
|
|
|
JMP2r
|
|
|
|
(
|
|
@|drawing )
|
|
|
|
@clear-room ( -- )
|
|
|
|
.camera/x LDZ2 #0020 ADD2 .Screen/x DEO2
|
|
.camera/y LDZ2 #0038 SUB2 .Screen/y DEO2
|
|
#f1 .Screen/auto DEO
|
|
#e0 DUP
|
|
&l #00 .Screen/sprite DEO INC DUP ?&l POP
|
|
.camera/x LDZ2 #0020 ADD2 .Screen/x DEO2
|
|
.camera/y LDZ2 #0048 ADD2 .Screen/y DEO2
|
|
#a1 .Screen/auto DEO
|
|
&l2 #00 .Screen/sprite DEO INC DUP ?&l2 POP
|
|
|
|
JMP2r
|
|
|
|
@draw-cursor ( color -- )
|
|
|
|
#00 .Screen/auto DEO
|
|
.cursor/x LDZ2 .Screen/x DEO2
|
|
.cursor/y LDZ2 .Screen/y DEO2
|
|
.Screen/sprite DEO
|
|
|
|
JMP2r
|
|
|
|
@draw-room ( -- )
|
|
|
|
draw-walls
|
|
draw-floors
|
|
draw-events
|
|
draw-steps
|
|
.camera draw-marker
|
|
.center draw-marker
|
|
debug
|
|
|
|
JMP2r
|
|
|
|
@draw-walls ( -- )
|
|
|
|
#0003
|
|
&left
|
|
DUP #01 SUB get-wall #00 EQU ?&skip-left
|
|
#00 OVR #01 SUB #20 SFT2 ;walls-lut ADD2
|
|
( x ) LDA2k .camera/x LDZ2 ADD2 .Screen/x DEO2 INC2 INC2
|
|
( y ) LDA2 .camera/y LDZ2 ADD2 .Screen/y DEO2
|
|
#00 OVR #01 SUB ( wsize ) #03c0 MUL2 ;cache/w ADD2 draw-wall/flip
|
|
&skip-left
|
|
#01 SUB LTHk ?&left
|
|
POP2
|
|
#0603
|
|
&right
|
|
DUP get-wall #00 EQU ?&skip-right
|
|
#00 OVR #20 SFT2 ;walls-lut ADD2
|
|
( x ) LDA2k .camera/x LDZ2 ADD2 .Screen/x DEO2 INC2 INC2
|
|
( y ) LDA2 .camera/y LDZ2 ADD2 .Screen/y DEO2
|
|
#00 OVR ( wsize ) #03c0 MUL2 ;cache/w ADD2 draw-wall
|
|
&skip-right
|
|
INC GTHk ?&right
|
|
POP2
|
|
|
|
JMP2r
|
|
|
|
@draw-floors ( -- )
|
|
|
|
#0900
|
|
&l
|
|
DUP get-floor #00 EQU ?&skip
|
|
DUP get-floor-coordinates
|
|
.Screen/y DEO2
|
|
.Screen/x DEO2
|
|
#00 OVR ( wsize ) #0280 MUL2 ;cache/f ADD2 draw-floor
|
|
&skip
|
|
INC GTHk ?&l
|
|
POP2
|
|
|
|
JMP2r
|
|
|
|
@draw-steps ( -- )
|
|
|
|
#0300
|
|
&left
|
|
DUP get-step #00 EQU ?&skip-left
|
|
#00 OVR #20 SFT2 ;steps-lut ADD2
|
|
( x ) LDA2k .camera/x LDZ2 ADD2 .Screen/x DEO2 INC2 INC2
|
|
( y ) LDA2 .camera/y LDZ2 ADD2 .Screen/y DEO2
|
|
#00 OVR ( fsize ) #0280 MUL2 ;cache/s ADD2 draw-step/flip
|
|
&skip-left
|
|
INC GTHk ?&left
|
|
POP2
|
|
#0306
|
|
&right
|
|
DUP #01 SUB get-step #00 EQU ?&skip-right
|
|
#00 OVR #01 SUB #20 SFT2 ;steps-lut ADD2
|
|
( x ) LDA2k .camera/x LDZ2 ADD2 .Screen/x DEO2 INC2 INC2
|
|
( y ) LDA2 .camera/y LDZ2 ADD2 .Screen/y DEO2
|
|
#00 OVR #01 SUB ( fsize ) #0280 MUL2 ;cache/s ADD2 draw-step
|
|
&skip-right
|
|
#01 SUB LTHk ?&right
|
|
POP2
|
|
|
|
JMP2r
|
|
|
|
@draw-wall ( addr* -- )
|
|
|
|
.Screen/addr DEO2
|
|
#46 .Screen/auto DEO
|
|
#f4
|
|
&l
|
|
#85 .Screen/sprite DEO
|
|
INC DUP ?&l
|
|
POP
|
|
|
|
JMP2r
|
|
|
|
&flip ( addr* -- )
|
|
|
|
.Screen/x DEI2k #0018 ADD2 ROT DEO2
|
|
.Screen/addr DEO2
|
|
#04 .Screen/auto DEO
|
|
#f4
|
|
&lf
|
|
#fb draw-flip
|
|
INC DUP ?&lf
|
|
POP
|
|
|
|
JMP2r
|
|
|
|
@draw-flip ( -- )
|
|
|
|
.Screen/x DEI2 ROT
|
|
&l
|
|
#95 .Screen/sprite DEO
|
|
.Screen/x DEI2k #0008 SUB2 ROT DEO2
|
|
INC DUP ?&l
|
|
POP
|
|
.Screen/x DEO2
|
|
.Screen/y DEI2k #0008 ADD2 ROT DEO2
|
|
|
|
JMP2r
|
|
|
|
@draw-floor ( addr* -- )
|
|
|
|
.Screen/addr DEO2
|
|
#76 .Screen/auto DEO
|
|
#fb
|
|
&l
|
|
#85 .Screen/sprite DEO
|
|
INC DUP ?&l
|
|
POP
|
|
|
|
JMP2r
|
|
|
|
@draw-step ( addr* -- )
|
|
|
|
.Screen/addr DEO2
|
|
#76 .Screen/auto DEO
|
|
#fb
|
|
&l
|
|
#85 .Screen/sprite DEO
|
|
INC DUP ?&l
|
|
POP
|
|
|
|
JMP2r
|
|
|
|
&flip ( addr* -- )
|
|
|
|
.Screen/x DEI2k #0018 ADD2 ROT DEO2
|
|
.Screen/addr DEO2
|
|
#04 .Screen/auto DEO
|
|
#fb
|
|
&lf
|
|
#f8 draw-flip
|
|
INC DUP ?&lf
|
|
POP
|
|
|
|
JMP2r
|
|
|
|
@draw-events ( -- )
|
|
|
|
#1900
|
|
&l
|
|
DUP get-event draw-event
|
|
INC GTHk ?&l
|
|
POP2
|
|
|
|
JMP2r
|
|
|
|
@draw-event ( event* -- )
|
|
|
|
DUP2 #ffff EQU2 ?&skip
|
|
DUP2 #fffe EQU2 ?&player
|
|
( get event routine ) INC2k LDA2 LDA2
|
|
|
|
JMP2
|
|
&player POP2 draw-player JMP2r
|
|
&skip POP2 JMP2r
|
|
|
|
@draw-player ( -- )
|
|
|
|
.anim/player/real/x LDZ2 .Screen/x DEO2
|
|
.anim/player/real/y LDZ2 .Screen/y DEO2
|
|
|
|
draw-shadow
|
|
;cache/c
|
|
#00 .player/dir LDZ #01 AND ( csize ) #0f00 MUL2 ADD2
|
|
;draw-character/flip ;draw-character .player/dir LDZ #01 SFT [ JMP SWP2 POP2 ] JSR2
|
|
|
|
JMP2r
|
|
|
|
@draw-blocker ( addr* -- )
|
|
|
|
.Screen/addr DEO2
|
|
#76 .Screen/auto DEO
|
|
#f8
|
|
&l
|
|
#85 .Screen/sprite DEO
|
|
INC DUP ?&l
|
|
POP
|
|
|
|
JMP2r
|
|
|
|
@draw-character ( addr* -- )
|
|
|
|
.Screen/addr DEO2
|
|
#76 .Screen/auto DEO
|
|
#f6
|
|
&l
|
|
#85 .Screen/sprite DEO
|
|
INC DUP ?&l
|
|
POP
|
|
|
|
JMP2r
|
|
|
|
&flip ( addr* -- )
|
|
|
|
.Screen/x DEI2k #0038 ADD2 ROT DEO2
|
|
.Screen/addr DEO2
|
|
#04 .Screen/auto DEO
|
|
#f6
|
|
&lf
|
|
#f8 draw-flip
|
|
INC DUP ?&lf
|
|
POP
|
|
|
|
JMP2r
|
|
|
|
@draw-shadow ( -- )
|
|
|
|
.Screen/x DEI2
|
|
.Screen/y DEI2
|
|
|
|
.Screen/x DEI2k #0010 ADD2 ROT DEO2
|
|
.Screen/y DEI2k #0044 ADD2 ROT DEO2
|
|
#36 .Screen/auto DEO
|
|
;shadow-icn .Screen/addr DEO2
|
|
#05 .Screen/sprite DEOk DEO
|
|
|
|
.Screen/y DEO2
|
|
.Screen/x DEO2
|
|
|
|
JMP2r
|
|
|
|
@draw-marker ( zp -- )
|
|
|
|
#00 .Screen/auto DEO
|
|
;cross-icn .Screen/addr DEO2
|
|
LDZ2k #0003 SUB2 .Screen/x DEO2
|
|
INC INC LDZ2 #0003 SUB2 .Screen/y DEO2
|
|
#0a .Screen/sprite DEO
|
|
|
|
JMP2r
|
|
|
|
|
|
@draw-short ( short* -- )
|
|
|
|
SWP draw-byte
|
|
|
|
@draw-byte ( byte -- )
|
|
|
|
DUP #04 SFT draw-hex
|
|
|
|
@draw-hex ( char -- )
|
|
|
|
#0f AND DUP #09 GTH #27 MUL ADD #30 ADD
|
|
|
|
@draw-ltr ( ltr -- )
|
|
|
|
#20 SUB #00 SWP #30 SFT2 ;font ADD2 .Screen/addr DEO2
|
|
#02 .Screen/sprite DEO
|
|
|
|
JMP2r
|
|
|
|
@draw-str ( str* -- )
|
|
|
|
&w
|
|
LDAk draw-ltr
|
|
INC LDAk ?&w
|
|
POP2
|
|
|
|
JMP2r
|
|
|
|
(
|
|
@|devtools )
|
|
|
|
@debug ( -- )
|
|
|
|
#0008 DUP2 .Screen/x DEO2 .Screen/y DEO2
|
|
#01 .Screen/auto DEO
|
|
( player )
|
|
;&pos-txt draw-str
|
|
.player/pos LDZ draw-byte #20 draw-ltr
|
|
;&dir-txt draw-str
|
|
.player/dir LDZ draw-byte #20 draw-ltr
|
|
( cam )
|
|
;&cam-txt draw-str
|
|
.camera/x LDZ2 draw-short #20 draw-ltr
|
|
.camera/y LDZ2 draw-short #20 draw-ltr
|
|
( lerp )
|
|
#0008 .Screen/x DEO2 #0010 .Screen/y DEO2
|
|
.anim/player/real/x LDZ2 draw-short #20 draw-ltr
|
|
.anim/player/real/y LDZ2 draw-short #20 draw-ltr
|
|
.anim/player/target/x LDZ2 draw-short #20 draw-ltr
|
|
.anim/player/target/y LDZ2 draw-short #20 draw-ltr
|
|
( room )
|
|
#0008 .Screen/x DEO2 #0018 .Screen/y DEO2
|
|
;&room-txt draw-str
|
|
.player/room LDZ2 draw-short
|
|
editor
|
|
|
|
JMP2r
|
|
&pos-txt "pos: $1
|
|
&dir-txt "dir: $1
|
|
&cam-txt "cam: $1
|
|
&room-txt "room: $1
|
|
|
|
@editor ( -- )
|
|
|
|
( walls )
|
|
#0008 .Screen/x DEO2
|
|
.Screen/height DEI2 #0020 SUB2 .Screen/y DEO2
|
|
#0600
|
|
&lw
|
|
DUP get-wall draw-byte
|
|
.Screen/x DEI2k #0008 ADD2 ROT DEO2
|
|
INC GTHk ?&lw
|
|
POP2
|
|
( floors )
|
|
#0008 .Screen/x DEO2
|
|
.Screen/y DEI2k #0008 ADD2 ROT DEO2
|
|
#0900
|
|
&lf
|
|
DUP get-floor draw-byte
|
|
.Screen/x DEI2k #0008 ADD2 ROT DEO2
|
|
INC GTHk ?&lf
|
|
POP2
|
|
( steps )
|
|
#0008 .Screen/x DEO2
|
|
.Screen/y DEI2k #0008 ADD2 ROT DEO2
|
|
#0600
|
|
&ls
|
|
DUP get-step draw-byte
|
|
.Screen/x DEI2k #0008 ADD2 ROT DEO2
|
|
INC GTHk ?&ls
|
|
POP2
|
|
|
|
JMP2r
|
|
|
|
@set-wall ( tile id -- )
|
|
|
|
#00 SWP .player/room LDZ2 ADD2 #0002 ADD2 STA
|
|
save-snarf
|
|
|
|
JMP2r
|
|
|
|
@set-floor ( tile id -- )
|
|
|
|
#00 SWP .player/room LDZ2 ADD2 #0008 ADD2 STA
|
|
save-snarf
|
|
|
|
JMP2r
|
|
|
|
@set-step ( tile id -- )
|
|
|
|
#00 SWP .player/room LDZ2 ADD2 #0011 ADD2 STA
|
|
save-snarf
|
|
|
|
JMP2r
|
|
|
|
@save-snarf ( -- )
|
|
|
|
;snarf-filename .File/name DEO2
|
|
( walls )
|
|
#09 fchr
|
|
#0600 &lw DUP get-wall fbyte #20 fchr INC GTHk ?&lw POP2
|
|
#0a fchr
|
|
( floors )
|
|
#09 fchr
|
|
#0900 &lf DUP get-floor fbyte #20 fchr INC GTHk ?&lf POP2
|
|
#0a fchr
|
|
( steps )
|
|
#09 fchr
|
|
#0600 &ls DUP get-step fbyte #20 fchr INC GTHk ?&ls POP2
|
|
#0a fchr
|
|
|
|
JMP2r
|
|
|
|
@snarf-filename ".snarf $1
|
|
|
|
@fbyte ( b -- )
|
|
|
|
DUP #04 SFT fhex
|
|
|
|
@fhex ( b -- )
|
|
|
|
#0f AND DUP #09 GTH #27 MUL ADD #30 ADD
|
|
|
|
@fchr ( c -- )
|
|
|
|
,&b STR
|
|
#0001 .File/length DEO2
|
|
;&b .File/write DEO2
|
|
|
|
JMP2r
|
|
&b $1
|
|
|
|
(
|
|
@|animations )
|
|
|
|
@request-animation ( -- )
|
|
|
|
request-player-move
|
|
|
|
JMP2r
|
|
|
|
@request-player-move ( -- )
|
|
|
|
.anim/player/real/x LDZ2 .anim/player/target/x LDZ2 EQU2
|
|
.anim/player/real/y LDZ2 .anim/player/target/y LDZ2 EQU2 AND ?&skip
|
|
clear-room
|
|
.anim/player/real/x LDZ2 .anim/player/target/x LDZ2 #0004 lerp
|
|
.anim/player/real/x STZ2
|
|
.anim/player/real/y LDZ2 .anim/player/target/y LDZ2 #0002 lerp
|
|
.anim/player/real/y STZ2
|
|
draw-room
|
|
&skip
|
|
|
|
JMP2r
|
|
|
|
@animation-enter ( -> )
|
|
|
|
( color 3 )
|
|
.System/r DEI2 #0f AND NIP DUP #0f EQU ?&no-3
|
|
#01 ADD #00 SWP STH2
|
|
.System/r DEI2 #fff0 AND2 STH2kr ORA2 .System/r DEO2
|
|
.System/g DEI2 #fff0 AND2 STH2kr ORA2 .System/g DEO2
|
|
.System/b DEI2 #fff0 AND2 STH2r ORA2 .System/b DEO2
|
|
BRK
|
|
&no-3
|
|
POP
|
|
( color 2 )
|
|
.System/r DEI2 #04 SFT2 #0f AND NIP DUP #00 EQU ?&no-2
|
|
#01 SUB #00 SWP #40 SFT2 STH2
|
|
.System/r DEI2 #ff0f AND2 STH2kr ORA2 .System/r DEO2
|
|
.System/g DEI2 #ff0f AND2 STH2kr ORA2 .System/g DEO2
|
|
.System/b DEI2 #ff0f AND2 STH2r ORA2 .System/b DEO2
|
|
BRK
|
|
&no-2
|
|
POP
|
|
( color 1 )
|
|
.System/r DEI2 #08 SFT2 #0f AND NIP DUP #0a EQU ?&no-1
|
|
#01 SUB #00 SWP #80 SFT2 STH2
|
|
.System/r DEI2 #f0ff AND2 STH2kr ORA2 .System/r DEO2
|
|
.System/g DEI2 #f0ff AND2 STH2kr ORA2 .System/g DEO2
|
|
.System/b DEI2 #f0ff AND2 STH2r ORA2 .System/b DEO2
|
|
BRK
|
|
&no-1
|
|
POP
|
|
;on-frame .Screen/vector DEO2
|
|
|
|
BRK
|
|
|
|
(
|
|
@|helpers )
|
|
|
|
@get-floor-coordinates ( tile -- x* y* )
|
|
|
|
#00 SWP ;room-lut ADD2 LDA
|
|
|
|
@get-coordinates ( tile -- x* y* )
|
|
|
|
#00 SWP #20 SFT2 ;coordinates-lut ADD2
|
|
LDA2k .camera/x LDZ2 ADD2
|
|
SWP2 INC2 INC2
|
|
LDA2 .camera/y LDZ2 ADD2
|
|
|
|
JMP2r
|
|
|
|
@get-wall ( id -- asset )
|
|
|
|
#00 SWP .player/room LDZ2 ADD2 #0002 ADD2 LDA
|
|
|
|
JMP2r
|
|
|
|
@get-floor ( id -- asset )
|
|
|
|
#00 SWP .player/room LDZ2 ADD2 #0008 ADD2 LDA
|
|
|
|
JMP2r
|
|
|
|
@get-step ( id -- asset )
|
|
|
|
#00 SWP .player/room LDZ2 ADD2 #0011 ADD2 LDA
|
|
|
|
JMP2r
|
|
|
|
(
|
|
@|stdlib )
|
|
|
|
@pstr ( str* -- )
|
|
|
|
&w
|
|
LDAk #18 DEO
|
|
INC2 LDAk ,&w JCN
|
|
POP2
|
|
|
|
JMP2r
|
|
|
|
@pdec ( v* -- )
|
|
|
|
#00 ,&z STR
|
|
#2710 ,&parse JSR
|
|
#03e8 ,&parse JSR
|
|
#0064 ,&parse JSR
|
|
#000a ,&parse JSR
|
|
NIP
|
|
&emit
|
|
DUP [ LIT &z $1 ] EQU ,&skip JCN
|
|
#ff ,&z STR DUP #30 ADD #18 DEO
|
|
&skip
|
|
POP
|
|
|
|
JMP2r
|
|
&parse
|
|
DIV2k DUP ,&emit JSR MUL2 SUB2
|
|
JMP2r
|
|
|
|
@phex ( short* -- ) SWP ,&b JSR &b DUP #04 SFT ,&c JSR &c #0f AND DUP #09 GTH #27 MUL ADD #30 ADD #18 DEO JMP2r
|
|
|
|
@lerp ( a* b* speed* -- res* )
|
|
|
|
STH2
|
|
OVR2 OVR2 gts2 ?>h
|
|
OVR2 OVR2 lts2 ?<h
|
|
POP2r POP2
|
|
|
|
JMP2r
|
|
>h POP2 STH2r SUB2 JMP2r
|
|
<h POP2 STH2r ADD2 JMP2r
|
|
|
|
@lts2 #8000 STH2k ADD2 SWP2 STH2r ADD2 GTH2 JMP2r
|
|
@gts2 #8000 STH2k ADD2 SWP2 STH2r ADD2 LTH2 JMP2r
|
|
|
|
(
|
|
@|assets )
|
|
|
|
@res
|
|
&c "bin/c.rom $1 ( character )
|
|
&w "bin/w.rom $1 ( walls )
|
|
&f "bin/f.rom $1 ( floors )
|
|
&s "bin/s.rom $1 ( steps )
|
|
&e "bin/e.rom $1 ( events )
|
|
&b "bin/b.rom $1 ( blockers )
|
|
|
|
@room-lut [
|
|
06 07 08 0b 0c 0d 10 11 12 ]
|
|
@coordinates-lut [
|
|
0080 0000 0060 0010 0040 0020 0020 0030 0000 0040
|
|
00a0 0010 0080 0020 0060 0030 0040 0040 0020 0050
|
|
00c0 0020 00a0 0030 0080 0040 0060 0050 0040 0060
|
|
00e0 0030 00c0 0040 00a0 0050 0080 0060 0060 0070
|
|
0100 0040 00e0 0050 00c0 0060 00a0 0070 0080 0080 ]
|
|
@walls-lut [
|
|
0040 fff8 0060 ffe8 0080 ffd8
|
|
00a0 ffd8 00c0 ffe8 00e0 fff8 ]
|
|
@steps-lut [
|
|
0040 0050 0060 0060 0080 0070
|
|
00a0 0070 00c0 0060 00e0 0050 ]
|
|
@floor-lut [
|
|
ff ff ff ff ff
|
|
ff 00 01 02 ff
|
|
ff 03 04 05 ff
|
|
ff 06 07 08 ff
|
|
ff ff ff ff ff ]
|
|
|
|
@patt-icns [
|
|
&1 30c0 030c 30c0 030c
|
|
&2 1122 4488 1122 4488
|
|
&3 8800 2200 8800 2200
|
|
&4 aa55 aa55 aa55 aa55 ]
|
|
|
|
@cursor-icn [
|
|
80c0 e0f0 f8e0 1000 ]
|
|
@cross-icn [
|
|
1010 10fe 1010 1000 ]
|
|
|
|
@shadow-icn
|
|
0000 0205 0a15 2a15 2a55 aa55 aa55 aa55 a854 aa55 aa55 aa55 0000 8040 a050 a850
|
|
2a15 0a05 0200 0000 aa55 aa55 aa55 2a00 aa55 aa55 aa54 a800 a850 a040 8000 0000
|
|
|
|
@font ( atari8 )
|
|
0000 0000 0000 0000 6060 6060 6000 6000
|
|
6666 6600 0000 0000 006c fe6c 6cfe 6c00
|
|
183e 603c 067c 1800 0066 6c18 3066 4600
|
|
386c 3870 decc 7600 6060 6000 0000 0000
|
|
1c30 3030 3030 1c00 380c 0c0c 0c0c 3800
|
|
0066 3cff 3c66 0000 0018 187e 1818 0000
|
|
0000 0000 0030 3060 0000 007e 0000 0000
|
|
0000 0000 0018 1800 0306 0c18 3060 c000
|
|
3c66 6e76 6666 3c00 1838 1818 1818 7e00
|
|
3c66 060c 1830 7e00 7e0c 180c 0666 3c00
|
|
0c1c 3c6c 7e0c 0c00 7e60 7c06 0666 3c00
|
|
3c60 607c 6666 3c00 7e06 0c18 3030 3000
|
|
3c66 663c 6666 3c00 3c66 663e 060c 3800
|
|
0018 1800 0018 1800 0018 1800 1818 3000
|
|
0c18 3060 3018 0c00 0000 7e00 007e 0000
|
|
3018 0c06 0c18 3000 3c66 060c 1800 1800
|
|
3c66 6e6a 6e60 3e00 183c 6666 7e66 6600
|
|
7c66 667c 6666 7c00 3c66 6060 6066 3c00
|
|
786c 6666 666c 7800 7e60 607c 6060 7e00
|
|
7e60 607c 6060 6000 3e60 606e 6666 3e00
|
|
6666 667e 6666 6600 3c18 1818 1818 3c00
|
|
3e06 0606 0666 3c00 666c 7870 786c 6600
|
|
6060 6060 6060 7e00 c6ee fed6 c6c6 c600
|
|
6676 7e7e 6e66 6600 3c66 6666 6666 3c00
|
|
7c66 667c 6060 6000 3c66 6666 766c 3600
|
|
7c66 667c 6c66 6600 3c66 603c 0666 3c00
|
|
7e18 1818 1818 1800 6666 6666 6666 3e00
|
|
6666 6666 663c 1800 c6c6 c6d6 feee c600
|
|
6666 3c18 3c66 6600 6666 663c 1818 1800
|
|
7e06 0c18 3060 7e00 3c30 3030 3030 3c00
|
|
c060 3018 0c06 0300 3c0c 0c0c 0c0c 3c00
|
|
1038 6cc6 0000 0000 0000 0000 0000 fe00
|
|
0060 3018 0000 0000 0000 3c06 3e66 3e00
|
|
6060 7c66 6666 7c00 0000 3c60 6060 3c00
|
|
0606 3e66 6666 3e00 0000 3c66 7e60 3c00
|
|
1c30 7c30 3030 3000 0000 3e66 663e 067c
|
|
6060 7c66 6666 6600 1800 3818 1818 3c00
|
|
1800 1818 1818 1870 6060 666c 786c 6600
|
|
3818 1818 1818 3c00 0000 ecfe d6c6 c600
|
|
0000 7c66 6666 6600 0000 3c66 6666 3c00
|
|
0000 7c66 6666 7c60 0000 3e66 6666 3e06
|
|
0000 7c66 6060 6000 0000 3e60 3c06 7c00
|
|
0018 7e18 1818 0e00 0000 6666 6666 3e00
|
|
0000 6666 663c 1800 0000 c6c6 d67c 6c00
|
|
0000 663c 183c 6600 0000 6666 663e 067c
|
|
0000 7e0c 1830 7e00 1c30 3060 3030 1c00
|
|
1818 1818 1818 1818 380c 0c06 0c0c 3800
|
|
0000 60f2 9e0c 0000 3c42 9985 8599 423c
|
|
|
|
~src/world.tal
|
|
|