Skip to content

Instantly share code, notes, and snippets.

@sftrabbit
Created November 17, 2022 17:45
Show Gist options
  • Save sftrabbit/a628bde7413e83cf758e46fdf442fa32 to your computer and use it in GitHub Desktop.
Save sftrabbit/a628bde7413e83cf758e46fdf442fa32 to your computer and use it in GitHub Desktop.
Lab Rat-ional Thinking (Puzzlescript Plus Script)
Play this game by pasting the script in https://auroriax.github.io/PuzzleScript/editor.html
title Lab Rat-ional Thinking
author Thinky Collective
homepage www.puzzlescript.net
text_color #A297E2
background_color #1e2e3d
run_rules_on_level_start
( verbose_logging )
realtime_interval 0.1
mouse_left click
mouse_drag drag
level_select
(DEV LOG)
(#0, Ethan: Made seed project)
(BRANCH B LOG)
(#1, Norgg:
Changed rotate sprite
Add forking, level requiring it and unit test
Change victory condition so all agents need to be on open holes
Stop agents who are on open holes from moving
Add stopped and paused state markers
Disable being able to place pieces while paused, with sound effect
)
(#2, jackk:
made forked agents turn into two actual agents on the fork tile, so they can interact with placeables that are adjacent to the fork.
agents that enter the same tile turn into blocks.
noted weird behavior when an agent moves into a tile that another agent is moving out of, added todo and failing unit test for it.
made level using merge-into-block mechanic.
)
(#3, Joel:
Added explosive tiles that attach an explosive to agents moving on top of them, which will detonate in 5 turns, destroying all blocks, agents, and tiles that are orthogonally adjacent. I even used the same sprite as in Conveyor Con-fusion, how original.
Added a level using explosives, it is small but hard.
Reworked the code quite a lot so that multiple agents interact with eachother properly. In hindsight I should have manually implemented the puzzlescript movement step, it would have been simpler than my mockery of an algorithm. Also fixed a merge bug that Ethan noticed.
Currently the explosive timers are overlaid on the agents, which looks a bit ugly. One could change the way explosives are coded to make custom sprites for each agent direction + timer. I probably should have done this, it wouldn't be as cumbersome as I first thought)
(#4, Marcos:
Added the mirror tile and a very simple level illustrating its use.)
(#5, Beekie:
Inserted a level about timing two agents. I messed around with colors for a while, attempting to create a theme about redirecting a "spell bolt" with glyphs, but couldn't make it work, so I left things as they were.)
(#6, Plurmorant:
Added another merge level to clarify a few ineractions.)
(#7, max:
Simplified the code a bit and removed the agent_2 stuff.
Added a level intended to introduce the merge mechanic.)
(BRANCH B2 LOG)
(#1, PleasingFungus:
Added a cheese tile and a level for it. (The level ended up more complicated than I intended.)
Cheese is intended to be sometimes an obstacle & sometimes something that's useful to bounce your agent off of.
Spent a while trying to prevent the player moving the cursor while in 'play' mode and/or making those moves not
add to the undo stack, since i wasted a ton of time accidentally trying to edit while in play & then slowly undoing
out, but failed. Hopefully someone better at Puzzlescript than I can succeed.)
(#2, JL:
Added a level and fixed a bug.)
(#3, CHz:
Added a level and fixed an error in Plurmorant's level.)
(#4, Corey Hardt:
Made a bunch of graphical additions and wrote a silly title.
Swapped out a lot of walls to give the pseudo-3D effect, reasaonbly sure I didn't break anything in the process.)
(#5, Pichusuperlover:
Couldnt beat any level so added a level to try and help those after me, also alternate solution police)
(#6, Neonesque:
Added a speed setting system, retroactively added it to every level
Made a level to introduce the speed settings and smooth out the difficulty curve)
(#7, Joseph Mansfield:
Added a level that's probably quite difficult (assuming the intended trick is necessary)
Some usability improvements:
- Blocks show when they're on top of a button
- Dashed line on wall makes it a bit easier to remember which way you'll turn when you hit the wall (this was the best I could come up with)
- UI elements are in the same place for every level
- Stop button resets level without removing placed tiles
- Trying to place a tile when paused resets the level
- Border indicates when playing/paused
Someone should make the agents/buttons/holes/cheese look nicer and match the 3D aesthetic
)
(#7.5, Ethan Clark:
-Joel wanted me to update their level with an updated version, so I did that.
-I added a failsafe in case a level has no speed settings and there's no "noSpeedSetting" object in the level
)
(#8, Foxbot:
-made things rat themed and updated title (I hope it's ok that I replaced corey's title)
-updated agent, cheese, block, button, and timer graphics with 3d effect
-added a level that's probably very broken but whatevs
explosion graphics could use some improvement
)
(#9 Alteffor:
Added another mirror level after the first. I hope its not too simple or too hard, but I'm terrible at judging these things
)
(#10 knexator:
- Made button bigger
- Added a vanilla level
)
(#11 jcgyo
- Added a merge level
- Added explosion sfx
)
(#12 Colin:
- Fixed bug where agents could walk through each other over a splitter
- Fixed bug where agents would revive if they blew up on an explosion tile
- Added easier intro bomb level
)
(#13 Icely:
- Added a vanilla level
- Added lots of placement/destroy sfx
)
(#14 LeavingLeaves:
- Added two alt solutions to the early levels
- Added a "forbidTile" on which nothing can be placed
- Added a level where uses the "forbidTile" as a constraint
)
(Karoo:
- Helping ethan with final polish even though I'm not on this branch
- Fixed blocks not having a top half and agent_u_top persisting sometimes
- Fixed several sprite layering cases
- Fixed merging happening while the sim is paused or slow speed
- Fixed forks not forking next to a button or hole in some orientations
- Explosions can no longer be exploded, and play their sound a step earlier
- Moved to ps+ and added mouse input, reworded relevant instructional text
- Added level select
- Reordered 2 levels
)
========
OBJECTS
========
(At present, pretty much every asset here can be considered placeholder)
Background .
#bddbed #a3cbe3
00000
00000
00100
00000
00000
BonusFloor
#a3cbe3
BonusFloor2
#d1e2ed
BonusFloor3
#749bb5
click
transparent
drag
transparent
prevClick_place
transparent
prevClick_remove
transparent
prevClick_selectObject
transparent
prevClick_selectSpeed
transparent
wall #
#385068
staticrender_wall_up
#385068 #425e7b
.....
.....
.....
.....
00011
staticrender_wall_front
#1b2632 #2c3d52 #425e7b
.....
.....
.....
22...
11000
staticrender_wall_right
#1b2632 #2c3d52 #425e7b
.....
.....
....2
....2
.....
staticrender_wall_left
#1b2632 #2c3d52 #425e7b
2....
.....
.....
.....
.....
staticrender_wall_left_top
#1b2632 #2c3d52 #425e7b
.....
.....
.....
.....
2....
render_block_on_button
#E83A27
..0..
.....
.....
.....
.....
button b
#E83A27 #B43A27
.000.
.000.
.000.
.111.
.....
render_button_top
#E83A27 #B43A27
.....
.....
.....
.....
.....
render_button_pressed
#E83A27 #B43A27
.....
.000.
.000.
.000.
.....
cursor
transparent
render_cursor
#EA30FF
00.00
0...0
.....
0...0
00.00
playButton
#5BB722 white #CEFFAD
02000
01200
01120
01200
02000
pauseButton
#5BB722 white
00000
01010
01010
01010
00000
resetButton
#b73b22 white
00000
01110
01110
01110
00000
resetButton_disabled
#584b56 #6a7c8e
00000
01110
01110
01110
00000
holeClose h
#60676B darkgray
11111
11111
00000
11111
11111
holeOpen
darkgray black #333
00000
12121
21212
12121
21212
selectedObject
transparent
render_NotSelectedTurn
#6a8aa2 #2f5273 #39648b
.000.
01120
01000
01100
.000.
render_NotSelectedMirror
#6a8aa2 #336747 #417f52
.000.
00200
02120
00200
.000.
render_NotSelectedFork
#6a8aa2 #48386f #5f468b
.000.
02120
00100
00100
.000.
render_NotSelectedBomb
#6a8aa2 #6e4651 #1e2a37
.000.
01110
01110
01120
.000.
timer5
transparent
timer4
transparent
timer3
transparent
timer2
transparent
timer1
transparent
render_timer
transparent
render_no_timer_u
pink black #BB3388
.....
0....
0.0..
200..
.22..
render_no_timer_d
pink black #BB3388
..0.0
....0
....2
.....
.....
render_no_timer_d_top
pink black #BB3388
.....
.....
.....
.....
..00.
render_no_timer_r
pink black #BB3388
0....
00...
2....
.....
.....
render_no_timer_r_top
pink black #BB3388
.....
.....
.....
.....
.00..
render_no_timer_l
pink black #BB3388
.....
...00
....0
..002
..22.
render_timer5_l
pink black #BB3388 orange lightbrown
.....
...00
....0
..402
..32.
render_timer4_l
pink black #BB3388 orange lightbrown grey darkgrey
.....
...00
....0
..542
..63.
render_timer3_l
pink black #BB3388 orange lightbrown grey darkgrey
.....
...00
....4
..553
..66.
render_timer2_l
pink black #BB3388 orange lightbrown grey darkgrey
.....
...04
....5
..556
..66.
render_timer1_l
pink black #BB3388 orange lightbrown grey darkgrey
.....
...45
....5
..556
..66.
render_timer5_u
pink black #BB3388 orange lightbrown
.....
4....
0.0..
200..
.22..
render_timer4_u
pink black #BB3388 orange lightbrown grey darkgrey
.....
5....
4.0..
300..
.22..
render_timer3_u
pink black #BB3388 orange lightbrown grey darkgrey
.....
5....
5.0..
640..
.32..
render_timer2_u
pink black #BB3388 orange lightbrown grey darkgrey
.....
5....
5.0..
654..
.63..
render_timer1_u
pink black #BB3388 orange lightbrown grey darkgrey
.....
5....
5.4..
655..
.66..
render_timer5_d
pink black #BB3388 orange lightbrown
..0.0
....4
....3
.....
.....
render_timer5_d_top
pink black #BB3388 orange lightbrown
.....
.....
.....
.....
..00.
render_timer4_d
pink black #BB3388 orange lightbrown grey darkgrey
..0.4
....5
....6
.....
.....
render_timer4_d_top
pink black #BB3388 orange lightbrown
.....
.....
.....
.....
..00.
render_timer3_d
pink black #BB3388 orange lightbrown grey darkgrey
..0.5
....5
....6
.....
.....
render_timer3_d_top
pink black #BB3388 orange lightbrown grey darkgrey
.....
.....
.....
.....
..04.
render_timer2_d
pink black #BB3388 orange lightbrown grey darkgrey
..0.5
....5
....6
.....
.....
render_timer2_d_top
pink black #BB3388 orange lightbrown grey darkgrey
.....
.....
.....
.....
..45.
render_timer1_d
pink black #BB3388 orange lightbrown grey darkgrey
..4.5
....5
....6
.....
.....
render_timer1_d_top
pink black #BB3388 orange lightbrown grey darkgrey
.....
.....
.....
.....
..55.
render_timer5_r
pink black #BB3388 orange lightbrown grey darkgrey
0....
00...
2....
.....
.....
render_timer5_r_top
pink black #BB3388 orange lightbrown grey darkgrey
.....
.....
.....
.....
.04..
render_timer4_r
pink black #BB3388 orange lightbrown grey darkgrey
0....
00...
2....
.....
.....
render_timer4_r_top
pink black #BB3388 orange lightbrown grey darkgrey
.....
.....
.....
.....
.45..
render_timer3_r
pink black #BB3388 orange lightbrown grey darkgrey
4....
00...
2....
.....
.....
render_timer3_r_top
pink black #BB3388 orange lightbrown grey darkgrey
.....
.....
.....
.....
.55..
render_timer2_r
pink black #BB3388 orange lightbrown grey darkgrey
5....
40...
3....
.....
.....
render_timer2_r_top
pink black #BB3388 orange lightbrown grey darkgrey
.....
.....
.....
.....
.55..
render_timer1_r
pink black #BB3388 orange lightbrown grey darkgrey
5....
54...
6....
.....
.....
render_timer1_r_top
pink black #BB3388 orange lightbrown grey darkgrey
.....
.....
.....
.....
.55..
timer1_next
transparent
timer2_next
transparent
timer3_next
transparent
timer4_next
transparent
timer5_next
transparent
explosion
red orange
10001
00000
00000
00000
10001
explosionAdjacent
orange
setup
transparent
doMove
transparent
turned
transparent
mirrored
transparent
didntmove
transparent
didntmove_openhole
transparent
playing
transparent
stopped ( Only exists in the initial level state, used to prevent placement while paused )
transparent
paused
transparent
selectionPalette
#385068
speedButton1
#225BB7 #FFFFFF
.000.
01000
00100
01000
.000.
speedButton2
#225BB7 #FFFFFF #DAE4F3
.000.
01200
00120
01200
.000.
speedButton3
#225BB7 #FFFFFF #DAE4F3 #B5C8E7
.000.
01230
00123
01230
.000.
noSpeedSettings
transparent
frame1
transparent
frame2
transparent
frame3
transparent
frame4
transparent
selectedSpeed
transparent
render_NotSelectedSpeedButton1
#38568b #96a2af
.000.
01000
00100
01000
.000.
render_NotSelectedSpeedButton2
#38568b #96a2af #8596a9
.000.
01200
00120
01200
.000.
render_NotSelectedSpeedButton3
#38568b #96a2af #8596a9 #7588a3
.000.
01230
00123
01230
.000.
speedPalette
#385068
do_reset
transparent
level_border +
#1e2e3d
staticrender_level_border_u
#15212c
.....
.....
.....
.....
00000
staticrender_level_border_ur
#15212c
.....
.....
.....
.....
0....
staticrender_level_border_r
#15212c
0....
0....
0....
0....
0....
staticrender_level_border_rd
#15212c
0....
.....
.....
.....
.....
staticrender_level_border_d
#15212c
00000
.....
.....
.....
.....
staticrender_level_border_dl
#15212c
....0
.....
.....
.....
.....
staticrender_level_border_l
#15212c
....0
....0
....0
....0
....0
staticrender_level_border_lu
#15212c
.....
.....
.....
.....
....0
staticrender_level_border_playing_u
#5BB722
.....
.....
.....
.....
00000
staticrender_level_border_playing_ur
#5BB722
.....
.....
.....
.....
0....
staticrender_level_border_playing_r
#5BB722
0....
0....
0....
0....
0....
staticrender_level_border_playing_rd
#5BB722
0....
.....
.....
.....
.....
staticrender_level_border_playing_d
#5BB722
00000
.....
.....
.....
.....
staticrender_level_border_playing_dl
#5BB722
....0
.....
.....
.....
.....
staticrender_level_border_playing_l
#5BB722
....0
....0
....0
....0
....0
staticrender_level_border_playing_lu
#5BB722
.....
.....
.....
.....
....0
(RESETABLES)
(Resetables are objects that can move or be removed from a level while it is playing - the red "stop" button resets these back into their original positions)
(To add a new resetable, make sure to:
- Create a corresponding transparent _startpos object
- Add your resetable object to the "resetable" property
- Add your _startpos object to the "resetable_startpos" property
- Add a rule to create the corresponding _startpos objects when the "play" button is first pressed
- Add a rule to recreate your resetable objects at their corresponding _startpos objects
Ctrl+F for "(RESETABLES)" to find every location you need to change something
)
agent_u u
#8827CE #A297E2 #EE66CC #BB3388 #222222
.111.
.111.
.111.
.000.
.....
render_agent_u_top
#8827CE #A297E2 #EE66CC #BB3388 #222222
.....
.....
.....
.....
.414.
(separating top and front helps the 3d effect look nicer, better layering)
render_agent_u_front
#8827CE #A297E2 #EE66CC #BB3388 #222222
.....
.....
.....
..2..
.....
agent_u_startpos
transparent
agent_r r
#8827CE #A297E2 pink #BB3388 #222222
.1114
.1111
.1114
.0000
.....
render_agent_r_front
#8827CE #A297E2 pink #BB3388 #222222
.....
2....
3....
.....
.....
agent_r_startpos
transparent
agent_d d
#8827CE #A297E2 pink #BB3388 #222222
.111.
.111.
.111.
.414.
.020.
render_agent_d_front
#8827CE #A297E2 pink #BB3388 #222222
..3..
.....
.....
.....
.....
agent_d_startpos
transparent
agent_l l
#8827CE #A297E2 pink #BB3388 #222222
4111.
1111.
4111.
0000.
.....
render_agent_l_front
#8827CE #A297E2 pink #BB3388 #222222
.....
....2
....3
.....
.....
agent_l_startpos
transparent
turnTile y
#a3cbe3 #24557f #3a80bc
.000.
01120
01000
01100
.000.
turnTile_startpos
transparent
mirrorTile n
#a3cbe3 #2e8121 #4bb33a
.000.
00200
02120
00200
.000.
mirrorTile_startpos
transparent
forkTile g
#a3cbe3 #612181 #9a39cc
.000.
02120
00100
00100
.000.
forkTile_startpos
transparent
explosiveTile e
#a3cbe3 red black
.000.
01110
01110
01120
.000.
explosive_startpos
transparent
cheese %
yellow darkblue lightblue #AAAA00
00003
3000.
00030
03000
3.333
render_cheese_top
yellow darkblue lightblue #AAAA00
.....
.....
.....
.....
.0.00
cheese_startpos
transparent
block o
#eb8931 #CE6529 #e08c41
.010.
.000.
.111.
.111.
.....
render_block_top
#eb8931 #CE6529 #e08c41
.....
.....
.....
.....
.000.
block_startpos
transparent
forbidTile -
#93B9CD #B2DCEF
.....
.0.0.
..0..
.0.0.
.....
sfx_DoorOpen
transparent
sfx_Mirror
transparent
sfx_Rotate
transparent
sfx_Fork
transparent
sfx_PlaceMirror
transparent
sfx_PlaceRotate
transparent
sfx_PlaceFork
transparent
sfx_PlaceBomb
transparent
sfx_Turn
transparent
marker_position
transparent
marker_visible_cursor
transparent
tutorial1
transparent
tutorial2
transparent
hiddenSelectionPalette
#385068
=======
LEGEND
=======
player = cursor
walls = wall
agent = Agent_r or Agent_d or Agent_l or Agent_u
timer = timer5 or timer4 or timer3 or timer2 or timer1
timerNext = timer5_next or timer4_next or timer3_next or timer2_next or timer1_next
moveable = block
hole = holeClose or holeOpen
(RESETABLES)
resetable = agent or block or cheese or explosiveTile or turnTile or mirrorTile or forkTile
(RESETABLES)
resetable_startpos = agent_u_startpos or agent_r_startpos or agent_d_startpos or agent_l_startpos or block_startpos or cheese_startpos or explosive_startpos or turnTile_startpos or mirrorTile_startpos or forkTile_startpos
forbidPlace = button or Agent or block or walls or hole or cheese or level_border or forbidTile
forbidFork = Agent or block or walls or cheese or level_border
preventMovement = walls or cheese or didntmove
C = button and block
S = setup and wall and marker_position
k = holeClose and block
(PLACEABLE DEFINITION)
placeable = turnTile or forkTile or explosiveTile or mirrorTile
explodable = agent or block or placeable or timer
(PALETTE DEFINITIONS)
t = turnTile and selectionPalette
f = forkTile and selectionPalette
x = explosiveTile and selectionPalette
m = mirrorTile and selectionPalette
(SPEED PALETTE DEFINITIONS)
1 = speedButton1 and speedPalette and wall
2 = speedButton2 and speedPalette and selectedSpeed and wall
3 = speedButton3 and speedPalette and wall
~ = noSpeedSettings and wall
! = speedButton1 and speedPalette and selectedSpeed and wall (For unit tests only)
¢ = speedButton2 and speedPalette and wall (For unit tests only)
£ = speedButton3 and speedPalette and selectedSpeed and wall (For unit tests only)
$ = wall and tutorial1
{ = tutorial2
} = turnTile and selectionPalette and hiddenSelectionPalette
w = Cheese and BonusFloor
z = Cheese and BonusFloor2
a = Cheese and BonusFloor3
speedSetting = speedButton1 or speedButton2 or speedButton3
frame = frame1 or frame2 or frame3 or frame4
active = playing or paused
sfx_ToRemove = sfx_Mirror or sfx_Rotate or sfx_Fork or sfx_PlaceMirror or sfx_PlaceRotate or sfx_PlaceFork or sfx_PlaceBomb or sfx_Turn
sfx = sfx_DoorOpen or sfx_ToRemove
render_NotSelected = render_NotSelectedTurn or render_NotSelectedMirror or render_NotSelectedFork or render_NotSelectedBomb or render_NotSelectedSpeedButton1 or render_NotSelectedSpeedButton2 or render_NotSelectedSpeedButton3
render = render_block_on_button or render_button_pressed or render_NotSelected
staticrender_level_border = staticrender_level_border_u or staticrender_level_border_ur or staticrender_level_border_r or staticrender_level_border_rd or staticrender_level_border_d or staticrender_level_border_dl or staticrender_level_border_l or staticrender_level_border_lu
staticrender_level_border_playing = staticrender_level_border_playing_u or staticrender_level_border_playing_ur or staticrender_level_border_playing_r or staticrender_level_border_playing_rd or staticrender_level_border_playing_d or staticrender_level_border_playing_dl or staticrender_level_border_playing_l or staticrender_level_border_playing_lu
prevClick = prevClick_place or prevClick_remove or prevClick_selectObject or prevClick_selectSpeed
=======
SOUNDS
=======
sfx0 83477704
sfx1 93764509
sfx2 28247703
sfx3 11208703
sfx4 2507306
sfx5 997506
sfx6 2966606
sfx7 77518100
sfx8 36223507
sfx9 42202107
explosion create 32404102
sfx_PlaceRotate create 57995101
sfx_PlaceMirror create 86491907
sfx_PlaceFork create 67218107
sfx_PlaceBomb create 68699502
cheese destroy 58552103
sfx_DoorOpen create 77882108
sfx_Rotate create 10461503
sfx_Mirror create 27949303
sfx_Fork create 13088503
sfx_Turn create 74795307
endlevel 6098303
================
COLLISIONLAYERS
================
Background
BonusFloor BonusFloor2 BonusFloor3
click drag
forbidTile
hole
selectionPalette speedPalette
button, turnTile, forkTile, explosiveTile, mirrorTile
render_button_pressed
Agent_r
Agent_d
Agent_l
Agent_u
render_no_timer_u
render_no_timer_d
render_no_timer_r
render_no_timer_l
render_agent_d_front
render_agent_r_front
render_agent_l_front
Wall, block, cheese, level_border
resetable_startpos
render_block_on_button
render_timer
render_timer5_u
render_timer4_u
render_timer3_u
render_timer2_u
render_timer1_u
render_timer5_l
render_timer4_l
render_timer3_l
render_timer2_l
render_timer1_l
render_timer5_d
render_timer4_d
render_timer3_d
render_timer2_d
render_timer1_d
render_timer5_r
render_timer4_r
render_timer3_r
render_timer2_r
render_timer1_r
render_agent_u_front
staticrender_wall_front
render_timer5_d_top
render_timer4_d_top
render_timer3_d_top
render_timer2_d_top
render_timer1_d_top
render_timer5_r_top
render_timer4_r_top
render_timer3_r_top
render_timer2_r_top
render_timer1_r_top
render_button_top
render_block_top
render_agent_u_top
staticrender_wall_right
staticrender_wall_left
staticrender_wall_left_top
render_no_timer_d_top
render_no_timer_r_top
render_cheese_top
timer, explosion, explosionAdjacent
do_reset
staticrender_wall_up
speedButton1, speedButton2, speedButton3, noSpeedSettings, staticrender_level_border staticrender_level_border_playing
selectedObject selectedSpeed
frame render_NotSelected
playing, stopped, paused
playButton, pauseButton, resetButton, resetButton_disabled
cursor
render_cursor
turned
mirrored
didntmove
didntmove_openhole
timerNext
doMove
marker_position
setup marker_visible_cursor
prevClick
sfx
tutorial1 tutorial2 hiddenSelectionPalette
======
RULES
======
[render] -> []
up [wall | no walls no selectionPalette no level_border] -> [wall | staticrender_wall_up]
down [wall | no walls no selectionPalette no level_border] -> [wall staticrender_wall_front |]
right [wall | no walls no selectionPalette no level_border] -> [wall staticrender_wall_right |]
left [wall | no walls no selectionPalette no level_border] -> [wall staticrender_wall_left |]
up [staticrender_wall_left | no staticrender_wall_left_top] -> [staticrender_wall_left | staticrender_wall_left_top]
up [ no level_border | level_border ] -> [ | level_border staticrender_level_border_u ]
right [ no level_border | level_border ] -> [ | level_border staticrender_level_border_r ]
down [ no level_border | level_border ] -> [ | level_border staticrender_level_border_d ]
left [ no level_border | level_border ] -> [ | level_border staticrender_level_border_l ]
left [ staticrender_level_border_u | no staticrender_level_border_u ] -> [ staticrender_level_border_u | staticrender_level_border_lu ]
right [ staticrender_level_border_u | no staticrender_level_border_u ] -> [ staticrender_level_border_u | staticrender_level_border_ur ]
left [ staticrender_level_border_d | no staticrender_level_border_d ] -> [ staticrender_level_border_d | staticrender_level_border_dl ]
right [ staticrender_level_border_d | no staticrender_level_border_d ] -> [ staticrender_level_border_d | staticrender_level_border_rd ]
(clear explosion graphics from previous turn)
[explosion] -> []
[explosionAdjacent] -> []
[ action cursor no marker_position ] [ marker_position no marker_visible_cursor ] -> [ ] [ marker_position action cursor ]
[ > cursor ] [ marker_position no marker_visible_cursor ] -> [ > cursor ] [ marker_position marker_visible_cursor ]
[ > cursor | level_border ] -> [ cursor | level_border ]
(check to see if we're on an AGAIN turn. This must be done before cursor actions.)
[doMove] -> []
[stationary cursor pauseButton] [Agent]-> [stationary cursor pauseButton] [doMove Agent]
(process speed setting)
[frame4] [speedButton1 selectedSpeed] -> [action frame4] [speedButton1 selectedSpeed]
[frame2] [speedButton2 selectedSpeed] -> [action frame2] [speedButton2 selectedSpeed]
[frame1] [speedButton3 selectedSpeed] -> [action frame1] [speedButton3 selectedSpeed]
[frame2] [noSpeedSettings] -> [action frame2] [noSpeedSettings]
[stationary frame] [doMove] -> [frame] []
[stationary frame3] -> [frame4]
[stationary frame2] -> [frame3]
[stationary frame1] -> [frame2]
[action frame] -> [frame1]
(run level setup)
right [setup|] -> [setup cursor playButton stopped|resetButton_disabled]
down [setup no selectedObject | ... | selectionPalette] -> [setup selectedObject | ... | selectionPalette selectedObject]
[setup selectedObject] -> [setup]
[setup] -> [setup noSpeedSettings] (spawn a noSpeedSettings if the level lacks speed settings)
[noSpeedSettings] [speedsetting] -> [] [speedsetting]
[setup] -> []
[click] [marker_position prevCLick] -> [click] [marker_position]
(mouse drag)
[marker_position prevClick_selectSpeed] [drag speedSetting no selectedSpeed] -> [marker_position prevClick_selectSpeed] [click speedSetting]
[marker_position prevClick_selectObject] [drag selectionPalette no selectedObject] -> [marker_position prevClick_selectObject] [click selectionPalette]
[marker_position prevClick_place] [drag no selectionPalette no forbidPlace no placeable] -> [marker_position prevClick_place] [click]
[marker_position prevClick_remove] [drag no selectionPalette no forbidPlace placeable] -> [marker_position prevClick_remove] [click placeable]
[drag] -> []
(mouse input, tacked on at the end)
(uses the previous cursor input except that the top row functions can be accessed while playing)
[click] [marker_position marker_visible_cursor] -> [click] [marker_position]
[click level_border] -> [level_border]
[click resetButton] [pauseButton playing frame] -> [resetButton] [playButton paused do_reset] sfx1
[click speedSetting] [selectedSpeed] [marker_position] -> [click speedSetting] [] [marker_position prevClick_selectSpeed]
[click speedSetting] [frame] -> [click speedSetting] [frame1]
[click speedButton1] -> [speedButton1 selectedSpeed] sfx4
[click speedButton2] -> [speedButton2 selectedSpeed] sfx5
[click speedButton3] -> [speedButton3 selectedSpeed] sfx6
[click] [playing] [cursor] -> [] [playing] [action cursor]
[click] [cursor] -> [click] []
[click selectionPalette] [marker_position] -> [click selectionPalette] [marker_position prevClick_selectObject]
[click no selectionPalette no forbidPlace no placeable] [marker_position] -> [click] [marker_position prevClick_place]
[click no selectionPalette no forbidPlace placeable] [marker_position] -> [click placeable] [marker_position prevClick_remove]
[click] -> [action cursor]
[tutorial1] [action cursor no playButton ] -> message Press the green play button\nto start the experiment.
[tutorial1] [action cursor] -> [] [action cursor]
[agent tutorial2] -> [agent] message While the experiment is running,\nyou can use the buttons in the\ntop left to pause and stop.
(handle cursor actions)
[action cursor selectionPalette] [selectedObject] -> [action cursor selectionPalette] []
[action cursor selectionPalette no hiddenSelectionPalette] -> [cursor selectionPalette selectedObject] sfx7
[action cursor selectionPalette hiddenSelectionPalette] -> [cursor selectionPalette hiddenSelectionPalette selectedObject] sfx0
[action cursor speedSetting] [selectedSpeed] -> [action cursor speedSetting] []
[action cursor speedButton1] -> [cursor speedButton1 selectedSpeed] sfx4
[action cursor speedButton2] -> [cursor speedButton2 selectedSpeed] sfx5
[action cursor speedButton3] -> [cursor speedButton3 selectedSpeed] sfx6
[action cursor placeable no selectionPalette] [stopped] -> [cursor] [stopped]
(reset if pressing reset button)
[paused | resetButton action cursor] -> [paused do_reset | resetButton cursor] sfx1
(reset if trying to place object while paused)
[placeable selectedObject] [action cursor no forbidPlace] [paused] -> [placeable selectedObject] [cursor] [paused do_reset] sfx1
(RESETABLES)
(This resets the resetables to their start position)
(For each resetable, add a line here to recreate the resetable at the corresponding _startpos objects)
[paused do_reset] [resetable no wall no selectionPalette] -> [paused do_reset] []
[paused do_reset] [agent_u_startpos] -> [paused do_reset] [agent_u_startpos agent_u]
[paused do_reset] [agent_r_startpos] -> [paused do_reset] [agent_r_startpos agent_r]
[paused do_reset] [agent_d_startpos] -> [paused do_reset] [agent_d_startpos agent_d]
[paused do_reset] [agent_l_startpos] -> [paused do_reset] [agent_l_startpos agent_l]
[paused do_reset] [block_startpos] -> [paused do_reset] [block_startpos block]
[paused do_reset] [cheese_startpos] -> [paused do_reset] [cheese_startpos cheese]
[paused do_reset] [explosive_startpos] -> [paused do_reset] [explosive_startpos explosiveTile]
[paused do_reset] [turnTile_startpos] -> [paused do_reset] [turnTile_startpos turnTile]
[paused do_reset] [mirrorTile_startpos] -> [paused do_reset] [mirrorTile_startpos mirrorTile]
[paused do_reset] [forkTile_startpos] -> [paused do_reset] [forkTile_startpos forkTile]
[paused do_reset] [holeOpen] -> [paused do_reset] [holeClose no sfx_DoorOpen]
[paused do_reset] [resetable_startpos] -> [paused do_reset] []
right [paused do_reset|] -> [stopped|resetButton_disabled]
[turnTile selectedObject] [action cursor no forbidPlace] [stopped] -> [turnTile selectedObject sfx_PlaceRotate] [cursor turnTile] [stopped]
[mirrorTile selectedObject] [action cursor no forbidPlace] [stopped] -> [mirrorTile selectedObject sfx_PlaceMirror] [cursor mirrorTile] [stopped]
[forkTile selectedObject] [action cursor no forbidPlace] [stopped] -> [forkTile selectedObject sfx_PlaceFork] [cursor forkTile] [stopped]
[explosiveTile selectedObject] [action cursor no forbidPlace] [stopped] -> [explosiveTile selectedObject sfx_PlaceBomb] [cursor explosiveTile] [stopped]
[action cursor forbidPlace no playButton] [stopped] -> [action cursor forbidPlace] [stopped] sfx0
[action cursor playButton stopped] -> [cursor pauseButton action playing frame1] sfx2 (the action on playing is used to distinguish starting from resuming)
[action cursor playButton paused] -> [cursor pauseButton playing frame1] sfx2
[action cursor pauseButton playing frame] -> [cursor playButton paused] sfx3
[moving cursor pauseButton] -> cancel
right [playing | resetButton_disabled] -> [playing | resetButton]
right [paused | resetButton_disabled] -> [paused | resetButton]
right [stopped | resetButton] -> [playing | resetButton_disabled]
(RESETABLES)
(If we're starting from being stopped (not paused), put startpos markers down to represent where everything started)
(For each resetable, add a line here to create a corresponding _startpos object in the same space as the resetable)
[action playing] [resetable_startpos] -> [action playing] []
[action playing] [ no wall no selectionPalette agent_u ] -> [action playing] [agent_u agent_u_startpos]
[action playing] [ no wall no selectionPalette agent_r ] -> [action playing] [agent_r agent_r_startpos]
[action playing] [ no wall no selectionPalette agent_d ] -> [action playing] [agent_d agent_d_startpos]
[action playing] [ no wall no selectionPalette agent_l ] -> [action playing] [agent_l agent_l_startpos]
[action playing] [ no wall no selectionPalette block ] -> [action playing] [block block_startpos]
[action playing] [ no wall no selectionPalette cheese ] -> [action playing] [cheese cheese_startpos]
[action playing] [ no wall no selectionPalette explosiveTile ] -> [action playing] [explosiveTile explosive_startpos]
[action playing] [ no wall no selectionPalette turnTile ] -> [action playing] [turnTile turnTile_startpos]
[action playing] [ no wall no selectionPalette mirrorTile ] -> [action playing] [mirrorTile mirrorTile_startpos]
[action playing] [ no wall no selectionPalette forkTile ] -> [action playing] [forkTile forkTile_startpos]
[action playing] -> [playing]
(handle agent movement)
[doMove Agent_r] -> [doMove right Agent_r]
[doMove Agent_d] -> [doMove down Agent_d]
[doMove Agent_l] -> [doMove left Agent_l]
[doMove Agent_u] -> [doMove up Agent_u]
(stop agents if they're on an open hole)
[moving Agent holeOpen] -> [ stationary Agent didntmove holeOpen didntmove_openhole ]
(push movables)
[> Agent | stationary moveable] -> [> Agent | > moveable]
[> moveable | moveable] -> [> moveable | > moveable]
(break cheese)
[> Agent | cheese] -> [Agent didntmove | Background]
(stop moveables that can't move)
[> moveable | preventMovement ] -> [ moveable didntmove | preventMovement]
(stop agents that can't move)
[> agent | preventMovement ] -> [agent didntmove | preventMovement]
(prevent agents from passing through each other)
up [up agent_u | down agent_d] -> [agent_u didntmove | agent_d didntmove]
right [right agent_r | left agent_l] -> [agent_r didntmove | agent_l didntmove]
[ moving moveable no didntmove ] -> sfx9
[ moving agent no didntmove ] -> sfx8
(merge agents that land on the same cell into a block)
late [doMove] [agent_u agent_r no turned] -> [doMove] [block]
late [doMove] [agent_u agent_d no turned] -> [doMove] [block]
late [doMove] [agent_u agent_l no turned] -> [doMove] [block]
late [doMove] [agent_r agent_d no turned] -> [doMove] [block]
late [doMove] [agent_r agent_l no turned] -> [doMove] [block]
late [doMove] [agent_d agent_l no turned] -> [doMove] [block]
late [timer no agent] -> []
(need this for triple merge)
late [block agent] -> [block]
(handle timer on a fork)
[forkTile timer1 > agent | ] -> [forkTile timer1 > agent | timer1_next]
[forkTile timer2 > agent | ] -> [forkTile timer2 > agent | timer2_next]
[forkTile timer3 > agent | ] -> [forkTile timer3 > agent | timer3_next]
[forkTile timer4 > agent | ] -> [forkTile timer4 > agent | timer4_next]
[forkTile timer5 > agent | ] -> [forkTile timer5 > agent | timer5_next]
late [timer forkTile no agent] -> [forkTile]
late [timer1_next] -> [timer1]
late [timer2_next] -> [timer2]
late [timer3_next] -> [timer3]
late [timer4_next] -> [timer4]
late [timer5_next] -> [timer5]
[> agent stationary timer no forkTile ] -> [> agent > timer]
(decide if hole should be open or closed)
late [pauseButton][holeClose] -> [pauseButton][holeOpen]
late [pauseButton][button no block] [holeOpen] -> [pauseButton][button no block] [holeClose no sfx_DoorOpen]
[holeOpen no sfx_DoorOpen] -> [holeOpen sfx_DoorOpen]
(explosive timer decrement)
late [doMove] [timer1] -> [doMove] [explosion]
late [doMove] [timer2] -> [doMove] [timer1]
late [doMove] [timer3] -> [doMove] [timer2]
late [doMove] [timer4] -> [doMove] [timer3]
late [doMove] [timer5] -> [doMove] [timer4]
(explosive tile adds explosion time to agents if they don't already have one)
late [agent explosiveTile no timer no explosion] -> [agent explosiveTile timer5]
(explosion destroys stuff. sprites are cleared at start of next turn)
late [explosion | no wall no explosion] -> [explosion no explodable | explosionAdjacent no explodable]
(turn agent if it is on a turnTile)
late [turned] -> []
late [doMove] [no turned Agent_r turnTile] -> [doMove sfx_Rotate] [turned Agent_d turnTile]
late [doMove] [no turned Agent_d turnTile] -> [doMove sfx_Rotate] [turned Agent_l turnTile]
late [doMove] [no turned Agent_l turnTile] -> [doMove sfx_Rotate] [turned Agent_u turnTile]
late [doMove] [no turned Agent_u turnTile] -> [doMove sfx_Rotate] [turned Agent_r turnTile]
late [sfx_Rotate] -> []
(mirror agent if it is on a mirrorTile)
late [mirrored] -> []
late [doMove] [no mirrored Agent_r mirrorTile] -> [doMove sfx_Mirror] [mirrored Agent_l mirrorTile]
late [doMove] [no mirrored Agent_d mirrorTile] -> [doMove sfx_Mirror] [mirrored Agent_u mirrorTile]
late [doMove] [no mirrored Agent_l mirrorTile] -> [doMove sfx_Mirror] [mirrored Agent_r mirrorTile]
late [doMove] [no mirrored Agent_u mirrorTile] -> [doMove sfx_Mirror] [mirrored Agent_d mirrorTile]
late [sfx_Mirror] -> []
(fork agent if it is on a forkTile)
up late [doMove] [no forbidFork | no turned Agent_r forkTile | no forbidFork] -> [doMove sfx_Fork] [ | forkTile turned agent_u agent_d | ]
right late [doMove] [no forbidFork | no turned Agent_d forkTile | no forbidFork] -> [doMove sfx_Fork] [ | forkTile turned agent_l agent_r| ]
down late [doMove] [no forbidFork | no turned Agent_l forkTile | no forbidFork] -> [doMove sfx_Fork] [ | forkTile turned agent_u agent_d| ]
left late [doMove] [no forbidFork | no turned Agent_u forkTile | no forbidFork] -> [doMove sfx_Fork] [ | forkTile turned agent_l agent_r | ]
late [sfx_Fork] -> []
(remove didntmove if the cause was being on an open hole that is now closed)
(fixes bug where agent would turn after being released from a hole - see unit test "Agent continues forward after being released from hole")
late [doMove] [no turned agent didntmove didntmove_openhole holeClose] -> [doMove] [agent holeClose]
(turn agent if it hasn't turned and was not able to move forward this turn)
late [doMove] [no turned Agent_r didntmove no holeOpen] -> [doMove sfx_Turn] [turned Agent_u didntmove]
late [doMove] [no turned Agent_d didntmove no holeOpen] -> [doMove sfx_Turn] [turned Agent_r didntmove]
late [doMove] [no turned Agent_l didntmove no holeOpen] -> [doMove sfx_Turn] [turned Agent_d didntmove]
late [doMove] [no turned Agent_u didntmove no holeOpen] -> [doMove sfx_Turn] [turned Agent_l didntmove]
late [didntmove] -> []
late [block button] -> [block button render_block_on_button]
(3d effect for blocks & cheese)
down late [render_block_top | no block] -> [ | ]
up late [block | ] -> [block | render_block_top]
down late [render_cheese_top | no cheese] -> [ | ]
up late [cheese | ] -> [cheese | render_cheese_top]
down late [render_button_top | no button] -> [ | ]
up late [button no block | ] -> [button | render_button_top]
late [button block] -> [button block render_button_pressed]
(3d effect for agent front)
up late [agent_u | ] -> [agent_u | render_agent_u_top render_agent_u_front]
up late [no agent_u | render_agent_u_top] -> [ | ]
down late [render_agent_u_front | no agent_u] -> [ | ]
up late [agent_u | ] -> [agent_u | render_agent_u_top render_agent_u_front]
late [wall render_agent_u_front] -> [wall]
left late [agent_l | ] -> [agent_l | render_agent_l_front]
left late [no agent_l | render_agent_l_front] -> [ | ]
left late [ | agent_r] -> [render_agent_r_front | agent_r]
left late [render_agent_r_front | no agent_r] -> [ | ]
down late [agent_d | no agent no button] -> [agent_d | render_agent_d_front]
down late [no agent_d | render_agent_d_front] -> [ | ]
(timer graphics)
late [agent timer] -> [agent timer render_timer]
late [render_timer no agent] -> []
late [render_timer5_d no render_timer] -> []
late [render_timer4_d no render_timer] -> []
late [render_timer3_d no render_timer] -> []
late [render_timer2_d no render_timer] -> []
late [render_timer1_d no render_timer] -> []
late [agent_l timer5 no render_timer5_l] -> [agent_l timer5 render_timer5_l]
late [agent_l timer4 no render_timer4_l] -> [agent_l timer4 render_timer4_l]
late [agent_l timer3 no render_timer3_l] -> [agent_l timer3 render_timer3_l]
late [agent_l timer2 no render_timer2_l] -> [agent_l timer2 render_timer2_l]
late [agent_l timer1 no render_timer1_l] -> [agent_l timer1 render_timer1_l]
late [agent_d timer5 no render_timer5_d] -> [agent_d timer5 render_timer5_d]
late [agent_d timer4 no render_timer4_d] -> [agent_d timer4 render_timer4_d]
late [agent_d timer3 no render_timer3_d] -> [agent_d timer3 render_timer3_d]
late [agent_d timer2 no render_timer2_d] -> [agent_d timer2 render_timer2_d]
late [agent_d timer1 no render_timer1_d] -> [agent_d timer1 render_timer1_d]
late [agent_u timer5 no render_timer5_u] -> [agent_u timer5 render_timer5_u]
late [agent_u timer4 no render_timer4_u] -> [agent_u timer4 render_timer4_u]
late [agent_u timer3 no render_timer3_u] -> [agent_u timer3 render_timer3_u]
late [agent_u timer2 no render_timer2_u] -> [agent_u timer2 render_timer2_u]
late [agent_u timer1 no render_timer1_u] -> [agent_u timer1 render_timer1_u]
late [agent_r timer5 no render_timer5_r] -> [agent_r timer5 render_timer5_r]
late [agent_r timer4 no render_timer4_r] -> [agent_r timer4 render_timer4_r]
late [agent_r timer3 no render_timer3_r] -> [agent_r timer3 render_timer3_r]
late [agent_r timer2 no render_timer2_r] -> [agent_r timer2 render_timer2_r]
late [agent_r timer1 no render_timer1_r] -> [agent_r timer1 render_timer1_r]
late [render_timer5_l no agent_l] -> []
late [render_timer4_l no agent_l] -> []
late [render_timer3_l no agent_l] -> []
late [render_timer2_l no agent_l] -> []
late [render_timer1_l no agent_l] -> []
late [render_timer5_d no agent_d] -> []
late [render_timer4_d no agent_d] -> []
late [render_timer3_d no agent_d] -> []
late [render_timer2_d no agent_d] -> []
late [render_timer1_d no agent_d] -> []
up late [no agent_d | render_timer5_d_top] -> [ | ]
up late [no agent_d | render_timer4_d_top] -> [ | ]
up late [no agent_d | render_timer3_d_top] -> [ | ]
up late [no agent_d | render_timer2_d_top] -> [ | ]
up late [no agent_d | render_timer1_d_top] -> [ | ]
up late [agent_d timer5 no render_timer5_d_top | ] -> [agent_d timer5 | render_timer5_d_top]
up late [agent_d timer4 no render_timer4_d_top | ] -> [agent_d timer4 | render_timer4_d_top]
up late [agent_d timer3 no render_timer3_d_top | ] -> [agent_d timer3 | render_timer3_d_top]
up late [agent_d timer2 no render_timer2_d_top | ] -> [agent_d timer2 | render_timer2_d_top]
up late [agent_d timer1 no render_timer1_d_top | ] -> [agent_d timer1 | render_timer1_d_top]
up late [no agent_r | render_timer5_r_top] -> [ | ]
up late [no agent_r | render_timer4_r_top] -> [ | ]
up late [no agent_r | render_timer3_r_top] -> [ | ]
up late [no agent_r | render_timer2_r_top] -> [ | ]
up late [no agent_r | render_timer1_r_top] -> [ | ]
up late [agent_r timer5 no render_timer5_r_top | ] -> [agent_r timer5 | render_timer5_r_top]
up late [agent_r timer4 no render_timer4_r_top | ] -> [agent_r timer4 | render_timer4_r_top]
up late [agent_r timer3 no render_timer3_r_top | ] -> [agent_r timer3 | render_timer3_r_top]
up late [agent_r timer2 no render_timer2_r_top | ] -> [agent_r timer2 | render_timer2_r_top]
up late [agent_r timer1 no render_timer1_r_top | ] -> [agent_r timer1 | render_timer1_r_top]
late [render_timer5_u no agent_u] -> []
late [render_timer4_u no agent_u] -> []
late [render_timer3_u no agent_u] -> []
late [render_timer2_u no agent_u] -> []
late [render_timer1_u no agent_u] -> []
late [render_timer5_r no agent_r] -> []
late [render_timer4_r no agent_r] -> []
late [render_timer3_r no agent_r] -> []
late [render_timer2_r no agent_r] -> []
late [render_timer1_r no agent_r] -> []
up late [no agent_r | render_no_timer_r_top] -> [ | ]
up late [no agent_d | render_no_timer_d_top] -> [ | ]
late [render_no_timer_r no agent_r] -> []
late [render_no_timer_l no agent_l] -> []
late [render_no_timer_u no agent_u] -> []
late [render_no_timer_d no agent_d] -> []
up late [agent_r no render_timer | ] -> [agent_r | render_no_timer_r_top]
up late [agent_d no render_timer | ] -> [agent_d | render_no_timer_d_top]
late [agent_r no render_timer] -> [render_no_timer_r agent_r]
late [agent_l no render_timer] -> [render_no_timer_l agent_l]
late [agent_u no render_timer] -> [agent_u render_no_timer_u]
late [agent_d no render_timer] -> [agent_d render_no_timer_d]
(set level border colour)
late [staticrender_level_border_playing] -> []
late [active] [staticrender_level_border_u] -> [active] [staticrender_level_border_playing_u]
late [active] [staticrender_level_border_ur] -> [active] [staticrender_level_border_playing_ur]
late [active] [staticrender_level_border_r] -> [active] [staticrender_level_border_playing_r]
late [active] [staticrender_level_border_rd] -> [active] [staticrender_level_border_playing_rd]
late [active] [staticrender_level_border_d] -> [active] [staticrender_level_border_playing_d]
late [active] [staticrender_level_border_dl] -> [active] [staticrender_level_border_playing_dl]
late [active] [staticrender_level_border_l] -> [active] [staticrender_level_border_playing_l]
late [active] [staticrender_level_border_lu] -> [active] [staticrender_level_border_playing_lu]
(draw cursor if we used keyboard input)
[ render_cursor ] -> []
[ marker_position marker_visible_cursor ] [ cursor ] -> [ marker_position marker_visible_cursor ] [ cursor render_cursor ]
(fade out tiles that aren't selected)
late [ turnTile selectionPalette NO selectedObject ] -> [ turnTile selectionPalette render_NotSelectedTurn ]
late [ mirrorTile selectionPalette NO selectedObject ] -> [ mirrorTile selectionPalette render_NotSelectedMirror ]
late [ forkTile selectionPalette NO selectedObject ] -> [ forkTile selectionPalette render_NotSelectedFork ]
late [ explosiveTile selectionPalette NO selectedObject ] -> [ explosiveTile selectionPalette render_NotSelectedBomb ]
late [ speedButton1 speedPalette NO selectedSpeed ] -> [ speedButton1 speedPalette render_NotSelectedSpeedButton1 ]
late [ speedButton2 speedPalette NO selectedSpeed ] -> [ speedButton2 speedPalette render_NotSelectedSpeedButton2 ]
late [ speedButton3 speedPalette NO selectedSpeed ] -> [ speedButton3 speedPalette render_NotSelectedSpeedButton3 ]
late [sfx_ToRemove] -> []
==============
WINCONDITIONS
==============
all agent on holeOpen
all holeOpen on agent
no holeClose
=======
LEVELS
=======
(SEED LEVELS)
section 1
message Welcome to the lab!\nClick or tap to interact.
(Ethan Clark, seed level)
(SOLUTION: just hit play)
+++++++++
+s#####$+
+~######+
+###h..#+
+#####.#+
+#bo..{#+
+###.###+
+###u###+
+#######+
+++++++++
section 2
message Press on an empty space to\nplace a turn tile there.
message Try placing one right\nbefore the button!
(Ethan Clark, seed level number 2)
(SOLUTION: https://drive.google.com/file/d/14J3jgdT6GxDXCINZu0BLNhwCSB39sfim/view?usp=sharing)
+++++++++
+S######+
+~######+
+}ro..b#+
+####.##+
+#....##+
+#....##+
+#...h##+
+#######+
+++++++++
(BRANCH B BEGINS HERE)
section 3
(Pichusuperlover, its called a difficulty curve not a difficulty cliff)
(SOLUTION: https://i.imgur.com/nTqN9Cx.png)
+++++++++++
+S########+
+~########+
+}##.....#+
+###.b...#+
+##......#+
+##.bo...#+
+#.......#+
+#.bo....#+
+#.......#+
+#.o.h...#+
+#......##+
+#.u....##+
+#########+
+++++++++++
section 4
(knexator: vanilla level, hopefully with a clear key idea. i'm not 100% sure it has no cheese, so feel free to change/remove it if there's any solution that (rot13) arire zbirf gur evtugzbfg oybpx)
(SOLUTION: https://imgur.com/LpGq6dU)
(LeavingLeaves: alt simpler(?) solution: https://imgur.com/IXy6l6l)
+++++++++
+S######+
+~######+
+}##..##+
+##....#+
+#.oh..#+
+#.....#+
+#....c#+
+#.....#+
+#.....#+
+#..ub.#+
+#######+
+++++++++
section 5
message Click the blue buttons to select different simulation speeds.
(CHz, vanilla level using seed mechanics only)
(SOLUTION: https://i.imgur.com/08a8fcH.png)
+++++++++++++
+S##123#####+
+###########+
+}####h#####+
+##..o.b..##+
+##...#...##+
+###..o..###+
+###..o..###+
+##...d...##+
+##.......##+
+###########+
+++++++++++++
section 6
(Jack Lance, put my level early because it doesn't use any extra mechanics, though it still is a bit tricky)
(SOLUTION: https://i.imgur.com/ZXqHnck.png)
+++++++++++
+S#123####+
+#########+
+}.......#+
+#.b.....#+
+#.o.....#+
+#.......#+
+#.......#+
+#.u...h.#+
+#.......#+
+#########+
+++++++++++
section 7
(Neonesque, introduction to the speed palette, and an intermediate vanilla level)
(Joseph Mansfield - This level is pretty tough for being so early. Maybe shift it later if others agree?)
(foxbot - I was stuck on this level for so long, please move it later)
(Karoo - moved from level 5 to 7)
(SOLUTION: https://drive.google.com/file/d/1NhdoCPH2XSFu-xxvjARYrDYZrhn64qqB/view?usp=sharing)
(LeavingLeaves: alt solution: https://imgur.com/JAtGRE0)
++++++++++++
+S#123#####+
+##########+
+}###....##+
+#.r...o.##+
+#.o......#+
+#........#+
+#........#+
+#####...##+
+#.......##+
+###h######+
+##########+
++++++++++++
section 8
message A fork in the road...
message Tap the buttons on the left\nto select different tiles\nto place.
(Norgg, a level using forks)
(SOLUTION: https://i.imgur.com/awxMWPg.png)
+++++++++++++
+S##123#####+
+###########+
+t#h##b#####+
+f#.......##+
+##...o..h##+
+##.......##+
+##.......##+
+##.......##+
+##h..o...##+
+##.u.....##+
+#####b##h##+
+###########+
+++++++++++++
section 9
(Beekie, a level about aligning two hammers)
(https://drive.google.com/file/d/1KMMC_fy1iD3ISAejxlGU0L5l8N_qQAZD/view?usp=sharing)
(I found an interesting alternate solution: https://i.imgur.com/jLmxElY.png
-max)
(I landed on the same solution as max - PleasingFungus)
+++++++++++++++
+S##123#######+
+#############+
+t#.........##+
+f#.o....hb.##+
+##.........##+
+##.#.r..#####+
+##.........##+
+##.o....hb.##+
+##.........##+
+#############+
+++++++++++++++
section 10
(max, a level meant to gently introduce the merge mechanic)
(SOLUTION: https://i.imgur.com/Udz7imU.png)
+++++++++++
+S##123###+
+#########+
+t##...###+
+###.r.###+
+####.####+
+#..#.#..#+
+#.u...d.#+
+#..#.#..#+
+####.####+
+###.h.###+
+###.b.###+
+#########+
+++++++++++
section 11
(jackk, a level using merge mechanic)
(SOLUTION: https://i.imgur.com/yYtLoaB.png)
(I found an alternate solution that isn't as clever as the intended one -Joel
https://1drv.ms/u/s!Ar8m4sxHoFLQgsBh4rDO2fShHVwWOA?e=3LHY2Q)
(another weird alternate solution https://imgur.com/a/YSPUKmp -foxbot)
+++++++++++++++
+S##123#######+
+#############+
+t##..###..###+
+f##.#...#.###+
+##h......ob##+
+####.....####+
+###.......###+
+###...u...###+
+####.....####+
+#############+
+++++++++++++++
section 12
(Plurmorant, another merge level)
(https://i.imgur.com/2lZadnH.jpg)
(Very slight variant - https://www.dropbox.com/s/abdpk2wt8f8q5f9/merge-3.png - PleasingFungus)
(I added an extra row at the top of this level to make sure it's completely surrounded by walls, because bad things can happen at the border otherwise. - CHz)
+++++++++++++
+S##123#####+
+###########+
+t###b######+
+##.......##+
+##.......##+
+##...u...##+
+##..lhr..##+
+##...d...##+
+##.......##+
+##.......##+
+###########+
+++++++++++++
section 13
message Hm, where have I seen\nthese before?
(Colin, tutorial level for explosives)
(https://imgur.com/a/nz3Brfi)
+++++++++++
+S##123###+
+#########+
+f#booob##+
+x###.####+
+####...##+
+###.....#+
+####...##+
+####u####+
+####h####+
+#########+
+++++++++++
section 14
(Joel, first level using explosives, but it is fairly challenging)
(solution: https://1drv.ms/u/s!Ar8m4sxHoFLQgsBfEHw91-yeRoTk2A?e=v0syD6)
(beatable without explosives - no idea about the intended solve - PleasingFungus
https://www.dropbox.com/s/dc7opjj6jfsumed/the-bomb.png)
(After that cheese was found, Joel updated the level. You should still be able to use the first solution, but PleasingFungus' "cheese" solution no longer works. -Ethan Clark)
+++++++++++++
+S##123#####+
+###########+
+#####.#####+
+#####c#####+
+##.hob.####+
+##.########+
+t#.......##+
+f#.......##+
+x#.......##+
+##...u...##+
+##.......##+
+###########+
+++++++++++++
section 15
message On reflection...
(marcosd, a level using mirror mechanic )
(solution: https://imgur.com/a/J1b580N )
+++++++++++++++
+S##123#######+
+#############+
+f#.........##+
+m#bo.....ob##+
+##.........##+
+##.........##+
+##.h..u..h.##+
+##.........##+
+#############+
+++++++++++++++
section 16
(alteffor, a level about timing out with mirrors and turns, I think its not too hard.)
(Solution: https://imgur.com/a/W7Stfrs)
+++++++++++++++
+S##123#######+
+#############+
+##....b...b##+
+t#####u###.##+
+m#####.....##+
+######u###.##+
+######.....##+
+######u###.##+
+######.....##+
+######u###.##+
+######.....##+
+######u###.##+
+##....h....##+
+#############+
+++++++++++++++
section 17
(Icely, mirror maze and turns)
(solution: https://imgur.com/a/64PraNA )
+++++++++++++++
+S##123#######+
+#############+
+t#....o...b##+
+##.###.##.###+
+##.h.......##+
+##.##...##.##+
+##....u.#..##+
+###.#...##.##+
+##....o....##+
+##.###.#...##+
+##.......#b##+
+#############+
+++++++++++++++
section 18
message Say cheese...
(PleasingFungus, a level using crumbly cheese.)
(solution: https://www.dropbox.com/s/m806f5jea3jm7v2/cheese-solution.png)
+++++++++++
+S##123###+
+#########+
+t###h####+
+###.%.###+
+##%%%%%##+
+#...%...#+
+#.......#+
+#...u...#+
+#.......#+
+#.......#+
+#########+
+++++++++++
section 19
(Foxbot, a level about repeatedly using the same fork, probably can be cheesed but whatever)
(solution: https://imgur.com/a/DH2VsOA)
+++++++++++++++
+s##123#######+
+#############+
+f#..........#+
+x#.########.#+
+m#.#..#####.#+
+##.##.#hhh#.#+
+#.l.....%%%.#+
+#.###.#######+
+#####..######+
+#############+
+++++++++++++++
section 20
(Joseph Mansfield, a level that (hopefully) relies on the behavior in unit test "Agent in hole acts solid")
(SOLUTION: https://i.imgur.com/P5V3AYU.png)
++++++++++++++++++
+s##123##########+
+################+
+t#.....r......##+
+##...o###.....##+
+##....###.#.#.##+
+##.h.b.%....o.##+
+##....#h#.#.#.##+
+##...o###.#.#.##+
+##.....l......##+
+################+
++++++++++++++++++
section 21
(jcGyo, a small but a little more challenging merge level)
(Karoo - moved from level 13 to 21)
(https://i.imgur.com/zUfPl9P.png)
+++++++++++++++
+S##123#######+
+#############+
+t#...bb.bbb##+
+f#....h...h##+
+##.......#.##+
+##h...u..#.##+
+##......h..##+
+#############+
+++++++++++++++
section 22
(LeavingLeaves, a level about forbidTile. Hope no cheese)
(Solution: https://imgur.com/0q9cTA9)
+++++++++++++++++++++
+s##123#############+
+#########b#########+
+t########o#########+
+#######-----#######+
+#######cc.cc#######+
+###h#-c.....c-#d###+
+###.#-c.....c-#o###+
+###%.-...-...-.%c.#+
+#.c.#-c.....c-#.###+
+###.#-c.....c-#.###+
+###.###ccucc###.###+
+###.###-----###.###+
+###.#####h#####.###+
+###......-......###+
+###o###########.###+
+###################+
+++++++++++++++++++++
message Ah, finally - our reward!
++++++++++++++++++++++++++++++++++
+s##123##########################+
+################################+
+#bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb#+
+#oooooooooooooooooooooooooooooo#+
+#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#+
+#%%%%%%%%%%wwaawwaaww%%%%%%%%%%#+
+#%%%%%%%%%%wwaawwaaww%%%%%%%%%%#+
+#%%%%%%%%%%wwwwwwwwww%%%%%%%%%%#+
+#%%%%%%%%%%wwwwwwwwww%%%%%%%%%%#+
+#%%%%%%%%%%zz%%zz%%ww%%%%%%%%%%#+
+#%%%%%%%%%%zz%%zz%%ww%%%%%%%%%%#+
+#%%%%%%%%%%%%%%%%%%ww%%%%%%%%%%#+
+#%%%%%%%%%%%%%%%%%%ww%%%%%%%%%%#+
+#%%%%%%%%%%wwwwwwwwww%%%%%%%%%%#+
+#%%%%%%%%%%wwwwwwwwww%%%%%%%%%%#+
+#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#+
+#uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu#+
+#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#+
+################################+
++++++++++++++++++++++++++++++++++
message "Thanks for playing!"
(EXAMPLE LEVELS (for participants' sake))
(If you want to know how to add to the palette, use this level as a reference)
(
message this is an example level, showing what it's like to have more than one object in the pallette
message press x on an object to select it!
++++++++++
+S#######+
+~#######+
+t#c#...#+
+f###...#+
+##.....#+
+##....r#+
+##....h#+
+########+
++++++++++
message this is an example level, showing what it's like to have more than one speed in the pallette
message press x on a speed to select it!
+++++++++++
+S##123###+
+#########+
+t##c#...#+
+f####...#+
+###.....#+
+###....r#+
+###....h#+
+#########+
+++++++++++
(UNIT TESTS)
message this is a unit test, made to test that the game works properly.
+++++++++++
+S########+
+~########+
+#...h...#+
+#.......#+
+#.......#+
+#rooobbb#+
+#########+
+++++++++++
+++++++++++
+S########+
+~########+
+#....####+
+#...y..h#+
+#....####+
+#.......#+
+#rooobbb#+
+#########+
+++++++++++
+++++++++++++
+S##########+
+~##########+
+#.h.....h.#+
+#.........#+
+#byo.g.o.b#+
+#r....#####+
+###########+
+++++++++++++
+++++++++++
+S########+
+~########+
+#.......#+
+#r.oyb..#+
+#h..y...#+
+#.......#+
+#########+
+++++++++++
+++++++++++++
+S##########+
+~###b######+
+#h..o.....#+
+#.....y..h#+
+#...ggg...#+
+#h..y.....#+
+#....uo..h#+
+######b####+
+###########+
+++++++++++++
++++++++++++
+S#########+
+~##......#+
+##.......#+
+##..g.y.u#+
+##..u.y..#+
+###.....h#+
+###b######+
+##########+
++++++++++++
++++++++++++
+S#########+
+~#########+
+t#.....yh#+
+f#bo.gegy#+
+x#.......#+
+##...u...#+
+##.......#+
+##.....yy#+
+##########+
++++++++++++
+++++++++++
+S########+
+~########+
+#.c.....#+
+#...d...#+
+#...r.h.#+
+#...h...#+
+#########+
+++++++++++
(timer persists after forking)
+++++++++
+S######+
+~######+
+#.....#+
+#..g..#+
+#n#.#n#+
+#h#.#l#+
+###e###+
+###u###+
+#######+
+++++++++
(agents can't pass through each other)
+++++++++
+S######+
+~######+
+#r.y..#+
+#...h.#+
+#.h...#+
+#..y.l#+
+#######+
+++++++++
(triple/quad merge)
++++++++++++
+S#########+
+~#########+
+#..h..r.y#+
+#..ry.d..#+
+#bby..lly#+
+#..u..u..#+
+#...u.y..#+
+##########+
++++++++++++
(running at different speeds)
+++++++++
+s##!¢3#+
+#######+
+###y.y#+
+#...lh#+
+#.o..b#+
+#######+
+++++++++
+++++++++++
+s##123###+
+#########+
+###y...y#+
+#.....lh#+
+#.......#+
+#.o....b#+
+#########+
+++++++++++
+++++++++++++
+s##1¢£#####+
+###########+
+###y.....y#+
+#.......lh#+
+#.........#+
+#.........#+
+#.o......b#+
+###########+
+++++++++++++
(Agent in hole acts solid)
+++++++++++
+s########+
+~########+
+#.......#+
+#..h....#+
+#.roo.h.#+
+#.....u.#+
+#.......#+
+#########+
+++++++++++
(Agent continues forward after being released from hole)
(Before the fix, the "u" agent would turn left and get trapped in the bottom left area. After the fix, that agent continues forwards instead and the level eventually completes.)
+++++++++++
+s########+
+~########+
+##..l#h##+
+##...c.d#+
+#####o..#+
+###h#...#+
+#..h#...#+
+#.#u#...#+
+###y.y.y#+
+#########+
+++++++++++
(Agent should block on splitter)
+++++++++++
+s########+
+~########+
+#.......#+
+#.r.g.l.#+
+#.......#+
+#.r...l.#+
+#.......#+
+#########+
+++++++++++
(Agent should blow up on explosive tile)
+++++++++++
+s########+
+~########+
+#re.....#+
+#.......#+
+#re....e#+
+#########+
+++++++++++
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment