title Heroes of Sokoban II: Monsters
author Jonah Ostroff
text_color yellow
key_repeat_interval 0.25

========
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

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

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

DragonLeft
Green Red Orange Yellow DarkGreen
.....
1100.
3210.
1100.
...4.

DragonRight
Green Red Orange Yellow DarkGreen
.....
.0011
.0123
.0011
.4...

Goblin
Green DarkBrown DarkGreen
0.2.0
00000
..0..
.111.
.1.1.

Dying
White

Saved
#D8D800
..0..
.000.
..0..
..0..
.....

HasSaved
Yellow
.....
.....
.....
.....
.....

Corpse
#CCC
.000.
.000.
00000
.0.0.
.0.0.

LFireball
Orange

RFireball
Orange

DidNotMove
Purple

=======
LEGEND
=======

Dragon = DragonLeft or DragonRight
Player = Fighter or Wizard or Thief or Priest
SPlayer = Swizard or Sthief or SFighter or SPriest
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 = Dragon or Goblin
Moveable = Crate or SPlayer or Monster
Static = Wall or ClosedDoor
Weighing = Crate or Hero or Monster
Vulnerable = Hero or Monster
Invulnerable = Crate or Static
Fireball = LFireball or RFireball
. = Background
# = Wall
F = Fighter
W = Wizard
T = Thief
P = Priest
1 = SFighter
2 = SThief
3 = SWizard
4 = SPriest
* = Crate
G = Goal
[ = YellowDoor
] = PurpleDoor
{ = YellowSwitch
} = PurpleSwitch
L = DragonLeft
R = DragonRight
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)
EndGame 86793500

================
COLLISIONLAYERS
================

Background
Warpball, Dying
Goal, Switch, OpenDoor, ShadowDoor
ClosedDoor, Hero, Crate, Wall, Monster, Corpse
RFireball, Saved, DidNotMove
LFireball, HasSaved

======
RULES
======
[Saved] [Wall] -> [] [Wall HasSaved] (Remembering whether we saved someone last round by attaching a note to some wall.)

[Corpse] -> Restart

(Adds a DidNotMove to where the player currently is, to cancel moves where they bump into a wall.)

[Player] -> [Player DidNotMove]

[ >  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] (Wizards telexport. What they really do is shoot a "warpball", which causes them to move normally if it hits a wall and warp if it hits something they can warp with.)

(The following mess is for changing characters.)
[ Action Fighter] [SThief] -> [SFighter] [Thief Sfx1]
[ Action Thief] [SWizard] -> [SThief] [Wizard Sfx1]
[ Action Wizard] [SPriest] -> [SWizard] [Priest Sfx1]
[ Action Priest] [SFighter] -> [SPriest] [Fighter Sfx1]

[ Action Fighter] [no SThief] [SWizard] -> [SFighter] [no SThief] [Wizard Sfx1]
[ Action Thief] [no Swizard] [SPriest] -> [SThief] [no SWizard] [Priest Sfx1]
[ Action Wizard] [no SPriest] [SFighter] -> [SWizard] [no SPriest] [Fighter Sfx1]
[ Action Priest] [no SFighter] [SThief] -> [SPriest] [no SFighter] [Thief Sfx1]

[ Action Fighter] [no SThief] [no SWizard] [SPriest] -> [SFighter] [no SThief] [no SWizard] [Priest Sfx1]
[ Action Thief] [no SWizard] [no SPriest] [SFighter] -> [SThief] [no SWizard] [no SPriest] [Fighter Sfx1]
[ Action Wizard] [no SPriest] [no SFighter] [SThief] -> [SWizard] [no SPriest] [no SFighter] [Thief Sfx1]
[ Action Priest] [no SFighter] [no SThief] [SWizard] -> [SPriest] [no SFighter] [no SThief] [Wizard Sfx1]

(Cancels the move if the player is in the same place that they started. Notice that switching characters negates this. Only matters in levels where one dragon has multiple targets.)

Late [Player DidNotMove] -> Cancel
Late [DidNotMove] -> []

(Now enemies attack.)

Late [DragonLeft] -> [LFireball DragonLeft]
Late [DragonRight] -> [RFireball DragonRight]

