0 const EVTICK 1 const EVTOUCH : world>tile 4 >> swap 4 >> swap ; userword : tile>world 4 << swap 4 << swap ; userword : +pos ( x1 y1 x2 y2 -- x y ) rot + swap ; userword : -pos ( x1 y1 x2 y2 -- x y ) negate swap negate swap +pos ; userword : defentity ( x y dir anim -- ) array ' drop , , , tile>world , , ; : entity.x 4 cells + ; : entity.y 3 cells + ; : entity.dir 2 cells + ; : entity>sprite cell + @ execute ; : entity>do ( entity event ) swap @ execute ; : entity>pos dup entity.x @ swap entity.y @ ; userword : entity.pos! ( x y entity ) pos ( dir -- dx dy ) dup W = if drop -1 0 ret then dup E = if drop 1 0 ret then dup N = if drop 0 -1 ret 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 @ 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 b@ sprindex ; : defsingle ( sprindex -- ) create b, does> swap drop b@ ; : defanim ( frame... framecount ticks-per-frame -- ) create b, dup b, 0 for b, next does> ( dir a -- ) dup dup 1 + b@ swap b@ ( dir a count tpf ) ticks swap / swap % ( dir a index ) 2 + + b@ sprindex ; 0 defstatic {car} 5 defstatic {car-lit} 1 defstatic {pete-stand} 1 2 2 5 defanim {pete-walk} 13 defsingle {pete-table} 14 defsingle {chair} 15 defsingle {pete-bed} 16 defsingle {horse} 3 defstatic {mary} 3 4 2 5 defanim {mary-walk} 6 defstatic {jeanne} 6 7 2 5 defanim {jeanne-walk} 18 defsingle {phone} 38 defsingle {fridge} 43 defsingle {boat} 8 defstatic {boat-pete} 9 defstatic {duck} 46 defsingle {aliem} : sprite-bob ( x y sprindex -- x y sprindex ) dup 39 >= over 46 <= and if >rot 2dup + ticks + 40 % 20 < if 1 + then