puzzlescript
Version:
Play PuzzleScript games in your terminal!
610 lines (512 loc) • 12.2 kB
Plain Text
title Portal-ban
author Noah Krim
homepage http://badoptics.co
color_palette arnecolors
text_color lightblue
run_rules_on_level_start
again_interval 0.05
key_repeat_interval 0.2
========
OBJECTS
========
Background
darkblue darkgreen
00000
10000
00000
00100
00000
Wall
gray lightgray
00000
01110
01010
01110
00000
Wall_black
darkgray black
00000
01110
01010
01110
00000
glass
lightgray white
00000
0..10
0.1.0
0...0
00000
Player
lightgray orange brown black
.222.
.000.
21112
32123
.3.3.
both_portals ( both portals up marker )
transparent
tp_b ( teleported out of blue marker )
transparent
tp_o ( teleported out of orange marker )
transparent
p_b ( blue portal ranged particle )
transparent
p_o ( orange portal ranged particle )
transparent
b_s ( blue crosshair status )
transparent
o_s ( orange crosshair status )
transparent
c_m ( crate move )
transparent
c_t_o ( crate teleport to orange )
transparent
c_t_b ( crate teleport to blue )
transparent
color_swap ( color swap marker )
transparent
gate_m_v ( gate marker vertical )
transparent
gate_m_h ( gate marekr horizontal )
transparent
gate_prev_open ( sound effect marker for gate )
transparent
gate_prev_close ( sound effect marker for gate )
transparent
shot_portal ( marker to negate bad portal sound effect )
transparent
cross_b
blue
.....
..0..
.0.0.
..0..
.....
b_m
blue
.....
.....
..0..
.....
.....
b_u
black blue
10001
.111.
.....
.....
.....
b_d
black blue
.....
.....
.....
.111.
10001
b_l
black blue
1....
01...
01...
01...
1....
b_r
black blue
....1
...10
...10
...10
....1
cross_o
orange
.....
..0..
.0.0.
..0..
.....
o_m
orange
.....
.....
..0..
.....
.....
o_u
black orange
10001
.111.
.....
.....
.....
o_d
black orange
.....
.....
.....
.111.
10001
o_l
black orange
1....
01...
01...
01...
1....
o_r
black orange
....1
...10
...10
...10
....1
crate
white pink
.000.
01010
00000
01010
.000.
gate_v
gray black red
.020.
.101.
.000.
.101.
.020.
gate_h
gray black red
.....
01010
20002
01010
.....
(plate_v
pink white
..0.1
.0.0.
..0..
.0.0.
1.0..
plate_h
pink white
....1
.0.0.
0.0.0
.0.0.
1....)
plate_v
lightgray gray red black
2.1..
.121.
.131.
.121.
..1.2
plate_h
lightgray gray red black
....2
.111.
12321
.111.
2....
exit
black yellow
.111.
10001
10001
10001
.111.
portal_barrier_v
lightblue
...0.
..0..
.0.0.
..0..
.0...
portal_barrier_h
lightblue
.....
..0.0
.0.0.
0.0..
.....
=======
LEGEND
=======
cross = cross_b or cross_o
status = p_b or p_o
tp = tp_b or tp_o
t_s = b_s or o_s
gate = gate_v or gate_h
gate_marker = gate_m_v or gate_m_h
portal_barrier = portal_barrier_v or portal_barrier_h
obstacle = wall or wall_black or glass or gate or portal_barrier
object = obstacle or crate
occluder = gate or wall or wall_black or portal_barrier
plate = plate_v or plate_h
t_u = b_u or o_u
t_d = b_d or o_d
t_l = b_l or o_l
t_r = b_r or o_r
. = Background
# = Wall
% = Wall_black
G = Glass
P = Player and p_b
x = cross_b
c = crate
b = b_u or b_d or b_l or b_r
o = o_u or o_d or o_l or o_r
t = b or o
; = gate_v and gate_m_v and gate_prev_close
- = gate_h and gate_m_h and gate_prev_close
r = plate_v
h = plate_h
! = portal_barrier_v
~ = portal_barrier_h
e = exit
=======
SOUNDS
=======
(titlescreen 52605908)
titlescreen 54131902
endgame 54131902
showmessage 61634506
(closemessage 38370506)
startlevel 58653103
endlevel 40560708
restart 88262103
undo 96730907
Player move 22092307
Crate move 67381507
(cancel 79164307)
b create 50973103 ( portal shoot - blue )
o create 29354703 ( portal shoot - orange )
sfx0 81898108 ( bad portal )
sfx1 42864702 ( gate open )
sfx2 70261102 ( gate close )
sfx3 44196708 ( enter blue-barrier )
sfx4 47806708 ( teleport player )
sfx5 15124502 ( teleport crate )
sfx6 67381507 ( crate move - from rule )
================
COLLISIONLAYERS
================
Background
both_portals
tp
p_b, p_o
gate_marker
shot_portal
gate_prev_open, gate_prev_close
Plate, Exit
Crate ( MOVED CRATE TO IT'S OWN LAYER SO IT CAN'T DELETE THE PLAYER )
Player, Wall, Wall_black, Glass, Gate
portal_barrier
b_s
o_s
b
o
b_m, o_m
c_m
c_t_o, c_t_b
color_swap
cross_b, cross_o
======
RULES
======
( set both_portals status )
[ both_portals ] -> []
[ b ] [ o ] [ player ] -> [ b ] [ o ] [ player both_portals ]
( cancel redudnant moves )
up [ > player | obstacle no t_d no portal_barrier ] -> cancel
down [ > player | obstacle no t_u no portal_barrier ] -> cancel
left [ > player | obstacle no t_r no portal_barrier ] -> cancel
right [ > player | obstacle no t_l no portal_barrier ] -> cancel
[ > player no both_portals | obstacle t ] -> cancel
( remove teleport status )
[ tp ] -> []
( crosshair movement )
[ orthogonal player ] [ cross ] -> [ orthogonal player ] []
[ > player p_b | ] -> [ > player p_b | > cross_b ]
[ > player p_o | ] -> [ > player p_o | > cross_o ]
( old portal deletion )
[ action player | cross_b ] [ b ] -> [ action player | cross_b ] []
[ action player | cross_b ] [ b_s ] -> [ action player | cross_b ] []
[ action player | cross_o ] [ o ] -> [ action player | cross_o ] []
[ action player | cross_o ] [ o_s ] -> [ action player | cross_o ] []
( long range portal control - blue )
[ action player | cross_b no occluder ] -> [ action player shot_portal | cross_b b_m ]
[ player | ... | b_m | no occluder ] -> [ player | ... | > b_m | no occluder ] again
[ player | ... | b_m | occluder no wall ] -> [ player | ... | | occluder ] sfx0
up [ player | ... | b_m | wall ] -> [ player color_swap | ... | b_s | b_d wall ]
down [ player | ... | b_m | wall ] -> [ player color_swap | ... | b_s | b_u wall ]
left [ player | ... | b_m | wall ] -> [ player color_swap | ... | b_s | b_r wall ]
right [ player | ... | b_m | wall ] -> [ player color_swap | ... | b_s | b_l wall ]
( long range portal control - orange )
[ action player | cross_o no occluder ] -> [ action player shot_portal | cross_o o_m ]
[ player | ... | o_m | no occluder ] -> [ player | ... | > o_m | no occluder ] again
[ player | ... | o_m | occluder no wall ] -> [ player | ... | | occluder ] sfx0
up [ player | ... | o_m | wall ] -> [ player color_swap | ... | o_s | o_d wall ]
down [ player | ... | o_m | wall ] -> [ player color_swap | ... | o_s | o_u wall ]
left [ player | ... | o_m | wall ] -> [ player color_swap | ... | o_s | o_r wall ]
right [ player | ... | o_m | wall ] -> [ player color_swap | ... | o_s | o_l wall ]
( short range portal control - blue )
up [ action player | cross_b wall ] -> [ action player color_swap b_s | cross_b b_d wall ]
down [ action player | cross_b wall ] -> [ action player color_swap b_s | cross_b b_u wall ]
left [ action player | cross_b wall ] -> [ action player color_swap b_s | cross_b b_r wall ]
right [ action player | cross_b wall ] -> [ action player color_swap b_s | cross_b b_l wall ]
( short range portal control - orange )
up [ action player | cross_o wall ] -> [ action player color_swap o_s | cross_o o_d wall ]
down [ action player | cross_o wall ] -> [ action player color_swap o_s | cross_o o_u wall ]
left [ action player | cross_o wall ] -> [ action player color_swap o_s | cross_o o_r wall ]
right [ action player | cross_o wall ] -> [ action player color_swap o_s | cross_o o_l wall ]
( portal overwriting )
[ b o | b_s o_s ] [ player p_b ] -> [ b | b_s ] [ player p_b ]
[ b o | b_s o_s ] [ player p_o ] -> [ o | o_s ] [ player p_o ]
( bad portal sound )
[ action player no color_swap no shot_portal ] -> sfx0
( remove shot_portal marker )
[ shot_portal ] -> []
( portal color swapping )
[ player color_swap p_b | cross_b ] -> [ player p_b | cross_o ]
[ player color_swap p_o | cross_o ] -> [ player p_o | cross_b ]
[ player p_b | cross_o ] -> [ player p_o | cross_o ]
[ player p_o | cross_b ] -> [ player p_b | cross_b ]
[ color_swap ] -> []
( standard crate movement )
[ > player | crate ] -> [ > player | > crate ]
[ > crate | crate ] -> [ > crate | > crate ]
up [ > crate | obstacle no t_d ] -> cancel
down [ > crate | obstacle no t_u ] -> cancel
left [ > crate | obstacle no t_r ] -> cancel
right [ > crate | obstacle no t_l ] -> cancel
[ player no both_portals ] [ > crate | obstacle t ] -> cancel
( cancel block double-tp case )
[ > crate b_s o_s | t ] -> cancel
( push block through teleporter logic )
[ > player b_s | b ] [ o_s crate ] -> [ > player b_s | b ] [ o_s crate c_m ]
[ > player o_s | o ] [ b_s crate ] -> [ > player o_s | o ] [ b_s crate c_m ]
[ > crate b_s | b ] [ o_s crate ] -> [ > crate b_s | b ] [ o_s crate c_m ]
[ > crate o_s | o ] [ b_s crate ] -> [ > crate o_s | o ] [ b_s crate c_m ]
( logic for multi-block pushing, need a manual rule for each number of blocks )
[ t | crate c_m | crate | crate | no object ] -> [ t | crate c_m | crate | | crate ] sfx6
[ t | crate c_m | crate | no object ] -> [ t | crate c_m | | crate ] sfx6
[ t | crate c_m | no object ] -> [ t | | crate ] sfx6
[ c_m ] -> cancel
( cancel illegal tp )
[ > player | b ] [ o_s object ] -> cancel
[ > player | o ] [ b_s object ] -> cancel
( teleporting player )
[ > player status b_s | b ] [ o_s ] [ cross ] -> [ b_s | b ] [ player status tp_o o_s ] [] sfx4
[ > player status o_s | o ] [ b_s ] [ cross ] -> [ o_s | o ] [ player status tp_b b_s ] [] sfx4
( adjust crosshair post-tp )
[ b | player p_b tp_b | ] -> [ b | player p_b tp_b | cross_b ]
[ b | player p_o tp_b | ] -> [ b | player p_o tp_b | cross_o ]
[ o | player p_b tp_o | ] -> [ o | player p_b tp_o | cross_b ]
[ o | player p_o tp_o | ] -> [ o | player p_o tp_o | cross_o ]
( player status tracker )
[ > player status ] -> [ > player > status ]
( cancel illegal crate tp )
[ > crate | b ] [ o_s obstacle ] -> cancel
[ > crate | o ] [ b_s obstacle ] -> cancel
( mark crates for teleport )
[ > crate b_s | b ] [ o_s ] -> [ b_s c_t_o | b ] [ o_s ] sfx5
[ > crate o_s | o ] [ b_s ] -> [ o_s c_t_b | o ] [ b_s ] sfx5
( LATE LOGIC )
( crate teleport )
late [ c_t_o ] [ o_s ] -> [ ] [ crate o_s ]
late [ c_t_b ] [ b_s ] -> [ ] [ crate b_s ]
( plate logic )
late [ plate_v crate ] [ gate_v ] -> [ plate_v crate ] [ ]
late [ plate_h crate ] [ gate_h ] -> [ plate_h crate ] [ ]
late [ plate_v player ] [ gate_v ] -> [ plate_v player ] [ ]
late [ plate_h player ] [ gate_h ] -> [ plate_h player ] [ ]
late [ plate_v no crate no player ] [ gate_m_v no player no crate ] -> [ plate_v no crate no player] [ gate_v gate_m_v ]
late [ plate_h no crate no player ] [ gate_m_h no player no crate ] -> [ plate_h no crate no player ] [ gate_h gate_m_h ]
( plate sound effects )
late [ gate_marker gate_prev_close no gate ] -> [gate_marker gate_prev_open ] sfx1
late [ gate gate_prev_open ] -> [ gate gate_prev_close ] sfx2
( delete portals on portal barrier entry )
late [ player portal_barrier ] [ b ] [ b_s ] -> [ player portal_barrier ] [] [] sfx3
late [ player portal_barrier ] [ o ] [ o_s ] -> [ player portal_barrier ] [] [] sfx3
( delete blocks on portal barrier entry )
(late [ crate portal_barrier ] -> [ portal_barrier ])
==============
WINCONDITIONS
==============
all player on exit
=======
LEVELS
=======
message Level 1 of 5
message Press X to shoot a portal. Get to the yellow exit.
( easy, good door intro )
#############
#.....#.....#
#.....#.....#
#.rcr.;.....#
#.....#.....#
#.....#.....#
###-#####-###
#..h..#.....#
#.....#~~~~~#
#..c..#.....#
#.....#..e..#
#.px..#.....#
#############
message Level 2 of 5
message You can shoot portals through glass, but not at black walls
message Blue barriers delete portals and block crates.
( pretty easy, good transition from easy to intermediate )
########%%%%%
#.!.#...%.p.%
#.!e#...%.x.%
#.!.#..r;...%
#-###...%.c.%
#.hhg...%...%
####gggg#~~~#
#...........#
#.........c.#
#...........#
#############
message Level 3 of 5
( good intermediate )
#############
#.p.........#
#.x..###....#
#..###-######
#..g....c##e#
#..###.####.#
#..#.#.####~#
#..%...rr.;.#
#..#g#.######
#....#g#....#
#.....h.....#
#############
message Level 4 of 5)
( really nifty intermediate )
...###.
...#e#.
...#-#.
####~##
#.rhr;#
#gg~###
#.....#
#x..c.#
#p..c.#
#######
message Level 5 of 5
( pretty hard, feels satisfying )
..###.
..#e#.
..#~#.
..#-##
###..#
#.;h##
#r####
#.cc.#
##.#x#
.#..p#
.#####
message Thanks for playing!!!