pete286/map.jor

108 lines
2.7 KiB
Plaintext
Raw Normal View History

( 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 DRIVABLE
4 const BOATABLE
array tileflags
( grass ) WALKABLE b,
2019-03-14 00:43:38 +00:00
( dirt ) WALKABLE DRIVABLE | b,
( water ) BOATABLE b,
( pavement ) WALKABLE DRIVABLE | b,
( brick ) 0 b,
( forest ) 0 b,
( roof ) 0 b,
( brick ) 0 b,
( window ) 0 b,
( carpet ) WALKABLE b,
( wallpaper ) 0 b,
( tile ) WALKABLE b,
( door ) 0 b,
( cabinet ) 0 b,
( fridge ) 0 b,
( countertop ) 0 b,
( sink ) 0 b,
2019-03-14 00:43:38 +00:00
( house ) 0 b,
2019-03-15 02:18:20 +00:00
( fence ) 0 b,
( storefront ) 0 b,
( space ) 0 b,
2019-09-29 03:19:02 +00:00
( space2 ) BOATABLE b,
2019-12-02 02:39:46 +00:00
( ice ) WALKABLE b,
( ringstl ) WALKABLE b,
( ringstr ) WALKABLE b,
( ringsbl ) WALKABLE b,
( ringsbr ) WALKABLE b,
( hoglinev ) WALKABLE b,
( hoglineh ) WALKABLE 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
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
2019-03-14 00:43:38 +00:00
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 * map + ( copyw src dst )
swap <rot memmove ;
: resize-map ( neww newh -- )
swap mapsize >r ( newh neww oldw r: oldh )
2dup < if 1 <r else <r 1 - 0 then ( newh neww copyw ystart ylim )
for 2dup i copy-mapseg next
2019-09-29 03:19:02 +00:00
drop swap mapsize! ; userword
: mapw mapsize drop ;
: maph mapsize nip ;
: offset-map ( p d -- p ) dup 0 < if drop else + then ;
: shift-map ( dx dy -- )
maph over abs - >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
<r 0 for
3dup <rot memmove
2dup < if mapw + swap mapw + swap
else mapw - swap mapw - swap then
2019-09-29 03:19:02 +00:00
next drop drop drop invalidate-map ; userword
: save-map ( filename -- )
fdeactivate swap overwrite
mapsize swap fput fput
mapsize * map fwrite
2019-09-29 03:19:02 +00:00
factivate ; userword
: load-map ( filename -- )
fdeactivate swap open
fget fget
2dup * map fread
mapsize!
2019-09-29 03:19:02 +00:00
factivate ; userword
: fill-map ( tile -- )
2019-09-29 03:19:02 +00:00
0 mapsize * for dup map i + b! next drop invalidate-map ; userword