Skip to content

Instantly share code, notes, and snippets.

Created November 17, 2013 05:00
Show Gist options
  • Save anonymous/7509484 to your computer and use it in GitHub Desktop.
Save anonymous/7509484 to your computer and use it in GitHub Desktop.
title
Play this game by pasting the script in http://www.puzzlescript.net/editor.html
title Aperture Science Sokoban Testing Initiative
author Ed Turner, with additional level design by Kalev Tait
homepage www.thoughtcheckgames.com
again_interval 0.02
key_repeat_interval 0.2
background_color lightgray
text_color black
run_rules_on_level_start
========
OBJECTS
========
Background
Grey LightGrey
11111
11111
11111
11111
11111
Wall
Grey White
00000
01110
01110
01110
00000
Metal
darkgrey
00000
0.0.0
00.00
0.0.0
00000
Hole
Black
(Buttons open doors. Behind metal, they are laser-activated)
(Put a Lie behind a button and a door or rotating wall and they will be on a seperate circuit.)
Button
black Red lightgrey
22222
20002
20102
20002
22222
Door
Grey DarkGrey
11111
00100
00100
00100
11111
(In addition to being, well, an open door, OpenDoor marks metal which can be flipped to a wall surface when a button is pushed. Put a lie behind it to be on the second circuit.)
DoorOpen
lightgrey DarkGrey
10001
00000
00000
00000
10001
(Target is the exit point. It also shows the next portal color, when applicable. It ALSO provides a temporary storage space for shots when portalling. It is ALSO a temporary token for rotating walls when they are on the second circuit. No, really.)
Target
White DarkGray grey lightgrey
31113
12.21
1.0.1
12.21
31113
(WeighedButton is used to both behing crates to mark where buttons were and behind the exit to illustrate when the next portal is orange)
WeighedButton
Red orange
..0..
.010.
01010
.010.
..0..
(NextShotBlue, behind the target, illustrates that the next shot will be blue. By itself, it's a Meterial Emancipation Grid / fizzler. It's also used as a marker behind rotating walls when they have their wall side out.)
NextShotBlue
Blue lightblue
1.1.1
.101.
10101
.101.
1.1.1
(Crates and sentries can be pushed around. Crates can even push sentries!)
Crate
Black DarkGray LightGray
11.11
11011
.000.
11011
11.11
Sentry
White Blue Black lightgray
..0..
.010.
30003
.202.
2.2.2
(These are deadly lasers. They are on seperate layers, so they can even cross. There's no good reason they're three pixels, except that I like the dashed look more than the solid lines.)
LaserH
Red
.....
.....
.000.
.....
.....
LaserV
Red
.....
..0..
..0..
..0..
.....
(Chell kicks ass. She's the reason I did all this work, really.)
ChellD
Black LightBrown Orange White Blue
.000.
.111.
2032.
0402.
.2.2.
ChellU
Black LightBrown Orange White Blue
.000.
.101.
.2022
.2223
.2.2.
ChellR
Black LightBrown Orange White Blue
.000.
0111.
02230
.2334
.22..
ChellL
Black LightBrown Orange White Blue
.000.
.1110
03220
4322.
..22.
(These shots are for animation purposes. Also, they are directional markers for sentries)
ShotD
Orange Yellow white
..2..
..0..
.010.
..0..
.....
ShotU
Orange Yellow white
.....
..0..
.010.
..0..
..2..
ShotR
Orange Yellow white
.....
..0..
2010.
..0..
.....
ShotL
Orange Yellow white
.....
..0..
.0102
..0..
.....
(BlueShot makes regular portal shots look blue, yes, but it's also a token for WeighedButtons when they're on the Lie circuit. Also, it's a directional marker for sentries, if and when that direction is "all directions".)
BlueShot
Blue LightBlue
.....
..0..
.010.
..0..
.....
(Portals are built into walls, not free-floating in front of them. There are advantages and disadvantages to this, but I think it's the better bet. It means that you can never have two portals on one wall square, though. That's a pretty built-in limitation, so learn to love it.)
OrPortU
Orange yellow Grey White
22222
23332
23332
20002
01110
OrPortD
Orange Yellow Grey White
01110
20002
23332
23332
22222
OrPortL
Orange Yellow Grey White
22220
23301
23301
23301
22220
OrPortR
Orange Yellow grey white
02222
10332
10332
10332
02222
BlPortU
Blue LightBlue grey white
22222
23332
23332
20002
01110
BlPortD
Blue LightBlue Grey White
01110
20002
23332
23332
22222
BlPortL
Blue LightBlue Gray White
22220
23301
23301
23301
22220
BlPortR
Blue LightBlue gray white
02222
10332
10332
10332
02222
(Lie is an indicator of a seperate circuit for buttons and doors and rotating walls. It's ALSO a cake, but that's a secret.)
Lie
Brown lightbrown White Red
..3..
22222
00000
11111
00000
=======
LEGEND
=======
Player = ChellU or ChellD or ChellR or ChellL
Shot = ShotU or ShotD or ShotL or ShotR
OrangePortal = OrPortU or OrPortD or OrPortR or OrPortL
BluePortal = BlPortU or BlPortD or BlPortR or BlPortL
Portal = OrangePortal or BluePortal
(Friggin' directions man. Need a lot of them)
UPortal = OrPortU or BlPortU
DPortal = OrPortD or BlPortD
RPortal = OrPortR or BlPortR
LPortal = OrPortL or BlPortL
HPortal = RPortal or Lportal
VPortal = UPortal or DPortal
NotUPortal = DPortal or RPortal or LPortal
NotDPortal = UPortal or RPortal or LPortal
NotRPortal = Uportal or DPortal or LPortal
NotLPortal = Uportal or RPortal or DPortal
Solid = Crate or Metal or Door or Player or Sentry
LaserBlock = Crate or Metal or Door or Sentry or Wall or Portal
Fizzler = Crate or Sentry
(Laser directions!)
Laser = LaserH or LaserV
HSent = Sentry or LaserH
VSent = Sentry or LaserV
SentL = sentry and ShotL
SentR = Sentry and ShotR
SentU = Sentry and ShotU
SentD = Sentry and ShotD
SentA = Sentry and BlueShot
SentShot = Shot or BlueShot
Shootable = WeighedButton or NextShotBlue
ButtonAlt = Button and Lie
DoorAlt = Door and Lie
DoorOpenAlt = DoorOpen and Lie
WeighedButtonAlt = WeighedButton and Blueshot
Anything = LaserBlock or DoorOpen or Laser or Shot or Target or Button or BlueShot
Cake = Lie
(
Old Legend. Will delete in time.
. = Background
# = Wall
M = Metal
P = ChellD
* = Crate
@ = Crate and WeighedButton
D = Door
B = Button
O = Target and NextShotBlue
Q = Target
! = Lie
H = Hole
1 = OrPortD
2 = BlPortR
S = Sentry and shotl
N = button and metal
W = sentry and shotd
A = Sentry and ShotR
U = Sentry and ShotU
L = sentry and BlueShot
0 = sentry
G = nextshotblue
? = metal and dooropen
: = Metal and dooropen and lie
6 = DoorAlt
7 = ButtonAlt
)
(Okay legend-readers, here's the breakdown. Some of this is self-explainatory... a door is a door and a crate is a crate. But the constant use and re-use of elements makes this a little complex. SO:
Background is Background. Wall is the surface which can take portals. Metal is the wall-like surface which cannot. A hole is a hole. This is easy stuff.
Chell is the player character, and the letter indicates the direction she faces. I have yet to see a good reason to make that anything besides down, but whatever.
Crate is your Weighted Storage Cube, and if there's WeighedButton below it that just means that, well, it starts the level atop a button. A Door is a Door and a Button is a Button, and Metal and DoorOpen together indicate rotating walls; they are metal until the buttons are pressed, at which point they become white walls.
Metal with a button behind it indicates the laser target. Acts like a button when a laser hits it.
Then there's the "Lie Circuit." It's a second, visually-identical class of buttons, doors, and rotating walls, but with tokens hidden behind them; usually it's the "lie" token, but sometimes others sub in, like the BlueShot under the weighedbutton. These work the same as the normal doors and buttons, but it means that you can have two doors or groups of doors to play with, not just the one. There is NO LASER TARGET for the lie circuit!
Okay then. Target is the exit point. When it's by itself, it means you CANNOT use portals on this level. Otherwise, with NextShotBlue it means you start by firing blue portals, and with WeighedButton means you'll start with orange. I don't know if there's a good reason to choose, I always pick blue.
There are options to start the level with portals already in place. If you don't use one of every color, weirdness creeps in. I'm not sure how it works with solids exactly, but it is a pretty cool way to multiply lasers. Still, I recommend you not do it.
Sentries fire lasers. The Shot which is with them indicates the direction they'll be firing. BlueShot means they fire in all cardinal directions, which is... eh. It's useful, I guess, if you want to create an enemy that cannot be directly approached. You might also want to add a dead sentry, I guess, if you want something that blocks lasers and holds doors, can be pushed around by crates, but can't press buttons or laser targets. Whatever floats your boat.
NextShotBlue by itself is the fizzler field, through which you may pass, but other objects and portal shots cannot. It even turns off your portals when you pass through it. Oh, but it CANNOT be placed over holes. It's a collision layers thing. It CAN have lasers passing through it, though, if you want to make it physically impassible as well.
Then there's Lie by itself. That makes a cake. It's silly, but I thought that it deserved to be there. At the moment it is unused.)
. = Background
# = Wall
M = Metal
H = Hole
Y = ChellU
I = ChellR
U = ChellL
P = ChellD
* = Crate
_ = Crate and WeighedButton
[ = Door
] = Button
/ = Metal and DoorOpen
\ = Metal and Button
(The Lie Circuit)
+ = Crate and WeighedButton and BlueShot
{ = Door and Lie
} = Button and Lie
? = Metal and DoorOpen and Lie
O = Target and NextShotBlue
C = Target and WeighedButton
Q = Target
1 = OrPortD
2 = OrPortR
3 = OrPortU
4 = OrPortD
5 = BlPortD
6 = BlPortR
7 = BlPortU
8 = BlPortL
A = Sentry and shotl
S = sentry and shotd
D = Sentry and ShotR
W = Sentry and ShotU
X = sentry and BlueShot
z = Sentry
F = nextshotblue
! = Lie
=======
SOUNDS
=======
sfx0 89899302
sfx1 63061703
sfx5 87522305
sfx4 65312101
sfx2 39997307
EndLevel 70025105
sfx3 54287301
sfx6 34176303
sfx7 89833904
sfx8 90043108
================
COLLISIONLAYERS
================
Background
WeighedButton, NextShotBlue, hole, cake
target, Button, DoorOpen,
Shot,Portal,
BlueShot, laserv
Player, Wall, Crate, Metal, Door, sentry, laserh
======
RULES
======
(Let's start with an easy one. Which way are you facing?)
[right Player] -> [right ChellR]
[left Player] -> [left ChellL]
[up Player] -> [up ChellU]
[down Player] -> [down ChellD]
(Shooting Portals. Note that the Target is the holding place for your next portal color; due to object limits, "WeightedButton" is the signifier for an orange portal. Technically it's not required, but it allows the target to also display the next portal color, which is pretty keen.)
(Note that when you shoot a portal onto a surface that already has a portal, it fizzles out and no new portal is created. This is arbitrary; I could have let the new one take over, in which case every instance of [Shot | Portal ] -> [ | portal] should be turned into [Shot | Portal -> [ shot | wall].
This is both more in keeping with the original game and less unfair to experimenting players who might find themselves suddenly losing a portal they thought they had. )
(The nature of the engine means that you cannot have two portals on one square of wall, even on opposite sides. That's just what it is, man.)
(I'm also not 100% sure of the necessity of all those randoms for animation, but whatever, it's working. It'll buff out.)
[action player nextshotblue ] -> cancel (You can't fire on the fizzler!)
[action ChellD ] [Target shootable ] -> [ChellD ShotD] [Target shootable] sfx4
random down [ ShotD no sentry| Solid ] -> [ | Solid]
random down [ShotD no sentry| Portal ] -> [ | Portal]
random down [ ShotD no sentry| Wall ] [target WeighedButton] [OrangePortal] -> [ | OrPortD wall] [target NextShotBlue] [wall]
random down [ShotD no sentry| Wall ] [ target NextShotBlue] [BluePortal] -> [ | BlPortD wall ] [target WeighedButton] [wall]
random down [ ShotD no sentry| Wall ] [target WeighedButton] -> [ | OrPortD wall ] [target NextShotBlue]
random down [ShotD no sentry| Wall ] [target NextShotBlue] -> [ |BlPortD wall ] [target WeighedButton]
random down [ ShotD no sentry | no Solid ] -> [ | ShotD ] again
[action ChellU ] [Target Shootable ] -> [ChellU ShotU] [Target Shootable] sfx4
random up [ ShotU no sentry| Solid ] -> [ | Solid]
random up [ShotU no sentry| Portal ] -> [ | Portal]
random up [ ShotU no sentry| Wall ] [target WeighedButton] [OrangePortal] -> [ | OrPortU wall ] [target NextShotBlue] [wall]
random up [ShotU no sentry| Wall ] [target NextShotBlue] [BluePortal] -> [ | BlPortU wall ] [Target WeighedButton] [wall]
random up [ ShotU no sentry | Wall ] [target WeighedButton] -> [ | OrPortU wall ] [target NextShotBlue]
random up [ShotU no sentry| Wall ] [target NextShotBlue] -> [ | BlPortU wall ] [target WeighedButton]
random up [ ShotU no sentry| no Solid ] -> [ | ShotU ] again
[action ChellR ] [Target Shootable ] -> [ChellR ShotR] [Target Shootable] sfx4
random right [ ShotR no sentry| Solid ] -> [ | Solid]
random right [ShotR no sentry| Portal ] -> [ | Portal]
random right [ ShotR no sentry| Wall ] [Target WeighedButton] [OrangePortal]-> [ | OrPortR wall ] [Target NextShotBlue] [Wall]
random right [ShotR no sentry| Wall ] [target NextShotBlue] [BluePortal] -> [ |BlPortR wall ] [target WeighedButton] [Wall]
random right [ ShotR no sentry| Wall ] [target WeighedButton] -> [ | OrPortR wall ] [Target NextShotBlue]
random right [ShotR no sentry| Wall ] [Target NextShotBlue] -> [ | BlPortR wall ] [Target WeighedButton]
random Right [ ShotR no sentry| no Solid ] -> [ | ShotR ] again
[action ChellL ] [Target Shootable ] -> [ChellL ShotL] [Target Shootable]sfx4
random left [ ShotL no sentry| Solid ] -> [ | Solid]
random left [ShotL no sentry| Portal ] -> [ | Portal]
random left [ ShotL no sentry| Wall ] [Target WeighedButton] [OrangePortal] -> [ | OrPortL wall ] [Target NextShotBlue] [wall]
random left [ShotL no sentry| Wall ] [Target NextShotBlue] [BluePortal]-> [ | BlPortL wall ] [Target WeighedButton][Wall]
random left [ ShotL no sentry| Wall ] [Target WeighedButton] -> [ | OrPortL wall ] [Target NextShotBlue]
random left [ShotL no sentry| Wall ] [Target NextShotBlue] -> [ | BlPortL wall ] [Target WeighedButton]
random left [ ShotL no sentry| no Solid ] -> [ | ShotL ] again
late [portal wall cake] -> [portal cake]
late [portal wall] -> [portal]
(Basic crate and sentry movements. Sentries are a bit more complex because they have to keep their hidden token with them, and it has to not go wandering away.)
[ > Player | Crate ] -> [ > Player | > Crate ]
[ > Player | Sentry ] -> [ > Player | > Sentry ]
[> Crate | Sentry ] -> [ > Crate | > Sentry]
[ > Sentry Sentshot| laserblock] -> [Sentry Sentshot | Laserblock]
[ > Sentry SentShot ] -> [> Sentry > SentShot ]
(Portals can only be entered from one side.)
down [ > solid | NotDPortal] -> [solid | NotDPortal]
up [ > solid | NotUPortal] -> [solid | NotUPortal]
right [ > solid | NotRPortal] -> [solid | NotRPortal]
left [ > solid | NotLPortal] -> [solid | NotLPortal]
(Orange Portal leads to Blue Portal. Note that the target is temporary storage space for the shot which tells the sentry which way it's facing.)
[> Solid | Orangeportal] [Blueportal] -> [ | Orangeportal] [Solid Blueportal]
[ > Player | Sentry SentShot | Orangeportal] [target] [BluePortal] -> [ | Player | Orangeportal ] [target Sentshot] [ BluePortal Sentry ]
[> Player | > Crate | Sentry Sentshot | Orangeportal][target][Blueportal] -> [|Player|Crate|Orangeportal][target Sentshot][blueportal sentry]
(Then the blue portal spits out whatever it's holding onto)
[Solid BlPortU] -> [down solid BlPortU] sfx5
[Solid BlPortD] -> [up solid BlPortD] sfx5
[Solid BlPortR] -> [left solid BlPortR] sfx5
[Solid BlPortL] -> [right solid BlPortL] sfx5
(...and Blue Portal leads to Orange Portal, orange portal spits, and we plop the secret shot back on the sentry.)
[> solid | Blueportal] [Orangeportal] -> [ | Blueportal] [solid Orangeportal]
[ > Player | Sentry SentShot | Blueportal] [target] [OrangePortal] -> [ | Player | Blueportal ] [target Sentshot] [ OrangePortal Sentry]
[> Player | > Crate | Sentry Sentshot | Blueportal][target][Orangeportal] -> [|Player|Crate|Blueportal][target Sentshot][Orangeportal sentry]
[Solid orPortU] -> [down solid OrPortU] sfx5
[Solid OrPortD] -> [up solid OrPortD] sfx5
[Solid ORPortR] -> [left solid OrPortR] sfx5
[Solid OrPortL] -> [right solid OrPortL] sfx5
late [ target Sentshot ] [sentry no shot no portal ] -> [ target] [ sentry Sentshot]
(Here we give everything one last chance to clear out. Anything still in there, cancel the whole darn affair!)
[ > Player | Crate ] -> [ > Player | > Crate ]
[ > Player | Sentry | no laserblock] -> [ > Player | > Sentry |]
[> Crate | Sentry | no laserblock] -> [ > Crate | > Sentry| ]
[ > Sentry SentShot] -> [> Sentry > SentShot ]
late [solid portal] -> cancel
(Now that everyone's done moving, which way is Chell facing again?)
[right Player] -> [right ChellR]
[left Player] -> [left ChellL]
[up Player] -> [up ChellU]
[down Player] -> [down ChellD]
(Dealing with the sentries and their line of sight/laser things. They are hiding a portal bullet/blast/whatever which tells them which way they are facing! Take that, object limits! Anyway, lasers beget lasers infinitely. A BlueShot sentry shoots in all directions. This is occasionally useful.)
(But first, let's make sure that sentries caught in the fizzler don't shoot lasers.)
late [SentShot nextshotblue no target] -> [nextshotblue]
late [sentry nextshotblue] -> [nextshotblue]sfx1
late [laser ] -> []
[ > LaserBlock | laser ] -> [ > LaserBlock | ]
late [player | SentA] -> [ | SentA] sfx3
late horizontal [ sentry BlueShot no portal | no laserblock] -> [sentry BlueShot | laserH]
late vertical [sentry BlueShot no portal | no laserblock] -> [sentry BlueShot | laserv]
(Because the player and the horizontal laser are on the same layer, it takes a little fussing to get the "I died!" sound right, hence anything with an sfx3)
late left [player | sentR ] -> [ | sentR ] sfx3
late right [player | sentL ] -> [ | sentL ] sfx3
late right [ Sentry ShotR no portal| no LaserBlock ] -> [Sentry ShotR| laserH ]
late left [ Sentry ShotL no portal| no LaserBlock ] -> [Sentry ShotL| laserH ]
late horizontal [laserH no portal | no LaserBlock] -> [laserH | laserH ]
+ late horizontal [player | laserh ] -> [ | laserh ] sfx3
late Up [ Sentry ShotU no portal| no LaserBlock ] -> [Sentry ShotU| laserV ]
late down [ Sentry ShotD no portal| no LaserBlock ] -> [Sentry ShotD| laserV ]
late vertical [laserV no portal| no LaserBlock] -> [laserV | laserV ]
( They see though portals! That was obnoxious to get working, but it was worth it. If there's a laser, oriented the right way, outside the mouth of a portal, the portal takes it. If there's another portal, the laser is reoriented and put in it. If a portal contains a laser, it spits it out. Don't forget to kill the player if they're at the mouth of a horizontal portal!)
late down [sentd | Dportal] -> [sentd | DPortal LaserV]
late up [SentU| Uportal] -> [SentU| Uportal LaserV]
late left [SentL| Lportal] -> [SentL | LPortal LaserH]
late right [SentR | Rportal ] -> [SentR | Rportal LaserH]
late down [sentA | Dportal] -> [sentA | DPortal LaserV]
late up [SentA| Uportal] -> [SentA| Uportal LaserV]
late left [SentA| Lportal] -> [SentA | LPortal LaserH]
late right [SentA | Rportal ] -> [SentA | Rportal LaserH]
late down [LaserV | Dportal] -> [LaserV | DPortal LaserV]
late up [LaserV| Uportal] -> [LaserV| Uportal LaserV]
late left [LaserH| Lportal] -> [LaserH | LPortal LaserH]
late right [LaserH | Rportal ] -> [LaserH | Rportal LaserH]
late [Laser Portal] [HPortal no LaserH] -> [Laser Portal] [ HPortal LaserH]
late [Laser Portal] [VPortal no LaserV] -> [Laser Portal] [VPortal LaserV]
late right [player | Rportal LaserH ] -> [ | Rportal LaserH ] sfx3
late left [player | LPortal LaserH ] -> [ | LPortal LaserH ] sfx3
late up [Dportal LaserV | no LaserBlock] -> [DPortal | LaserV]
late down [Uportal LaserV | no LaserBlock] -> [UPortal | LaserV]
late right [Lportal LaserH | no LaserBlock] -> [LPortal | LaserH]
late left [Rportal LaserH | no LaserBlock] -> [RPortal | LaserH]
(Then kill the lasers within the portal. I like keeping my portals clean.)
late [laser portal] -> [portal]
(Then we repeat the basic "Fling your laser" rules, so they take place post-portalling)
late horizontal [laserH no portal | no LaserBlock] -> [laserH | laserH ]
+ late horizontal [player | laserh no portal] -> [ | laserh ] sfx3
late vertical [laserV no portal| no LaserBlock] -> [laserV | laserV ]
(Buttons, as a brief interlude to laser. Don't worry lasers, we'll be back!)
(If you hide a button behind a metal wall, because why wouldn't you try to do that, it becomes a wall target, which lasers can open up. I know, rightly speaking sentries fire bullets and lasers are another thing, but friggin' whatever, man. OBJECT LIMITS.)
late [metal button nextshotblue] -> [metal button]
late [metal weighedbutton ] -> [metal button nextshotblue]
late left [metal button nextshotblue | Sentr ] -> [Metal WeighedButton | sentr]
late right [metal button nextshotblue| Sentl ] -> [Metal WeighedButton | sentl]
late down [metal button nextshotblue| Sentu ] -> [Metal WeighedButton | sentu]
late up [metal button nextshotblue| Sentd ] -> [Metal WeighedButton | sentd]
late [metal button nextshotblue| SentA] -> [Metal WeighedButton | SentA]
late Horizontal [Metal Button nextshotblue| LaserH ] -> [Metal WeighedButton | LaserH]
late Vertical [Metal Button nextshotblue| LaserV ] -> [Metal WeighedButton | LaserV]
late left [metal button no nextshotblue | Sentr ] -> [Metal WeighedButton | sentr] sfx6
late right [metal button no nextshotblue| Sentl ] -> [Metal WeighedButton | sentl] sfx6
late down [metal button no nextshotblue| Sentu ] -> [Metal WeighedButton | sentu] sfx6
late up [metal button no nextshotblue| Sentd ] -> [Metal WeighedButton | sentd]sfx6
late [metal button no nextshotblue| SentA] -> [Metal WeighedButton | SentA] sfx6
late Horizontal [Metal Button no nextshotblue| LaserH ] -> [Metal WeighedButton | LaserH] sfx6
late Vertical [Metal Button no nextshotblue| LaserV ] -> [Metal WeighedButton | LaserV] sfx6
(There are two flavors of buttons; the alternate circuit uses Lie and Blueshot at tokens, depending on the layer it has to be at. In every instance, we check for the alt cicuit first, then the main one)
late [ crate button lie ] -> [crate WeighedButton blueshot]
late [ Crate Button no Lie] -> [ crate WeighedButton]
late [WeighedButton blueshot no target no crate no metal no dooropen] -> [Button lie]
late [WeighedButton no blueshot no target no crate no metal no dooropen] -> [Button]
(Every turn we open all the doors, then close the ones who have buttons that aren't being pressed by players on their circuit.)
late [Door lie] -> [DoorOpen hole]
late [door ] -> [dooropen ]
(Note the "no solid" here. Means you can hold a door open with a crate, then run through after it!)
late [DoorOpen lie no solid] [Button lie no Player] -> [Door lie] [Button lie]
late [DoorOpen Hole no solid] [Button lie no Player] -> [Door lie] [Button lie]
late [DoorOpen hole no metal] ->sfx7
late [dooropen hole] -> [DoorOpen lie]
late [DoorOpen no lie no hole no solid ] [Button no player no lie] -> [Door ] [Button ]
late [DoorOpen no lie no weighedbutton no metal] -> sfx7
late [dooropen no lie] -> [dooropen weighedbutton]
(Okay, so there is marked metal which is turned into a marked wall, then turned back if there are unpressed buttons. It's the same basic notion as the doors. Also have a "Lie" circuit! )
late [DoorOpen Metal Lie] -> [Wall nextshotblue target]
late [dooropen metal no target] -> [wall NextShotBlue]
late [Wall nextshotblue target] [Button Lie no Player ] -> [Metal DoorOpen Lie] [Button Lie]
late [Portal nextshotblue target] [Button Lie no Player] -> [Metal DoorOpen Lie] [Button Lie]
late [Wall hole target] [Button Lie no Player ] -> [Metal DoorOpen Lie] [Button Lie]
late [Portal hole target] [Button Lie no Player] -> [Metal DoorOpen Lie] [Button Lie]
late [wall nextshotblue target] -> sfx8
late [wall nextshotblue target] -> [wall hole target]
late [wall NextShotBlue no target ] [button no player no cake] -> [metal dooropen] [ button]
late [portal NextShotBlue no target ] [button no player no cake] -> [metal dooropen] [button]
late [Wall hole no target] [Button no Lie no Player ] -> [Metal DoorOpen ] [Button]
late [Portal hole no target] [Button no Lie no Player] -> [Metal DoorOpen ] [Button ]
late [wall nextshotblue no target] -> sfx8
late [wall nextshotblue no target] -> [wall hole ]
(Then we repeat the rules for sentries and lasers AGAIN to deal with opening and closing doors! OY! ANYWAY, once a door has been opened, sentries may fire again. Since sentries can open doors, we have to copy most of this stuff over. Since there is only one circuit for laser targets, we don't have to repeat that; targets can't get any more lasered than they already are at this point.)
late [laser ] -> []
late horizontal [ sentry blueshot no portal | no laserblock] -> [sentry blueshot| laserH]
late vertical [sentry blueshot no portal | no laserblock] -> [sentry blueshot| laserv]
late right [ Sentry ShotR no portal| no LaserBlock ] -> [Sentry ShotR| laserH ]
late left [ Sentry ShotL no portal| no LaserBlock ] -> [Sentry ShotL| laserH ]
late horizontal [laserH no portal | no LaserBlock] -> [laserH | laserH ]
+ late horizontal [player | laserh ] -> [ | laserh ] sfx3
late Up [ Sentry ShotU no portal| no LaserBlock ] -> [Sentry ShotU| laserV ]
late down [ Sentry ShotD no portal| no LaserBlock ] -> [Sentry ShotD| laserV ]
late vertical [laserV no portal| no LaserBlock] -> [laserV | laserV ]
late down [sentd | Dportal] -> [sentd | DPortal LaserV]
late up [SentU| Uportal] -> [SentU| Uportal LaserV]
late left [SentL| Lportal] -> [SentL | LPortal LaserH]
late right [SentR | Rportal ] -> [SentR | Rportal LaserH]
late down [LaserV | Dportal] -> [LaserV | DPortal LaserV]
late up [LaserV| Uportal] -> [LaserV| Uportal LaserV]
late left [LaserH| Lportal] -> [LaserH | LPortal LaserH]
late right [LaserH | Rportal ] -> [LaserH | Rportal LaserH]
late [Laser Portal] [HPortal no LaserH] -> [Laser Portal] [ HPortal LaserH]
late [Laser Portal] [VPortal no LaserV] -> [Laser Portal] [VPortal LaserV]
late up [Dportal LaserV | no LaserBlock] -> [DPortal | LaserV]
late down [Uportal LaserV | no LaserBlock] -> [UPortal | LaserV]
late right [Lportal LaserH | no LaserBlock] -> [LPortal | LaserH]
late left [Rportal LaserH | no LaserBlock] -> [RPortal | LaserH]
late horizontal [laserH no portal | no LaserBlock] -> [laserH | laserH ]
+ late horizontal [player | laserh ] -> [ | laserh ] sfx3
late vertical [laserV no portal| no LaserBlock] -> [laserV | laserV ]
late [portal laser] -> [portal]
late horizontal [player | laserh ] -> [ | laserh ] sfx3
(Okay, after that mess, here's an easy bit: When does stuff get destroyed?)
[> player | laser] -> [ | laser ] sfx3
late [ Player laserv ] -> [ Laserv ] sfx3
late horizontal[ Player | laserH ] -> [ | LaserH] sfx3
Late Vertical [ Player | laserV ] -> [ | LaserV] sfx3
late [shot nextshotblue no target] -> [nextshotblue]
late [fizzler nextshotblue ] -> [nextshotblue]sfx1
late [player nextshotblue no target] [portal] -> [player nextshotblue] [wall] sfx1
[ > crate | target ] -> [ |target] sfx1
[ > Sentry > Shot | Target] -> [ | Target ] sfx1
[> Sentry > shot| hole ] -> [ | hole ] sfx0
[> solid | hole no wall] -> [ | hole ] sfx0
(Finally, the blue shot is just an object that lives on top of the orange one. Saved me three objects, that did.)
[Shot no sentry no target] [target NextShotBlue] -> [Shot BlueShot] [target NextShotBlue]
late [BlueShot no Shot no crate no sentry] -> [ ]
(This is how you win!)
late [player target nextshotblue no portal] -> [player lie ]
late [player target weighedbutton no portal] -> [player lie]
late [player target] -> [player lie]
late [ Player Lie no anything] -> [ Player] win
==============
WINCONDITIONS
==============
=======
LEVELS
=======
Message Hello and, again, welcome to the Aperture Science Sokoban Testing Initiative. We thank you for your involuntary contribution to this scientific endeavor.
Message In this test, you will notice Aperture Science Sokoban Crates between you and the Level Evacuation Terminal. Please, push these crates, then enter the Level Evacuation Terminal.
Message If necessary, you may insert Aperture Science Sokoban Crates into the Level Evacuation Terminal. It is perfectly safe. Everything that passes through the Level Evacuation Terminal will be disposed of humanely.
.##########
.#.....#..#
##....*#..#
#p...**..Q#
##....*#..#
.##########
Message Well done [Test Subject]! Remember, Aperture Science Sokoban Crates are meant to be used in conjunction with the Floor-Mounted Safety Buttons.
Message Please note: The Aperture Science Sokoban Crate is not a crate. Do not attempt to open your Aperture Science Sokoban Crate. There is nothing in there for you.
.#####....
##.Q.##...
##...##...
###[######
#........#
#..]..*.p#
##########
Message Your Aperture Science Handheld Portal Device is currently [INACTIVE]. Beginning Aperture Science Handheld Portal Device Warmup Sequence.
Message When active, your Aperture Science Handheld Portal Device will create quantum-linked portals, juxtaposing distant points in space. Though disorienting, these portals are no less safe than pan-dimensionally teleporting via an unstable wormhole created with experimental technology.
#########
#.....P.#
#..]....6
#.......#
#########
#..#....#
#..#.*..#
#Q.[....#
######1##
Message Some test subjects report feeling a burning sensation when passing through these linked portals. Aperture Science takes test subject safety very seriously.
Message If you feel a burning sensation when passing through these linked portals, please do not report feeling a burning sensation when passing through these linked portals.
Message This next chamber features Convenient Science Pits. Be very careful, as these pits are incredibly convenient.
##########3##
#hh]hhhh#...#
#hh.hhhh#.*.#
#hh.hhhh#***#
#hh.hhhh#hhh#
#.......#####
#.._....[...#
#....p..#..Q#
###5#########
Message Congratulations, your Aperture Science Handheld Portal Device is now active! Caution: do not drop, jostle, immerse, dismantle, or lick your Aperture Science Handheld Portal Device.
Message Due to a shortage of triggering mechanisms, your Aperture Science Handheld Portal Device will automatically alternate blue and orange portal exits. Press X to fire a portal.
########
#....P.#
#......#
#......#
#HHHHHH#
#......#
#O.....#
########
Message Well done [Test Subject]. You licked less than--
Message ZERO POINT ZERO ONE PERCENT
Message --of your Aperture Science Handheld Portal Device.
#####........
#.O.#........
#...#........
###[#########
#.......#...#
#....]..[...#
#P......#.*.#
#.......#...#
#############
Message The Aperture Science Handheld Portal Device will not allow portals to form on metallic surfaces.
Message Any Test Subject attempting to circumvent this undesired safety feature will be fatally irradiated and terminated without references.
MM######
M......#
#*..]..#
#......#
#.##[###
#.#..H.#
#p#..Ho#
###mmm##
Message For your safety and convenience, some testing chambers have been supplied with fully-automated armed-response sentries.
Message Aperture Science cares about your safety. These sentries will respond to unsafe behavior with an Aperture Science Light-Based Censuring Beam. In rare cases, this can be fatal.
Message Please note that risking a potentially-fatal Light-Based Censuring Beam is considered to be unacceptably unsafe behavior.
###########
#p........#
#mmhhhhhhm#
#.[......]#
#.######mm#
#.......#O#
#...._..[.#
#.w.....#.#
###########
Message Automated sentries are both unable and unwilling to depress Aperture Science Floor-Mounted Safety Buttons. They can, however, be pushed by Aperture Science Sokoban Crates.
Message If a sentry inquires as to the crate's contents, Test Subjects are required to politely inform the sentries that Aperture Science Sokoban Crates are not crates, do not contain anything, and knowledge of their contents is proprietary.
###########
#...m...p.#
#...mm..mm#
#.+.{h..ao#
#...mm..mm#
#...[....]#
###########
Message Technological advances have allowed Aperture Science to create an automated sentry with perfect situational awareness, capable of dispensing Light-Based Censuring in all directions.
Message Please note: If you feel unfairly persecuted by the automated sentry, please do not hesitate to recall which one of you displays perfect situational awareness, and which one is made of meat and sweat.
(By Kalev:)
mmmmmmmmmmm
mmm##mmm.om
mp.*.*...#m
m.m..x...#m
m........#m
mmm##mm..mm
mmmmmmmmmmm
Message Testing procedure mandates that test subjects be presented with verbal encouragement at this point in the test, regardless of performance. Dispensing verbal encouragement in 3, 2, 1:
Message You are doing great [Test Subject]. Yes you are. Who is a good test subject? [Test Subject] is a good test subject. We're not just saying that because it's mandated test procedure.
......m###m
####m.ms..m
#P..mmm.*.m
#d........m
#hh.......m
#hh.......m
#hh.d...m[m
#.]mm##.mom
##mm..##mmm
Message Please do not drop armed response sentries into the Convenient Science Pits.
Message Records now indicate that [Test Subject] has been reprimanded for waste of valuable Science-Related Material.
(By Kalev:)
mmmmmmmmmmmmmmm
mmmmmmmm...mmmm
mmm.##...].m.om
mmm.mm.m...m..m
m....m.mm.mm[mm
m.**....m.m...m
m....m#..p..].m
mmmmmmmmmmm...m
mmmmmmmmmmmmmmm
Message Aperture Science is not responsible if misconduct with the Material Emancipation Grill damages Aperture Science Sokoban Crates or their contents.
Message Aperture Science would also like to remind test subjects that Aperture Science Sokoban Crates are not crates and, in fact, have no contents.
#####mmmmm#####
#....f.*..s...#
#.p..f........#
#....f....hhhh/
#....f....H.../
#.]..{}...ho../
#....f....h.../
#....f....hhhh/
#....f........#
#...wf.*..w...#
#####mmmmm#####
Message In this test, you will find a Wall Mounted Safety Target. Safety Targets can be safely activated through safely applying 50 gigawatt laser beams.
Message Due to unexpected levels of safety in this test, Aperture Science is no longer monitoring the vital signs of Test Subjects.
.....#\#....
######.#####
#.....*.a].#
#..........#
#d.........#
#...#####[##
#...h...#.o#
#.p.h.*.#mmm
#...h...#...
#########...
Message Attention [Test Subject]: Health analysis subroutines are no longer registering your vital signes, indicating that you have died. In order to provide a clean and sanitary testing environment for the next test subject, please proceed to a nearby corner and decompose as rapidly as you are able.
Message Aperture Science appreciates your terminal commitment to this initiative.
(By Kalev:)
mmmmmmmmm
m...p...m
m..#.\]am
md.\.*..m
m.......m
mm##[##mm
...#o#...
...###...
Message Further analysis indicates that you are not dead, however, health monitoring subsystems cannot currently be reinitialized.
Message Though we cannot currently account for this error, early diagnostics indicate it may be related to that time when you pushed a sentry into a Convenient Science Pit.
(By Kalev:)
mmm...mmmmm
mommmmm...m
m[#m#..._.m
m..mm.mmmmm
m......m..m
m\..p..ma.m
#.........m
mmmmmmmmmmm
Message Well done, Test Subject! You have completed all available test chambers in
Message ERROR: TIMING SUBROUTINE NOT FOUND
Message seconds! That might be the fastest time on record.
Message Please return to your isolated comfort station while we prepare additional tests.
Message We are done for now, Test Subject, but not for good.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment