pete286/game.jor

180 lines
4.6 KiB
Plaintext
Raw Permalink Normal View History

var MODE-MOVE
var MODE-WAIT
2019-02-18 01:14:56 +00:00
( T I C K )
2019-05-01 01:15:25 +00:00
defer party
defer entities
: entity-at ( x y -- entity|0 )
0 >rot
entities each >r 2dup ( 0 x y x y r:e )
r@ entity.x @ r@ entity.y @ world>tile 2= ( 0 x y eq r:e )
if <rot drop <r >rot break ( e x y )
else rdrop then ( 0 x y )
more drop drop ;
( P L A Y E R )
2019-09-29 03:19:02 +00:00
var player.state userword
2019-05-01 01:15:25 +00:00
var player.prevdir
2019-09-29 03:19:02 +00:00
1 const MOVING userword
2 const DRIVING userword
4 const BOATING userword
8 const NOCLIP userword
16 const ISMARY userword
32 const ISJEANNE userword
2019-09-29 03:19:02 +00:00
: noclip player.state NOCLIP fnot! ; userword
2019-09-29 03:19:02 +00:00
: player.driving? player.state DRIVING f@ ; userword
: player.boating? player.state BOATING f@ ; userword
2019-07-01 16:31:00 +00:00
: :playerwalk create , , does>
player.state MOVING f@ not if cell + then @ execute ;
' {mary} ' {mary-walk} :playerwalk {pmary}
' {pete-stand} ' {pete-walk} :playerwalk {ppete}
' {jeanne} ' {jeanne-walk} :playerwalk {pjeanne}
: {player}
2019-06-26 01:58:52 +00:00
player.driving? if {car-drive}
else player.boating? if {boat-pete}
else
player.state ISMARY f@ if {pmary}
else player.state ISJEANNE f@ if {pjeanne}
else {ppete} then then
then then ;
: player.canmove? ( x y -- )
player.state NOCLIP f@ not if
player.driving? if DRIVABLE else
player.boating? if BOATABLE else WALKABLE then then mapflag?
else drop drop 1 then ;
2019-02-18 01:14:56 +00:00
2019-03-03 01:03:34 +00:00
12 9 N ' {player} defentity player
2020-02-01 15:07:46 +00:00
: sched-move-entity ( entity -- ) :| jobdata move-entity |; sched-with ;
2019-02-18 01:14:56 +00:00
: move-player
2020-02-01 15:07:46 +00:00
:| 1 player.state MOVING f!
player move-entity
0 player.state MOVING f!
|; sched
2019-05-01 01:15:25 +00:00
player.prevdir @ party each
dup player != if
dup entity.dir @ >r
2019-05-01 01:15:25 +00:00
dup >rot entity.dir !
2020-02-01 15:07:46 +00:00
sched-move-entity <r
else entity.dir @ player.prevdir ! then more drop ;
2019-03-03 01:03:34 +00:00
: out-of-bounds ( x y -- b )
2dup 0 < swap 0 < or >rot mapsize ( b x y w h )
<rot <= >rot ( b b x w )
>= or or ;
: leaving? ( x y dir -- b )
dup N = if drop swap drop 0 < else
dup W = if drop drop 0 < else
S = if swap drop mapsize swap drop >= else
drop mapsize drop >= then then then ;
2019-03-03 01:03:34 +00:00
defer player-touch ( x y -- b )
: touch-begin each 2dup more >rot drop drop ;
: touch-next dup if rdrop done then drop rswap ;
: touch-last ' done , ; immediate
: ;touch [ ' touch-last , ' [ , ] ; immediate
2019-03-03 01:03:34 +00:00
: check-player-touch ( x y -- b )
touch-begin entity-at dup if EVTOUCH entity>do 1 then
touch-next player-touch
touch-next out-of-bounds
touch-next player.canmove? not ;touch
2019-03-03 01:03:34 +00:00
: try-move-player
player entity-dst check-player-touch not if move-player then ;
2019-05-19 17:34:27 +00:00
: follow ( e -- )
player entity>pos <rot entity.pos! NODIR player.prevdir ! ;
: check-entity-touch
touch-begin entity-at
touch-next out-of-bounds
touch-next WALKABLE mapflag? ;touch
: try-move-entity ( e -- )
dup entity-dst check-entity-touch not if move-entity then ;
2019-03-03 01:03:34 +00:00
2019-03-14 00:43:38 +00:00
var q-level
var q-player.x
var q-player.y
2019-09-29 03:19:02 +00:00
: queue-level q-level ! q-player.y ! q-player.x ! ; userword
2019-03-03 01:03:34 +00:00
player :tick
2019-02-18 01:14:56 +00:00
0 ^LEFT key-down if drop 1 W player entity.dir ! then
^RIGHT key-down if drop 1 E player entity.dir ! then
^UP key-down if drop 1 N player entity.dir ! then
^DOWN key-down if drop 1 S player entity.dir ! then
2020-02-01 15:07:46 +00:00
if ' try-move-player sched then
2019-03-03 01:03:34 +00:00
;entity
( S T U F F )
: reset-level
2019-05-01 01:15:25 +00:00
:| done |; ' entities redefine
2019-09-29 03:19:02 +00:00
:| drop drop 0 |; ' player-touch redefine ; userword
: mode-move
entities each EVTICK entity>do more
2019-05-01 01:15:25 +00:00
party each EVTICK entity>do more
tick-mapedit jiles
tick-debounce
2019-03-14 00:43:38 +00:00
q-level @ dup if
0 q-level !
reset-level
loadlevel
2019-03-14 00:43:38 +00:00
q-player.x @ q-player.y @ tile>world player entity.pos!
2019-05-19 17:34:27 +00:00
party each follow more
else drop then ;
2019-02-18 01:14:56 +00:00
' mode-move MODE-MOVE !
2019-02-18 01:14:56 +00:00
' tick-debounce MODE-WAIT !
: draw-entity
>r r@ entity.x @ r@ entity.y @
r@ entity.dir @ <r entity>sprite
sprite-bob draw-sprite ;
2019-02-11 00:17:58 +00:00
var showmouse
1 showmouse !
2019-06-26 01:58:52 +00:00
var glitchlevel
2019-02-11 00:17:58 +00:00
: full-draw
player entity.x @ 152 -
player entity.y @ 92 -
scroll
entities each draw-entity more
2019-05-01 01:15:25 +00:00
party each draw-entity more
showmouse @ if
mouseworldpos 4 draw-sprite
then
2019-06-26 01:58:52 +00:00
glitchlevel @ glitch
draw-screen
draw-footer ;
2019-02-11 00:17:58 +00:00
2019-06-26 01:58:52 +00:00
16 18 W ' {horse} defentity p_chuck
2019-07-01 16:31:00 +00:00
16 18 W ' {pjeanne} defentity p_jeanne
:noname
reset-level
MODE-MOVE @ ' tick redefine
' full-draw ' draw redefine
2019-06-26 01:58:52 +00:00
:| player yield
player.state ISMARY f@ if p_jeanne yield then
2019-06-26 01:58:52 +00:00
CHUCK-FOLLOW flag@ if p_chuck yield then
done |; ' party redefine
2020-02-01 15:07:46 +00:00
:| MODE-WAIT @ ' tick redefine |; ' any-job-started redefine
:| MODE-MOVE @ ' tick redefine hide-footer |; ' all-jobs-complete redefine
; ' onload redefine