Now it has been published. Keep in mind that this is a early version. I do realized that I could have reduced so much codes after looking at the f block within the command used by the gui filter, and learning of the =.
technique to merge text string. So, I mentioned refactoring is planned. Right now, it’s just incredibly difficult to read and write on.
I’m almost done refactoring the code (I’m still missing in features for now, but it’s not so far off from being finished. It’s about to be finished, and the refactoring mode makes it easier for me to figure out how to do symmetry mode.). Compare this with the branch. The code is less than 3/4 of the original one after refactoring. Also, easier to understand as you can see. I might just move some lines to have the code with less lines.
EDIT: Successfully have remade the interactive window tool to something far more maintainable. There’s new features such as cutting/copying to tile. Still no symmetry mode or row/column shifting mode yet. That’s going to be a separate mode entirely from the main mode. But those are next after the replace tool. This code is 2/3 as big as the original one.
EDIT 2: I finished implementing replace mode. j[m] [n] didn’t work, so I had to find a working macro command to make it work. Now it’s time for me to finish symmetry mode. After that, I will do row/column shifting which is way easier to figure out.
EDIT 3: I have figured out how to implement symmetry mode. The code is sure coming to completion with every features I"d like into it. Right now, symmetry mode only works with periodic setting and only on place tile mode and only along x axis and only based on half-x. I’ll add it to cut and erase mode. After that, I’ll be inserting a new mode to enhance tile placement tool and a option to allow users to import original image as placed tiles. That way, with the new mode that allows row/column shifting and bigger cut/copy and paste, it’ll be incredibly easy to make a rpg world art.
#@cli rep_rpgtiler_noniso: { filename | [tile] },__min_tile>=3,increment>=0,_tileset_iw_width>=1,_tileset_ih_width>=1,_preserve_bgout={ 0=eliminate_bg | 1=preserve_bg },_drgba_r>=0,_drgba_g>=0,_drgba_b>=0,_gridcol>=0,_trackpadcol>=0
#@cli : Launch the interactive non-isometric RPG Tiling toolkit.
#@cli : More info: The interactive RPG Tiling toolkit is a early version. More features will be added such as symmetry mode and row/column shifting.\n
#@cli : Note: This is meant to enable artists to make artwork based on non-isometric RPG games or even world. It is not meant to be a tool to aid into making RPG games. If you want that, then you need to look into other solutions. Of course, there might be the off-chance that this tool is suitable for you.\n
#@cli : '{ filename | [tile] }' can be either location of the tile in text form, or as a image argument. If using image argument, you must do rep_rpgtiler[target] [tile] to make it work.
#@cli : '__min_tile' defines the size of tiles.
#@cli : 'increment' defines the maximum possible selection length by number of tiles added by 1. 0 means maximum possible selection length by tile within axis is exactly 1.
#@cli : '_tileset_iw_width' defines the width of tileset visible within interactive window.
#@cli : '_tileset_ih_width' defines the width of tileset visible within interactive window.
#@cli : '_preserve_bgout' can be used to keep or erase image after painting tiles.
#@cli : '_dbrga_r' is the color of transparent background. If a value is assigned to this, then transparent areas are replaced with colored background instead of a checkerboard.
#@cli : '_dbrga_g' is the color of transparent background. If a value is assigned to this, then transparent areas are replaced with colored background instead of a checkerboard.
#@cli : '_dbrga_b' is the color of transparent background. If a value is assigned to this, then transparent areas are replaced with colored background instead of a checkerboard.
#@cli : '_gridcol' defines the color of grid within interactive window. Only grayscale value.
#@cli : '_trackpadcol' defines the color of tracker pad within interactive window. Only grayscale value.\n
#@cli : Default values: '_tileset_iw_width=16','_tileset_ih_width=16','_preserve_bgout=0','_drgba_r=','_drgba_g=','_drgba_b=','_gridcol=0','_trackpadcol=0'
rep_rpgtiler_noniso:
skip ${4=16},${5=16},${6=0},${7=},${8=},${9=},${10=128},${11=128}
include_image=${"is_image_arg $1"}
__min_tile={abs($2)}
if $__min_tile<3 error "$"2>=3==F"" fi
max_increment={abs($3)}
tile_width=$__min_tile
tile_height=$__min_tile
gridcol={abs($10)}
trackpadcol={abs($11)}
if narg($7)||narg($8)||narg($9)
if narg($7) __r_col={min(abs($7),255)} else __r_col=0 fi
if narg($8) __g_col={min(abs($8),255)} else __g_col=0 fi
if narg($9) __b_col={min(abs($9),255)} else __b_col=0 fi
m "xalp : drgba $__r_col,$__g_col,$__b_col"
else
m "xalp : drgba"
fi
m "xalpa: xalp to_a"
m "pass2tile : skip ${""4=2} pass$""1 $""4 f[0] i(#-1,$""2+x,$""3+y) rm."
m "tile2canvas : pass$""1 0 +f. i(#0,$""2+x,$""3+y) if !$""4 rv[-2,-1] fi blend[-2,-1] alpha j[0] [-1],$""2,$""3 rm."
m "tile2canvas_r : +f. 0 j[0] [-1],$""1,$""2 rm. tile2canvas[0] [-1],$""1,$""2,$""3"
if $!==1
gw={w#0}
gh={h#0}
__nw={ceil($gw/$__min_tile)*$__min_tile}
__nh={ceil($gh/$__min_tile)*$__min_tile}
r $__nw,$__nh,100%,100%,0,0,.5,.5 to_a
+store[0] ogb
xalpa
cs={s#-1}
+store[0] __bg
+store[0] cbg
+f (((x%$__min_tile)==0||(y%$__min_tile)==0)||(x==(w-1)||y==(h-1)))?255-i:i
rm.
f 0
+store[0] current_image
+store[0] undo_image
e[] "\nEntering non-isometric RPG Tiling Tool!"
else
error "$!==1=F"
fi
m "tile2canvas_sym : pass$""1 0 +f. i(#0,$""2+x,$""3+y) if !$""5 rv[-2,-1] fi blend[-2,-1] alpha j[0] [-1],$""2,$""3 j[0] [-1],{($__nw-$""4)-$""2},$""3 rm."
m "out2display : skip ${""1=},${""2=},${""3=},${""4=1},${""5=1},${""6=},${""7=} if narg($""1) if $""1 $__bg rv blend alpha fi fi xalp if narg($""6)||narg($""7) if narg($""2)&&narg($""3)&&narg($""4)&&narg($""5) f. begin(xc=$""2;yc=$""3;tw=$""4;th=$""5;psx=floor(xc/$__min_tile)*$2;psy=floor(yc/$__min_tile)*$2;border=2;border_left=psx+border-1+narg($""7);border_right=psx+tw-border;border_up=psy+border-1+narg($""7);border_down=psy+th-border;boundx=psx+tw;boundy=psy+th;);if(narg($""6),tracker=(x>=psx&&x<boundx)&&(y>=psy&&y<boundy)?((x<=border_left||x>=border_right)||(y<=border_up||y>=border_down)?$""6:i):i;,tracker=i;);if(narg($""7),(!(((x%$2)==0||(y%$2)==0)||(x==(w-1)||y==(h-1)))?tracker:$""7),tracker;); fi fi"
e[] "\n Instruction on how to work with interactive windows.\n
\ ---------------------------------------------------------\n\n
\ - On any window - \n
\ * Q: Remove/Restore Background\n
\ * G: Activate Canvas Grid Mode On/Off\n
\ * C: Activate Copy Mode On/Off\n
\ * X: Activate Cut Mode On/Off\n
\ * D: Switch between Place/Eraser Mode\n
\ * Z: Undo Changes\n
\ * R: Activate Replace Mode\n
\ * S: Activate Symmetry Mode\n
\ * M: Switch Axis in Symmetry Mode\n
\ * B: Switch between Periodic/Mirror mode in Symmetry Mode\n
\ * W: Restore All Windows\n\n
\ - On Canvas window - \n
\ * F: Activate/Deactivate Background Tile Layering Mode\n
\ * A: Enable/Disable Tracker\n\n
\ - On Tileset window - \n
\ * CTRL+ARROWKEY: Resize Tile Selection Box\n
\ * ARROWKEY: Scroll through tileset\n\n
\ - On Tile window - \n
\ * CTRL+ARROWKEY: Mirror alongside axis\n
\ * ARROWKEY: Rotate Tile\n
\ * MOUSE BUTTON: Switch between Place/Eraser Mode\n\n
\ ---------------------------------------------------------\n"\n
if $include_image
pass$1 0
else
i $1
fi
l.
xr={ceil(w#-1/(abs($4)*$__min_tile))}
yr={ceil(h#-1/(abs($5)*$__min_tile))}
split_tiles. {-abs($4)*$__min_tile},{-abs($5)*$__min_tile}
mw=${-max_w}
mh=${-max_h}
ti={$!}
endl
$__min_tile,$__min_tile,1,4,0
fti={$!}
$__bg
+xalp.
dw0c={w#0}
dh0c={h#0}
dwm0=0
dwm1=0
dwm2=0
d2rw=162
w[-1] {w#0},{h#0},0,"Canvas"
rm[-2,-1]
+xalp[1] w1[-1]
{w#1},{h#1},0,"Tileset" rm.
w2[-1] $d2rw,$d2rw,0,"Tile"
fti={$!}
icx=0
icy=0
ci=0
lr=0
tb=0
tbc=0
ni=1
cutcopymode=0
erasemode=0
replacemode=0
symmetrymode=0
symmetryaxis=0
symmetrybound=0
canvas_background=1
canvas_gridmode=0
canvas_tracker=1
tileset_gridmode=0
select_from_tileset=0
select_from_canvas=0
select_from_tile=0
resize_tile_from_tileset=0
resize_tile_from_canvas=0
transform_tile=0
switch_tile_set=0
tile_placement_mode=0
start=0
current_csx=-1
current_csy=-1
optinsert=1
do
undo_state=0
main_w_title="Canvas"
canvas_set=""
if {*,W}" || "{*1,W}" || "{*2,W} w[] w1[] w2[] fi
if {*,Z} undo_state=1 fi
if {*,G} canvas_gridmode+=1 canvas_gridmode={$canvas_gridmode%2} fi
if {*,Q} canvas_background+=1 canvas_background={$canvas_background%2} fi
if {*,A} canvas_tracker+=1 canvas_tracker={$canvas_tracker%2} fi
if {*,F} tile_placement_mode+=1 tile_placement_mode={$tile_placement_mode%2} fi
if {*,R} replacemode+=1 replacemode={$replacemode%2} optinsert=1 fi
if {*,S} symmetrymode+=1 symmetrymode={$symmetrymode%2} fi
if $symmetrymode
if {*,B} symmetryaxis+=1 symmetryaxis={$symmetryaxis%4} fi
if {*,M} symmetrybound+1 symmetrybound{$symmetrybound%2} fi
fi
if $canvas_gridmode
if $canvas_tracker canvas_endset=,$trackpadcol,$gridcol
else canvas_endset=,,$gridcol
fi
else
if $canvas_tracker canvas_endset=,$trackpadcol
else canvas_endset=""
fi
fi
if {*,C}" || "{*,X}
if {*,X} cutcopymode=1
else cutcopymode=2
fi
fi
if {*,D}
erasemode+=1
erasemode={$erasemode%2}
if $erasemode +f. 0 w2[-1] {$d2rw+($d2rw*$icx)},{$d2rw+($d2rw*$icy)} rm.
else +out2display. , w2[-1] {$d2rw+($d2rw*$icx)},{$d2rw+($d2rw*$icy)} rm.
fi
optinsert=1
fi
x,y,b,ww,wh={*,x,y,b,w,h}
x1,y1,b1,ww1,wh1={*1,x,y,b,w,h}
x2,y2,b2,ww2,wh2={*2,x,y,b,w,h}
if $start
if $undo_state
+store[0] temp_undo
$undo_image
rv[0,-1]
rm.
$temp_undo
store. undo_image
fi
if {{*2,CTRLLEFT}" || "{*2,CTRLRIGHT}}" && "{{*2,ARROWLEFT}" || "{*2,ARROWRIGHT}}
mirror. x transform_tile=1
wait 100
elif {{*2,CTRLLEFT}" || "{*2,CTRLRIGHT}}" && "{{*2,ARROWUP}" || "{*2,ARROWDOWN}}
mirror. y transform_tile=1
wait 100
elif {*2,ARROWLEFT}||{*2,ARROWRIGHT}
temp_tile_width=$tile_width
temp_tile_height=$tile_height
temp_icx=$icx
temp_icy=$icy
icx=$temp_icy
icy=$temp_icx
tile_width=$temp_tile_height
tile_height=$temp_tile_width
if {*2,ARROWRIGHT} rotate. 90 else rotate. -90 fi
transform_tile=1
wait 100
fi
if $transform_tile
+out2display[$ni] , w1[-1] rm.
+out2display. , w2[-1] {$d2rw+($d2rw*$icx)},{$d2rw+($d2rw*$icy)} rm.
transform_tile=0
optinsert=1
fi
if {{{*1,CTRLLEFT}" || "{*1,CTRLRIGHT}}" && "{*1,ARROWRIGHT}}
if $select_from_tileset
icx+=1
icx={min($icx,$max_increment)}
tile_width={$__min_tile+($icx*$__min_tile)}
fi
if $select_from_tileset resize_tile_from_tileset=1 fi
wait 500
elif {{{*1,CTRLLEFT}" || "{*1,CTRLRIGHT}}" && "{*1,ARROWLEFT}}
if $select_from_tileset
icx-=1
icx={max($icx,0)}
tile_width={$__min_tile+($icx*$__min_tile)}
fi
if $select_from_tileset resize_tile_from_tileset=1 fi
wait 500
elif {{{*1,CTRLLEFT}" || "{*1,CTRLRIGHT}}" && "{*1,ARROWDOWN}}
if $select_from_tileset
icy+=1
icy={min($icy,$max_increment)}
tile_height={$__min_tile+($icy*$__min_tile)}
fi
if $select_from_tileset resize_tile_from_tileset=1 fi
wait 500
elif {{{*1,CTRLLEFT}" || "{*1,CTRLRIGHT}}" && "{*1,ARROWUP}}
if $select_from_tileset
icy-=1
icy={max($icy,0)}
tile_height={$__min_tile+($icy*$__min_tile)}
fi
if $select_from_tileset resize_tile_from_tileset=1 fi
wait 500
elif {*1,ARROWRIGHT}
select_from_tileset=0
lr+=1
lr={$lr%$xr}
ci={($lr+$tb)%$ti}
ni={$ci+1}
switch_tile_set=1
wait 625
elif {*1,ARROWLEFT}
select_from_tileset=0
lr-=1
lr={$lr%$xr}
ci={($lr+$tb)%$ti}
ni={$ci+1}
switch_tile_set=1
wait 625
elif {*1,ARROWDOWN}
select_from_tileset=0
tbc+=1
tbc={$tbc%$yr}
tb={$tbc*$xr}
ci={($lr+$tb)%$ti}
ni={$ci+1}
switch_tile_set=1
wait 625
elif {*1,ARROWUP}
select_from_tileset=0
tbc-=1
tbc={$tbc%$yr}
tb={$tbc*$xr}
ci={($lr+$tb)%$ti}
ni={$ci+1}
switch_tile_set=1
wait 625
fi
if $switch_tile_set
+out2display[$ni] , w1[-1] {w#$ni+$dwm1*w#$ni},{h#$ni+$dwm1*h#$ni} rm.
switch_tile_set=0
fi
if $resize_tile_from_tileset
r. $tile_width,$tile_height,100%,100%,0
pass2tile. [$ni],$tsx,$tsy
+out2display. , w2[-1] {$d2rw+($d2rw*$icx)},{$d2rw+($d2rw*$icy)} rm.
if $tileset_gridmode
+out2display[$ni] 0,$tsx,$tsy,$tile_width,$tile_height,$trackpadcol,$gridcol
else
+out2display[$ni] 0,$tsx,$tsy,$tile_width,$tile_height,$trackpadcol
fi
w1[-1] rm.
resize_tile_from_tileset=0
fi
if $b" && "$x>=0" && "$y>=0" && "$x<w#0" && "$y<h#0
csx={floor($x/$__min_tile)*$__min_tile} csy={floor($y/$__min_tile)*$__min_tile}
if !$cutcopymode&&!$erasemode
if (($current_csx!=$csx)||($current_csy!=$csy))||$optinsert
+store[0] undo_image
if $replacemode
tile2canvas_r[0,-1] $csx,$csy,$tile_placement_mode
else
if $symmetrymode
tile2canvas_sym[0] [-1],$csx,$csy,$tile_width,$tile_placement_mode
else
tile2canvas[0] [-1],$csx,$csy,$tile_placement_mode
fi
fi
fi
optinsert=0
elif $cutcopymode&&!$erasemode
if $cutcopymode==1
+store[0] undo_image
pass2tile. [0],$cx,$cy {w#-1},{h#-1},1,{s#-1} j[0] [-1],$cx,$cy rm.
else
pass2tile. [0],$csx,$csy optinsert=0
fi
+out2display. , w2[-1] {$d2rw+($d2rw*$icx)},{$d2rw+($d2rw*$icy)} rm.
cutcopymode=0
optinsert=1
else
+store[0] undo_image
cutcopymode=0
if (($current_csx!=$csx)||($current_csy!=$csy))||$optinsert
$tile_width,$tile_height,1,{s#0} j[0] [-1],$csx,$csy rm.
fi
fi
current_csx=$csx current_csy=$csy
fi
fi
if $b1" && "$x1>=0" && "$y1>=0" && "$x1<w#1" && "$y1<h#1
start=1
optinsert=1
select_from_canvas=0
select_from_tileset=1
select_from_tile=0
tsx={floor($x1/$__min_tile)*$__min_tile} tsy={floor($y1/$__min_tile)*$__min_tile}
pass2tile. [$ni],$tsx,$tsy
+out2display. , w2[-1] rm.
if $tileset_gridmode
+out2display[$ni] 0,$tsx,$tsy,$tile_width,$tile_height,$trackpadcol,$gridcol
else
+out2display[$ni] 0,$tsx,$tsy,$tile_width,$tile_height,$trackpadcol
fi
w1[-1] rm.
wait 50
fi
if !$start
if $canvas_gridmode
+out2display[0] $canvas_background,0,0,1,1,,$gridcol
else
+out2display[0] $canvas_background
fi
w[-1] rm.
else
if $x>=0" && "$y>=0" && "$x<w#0" && "$y<h#0
cx={floor($x/$__min_tile)*$__min_tile} cy={floor($y/$__min_tile)*$__min_tile}
canvas_set=$canvas_background,$cx,$cy,$tile_width,$tile_height
canvas_set.=$canvas_endset
+out2display[0] $canvas_set
w[-1]
rm.
else
if $canvas_gridmode
+out2display[0] $canvas_background,0,0,1,1,,$gridcol
else
+out2display[0] $canvas_background
fi
w[-1] rm.
fi
wait 50
fi
wait
while {*}" && "!{*,ESC}
uncommand xalp,xalpa,out2display,pass2tile,tile2canvas,tile2canvas_r
w1[] 0
w2[] 0
k[0]
if $6 $obg rv blend alpha fi
I’m having a hard time combining these two
EDIT: Symmetry mode is finished for tile placement!
On the picture, you see some use periodic placement and other use mirror placement. As well as foreground/background placement.
I am now preparing to finish up version 2 of the tiling tool. It’ll be released in 24 hours from now or 48 hours. After that, I think I’ll be on a break.
Version 2 will have (To finish and release soon):
1 - Symmetrical editing with offset option(Overlay tiles, replace tiles, and erase tiles all can be done symmetrically).
2 - Fully functional one stop undo
3 - Cut and Copy
4 - Tile Replace
5 - Preserve Base Image. So you can work on more areas by deleting existing tiles, then shifting them.
6 - Tile Resize from canvas and tile window. Periodic mode only.
Version 3 will have a separate special mode to address limitation of version 2:
1 - Row/Column Shifting
2 - Unlimited Selection.
Version 3 will be final.
Tiler has been updated to version 2. I’m not sure why the option to merge with background image don’t work, but oh well, I’ll look into that after the break or maybe even after version 3. Could be soon as it’s just few lines.
Earlier I was poking fun at the idea of making a game. While a full-blown RPG or rogue-like is unlikely, I do see the potential of a board game or D&D planner coming out of this. Think about it: it is just a matter of shuffling tiles around.
Actually, I think full blown RPG is possible out of this. It’s just a matter of adding more codes to create tile id, location, and other data with a side of nongmic programming. Someone else can do that though.
Still on a break. However, I’ll share this. This is what I made with my own filter.
What fun. Reminds me of Harvest Moon. Has 2-3 missing edges though.
Looks great!
Back to working on this.
EDIT: I went to use images and store route to solve the vector problem. Now it works! Row and column shifting feature will come soon.
EDIT: I’m figuring out how to pass selected column/row into tile window. Critical for placing tile en masse.
EDIT: Above problem was just solved. Some more work to do such as previewing selected row/column as well as adding row/column selection tracker.
EDIT: @afre I actually realized that in theory, adding a image with 2 channels (x,y channel), and z can be used to represent data of placed tiles from tileset, so with this as a option, you can make a full-blown rpg using this filter as an aid, but that comes after the final version of the filter. This doesn’t seem so hard to do actually though it would take time.
#@cli rep_rpgtiler_noniso: { filename | [tileset] },__min_tile>=3,increment>=0,_tileset_iw_width>=1,_tileset_ih_width>=1,{ filename | [premade_tiled] },_preserve_bgout={ 0=eliminate_bg | 1=preserve_bg },_drgba_r>=0,_drgba_g>=0,_drgba_b>=0,_gridcol>=0,_trackpadcol>=0
#@cli : Launch the interactive non-isometric RPG Tiling toolkit.
#@cli : More info: The interactive RPG Tiling toolkit is a intermediate version. Final version of this filter will have row/column shifting,symmetrized tracker and option to import existing tile.\n
#@cli : Note: This is meant to enable artists to make artwork based on non-isometric RPG games or even world. It is not meant to be a tool to aid into making RPG games. If you want that, then you need to look into other solutions. Of course, there might be the off-chance that this tool is suitable for you.\n
#@cli : '{ filename | [tile] }' can be either location of the tile in text form, or as a image argument. If using image argument, you must do rep_rpgtiler[target] [tile] to make it work.
#@cli : '__min_tile' defines the size of tiles.
#@cli : 'increment' defines the maximum possible selection length by number of tiles added by 1. 0 means maximum possible selection length by tile within axis is exactly 1.
#@cli : '_tileset_iw_width' defines the width of tileset visible within interactive window.
#@cli : '_tileset_ih_width' defines the width of tileset visible within interactive window.
#@cli : '_preserve_bgout' can be used to keep or erase image after painting tiles.
#@cli : '_dbrga_r' is the color of transparent background. If a value is assigned to this, then transparent areas are replaced with colored background instead of a checkerboard.
#@cli : '_dbrga_g' is the color of transparent background. If a value is assigned to this, then transparent areas are replaced with colored background instead of a checkerboard.
#@cli : '_dbrga_b' is the color of transparent background. If a value is assigned to this, then transparent areas are replaced with colored background instead of a checkerboard.
#@cli : '_gridcol' defines the color of grid within interactive window. Only grayscale value.
#@cli : '_trackpadcol' defines the color of tracker pad within interactive window. Only grayscale value.\n
#@cli : Default values: '_tileset_iw_width=16','_tileset_ih_width=16','_preserve_bgout=0','_drgba_r=','_drgba_g=','_drgba_b=','_gridcol=0','_trackpadcol=0'
rep_rpgtiler_noniso:
skip ${4=16},${5=16},${6=},${7=0},${8=},${9=},${10=},${11=0},${12=50}
include_background_image=${"is_image_arg $1"}
include_tile_img=${"is_image_arg $6"}
include_tile_loc={!isint($6)||!isnum($6)}
__min_tile={abs($2)}
if $__min_tile<3 error "$"2>=3==F"" fi
max_increment={abs($3)}
tile_width=$__min_tile
tile_height=$__min_tile
gridcol={abs($11)}
trackpadcol={abs($12)}
if narg($8)||narg($9)||narg($10)
if narg($8) __r_col={min(abs($8),255)} else __r_col=0 fi
if narg($9) __g_col={min(abs($9),255)} else __g_col=0 fi
if narg($10) __b_col={min(abs($10),255)} else __b_col=0 fi
m "xalp : drgba $__r_col,$__g_col,$__b_col"
else
m "xalp : drgba"
fi
m "xalpa: xalp to_a"
m "out2display : skip ${""1=},${""2=},${""3=},${""4=1},${""5=1},${""6=},${""7=},${""8=},${""9=},${""10=} if narg($""1) if $""1 $__bg rv blend alpha fi fi xalp if narg($""6) if narg($""2)&&narg($""3)&&narg($""4)&&narg($""5) {$""4},{$""5},1,{s#0},i(#-1,$""2+x,$""3+y) f. begin(ww=w-1;hh=h-1;);(x<(2+narg($""7))||x>ww-2)||(y<(2+narg($""7))||y>hh-2)?(xor($""6,i)>128?0:255):i j[0] [-1],$""2,$""3 rm. if narg($""8)&&narg($""9)&&narg($""10) if $""8==0||$""8>2 {$""4},{$""5},1,{s#0},i(#0,$__nw+($__min_tile*$""9)-$""2+x-$""4,$""3+y) f. begin(ww=w-1;hh=h-1;);(x<(2+narg($""7))||x>ww-2)||(y<(2+narg($""7))||y>hh-2)?(xor($""6,i)>128?0:255):i j[0] [-1],{$__nw+($__min_tile*$""9)-$""2-$""4},$""3 rm. fi if $""8==1||$""8>2 {$""4},{$""5},1,{s#0},i(#0,$""2+x,$__nh+($__min_tile*$""10)-$""3+y-$""5) f. begin(ww=w-1;hh=h-1;);(x<(2+narg($""7))||x>ww-2)||(y<(2+narg($""7))||y>hh-2)?(xor($""6,i)>128?0:255):i j[0] [-1],$""2,{$__nh+($__min_tile*$""10)-$""3-$""5} rm. fi if $""8==2||$""8>2 {$""4},{$""5},1,{s#0},i(#0,$__nw+($__min_tile*$""9)-$""2+x-$""4,$__nh+($__min_tile*$""10)-$""3+y-$""5) f. begin(ww=w-1;hh=h-1;);(x<(2+narg($""7))||x>ww-2)||(y<(2+narg($""7))||y>hh-2)?(xor($""6,i)>128?0:255):i j[0] [-1],{$__nw+($__min_tile*$""9)-$""2-$""4},{$__nh+($__min_tile*$""10)-$""3-$""5} rm. fi fi fi fi if narg($""7) f[0] begin(ww=w-1;hh=h-1;);(x%$__min_tile==0||y%$__min_tile==0)||(x==ww||y==hh)?$""7:i fi"
m "pass2tile : skip ${""4=2} pass$""1 $""4 f[0] i(#-1,$""2+x,$""3+y) rm."
m "tile2canvas : skip ${""4=0} pass$""1 0 +f. i(#0,$""2+x,$""3+y) if !$""4 rv[-2,-1] fi blend[-2,-1] alpha j[0] [-1],$""2,$""3 rm."
m "tile2canvas_r : +f. 0 j[0] [-1],$""1,$""2 rm. tile2canvas[0] [-1],$""1,$""2,$""3"
if $!==1
ttw={ceil(w#0/$__min_tile)}
tth={ceil(h#0/$__min_tile)}
$ttw,1,1,1 iscl={$ttw-1} store. __isc
$tth,1,1,1 isrl={$tth-1} store. __isr
__nw={$ttw*$__min_tile}
__nh={$tth*$__min_tile}
ttw-=2
tth-=2
r $__nw,$__nh,100%,100%,0,0,.5,.5 to_a
+store[0] obg
xalpa
cs={s#-1}
+store[0] __bg
if narg($6)
if include_tile_img pass$6
else include_tile_loc i $6
fi
rm[0]
if ((w#-1!=$__nw)||(h#-1!=$__nw))||(s#-1!=$cs)
error "Invalid Tile Image!"
fi
start=1
else
f 0
start=0
fi
+store[0] current_image
+store[0] undo_image
e[] "\nEntering non-isometric RPG Tiling Tool!"
else
error "$!==1=F"
fi
m "tile2canvas_sym : pass$""1 0 +f. i(#0,$""2+x,$""3+y) if $""8==0||$""8==3 [1] if $""7 mirror. x fi +f. i(#0,$__nw+($__min_tile*$""9)-$""4-$""2+x,$""3+y) fi if $""8==1||$""8==3 [1] if $""7 mirror. y fi +f. i(#0,$""2+x,$__nh+($__min_tile*$""10)-$""5-$""3+y) fi if $""8==2||$""8==3 [1] if $""7 rotate. 180 fi +f. i(#0,$__nw+($__min_tile*$""9)-$""4-$""2+x,$__nh+($__min_tile*$""10)-$""5-$""3+y) fi if $""8==3 if !$""6 rv[-8,-7] rv[-6,-5] fi blend[-8,-7] alpha blend[-6,-5] alpha fi if !$""6 rv[-4,-3] rv[-2,-1] fi blend[-4,-3] alpha blend[-2,-1] alpha if $""8==3 j[0] [-4],$""2,$""3 j[0] [-3],{$__nw+($__min_tile*$""9)-$""4-$""2},$""3 j[0] [-2],$""2,{$__nh+($__min_tile*$""10)-$""5-$""3} j[0] [-1],{$__nw+($__min_tile*$""9)-$""4-$""2},{$__nh+($__min_tile*$""10)-$""5-$""3} k[0] else j[0] [-2],$""2,$""3 if $""8==0 j[0] [-1],{$__nw+($__min_tile*$""9)-$""4-$""2},$""3 elif $""8==1 j[0] [-1],$""2,{$__nh+($__min_tile*$""10)-$""5-$""3} elif $""8==2 j[0] [-1],{$__nw+($__min_tile*$""9)-$""4-$""2},{$__nh+($__min_tile*$""10)-$""5-$""3} fi rm[-2,-1] fi"
m "tile2canvas_r_sym : +f. 0 j[0] [-1],$""1,$""2 if $""6==3||$""6==0 j[0] [-1],{$__nw+($__min_tile*$""7)-$""3-$""1},$""2 fi if $""6==3||$""6==1 j[0] [-1],$""1,{$__nh+($__min_tile*$""8)-$""4-$""2} fi if $""6==3||$""6==2 j[0] [-1],{$__nw+($__min_tile*$""7)-$""3-$""1},{$__nh+($__min_tile*$""8)-$""4-$""2} fi rm. if $""5&&($""6==3||$""6==0) +mirror[1] x fi if $""5&&($""6==3||$""6==1) +mirror[1] y fi if $""5&&($""6==3||$""6==2) +rotate[1] 180 fi if $""6==3 tile2canvas[0] [{$""5?-4:1}],$""1,$""2 tile2canvas[0] [{$""5?-3:1}],{$__nw+($__min_tile*$""7)-$""3-$""1},$""2 tile2canvas[0] [{$""5?-2:1}],$""1,{$__nh+($__min_tile*$""8)-$""4-$""2} tile2canvas[0] [{$""5?-1:1}],{$__nw+($__min_tile*$""7)-$""3-$""1},{$__nh+($__min_tile*$""8)-$""4-$""2} k[0,1] else tile2canvas[0] [1],$""1,$""2 if $""6==0 tile2canvas[0] [{$""5?2:1}],{$__nw+($__min_tile*$""7)-$""3-$""1},$""2 elif $""6==1 tile2canvas[0] [{$""5?2:1}],$""1,{$__nh+($__min_tile*$""8)-$""4-$""2} elif $""6==2 tile2canvas[0] [{$""5?2:1}],{$__nw+($__min_tile*$""7)-$""3-$""1},{$__nh+($__min_tile*$""8)-$""4-$""2} fi k[0,1] fi"
m "addsym2display : tlx={w#0/2+($""2/2)*$""3-2} tly={h#0/2+($""2/2)*$""4-2} px={w#0/2-2} py={h#0/2-2} if $""1<2 if $""1==0 4,{h#0},1,{s#0},begin(ww=w-1;dp=$""1<2?0:1;lp=dp+1;);x==0||x==ww?dp:lp elif $""1==1 {w#0},4,1,{s#0},begin(hh=h-1;dp=$""1<2?0:1;lp=dp+1;);y==0||y==hh?dp:lp fi *. 255 if $""1==0 j[0] [-1],$tlx,0 else j[0] [-1],0,$tly fi k[0] else ntlx={$tlx+3} ntly={$tly+3} f[0] ((x>=$tlx&&x<=$ntlx)||(y>=$tly&&y<=$tly+3))?((x==$tlx||x==$ntlx)||(y==$tly||y==$ntly)?0:255):i fi"
__pmin=0
__mode_one_orientation=0
m "filter_to_selected_row_column: if $__mode_one_orientation $__isr f[0] i(#-1,floor((y+$__pmin*$__min_tile)/$__min_tile),0,0,0)?i:0 else $__isc f[0] i(#-1,floor((x+$__pmin*$__min_tile)/$__min_tile),0,0,0)?i:0 fi k[0]"
e[] "\n Instruction on how to work with interactive windows.\n
\ ---------------------------------------------------------\n\n
\ - On any window - \n
\ * D: Switch between Place/Eraser Mode\n
\ * R: Activate Replace Mode\n
\ * W: Restore All Windows\n
\ * SPACEBAR: Switch Mode\n\n
\ - On Canvas window - \n
\ * C: Activate Copy Mode On/Off\n
\ * X: Activate Cut Mode On/Off\n
\ * Z: Undo Canvas Changes\n
\ * F: Activate/Deactivate Background Tile Layering Mode\n
\ * G: Activate Canvas Grid Mode On/Off\n
\ * Q: Remove/Restore Background\n
\ * A: Enable/Disable Tracker\n
\ * S: Activate Symmetry Mode\n\n
\ -- On Canvas [Symmetry Mode] --\n
\ * B: Switch Axis in Symmetry Mode\n
\ * M: Switch between Periodic/Mirror mode in Symmetry Mode\n
\ * J: Symmetry Line to Center\n
\ * ARROWKEY: Move Symmetry Line\n\n
\ - On Tileset window - \n
\ * CTRL+ARROWKEY: Resize Tile Selection Box\n
\ * ARROWKEY: Scroll through tileset\n\n
\ - On Tile window - \n
\ * CTRL+ARROWKEY: Mirror alongside axis\n
\ * ARROWKEY: Rotate Tile\n
\ * MOUSE BUTTON: Switch between Place/Eraser Mode\n\n
\ ---------------------------------------------------------\n"\n
if $include_background_image
pass$1 0
else
i $1
fi
l.
xr={ceil(w#-1/(abs($4)*$__min_tile))}
yr={ceil(h#-1/(abs($5)*$__min_tile))}
split_tiles. {-abs($4)*$__min_tile},{-abs($5)*$__min_tile}
mw=${-max_w}
mh=${-max_h}
ti={$!}
endl
$__min_tile,$__min_tile,1,4,0
fti={$!}
$__bg
+xalp.
dw0c={w#0}
dh0c={h#0}
dwm0=0
dwm1=0
dwm2=0
d2rw=162
w[-1] {w#0},{h#0},0,"Canvas"
rm[-2,-1]
+xalp[1] w1[-1]
{w#1},{h#1},0,"Tileset" rm.
w2[-1] $d2rw,$d2rw,0,"Tile"
fti={$!}
mode=0
icx=0
icy=0
ci=0
lr=0
tb=0
tbc=0
ni=1
cutcopymode=0
erasemode=0
replacemode=0
editmode=0
symmetrymode=0
symmetryaxis=0
symmetrybound=0
symmetry_posx=0
symmetry_posy=0
canvas_background=1
canvas_gridmode=0
canvas_tracker=1
tileset_gridmode=0
select_from_tileset=0
resize_tile_from_tileset=0
resize_tile_from_canvas=0
transform_tile=0
switch_tile_set=0
tile_placement_mode=0
current_csx=-1
current_csy=-1
optinsert=1
#mode=1#
activated_switched_twice=0
modeswitched=0
changeselectionmode=0
deselectmode=0
movemode=0
delmode=0
rowcolumnshiftmode=0
placemove=0
transfermode=0
current_acsx=-1
current_acsy=-1
vmax=0
pmax=0
pdiff=0
do
main_w_title="Canvas"
if {*,SPACE}" || "{*1,SPACE}" || "{*2,SPACE}
if !$mode +store. tile_id1
else +store. tile_id2
fi
mode+=1 mode={$mode%2}
wait 200
fi
if $start&&$mode
if {*,S} changeselectionmode+=1 changeselectionmode={$changeselectionmode%2} fi
if {*,D} deselectmode+=1 deselectmode={$deselectmode%2} fi
if $changeselectionmode
if {*,ARROWLEFT}||{*,ARROWRIGHT} __mode_one_orientation+=1 __mode_one_orientation={$__mode_one_orientation%2} fi
fi
if $changeselectionmode&&($deselectmode==1) main_w_title.="- [Deselection]"
elif $changeselectionmode&&($deselectmode==0) main_w_title.="- [Selection]"
fi
x,y,b,ww,wh={*,x,y,b,w,h}
if $b" && "$x>=0" && "$y>=0" && "$x<w#0" && "$y<h#0
acsx={floor($x/$__min_tile)} acsy={floor($y/$__min_tile)}
if $changeselectionmode
if (($current_acsx!=$acsx)||($current_acsy!=$acsy))
if !$deselectmode
if !$__mode_one_orientation
$__isc
f. x==$acsx?1:i
vmax={iM#-1}
__pmin={find([crop(#-1)],1,0,1)}
pmax={find([crop(#-1)],1,$iscl,-1)}
pdiff={$pmax-$__pmin+1}
store. __isc
else
$__isr
f. x==$acsy?1:i
vmax={iM#-1}
__pmin={find([crop(#-1)],1,0,1)}
pmax={find([crop(#-1)],1,$isrl,-1)}
pdiff={$pmax-$__pmin+1}
store. __isr
fi
else
if !$__mode_one_orientation
$__isc
f. x==$acsx?0:i
vmax={iM#-1}
__pmin={find([crop(#-1)],1,0,1)}
pmax={find([crop(#-1)],1,$iscl,-1)}
pdiff={$pmax-$__pmin+1}
store. __isc
else
$__isr
f. x==$acsy?0:i
vmax={iM#-1}
__pmin={find([crop(#-1)],1,0,1)}
pmax={find([crop(#-1)],1,$isrl,-1)}
pdiff={$pmax-$__pmin+1}
store. __isr
fi
fi
if $vmax
if !$__mode_one_orientation
r. {$pdiff*$__min_tile},{h#0}
pass2tile. [0],{$__pmin*$__min_tile},0
else
r. {w#0},{$pdiff*$__min_tile}
pass2tile. [0],0,{$__pmin*$__min_tile}
fi
filter_to_selected_row_column.
+out2display. , w2[-1] {w#-1},{h#-1},-1,-1,"Tile" rm.
else
r. 1,1
f. 0
+out2display. , w2[-1] {$d2rw},{$d2rw} rm.
fi
fi
fi
current_acsx=$acsx current_acsy=$acsy
fi
w[] -1,-1,-1,-1,$main_w_title
else
undo_state=0
canvas_set=""
if {*,W}" || "{*1,W}" || "{*2,W} w[] w1[] w2[] fi
if {*,Z} undo_state=1 fi
if {*,G} canvas_gridmode+=1 canvas_gridmode={$canvas_gridmode%2} fi
if {*,Q} canvas_background+=1 canvas_background={$canvas_background%2} fi
if {*,A} canvas_tracker+=1 canvas_tracker={$canvas_tracker%2} fi
if {*,F} tile_placement_mode+=1 tile_placement_mode={$tile_placement_mode%2} fi
if {*,R}" || "{*1,R}" || "{*2,R}
replacemode+=1 replacemode={$replacemode%2} optinsert=1
fi
if {*,S} symmetrymode+=1 symmetrymode={$symmetrymode%2} fi
if $symmetrymode
if {*,B} symmetryaxis+=1 symmetryaxis={$symmetryaxis%4} wait 200 fi
if {*,M} symmetrybound+=1 symmetrybound={$symmetrybound%2} wait 200 fi
if {*,J} symmetry_posx=0 symmetry_posy=0 wait 200 fi
if {*,ARROWLEFT} symmetry_posx-=1 wait 200 fi
if {*,ARROWRIGHT} symmetry_posx+=1 wait 200 fi
if {*,ARROWUP} symmetry_posy-=1 wait 200 fi
if {*,ARROWDOWN} symmetry_posy+=1 wait 200 fi
symmetry_posx={$symmetry_posx>=0?min($ttw,$symmetry_posx):max(-$ttw,$symmetry_posx)}
symmetry_posy={$symmetry_posy>=0?min($tth,$symmetry_posy):max(-$tth,$symmetry_posy)}
fi
if $canvas_gridmode
if $canvas_tracker canvas_endset=,$trackpadcol,$gridcol,
else canvas_endset=,,$gridcol,
fi
else
if $canvas_tracker canvas_endset=,$trackpadcol,
else canvas_endset=",,"
fi
fi
if {*,C}" || "{*,X}
if {*,X} cutcopymode=1
else cutcopymode=2
fi
fi
if {*,D}" || "{*1,D}" || "{*2,D}
erasemode+=1
erasemode={$erasemode%2}
if $erasemode +f. 0 w2[-1] {$d2rw+($d2rw*$icx)},{$d2rw+($d2rw*$icy)} rm.
else +out2display. , w2[-1] {$d2rw+($d2rw*$icx)},{$d2rw+($d2rw*$icy)} rm.
fi
optinsert=1
fi
x,y,b,ww,wh={*,x,y,b,w,h}
x1,y1,b1,ww1,wh1={*1,x,y,b,w,h}
x2,y2,b2,ww2,wh2={*2,x,y,b,w,h}
if $start
if $undo_state
+store[0] temp_undo
$undo_image
rv[0,-1]
rm.
$temp_undo
store. undo_image
fi
if {{*2,CTRLLEFT}" || "{*2,CTRLRIGHT}}" && "{{*2,ARROWLEFT}" || "{*2,ARROWRIGHT}}
mirror. x transform_tile=1
wait 100
elif {{*2,CTRLLEFT}" || "{*2,CTRLRIGHT}}" && "{{*2,ARROWUP}" || "{*2,ARROWDOWN}}
mirror. y transform_tile=1
wait 100
elif {*2,ARROWLEFT}||{*2,ARROWRIGHT}
temp_tile_width=$tile_width
temp_tile_height=$tile_height
temp_icx=$icx
temp_icy=$icy
icx=$temp_icy
icy=$temp_icx
tile_width=$temp_tile_height
tile_height=$temp_tile_width
if {*2,ARROWRIGHT} rotate. 90 else rotate. -90 fi
transform_tile=1
wait 100
fi
if $transform_tile
+out2display[$ni] , w1[-1] rm.
+out2display. , w2[-1] {$d2rw+($d2rw*$icx)},{$d2rw+($d2rw*$icy)} rm.
transform_tile=0
optinsert=1
fi
if {{{*1,CTRLLEFT}" || "{*1,CTRLRIGHT}}" && "{*1,ARROWRIGHT}}
if $select_from_tileset
icx+=1
icx={min($icx,$max_increment)}
tile_width={$__min_tile+($icx*$__min_tile)}
fi
if $select_from_tileset resize_tile_from_tileset=1 fi
wait 500
elif {{{*1,CTRLLEFT}" || "{*1,CTRLRIGHT}}" && "{*1,ARROWLEFT}}
if $select_from_tileset
icx-=1
icx={max($icx,0)}
tile_width={$__min_tile+($icx*$__min_tile)}
fi
if $select_from_tileset resize_tile_from_tileset=1 fi
wait 500
elif {{{*1,CTRLLEFT}" || "{*1,CTRLRIGHT}}" && "{*1,ARROWDOWN}}
if $select_from_tileset
icy+=1
icy={min($icy,$max_increment)}
tile_height={$__min_tile+($icy*$__min_tile)}
fi
if $select_from_tileset resize_tile_from_tileset=1 fi
wait 500
elif {{{*1,CTRLLEFT}" || "{*1,CTRLRIGHT}}" && "{*1,ARROWUP}}
if $select_from_tileset
icy-=1
icy={max($icy,0)}
tile_height={$__min_tile+($icy*$__min_tile)}
fi
if $select_from_tileset resize_tile_from_tileset=1 fi
wait 500
elif {*1,ARROWRIGHT}
select_from_tileset=0
lr+=1
lr={$lr%$xr}
ci={($lr+$tb)%$ti}
ni={$ci+1}
switch_tile_set=1
wait 625
elif {*1,ARROWLEFT}
select_from_tileset=0
lr-=1
lr={$lr%$xr}
ci={($lr+$tb)%$ti}
ni={$ci+1}
switch_tile_set=1
wait 625
elif {*1,ARROWDOWN}
select_from_tileset=0
tbc+=1
tbc={$tbc%$yr}
tb={$tbc*$xr}
ci={($lr+$tb)%$ti}
ni={$ci+1}
switch_tile_set=1
wait 625
elif {*1,ARROWUP}
select_from_tileset=0
tbc-=1
tbc={$tbc%$yr}
tb={$tbc*$xr}
ci={($lr+$tb)%$ti}
ni={$ci+1}
switch_tile_set=1
wait 625
fi
if $switch_tile_set
+out2display[$ni] , w1[-1] {w#$ni+$dwm1*w#$ni},{h#$ni+$dwm1*h#$ni} rm.
switch_tile_set=0
fi
if $resize_tile_from_tileset
r. $tile_width,$tile_height,100%,100%,0
pass2tile. [$ni],$tsx,$tsy
+out2display. , w2[-1] {$d2rw+($d2rw*$icx)},{$d2rw+($d2rw*$icy)} rm.
if $tileset_gridmode
+out2display[$ni] 0,$tsx,$tsy,$tile_width,$tile_height,$trackpadcol,$gridcol
else
+out2display[$ni] 0,$tsx,$tsy,$tile_width,$tile_height,$trackpadcol
fi
w1[-1] rm.
resize_tile_from_tileset=0
fi
if $b" && "$x>=0" && "$y>=0" && "$x<w#0" && "$y<h#0
csx={floor($x/$__min_tile)*$__min_tile} csy={floor($y/$__min_tile)*$__min_tile}
if !$cutcopymode&&!$erasemode
if (($current_csx!=$csx)||($current_csy!=$csy))||$optinsert
+store[0] undo_image
if $replacemode
if $symmetrymode
tile2canvas_r_sym[0,-1] $csx,$csy,$tile_width,$tile_height,$symmetrybound,$symmetryaxis,$symmetry_posx,$symmetry_posy
else
tile2canvas_r[0,-1] $csx,$csy,$tile_placement_mode
fi
else
if $symmetrymode
tile2canvas_sym[0] [-1],$csx,$csy,$tile_width,$tile_height,$tile_placement_mode,$symmetrybound,$symmetryaxis,$symmetry_posx,$symmetry_posy
else
tile2canvas[0] [-1],$csx,$csy,$tile_placement_mode
fi
fi
fi
optinsert=0
elif $cutcopymode&&!$erasemode
if $cutcopymode==1
+store[0] undo_image
pass2tile. [0],$cx,$cy {w#-1},{h#-1},1,{s#-1} j[0] [-1],$cx,$cy rm.
else
pass2tile. [0],$csx,$csy optinsert=0
fi
+out2display. , w2[-1] {$d2rw+($d2rw*$icx)},{$d2rw+($d2rw*$icy)} rm.
cutcopymode=0
optinsert=1
else
+store[0] undo_image
cutcopymode=0
if (($current_csx!=$csx)||($current_csy!=$csy))||$optinsert
if $symmetrymode
$tile_width,$tile_height,1,{s#0}
j[0] [-1],$csx,$csy
if $symmetryaxis==3||$symmetryaxis==0 j[0] [-1],{$__nw+($__min_tile*$symmetry_posx)-$tile_width-$csx},$csy fi
if $symmetryaxis==3||$symmetryaxis==1 j[0] [-1],$csx,{$__nh+($__min_tile*$symmetry_posy)-$tile_height-$csy} fi
if $symmetryaxis==3||$symmetryaxis==2 j[0] [-1],{$__nw+($__min_tile*$symmetry_posx)-$tile_width-$csx},{$__nh+($__min_tile*$symmetry_posy)-$tile_height-$csy} fi
rm.
else
$tile_width,$tile_height,1,{s#0} j[0] [-1],$csx,$csy rm.
fi
fi
fi
current_csx=$csx current_csy=$csy
fi
fi
if $b1" && "$x1>=0" && "$y1>=0" && "$x1<w#1" && "$y1<h#1
cutcopymode=0
start=1
optinsert=1
select_from_tileset=1
erasemode=0
tsx={floor($x1/$__min_tile)*$__min_tile} tsy={floor($y1/$__min_tile)*$__min_tile}
pass2tile. [$ni],$tsx,$tsy
+out2display. , w2[-1] rm.
if $tileset_gridmode
+out2display[$ni] 0,$tsx,$tsy,$tile_width,$tile_height,$trackpadcol,$gridcol
else
+out2display[$ni] 0,$tsx,$tsy,$tile_width,$tile_height,$trackpadcol
fi
w1[-1] rm.
wait 50
fi
if !$start
if $canvas_gridmode
+out2display[0] $canvas_background,0,0,1,1,,$gridcol
else
+out2display[0] $canvas_background
fi
if $symmetrymode addsym2display. $symmetryaxis,$__min_tile,$symmetry_posx,$symmetry_posy fi
w[-1] rm.
else
if $x>=0" && "$y>=0" && "$x<w#0" && "$y<h#0
cx={floor($x/$__min_tile)*$__min_tile} cy={floor($y/$__min_tile)*$__min_tile}
canvas_set=$canvas_background,$cx,$cy,$tile_width,$tile_height
canvas_set.=$canvas_endset
if $symmetrymode
if $canvas_gridmode canvas_set.=$symmetryaxis,$symmetry_posx,$symmetry_posy
else canvas_set.=,$symmetryaxis,$symmetry_posx,$symmetry_posy
fi
fi
+out2display[0] $canvas_set
if $symmetrymode addsym2display. $symmetryaxis,$__min_tile,$symmetry_posx,$symmetry_posy fi
w[-1]
rm.
else
if $canvas_gridmode
+out2display[0] $canvas_background,0,0,1,1,,$gridcol
else
+out2display[0] $canvas_background
fi
if $symmetrymode addsym2display. $symmetryaxis,$__min_tile,$symmetry_posx,$symmetry_posy fi
w[-1] rm.
fi
fi
if $start
if $erasemode main_w_title.=" (Eraser Mode) - "
else
if $cutcopymode
if $cutcopymode==2 main_w_title.=" (Copy Mode) - "
else main_w_title.=" (Cut Mode) - "
fi
else
if $replacemode main_w_title.=" (Replacement Mode) - "
else
if $tile_placement_mode main_w_title.=" (Place Tile [Background]) - "
else main_w_title.=" (Place Tile [Foreground]) - "
fi
fi
fi
fi
if $canvas_tracker main_w_title.="(Tracker)" fi
if $canvas_gridmode main_w_title.="(Grid)" fi
if $symmetrymode
if $symmetryaxis==0
if $symmetrybound main_w_title.="(Symmetry-X (Mirror))"
else main_w_title.="(Symmetry-X (Periodic))"
fi
elif $symmetryaxis==1
if $symmetrybound main_w_title.="(Symmetry-Y (Mirror))"
else main_w_title.="(Symmetry-Y (Periodic))"
fi
elif $symmetryaxis==2
if $symmetrybound main_w_title.="(Symmetry-XY (Corner) (Mirror))"
else main_w_title.="(Symmetry-XY (Corner)(Periodic))"
fi
else
if $symmetrybound main_w_title.="(Symmetry-XY (Reflected) (Mirror))"
else main_w_title.="(Symmetry-XY (Reflected) (Periodic))"
fi
fi
fi
fi
w[] -1,-1,-1,-1,$main_w_title
fi
wait
while {*}" && "!{*,ESC}
uncommand xalp,xalpa,out2display,pass2tile,tile2canvas,tile2canvas_r,tile2canvas_sym,tile2canvas_r_sym,addsym2display,filter_to_selected_row_column
w1[] 0
w2[] 0
k[0]
if $7 $obg rv blend alpha fi
With so many edits, it is hard to keep track. If by x,y,z you mean, xy-location and z-height for character and object sprites, then yes, that would be necessary for an RPG or any game for that matter. Another consideration is boundaries. You wouldn’t want to walk through walls or off cliffs unless your character wants bloody wounds or death.
Ok, that means 3-channel with z depth to it. The third channel being boundary condition.
By the way, @David_Tschumperle, I mentioned you at the PDN forum. This can be ignored as it about a future discussion on adding preset tileset.
When have a bit of time want to arm something with this:
https://corax89.github.io/esp8266Game/index.html
@bazza Of all the game that is on the list, tank city is literally the most feasible with this tool. Basically, only requires extracting the alpha channel of the walls and then simplifying the boxes into 0,1 then rescale to nearest. The rest is done with programming which is out of scope for the purpose of this tool.
Platform Also
Brings back memories.
gmic rep_rpgtiler_noniso.gmic rep_rpgtiler_noniso d9c7f209792f69b337e038c59c61b00319c48afa.png
It needs another parameter?
@afre @David_Tschumperle I’m stuck on a roadblock that will prevent me from releasing Version 3 of the filter. I can’t seem to get the echo message to show up on either shortcut command or full name command, and I prefer having a block somewhere to manipulate than having to copy and paste a block to another. Instructions on usage is way below.
#@cli rep_tiler_n: eq. to 'rep_tiler_nonisometric' : (+)
rep_tiler_n: rep_tiler_nonisometric $*
#@cli rep_tiler_nonisometric: { filename | [tileset] },__min_tile>=3,increment>=0,_tileset_iw_width>=1,_tileset_ih_width>=1,{ filename | [placed_tiles] },_preserve_bgout={ 0=eliminate_bg | 1=preserve_bg },_drgba_r>=0,_drgba_g>=0,_drgba_b>=0,_gridcol>=0,_trackpadcol>=0
#@cli : Launch the interactive non-isometric RPG Tiling toolkit. Mandatory variables are the first 3 ones!
#@cli : More info: The interactive RPG Tiling toolkit is a near final version. Final version will have tiledata import and export. Perhaps with a master developer editor to make overworld art.\n
#@cli : (eq. to 'rep_tiler_n').\n
#@cli : Note: This is meant to enable artists to make artwork based on non-isometric RPG games or even world. It is not meant to be a tool to aid into making RPG games. If you want that, then you need to look into other solutions. Of course, there might be the off-chance that this tool is suitable for you.\n
#@cli : '{ filename | [tileset] }' can be either location of the tileset in text form, or as a image argument. If using image argument, you must do rep_tiler_nonisometric[target] [tile] to make it work.
#@cli : '__min_tile' defines the size of tiles.
#@cli : 'increment' defines the maximum possible selection length by number of tiles added by 1. 0 means maximum possible selection length by tile within axis is exactly 1.
#@cli : '_tileset_iw_width' defines the width of tileset visible within interactive window.
#@cli : '_tileset_ih_width' defines the width of tileset visible within interactive window.
#@cli : '_preserve_bgout' can be used to keep or erase image after painting tiles.
#@cli : '{ filename | [placed_tiles] }' can be either location of the tile in text form, or as a image argument. If using image argument, you must do rep_tiler_nonisometric[target] [tile] to make it work.
#@cli : '_dbrga_r' is the color of transparent background. If a value is assigned to this, then transparent areas are replaced with colored background instead of a checkerboard.
#@cli : '_dbrga_g' is the color of transparent background. If a value is assigned to this, then transparent areas are replaced with colored background instead of a checkerboard.
#@cli : '_dbrga_b' is the color of transparent background. If a value is assigned to this, then transparent areas are replaced with colored background instead of a checkerboard.
#@cli : '_gridcol' defines the color of grid within interactive window. Only grayscale value.
#@cli : '_trackpadcol' defines the color of tracker pad within interactive window. Only grayscale value.\n
#@cli : Default values: '_tileset_iw_width=16','_tileset_ih_width=16','_preserve_bgout=0','_drgba_r=','_drgba_g=','_drgba_b=','_gridcol=0','_trackpadcol=0'
rep_tiler_nonisometric:
skip ${4=16},${5=16},${6=},${7=0},${8=},${9=},${10=},${11=0},${12=50}
include_background_image=${"is_image_arg $1"}
include_tile_img=${"is_image_arg $6"}
include_tile_loc={!isint($6)||!isnum($6)}
__min_tile={abs($2)}
if $__min_tile<3 error "$"2>=3==F"" fi
max_increment={abs($3)}
tile_width=$__min_tile
tile_height=$__min_tile
gridcol={abs($11)}
trackpadcol={abs($12)}
__trackpadcol_alt=$trackpadcol
m "tiler_noniso_message : __rep_tiler_nonisometric_instructions"
if narg($8)||narg($9)||narg($10)
if narg($8) __r_col={min(abs($8),255)} else __r_col=0 fi
if narg($9) __g_col={min(abs($9),255)} else __g_col=0 fi
if narg($10) __b_col={min(abs($10),255)} else __b_col=0 fi
m "xalp : drgba $__r_col,$__g_col,$__b_col"
else
m "xalp : drgba"
fi
m "xalpa: xalp to_a"
m "out2display : skip ${""1=},${""2=},${""3=},${""4=1},${""5=1},${""6=},${""7=},${""8=},${""9=},${""10=} if narg($""1) if $""1 $__bg rv blend alpha fi fi xalp if narg($""6) if narg($""2)&&narg($""3)&&narg($""4)&&narg($""5) {$""4},{$""5},1,{s#0},i(#-1,$""2+x,$""3+y) f. begin(ww=w-1;hh=h-1;);(x<(2+narg($""7))||x>ww-2)||(y<(2+narg($""7))||y>hh-2)?(xor($""6,i)>128?0:255):i j[0] [-1],$""2,$""3 rm. if narg($""8)&&narg($""9)&&narg($""10) if $""8==0||$""8>2 {$""4},{$""5},1,{s#0},i(#0,$__nw+($__min_tile*$""9)-$""2+x-$""4,$""3+y) f. begin(ww=w-1;hh=h-1;);(x<(2+narg($""7))||x>ww-2)||(y<(2+narg($""7))||y>hh-2)?(xor($""6,i)>128?0:255):i j[0] [-1],{$__nw+($__min_tile*$""9)-$""2-$""4},$""3 rm. fi if $""8==1||$""8>2 {$""4},{$""5},1,{s#0},i(#0,$""2+x,$__nh+($__min_tile*$""10)-$""3+y-$""5) f. begin(ww=w-1;hh=h-1;);(x<(2+narg($""7))||x>ww-2)||(y<(2+narg($""7))||y>hh-2)?(xor($""6,i)>128?0:255):i j[0] [-1],$""2,{$__nh+($__min_tile*$""10)-$""3-$""5} rm. fi if $""8==2||$""8>2 {$""4},{$""5},1,{s#0},i(#0,$__nw+($__min_tile*$""9)-$""2+x-$""4,$__nh+($__min_tile*$""10)-$""3+y-$""5) f. begin(ww=w-1;hh=h-1;);(x<(2+narg($""7))||x>ww-2)||(y<(2+narg($""7))||y>hh-2)?(xor($""6,i)>128?0:255):i j[0] [-1],{$__nw+($__min_tile*$""9)-$""2-$""4},{$__nh+($__min_tile*$""10)-$""3-$""5} rm. fi fi fi fi if narg($""7) f[0] begin(ww=w-1;hh=h-1;);(x%$__min_tile==0||y%$__min_tile==0)||(x==ww||y==hh)?$""7:i fi"
m "pass2tile : skip ${""4=2} pass$""1 $""4 f[0] i(#-1,$""2+x,$""3+y) rm."
m "tile2canvas : skip ${""4=0} pass$""1 0 +f. i(#0,$""2+x,$""3+y) if !$""4 rv[-2,-1] fi blend[-2,-1] alpha j[0] [-1],$""2,$""3 rm."
m "tile2canvas_r : +f. 0 j[0] [-1],$""1,$""2 rm. tile2canvas[0] [-1],$""1,$""2,$""3"
if $!==1
ttw={ceil(w#0/$__min_tile)}
tth={ceil(h#0/$__min_tile)}
isw={$ttw}
ish={$tth}
$ttw,1,1,1 iscl={$ttw-1} store. __isc
$tth,1,1,1 isrl={$tth-1} store. __isr
__nw={$ttw*$__min_tile}
__nh={$tth*$__min_tile}
ttw-=2
tth-=2
r $__nw,$__nh,100%,100%,0,0,.5,.5 to_a
+store[0] obg
xalpa
cs={s#-1}
+store[0] __bg
if narg($6)
if include_tile_img pass$6
else include_tile_loc i $6
fi
rm[0]
if ((w#-1!=$__nw)||(h#-1!=$__nw))||(s#-1!=$cs)
error "Invalid Tile Image!"
fi
start=1
else
f 0
start=0
fi
+store[0] current_image
+store[0] undo_image
e[] "\nEntering non-isometric RPG Tiling Tool!"
else
error "$!==1=F"
fi
m "tile2canvas_sym : pass$""1 0 +f. i(#0,$""2+x,$""3+y) if $""8==0||$""8==3 [1] if $""7 mirror. x fi +f. i(#0,$__nw+($__min_tile*$""9)-$""4-$""2+x,$""3+y) fi if $""8==1||$""8==3 [1] if $""7 mirror. y fi +f. i(#0,$""2+x,$__nh+($__min_tile*$""10)-$""5-$""3+y) fi if $""8==2||$""8==3 [1] if $""7 rotate. 180 fi +f. i(#0,$__nw+($__min_tile*$""9)-$""4-$""2+x,$__nh+($__min_tile*$""10)-$""5-$""3+y) fi if $""8==3 if !$""6 rv[-8,-7] rv[-6,-5] fi blend[-8,-7] alpha blend[-6,-5] alpha fi if !$""6 rv[-4,-3] rv[-2,-1] fi blend[-4,-3] alpha blend[-2,-1] alpha if $""8==3 j[0] [-4],$""2,$""3 j[0] [-3],{$__nw+($__min_tile*$""9)-$""4-$""2},$""3 j[0] [-2],$""2,{$__nh+($__min_tile*$""10)-$""5-$""3} j[0] [-1],{$__nw+($__min_tile*$""9)-$""4-$""2},{$__nh+($__min_tile*$""10)-$""5-$""3} k[0] else j[0] [-2],$""2,$""3 if $""8==0 j[0] [-1],{$__nw+($__min_tile*$""9)-$""4-$""2},$""3 elif $""8==1 j[0] [-1],$""2,{$__nh+($__min_tile*$""10)-$""5-$""3} elif $""8==2 j[0] [-1],{$__nw+($__min_tile*$""9)-$""4-$""2},{$__nh+($__min_tile*$""10)-$""5-$""3} fi rm[-2,-1] fi"
m "tile2canvas_r_sym : +f. 0 j[0] [-1],$""1,$""2 if $""6==3||$""6==0 j[0] [-1],{$__nw+($__min_tile*$""7)-$""3-$""1},$""2 fi if $""6==3||$""6==1 j[0] [-1],$""1,{$__nh+($__min_tile*$""8)-$""4-$""2} fi if $""6==3||$""6==2 j[0] [-1],{$__nw+($__min_tile*$""7)-$""3-$""1},{$__nh+($__min_tile*$""8)-$""4-$""2} fi rm. if $""5&&($""6==3||$""6==0) +mirror[1] x fi if $""5&&($""6==3||$""6==1) +mirror[1] y fi if $""5&&($""6==3||$""6==2) +rotate[1] 180 fi if $""6==3 tile2canvas[0] [{$""5?-4:1}],$""1,$""2 tile2canvas[0] [{$""5?-3:1}],{$__nw+($__min_tile*$""7)-$""3-$""1},$""2 tile2canvas[0] [{$""5?-2:1}],$""1,{$__nh+($__min_tile*$""8)-$""4-$""2} tile2canvas[0] [{$""5?-1:1}],{$__nw+($__min_tile*$""7)-$""3-$""1},{$__nh+($__min_tile*$""8)-$""4-$""2} k[0,1] else tile2canvas[0] [1],$""1,$""2 if $""6==0 tile2canvas[0] [{$""5?2:1}],{$__nw+($__min_tile*$""7)-$""3-$""1},$""2 elif $""6==1 tile2canvas[0] [{$""5?2:1}],$""1,{$__nh+($__min_tile*$""8)-$""4-$""2} elif $""6==2 tile2canvas[0] [{$""5?2:1}],{$__nw+($__min_tile*$""7)-$""3-$""1},{$__nh+($__min_tile*$""8)-$""4-$""2} fi k[0,1] fi"
m "addsym2display : tlx={w#0/2+($""2/2)*$""3-2} tly={h#0/2+($""2/2)*$""4-2} px={w#0/2-2} py={h#0/2-2} if $""1<2 if $""1==0 4,{h#0},1,{s#0},begin(ww=w-1;dp=$""1<2?0:1;lp=dp+1;);x==0||x==ww?dp:lp elif $""1==1 {w#0},4,1,{s#0},begin(hh=h-1;dp=$""1<2?0:1;lp=dp+1;);y==0||y==hh?dp:lp fi *. 255 if $""1==0 j[0] [-1],$tlx,0 else j[0] [-1],0,$tly fi k[0] else ntlx={$tlx+3} ntly={$tly+3} f[0] ((x>=$tlx&&x<=$ntlx)||(y>=$tly&&y<=$tly+3))?((x==$tlx||x==$ntlx)||(y==$tly||y==$ntly)?0:255):i fi"
m "filter_to_selected_row_column: if $__altmode_orientation $__isr f[0] i(#-1,floor((y+$__pmin*$__min_tile)/$__min_tile),0,0,0)?i:0 else $__isc f[0] i(#-1,floor((x+$__pmin*$__min_tile)/$__min_tile),0,0,0)?i:0 fi k[0]"
m "out2display_alt : skip ${""1=},${""2=},${""3=},${""4=},${""5=} if $__altmode_orientation?$__vmax_y:$__vmax_x sh {s-1} if $__altmode_orientation $__isr f.. i(#-1,floor(y/$__min_tile),0,0,0)?i:i*.625 else $__isc f.. i(#-1,floor(x/$__min_tile),0,0,0)?i:i*.625 fi rm[-2,-1] fi if narg($""1) if $""1 $__bg rv blend alpha fi fi xalp if narg($""2) if $__altmode_orientation $__isr {w#0},{h#0},1,1,i(#-1,floor(y/$__min_tile),0,0,0)?1:0 else $__isc {w#0},{h#0},1,1,i(#-1,floor(x/$__min_tile),0,0,0)?1:0 fi f. ($__altmode_orientation?i(#-2,floor(y/$__min_tile),0,0,0):i(#-2,floor(x/$__min_tile),0,0,0))?!(i&&(j(-2,-2,0,0)&&j(-2,-1,0,0)&&j(-2,0,0,0)&&j(-2,1,0,0)&&j(-2,2,0,0)&&j(-1,-2,0,0)&&j(-1,-1,0,0)&&j(-1,0,0,0)&&j(-1,1,0,0)&&j(-1,2,0,0)&&j(1,-2,0,0)&&j(1,-1,0,0)&&j(1,0,0,0)&&j(1,1,0,0)&&j(1,2,0,0)&&j(2,-2,0,0)&&j(2,-1,0,0)&&j(2,0,0,0)&&j(2,1,0,0)&&j(2,2,0,0)&&j(0,-2,0,0)&&j(0,-1,0,0)&&j(0,1,0,0)&&j(0,2,0,0))) if narg($""3) f. !($__altmode_orientation?i(#-2,floor(x/$__min_tile),0,0,0):i(#-2,floor(y/$__min_tile),0,0,0))?(i?(j(-1,0)||j(0,-1))):i fi rm.. f[0] i(#-1,x,y,z,0)?(xor(i(#-1,x,y,z,0)*$__trackpadcol_alt,i)>128?0:255):i rm. fi if narg($""4)||narg($""5) if $__altsymmetry_mode if $__altmode_orientation {w#0},{$__min_tile},1,{s#0},i(#0,x,$""5+y) {w#0},{$__min_tile},1,{s#0},i(#0,x,$__nh+($__altsymmetry_posy-1)*$__min_tile-$""5+y) f[-2,-1] begin(ww=w-1;hh=h-1;);(x<(2+narg($""3))||x>ww-2)||(y<(2+narg($""3))||y>hh-2)?(xor($__trackpadcol_alt,i)>128?0:255):i j... [-2],0,$""5 j... [-1],0,{h#0+($__altsymmetry_posy-1)*$__min_tile-$""5} else {$__min_tile},{h#0},1,{s#0},i(#0,$""4+x,y) {$__min_tile},{h#0},1,{s#0},i(#0,$__nw+($__altsymmetry_posx-1)*$__min_tile-$""4+x,y) f[-2,-1] begin(ww=w-1;hh=h-1;);(x<(2+narg($""3))||x>ww-2)||(y<(2+narg($""3))||y>hh-2)?(xor($__trackpadcol_alt,i)>128?0:255):i j... [-2],$""4,0 j... [-1],{w#0+($__altsymmetry_posx-1)*$__min_tile-$""4},0 fi rm[-2,-1] else if $__altmode_orientation {w#0},{$__min_tile},1,{s#0},i(#0,x,$""5+y) f. begin(ww=w-1;hh=h-1;);(x<(2+narg($""3))||x>ww-2)||(y<(2+narg($""3))||y>hh-2)?(xor($__trackpadcol_alt,i)>128?0:255):i j.. [-1],0,$""5 else {$__min_tile},{h#0},1,{s#0},i(#0,$""4+x,y) f. begin(ww=w-1;hh=h-1;);(x<(2+narg($""3))||x>ww-2)||(y<(2+narg($""3))||y>hh-2)?(xor($__trackpadcol_alt,i)>128?0:255):i j.. [-1],$""4,0 fi rm. fi fi if narg($""3) f. begin(ww=w-1;hh=h-1;);(x%$__min_tile==0||y%$__min_tile==0)||(x==ww||y==hh)?$""3:i fi"
m "out2display_alt_perp : skip ${""3=},${""4=} if narg($""3) if $""3 $__bg rv blend alpha fi fi xalp if $__altmode_orientation $__isr {w#0},{$__pdiff*$__min_tile},1,1,i(#-1,floor(y/$__min_tile)+$__pmin,0,0,0) f. i?(!(j(-2,-2)&&j(-2,-1)&&j(-2,0)&&j(-2,1)&&j(-2,2)&&j(-1,-2)&&j(-1,-1)&&j(-1,0)&&j(-1,1)&&j(-1,2)&&j(0,-2)&&j(0,-1)&&j(0,1)&&j(0,2)&&j(1,-2)&&j(1,-1)&&j(1,0)&&j(1,1)&&j(1,2)&&j(2,-2)&&j(2,-1)&&j(2,0)&&j(2,1)&&j(2,2))?(xor($__trackpadcol_alt,i(#0,x,$""2+y))>128?0:255):i(#0,x,$""2+y)):i(#0,x,$""2+y); j[0] [-1],0,$""2 else $__isc {$__pdiff*$__min_tile},{h#0},1,{s#0},i(#-1,floor(x/$__min_tile)+$__pmin,0,0,0) f. i?(!(j(-2,-2)&&j(-2,-1)&&j(-2,0)&&j(-2,1)&&j(-2,2)&&j(-1,-2)&&j(-1,-1)&&j(-1,0)&&j(-1,1)&&j(-1,2)&&j(0,-2)&&j(0,-1)&&j(0,1)&&j(0,2)&&j(1,-2)&&j(1,-1)&&j(1,0)&&j(1,1)&&j(1,2)&&j(2,-2)&&j(2,-1)&&j(2,0)&&j(2,1)&&j(2,2))?(xor($__trackpadcol_alt,i(#0,$""1+x,y))>128?0:255):i(#0,$""1+x,y)):i(#0,$""1+x,y); j[0] [-1],$""1,0 fi rm[-2,-1] if narg($""4) f. begin(ww=w-1;hh=h-1;);(x%$__min_tile==0||y%$__min_tile==0)||(x==ww||y==hh)?$""4:i fi"
m "keeperase_rowcolumn : if $__altmode_orientation $__isr if $""1 f.. i(#-1,floor(y/$__min_tile),0,0,0)?i:0 else f.. i(#-1,floor(y/$__min_tile),0,0,0)?0:1 fi else $__isc if $""1 f.. i(#-1,floor(x/$__min_tile),0,0,0)?i:0 else f.. i(#-1,floor(x/$__min_tile),0,0,0)?0:i fi fi rm."
m "shift_rowcolumn : if $__altmode_orientation $__isr f[0] i(#-1,floor(y/$__min_tile),0,0,0)?j(-$""1,0,0,0,0,$__shiftboundary+($__shiftboundary?1)):i else $__isc f[0] i(#-1,floor(x/$__min_tile),0,0,0)?j(0,-$""2,0,0,0,$__shiftboundary+($__shiftboundary?1)):i fi rm."
m "place_rowcolumn : if $__altmode_orientation if $__altplace_replacemode $__isr pass$""1 0 {w#-1},{h#-1},1,1,i(#-2,floor(y/$__min_tile)+$__pmin,0,0,0) j[0] [-2],0,$""3,0,0,1,[-1],1 else pass$""1 0 {w#0},{h#0},1,{s#0},j(#-1,0,-$""3) rm.. if $__altplacebackmode rv fi blend alpha fi else if $__altplace_replacemode $__isc pass$""1 0 {w#-1},{h#-1},1,1,i(#-2,floor(x/$__min_tile)+$__pmin,0,0,0) j[0] [-2],$""2,0,0,0,1,[-1],1 else pass$""1 0 {w#0},{h#0},1,{s#0},j(#-1,-$""2,0) rm.. if $__altplacebackmode rv fi blend alpha fi fi k[0]"
tiler_noniso_message
if $include_background_image
pass$1 0
else
i $1
fi
l.
xr={ceil(w#-1/(abs($4)*$__min_tile))}
yr={ceil(h#-1/(abs($5)*$__min_tile))}
split_tiles. {-abs($4)*$__min_tile},{-abs($5)*$__min_tile}
mw=${-max_w}
mh=${-max_h}
ti={$!}
endl
$__min_tile,$__min_tile,1,4,0
fti={$!}
$__bg
+xalp.
dw0c={w#0}
dh0c={h#0}
dwm0=0
dwm1=0
dwm2=0
d2rw=196
w[-1] {w#0},{h#0},0,"Canvas"
rm[-2,-1]
+xalp[1]
w1[-1] {w#1},{h#1},0,"Tileset" rm.
w2[-1] $d2rw,$d2rw,0,"Tile"
+store. switchmode_tile
fti={$!}
mode=0
icx=0
icy=0
ci=0
lr=0
tb=0
tbc=0
ni=1
cutcopymode=0
erasemode=0
replacemode=0
editmode=0
symmetrymode=0
symmetryaxis=0
symmetrybound=0
symmetry_posx=0
symmetry_posy=0
canvas_background=1
canvas_gridmode=0
canvas_tracker=1
tileset_gridmode=0
select_from_tileset=0
resize_tile_from_tileset=0
resize_tile_from_canvas=0
transform_tile=0
switch_tile_set=0
tile_placement_mode=0
current_csx=-1
current_csy=-1
optinsert=1
#mode=1#
activated_switched_twice=0
modeswitched=0
mainaltmode=1
viewselectionbox=1
selectionboxmode=0
deselectmode=0
activate_deselect_select=0
movemode=0
delmode=0
transfermode=0
rowcolumnshiftmode=0
shiftplacecount=0
__shiftboundary=1
altrcx1=-1
altrcy1=-1
altrcx2=-1
altrcx2=-1
current_acsx=-1
current_acsy=-1
altx=-1
alty=-1
tempaltx=-1
tempalty=-1
activate_altpreview=0
activate_altpass2tile=0
__altsymmetry_mode=0
__altsymmetry_posx=0
__altsymmetry_posy=0
__altmode_orientation=0
__vmax_x=0
__vmax_y=0
pmax=0
__pmin=0
__pdiff=0
place_rowcolumn_mode=0
__altplacebackmode=0
__altplace_replacemode=1
do
main_w_title="Canvas"
if $start
if $mode main_w_title.=" [Row/Column Editing Mode]"
else main_w_title.=" [Main Editing Mode] -" fi
fi
modeswitched=0
if {*,SPACE}" || "{*1,SPACE}" || "{*2,SPACE}" && "$start mode+=1 mode={$mode%2} modeswitched=1 wait 100 fi
if $modeswitched
+store. temp_switch_tile
$switchmode_tile
rv[-2,-1]
rm.
$temp_switch_tile
store. switchmode_tile
if $mode
+out2display. , w2[-1] {w#-1},{h#-1},-1,-1,"Tile" rm.
w1[] 0
else
+out2display. , w2[-1] {$d2rw+($d2rw*$icx)},{$d2rw+($d2rw*$icy)} rm.
+out2display[$ni] , w1[-1] {w#$ni+$dwm1*w#$ni},{h#$ni+$dwm1*h#$ni} rm.
fi
fi
if $start&&$mode
if {*,G} canvas_gridmode+=1 canvas_gridmode={$canvas_gridmode%2} wait 100 activate_altpreview=1 fi
if {*,Q} canvas_background+=1 canvas_background={$canvas_background%2} wait 100 activate_altpreview=1 fi
if {*,A} canvas_tracker+=1 canvas_tracker={$canvas_tracker%2} wait 100 activate_altpreview=1 fi
if {*,S} __altsymmetry_mode+=1 __altsymmetry_mode={$__altsymmetry_mode%2} wait 200 activate_altpreview=1 fi
if {*,E} mainaltmode+=1 mainaltmode={$mainaltmode%2} wait 200 activate_altpreview=1 fi
if {*,V} viewselectionbox+=1 viewselectionbox={$viewselectionbox%2} wait 200 activate_altpreview=1 fi
if $mainaltmode if {*,D} deselectmode+=1 deselectmode={$deselectmode%2} wait 200 activate_altpreview=1 activate_deselect_select=1 fi fi
undo_state=0
if {*,Z} undo_state=1 fi
if $undo_state
+store[0] temp_undo
$undo_image
rv[0,-1]
rm.
activate_altpreview=1
$temp_undo
store. undo_image
fi
if {*,T} rowcolumnshiftmode+=1 rowcolumnshiftmode={$rowcolumnshiftmode%2} wait 200 activate_altpreview=1 if $shiftplacecount shiftplacecount=0 fi fi
if {*,M} __shiftboundary+=1 __shiftboundary={$__shiftboundary%3} wait 200 fi
if {*,W} w[] 1 w2[] 1 fi
if {*2,ARROWLEFT}" || "{*2,ARROWRIGHT} mirror. x transform_tile=1 wait 100
elif {*2,ARROWUP}" || "{*2,ARROWDOWN} mirror. y transform_tile=1 wait 100
fi
if $transform_tile
+out2display. , w2[-1] rm.
transform_tile=0
fi
if !$mainaltmode
if {*,B} __altplace_replacemode+=1 __altplace_replacemode={$__altplace_replacemode%2} wait 200 fi
if !$__altplace_replacemode&&{*,F} __altplacebackmode+=1 __altplacebackmode={$__altplacebackmode%2} wait 200 fi
fi
if {*,R}
if $__altmode_orientation
$__isr f. 0 store. __isr __vmax_y=0
else
$__isc f. 0 store. __isc __vmax_x=0
fi
activate_altpreview=1
fi
if $mainaltmode&&!$rowcolumnshiftmode
if $__altsymmetry_mode
if $__altmode_orientation
if {*,ARROWUP} __altsymmetry_posy-=1 __altsymmetry_posy={max(-$tth,$__altsymmetry_posy)} activate_altpreview=1 wait 200 fi
if {*,ARROWDOWN} __altsymmetry_posy+=1 __altsymmetry_posy={min($tth,$__altsymmetry_posy)} activate_altpreview=1 wait 200 fi
if {*,ARROWLEFT}||{*,ARROWRIGHT} __altmode_orientation=0 activate_altpreview=1 wait 200 fi
if {*,J} __altsymmetry_posy=0 activate_altpreview=1 wait 200 fi
else
if {*,ARROWLEFT} __altsymmetry_posx-=1 __altsymmetry_posx={max(-$ttw,$__altsymmetry_posx)} activate_altpreview=1 wait 200 fi
if {*,ARROWRIGHT} __altsymmetry_posx+=1 __altsymmetry_posx={min($ttw,$__altsymmetry_posx)} activate_altpreview=1 wait 200 fi
if {*,ARROWUP}||{*,ARROWDOWN} __altmode_orientation=1 activate_altpreview=1 wait 200 fi
if {*,J} __altsymmetry_posx=0 activate_altpreview=1 wait 200 fi
fi
else
if {*,ARROWLEFT}||{*,ARROWRIGHT}||{*,ARROWUP}||{*,ARROWDOWN} __altmode_orientation+=1 __altmode_orientation={$__altmode_orientation%2} activate_altpreview=1 wait 200 fi
fi
elif $mainaltmode&&$rowcolumnshiftmode
if {*,ARROWLEFT}||{*,ARROWRIGHT} __altmode_orientation+=1 __altmode_orientation={$__altmode_orientation%2} activate_altpreview=1 wait 200 fi
fi
if $mainaltmode&&!$rowcolumnshiftmode
if $deselectmode main_w_title.=" - [Deselection]"
else main_w_title.=" - [Selection]"
fi
elif $mainaltmode&&$rowcolumnshiftmode
main_w_title.=" - [Shift] (Boundary Condition - "
if $__shiftboundary==0 main_w_title.="None)"
elif $__shiftboundary==1 main_w_title.="Periodic)"
else main_w_title.="Mirror)"
fi
else
main_w_title.=" - [Place] "
if $__altplace_replacemode
main_w_title.="(Replacement Mode)"
else
if $__altplacebackmode main_w_title.="(Background)"
else main_w_title.="(Foreground)"
fi
fi
fi
if $viewselectionbox&&$canvas_gridmode
canvas_set=$canvas_background,$viewselectionbox,$gridcol,
elif $viewselectionbox
canvas_set=$canvas_background,$viewselectionbox,,
elif $canvas_gridmode
canvas_set=$canvas_background,,$gridcol,
fi
x,y,b,ww,wh={*,x,y,b,w,h}
if $b" && "$x>=0" && "$y>=0" && "$x<w#0" && "$y<h#0" && "!{*,G}
acsx={floor($x/$__min_tile)} acsy={floor($y/$__min_tile)}
if $mainaltmode&&!$rowcolumnshiftmode
if ($__altmode_orientation?(($current_acsy!=$acsy)||$__vmax_y==0):(($current_acsx!=$acsx)||$__vmax_x==0))||$activate_deselect_select
if !$deselectmode
if !$__altmode_orientation
$__isc
f. x==$acsx?1:i
if $__altsymmetry_mode f. begin(ww=w-1;ww+=$__altsymmetry_posx;);x==(ww-$acsx)?1:i; fi
__vmax_x={iM#-1}
__pmin={find([crop(#-1)],1,0,1)}
pmax={find([crop(#-1)],1,$iscl,-1)}
__pdiff={$pmax-$__pmin+1}
store. __isc
else
$__isr
f. x==$acsy?1:i
if $__altsymmetry_mode f. begin(ww=w-1;ww+=$__altsymmetry_posy;);x==(ww-$acsy)?1:i; fi
__vmax_y={iM#-1}
__pmin={find([crop(#-1)],1,0,1)}
pmax={find([crop(#-1)],1,$isrl,-1)}
__pdiff={$pmax-$__pmin+1}
store. __isr
fi
else
if !$__altmode_orientation
$__isc
f. x==$acsx?0:i
if $__altsymmetry_mode f. begin(ww=w-1;ww+=$__altsymmetry_posx;);x==(ww-$acsx)?0:i; fi
__vmax_x={iM#-1}
__pmin={find([crop(#-1)],1,0,1)}
pmax={find([crop(#-1)],1,$iscl,-1)}
__pdiff={$pmax-$__pmin+1}
store. __isc
else
$__isr
f. x==$acsy?0:i
if $__altsymmetry_mode f. begin(ww=w-1;ww+=$__altsymmetry_posy;);x==(ww-$acsy)?0:i; fi
__vmax_y={iM#-1}
__pmin={find([crop(#-1)],1,0,1)}
pmax={find([crop(#-1)],1,$isrl,-1)}
__pdiff={$pmax-$__pmin+1}
store. __isr
fi
fi
activate_altpreview=1
activate_altpass2tile=1
fi
elif $mainaltmode&&$rowcolumnshiftmode
if $shiftplacecount==0
altrcx1={$acsx*$__min_tile}
altrcy1={$acsy*$__min_tile}
activate_altpreview=1
shiftplacecount+=1
elif $shiftplacecount==1
altrcx2={$acsx*$__min_tile}
altrcy2={$acsy*$__min_tile}
activate_altpreview=1
shift_rowcolumn[0] {$altrcx2-$altrcx1},{$altrcy2-$altrcy1}
if $__altmode_orientation
if abs($altrcy2-$altrcy1)
+store[0] undo_image
fi
else
if abs($altrcx2-$altrcx1)
+store[0] undo_image
fi
fi
shiftplacecount=0
fi
wait 100
else
place_rowcolumn[0] [-1],{min($acsx,$isw-$__pdiff)*$__min_tile},{min($acsy,$ish-$__pdiff)*$__min_tile}
+store[0] undo_image
fi
current_acsx=$acsx current_acsy=$acsy
fi
if $__altmode_orientation?$__vmax_y>0:$__vmax_x>0
if $activate_altpass2tile
if !$__altmode_orientation
r. {$__pdiff*$__min_tile},{h#0}
pass2tile. [0],{$__pmin*$__min_tile},0
else
r. {w#0},{$__pdiff*$__min_tile}
pass2tile. [0],0,{$__pmin*$__min_tile}
fi
filter_to_selected_row_column.
+out2display. , w2[-1] {w#-1},{h#-1},-1,-1,"Tile" rm.
fi
activate_altpass2tile=0
if {*,K}||{*,C} keeperase_rowcolumn[0] 1 wait 200 activate_altpreview=1 fi
if {*,X} keeperase_rowcolumn[0] 0 wait 200 activate_altpreview=1 fi
else
r. 1,1
f. 0
+out2display. , w2[-1] {$d2rw},{$d2rw},-1,-1,"Tile" rm.
mainaltmode=1
rowcolumnshiftmode=0
deselectmode=0
fi
if $mainaltmode
if !$rowcolumnshiftmode
if {$x>=0" && "$y>=0" && "$x<w#0" && "$y<h#0" && "$canvas_tracker}" && "($canvas_tracker||$activate_altpreview)
altx={floor($x/$__min_tile)*$__min_tile} alty={floor($y/$__min_tile)*$__min_tile}
if ($__altmode_orientation?($alty!=$tempalty):($altx!=$tempaltx))||$activate_altpreview
canvas_set.=$altx,$alty
+out2display_alt[0] $canvas_set if $__altsymmetry_mode addsym2display. $__altmode_orientation,$__min_tile,$__altsymmetry_posx,$__altsymmetry_posy fi w[-1] {w#0},{h#0},0,$main_w_title rm.
fi
tempaltx=$altx tempalty=$alty
else
+out2display_alt[0] $canvas_set if $__altsymmetry_mode addsym2display. $__altmode_orientation,$__min_tile,$__altsymmetry_posx,$__altsymmetry_posy fi w[-1] {w#0},{h#0},0,$main_w_title rm.
fi
activate_altpreview=0
else
if $x>=0" && "$y>=0" && "$x<w#0" && "$y<h#0
if $activate_altpreview
altx={floor($x/$__min_tile)*$__min_tile} alty={floor($y/$__min_tile)*$__min_tile}
if $shiftplacecount
if !$__altmode_orientation?($alty!=$tempalty):($altx!=$tempaltx)
+shift_rowcolumn[0] {$altx-$altrcx1},{$alty-$altrcy1}
out2display_alt. $canvas_set
w[-1] {w#0},{h#0},0,$main_w_title rm.
fi
tempaltx=$altx tempalty=$alty
else
+out2display_alt[0] $canvas_set
w[-1] {w#0},{h#0},0,$main_w_title rm.
activate_altpreview=0
fi
fi
fi
fi
else
if $canvas_gridmode
perp_end=$canvas_background,$gridcol
else
perp_end=$canvas_background
fi
if $x>=0" && "$y>=0" && "$x<w#0" && "$y<h#0
altx={min(floor($x/$__min_tile),$isw-$__pdiff)*$__min_tile} alty={min(floor($y/$__min_tile),$ish-$__pdiff)*$__min_tile}
if $__altmode_orientation?($alty!=$tempalty):($altx!=$tempaltx)
+out2display_alt_perp[0] $altx,$alty,$perp_end w[-1] {w#0},{h#0},0,$main_w_title rm.
fi
tempaltx=$altx tempalty=$alty
fi
fi
else
if {*,G} canvas_gridmode+=1 canvas_gridmode={$canvas_gridmode%2} fi
if {*,Q} canvas_background+=1 canvas_background={$canvas_background%2} fi
if {*,A} canvas_tracker+=1 canvas_tracker={$canvas_tracker%2} fi
undo_state=0
canvas_set=""
if {*,W}" || "{*1,W}" || "{*2,W} w[] w1[] w2[] fi
if {*,Z} undo_state=1 fi
if {*,F} tile_placement_mode+=1 tile_placement_mode={$tile_placement_mode%2} fi
if {*,R}" || "{*1,R}" || "{*2,R}
replacemode+=1 replacemode={$replacemode%2} optinsert=1
fi
if {*,S} symmetrymode+=1 symmetrymode={$symmetrymode%2} optinsert=1 fi
if $symmetrymode
if {*,B} symmetryaxis+=1 symmetryaxis={$symmetryaxis%4} wait 200 fi
if {*,M} symmetrybound+=1 symmetrybound={$symmetrybound%2} wait 200 fi
if {*,J} symmetry_posx=0 symmetry_posy=0 wait 200 fi
if {*,ARROWLEFT} symmetry_posx-=1 wait 200 fi
if {*,ARROWRIGHT} symmetry_posx+=1 wait 200 fi
if {*,ARROWUP} symmetry_posy-=1 wait 200 fi
if {*,ARROWDOWN} symmetry_posy+=1 wait 200 fi
symmetry_posx={$symmetry_posx>=0?min($ttw,$symmetry_posx):max(-$ttw,$symmetry_posx)}
symmetry_posy={$symmetry_posy>=0?min($tth,$symmetry_posy):max(-$tth,$symmetry_posy)}
fi
if $canvas_gridmode
if $canvas_tracker canvas_endset=,$trackpadcol,$gridcol,
else canvas_endset=,,$gridcol,
fi
else
if $canvas_tracker canvas_endset=,$trackpadcol,
else canvas_endset=",,"
fi
fi
if {*,C}" || "{*,X}
if {*,X} cutcopymode=1
else cutcopymode=2
fi
fi
if {*,D}" || "{*1,D}" || "{*2,D}
erasemode+=1
erasemode={$erasemode%2}
if $erasemode +f. 0 w2[-1] {$d2rw+($d2rw*$icx)},{$d2rw+($d2rw*$icy)} rm.
else +out2display. , w2[-1] {$d2rw+($d2rw*$icx)},{$d2rw+($d2rw*$icy)} rm.
fi
optinsert=1
fi
x,y,b,ww,wh={*,x,y,b,w,h}
x1,y1,b1,ww1,wh1={*1,x,y,b,w,h}
x2,y2,b2,ww2,wh2={*2,x,y,b,w,h}
if $start
if $undo_state
+store[0] temp_undo
$undo_image
rv[0,-1]
rm.
$temp_undo
store. undo_image
fi
if {{*2,CTRLLEFT}" || "{*2,CTRLRIGHT}}" && "{{*2,ARROWLEFT}" || "{*2,ARROWRIGHT}}
mirror. x transform_tile=1
wait 100
elif {{*2,CTRLLEFT}" || "{*2,CTRLRIGHT}}" && "{{*2,ARROWUP}" || "{*2,ARROWDOWN}}
mirror. y transform_tile=1
wait 100
elif {*2,ARROWLEFT}||{*2,ARROWRIGHT}
temp_tile_width=$tile_width
temp_tile_height=$tile_height
temp_icx=$icx
temp_icy=$icy
icx=$temp_icy
icy=$temp_icx
tile_width=$temp_tile_height
tile_height=$temp_tile_width
if {*2,ARROWRIGHT} rotate. 90 else rotate. -90 fi
transform_tile=1
wait 100
fi
if $transform_tile
+out2display. , w2[-1] {$d2rw+($d2rw*$icx)},{$d2rw+($d2rw*$icy)} rm.
transform_tile=0
optinsert=1
fi
if {{{*1,CTRLLEFT}" || "{*1,CTRLRIGHT}}" && "{*1,ARROWRIGHT}}
if $select_from_tileset
icx+=1
icx={min($icx,$max_increment)}
tile_width={$__min_tile+($icx*$__min_tile)}
fi
if $select_from_tileset resize_tile_from_tileset=1 fi
wait 500
elif {{{*1,CTRLLEFT}" || "{*1,CTRLRIGHT}}" && "{*1,ARROWLEFT}}
if $select_from_tileset
icx-=1
icx={max($icx,0)}
tile_width={$__min_tile+($icx*$__min_tile)}
fi
if $select_from_tileset resize_tile_from_tileset=1 fi
wait 500
elif {{{*1,CTRLLEFT}" || "{*1,CTRLRIGHT}}" && "{*1,ARROWDOWN}}
if $select_from_tileset
icy+=1
icy={min($icy,$max_increment)}
tile_height={$__min_tile+($icy*$__min_tile)}
fi
if $select_from_tileset resize_tile_from_tileset=1 fi
wait 500
elif {{{*1,CTRLLEFT}" || "{*1,CTRLRIGHT}}" && "{*1,ARROWUP}}
if $select_from_tileset
icy-=1
icy={max($icy,0)}
tile_height={$__min_tile+($icy*$__min_tile)}
fi
if $select_from_tileset resize_tile_from_tileset=1 fi
wait 500
elif {*1,ARROWRIGHT}
select_from_tileset=0
lr+=1
lr={$lr%$xr}
ci={($lr+$tb)%$ti}
ni={$ci+1}
switch_tile_set=1
wait 625
elif {*1,ARROWLEFT}
select_from_tileset=0
lr-=1
lr={$lr%$xr}
ci={($lr+$tb)%$ti}
ni={$ci+1}
switch_tile_set=1
wait 625
elif {*1,ARROWDOWN}
select_from_tileset=0
tbc+=1
tbc={$tbc%$yr}
tb={$tbc*$xr}
ci={($lr+$tb)%$ti}
ni={$ci+1}
switch_tile_set=1
wait 625
elif {*1,ARROWUP}
select_from_tileset=0
tbc-=1
tbc={$tbc%$yr}
tb={$tbc*$xr}
ci={($lr+$tb)%$ti}
ni={$ci+1}
switch_tile_set=1
wait 625
fi
if $switch_tile_set
+out2display[$ni] , w1[-1] {w#$ni+$dwm1*w#$ni},{h#$ni+$dwm1*h#$ni} rm.
switch_tile_set=0
fi
if $resize_tile_from_tileset
r. $tile_width,$tile_height,100%,100%,0
pass2tile. [$ni],$tsx,$tsy
+out2display. , w2[-1] {$d2rw+($d2rw*$icx)},{$d2rw+($d2rw*$icy)} rm.
if $tileset_gridmode
+out2display[$ni] 0,$tsx,$tsy,$tile_width,$tile_height,$trackpadcol,$gridcol
else
+out2display[$ni] 0,$tsx,$tsy,$tile_width,$tile_height,$trackpadcol
fi
w1[-1] rm.
resize_tile_from_tileset=0
fi
if $b" && "$x>=0" && "$y>=0" && "$x<w#0" && "$y<h#0
csx={floor($x/$__min_tile)*$__min_tile} csy={floor($y/$__min_tile)*$__min_tile}
if !$cutcopymode&&!$erasemode
if (($current_csx!=$csx)||($current_csy!=$csy))||$optinsert
+store[0] undo_image
if $replacemode
if $symmetrymode
tile2canvas_r_sym[0,-1] $csx,$csy,$tile_width,$tile_height,$symmetrybound,$symmetryaxis,$symmetry_posx,$symmetry_posy
else
tile2canvas_r[0,-1] $csx,$csy,$tile_placement_mode
fi
else
if $symmetrymode
tile2canvas_sym[0] [-1],$csx,$csy,$tile_width,$tile_height,$tile_placement_mode,$symmetrybound,$symmetryaxis,$symmetry_posx,$symmetry_posy
else
tile2canvas[0] [-1],$csx,$csy,$tile_placement_mode
fi
fi
fi
optinsert=0
elif $cutcopymode&&!$erasemode
if $cutcopymode==1
+store[0] undo_image
pass2tile. [0],$cx,$cy {w#-1},{h#-1},1,{s#-1} j[0] [-1],$cx,$cy rm.
else
pass2tile. [0],$csx,$csy optinsert=0
fi
+out2display. , w2[-1] {$d2rw+($d2rw*$icx)},{$d2rw+($d2rw*$icy)} rm.
cutcopymode=0
optinsert=1
else
+store[0] undo_image
cutcopymode=0
if (($current_csx!=$csx)||($current_csy!=$csy))||$optinsert
if $symmetrymode
$tile_width,$tile_height,1,{s#0}
j[0] [-1],$csx,$csy
if $symmetryaxis==3||$symmetryaxis==0 j[0] [-1],{$__nw+($__min_tile*$symmetry_posx)-$tile_width-$csx},$csy fi
if $symmetryaxis==3||$symmetryaxis==1 j[0] [-1],$csx,{$__nh+($__min_tile*$symmetry_posy)-$tile_height-$csy} fi
if $symmetryaxis==3||$symmetryaxis==2 j[0] [-1],{$__nw+($__min_tile*$symmetry_posx)-$tile_width-$csx},{$__nh+($__min_tile*$symmetry_posy)-$tile_height-$csy} fi
rm.
else
$tile_width,$tile_height,1,{s#0} j[0] [-1],$csx,$csy rm.
fi
fi
fi
current_csx=$csx current_csy=$csy
fi
fi
if $b1" && "$x1>=0" && "$y1>=0" && "$x1<w#1" && "$y1<h#1
cutcopymode=0
start=1
optinsert=1
select_from_tileset=1
erasemode=0
tsx={floor($x1/$__min_tile)*$__min_tile} tsy={floor($y1/$__min_tile)*$__min_tile}
pass2tile. [$ni],$tsx,$tsy
+out2display. , w2[-1] rm.
if $tileset_gridmode
+out2display[$ni] 0,$tsx,$tsy,$tile_width,$tile_height,$trackpadcol,$gridcol
else
+out2display[$ni] 0,$tsx,$tsy,$tile_width,$tile_height,$trackpadcol
fi
w1[-1] rm.
wait 50
fi
if !$start
if $canvas_gridmode
+out2display[0] $canvas_background,0,0,1,1,,$gridcol
else
+out2display[0] $canvas_background
fi
if $symmetrymode addsym2display. $symmetryaxis,$__min_tile,$symmetry_posx,$symmetry_posy fi
w[-1] rm.
else
if $x>=0" && "$y>=0" && "$x<w#0" && "$y<h#0
cx={floor($x/$__min_tile)*$__min_tile} cy={floor($y/$__min_tile)*$__min_tile}
canvas_set=$canvas_background,$cx,$cy,$tile_width,$tile_height
canvas_set.=$canvas_endset
if $symmetrymode
if $canvas_gridmode canvas_set.=$symmetryaxis,$symmetry_posx,$symmetry_posy
else canvas_set.=,$symmetryaxis,$symmetry_posx,$symmetry_posy
fi
fi
+out2display[0] $canvas_set
if $symmetrymode addsym2display. $symmetryaxis,$__min_tile,$symmetry_posx,$symmetry_posy fi
w[-1]
rm.
else
if $canvas_gridmode
+out2display[0] $canvas_background,0,0,1,1,,$gridcol
else
+out2display[0] $canvas_background
fi
if $symmetrymode addsym2display. $symmetryaxis,$__min_tile,$symmetry_posx,$symmetry_posy fi
w[-1] rm.
fi
fi
if $start
if $erasemode main_w_title.=" (Eraser Mode) - "
else
if $cutcopymode
if $cutcopymode==2 main_w_title.=" (Copy Mode) - "
else main_w_title.=" (Cut Mode) - "
fi
else
if $replacemode main_w_title.=" (Replacement Mode) - "
else
if $tile_placement_mode main_w_title.=" (Place Tile [Background]) - "
else main_w_title.=" (Place Tile [Foreground]) - "
fi
fi
fi
fi
if $canvas_tracker main_w_title.="(Tracker)" fi
if $canvas_gridmode main_w_title.="(Grid)" fi
if $symmetrymode
if $symmetryaxis==0
if $symmetrybound main_w_title.="(Symmetry-X (Mirror))"
else main_w_title.="(Symmetry-X (Periodic))"
fi
elif $symmetryaxis==1
if $symmetrybound main_w_title.="(Symmetry-Y (Mirror))"
else main_w_title.="(Symmetry-Y (Periodic))"
fi
elif $symmetryaxis==2
if $symmetrybound main_w_title.="(Symmetry-XY (Corner) (Mirror))"
else main_w_title.="(Symmetry-XY (Corner)(Periodic))"
fi
else
if $symmetrybound main_w_title.="(Symmetry-XY (Reflected) (Mirror))"
else main_w_title.="(Symmetry-XY (Reflected) (Periodic))"
fi
fi
fi
fi
w[] -1,-1,-1,-1,$main_w_title
fi
wait 100
while {*}" && "!{*,ESC}
uncommand xalp,xalpa,out2display,pass2tile,tile2canvas,tile2canvas_r,tile2canvas_sym,tile2canvas_r_sym,addsym2display,filter_to_selected_row_column,out2display_alt,out2display_alt_perp,keeperase_rowcolumn,shift_rowcolumn,place_rowcolumn,tiler_noniso_message
w1[] 0
w2[] 0
k[0]
if $7 $obg rv blend alpha fi
__rep_tiler_nonisometric_instructions:
e[] "\n Instruction on how to work with interactive windows.\n
\ ---------------------------------------------------------\n\n
\ MAIN EDITING MODE\n\n
\ - On any window - \n
\ * D: Switch between Place/Eraser Mode\n
\ * R: Activate Replace Mode\n
\ * W: Restore All Windows\n
\ * SPACEBAR: Switch Mode\n\n
\ - On Canvas window - \n
\ * C: Activate Copy Mode On/Off\n
\ * X: Activate Cut Mode On/Off\n
\ * Z: Undo Canvas Changes\n
\ * F: Activate/Deactivate Background Tile Layering Mode\n
\ * G: Activate Canvas Grid Mode On/Off\n
\ * Q: Remove/Restore Background\n
\ * A: Enable/Disable Tracker\n
\ * S: Activate Symmetry Mode\n\n
\ -- On Canvas [Symmetry Mode] --\n
\ * B: Switch Axis in Symmetry Mode\n
\ * M: Switch between Periodic/Mirror mode in Symmetry Mode\n
\ * J: Symmetry Line to Center\n
\ * ARROWKEY: Move Symmetry Line\n\n
\ - On Tileset window - \n
\ * CTRL+ARROWKEY: Resize Tile Selection Box\n
\ * ARROWKEY: Scroll through tileset\n\n
\ - On Tile window - \n
\ * CTRL+ARROWKEY: Mirror alongside axis\n
\ * ARROWKEY: Rotate Tile\n
\ * MOUSE BUTTON: Switch between Place/Eraser Mode\n\n
\ ROW/COLUMN EDITING MODE\n\n
\ - On any window - \n
\ * W: Restore All Windows\n
\ * SPACEBAR: Switch Mode\n\n
\ - On Canvas window - \n
\ * Z: Undo Canvas Changes\n
\ * T: Enable Row/Column Shifting\n
\ * E: Activate Row/Column Perpendicular Place Mode\n
\ * V: View Selection Box\n
\ * G: Activate Canvas Grid Mode On/Off\n
\ * Q: Remove/Restore Background\n
\ * A: Enable/Disable Tracker\n
\ * S: Activate Symmetry Mode (Works only on Selection Mode)\n\n
\ -- On Canvas [Selection Mode] --\n
\ * C: Keep Selected Row/Column\n
\ * X: Delete Selected Row/Column\n
\ * D: Select/Deselect Row/Column\n
\ * R: Clear Selection\n
\ * Mouse Button: Select or Deselect\n
\ * ARROWKEY: Switch between row/column manipulation mode\n\n
\ -- On Canvas [Selection Mode](Symmetry Mode)--\n
\ * J: Symmetry Line to Center\n
\ * ARROWKEY: Switch between row/column manipulation mode or move symmetry line\n\n
\ -- On Canvas [Row/Column Shifting Mode] --\n
\ * Mouse Button (First Click): Activate Shifting\n
\ * Mouse Button (Second Click): Finalize Shifting\n
\ * ARROWKEY: Switch between row/column manipulation\n\n
\ -- On Canvas [Place Mode] --\n
\ * B: Switch between Replacement/Placement Mode\n
\ * F: In Placement Mode, switch between background/foreground placement mode\n
\ * Mouse Button: Place Row/Column\n\n
\ - On Tile window - \n
\ * ARROWKEY: Flip Row/Column\n
\ ---------------------------------------------------------\n"
Where do you want to echo?
You mean you want to cut and paste too?