puzzlescript
Version:
Play PuzzleScript games in your terminal!
688 lines (570 loc) • 11.8 kB
Plain Text
title Boxes & Balloons
author Ben Reilly
homepage ben-reilly.com
color_palette amiga
realtime_interval 0.1
noaction
========
OBJECTS
========
Background
LightGrey LightGrey
00010
11111
01000
11111
00010
Exit
Yellow Brown
.111.
11111
11111
10111
11111
Wall
DarkGrey DarkGrey
00010
11111
01000
11111
00010
Player
darkbrown LightBrown orange
.000.
.111.
22222
.222.
.0.0.
DeadPlayer
darkred lightred red darkred
.000.
.111.
22222
.222.
.3.3.
Crate
Orange Lightbrown
00000
01110
01110
01110
00000
StuckCrate
DarkGrey Grey
00000
01110
01110
01110
00000
Balloon
Blue Grey
.000.
00000
.000.
..1..
.11..
PoppingBalloon
Blue Grey
.0.0.
0...0
.0.0.
..1.
.1...
LadderMain
Brown
.0.0.
.000.
.0.0.
.000.
.0.0.
LadderTop
Brown
.....
.....
.0.0.
.000.
.0.0.
LadderBottom
Brown
.0.0.
.000.
.0.0.
.....
.....
DownSpike
darkgrey red
..0..
..0..
..1..
.....
.....
UpSpike
darkgrey red
.....
.....
..1..
..0..
..0..
RightSpike
Darkgrey red
.....
.....
001..
.....
.....
LeftSpike
Darkgrey red
.....
.....
..100
.....
.....
(Weights/forces acting on objects; Wx, where x is the amount of downward pushing force applied to an object. Note that there is only one negative one, since we do top-down force calculations, so we only need to know if an object is moving up, not with how much force.)
FreeBody
White
Wn1
Grey
W0
Grey
W1
Grey
W2
Grey
W3
Grey
W4
Grey
W5
Grey
Final
Black
TimeTick
Blue
AllowMove
Red
Shadow
Black
Sound
Grey
=======
LEGEND
=======
Ladder = LadderMain or LadderTop or LadderBottom
Status = TimeTick or AllowMove or Sound
. = Background
= Wall and Background
P = Player
C = Crate
B = Balloon
t = LadderTop
L = LadderMain
m = LadderBottom
- = Crate and LadderMain
+ = Balloon and LadderMain
* = Player and LadderMain
/ = Crate and LadderTop
0 = upspike
1 = rightspike
2 = downspike
3 = leftspike
X = Exit
W = Wn1 or W0 or W1 or W2 or W3 or W4 or W5
FB = FreeBody
Upper = Balloon
Downer = Crate or Player
Obj = Upper or Downer
Spike = Upspike or Downspike or Leftspike or Rightspike
vertspike = upspike or downspike
horizspike = leftspike or rightspike
Ground = Obj or StuckCrate or Wall or Ladder
=======
SOUNDS
=======
Crate MOVE 53548707
Balloon MOVE 798907
sfx5 15551704
sfx6 12412104
sfx7 50943104
================
COLLISIONLAYERS
================
Status
FB
W, Final
Shadow
Background
Ladder, Exit
Player, Wall, Crate, Balloon, StuckCrate, PoppingBalloon, DeadPlayer
Spike
======
RULES
======
(Mark if player is moving or not.)
[orthogonal Player] [Exit no AllowMove] -> CANCEL
[orthogonal Player] [timetick] -> [orthogonal Player] [no timetick]
[stationary Player] [Exit no timetick] -> [Player] [Exit TimeTick]
(If player moves, resolve gravity on the player before allowing another move.)
[Player no Shadow] -> [Player Shadow]
late [Exit no AllowMove] -> [Exit AllowMove]
late [Player no Shadow] [AllowMove] -> [Player] []
late [Shadow] -> []
(**********************************************************)
(***PLAYER-CAUSED MOTION***)
(**********************************************************)
(Player cannot move vertically, except on ladders, and to exit a ladder from below.)
[Exit no TimeTick] [vertical Player no Ladder] -> [Exit] [Player]
up [Exit no TimeTick] [> Player Ladder | no Ladder] -> [Exit] [ Player Ladder | ]
(Player cannot move horizontally mid-air)
down [Exit no TimeTick] [horizontal Player no Ladder | no Ground] -> [Exit] [Player |]
(Player pushes things, things push things. Includes vertical movement because players are strong and grip ladders really tightly.)
[Exit no TimeTick] [> Obj | Obj] -> [Exit] [> Obj | > Obj]
(**********************************************************)
(***GRAVITY***)
(**********************************************************)
(Idea: Apply gravitational forces to objects that are not being moved by the player. Process them from the top of a stack of objects downward, balancing the sum of positive (downward) and negative (upward) forces.
Since we're processing downward, any object determined to be moving upwards is definitely moving upwards. Such an object indicates the bottom of a sub-stack, and the next object in the stack starts the calculation over.
When we reach the bottom of a (sub-)stack, the movement of the final, lowest object tells us how the whole (sub-)stack will move, so we apply that movement iteratively upwards.
NOTE: Players can grip ladders really tightly, so they are only affected by stack gravity when the player is not on a ladder.
)
(***STEP 1: Mark the bodies that the player is not affecting.***)
[TimeTick] [stationary Balloon no FB] -> [TimeTick] [Balloon FB]
[TimeTick] [stationary Crate no FB] -> [TimeTick] [Crate FB]
[TimeTick] [stationary Player no Ladder no FB] -> [TimeTick] [Player FB]
(***STEP 2: Begin the gravity calc at top of each stack.***)
down [no FB | Upper FB] -> [ | < Upper FB Wn1]
down [no FB | Downer FB] -> [ | > Downer FB W1]
(***STEP 3: Iteratively apply gravity downward on stack.***)
(1. DOWNWARD MOTION)
down [> Obj W1 | Upper FB] -> [ Obj | Upper FB W0]
+ down [> Obj W2 | Upper FB] -> [> Obj | > Upper FB W1]
+ down [> Obj W3 | Upper FB] -> [> Obj | > Upper FB W2]
+ down [> Obj W4 | Upper FB] -> [> Obj | > Upper FB W3]
+ down [> Obj W5 | Upper FB] -> [> Obj | > Upper FB W4]
+ down [> Obj W1 | Downer FB] -> [> Obj | > Downer FB W2]
+ down [> Obj W2 | Downer FB] -> [> Obj | > Downer FB W3]
+ down [> Obj W3 | Downer FB] -> [> Obj | > Downer FB W4]
+ down [> Obj W4 | Downer FB] -> [> Obj | > Downer FB W5]
+ down [> Obj W5 | Downer FB] -> [> Obj | > Downer FB W5](!!)
(2. UPWARD MOTION)
(doesn't affect next; re-apply top-of-stack rules)
+ down [< Obj W | Upper FB] -> [< Obj Final | < Upper FB Wn1]
+ down [< Obj W | Downer FB] -> [< Obj Final | > Downer FB W1]
(3. NO MOTION)
(possibly subject to next obj; re-apply top-of-stack rules)
+ down [stationary Obj W | Upper FB] -> [< Obj Final | < Upper FB Wn1]
+ down [stationary Obj W | Downer FB] -> [ Obj | > Downer FB W1]
(***Step 4: Stop at bottom of stack.***)
(As with beginning a stack, if the stack is pushing into a non-free object, the stack remains still or else it might interrupt the other object's motion.)
down [Obj W | no FB] -> [Obj Final | ]
(***Step 5: Apply bottom-of-sub-stack motion to whole sub-stack.)
(1. UPWARD MOTION)
up [> Obj Final | Obj FB no Final] -> [> Obj Final| > Obj Final]
(2. DOWNWARD MOTION)
+ up [< Obj Final | Obj FB no Final] -> [< Obj Final | Obj Final]
(3. NO MOTION)
+ up [stationary Obj Final | Obj FB no Final] -> [Obj Final | Obj Final]
(**********************************************************)
(***Cleanup***)
late [W] -> []
late [Final] -> []
late [FreeBody] -> []
(
(Horizontal motion has the right-of-way.)
vertical [> Obj | horizontal Obj] -> [Obj | horizontal Obj]
)
(Spikes)
[poppingballoon] -> []
vertical [> balloon | vertspike] -> [> poppingballoon | vertspike]
horizontal [> balloon | horizspike] -> [> poppingballoon | horizspike]
late [poppingballoon no spike] -> [balloon]
late [poppingballoon] -> sfx5
vertical [> Crate | vertspike] -> [> stuckcrate | vertspike]
horizontal [> Crate | horizspike] -> [> stuckcrate | horizspike]
late [stuckcrate no spike] -> [Crate]
late [stuckcrate no Sound] -> [StuckCrate Sound] sfx6
vertical [> Player | vertspike] -> [> DeadPlayer | vertspike]
horizontal [> Player | horizspike] -> [> DeadPlayer | horizspike]
late [DeadPlayer no spike] -> [Player]
late [DeadPlayer no Sound] -> [DeadPlayer Sound] sfx7
==============
WINCONDITIONS
==============
Any Exit on Player
=======
LEVELS
=======
Message Version 1.2
Message Level 1
#########
#tcc.####
#l##.####
#l#..####
#l#..####
pl#....x#
######.##
######.##
#########
Message Level 2
########
#..tp..#
#..l#c.#
#..l.c.#
#t.l.c.#
.l######
.l....x#
###...##
########
Message Level 3
#########
#tc....##
#lc....##
#lc....##
#l#....##
#l.....##
#lp..#.##
.l####.x#
.l.....##
#########
Message Level 4
#############
t...........#
l#####......#
lc..........#
l####.......#
lc..........#
l###........#
lc..........#
l##.........#
lc..........#
l#.........x#
l...p....#.##
#############
Message Level 5
#########
#########
p.tb..x.#
##l#.####
##lb.####
#########
#########
Message Level 6
##############
..x.b.......t#
####.###.###l#
####.###.###l#
....p.b.....l#
######b#######
######b#######
######b#######
##############
Message Level 7
##############
t.......b.x..#
l###.###.#####
l###.###.#####
l...p.b......#
######b#######
######b#######
######b#######
##############
Message Level 8
###################
#.#################
#t...........x.####
#l######.#######.##
#l..............t##
######.###.#####l##
.#####.###.#####l##
t...............l##
l###.###.###.######
l###.###.###.######
l###.###.###.######
l.b...b...b...b..p#
##b###b###b###b####
##b###b###b###b####
##b###b###b########
###################
Message Level 9
##########
####t...##
####l##.##
x.pclb..##
#.###b####
#####.####
##########
##########
Message Level 10
############
...........#
.x...pt....#
###c##l##c.#
...b..l..b.#
......l..b.#
############
Message Level 11
###########
###.#######
.p.t.....##
###lc###.##
###lc....##
###lc###.##
###lb....##
###lb....##
###lb.....#
###l.....x#
#####..#.##
#####..#.##
###########
###########
Message Level 12
###########
......c...#
t.p.t.b.x.#
l###-#b####
l...+..####
l...l..####
###########
Message Level 13
##############
..cbc......t.#
..#.#######l##
..#.#.....cl.#
..#.#.....bl.#
..#.b..c..bl.#
..#.#..###.l.#
..#.#######l##
.t.........l.#
#l############
.l...........#
.l.p.....x...#
######c#######
######b#######
######b#######
##############
Message Level 14
############
#########.##
#########.##
#########.##
t../..b.p.x#
l##+##b##.##
l..+...#####
###+########
###l########
###l########
############
Message Level 15
##########
###ttt####
###l-l####
##pl-l.###
###l+l####
###l+l####
####m#####
####.#####
####.#####
####.#####
###.....x#
####.#.###
######.###
##########
Message Level 16
##############
t.t.p.t.b..x3#
l#l###l#.#####
l#m###l#.#####
l#..bbm#.#####
l#####.b.#####
l#####.#######
l......#######
##############
Message Level 17
###############
############.##
t..p.........x#
l######.##.#.##
l###t.t.##c####
l###l#l...c.###
l###l#l###b####
l###l#l###b####
l###l#l###.####
l###l.l########
l#####l########
lbbbbbl########
######l########
######0########
###############
Message Level 18
################
###c############
###c############
###c############
#t.c...........#
#l####.........#
#l.............#
#l......p.t....#
#l.....###l....#
.l........l....#
.l....0...l...x#
############.###
############.###
############.###
############.###
################
Message Level 19
###########
########2##
t........##
l###.###.##
l#tc3#t.t##
l#lb.#l#l##
l#lb3#l#l.#
l.l...l.l.#
l###.###-##
l###..x#+##
l###.###l##
l.p.0...l##
###########
Message Level 20
###########
t.p.....x.#
l#####.####
l#2#2#.####
l.t....####
l#l#c#.####
l.-.c..####
l#+#b..####
l.l###.####
##l..b3####
###########
Message Level 21
#########
###2#####
tp..2.x3#
l##tt####
l..ll...#
###--####
tb.++.bt#
l##ll##l#
l##ll##l#
l##ll##l#
l..ll..l#
#########
Message Level 22
####################
##...........t.#####
##.##########l..####
##.#####.....l...###
.t.t...2..c..l....##
.m#l###.#####l.....#
#cbl#x.......l.....#
#b.l###1.....l.p..t#
#.#l###.##########l#
#.bl###....2......l#
#..l#######.###.##l#
#0.l.........b....l#
#############b######
#############b######
#############b######
#############b######
####################