flesh out Chuck's story

This commit is contained in:
Jeremy Penner 2019-05-19 13:34:27 -04:00
parent 459235117d
commit edf0a91f71
10 changed files with 91 additions and 45 deletions

View file

@ -4,6 +4,12 @@
: world>tile 4 >> swap 4 >> swap ; : world>tile 4 >> swap 4 >> swap ;
: tile>world 4 << swap 4 << swap ; : tile>world 4 << swap 4 << swap ;
: +pos ( x1 y1 x2 y2 -- x y )
<rot + >rot + swap ;
: -pos ( x1 y1 x2 y2 -- x y )
negate swap negate swap +pos ;
: defentity ( x y dir anim -- ) array ' drop , , , tile>world , , ; : defentity ( x y dir anim -- ) array ' drop , , , tile>world , , ;
: entity.x 4 cells + ; : entity.x 4 cells + ;
: entity.y 3 cells + ; : entity.y 3 cells + ;
@ -28,12 +34,31 @@ var entity-defstate
1 const E 1 const E
2 const N 2 const N
3 const S 3 const S
4 const NODIR
: dir>pos ( dir -- dx dy ) : dir>pos ( dir -- dx dy )
dup W = if drop -1 0 ret then dup W = if drop -1 0 ret then
dup E = if drop 1 0 ret then dup E = if drop 1 0 ret then
N = if 0 -1 dup N = if drop 0 -1 ret then
else 0 1 then ; S = if 0 1 else 0 0 then ;
: pos>dir ( dx dy -- dir )
dup 0 < if drop drop N else
0 > if drop S else
dup 0 < if drop W else
0 > if E else NODIR then then then then ;
: facing ( x1 y1 x2 y2 -- dir ) -pos pos>dir ;
: entity-dst ( e -- x y )
>r r@ entity.dir @ dir>pos
r@ entity.x @ <r entity.y @ world>tile +pos ;
: move-entity ( e -- )
dup entity.dir @ dir>pos ( e dx dy )
dup if swap drop swap entity.y
else drop swap entity.x then
swap 16 * over @ + 4 <rot move-to ;
: frame ( s n e w ) b, b, b, b, ; : frame ( s n e w ) b, b, b, b, ;
array frames array frames

View file

@ -28,7 +28,6 @@ defer entities
( P L A Y E R ) ( P L A Y E R )
var player.state var player.state
var player.prevdir var player.prevdir
defer player
1 const MOVING 1 const MOVING
2 const DRIVING 2 const DRIVING
@ -48,16 +47,6 @@ defer player
12 9 N ' {player} defentity player 12 9 N ' {player} defentity player
: entity-dst ( e -- x y )
>r r@ entity.dir @ dir>pos
r@ entity.x @ <r entity.y @ world>tile +pos ;
: move-entity ( e -- )
dup entity.dir @ dir>pos ( e dx dy )
dup if swap drop swap entity.y
else drop swap entity.x then
swap 16 * over @ + 4 <rot move-to ;
: move-player : move-player
1 player.state MOVING f! 1 player.state MOVING f!
player move-entity player move-entity
@ -96,6 +85,9 @@ defer player-touch ( x y -- b )
: try-move-player : try-move-player
player entity-dst check-player-touch not if move-player then ; player entity-dst check-player-touch not if move-player then ;
: follow ( e -- )
player entity>pos <rot entity.pos! NODIR player.prevdir ! ;
: check-entity-touch : check-entity-touch
touch-begin entity-at touch-begin entity-at
touch-next out-of-bounds touch-next out-of-bounds
@ -132,6 +124,7 @@ player :tick
reset-level reset-level
loadlevel loadlevel
q-player.x @ q-player.y @ tile>world player entity.pos! q-player.x @ q-player.y @ tile>world player entity.pos!
party each follow more
else drop then ; else drop then ;
' mode-move MODE-MOVE ! ' mode-move MODE-MOVE !

View file

@ -17,8 +17,8 @@ defer loadlevel
:noname :noname
s" input.jor" loadfile s" input.jor" loadfile
s" entity.jor" loadfile
s" timer.jor" loadfile s" timer.jor" loadfile
s" entity.jor" loadfile
s" footer.jor" loadfile s" footer.jor" loadfile
s" map.jor" loadfile s" map.jor" loadfile
s" game.jor" loadfile s" game.jor" loadfile

