title Miss Direction
author Malcolm Tyrrell
homepage https://sites.google.com/site/malcolmsprojects/miss-direction

noaction
again_interval 0.125

(
License:

(C)2014 Malcolm Tyrrell
You can use and distribute this code under the terms of the AGPLv3: 

http://www.gnu.org/licenses/agpl-3.0.html
)


========
OBJECTS
========

Background
BLACK

Wall
Blue

InnerCornerBR
Blue DarkBlue
.....
.....
....1
....0
..100

InnerCornerTR
Blue DarkBlue
..100
....0
....1
.....
.....


InnerCornerTL
Blue DarkBlue
001..
0....
1....
.....
.....

InnerCornerBL
Blue DarkBlue
.....
.....
1....
0....
001..

OuterCornerTR
Blue DarkBlue
0001.
00001
00000
00000
00000

OuterCornerTL
Blue DarkBlue
.1000
10000
00000
00000
00000

OuterCornerBL
Blue DarkBlue
00000
00000
00000
10000
.1000

OuterCornerBR
Blue DarkBlue
00000
00000
00000
00001
0001.

NorthTip
Blue DarkBlue
.101.
10001
00000
00000
00000

SouthTip
Blue DarkBlue
00000
00000
00000
10001
.101.

EastTip
Blue DarkBlue
0001.
00001
00000
00001
0001.

WestTip
Blue DarkBlue
.1000
10000
00000
10000
.1000

TrapDoor
Blue DarkBlue
10001
01010
00100
01010
10001

Flip
Blue DarkBlue
00100
01010
10001
01010
00100

