# Symmetrifier # How to use: Paste script into console script file, run (not just once), then press one of the keys shown in the list below to perform the the described symmetry/map transform operation # NOTE: Units are not affected by any of the below functions # NOTE: On maps with odd-numbered side lengths, a 1-wide strip of terrain in the middle is unaffected # NOTE: Script uses above-keyboard number keys and left-hand modifier keys (left alt, left shift and left control) # ================================= # |1| = Left to Right Reflectional # |2| = Right to Left Reflectional # |3| = Bottom to Top Reflectional # |4| = Top to Bottom Reflectional # |5| = Bottom Left to Top Right Diagonal Reflectional (Requires Square Map) # |6| = Top Right to Bottom Left Diagonal Reflectional (Requires Square Map) # |7| = Bottom Right to Top Left Diagonal Reflectional (Requires Square Map) # |8| = Top left to Bottom Right Diagonal Reflectional (Requires Square Map) # |9| = Bottom Left Quadrilateral Reflectional # |0| = Bottom Right Quadrilateral Reflectional # |Shift+1| = Top Left Quadrilateral Reflectional # |Shift+2| = Top Right Quadrilateral Reflectional # ============================================= # |Shift+3| = Left Half Rotational # |Shift+4| = Right Half Rotational # |Shift+5| = Top Half Rotational # |Shift+6| = Bottom Half Rotational # |Shift+7| = Bottom Left Half Diagonal Rotational # |Shift+8| = Bottom Right Half Diagonal Rotational # |Shift+9| = Top Left Half Diagonal Rotational # |Shift+0| = Top Right Half Diagonal Rotational # |Alt+1| = Bottom Left Quarter Rotational (Requires Square Map) # |Alt+2| = Bottom Right Quarter Rotational (Requires Square Map) # |Alt+3| = Top Left Quarter Rotational (Requires Square Map) # |Alt+4| = Top Right Quarter Rotational (Requires Square Map) # |Alt+5| = Left Quarter Rotational (Requires Square Map) # |Alt+6| = Right Quarter Rotational (Requires Square Map) # |Alt+7| = Top Quarter Rotational (Requires Square Map) # |Alt+8| = Bottom Quarter Rotational (Requires Square Map) # ==================================== # |Ctrl+1| = Rotate Map 90 Clockwise (Requires Square Map) # |Ctrl+2| = Rotate Map 90 Counterclockwise (Requires Square Map) # |Ctrl+3| = Rotate Map 180 # |Ctrl+4| = Flip Map Left to Right # |Ctrl+5| = Flip Map Top to Bottom # |Ctrl+6| = Flip Map Bottom Left to Top Right Diagonal (Requires Square Map) # |Ctrl+7| = Flip Map Bottom Right to Top Left Diagonal (Requires Square Map) # ============================================= # |Ctrl+Arrow Key| = Scroll Map 1 tile in direction # |Shift+Arrow Key| = Scroll Map 10 tiles in direction once GetMapSize ->mapHeight ->mapWidth if(<-mapWidth 2 mod neq0) <-mapWidth 1 sub 2 div ->halfWidth else <-mapWidth 2 div ->halfWidth endif if(<-mapHeight 2 mod neq0) <-mapHeight 1 sub 2 div ->halfHeight else <-mapHeight 2 div ->halfHeight endif if(<-mapHeight <-mapWidth eq) true ->squareMap else false ->squareMap endif CreateListStartingSize(<-mapHeight <-mapWidth mul) ->terrainBuffer #Only used in flipping/rotating/scrolling map CreateListStartingSize(<-mapHeight <-mapWidth mul) ->specialBuffer #Ditto endonce if(GetKey("LeftShift" true)) if(GetKeyDown("Alpha1" true)) EditAddUndo(0) @TopLeftQuadrilateral endif if(GetKeyDown("Alpha2" true)) EditAddUndo(0) @TopRightQuadrilateral endif if(GetKeyDown("Alpha3" true)) EditAddUndo(0) @LeftHalfRotational endif if(GetKeyDown("Alpha4" true)) EditAddUndo(0) @RightHalfRotational endif if(GetKeyDown("Alpha5" true)) EditAddUndo(0) @TopHalfRotational endif if(GetKeyDown("Alpha6" true)) EditAddUndo(0) @BottomHalfRotational endif if(GetKeyDown("Alpha7" true)) EditAddUndo(0) @BottomLeftHalfRotational endif if(GetKeyDown("Alpha8" true)) EditAddUndo(0) @BottomRightHalfRotational endif if(GetKeyDown("Alpha9" true)) EditAddUndo(0) @TopLeftHalfRotational endif if(GetKeyDown("Alpha0" true)) EditAddUndo(0) @TopRightHalfRotational endif if(GetKeyDown("LeftArrow" true)) EditAddUndo(0) 10 ->scr @ScrollMapLeft endif if(GetKeyDown("RightArrow" true)) EditAddUndo(0) 10 ->scr @ScrollMapRight endif if(GetKeyDown("UpArrow" true)) EditAddUndo(0) 10 ->scr @ScrollMapUp endif if(GetKeyDown("DownArrow" true)) EditAddUndo(0) 10 ->scr @ScrollMapDown endif else if(GetKey("LeftAlt" true)) if(GetKeyDown("Alpha1" true) true eq <-squareMap true eq and) EditAddUndo(0) @BottomLeftQuarterRotational endif if(GetKeyDown("Alpha2" true) true eq <-squareMap true eq and) EditAddUndo(0) @BottomRightQuarterRotational endif if(GetKeyDown("Alpha3" true) true eq <-squareMap true eq and) EditAddUndo(0) @TopLeftQuarterRotational endif if(GetKeyDown("Alpha4" true) true eq <-squareMap true eq and) EditAddUndo(0) @TopRightQuarterRotational endif if(GetKeyDown("Alpha5" true) true eq <-squareMap true eq and) EditAddUndo(0) @LeftQuarterRotational endif if(GetKeyDown("Alpha6" true) true eq <-squareMap true eq and) EditAddUndo(0) @RightQuarterRotational endif if(GetKeyDown("Alpha7" true) true eq <-squareMap true eq and) EditAddUndo(0) @TopQuarterRotational endif if(GetKeyDown("Alpha8" true) true eq <-squareMap true eq and) EditAddUndo(0) @BottomQuarterRotational endif else if(GetKey("LeftControl" true)) if(GetKeyDown("Alpha1" true) true eq <-squareMap true eq and) EditAddUndo(0) @Rotate90Clockwise endif if(GetKeyDown("Alpha2" true) true eq <-squareMap true eq and) EditAddUndo(0) @Rotate90Counterclockwise endif if(GetKeyDown("Alpha3" true)) EditAddUndo(0) @Rotate180 endif if(GetKeyDown("Alpha4" true)) EditAddUndo(0) @FlipLeftToRight endif if(GetKeyDown("Alpha5" true)) EditAddUndo(0) @FlipTopToBottom endif if(GetKeyDown("Alpha6" true) true eq <-squareMap true eq and) EditAddUndo(0) @FlipBottomLeftToTopRight endif if(GetKeyDown("Alpha7" true) true eq <-squareMap true eq and) EditAddUndo(0) @FlipBottomRightToTopLeft endif if(GetKeyDown("LeftArrow" true)) EditAddUndo(0) 1 ->scr @ScrollMapLeft endif if(GetKeyDown("RightArrow" true)) EditAddUndo(0) 1 ->scr @ScrollMapRight endif if(GetKeyDown("UpArrow" true)) EditAddUndo(0) 1 ->scr @ScrollMapUp endif if(GetKeyDown("DownArrow" true)) EditAddUndo(0) 1 ->scr @ScrollMapDown endif else if(GetKeyDown("Alpha1" true)) EditAddUndo(0) @LeftToRight endif if(GetKeyDown("Alpha2" true)) EditAddUndo(0) @RightToLeft endif if(GetKeyDown("Alpha3" true)) EditAddUndo(0) @BottomToTop endif if(GetKeyDown("Alpha4" true)) EditAddUndo(0) @TopToBottom endif if(GetKeyDown("Alpha5" true) true eq <-squareMap true eq and) EditAddUndo(0) @BottomLeftToTopRight endif if(GetKeyDown("Alpha6" true) true eq <-squareMap true eq and) EditAddUndo(0) @TopRightToBottomLeft endif if(GetKeyDown("Alpha7" true) true eq <-squareMap true eq and) EditAddUndo(0) @BottomRightToTopLeft endif if(GetKeyDown("Alpha8" true) true eq <-squareMap true eq and) EditAddUndo(0) @TopLeftToBottomRight endif if(GetKeyDown("Alpha9" true)) EditAddUndo(0) @BottomLeftQuadrilateral endif if(GetKeyDown("Alpha0" true)) EditAddUndo(0) @BottomRightQuadrilateral endif endif endif endif :LeftToRight ######################################################################################### do(<-mapHeight 0) do(<-halfWidth 0) SetTerrain(<-mapWidth 1 sub I sub J GetTerrain(I J)) SetTerrainSpecial(<-mapWidth 1 sub I sub J GetTerrainSpecial(I J)) loop loop :RightToLeft ######################################################################################### do(<-mapHeight 0) do(<-halfWidth 0) SetTerrain(I J GetTerrain(<-mapWidth 1 sub I sub J)) SetTerrainSpecial(I J GetTerrainSpecial(<-mapWidth 1 sub I sub J)) loop loop :BottomToTop ######################################################################################### do(<-halfHeight 0) do(<-mapWidth 0) SetTerrain(I <-mapHeight 1 sub J sub GetTerrain(I J)) SetTerrainSpecial(I <-mapheight 1 sub J sub GetTerrainSpecial(I J)) loop loop :TopToBottom ######################################################################################### do(<-halfHeight 0) do(<-mapWidth 0) SetTerrain(I J GetTerrain(I <-mapHeight 1 sub J sub)) SetTerrainSpecial(I J GetTerrainSpecial(I <-mapheight 1 sub J sub)) loop loop :BottomLeftToTopRight ################################################################################ do(<-mapHeight 0) do(<-mapWidth 0) if(I J add <-mapWidth lte) SetTerrain(<-mapWidth 1 sub J sub <-mapHeight 1 sub I sub GetTerrain(I J)) SetTerrainSpecial(<-mapWidth 1 sub J sub <-mapHeight 1 sub I sub GetTerrainSpecial(I J)) endif loop loop :TopRightToBottomLeft ################################################################################ do(<-mapHeight 0) do(<-mapWidth 0) if(I J add <-mapWidth lte) SetTerrain(I J GetTerrain(<-mapWidth 1 sub J sub <-mapHeight 1 sub I sub)) SetTerrainSpecial(I J GetTerrainSpecial(<-mapWidth 1 sub J sub <-mapHeight 1 sub I sub)) endif loop loop :BottomRightToTopLeft ################################################################################ do(<-mapHeight 0) do(<-mapWidth 0) if(<-mapWidth 1 sub I sub J add <-mapWidth lte) SetTerrain(J I GetTerrain(I J)) SetTerrainSpecial(J I GetTerrainSpecial(I J)) endif loop loop :TopLeftToBottomRight ################################################################################ do(<-mapHeight 0) do(<-mapWidth 0) if(<-mapWidth 1 sub I sub J add <-mapWidth lte) SetTerrain(I J GetTerrain(J I)) SetTerrainSpecial(I J GetTerrainSpecial(J I)) endif loop loop :BottomLeftQuadrilateral ############################################################################# @LeftToRight @BottomToTop :BottomRightQuadrilateral ############################################################################ @RightToLeft @BottomToTop :TopLeftQuadrilateral ################################################################################ @LeftToRight @TopToBottom :TopRightQuadrilateral ############################################################################### @RightToLeft @TopToBottom :LeftHalfRotational ################################################################################## do(<-mapHeight 0) do(<-halfWidth 0) SetTerrain(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub GetTerrain(I J)) SetTerrainSpecial(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub GetTerrainSpecial(I J)) loop loop :RightHalfRotational ################################################################################# do(<-mapHeight 0) do(<-halfWidth 0) SetTerrain(I J GetTerrain(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub)) SetTerrainSpecial(I J GetTerrainSpecial(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub)) loop loop :TopHalfRotational ################################################################################### do(<-halfHeight 0) do(<-mapWidth 0) SetTerrain(I J GetTerrain(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub)) SetTerrainSpecial(I J GetTerrainSpecial(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub)) loop loop :BottomHalfRotational ################################################################################ do(<-halfHeight 0) do(<-mapWidth 0) SetTerrain(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub GetTerrain(I J)) SetTerrainSpecial(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub GetTerrainSpecial(I J)) loop loop :BottomLeftHalfRotational ############################################################################ do(<-mapHeight 0) do(<-mapWidth 0) if(asfloat(I) asfloat(<-mapWidth) div asfloat(J) asfloat(<-mapHeight) div add 1 lt) SetTerrain(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub GetTerrain(I J)) SetTerrainSpecial(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub GetTerrainSpecial(I J)) endif loop loop :TopRightHalfRotational ############################################################################## do(<-mapHeight 0) do(<-mapWidth 0) if(asfloat(I) asfloat(<-mapWidth) div asfloat(J) asfloat(<-mapHeight) div add 1 lt) SetTerrain(I J GetTerrain(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub)) SetTerrainSpecial(I J GetTerrainSpecial(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub)) endif loop loop :BottomRightHalfRotational ########################################################################### do(<-mapHeight 0) do(<-mapWidth 0) if(asfloat(<-mapWidth 1 sub I sub) asfloat(<-mapWidth) div asfloat(J) asfloat(<-mapHeight) div add 1 lt) SetTerrain(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub GetTerrain(I J)) SetTerrainSpecial(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub GetTerrainSpecial(I J)) endif loop loop :TopLeftHalfRotational ############################################################################### do(<-mapHeight 0) do(<-mapWidth 0) if(asfloat(<-mapWidth 1 sub I sub) asfloat(<-mapWidth) div asfloat(J) asfloat(<-mapHeight) div add 1 lt) SetTerrain(I J GetTerrain(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub )) SetTerrainSpecial(I J GetTerrainSpecial(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub )) endif loop loop :BottomLeftQuarterRotational ######################################################################### do(<-halfHeight 0) do(<-halfWidth 0) SetTerrain(J <-mapHeight 1 sub I sub GetTerrain(I J)) SetTerrainSpecial(J <-mapHeight 1 sub I sub GetTerrainSpecial(I J)) loop loop @LeftHalfRotational :TopLeftQuarterRotational ############################################################################ do(<-halfHeight 0) do(<-halfWidth 0) SetTerrain(I J GetTerrain(J <-mapHeight 1 sub I sub)) SetTerrainSpecial(I J GetTerrainSpecial(J <-mapHeight 1 sub I sub)) loop loop @LeftHalfRotational :BottomRightQuarterRotational ######################################################################## do(<-halfHeight 0) do(<-halfWidth 0) SetTerrain(I J GetTerrain(<-mapWidth 1 sub J sub I)) SetTerrainSpecial(I J GetTerrainSpecial(<-mapWidth 1 sub J sub I)) loop loop @BottomHalfRotational :TopRightQuarterRotational ########################################################################### do(<-halfHeight 0) do(<-halfWidth 0) SetTerrain(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub GetTerrain(<-mapWidth 1 sub J sub I)) SetTerrainSpecial(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub GetTerrainSpecial(<-mapWidth 1 sub J sub I)) loop loop @RightHalfRotational :LeftQuarterRotational ############################################################################### do(<-mapHeight 0) do(<-mapWidth 0) if(asfloat(I) asfloat(<-mapWidth) div asfloat(J) asfloat(<-mapHeight) div add 1 lt asfloat(I) asfloat(<-mapWidth) div asfloat(<-mapHeight 1 sub J sub) asfloat(<-mapHeight) div add 1 lt and) SetTerrain(J <-mapHeight 1 sub I sub GetTerrain(I J)) SetTerrainSpecial(J <-mapHeight 1 sub I sub GetTerrainSpecial(I J)) endif loop loop @TopLeftHalfRotational :RightQuarterRotational ############################################################################## do(<-mapHeight 0) do(<-mapWidth 0) if(asfloat(I) asfloat(<-mapWidth) div asfloat(J) asfloat(<-mapHeight) div add 1 lt asfloat(I) asfloat(<-mapWidth) div asfloat(<-mapHeight 1 sub J sub) asfloat(<-mapHeight) div add 1 lt and) SetTerrain(J <-mapHeight 1 sub I sub GetTerrain(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub)) SetTerrainSpecial(J <-mapHeight 1 sub I sub GetTerrainSpecial(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub)) endif loop loop @TopRightHalfRotational :TopQuarterRotational ################################################################################ do(<-mapHeight 0) do(<-mapWidth 0) if(asfloat(I) asfloat(<-mapWidth) div asfloat(J) asfloat(<-mapHeight) div add 1 lt asfloat(I) asfloat(<-mapWidth) div asfloat(<-mapHeight 1 sub J sub) asfloat(<-mapHeight) div add 1 lt and) SetTerrain(I J GetTerrain(J <-mapHeight 1 sub I sub)) SetTerrainSpecial(I J GetTerrainSpecial(J <-mapHeight 1 sub I sub)) endif loop loop @TopLeftHalfRotational :BottomQuarterRotational ############################################################################# do(<-mapHeight 0) do(<-mapWidth 0) if(asfloat(I) asfloat(<-mapWidth) div asfloat(J) asfloat(<-mapHeight) div add 1 lt asfloat(I) asfloat(<-mapWidth) div asfloat(<-mapHeight 1 sub J sub) asfloat(<-mapHeight) div add 1 lt and) SetTerrain(I J GetTerrain(<-mapWidth 1 sub J sub I)) SetTerrainSpecial(I J GetTerrainSpecial(<-mapWidth 1 sub J sub I)) endif loop loop @BottomLeftHalfRotational :Rotate90Clockwise ################################################################################### do(<-mapHeight 0) do(<-mapWidth 0) I ->x J ->z GetTerrain(<-mapWidth 1 sub J sub I) ->h GetTerrainSpecial(<-mapWidth 1 sub J sub I) ->sp @SetBuffersAt loop loop @PrintBuffers :Rotate90Counterclockwise ############################################################################ do(<-mapHeight 0) do(<-mapWidth 0) I ->x J ->z GetTerrain(J <-mapHeight 1 sub I sub) ->h GetTerrainSpecial(J <-mapheight 1 sub I sub) ->sp @SetBuffersAt loop loop @PrintBuffers :Rotate180 ########################################################################################### do(<-mapHeight 0) do(<-mapWidth 0) I ->x J ->z GetTerrain(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub) ->h GetTerrainSpecial(<-mapWidth 1 sub I sub <-mapHeight 1 sub J sub) ->sp @SetBuffersAt loop loop @PrintBuffers :FlipLeftToRight ##################################################################################### do(<-mapHeight 0) do(<-mapWidth 0) I ->x J ->z GetTerrain(<-mapWidth 1 sub I sub J) ->h GetTerrainSpecial(<-mapWidth 1 sub I sub J) ->sp @SetBuffersAt loop loop @PrintBuffers :FlipTopToBottom ##################################################################################### do(<-mapHeight 0) do(<-mapWidth 0) I ->x J ->z GetTerrain(I <-mapHeight 1 sub J sub) ->h GetTerrainSpecial(I <-mapHeight 1 sub J sub) ->sp @SetBuffersAt loop loop @PrintBuffers :FlipBottomLeftToTopRight ############################################################################ do(<-mapHeight 0) do(<-mapWidth 0) I ->x J ->z GetTerrain(<-mapHeight 1 sub J sub <-mapWidth 1 sub I sub) ->h GetTerrainSpecial(<-mapHeight 1 sub J sub <-mapWidth 1 sub I sub) ->sp @SetBuffersAt loop loop @PrintBuffers :FlipBottomRightToTopLeft ############################################################################ do(<-mapHeight 0) do(<-mapWidth 0) I ->x J ->z GetTerrain(J I) ->h GetTerrainSpecial(J I) ->sp @SetBuffersAt loop loop @PrintBuffers :ScrollMapLeft ####################################################################################### do(<-mapHeight 0) do(<-mapWidth 0) I <-scr add ->x2 if(<-x2 <-mapWidth gte) <-x2 <-mapWidth sub ->x2 endif I ->x J ->z GetTerrain(<-x2 J) ->h GetTerrainSpecial(<-x2 J) ->sp @SetBuffersAt loop loop @PrintBuffers :ScrollMapRight ###################################################################################### do(<-mapHeight 0) do(<-mapWidth 0) I <-scr sub ->x2 if(<-x2 lt0) <-x2 <-mapWidth add ->x2 endif I ->x J ->z GetTerrain(<-x2 J) ->h GetTerrainSpecial(<-x2 J) ->sp @SetBuffersAt loop loop @PrintBuffers :ScrollMapUp ######################################################################################### do(<-mapHeight 0) do(<-mapWidth 0) J <-scr sub ->z2 if(<-z2 lt0) <-z2 <-mapHeight add ->z2 endif I ->x J ->z GetTerrain(I <-z2) ->h GetTerrainSpecial(I <-z2) ->sp @SetBuffersAt loop loop @PrintBuffers :ScrollMapDown ####################################################################################### do(<-mapHeight 0) do(<-mapWidth 0) J <-scr add ->z2 if(<-z2 <-mapHeight gte) <-z2 <-mapHeight sub ->z2 endif I ->x J ->z GetTerrain(I <-z2) ->h GetTerrainSpecial(I <-z2) ->sp @SetBuffersAt loop loop @PrintBuffers :SetBuffersAt ######################################################################################## SetListElement(<-terrainBuffer <-z <-mapWidth mul <-x add <-h) SetListElement(<-specialBuffer <-z <-mapWidth mul <-x add <-sp) :PrintBuffers ######################################################################################## do(GetListCount(<-terrainBuffer) 0) SetTerrain(I asint(<-mapWidth) mod I asint(<-mapWidth) div GetListElement(<-terrainBuffer I)) SetTerrainSpecial(I asint(<-mapWidth) mod I asint(<-mapWidth) div GetListElement(<-specialBuffer I)) loop # Made with luv by Argonwolf