puzzlescript
Version:
Play PuzzleScript games in your terminal!
1,237 lines (1,002 loc) • 22.5 kB
Plain Text
title ParaLands
author Lukas
run_rules_on_level_start
again_interval 0.05
norepeat_action
========
OBJECTS
========
Background
darkgray
Floor1
darkgray
Floor2
#444444
Wall
gray #444444 #bbbbbb
.222.
20001
20001
20001
.111.
WallConnectorN
gray #444444 #bbbbbb
20001
.....
.....
.....
.....
WallConnectorS
gray #444444 #bbbbbb
.....
.....
.....
.....
20001
WallConnectorE
gray #444444 #bbbbbb
....2
....0
....0
....0
....1
WallConnectorW
gray #444444 #bbbbbb
2....
0....
0....
0....
1....
WallConnectorNE
gray
....0
.....
.....
.....
.....
WallConnectorNW
gray
0....
.....
.....
.....
.....
WallConnectorSE
gray
.....
.....
.....
.....
....0
WallConnectorSW
gray
.....
.....
.....
.....
0....
Pit
black
PlayerOrange
orange blue
.000.
.101.
00000
.000.
.0.0.
PlayerBlue
blue orange
.000.
.101.
00000
.000.
.0.0.
PlayerTrans1
orange blue black
.....
.000.
.101.
22222
.222.
PlayerTrans2
black
.....
.....
.000.
00000
.000.
PlayerTrans3
blue orange black
.....
.000.
.101.
22222
.222.
CrateOrange
orange #ffbb88 #bb6600
11112
10002
10002
10002
22222
CrateBlue
blue #8888ff #0000bb
11112
10002
10002
10002
22222
CrateOmni
orange #ffbb88 #bb6600 blue #8888ff #0000bb
11145
10035
10035
10335
22555
BallOrange
orange #ffbb88 #bb6600
.002.
01002
00002
20002
.222.
BallBlue
blue #8888ff #0000bb
.002.
01002
00002
20002
.222.
BallOmni
orange #ffbb88 #bb6600 blue #0000bb
.004.
01034
00034
20334
.244.
DoorOrange
orange #bb6600
.000.
00000
10001
11111
.111.
DoorOpenOrange
orange
.....
.....
.000.
00000
.000.
DoorBlue
blue #0000bb
.000.
00000
10001
11111
.111.
DoorOpenBlue
blue
.....
.....
.000.
00000
.000.
DoorOmni
orange #bb6600 blue #0000bb
.002.
00022
10223
11333
.133.
DoorOpenOmni
orange blue
.....
.....
.001.
00011
.011.
SwitchOrange
orange
.....
..0..
.000.
..0..
.....
SwitchBlue
blue
.....
..0..
.000.
..0..
.....
SwitchOmni
orange blue
.....
..0..
.001.
..1..
.....
TrapdoorOrange
orange #ffbb88
.000.
01010
00000
01010
.000.
TrapdoorBlue
blue #8888ff
.000.
01010
00000
01010
.000.
TrapdoorOmni
orange #ffbb88 blue #8888ff
.002.
01032
00022
01232
.022.
EnemyOrangeIdle
orange #ffbb88
.....
..0..
.101.
.0.0.
.0.0.
EnemyOrangeActive
orange #ffbb88
.....
.....
..0..
.101.
.0.0.
EnemyBlueIdle
blue #8888ff
.....
..0..
.101.
.0.0.
.0.0.
EnemyBlueActive
blue #8888ff
.....
.....
..0..
.101.
.0.0.
EnemyOmniIdle
orange #ffbb88 blue #8888ff
.....
..0..
.123.
.0.2.
.0.2.
EnemyOmniActive
orange #ffbb88 blue #8888ff
.....
.....
..0..
.123.
.0.2.
PlatformOrange
#bb6600
.....
.000.
.000.
.000.
.....
PlatformBlue
#0000bb
.....
.000.
.000.
.000.
.....
PlatformOmni
#bb6600 #0000bb
.....
.001.
.001.
.011.
.....
GoalFr1
gray lightgray
.000.
00111
01001
00011
.111.
GoalFr2
gray lightgray
.111.
01011
01001
00101
.000.
GoalFr3
gray lightgray
.111.
11000
10010
11100
.000.
GoalFr4
gray lightgray
.000.
10100
10010
11010
.111.
Blood
red
InactiveCrate
white
0.0.0
.....
0...0
.....
0.0.0
InactiveBall
white
.0.0.
0...0
.....
0...0
.0.0.
InactivePlatform
white
.....
.0.0.
.....
.0.0.
.....
InactiveDoor
white
.0.0.
0...0
.0.0.
.....
.....
InactiveDoorOpen
white
.....
.....
.0.0.
0...0
.0.0.
InactiveSwitch
transparent
InactiveTrapdoor
white
0...0
.....
.....
.....
0...0
InactiveEnemy
white
.....
..0..
.0.0.
.....
.0.0.
TempCrate
transparent
TempBall
transparent
TempPlatform
transparent
tempDoor
transparent
tempDoorOpen
transparent
tempSwitch
transparent
TempTrapdoor
transparent
TempEnemy
transparent
Init
transparent
EnemyTurn
transparent
Buffer
transparent
Animate
transparent
PlayerShadow
transparent
OrangeToBlue
transparent
BlueToOrange
transparent
JumpNow
transparent
PlayerCrosshair
transparent
TrapdoorTriggered
transparent
InactiveTrapdoorTriggered
transparent
TempTrapdoorTriggered
transparent
=======
LEGEND
=======
. = Background
# = Wall
@ = PlayerOrange and Init
! = GoalFr1
1 = CrateOrange and InactiveCrate
a = CrateOmni
2 = BallOrange and InactiveBall
b = BallOmni
3 = EnemyOrangeIdle and InactiveEnemy
c = EnemyOmniIdle
4 = DoorOrange and InactiveDoor
d = DoorOmni
5 = SwitchOrange and InactiveSwitch
e = SwitchOmni
6 = Pit and TrapdoorOrange and InactiveTrapdoor
f = Pit and TrapdoorOmni
* = Pit
(main game objects)
Floor = Floor1 or Floor2
Player = PlayerOrange or PlayerBlue or PlayerTrans1 or PlayerTrans2 or PlayerTrans3
Goal = GoalFr1 or GoalFr2 or GoalFr3 or GoalFr4
(PU game objects)
MonoCrate = CrateOrange or CrateBlue
Crate = MonoCrate or CrateOmni
MonoBall = BallOrange or BallBlue
Ball = MonoBall or BallOmni
MonoPlatform = PlatformOrange or PlatformBlue
Platform = MonoPlatform or PlatformOmni
MonoDoor = DoorOrange or DoorBlue
Door = DoorOmni or MonoDoor
MonoDoorOpen = DoorOpenOrange or DoorOpenBlue
DoorOpen = DoorOpenOmni or MonoDoorOpen
MonoSwitch = SwitchOrange or SwitchBlue
Switch = SwitchOmni or MonoSwitch
MonoTrapdoor = TrapdoorOrange or TrapdoorBlue
Trapdoor = MonoTrapdoor or TrapdoorOmni
Pushable = Ball or Crate
InactivePushable = InactiveBall or InactiveCrate
PushableOmni = BallOmni or CrateOmni
EnemyOrange = EnemyOrangeIdle or EnemyOrangeActive
EnemyBlue = EnemyBlueIdle or EnemyBlueActive
EnemyOmni = EnemyOmniIdle or EnemyOmniActive
MonoEnemy = EnemyOrange or EnemyBlue
Enemy = MonoEnemy or EnemyOmni
MonoEnemyActive = EnemyBlueActive or EnemyOrangeActive
EnemyActive = MonoEnemyActive or EnemyOmniActive
(general obstacles)
Obstacle = Wall or Player or Crate or Ball or Enemy or Door
(inactive obstacles)
InactiveObstacle = InactiveCrate or InactiveBall or InactiveEnemy or InactiveDoor
(obstacles for inactive objects)
ObstacleForInactive = InactiveObstacle or Wall or CrateOmni or BallOmni or EnemyOmni
(obstacles for active enemy)
ObstacleForMonoEnemy = Wall or Enemy or Door
(obstacles for omni enemy)
ObstacleForOmniEnemy = ObstacleForMonoEnemy or InactiveEnemy or InactiveDoor
(Have 4 different Pitfillers, so the correct platform is built)
PitFillerOrange = CrateOrange or BallOrange
PitFillerBlue = CrateBlue or BallBlue
PitFillerOmni = CrateOmni or BallOmni
PitFillerInactive = InactiveCrate or InactiveBall
(Fillings)
Filling = Platform or Trapdoor
InactiveFilling = InactivePlatform or InactiveTrapdoor or PlatformOmni or TrapdoorOmni
(Weights for doors)
Weight = Player or Crate or Ball or Enemy
InactiveWeight = InactiveCrate or InactiveBall or InactiveEnemy or CrateOmni or BallOmni or EnemyOmni
(Trapdoor triggers)
Trigger = Player or Enemy
InactiveTrigger = InactiveEnemy or EnemyOmni
OmniTrigger = Trigger or InactiveTrigger
(Temporary objects, eg buffers, flags, ...)
TempAnimTurn = Init or Buffer or EnemyTurn or Animate or PlayerCrosshair
TempInputTurn = PlayerShadow
=======
SOUNDS
=======
sfx1 27102304
sfx2 11336309
Pushable move 69429507
sfx3 47602107
sfx4 91878702
Trapdoor Destroy 77067304
================
COLLISIONLAYERS
================
Background
Floor1, Floor2
Goal, Pit, Switch, DoorOpen
Platform, Trapdoor
InactivePlatform, InactiveTrapdoor
TempPlatform, TempTrapdoor
InactiveTrapdoorTriggered
TempTrapdoorTriggered
TrapdoorTriggered
Player, Wall, Crate, Ball, Enemy, Door
InactiveSwitch, InactiveDoorOpen
TempSwitch, TempDoorOpen
InactiveCrate, InactiveBall, InactiveEnemy, InactiveDoor
TempCrate, TempBall, TempEnemy, TempDoor
(Some flags. Just to be sure, might as well use a seperate layer for each)
Animate
Buffer
Init
EnemyTurn
PlayerShadow
OrangeToBlue, BlueToOrange
JumpNow
PlayerCrosshair
(wall connector sprites. Unfortunately, each one needs its own layer)
WallConnectorN
WallConnectorE
WallConnectorS
WallConnectorW
WallConnectorNE
WallConnectorNW
WallConnectorSE
WallConnectorSW
(DEATH)
Blood
======
RULES
======
(INIT TURN)
(Rules in this section are only run once on level start)
(init floor)
[Init][Player] -> [Init][Player Floor1]
[Floor1|no Floor] -> [Floor1|Floor2]
+[Floor2|no Floor] -> [Floor2|Floor1]
(init walls)
right [Init][Wall|Wall] -> [Init][Wall WallConnectorE|Wall WallConnectorW]
down [Init][Wall|Wall] -> [Init][Wall WallConnectorS|Wall WallConnectorN]
[Init][WallConnectorN WallConnectorE] -> [Init][WallConnectorN WallConnectorE WallConnectorNE]
[Init][WallConnectorN WallConnectorW] -> [Init][WallConnectorN WallConnectorW WallConnectorNW]
[Init][WallConnectorS WallConnectorE] -> [Init][WallConnectorS WallConnectorE WallConnectorSE]
[Init][WallConnectorS WallConnectorW] -> [Init][WallConnectorS WallConnectorW WallConnectorSW]
(UNIVERSE HOPPING)
[PlayerTrans3 OrangeToBlue] -> [PlayerBlue]
[PlayerTrans2 OrangeToBlue JumpNow] -> [PlayerTrans3 OrangeToBlue Animate] again
[PlayerTrans2 OrangeToBlue no JumpNow] -> [PlayerTrans2 OrangeToBlue JumpNow Animate] again
[PlayerTrans1 OrangeToBlue] -> [PlayerTrans2 OrangeToBlue Animate] again
[action PlayerOrange no InactiveObstacle no Pit] -> [PlayerTrans1 OrangeToBlue Animate] again sfx2
[PlayerTrans1 BlueToOrange] -> [PlayerOrange]
[PlayerTrans2 BlueToOrange JumpNow] -> [PlayerTrans1 BlueToOrange Animate] again
[PlayerTrans2 BlueToOrange no JumpNow] -> [PlayerTrans2 BlueToOrange JumpNow Animate] again
[PlayerTrans3 BlueToOrange] -> [PlayerTrans2 BlueToOrange Animate] again
[action PlayerBlue no InactiveObstacle no Pit] -> [PlayerTrans3 BlueToOrange Animate] again sfx2
[action Player] -> sfx1
(PARALLEL UNIVERSE OBJECTS)
(lots of very similiar code, but no way to avoid that I guess)
(buffer inactive objects)
[JumpNow][InactiveCrate] -> [JumpNow][TempCrate]
[JumpNow][InactiveBall] -> [JumpNow][TempBall]
[JumpNow][InactivePlatform] -> [JumpNow][TempPlatform]
[JumpNow][InactiveDoor] -> [JumpNow][TempDoor]
[JumpNow][InactiveDoorOpen] -> [JumpNow][TempDoorOpen]
[JumpNow][InactiveSwitch] -> [JumpNow][TempSwitch]
[JumpNow][InactiveTrapdoor] -> [JumpNow][TempTrapdoor]
[JumpNow][InactiveTrapdoorTriggered] -> [JumpNow][TempTrapdoorTriggered]
[JumpNow][InactiveEnemy] -> [JumpNow][TempEnemy]
(toggle active objects)
[JumpNow][MonoCrate] -> [JumpNow][InactiveCrate]
[JumpNow][MonoBall] -> [JumpNow][InactiveBall]
[JumpNow][MonoPlatform] -> [JumpNow][InactivePlatform]
[JumpNow][MonoDoor] -> [JumpNow][InactiveDoor]
[JumpNow][MonoDoorOpen] -> [JumpNow][InactiveDoorOpen]
[JumpNow][MonoSwitch] -> [JumpNow][InactiveSwitch]
[JumpNow][MonoTrapdoor] -> [JumpNow][InactiveTrapdoor]
[JumpNow][TrapdoorTriggered] -> [JumpNow][InactiveTrapdoorTriggered]
[JumpNow][MonoEnemy] -> [JumpNow][InactiveEnemy]
("load" inactive objects)
[TempCrate][OrangeToBlue] -> [CrateBlue][OrangeToBlue]
[TempCrate][BlueToOrange] -> [CrateOrange][BlueToOrange]
[TempBall][OrangeToBlue] -> [BallBlue][OrangeToBlue]
[TempBall][BlueToOrange] -> [BallOrange][BlueToOrange]
[TempPlatform][OrangeToBlue] -> [PlatformBlue][OrangeToBlue]
[TempPlatform][BlueToOrange] -> [PlatformOrange][BlueToOrange]
[TempDoor][OrangeToBlue] -> [DoorBlue][OrangeToBlue]
[TempDoor][BlueToOrange] -> [DoorOrange][BlueToOrange]
[TempDoorOpen][OrangeToBlue] -> [DoorOpenBlue][OrangeToBlue]
[TempDoorOpen][BlueToOrange] -> [DoorOpenOrange][BlueToOrange]
[TempSwitch][OrangeToBlue] -> [SwitchBlue][OrangeToBlue]
[TempSwitch][BlueToOrange] -> [SwitchOrange][BlueToOrange]
[TempTrapdoor][OrangeToBlue] -> [TrapdoorBlue][OrangeToBlue]
[TempTrapdoor][BlueToOrange] -> [TrapdoorOrange][BlueToOrange]
[TempTrapdoorTriggered] -> [TrapdoorTriggered]
[TempEnemy][OrangeToBlue] -> [EnemyBlueIdle][OrangeToBlue]
[TempEnemy][BlueToOrange] -> [EnemyOrangeIdle][BlueToOrange]
(ENEMY TURN - Kinda nasty)
(Vertical preference, of course - DROD rules!)
vertical [stationary EnemyActive|...|Player] -> [> EnemyActive|...|Player]
vertical [stationary EnemyActive|...|PlayerCrosshair] -> [> EnemyActive|...|PlayerCrosshair]
(Do some basic checks if the move is possible)
[> EnemyActive|ObstacleForMonoEnemy] -> [EnemyActive|ObstacleForMonoEnemy]
[> EnemyActive|Pushable|Obstacle] -> [EnemyActive|Pushable|Obstacle]
[> EnemyActive|Pit no Filling] -> [EnemyActive|Pit]
(of course, an omni pushable can't be pushed if the inactive universe blocks it)
[> EnemyActive|PushableOmni|ObstacleForInactive] -> [EnemyActive|PushableOmni|ObstacleForInactive]
(Special attention to an omni enemy)
[> EnemyOmniActive|ObstacleForOmniEnemy] -> [EnemyOmniActive|ObstacleForOmniEnemy]
[> EnemyOmniActive|InactivePushable|ObstacleForInactive] -> [EnemyOmniActive|InactivePushable|ObstacleForInactive]
[> EnemyOmniActive|Pit no InactiveFilling] -> [EnemyOmniActive|Pit]
(Don't think this is possible without some code duplication)
horizontal [stationary EnemyActive|...|Player] -> [> EnemyActive|...|Player]
horizontal [stationary EnemyActive|...|PlayerCrosshair] -> [> EnemyActive|...|PlayerCrosshair]
[> EnemyActive|ObstacleForMonoEnemy] -> [EnemyActive|ObstacleForMonoEnemy]
[> EnemyActive|Pushable|Obstacle] -> [EnemyActive|Pushable|Obstacle]
[> EnemyActive|Pit no Filling] -> [EnemyActive|Pit]
[> EnemyActive|PushableOmni|ObstacleForInactive] -> [EnemyActive|PushableOmni|ObstacleForInactive]
[> EnemyOmniActive|ObstacleForOmniEnemy] -> [EnemyOmniActive|ObstacleForOmniEnemy]
[> EnemyOmniActive|InactivePushable|ObstacleForInactive] -> [EnemyOmniActive|InactivePushable|ObstacleForInactive]
[> EnemyOmniActive|Pit no InactiveFilling] -> [EnemyOmniActive|Pit]
(Move balls - special attention to "double balls")
(do this check first so you might save the player from an unfair death)
[> EnemyOmniActive|Ball InactiveBall] -> [EnemyOmniActive|> Ball > InactiveBall]
[> EnemyActive|Ball] -> [EnemyActive|> Ball]
[> EnemyOmniActive|InactiveBall] -> [EnemyOmniActive|> InactiveBall]
(if able to move into the player, do so)
[> EnemyActive|Player] -> [|Blood] sfx4
(Move crates)
[> EnemyActive|Crate] -> [> EnemyActive|> Crate]
[> EnemyOmniActive|InactiveCrate] -> [> EnemyOmniActive|> InactiveCrate]
(ANIMATION TURN)
(Goal animation)
[Animate][GoalFr4] -> [Animate][GoalFr1 Buffer]
[Animate][GoalFr3] -> [Animate][GoalFr4]
[Animate][GoalFr2] -> [Animate][GoalFr3]
[Animate][GoalFr1 no Buffer] -> [Animate][GoalFr2]
(Turn active monsters back into idle ones)
[EnemyOrangeActive] -> [EnemyOrangeIdle]
[EnemyBlueActive] -> [EnemyBlueIdle]
[EnemyOmniActive] -> [EnemyOmniIdle]
(Death animation)
[Blood Buffer|] -> [Blood Buffer|Blood]
(kill all temporary objects used by the Anim Turn)
[TempAnimTurn] -> []
(mark blood tiles)
[Blood] -> [Blood Buffer] again
(PLAYER TURN)
(init player Shadow)
[Player] -> [Player PlayerShadow]
(don't move into pits)
[> Player|Pit no Filling] -> [Player|Pit]
(push stuff)
[> Player|Crate] -> [> Player|> Crate]
[> CrateOmni|InactiveObstacle] -> [CrateOmni|InactiveObstacle]
[> Player|MonoBall|no Obstacle] -> [Player Animate EnemyTurn|> MonoBall|] again
[> Player|BallOmni|no Obstacle no InactiveObstacle] -> [Player Animate EnemyTurn|> BallOmni|] again
(move balls)
[> BallOmni|InactiveObstacle] -> [BallOmni|InactiveObstacle]
+[> Ball|no Obstacle] -> [|> Ball] sfx3
+[> MonoBall Pit no Filling] -> [MonoBall Pit]
+[> BallOmni Pit no Filling no InactiveFilling] -> [BallOmni Pit]
(inactive ones, too)
[> InactiveBall|ObstacleForInactive] -> [InactiveBall|ObstacleForInactive]
+[> InactiveBall|no ObstacleForInactive] -> [|> InactiveBall]
+[> InactiveBall Pit no InactiveFilling] -> [InactiveBall Pit]
(LATE TURN)
(is a trapdoor triggered?)
late [MonoTrapdoor Trigger] -> [MonoTrapdoor Trigger TrapdoorTriggered]
late [InactiveTrapdoor InactiveTrigger] -> [InactiveTrapdoor InactiveTrigger InactiveTrapdoorTriggered]
late [TrapdoorOmni OmniTrigger] -> [TrapdoorOmni OmniTrigger TrapdoorTriggered]
(make triggered trapdoors fall if there's no more weight on top of them)
late [MonoTrapdoor TrapdoorTriggered no Weight] -> []
late [InactiveTrapdoor InactiveTrapdoorTriggered no InactiveWeight] -> []
late [TrapdoorOmni TrapdoorTriggered no Weight no InactiveWeight] -> []
(if something is on top of a pit that can fill it, build a platform)
late [Pit no Filling PitFillerOrange] -> [Pit PlatformOrange]
late [Pit no Filling PitFillerBlue] -> [Pit PlatformBlue]
late [Pit no Filling no InactiveFilling PitFillerOmni] -> [Pit PlatformOmni]
late [Pit no InactiveFilling PitFillerInactive] -> [Pit InactivePlatform]
(check door states)
(start by pretending the doors ar open)
late [DoorOrange] -> [DoorOpenOrange]
late [DoorBlue] -> [DoorOpenBlue]
late [DoorOmni] -> [DoorOpenOmni]
late [InactiveDoor] -> [InactiveDoorOpen]
(if there's nothing on top of the door and there's a switch without a weight, close the door)
(again, this requires a lot of similiar code, but I don't know how to improve that)
late [DoorOpenOrange no Obstacle][MonoSwitch no Weight] -> [DoorOrange][MonoSwitch]
late [DoorOpenBlue no Obstacle][MonoSwitch no Weight] -> [DoorBlue][MonoSwitch]
late [DoorOpenOmni no Obstacle][MonoSwitch no Weight] -> [DoorOmni][MonoSwitch]
late [InactiveDoorOpen no ObstacleForInactive][InactiveSwitch no InactiveWeight] -> [InactiveDoor][InactiveSwitch]
(an omni door additionaly needs inactive switches to be held down)
late [DoorOpenOmni no Obstacle][InactiveSwitch no InactiveWeight] -> [DoorOmni][InactiveSwitch]
(note that omni switches can be held down in either dimension)
late [DoorOpenOrange no Obstacle][SwitchOmni no Weight no InactiveWeight] -> [DoorOrange][SwitchOmni]
late [DoorOpenBlue no Obstacle][SwitchOmni no Weight no InactiveWeight] -> [DoorBlue][SwitchOmni]
late [DoorOpenOmni no Obstacle][SwitchOmni no Weight no InactiveWeight] -> [DoorOmni][SwitchOmni]
late [InactiveDoorOpen no ObstacleForInactive][SwitchOmni no Weight no InactiveWeight] -> [InactiveDoor][SwitchOmni]
(if the player has actually moved, it's the game's turn)
late [Player no PlayerShadow] -> [Player Animate EnemyTurn] again
(is an enemy turn coming up? Turn idle monsters into active ones)
late [EnemyTurn][EnemyOrangeIdle] -> [EnemyTurn][EnemyOrangeActive]
late [EnemyTurn][EnemyBlueIdle] -> [EnemyTurn][EnemyBlueActive]
late [EnemyTurn][EnemyOmniIdle] -> [EnemyTurn][EnemyOmniActive]
(also do that crosshair thing)
late [EnemyTurn][Player|...|] -> [EnemyTurn][Player|...|PlayerCrosshair]
(kill all temporary objects used by the Player Turn)
late [TempInputTurn] -> []
==============
WINCONDITIONS
==============
some Player on Goal
=======
LEVELS
=======
message Have you ever wondered ...
message ... if you weren't there ...
message ... would the universe really care?
message I - Nothing New Under the Sun
#####****###
#@..#*####c#
#.a.###d##.#
#.####d!d#.#
#*#..##d##.#
#.#.b#.e.#.#
#.f..#.e.#.#
####.#...#.#
**#..##f##.#
###..*..##.#
#.a..#..##.#
#....#####.#
######***###
message II - Universe Hopper
########*
#..1.1.##
#..1.1.!#
#..1.1.##
#.#######
#.#*****#
#.#*1*1*#
#.#**1**#
#.#*1*1*#
#.#*****#
#.#######
#*.@.1..#
#########
message III - The Best of Both Worlds
****#########****
#####.......#****
#...#.#.#.#.#####
#.1.........*.*!#
#####.#.#.#.#####
#.b............@#
#...#.#.#.#.#####
#####.......#****
****#########****
message IV - Two Times Two
*##########
##...*#.*!#
#.11....#*#
##..#*#.#.#
*#.##.*...#
*########@#
********###
message V - Dimensional Prelude
*####****
*#d!#****
##*###***
#*.*.#***
#@.#*###*
#....4.##
#.1#5#a.#
#.1.....#
#..######
####*****
message VI - Dimensional Gateways
******#####******
******#...#******
#######.5.#######
#...#...@...#...#
#!.*d.1.e.a.4.1.#
#...#.......#...#
#######.5.#######
******#...#******
******#####******
message VII - Two Times Four
****###******
**###.#######
###..1..#eee#
#!d@1.1..ee##
###..1..#eee#
**###.#######
****###******
message VIII - Game of Marbles
#########**
#.......#**
#.2...2.#**
#.@.....###
#...5...d!#
#.b.....###
#.2...2.#**
#.......#**
#########**
message IX - Fixing a Hole
#######*********
#..**!#*********
#..####*********
##6##########***
##..........###*
*#.##d##d##d#.##
*#.##.##.##....#
*#@..6..6...2.##
*#.##.##.##...#*
*#d##d##d##...#*
*#............#*
*####.1.b.....##
*#**5..........#
*###############
message X - Half Time
*****###*******
*#####*#*******
*#!..#*###*****
*#.#d#.a.#*****
*#.d5...5#*****
####.....#####*
#**...5..6...#*
###a.....#...#*
**#.5...5#...#*
**####6###...#*
*****#....2.2##
*****#.....2..#
*****#....2.b.#
*****######..@#
**********#####
message XI - Nemesis
#########******
#.......#******
#.#####.#***###
#.#c#@#.#***#c#
#.#a#.#.#####d#
#.#*....b..f.e#
#.#######b###.#
###*#..3#f#*#.#
****#.###.###.#
****#....*...*#
****#########d#
************#!#
************###
message XII - Every Breath You Take
****######***
****#....#***
****#.##.#***
****#....#***
****##c######
****#*@*****#
****#*.....*#
****#*.b...*#
****#*.....*#
****#*...b.*#
****#*.....*#
****#*****.*#
##########.##
#!*b*b*b....#
########.##.#
*******#....#
*******######
message XIII - Stalking Across Universes
**#########***
**#.......#***
**#.#...#.#***
###.......####
#c@...1...b*!#
###.......####
**#.#...#.#***
**#.......#***
**#########***
message XIV - A Little Help From My Friends
********######
#########....#
#.........##3#
#.#####.b.####
#.#.####..#***
#.#..*!#.##***
#.##.###..#***
#..#......#***
##.#.######***
*#@#.#********
*#####********
message XV - Hope Spot
***#####*###
***#...#*#!#
***#.1.#*#*#
####.#####.#
#.c#.e.2d..#
#.##.#.###.#
#.#@...#*#.#
#.##.#.###.#
#....#.....#
############
message XVI - Hope for the Hopeless
***######*****
***#*##*#####*
***#....#*#*##
***#.**.....*#
***#.**.*.*.##
####....*...##
#!*b.e1..4.@c#
####....*...##
***#.**.*.*.##
***#.**.....*#
***#....#*#*##
***#*##*#####*
***######*****
message XVII - Blockade
**###
**#!#
###*#
#.#.#
#.b.#
#.b.#
#3#@#
#####
message XVIII - Pas de Trois
###########
#.........#
#.........#
#....3....#
#.........#
#..e...e..#
#.........#
#.........#
#####@#####
****#d#****
****#!#****
****###****
message XIX - Orange Blues
********###**
********#!###
#########6.3#
#...c...d.###
#.......#f#**
#..#.#..#.#**
#..#5#..###**
#..###..#****
#.......#****
#.1...1.#****
#.##@##.#****
#.......#****
#########****
message XX - The Last Waltz
**********###****
**#########3#****
**#c.##...#d#****
**##.##.#2#.#****
**#..#......#****
###.##.#..#.#****
#...*.......#****
#.#a##......#****
#.#6##.#..1.#****
#.#6#.......#****
#...#e#b##b####**
###f#f#d##d##.#**
**#@#e.*..*.#.###
**#########..bb.#
**********#!#.#f#
**********###..3#
************#####
message Congratulations! Thanks for playing, hope you enjoyed.
message Encore
message [Might be a bit too much trial-and-error for an "official" level]
###*###**********
#c#*#e#*########*
#d###a#*#......#*
#...#@###....#.#*
#.#b#........d3#*
###.#.###..a.####
###.#.#*#....dbc#
#!.*f*###....####
###f#..##....#***
**#.##f#######***
**####.#*********
***#cd.#*********
***#####*********