(The white of the player's eyes are provided by the gravity tiles, below. See the broken crate logic for why.)

PlayerDown
Green Pink
...1.
.0001
0.0.0
00000
.000.

PlayerUp
Green Pink
.000.
00000
0.0.0
1000.
.1...

PlayerRight
Green Pink
.100.
10.00
.0000
.0.00
..00.

PlayerLeft
Green Pink
.00..
00.0.
0000.
00.01
.001.

(With the current rule set, there aren't enough objects to give the crate four directional tiles. It would be possible to rewrite the rules so gravity is merged into bodies. However, I think the game works well as is.)

Crate
Orange Yellow Brown
00000
01110
01210
01110
00000

(The gravity tiles determine which way gravity acts on a body, and also provide the whites of the player's eyes. They can be moved to the top layer for debugging.)

GravityUp
White
.....
..0..
.000.
.....
.....

GravityDown
White
.....
.....
.000.
..0..
.....

GravityRight
White
.....
..0..
..00.
..0..
.....

GravityLeft
White
.....
..0..
.00..
..0..
.....

(Movement tiles, used for automatic moves. These have to be invisible as they are added to the level when a body rounds a corner.)

MoveUp
Blue
.....
.....
.....
.....
.....

MoveLeft
Blue
.....
.....
.....
.....
.....

MoveDown
Blue
.....
.....
.....
.....
.....

MoveRight
Blue
.....
.....
.....
.....
.....

Exit
Red DarkRed Yellow
01010
01010
01020
01010
01010

(As far as I know, I need a tile to detect the edge of the level.)

OuterWall
Black
.....
.....
.....
.....
.....

(For the most part, the game mechanics cooperate. However, there are a few annoying feature interactions. For example when a crate is blocked when rounding a corner. I deal with this by ending the level: Indicated by a broken crate and a dead player.

Note that I can free up this tile if I use gravity tiles to provide part of the crates image. Unfortunately, it requires many additional instructions.)

BrokenCrate
Orange Yellow Brown Red Pink Black
55555
34343
01230
01130
00434

=======
LEGEND
=======

(By giving some of the immobile objects a gravity tile, I can partly exploit collision detection to ensure gravity tiles move consistently with their bodies.)

. = Background

# = Wall and GravityDown
0 = InnerCornerTL
1 = InnerCornerTR
2 = InnerCornerBL
3 = InnerCornerBR
4 = OuterCornerTL and GravityDown
5 = OuterCornerTR and GravityDown
6 = OuterCornerBL and GravityDown
7 = OuterCornerBR and GravityDown
N = NorthTip and GravityDown
S = SouthTip and GravityDown
E = EastTip and GravityDown
W = WestTip and GravityDown

D = PlayerDown and GravityDown
U = PlayerUp and GravityUp
L = PlayerLeft and GravityLeft
R = PlayerRight and GravityRight

* = Crate and GravityDown
^ = Crate and GravityUp
< = Crate and GravityLeft
> = Crate and GravityRight

T = TrapDoor
F = Flip
X = Exit
_ = OuterWall

(I try to make rules as specific as possible, to avoid generating too many instructions. This is why there are so many categories.)

Player = PlayerDown or PlayerUp or PlayerLeft or PlayerRight

InnerCorner = InnerCornerBR or InnerCornerTR or InnerCornerBL or InnerCornerTL
OuterCorner = OuterCornerTL or OuterCornerTR or OuterCornerBL or OuterCornerBR
Tip = NorthTip or SouthTip or EastTip or WestTip

Gravity = GravityDown or GravityRight or GravityUp or GravityLeft

GravityDL = GravityDown or GravityLeft
GravityDR = GravityDown or GravityRight
GravityUL = GravityUp or GravityLeft
GravityUR = GravityUp or GravityRight

GravityVert = GravityUp or GravityDown
GravityHoriz = GravityLeft or GravityRight

Body = Player or Crate
Movement = MoveUp or MoveDown or MoveLeft or MoveRight
Support = Body or Wall or OuterCorner or Tip or TrapDoor or Flip

Special = Flip or Trapdoor

SupportUp = Support or InnerCornerBL or InnerCornerBR
SupportDown = Support or InnerCornerTR or InnerCornerTL
SupportLeft = Support or InnerCornerTR or InnerCornerBR
SupportRight = Support or InnerCornerTL or InnerCornerBL

=======
SOUNDS
=======

(Unfortunately, the sounds are very minimal. There are too many rules already, and triggering sounds exactly when I'd like would require even more.)

(Crate MOVE 98943507)
BrokenCrate CREATE 36512104

(Outer Wall)
sfx0 53728701

(Push crate)
sfx1 20584307


EndLevel 307503

================
COLLISIONLAYERS
================

Background
Movement
InnerCorner, TrapDoor, Exit, Flip
Gravity
Wall, OuterCorner, Tip, Body, BrokenCrate
OuterWall

======
RULES
======

(Although I'm very happy with the end result, PuzzleScript may not have been the right choice for this game. The interactions between objects in Miss Direction is probably easier to express with code than with rules.)


(Automatic movements)

[ Body MoveUp ] -> [ Up Body ] again
[ Body MoveLeft ] -> [ Left Body ] again
[ Body MoveRight ] -> [ Right Body ] again
[ Body MoveDown ] -> [ Down Body ] again

(Player with no gravity is dead.)

[ Player No Gravity ] -> [ stationary Player ]

(A broken crate ends the level)

[ BrokenCrate ] [ Player Gravity ]  -> [ BrokenCrate ] [ stationary Player ]

(Player can't push towards gravity)

Down [ > PlayerDown GravityDown | Crate ] -> [ PlayerDown GravityDown | Crate ]
Right [ > PlayerRight GravityRight | Crate ] -> [ PlayerRight GravityRight | Crate ]
Left [ > PlayerLeft GravityLeft | Crate ] -> [ PlayerLeft GravityLeft | Crate ]
Up [ > PlayerUp GravityUp | Crate ] -> [ PlayerUP GravityUp | Crate ]

(Player pushes crates)

[ > Player | Crate ] -> [ > Player | > Crate ] sfx1

(Notes:
* Rules are linear, but the interactions in Miss Direction are aften not. We deal with this by sending movement tiles towards their intended position using "up" (etc) in the rules.
* PuzzleScript properties don't seem to easily let me handle each corner type with a few general rule. I think I could do it with a large table of properties, but that wouldn't be much of an improvement.
)

(INNER CORNERS)

(Top Left Inner Corner)

Left [ > Body GravityUL | InnerCornerTL ] -> [ > Body GravityLeft | InnerCornerTL MoveDown ] again
Up [ > Body GravityUL | InnerCornerTL ] -> [ > Body GravityUp | InnerCornerTL MoveRight ] again

Right Down [ > Body | InnerCornerTL ] -> [ Body | InnerCornerTL ]

(Top Right Inner Corner)

Up [ > Body GravityUR | InnerCornerTR ] -> [ > Body GravityUp | InnerCornerTR MoveLeft ] again
Right [ > Body GravityUR | InnerCornerTR ] -> [ > Body GravityRight | InnerCornerTR MoveDown ] again

Left Down [ > Body | InnerCornerTR ] -> [ Body | InnerCornerTR ]

(Bottom Left Inner Corner)

Down [ > Body GravityDL | InnerCornerBL ] -> [ > Body GravityDown | InnerCornerBL MoveRight ] again
Left [ > Body GravityDL | InnerCornerBL ] -> [ > Body GravityLeft | InnerCornerBL MoveUp ] again

Right Up [ > Body | InnerCornerBL ] -> [ Body | InnerCornerBL ]

(Bottom Right Inner Corner)

Right [ > Body GravityDR | InnerCornerBR ] -> [ > Body GravityRight | InnerCornerBR MoveUp ] again
Down [ > Body GravityDR | InnerCornerBR ] -> [ > Body GravityDown | InnerCornerBR MoveLeft ] again

Up Left [ > Body | InnerCornerBR ] -> [ Body | InnerCornerBR ]

(OUTER CORNERS)

(Top Left Outer Corner)

Down [ Left Body GravityDown | OuterCornerTL ] -> [ Left Body GravityRight Left MoveDown | OuterCornerTL ] again
Right [ Up Body GravityRight | OuterCornerTL ] -> [ Up Body GravityDown Up MoveRight | OuterCornerTL ] again

(Top Right Outer Corner)

Down [ Right Body GravityDown | OuterCornerTR ] -> [ Right Body  GravityLeft Right MoveDown | OuterCornerTR ] again
Left [ Up Body GravityLeft | OuterCornerTR ] -> [ Up Body GravityDown Up MoveLeft | OuterCornerTR ] again

(Bottom Left Outer Corner)

Up [ Left Body GravityUp | OuterCornerBL ] -> [ Left Body GravityRight Left MoveUp | OuterCornerBL ] again
Right [ Down Body GravityRight | OuterCornerBL ] -> [ Down Body GravityUp Down MoveRight | OuterCornerBL ] again

(Bottom Right Outer Corner)

Up [ Right Body GravityUp | OuterCornerBR ] -> [ Right Body GravityLeft Right MoveUp | OuterCornerBR ] again
Left [ Down Body GravityLeft | OuterCornerBR ] -> [ Down Body GravityUp Down MoveLeft | OuterCornerBR ] again

(TIPS)

(The "No Movement" stops a later rule from conflicting with an ealier rule in this section)

(North tip)

Right [ Up Body GravityRight No Movement | NorthTip | ] -> [ Up Body GravityLeft Up MoveRight | NorthTip Up MoveRight | Up MoveDown ] again
Left [ Up Body GravityLeft No Movement | NorthTip | ] -> [ Up Body GravityRight Up MoveLeft | NorthTip Up MoveLeft | Up MoveDown ] again

(South tip)

Right [ Down Body GravityRight No Movement | SouthTip | ] -> [ Down Body GravityLeft Down MoveRight | SouthTip Down MoveRight | Down MoveUp ] again
Left [ Down Body GravityLeft No Movement | SouthTip | ] -> [ Down Body GravityRight Down MoveLeft | SouthTip Down MoveLeft | Down MoveUp ] again

(East tip)

Down [ Right Body GravityDown No Movement | EastTip | ] -> [ Right Body GravityUp Right MoveDown | EastTip Right MoveDown | Right MoveLeft ] again
Up [ Right Body GravityUp No Movement | EastTip | ] -> [ Right Body GravityDown Right MoveUp | EastTip Right MoveUp | Right MoveLeft ] again

(West tip)

Down [ Left Body GravityDown No Movement | WestTip | ] -> [ Left Body GravityUp Left MoveDown | WestTip Left MoveDown | Left MoveRight ] again
Up [ Left Body GravityUp No Movement | WestTip | ] -> [ Left Body GravityDown Left MoveUp | WestTip Left MoveUp | Left MoveRight ] again

(TRAPDOORS AND FLIPS)

(This is a negative rule which prevents bodies going through these elements sideways. It seems more intuitive to prevent it than to allow it.)

Horizontal [ > Body GravityVert | Special ] -> [ Body GravityVert | Special ]
Vertical [ > Body GravityHoriz | Special ] -> [ Body GravityHoriz | Special ]

(FLIP)

Up [ > Body GravityUp | Flip | No Crate ] -> [ > Body GravityDown | Flip MoveUp | ] again

Down [ > Body GravityDown | Flip | No Crate ] -> [ > Body GravityUp | Flip MoveDown | ] again

Left [ > Body GravityLeft | Flip | No Crate ] -> [ > Body GravityRight | Flip MoveLeft | ] again

Right [ > Body GravityRight | Flip | No Crate ] -> [ > Body GravityLeft | Flip MoveRight | ] again

(Force gravity to follow player)

[ > Body Gravity ] -> [ > Body > Gravity ]

(Gravity)

Late Up [ Body GravityUp No Movement | No SupportUp ] -> [ Body GravityUp MoveUp | ] again
Late Down [ Body GravityDown No Movement | No SupportDown ] -> [ Body GravityDown MoveDown | ] again
Late Left [ Body GravityLeft No Movement | No SupportLeft ] -> [ Body GravityLeft MoveLeft | ] again
Late Right [ Body GravityRight No Movement  | No SupportRight ] -> [ Body GravityRight MoveRight | ] again

(Use gravity to select correct tile)

Late [ Player GravityDown ] -> [ PlayerDown GravityDown ]
Late [ Player GravityUp ] -> [ PlayerUp GravityUp ]
Late [ Player GravityLeft ] -> [ PlayerLeft GravityLeft ]
Late [ Player GravityRight ] -> [ PlayerRight GravityRight ]

(Falling off the edge is fatal)

Late [ Body Gravity OuterWall ] -> [ OuterWall] sfx0

(If crates are obstructed during an automatic move, they break and that ends the level. This is not a game-mechanic per se, but is necessary to prevent glitchy behaviour. Known glitches remain, but I think they rarely arise in the current set of levels.)

Late Down [ Crate MoveDown | Crate ] -> [ BrokenCrate | BrokenCrate ]
Late Up [ Crate MoveUp | Crate ] -> [ BrokenCrate | BrokenCrate ]
Late Left [ Crate MoveLeft | Crate ] -> [ BrokenCrate | BrokenCrate ]
Late Right [ Crate MoveRight | Crate ] -> [ BrokenCrate | BrokenCrate ]

Late Down [ Player MoveDown | Crate | Crate ] -> [ Player | BrokenCrate | BrokenCrate ]
Late Up [ Player MoveUp | Crate | Crate ] -> [ Player | BrokenCrate | BrokenCrate ]
Late Left [ Player MoveLeft | Crate | Crate ] -> [ Player | BrokenCrate | BrokenCrate ]
Late Right [ Player MoveRight | Crate | Crate ] -> [ Player | BrokenCrate | BrokenCrate ]

==============
WINCONDITIONS
==============

(All of the current levels have a single exit, but multiple exits would be legitimate)

Some Player on Exit

=======
LEVELS
=======


message For Avery.

( 1.

Set the scene and introduce tips.
)

.....................
................X....
.............######E.
....D..#######.......
.W######.............
.....................
.....................

( 2.

Introduce falling safely, falling off the edge, trapdoors.
)
_____________
.............
......X......
....W###E....
.............
.............
....D........
...###T###...
.............
.............
.............
.W###E.......
.............
.............
.............
.......####E.
.............
.............
_____________


( 3.

Introduce corners. The level design is meant to visually disguise the corners.
)

___________________
...................
...................
.....W####T##E.....
...................
...................
.........X.........
......4####T#......
......#.....#......
......#.....#......
......##E.W##......
.....3#.....#......
.W#####.....###T#E.
......#.....#.U....
......#T#####......
...................
...................
...................
..W#####T#######E..
...................
...................
___________________


( 4.

This level is designed to draw the player in the wrong direction, but for the right reasons. Namely to give the player lots of opportunity to understand the inner corner logic. The level also introduces semi-circles.

There are two ways to handle a body falling onto an inner corner.
a. you can shift it one tile sideways.
b. You can turn it and let it continue falling sideways.
Both probably lead to viable games. I suspect b. would lead to lots of flying around and make levels difficult to design. Thus, I went for a.
)

_........#####........_
_........#0.1#........_
_....#####...#####...._
_....#...........#...._
_...##...........#...._
_...#0...........#...._
_...#2...........#...._
_...##...........####._
_....#.............1#._
_.###7..............#._
_.#0................#._
_.#................3#._
_.#X.............####._
_.#..............#...._
_....#...........#...._
_....#D..........#...._
_....####.....####...._
_.......#.....#......._
_.......#.....#......._
_.......#2...3#......._
_.......#######......._
_....................._


( 5.

Mazes.

A single maze is interesting enough, I think. They might get boring very quickly.
)
__________________________
_........................_
_........................_
_..##########E..W#####5.._
_..#0.................#.._
_..#..........D.......#.._
_..#.....4#T#####.....#.._
_..#..N..#......#..#..#.._
_..#..#.........T..#..#.._
_..#..#..#...#..#..#..#.._
_........T..X#........T.._
_..N..#..#...#..N..#..#.._
_..#..#.........#..#..#.._
_..#..S..#.....3#..#..#.._
_..#.....6####T##.....#.._
_..#..................#.._
_..#2.................#.._
_..6##########..W######.._
_........................_
_........................_
__________________________


( 6.

Crates, dorsal fin pattern, jump to exit.

This level was designed to have 1 unit of crate challenge, and also reassure the player that jumping might have a purpose after all. A one-tile drop would give the same effect as the dorsal fin, but the dorsal fine looks nicer.
)

_________________
_..............._
_.......D......._
_.......*......._
_..N...4#5...N.._
_..#...#X#...#.._
_..#2.......3#.._
_..###.###.###.._
_..6#########7.._
_......1#......._
_.......6......._
_..............._
_..............._
_________________


( 7.

Crate pushing when player has different gravity to the crate.

The platform topology is not just about making it complicated to get places. Objects with different gravities can interact.
)

_______________
_............._
_.....D.X....._
_...4##.#.5..._
_...6##.##7..._
_....^........_
_............._
_.....###....._
_............._
_..4###.###5.._
_..#0.....1#.._
_..#2.....3#.._
_..6####.##7.._
_............._
_............._
_...WT###TE..._
_............._
_............._
_______________


( 8.

Jumping can push a crate. The player has used jump only once so far, so hopefully it's not completely trivial to solve this. The solution is also kind of painful, which I find amusing.
)

___________________
...................
...................
..4####TE.W#####5..
..#0...........1#..
..#......D......#..
..#...#######...#..
..#.............#..
..#.*.....*...*.#..
..#.###.#######.#..
..#.............#..
..#2.....X.....3#..
..####...#.*.####..
..6#############7..
...................
...................
___________________


( 9.

Replacement level 9. Crates with surpising gravity.
)
#####################
#####.###.###.###.###
#0.^...*...^.......1#
#..#...#...#...#....#
#L.#...#...#...#...X#
#..#...#...#...#....#
#2.*...*...^.......3#
#####.###.###.###.###
#####################


( 10.

Crates with a gravity different to bodies act as platforms.
)

__________________
_................_
_................_
_....4###5......._
_....#01##......._
_....#..##......._
_..4.#<.##..N.#.._
_..#.#.3##..#.#.._
_.X#.#L.....#.#.._
_..#.#..##..#.#.._
_..6.#<.##..6.7.._
_....#..##......._
_....#23###......_
_.....####7......_
_................_
_................_
__________________


( 11.

Crates have square corners

This has a red herring, but hopefully the player can discount it quite quickly. Moving a crate along the bottom from the left to the right also hints at the actual solution.
)

___________________________
_........................._
_........................._
_..4###.............###5.._
_..####...#.....N...####.._
_..####...#..#..#..X####.._
_..####..##..#..#...####.._
_..#0.1...#..#..#...0.1#.._
_..#......#..#.>#......#.._
_..#......#..#..#......#.._
_..#.........#..#2D....#.._
_..#......#.....######.#.._
_..#......#............#.._
_..#2....3#2..........3#.._
_..#####################.._
_........................._
_........................._
___________________________


( 12.

Introduce flips.

This level has almost no challenge, so some players will rush through it. Hopefully some players get a mild surprise: The levels is intended to suggest that the new tile is a teleport.
)

________________________________________
_.......40....................15......._
_......3#2....................3#2......_
_.....4###23..15..15..15..15..1##5....._
_....W######...#...#...#...#...###E...._
_.....####01..37..37..37..37..3###....._
_.....#1#0....................1#0#....._
_.....#.62....................37.#....._
_....3#2........................3#2...._
_....4#5........................4#5...._
_......................................_
_......................................_
_..###F##5....................###F##5.._
_..................................1#.._
_..N.....4...................>5.....6.._
_..#2.*.3#....................#........_
_..6#####7....................S.####7.._
_.....U..........................X....._
_......................................_
________________________________________

( 13.

Stack as platform.
)
___________________
_................._
_................._
_..4###########5.._
_..##0.......1##.._
_..##....X....##.._
_..##.4#####5.##.._
_..##.#0...1#.##.._
_..##.62.*.37.##.._
_..#.....*.....#.._
_..7.....*.....S.._
_........*........_
_........*........_
_..5....6#7....N.._
_..#.....U.....#.._
_..#2.........3#.._
_..######.######.._
_..6#####F#####7.._
_................._
_................._
___________________


( 14.

Trap/Flip interactions and reflectors

It's probably not obvious that inner corners do support you. I'm not sure whether I should have exploited that feature. Fortunately, it should be obvious once the wrong solution is attemped.
)

_________________
_4555.......4445_
_6#01.......01#7_
_60...........17_
_62.....X.....37_
_.......#......._
_......3#2......_
_...*..*........_
_...#F##T##F#5.._
_............#.._
_...#T##F##T#7.._
_.....^..^..U..._
_..............._
_44...........55_
_40...........15_
_4237.......6235_
_6777.......6667_
_________________


( 15.

Building a stack against a wall. This level hints that you need four blocks at the bottom.
)
________________
_.............._
_.............._
_.....######5.._
_..........1#.._
_...........#.._
_.......X...#.._
_.....4###..#.._
_.....####..#.._
_......*..*3#.._
_....####T##7.._
_....##........_
_....##.*......_
_....##.#####.._
_....6#...^1#.._
_...........F.._
_........*.3#.._
_..W###T####7.._
_.........U...._
_.............._
________________


( 16.

Crates as gates. There's a subspace of puzzles based on these component. I was surprised at how many different element types I was able to find.
)

4#####X#########5
#0.1#..1##01#0.##
#...F...F...F..1#
#2.3#.*3#2*3#..3#
##F###F###F###F##
#0^1#0U.#0.1#0.1#
#...F...F..>F<..#
#2..#.*3#..3#...#
##F###F###F###F##
#0.1#..1#0^.#0.1#
#2.>F.*.F..>F..3#
##.3#2*.#2.3#..##
##F###F###F###F##
#..1#.^1#0^1#..##
#...F...F...F..1#
#...#..3#23##2.3#
6###############7


( 17.

Oscillating crate, broken corners.

I had to have a level with an oscillating crate. The basic puzzle didn't seem challenging enough, so I added a red herring. Sorry.
)

____________N____________
_..........4X5.........._
_......................._
_........4#####5........_
_..6#5..4########..4#7.._
_...6#..6..###..7..#7.._
_....6.............7...._
_...........D..........._
_..........##E.........._
_......................._
_......................._
_...4#F##0...4#####5...._
_...#0^1#....####01##..._
_...#2.............1#..._
_...6#23####....#2.3#..._
_....######7...3##F#7..._
_......................._
_...........*..........._
_..........W##.........._
_......................._
_......................._
_________________________


( 18.

Nudge from a constructed stack.

Composing existing puzzle elements is a good way to make new levels. I've limited the amount I do it in t his level set, as it tends to make the levels a bit arbitrary.
)

_________________
_..............._
_...........*..._
_.....*...###5.._
_...4##F#...1#.._
_...#0.......F.._
_...#.......3#.._
_...#2....###7.._
_...6###........_
_..............._
_..............._
_..####..###5..._
_..#0......1#..._
_..#<.......T..._
_..#2......3#..._
_..6#F#.#F##7..._
_.....U....^...._
_..............._
_..............._
_.W####.####E..._
_...X.#.#......._
_.....#.#......._
_.....#.#......._
_.....###......._


( 19.

Axis-bias.

This level has a strong left-right bias, but actually requires some up-down thinking.
)
____________________________
_.........................._
_.........................._
_..#5........##...#5...WE.._
_..##...4#...##...##......._
_..T....T.....T........##.._
_..#7...##...##...4#...##.._
_.......T.........6#...##.._
_..45...##...##........##<._
_.>##...T....##...4#...##.._
_..##...6#...##....T...67.._
_..##........##...##......._
_.......#5...##L...T...##.._
_.X##...T....##...##...##.._
_..##...##.........T......._
_...T...##...##...6#...##.._
_..##...##...##........##.._
_..##.......>##...##...67.._
_..67...45...##...##......._
_.......##........##...##.._
_..45...##...##...##...##.._
_..6#...#7...##........67.._
_.........................._
_.........................._
____________________________


( 20.

Introduce one more mechanic, pushing through flips, right at the end of the game.

Pushing through trapdoors also works, but I wanted to finish on a new mechanic, so I couldn't have both.
)

........45...........
.......4##5..........
.......6##7..........
................45...
..45...........4##5..
.4##5....4#5...6##7..
.6##7....^^^.........
.........^^^.........
.........^X^.........
##########.##########
##########.##########
##########.#0.....1##
#01#0....#.#2....#.##
#...............3#.##
#...W#5..6#F##5.#7.##
#.............#...3##
#.............F...1##
#235.4##T##E.##2...##
####.........1###5.##
####..........##0..1#
####2...*.....##2.D.#
#####################

message Thanks for helping Annie solve all those levels.

message That bi-triangular head-mounted gravity distorter was really giving her a headache.

message The End.

message Thanks to: Nicole, Stephen, Nick, Ben (x2), Glenn, Jacob, Amy and Colin.


(Old level 9. Looks nice but doesn't belong.
______________________
_#5.#####.########.4#_
_67.6..1#.#0.10.1#.67_
_....3..#.#<.....#..._
_#####.3#.#2....3#.4#_
_#0^17.6#.#7....6#21#_
_#..................#_
_#2....#####.4#.42.3#_
_#0....60..7.1#.#####_
_#............#......_
_#2.35.#5.45..#.#####_
_#####.#0.67.6#.60..#_
_......#............#_
_#####.#..4..35....3#_
_#0.17.#7.#####....1#_
_#.................R#_
_#21#5....4#.#5.42.3#_
_#7.#X....1#.#0.#####_
_...#......#.#..0...._
_45.#..32.3#.#2.35.45_
_#7.########.#####.6#_
______________________

)