Late RIGHT [RFireball | No Vulnerable no Invulnerable] -> [ | RFireball]
Late LEFT [LFireball | No Vulnerable no Invulnerable] -> [ | LFireball]
Late RIGHT [RFireball | Vulnerable] -> [ | Dying Vulnerable]
Late Right [RFireball | Invulnerable] -> [ | Invulnerable]
Late Left [LFireball | Vulnerable] -> [ | Dying Vulnerable]
Late LEFT [LFireball | Invulnerable] -> [ | Invulnerable]

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 HasSaved on a wall and moves it to the Priest. Then, if someone was saved this turn, plays the sound only if the Priest doesn't have the HasSaved note. Finally, cleans that up.)

late [Wall HasSaved] [Healer] -> [Wall] [Healer HasSaved]
late [Saved] [Healer no HasSaved] -> [Saved sfx4] [Healer]
late [HasSaved] -> []

==============
WINCONDITIONS
==============

All Hero on Goal
All Goal on Hero

=======
LEVELS
=======

Message Welcome back.

Message [You've played the original, yes?]

Message [If not, this might be confusing.]

#############
#.......[...#
#.*.F.{.[.G.#
#############
#.......[...#
#.*.2.{.[.G.#
#############
#.......[...#
#.*.3.{.[.G.#
#############

Message Watch out for goblins.

#############
#F.O.......O#
#...O.......#
#.......O...#
#O..........#
#....O......#
#O.......O..#
#.O.....O.G.#
#############

#############
###O###O#####
#W.*****...O#
#..*****....#
#####O###O..#
#O########..#
#*G...O.O...#
##..O..O.O..#
#############

Message Goblins attack each other too.

#############
#.......#...#
#...*...#.G.#
#.F...O.#...#
#...*...##O##
#...........#
#############

Message Dragons breath fire.

###############
#.............#
#..T..###.....#
#.....L.#.....#
#.......#.....#
#.............#
#.....#.......#
#.....#.R..G..#
#.....###.....#
#.............#
###############

Message Fire hurts enemies.

##############
#...#....O.RG#
#.T.#......R.#
#...#R*L...R.#
#R*.#...#..R.#
#...#...#..R.#
#...O.*.#..R.#
#.......#....#
##############

###########
#3.O.O.O.T#
#.#########
#......G.G#
#.#########
#R.O.O.O.O#
###########

Message Think fast!

#############
#R.O.O.O.O.T#
###########{#
###########]#
#G#3.[.}.G#G#
#]###########
#{###########
#1..O...O..L#
#############

Message Sorry about that one.

#######
##G*G##
##.G.##
#R...##
##...##
##...##
##...##
##...L#
##...##
##F23##
#######

Message Kill monsters to open the M wall.

###########
#L...R#...#
#.....#...#
#.....M.G.#
#.T.*.#...#
#.....#...#
###########

#############
#.......#...#
#..O.O..#...#
#R......M.G.#
#.*.F.*.#...#
#.......#...#
#############

#############
#.......#...#
#.{.*.{.#...#
#..W.O..M.G.#
#.{.*.[.#...#
#.......#...#
#############

Message Yellow priest is protected.

###########
#...#O#O#O#
#.P.......#
#...**O**.#
#********.#
#R..G.....#
###########

###########
#W#######G#
#.#O#O#O#.#
#.........#
#.##O#O##.#
#4#######G#
###########

Message Heroes next to a priest are safe.

############
#...#.O#O###
#.F.#......#
#...#.##O..#
#.4...O#G.G#
#...#.##.O.#
############

############
#.#..T..#4##
#.#.{.*...L#
#.#.....#..#
#G[.*.{...L#
#.#.....#..#
#.#.{.*...L#
#.#.....#G##
############

###########
#W...O#...#
#.....#.G.#
#..4..M...#
#.....#.G.#
#O...O#...#
###########

###########
#.T.##O#O##
#.........#
#.4.#O#O..#
########.##
#G..####.O#
#G#.O###.##
###.###O..#
#O..O#....#
##...*....#
###########

###########
#{*F#.4#.3#
#{*.#..#..#
###[#[###.#
#R[.......#
####O#.##.#
######.##.#
#G.G.G.#O*#
###########

###########
#.T.####O##
#.3......O#
#.4.###O.##
#####O##.##
#.G..*.O.##
#G.G#O##.##
###########

###########
##O#O#O#O##
#T[.[.[.[.#
##{#{#{#{.#
#.........#
#.3G*G*G4.#
#.........#
###########

Message The final challenge.

#############
#...#O.O#...#
#.F.#G.G#.2.#
#...#.O.#...#
##.###*###.##
#R*L.....R*L#
#.#.......#.#
#R*L.....R*L#
##.###M###.##
#...#...#...#
#.3.#G.G#.4.#
#...#...#...#
#############

Message Thanks for playing!