\ playspace.fs - Stars game play space 
\ +JMJ 2013 David Meyer <papa@sdf.org>

5 constant N \ Play space linear extent (NxNxN cube)
N dup * constant N^2 \ value NxN
N^2 N * constant N^3 \ value NxNxN

: in-playspace? ( n -- f )
    \ Is position index n within the defined play space?
    dup 0>= 
    swap N^3 <
    and
;

: x ( n1 -- n2 )
    \ Return x coordinate n2 of position index n1.
    N mod
;

: y ( n1 -- n2 )
    \ Return y coordinate n2 of position index n1.
    N^2 mod N /
;

: z ( n1 -- n2 )
    \ Return z coordinate n2 of position index n1.
    N^2 /
;

: valid-move? ( n1 n2 -- f )
    \ Is a move from position index n1 to n2 valid according to game rules?
    2dup in-playspace?
    swap in-playspace?
    and                       \ n1 and n2 are in playspace
    rot rot 2dup x swap x - abs
    rot rot 2dup y swap y - abs
    rot rot      z swap z - abs
    + + 1 =                   \ move is single space in 1 direction
    and
;

: test ( -- )
    \ Test driver

    N^3 0 u+do
	cr i dup . [char] : emit space
	N^3 0 u+do
	    dup i valid-move? if
		i .
	    then
	loop
    loop
    cr
;