View file

@ -9,7 +9,7 @@ e_chuck :touch
;entity ;entity
car :touch car :touch
player move-entity 1 player.state DRIVING f! move-player 1 player.state DRIVING f!
;entity ;entity
:noname :noname
@ -22,18 +22,33 @@ car :touch
touch-begin S leaving? dup touch-begin S leaving? dup
if player.driving? not if player.driving? not
if pete say" I'm not walking." if pete say" I'm not walking."
else player move-entity 24 7 road.jor queue-level else move-player 24 7 road.jor queue-level
then then
then then
touch-next 6 21 2= dup touch-next 6 21 2= dup
if player.driving? not if player.driving? not
if if CHUCK-FOLLOW state@ not if
noone say" * knock knock *" noone say" * knock knock *"
clear 30 sleep clear 30 sleep
pete say" Nobody home, I guess." pete say" Nobody home, I guess."
jeanne say" Go away before I call the\cops, Pete!" jeanne say" Go away before I call the\cops, Pete!"
pete say" Oh.\I guess she's still mad." pete say" Oh.\I guess she's still mad."
JEANNE-ANGRY setstate JEANNE-ANGRY setstate
else
pete say" I brought you your\damn horse, Jeanne!"
jeanne say" Oh my God. Is he okay?\Hold on, I'm coming outside."
pete say" He's fine."
W player entity.dir ! move-player move-player E player entity.dir !
( todo: jeanne sprite I guess )
chuck say" * n u z z l e *\(Jeanne! I'm home!)"
jeanne say" Jesus, Chuck, you're a wreck.\Let's get you fed and rested."
pete say" You're welcome."
jeanne say" Don't think for a MINUTE\I'm not still furious at you."
jeanne say" If I catch you on my property\again, I *will* call the cops."
pete say" Alright, alright, I'm going!\Christ, no good deed goes\unpunished."
CHUCK-HOME setstate CHUCK-FOLLOW clearstate
10 6 petehous.jor queue-level
then
else else
pete say" Jeanne hates me enough already\without driving through her\front door!" pete say" Jeanne hates me enough already\without driving through her\front door!"
then then

View file

@ -1,7 +1,4 @@
( M A P ) ( M A P )
: +pos ( x1 y1 x2 y2 -- x y )
<rot + >rot + swap ;
var tileselect var tileselect
: invalidate-map mapsize mapsize! ; : invalidate-map mapsize mapsize! ;
: mouseworldpos mousepos scrollpos +pos ; : mouseworldpos mousepos scrollpos +pos ;

View file

@ -3,7 +3,7 @@
13 8 N ' {car} defentity car 13 8 N ' {car} defentity car
car :touch car :touch
player move-entity move-player
1 player.state DRIVING f! 1 player.state DRIVING f!
;entity ;entity
@ -15,17 +15,17 @@ car :touch
touch-begin S leaving? dup touch-begin S leaving? dup
if player.driving? not if player.driving? not
if pete say" It's too far to walk to town." if pete say" It's too far to walk to town."
else player move-entity 5 10 road.jor queue-level else move-player 5 10 road.jor queue-level
then then
then then
touch-next 13 8 2= player.driving? and dup touch-next 13 8 2= player.driving? and dup
if player move-entity if move-player
0 player.state DRIVING f! 0 player.state DRIVING f!
W player entity.dir ! W player entity.dir !
player move-entity move-player
then then
touch-next 12 7 2= player.driving? not and dup touch-next 12 7 2= player.driving? not and dup
if player move-entity 16 9 petehous.jor queue-level then if move-player 16 9 petehous.jor queue-level then
touch-next 30 7 2= dup touch-next 30 7 2= dup
if pete say" It's... kinda swampy.\I don't wanna get wet if I\don't have to." then if pete say" It's... kinda swampy.\I don't wanna get wet if I\don't have to." then
touch-next 30 9 2= dup touch-next 30 9 2= dup

View file

