( M A P ) var tileselect : invalidate-map mapsize mapsize! ; : mouseworldpos mousepos scrollpos +pos ; : mousetile mouseworldpos world>tile ; : tile ( x y -- ptr ) mapsize drop * + map + ; 1 const WALKABLE 2 const NEUTABLE array tileflags ( sky ) 0 b, ( cloud ) 0 b, ( wall ) NEUTABLE b, ( carpet ) WALKABLE b, ( comp-off ) 0 b, ( comp-on ) NEUTABLE b, ( table ) 0 b, ( chair ) 0 b, ( table-brok ) 0 b, ( door-close ) 0 b, ( door-open ) WALKABLE b, ( switch-off ) NEUTABLE b, ( switch-on ) NEUTABLE b, ( window ) 0 b, ( chair-brok ) 0 b, ( bookcase ) 0 b, ( bookcase-broke ) 0 b, ( scattered books ) WALKABLE b, ( plant ) 0 b, ( tipped plant ) 0 b, ( scanner-off ) NEUTABLE b, ( scanner-on ) NEUTABLE b, ( cracked-wall ) 0 b, ( rexx-pod ) NEUTABLE b, here tileflags - 1 - const MAXTILE : mapflag? ( x y flag -- b ) >rot tile b@ tileflags + b@ & ; : tick-mapedit tileselect @ ^< key-pressed if 1 - then ^> key-pressed if 1 + then 0 max MAXTILE min ( dup 0 < if drop MAXTILE then dup MAXTILE > if drop 0 then ) tileselect ! MOUSEL mousedown if tileselect @ mousetile tile b! invalidate-map then MOUSER clicked if mouseworldpos world>tile 2dup tile b@ tileselect ! swap . . cr then ; : copy-mapseg ( neww oldw y -- ) >r ( oldw neww r: y ) 2dup min >rot ( copyw neww oldw ) r@ * map + ( copyw neww src ) swap r ( newh neww oldw r: oldh ) 2dup < if 1 r ( dx dy r: h ) swap mapw over abs - >rot ( w dy dx r: h ) 2dup map swap offset-map swap mapw * offset-map >rot ( w end dy dx r: h ) map swap negate offset-map swap mapw * negate offset-map ( w end start r: h ) 2dup > if r@ mapw * + swap r@ mapw * + swap then