puzzlescript
Version:
Play PuzzleScript games in your terminal!
651 lines (550 loc) • 12.5 kB
Plain Text
title Heroes of Sokoban III: The Bard and The Druid
author Jonah Ostroff
text_color yellow
key_repeat_interval 0.25
run_rules_on_level_start
========
OBJECTS
========
Background
989898 #C8C8C8
00000
00100
00000
00010
00000
Goal
Brown Yellow
.000.
00000
00010
00000
00000
Wall
Darkgrey #222222
01000
11111
00010
00010
11111
Fighter (Warrior sounds better in-game, but I want different abbreviations for the classes in the editor.)
FF4444 Pink DarkBrown
.000.
.111.
00000
.000.
.2.2.
Wizard
2266FF Pink
.000.
.010.
00000
.000.
00000
Thief
66DD66 Pink DarkBrown
.000.
.010.
00000
.0.0.
.0.0.
Priest
FFFFAA Pink
.000.
.111.
00000
.000.
00000
Bard
8800FF #884400 #444444
.222.
.111.
00000
.000.
.0.0.
Druid
FF8800 Pink DarkBrown
.212.
.111.
00000
.000.
00000
SFighter
880000 Pink DarkBrown
.000.
.111.
00000
.000.
.2.2.
SWizard
000088 Pink
.000.
.010.
00000
.000.
00000
SThief
006600 Pink DarkBrown
.000.
.010.
00000
.0.0.
.0.0.
SPriest
B8B800 Pink
.000.
.111.
00000
.000.
00000
SBard
440088 #884400 #444444
.222.
.111.
00000
.000.
.0.0.
SDruid
884400 Pink DarkBrown
.212.
.111.
00000
.000.
00000
Crate
Orange #552200
.111.
10001
10001
10001
.111.
YellowSwitch
Yellow Black
.....
.111.
.101.
.111.
.....
YellowOpen
Yellow
0...0
.....
.....
.....
0...0
YellowDoor
Yellow #AA7722
01010
10001
00000
10001
01010
PurpleSwitch
6611CC Black
.....
.111.
.101.
.111.
.....
PurpleDoor
6611CC #220088
01010
10001
00000
10001
01010
PurpleOpen
6611CC
0...0
.....
.....
.....
0...0
MonsterDoor
DarkGrey #222222 Red
21002
22122
20212
20012
21112
Warpball
Blue
ShadowDoor
Purple
Goblin
Green DarkBrown DarkGreen
0.2.0
00000
..0..
.111.
.1.1.
Dying
White
Saved
D8D800
..0..
.000.
..0..
..0..
.....
HasSavedDoor
Yellow
.....
.....
.....
.....
.....
Corpse
CCC
.000.
.000.
00000
.0.0.
.0.0.
Note
8800FF
.....
..00.
.00..
.00..
.....
=======
LEGEND
=======
Player = Fighter or Wizard or Thief or Priest or Bard or Druid
SPlayer = Swizard or Sthief or SFighter or SPriest or SBard or SDruid
Hero = Player or Splayer
Healer = Priest or SPriest (Unlike the other heroes, priests must function even when inactive. "Healer" is the generic term for an active or inactive priest.)
ClosedDoor = PurpleDoor or YellowDoor or MonsterDoor
OpenDoor = YellowOpen or PurpleOpen
Switch = PurpleSwitch or YellowSwitch
Monster = Goblin
Moveable = Crate or SPlayer or Monster
Static = Wall or ClosedDoor
Weighing = Crate or Hero or Monster or Wall
Vulnerable = Hero or Monster
Invulnerable = Crate or Static
. = Background
= Wall
F = Fighter
W = Wizard
T = Thief
P = Priest
B = Bard
D = Druid
1 = SFighter
2 = SThief
3 = SWizard
4 = SPriest
5 = SBard
6 = SDruid
* = Crate
G = Goal
[ = YellowDoor
] = PurpleDoor
{ = YellowSwitch
} = PurpleSwitch
O = Goblin
M = MonsterDoor
=======
SOUNDS
=======
Moveable move 82056307
Sfx0 21221308 (teleport)
Endlevel 36315908
Sfx1 66399906 (switch player)
Sfx2 92172900 (close door)
Sfx3 15129100 (open door)
Sfx4 69860105 (saved)
Sfx5 63194902 (kill enemy)
Sfx6 81996702 (dying player)
Sfx7 20187909 (Bard leading)
Sfx8 93615108 (Transmutation)
EndGame 86793500
================
COLLISIONLAYERS
================
Background
Warpball, Dying
Goal, Switch, OpenDoor, ShadowDoor, HasSavedDoor
ClosedDoor, Hero, Crate, Wall, Monster, Corpse
Saved
Note
======
RULES
======
[Saved] [Goal] -> [] [HasSavedDoor] (Remembering whether we saved someone last round by temporarily changing some door to a HasSavedDoor. This is purely for sound effects purposes.)
[Corpse] -> Restart
[ > Fighter | Moveable ] -> [ > Fighter | > Moveable ]
[ > Moveable | Moveable ] [ Fighter] -> [ > Moveable | > Moveable ] [ Fighter] (Fighters push.)
[ < Thief | Moveable ] -> [ < Thief | < Moveable ] (Thieves pull.)
[ > Wizard ] -> [ Wizard > Warpball]
[ > Warpball | no Moveable no Static] -> [ | > Warpball]
[ > Warpball | Static] [Wizard] -> [ | Static ] [> Wizard]
[ > Warpball | Moveable ] [Wizard] -> [ | Wizard Sfx0] [Moveable]
[ > Warpball] [Wizard] -> [] [> Wizard]
(Wizards telexport. What they really do is shoot a "warpball", which causes them to move normally if it hits a wall or the edge of the screen and warp if it hits something they can warp with.)
(Druid does his thing. Warpball gets reused as a placeholder here. That's gonna happen a lot.)
Druid | Crate] -> [Druid | Wall Sfx8]
Druid | Monster] -> [Druid | Wall Sfx8]
Druid | Wall] -> [Druid | Crate Sfx8]
Druid | Healer] -> [Druid | Healer Saved]
Druid | Hero] -> [Druid | Hero Warpball]
[Warpball | Healer] -> [Saved | Healer]
[Warpball Hero] -> [Wall Sfx8]
(What strategic purpose could it serve for healers to protect against petrification? None, but it's fun.)
(I mean, theoretically you could write some horrid dragon breath timing puzzle where the ability to delay an extra turn without moving or switching characters is necessary in order to let you move someone else at the correct moment, but even if dragons still existed, that sounds like a really gross level.)
(Bard moves stuff. Reusing "WarpBall" for totally different purpose, so we can cancel the move if he doesn't move.)
Bard no Note] -> [> Note > Bard WarpBall]
Note] [Note] -> [> Note] [> Note]
Note Moveable | no Static no Moveable no Bard] -> [| Moveable Sfx7]
+[> Note Bard WarpBall| no Static no Moveable no Bard] -> [| Bard]
(Why are we doing this pseudo-movement instead of using the built-in version? Because using movement directions makes the note-adding stuff way easier below, and you can't use movement directions in the LATE phase, so the actual moving has to be done before then.)
[WarpBall] -> Cancel
[Note] -> []
(The following mess is for changing characters. But at least it's less messy than before. Thanks to Stephen for spotting my silly redundancies.)
[ Action Fighter] [SThief] -> [SFighter] [Thief Sfx1]
[ Action Thief] [SWizard] -> [SThief] [Wizard Sfx1]
[ Action Wizard] [SPriest] -> [SWizard] [Priest Sfx1]
[ Action Priest] [SBard] -> [SPriest] [Bard Sfx1]
[ Action Bard] [SDruid] -> [SBard] [Druid Sfx1]
[ Action Druid] [SFighter] -> [SDruid] [Fighter Sfx1]
[ Action Fighter] [SWizard] -> [SFighter] [Wizard Sfx1]
[ Action Thief] [SPriest] -> [SThief] [Priest Sfx1]
[ Action Wizard] [SBard] -> [SWizard] [Bard Sfx1]
[ Action Priest] [SDruid] -> [SPriest] [Druid Sfx1]
[ Action Bard] [SFighter] -> [SBard] [Fighter Sfx1]
[ Action Druid] [SThief] -> [SDruid] [Thief Sfx1]
[ Action Fighter] [SPriest] -> [SFighter] [Priest Sfx1]
[ Action Thief] [SBard] -> [SThief] [Bard Sfx1]
[ Action Wizard] [SDruid] -> [SWizard] [Druid Sfx1]
[ Action Priest] [SFighter] -> [SPriest] [Fighter Sfx1]
[ Action Bard] [SThief] -> [SBard] [Thief Sfx1]
[ Action Druid] [SWizard] -> [SDruid] [Wizard Sfx1]
[ Action Fighter] [SBard] -> [SFighter] [Bard Sfx1]
[ Action Thief] [SDruid] -> [SThief] [Druid Sfx1]
[ Action Wizard] [SFighter] -> [SWizard] [Fighter Sfx1]
[ Action Priest] [SThief] -> [SPriest] [Thief Sfx1]
[ Action Bard] [SWizard] -> [SBard] [Wizard Sfx1]
[ Action Druid] [SPriest] -> [SDruid] [Priest Sfx1]
[ Action Fighter] [SDruid] -> [SFighter] [Druid Sfx1]
[ Action Thief] [SFighter] -> [SThief] [Fighter Sfx1]
[ Action Wizard] [SThief] -> [SWizard] [Thief Sfx1]
[ Action Priest] [SWizard] -> [SPriest] [Wizard Sfx1]
[ Action Bard] [SPriest] -> [SBard] [Priest Sfx1]
[ Action Druid] [SBard] -> [SDruid] [Bard Sfx1]
(Bard plays music. This is my favorite part of the code, btw. Yes, you can make square area effects with just one object!)
[no Note | no Note | Bard] -> [^ Note | ^ Note | Bard]
[no Note | Bard] -> [^ Note | Bard]
Note | no Note | no Note] -> [Note | Note | Note]
Note | no Note] -> [Note | Note]
Note] -> [Note]
(Now enemies attack. Yeah, there's only one kind of enemy now.)
Late [Goblin | Vulnerable] -> [Goblin | Dying Vulnerable]
(Vulnerable objects that are attacked are designated as "Dying", but heroes can be saved by the Priest. Then the stuff that didn't get saved dies.)
Late [Dying Healer] -> [Saved Healer]
Late [Healer | Dying Hero] -> [Healer | Saved Hero]
Late [Dying Monster] -> [Sfx5]
Late [Dying Hero] -> [Corpse Sfx6]
(Doors opening.)
late [Weighing YellowSwitch] [YellowDoor] -> [Weighing YellowSwitch] [ShadowDoor]
late [YellowSwitch no Weighing] [YellowOpen] -> [YellowSwitch] [YellowDoor sfx2]
late [YellowSwitch no Weighing] [ShadowDoor] -> [YellowSwitch] [YellowDoor]
late [ShadowDoor] -> [YellowOpen sfx3]
late [Weighing PurpleSwitch] [PurpleDoor] -> [Weighing PurpleSwitch] [ShadowDoor]
late [PurpleSwitch no Weighing] [PurpleOpen] -> [PurpleSwitch] [PurpleDoor sfx2]
late [PurpleSwitch no Weighing] [ShadowDoor] -> [PurpleSwitch] [PurpleDoor]
late [ShadowDoor] -> [PurpleOpen sfx3]
late [MonsterDoor] -> [ShadowDoor]
late [ShadowDoor] [Monster] -> [MonsterDoor] [Monster]
late [ShadowDoor] -> [sfx3]
(Looks for a HasSavedDoor and, if there is one, puts a warpball on the Priest. Then, if someone was saved this turn, plays the sound only if the Priest doesn't have the warpball. Finally, cleans that up.)
late [HasSavedDoor] [Healer] -> [Goal] [Healer WarpBall]
late [Saved] [Healer no WarpBall] -> [Saved sfx4] [Healer]
late [HasSavedDoor] -> [Goal]
late [WarpBall] -> []
late [Note no Moveable] -> []
==============
WINCONDITIONS
==============
All Hero on Goal
All Goal on Hero
=======
LEVELS
=======
Message Many years have passed since the events of Heroes of Sokoban II.
Message Dragons have vanished from the realm, never to be seen again.
Message And new heroes have cropped up, as if there were only room for so many beings in one world.
##################
.F.#.........#**G#
***#...*****.#..*#
.G.#...*...*.#2..#
####...*...*.#####
.......*...*.....#
.......*...*.....#
####..**..**.#####
*..#.***.***.#..G#
*G*#..*...*..#.O.#
3.*#.........#4..#
##################
Message Purple bard charms nearby crates.
############
{#....{#...#
.#.*#B.[.G.#
*#.....#...#
############
##############
..############
.B..****.....#
..######.#####
########G#####
##############
Message Monsters may also be charmed.
############
.......#...#
...#...#...#
O..B..OM.G.#
...#...#...#
.......#...#
############
Message No one can resist the bard's music.
###########
G#.F.{..O.#
.[........#
G#.5.{..O.#
###########
###########
#[[[[[[[###
#[#####[###
#[##[[[[{*#
...#[######
.T.#......#
...#.5.G.G#
###########
#######
*G{####
##.####
...[W##
##.#.5#
*G*####
#######
########
....G#G#
.#*..#[#
.**....#
.......#
.{4{B{.#
...{...#
########
###########
*.{..{.**{#
###########
B21.......#
#########[#
.G..G..G..#
###########
Message Orange druid turns stone into wood, wood into stone.
############
.[.{.2.#.D.#
.#########.#
....G.G..#.#
############
############
...#####{{{#
.D.##...{{{#
...##.##{{{#
############
...#..######
.1.#..##G.G#
...#..#[...#
############
############
O*....{...3#
#.####.#####
#.###O.O##G#
#.####.###.#
#D[....###G#
############
Message Living things may also be turned into stone.
Message Try not to think about the moral implications, and don't do it any more than necessary.
############
###.4..##G.#
O..F..OM#.G#
###.6..##G.#
############
##############
.............#
.5.}}}.]]]]].#
...}}}.]G.G].#
.D.}}}.]]]]].#
.............#
##############
########
G#####W#
########
G#####6#
########
############
......O.G.G#
.###########
.###########
...#########
B.6#########
############
###############
...#...########
.G.#.}.....{[O#
...#.F.########
...#...########
.G.].4.########
...#...########
...#.5.########
.G.#.}.....{[O#
...#...########
###############
####M########
G.GM#F.2###O#
...#M.......#
G.GM#3.6###O#
####M########
###########
6######B###
........###
###########
.#######.4#
.......##1#
G.G.G.G##O#
###########
##############
....#O.O#...G#
..##W...1##..#
..#O..O..O#.G#
4.#..OGO..#..#
..#O..O..O#.G#
..##2...6##..#
....#O.O#...G#
##############
Message Get ready.
######################
.F.*....#G.G#....*.4.#
...#....#...#....#...#
######.........#######
####.#####O#####.#####
..##O#..#...#..#O##..#
.2.*....#G.G#....*.5.#
..##O#..*...#..#O##..#
####.####...####.#####
######..#..*O.*#######
...###.#######...#...#
.3.###.##G.G##...#.6.#
######################
###############
..............#
.1.4......G.G.#
..............#
.2.B......G.G.#
..............#
.3.6......G.G.#
..............#
###############
Message Thanks for playing!