@ -64,7 +64,7 @@ done |; choose ;entity
:| table yield chair yield bed yield e_phone yield done |; ' entities redefine :| table yield chair yield bed yield e_phone yield done |; ' entities redefine
:| :|
touch-begin 16 10 2= dup if touch-begin 16 10 2= dup if
player move-entity 12 8 pete.jor queue-level move-player 12 8 pete.jor queue-level
then touch-next 9 4 2= dup if then touch-next 9 4 2= dup if
pete say" The closet is a disaster.\I don't want to deal with that\right now." pete say" The closet is a disaster.\I don't want to deal with that\right now."
then touch-next 11 4 2= dup if then touch-next 11 4 2= dup if

View file

@ -3,18 +3,20 @@
24 4 N ' {horse} defentity chuck 24 4 N ' {horse} defentity chuck
:noname :noname
1 player.state DRIVING f! CHUCK-FOLLOW state@ not player.state DRIVING f!
:| CHUCK-HOME state@ if chuck yield then :| CHUCK-HOME state@ if chuck yield then
done |; ' entities redefine done |; ' entities redefine
:| :|
touch-begin E leaving? dup touch-begin E leaving? dup
if pete say" It's 100 miles to the next town." then if pete say" It's 100 miles to the next town." then
touch-next 24 15 2= CHUCK-FOLLOW state@ and dup
if pete say" I'm not walking all the way into\town with a horse!" then
touch-next 5 9 2= dup touch-next 5 9 2= dup
if player move-entity 13 12 pete.jor queue-level then if move-player 13 12 pete.jor queue-level then
touch-next 13 6 2= dup touch-next 13 6 2= dup
if player move-entity 38 71 trail1.jor queue-level then if move-player 38 71 trail1.jor queue-level then
touch-next 24 6 2= dup touch-next 24 6 2= dup
if player move-entity 13 22 jeanne.jor queue-level then if move-player 13 22 jeanne.jor queue-level then
touch-next 39 33 2= dup touch-next 39 33 2= dup
if pete say" School's out for the day,\looks like." then if pete say" School's out for the day,\looks like." then
touch-next 32 36 2= dup touch-next 32 36 2= dup

View file

@ -4,13 +4,13 @@
3 const CHUCK-HOME 3 const CHUCK-HOME
3 const LAST-STATE 3 const LAST-STATE
array state LAST-STATE 8 / 1 + allot array flags LAST-STATE 8 / 1 + allot
: statef ( f -- v f ) dup 8 % 1 swap << swap 8 / state + swap ; : flagstof ( f -- v f ) dup 8 % 1 swap << swap 8 / flags + swap ;
: state! ( b f -- ) statef f! ; : flagsf! ( b f -- ) flagstof f! ;
: state@ ( b f -- ) statef f@ ; : state@ ( b f -- ) flagstof f@ ;
: setstate 1 swap state! ; : setstate 1 swap flagsf! ;
: clearstate 0 swap state! ; : clearstate 0 swap flagsf! ;
16 18 W ' {horse} defentity p_chuck 16 18 W ' {horse} defentity p_chuck
:noname :noname

View file

@ -4,7 +4,21 @@
39 71 N ' {car} defentity car 39 71 N ' {car} defentity car
car :touch car :touch
player move-entity 1 player.state DRIVING f! CHUCK-FOLLOW state@ if
pete say" I can't leave Chuck here!"
else
move-player 1 player.state DRIVING f!
then
;entity
e_chuck :touch
pete say" Woah, boy. Calm down."
chuck say" * w h i n n y *\(You came back!)"
pete say" Of course I did, boy.\Of course I did."
p_chuck follow
( e_chuck entity>pos p_chuck entity.pos!
p_chuck entity>pos player entity>pos facing player.prevdir ! )
CHUCK-GONE clearstate CHUCK-FOLLOW setstate
;entity ;entity
:noname :noname
@ -16,9 +30,9 @@ car :touch
:| :|
touch-begin S leaving? dup touch-begin S leaving? dup
if player.driving? not if player.driving? not CHUCK-FOLLOW state@ not and
if pete say" I'm not walking." if pete say" I'm not walking."
else player move-entity 13 7 road.jor queue-level else move-player 13 7 road.jor queue-level
then then
then then
CHUCK-GONE state@ if CHUCK-GONE state@ if