Ending on a high note

(and why not starting so as well, while we're at it?)

How to make a nice intermission screen with text and backgroung image

You found a secret area!

Despite the "intermission screen" expression often refers to the player numeral stats at the end of each level in Doom, Heretic or Quake (time spent, kills, secrets...), those games had already established a tradition of inter-hub screens displaying text about the storyline progression. In the Hexen series the stats are gone but the storytelling intermission stays more than ever.

It is a nice way to conclude a narrative arc, gives a feeling of completion and ends the adventure on a high note. It might also be used for ending credits. So why don't we see one at the end of literally every custom single map or episode??? One thing is certain: you'll have no excuse to pass after this tutorial!

· · ·

An intermission is a tasty recipe made out of the following ingredients:
  • A nice background picture
  • A background wallpaper to fill the space around the background picture, in case the latter does not cover the entire screen
  • An atmospheric text
  • An atmospheric text font
  • An intermission number triggering some internal hard coded behavior in the game engine

Background wallpaper

Let's talk about this one first because it's the easiest part and it's not connected to anything else.
Well, you don't have to bother with the wallpaper, actually: there is a default one supplied (that muddy brown thing you can see in the screenshot above). So if you are happy with it, leave it alone and go directly to the next section.
If you want to customize it, you can use QuArK to open data1/PAK0.PAK, find the gfx/menu/backtile.lmp file and save it as a standalone lmp file, convert it to bmp format thanks to Fimg, edit it in your favorite graphics editor, turn it back into an lmp file with Fimg, then put the new backtile.lmp file in gfx/menu.

Atmospheric text font

It's not a core necessity to change it either, especially if you think they at Raven made the best possible choice when they chose that default reddish font (look at the picture above once again to make up your mind).
It is the very font used just everywhere in the game: for the map name in the console, for some menus, for all those Tyranith, Razumen, triggers, doors, puzzles, etc. messages. So if you change that font, you significantly change a part of the look and feel of the whole game. I did make this choice for my maps because I personally find that the default reddish color is more that often hard to read depending on the background, and as a non native English speaker I takes me slightly longer to get the meaning of any text. If I have to decypher it against a messy or poorly contrasted background, I need even more time but the message has already vanished, and I missed the end of it. Very frutrating.

That font is not a real font by the way. It's an image divided in 8x8 pixels slots, each one containing the picture of one character. Two characters sets there: the reddish one and the beige one used for all that console messages (which is far more legible imho). This time you won't be able to use Fimg because for some reason gfx/menu/conchars.lmp (the image in question) lacks the usual lmp header info and is not recognized as a valid file. By chance another conversion tool called Lmp2Pcx is there to save us. Even so, I remember I had a hard time getting a usable conchars file to work with on the first time. That's why I prepared a clean copy for you to download here .

You are also welcome to use my own modified yellow high contrast version (see the example at the bottom), which keeps a pretty good legibility no matter the background. You can download it here . If you do so or make your own font from it, please credit me and put a link to this website in your work.

Strangely enough, once you've edited conchars.pcx, converting it back to lmp format with Fimg works.

Intermission number

All right, time to dive into the real stuff now!
Both the background picture and atmospheric text are bound to an intermission number. That number ranges from 1 to 12 (any other value would screw up) and has to be put in the level property of a trigger_hub_intermission entity. Each value within this range corresponds to a hard coded set of intermission properties:

#Trigger Pix Msg # Font Note
1Famine meso 396 Red
2Death egypt 397 Red
3Pestilence roman 398 Red
4War castle399 Red
5Demo endingcastle412 Red
6Eidolon end-1 393 Beige 1
7(idem) end-2 394 Beige 2
8(idem) end-3 395 Beige 3
9??? castle392 Beige
10Praevus mpend 539 Red
11Half PoP mpmid 546 Red
12New game end-3 562 Red 4

Columns are respectively: the intermission number, what triggers it in the vanilla game, the corresponding background image stored in the gfx folder, the corresponding message line number in strings.txt, the font set used (if Red: centered text on top of the background image; if Beige: centered text above the background image, on top of the wallpaper) and the number of a special note below.

Notes
  1. Intermission #6 automatically continues on Intermission #7 after a hard coded duration.
  2. Intermission #7 automatically continues on Intermission #8 after a hard coded duration.
  3. Depending on the intermission # you choose in the [6-8] range, you can have a 3 pages, 2 pages or 1 page intermission (all intermissions out of this range are 1 page only). If the player fires during one of those pages, the remaining one(s) is/are never shown; neither does the remaining text for the current page, if any.
  4. Intermission #12 is automatically launched when the player starts a new game from scratch and continues on the map called keep1 no matter what the trigger_hub_intermission says (you can rename your map as keep1 to exploit this instead of enduring it). The background image is the same as Intermission #8 but the text is different.
When an intermission is run, the current map is instantly terminated and all the puzzle items and cross level triggers are reset before jumping to the next hub.

As you probably guessed because I just dropped its name, your best friend to launch an intermission will be the trigger_hub_intermission entity. Actually there is only one of its kind throughout the whole game, calling Intermission #11 and triggered when you enter the column of light at the end of PoP hub #1 after having defeated the boss yakman. All the other intermissions are not triggered as per the mapper's request but automatically by the game engine in specific situations (mostly when a boss dies, cf. table).

Gate to Tulku

Step into the light

It's a pity trigger_hub_intermission didn't have a more glorious career in Hexen II and we're here to redress this injustice because it could do so much more than just calling Intermission #11. It could call them all! That's why I took the liberty of tweaking the entity so that it could give the best of itself. If you don't feel comfortable with doing a HexenC modification, then stick to the vanilla entity (which means you can only use it to trigger Intermission #11). Otherwise please download my modified trigger_hub_intermission and let's see how it can be set up...

trigger_hub_intermission
targetname*It's a point entity so it has no touch function and must be triggered by a button or trigger or whatever.
level An integer between 1 and 12: that's the intermission number (defaults to 11 to ensure backward compatibility).
delay The minimum duration the page is displayed before the player can fire to go on. Defaults to 2. Can be set to 999999 so that the player can NEVER go on and the intermission becomes an end screen. Indeed, at the end of a custom adventure the story is over, so jumping to any random map feels awkward and makes no sense to me. The only choice left to the user then is calling the menu and explicitely decide their next move. Neater imho.
spawnflagsCheck 1 to keep the puzzle items; check 2 to keep the cross level triggers (See here for more insights about those). The default game behavior resetting them all is what actually makes the hubs separate unrelated "missions". Keeping them makes an intermission into an intermap giving some storytelling between two maps without breaking the quest going on.
map* The name of the next map the player jumps to after the intermission. Must absolutely be different from the current map for some reason, otherwise things go south! That's why, to my deep sorrow, it's not possible to trigger an atmospheric text in-game (like a super plaque) then go back to where you were and go on. Too bad!
target* The targetname of the info_player_start where the player must spawn in the next map.
* Vanilla property available with the standard entity.

For a neat usage in TrenchBroom you may edit the entity definition in your hexen2.fgd file that way:
@PointClass base(Appearflags, Targetname, Target) = trigger_hub_intermission : "Trigger hub intermission (PoP)"
[
	delay(integer) : "Minimum duration" : 2
	level(integer) : "Intermission #" : 11
	map(string) : "Next map"
	spawnflags(Flags) =
	[
		1 : "Keep puzzle items" : 0
		2 : "Keep cross level triggers" : 0
	]
]
In conclusion, I would say that releasing a new map or even more a full episode is like offering a most appreciated gift to the Hexen II lovers community. And usually when you offer a gift you care about presenting it in a pretty wrapping, don't you? Intermissions are such a wrapping. So in my humble opinion the ultimate refinement would be:
  1. Give no shortcut starting your game automatically because it will impose a player class. Instead let the user freely choose their favorite character and start a new game the way they would with the vanilla game.
  2. Good news: it makes Intermission #12 automatically introduce your story. Take this chance to make a good impression even before the game has started!
  3. Your starting map has to call keep1 of course, otherwise it's the normal Eidolon's Lair map which starts.
  4. At the end of your map or episode, a concluding intermission ends on a high note (with a 999999 delay ;-)).
Et voilà!

Wheel Of Karma introduction

Wheel Of Karma introductory intermission
Background image & wallpaper, font and text: everything custom!

Want to ask for clarification, report an issue with this trick or propose another one? Drop me an email If you use the trick please credit me and put a link to this website.