Working on a Tile Placing tool for G'MIC-QT

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. :wink:

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.

5 Likes

What fun. Reminds me of Harvest Moon. :sunny: Has 2-3 missing edges though. :stuck_out_tongue:

1 Like

Looks great!

1 Like

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

Game examples here: list of games on esplge.

@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.

2020-04-18-194015_269x95_scrot

Platform Also

1 Like

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?