Created
November 17, 2022 17:45
-
-
Save sftrabbit/a628bde7413e83cf758e46fdf442fa32 to your computer and use it in GitHub Desktop.
Lab Rat-ional Thinking (Puzzlescript Plus Script)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Play this game by pasting the script in https://auroriax.github.io/PuzzleScript/editor.html |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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