100% found this document useful (1 vote)
871 views211 pages

Valkyrie Guide for Mansions of Madness

This document provides a guide for creating scenarios for the Valkyrie - Mansions of Madness Second Edition app. It covers installing prerequisites, selecting and downloading content, the basics of creating scenarios such as tiles, tokens, events and puzzles. More advanced functions like custom content, variables, monsters, translations and publishing are also explained. The guide aims to provide tools and templates to help designers create robust and systematic scenarios for the app.

Uploaded by

zbaynbuu
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
871 views211 pages

Valkyrie Guide for Mansions of Madness

This document provides a guide for creating scenarios for the Valkyrie - Mansions of Madness Second Edition app. It covers installing prerequisites, selecting and downloading content, the basics of creating scenarios such as tiles, tokens, events and puzzles. More advanced functions like custom content, variables, monsters, translations and publishing are also explained. The guide aims to provide tools and templates to help designers create robust and systematic scenarios for the app.

Uploaded by

zbaynbuu
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

Valkyrie - Mansions of Madness Second Edition Guide

Content
Installing Prerequisites 5

Select Content 7

Downloading Premade Scenarios 7

Creating a Scenario - The Basics 8


Scenario main screen 8
Editor Navigation 13
Creating Tiles and Tokens 15
Create a Tile 15
Create Tokens 16
Basic Start Event and Placing Tiles & Tokens 19
Create an Event 19
Place the Tile 20
Place the Token 21
Configure Tokens 22
Adding a new token and placing it 23
Configuring a new token with an interact button 25
Puzzles 27
Making it flow 29
Spawn (a monster) 32
See it all in action! 36
Items 42
Regular items - Giving a random item 42
Unique Items - Giving a single item 43
Starting Items - Giving a random Starting Item (and excluding specific items) 45
Interacting with Items 46
Add Items using Events 48
Let’s see Items in action 49
Set Variables to flag that an item is obtained 50

Creating a Scenario - Advanced Functions 51


Copy an Existing Scenario 51
UI Elements 54
Using built-in sound effects and music 60
Audio 60
Music 60
Custom Content 61
Custom Images 61
Custom Audio 62
Language specific UI and Audio 63
Triggers 64
Variables 65
Variable Types 65
How are they used 66
More advanced uses 67
Assigning a random number to a variable 67
Selecting a random hero and calling them later 68
Mythos Events 69
How Mythos Events work in the App 69
Create a Mythos Event 70
Mythos Events Based on Player Numbers 72
Testing your Mythos events 74
Now we have a working mythos event we can use Save & Test to test that it's all
working. 74
Advanced Events 76
Single Token/Event with Random Outcomes 76
Single Event with Multiple Outcomes controlled by Variables 78
Lets see it in action 85
Single Event with outcome based on test. 87
Person Token with Several questions 89
Event Loops 105
See it in action 114
Singling out an Investigator 119
Tile Placement and Planning 124
Start-up behavior of a scenario 124
Systematic and robust tile placement. 124
EventQMoveOneSpace 127
Multiple entry possibilities to a tile 128
Organizing your events 129
Systematic naming convention 129
Multiple event*.ini files 129
Custom Monsters 131
Create framework of the monster 131
Activations 132
Evade 138
Horror 138
Spawn the monster: 139
Trigger the Monster 139
Add a Test to stop it from spawning every round! 140
Completed Monster: 140
How the monster looks in game 141
Use cases 143
Custom Monster Images 144
Interactive System / Puzzles 145
Special Symbols 176
Using Special symbols for components 176

Translating a Scenario 178


Set Language 178
Download and Copy the Scenario 179
Translation Tips 180
Alternative Translation Method (Advanced) 184
Making your scenario ready for translation 190

General Tips 192


Alternate Endings 192
Late game events 192
Story is Key 192

Useful Tools 192

Publishing your Scenario 194


GitHub 195
Create an Account 196
Install the Windows GitHub Desktop Application 196
Create a Local and Remote Repository 196
Create a Valkyrie Package for your Scenario 199
Add your Scenario to your Repository 200
Request that your Scenario be linked to the Valkyrie Application 202
Adding a Translation file 203

Appendix; Code Snippets and Templates 204


3 Question Dialogue template: 204
Introduction UI - the prologue 207
Prologue Layout 207
UIIntroducitonBackground 208
UIIntroductionTextTop 208
UIIntroductionContinueBackground 208
UIIntroductionContinueText 208
UIIntroductionImage 209
UIIntroductionText 209

Finishing comments and Shout Outs 211


Guide Translations
This guide is now available in Spanish.

[Link]
edit?usp=sharing

Credit to EtiCarasoft, thank you!

Getting Set up
Installing Prerequisites
First off install Steam and download the Mansions of Madness App, from here:
[Link]

Go to the GitHub for Valkyrie and install it:


[Link]

Fire up Valkyrie and under ​Mansions of Madness Second Edition​ hit ​Import Content

You should see this after the import is complete.

It can take some time as it collects all of the data from the Steam App, so be patient.

Once done click ​Mansions of Madness Second Edition​.


Select Content
In this section you can select all of the game components you own. It is assumed that you own
the main game (MoM Second Edition).

If you own an expansion, figure packs or even Mansions of Madness First Edition, you can
select them here. Don’t forget to do this as it will open up more options for Scenarios when you
come to download them (now and in the future as people add them).

Downloading Premade Scenarios


If you’re not interested in making a Scenario just yet you can play some of the awesome
Scenarios that the community has already made and published.

To do this click on ​Start Scenario​ then click ​Download

Select the Scenario that you want to download, any that are already downloaded will be greyed
out.
Tip ​- You can use this section to Delete any Scenarios that you have downloaded from your
machine.
Click ​Back ​once you have downloaded all the Scenarios that you want and you should have a
list available.
Click the one you want to play:

Playing the Scenario works exactly like the Official App from this point on.
Creating a Scenario - The Basics

Right let’s get down to the fun stuff! Making your own Scenario!

First off read what Bruce (and the Valkyrie team) has to say about it, there are some great
guides here and they know this editor much better than I do:
[Link]

I’ll refer back to each of the Wiki entries where relevant, then give my insights on each topic. I
am still learning the nuances of the Editor, so will try to keep this updated and relevant as I learn
more (or as new content is added).

Scenario main screen


From the main menu hit ​Scenario Editor​ and hit ​New.
This will create a new Scenario called ​Scenario 1​, click it to begin.

Tip​ - You can also delete your own Scenarios from here, if you desire. Click ​Delete​ and then
click the Scenario you wish to delete.

The first screen that will greet you is the main screen, it will be pre-populated with some generic
information.
Change the ​Scenario 1​ name and give it a name fitting your ideas of the Scenario.

You can also select an ​Image ​for the Scenario, by clicking the box next to ​Image. ​This will be a
thumbnail next to the Scenario name, on the Download/Select Scenario page.

Keep this image small (200 x 200px for example) and in JPEG or PNG format.

Save it to the Scenarios content files location:


%appdata%Valkyrie\MoM\Editor\S​cenario1

Tip ​- JPEG is advised for this to keep the image small (since no Transparency or Text is
required).

Fill in a ​Descriptive ​for the Scenario and the ​Author's ​name (or an alias you secretive devils!).
Ignore the Icons for this part, they are used in game to display icons for skills tests.

Tip - ​ Don’t give too much away here, use it to entice players in. Treat it like a good movie
trailer, just enough to make people excited, but not enough to spoil the ending.

Next to ​Required Expansions​ click the ​+​ and add any expansion that are mandatory for your
scenario. Check which icon is displayed on the tilesets you intend to use, then select the
corresponding expansions in this list. The Mansions of Madness First Edition tiles (which have
no Icons) are “MoM1ET” pack. Remember that the Tentacle Icon (or saxophone as my wife calls
it) is the base (second edition) game, so you won’t need to select a pack if you only use those
tiles.
You don't need to select Recurring Nightmares (RN) if you've selected MoM1ET/MoM1EM since
they are the same content.
Also remember that some Monsters are custom to some expansions, so be sure to include the
correct expansions for any monsters you use. The Thrall for example is from BtT!

This confused me so I'll explain what each acronym is:

BtT​ - Beyond the Threshold (2nd Edition expansion)


CotW1I​ - Call of the Wild Investigators (1st Edition expansion, same as Suppressed Memories)
CoTWM​ - Call of the Wild Monsters (1st Edition expansion, same as Suppressed Memories)
CoTWT​ - Call of the Wild Tiles (1st Edition expansion, same as Suppressed Memories)
FAI​ - Forbidden Academy Investigators (1st Edition expansion, same as Suppressed Memories)
FAM​ - Forbidden Academy Monsters (1st Edition expansion, same as Suppressed Memories)
FAT​ - Forbidden Academy Tiles (1st Edition expansion, same as Suppressed Memories)
MoM1EI​ - Mansions of Madness 1st Edition Investigators (same as Recurring Nightmares)
MoM1EM​ - Mansions of Madness 1st Edition Monsters (same as Recurring Nightmares)
MoM1ET​ - Mansions of Madness 1st Edition Tiles (same as Recurring Nightmares)
RN​ - Recurring Nightmares Expansion (2nd Edition expansion)
SM​ - Suppressed Memories Expansion (2nd Edition expansion)

Set the minimum and maximum number of ​Investigators,​ assuming you want to limit the
number of players.

Tip ​- There are loads of tricks we can use to scale monsters and events to cater for more
players, so try to keep it 2-5 to avoid excluding people. I also believe Valkyrie can cater for
larger player groups, give it a try it you’re feeling brave.

Enter the number of minutes you think the game will last. I have no idea of a good algorithm for
this, I would suggest play testing your scenario once it’s complete, then adding a bit extra,
remembering that people will be reading every dialog and talking amongst themselves when
playing for the first time.
Tip​: Valkyrie now collects statistics in game. Keep an eye on the stats sheet to get live data on
your scenarios plays. There is a handy section and graphs that show average play times. Over
time this will become very accurate.
[Link]

Set the ​Difficulty​, the scale is 0 to 1 using decimals. So, for example if you want your Scenario
to show as 3 stars, then you would put 0.6.

Here’s a quick reference to make it easier:

0 0 Stars
0.2 1 Star
0.4 2 Star
0.6 3 Stars
0.8 4 Stars
1 5 Stars

Tip​ - If you want to be a smart-arse, you can set the difficulty to part of a star using fractions in
between. For example 0.5 will be 2 and a half stars!
Editor Navigation
Before I get into the guts of the Editor, I wanted to quickly explain how to navigate it. The actual
use of the Editor is straightforward, but there are some navigation options that make life a lot
easier.

1) The Scenario and Components button serve the same function, they open the Components
menu, this menu is the most used section:

2) Save & Test can be used to sample your Scenario at any time. This allows you to run it as a
player would see without having to save and exit. More about this later.
3) “Tools” is self explanatory, Reorder Components is handy for organizing your tiles/tokens/etc.
But generally speaking you won’t use this much.
4) Menu - Can be used to save, etc, etc.
While using the Editor; creating events, tokens, spawns (etc), there are some useful buttons that
you can use to navigate.

1) ​Back Button​, this will take you to the previous item you were on.

2) ​Go to Component​, clicking this will take you to the Component if refers to (event, item,
puzzle spawn, etc).

3&4) Clicking the ​+ ​icon for an event will give you the option to create a {new} one.

These buttons significantly streamline navigation of your Scenario, so I would encourage you to
learn how they function.
Creating Tiles and Tokens
I’ve grouped these together because they are very similar in the way they are placed. You
create them and place them, but they won’t show in the game until “Added as a Component” in
an Event (Spawn, etc).
To add either of these to the game, you must select them from the ​Add Components​ option in
the event (spawn, etc) you wish them to appear in.

Create a Tile
Click ​Components​ (or Scenario) from the top to open the components menu and then ​Tile​,
then ​{New Tile}.

Select a Tile by clicking on the box next to ​Image​, you can change a tile at any time this way

Click ​X Snap ​and click on the screen​ ​to put it in place.

Click ​Rename​ and give it a sensible name (all one word)

Tip​: I personally add ​T1_​, ​T2_, T3_​, etc to the start, so I know what order to place them in. This
also helps filtering and remembering which token belongs with which tiles. Later into writing your
scenario you'll see how way it is for events to get jumbled u, so a clear naming convention will
save you hours later on.

Use ​Rotation ​if you want it placed in a different orientation.


When you come to add subsequent tiles, you will notice some that are shaded in blue. This
indicates that the tile has been placed, either face up or face down (tiles are dohble sided
remember!).

I would recommend that you place all of your Tiles first, get them lined up and try to avoid as
many doors facing walls as possible, we are limited on wall tokens!

Create Tokens
You can create and place Tokens in the same way.
Click ​Components​, then ​Token ​from the left hand menu​ ​and then Click ​{New Token}​.

Click ​Type ​and select the token you wish to use.

Snap​ will fix the token to set points on the tile, as shown below:
However Tokens have another option to ​~ Free​ position them, this will allow you to put the
Token anywhere.

Tip ​- When placing tokens, try to use the the artwork on the board. For example, if you have a
search token for side table, place it on a side table that is depicted on the tile. If there is no
table, reconsider using another description for your token, something that is actually on the Tile!

Tip ​- You can select tiles and tokens by right clicking on them! Handy!

Tokens differ slightly to Tiles when it comes to use. Tiles can be placed or removed, that's it.
Tokens however can be interacted with, if Dialog is added.

Interacting with a token is when you touch (or click) a token in game.
Enter text into the Token’s Dialog Box if you want to allow investigators to interact with it. If the
Token has no dialog then Investigators will not see a dialog pop up when they select it, however
the camera will still move.

Tip​: A token that has no dialog and a button (with an event assigned) will automatically run the
event when the token is clicked. This is a clever way to add tokens that change based on
events. You can use variables to set when events will run, if more than one are attached to the
button. ​See advanced events for more information

Rename the ​Continue​ button to ​{action} Investigate

Click the Green ​+ ​to add an event to be triggered.

When a player touches (clicks) the option it will trigger the events linked to it.
I will explain how this works in more detail later.
Basic Start Event and Placing Tiles & Tokens
Now that we have a tile and a token placed, we need to create several events to utilise them.
First off we want an event to place them.

Open the ​Components ​menu and click ​Event​, then​ {New Event}

Create an Event
Since this is our first event, we need to tell the app to trigger it.

Click the ​Trigger​ box and select ​EventStart​ from the​ General ​List.

Note​ - Technically many events can trigger from ​EventStart​ but an order can’t be guarenteed,
so it's best to only set one. Typically you will want this to be your “Setting the Scene” dialog,
which is best done with UI Elements, ​more on this later​. But for this example we’ll just trigger a
basic event.

Enter some ​Dialog​, this will be displayed in a box to tell the Investigators what to do.

We will use the official app as a reference on how we want to place items, it will typically place a
tile and wall as the first event, then place each interactive token (Search, Sight, Interact) one by
one, Sight tokens are usually the last to be placed.

This Dialog should tell the investigators what tiles, tokens or monsters that should be placed,
you can use ​{c:​TileName}​ ​in the test Dialog box to have the App automatically list the tile name
(and icon) to avoid mistakes.

Click the ​Unused ​box till it reads ​Camera, ​this will tell the event to move the camera
Click ​Snap ​or ​Free​ then click the tile to select where the camera will move to.

Place the Tile


Click the green ​+​ next to ​Add Components​ and then select the tile - ​Lobby_T1
Once you enter some Dialogue and Components, a button will automatically add, you can enter
the text that you would like the button to have. For this example the default ​Continue​ is perfect.

Click the green ​+​ just under the button and click ​{New Event} ​this will create a new blank event

Tip ​- You can also select an event, spawn or puzzle that you have previously created or the
{new} option to create new ones, if you prefer.

When the player clicks the ​Continue​ button, it will run the next event (in this case Event0).

Click the Blue box after ​Event0 ​to open this new event for editing.
Place the Token
We will use this as the event that places the Token we have created, give it a more suitable
name using the ​Rename​ option (don’t worry the previous event will still point to this one, even if
it has been renamed)

Enter some ​Dialogue ​to describe to the investigators why they are placing the token.

Click the green ​+​ next to ​Add Components​ to place the Token.

Tip​ - You can click the Blue box next to it to open the token, if you do click the Blue Back button
(top left of screen) to go back to our PlaceTokenExampleToken_T1 event

A ​Continue​ button will be added automatically. We won’t add another event or now, if a button
has no actions (or triggers an action that won’t run due to tests, ​more on them later​) then it will
exit the dialog back to the Map screen.

I will explain more ​advanced Events later on​, I want to cover the basics here.
Configure Tokens
Now we have placed the token, we can configure the token and give it buttons, which will trigger
events.

Open the ​Components ​menu and select your example token (​TokenExampleToken_T1​).

Click the green + below the “{action} Investigate” button and click {New Event} then click the
Blue button after the event that has just been added.

Rename the event and add some dialog, stating you will be removing the token.

Tip​ - You can click the icons above the Dialog box to enter them into the text. Here i’ve added a
clue token symbol using the Clue button which adds the code {clue} that translates to the icon in
game.

Since we want to remove the Search token, we have to tell the App to remove it. This is done in
a similar way to adding a component to the board.

Click the ​Remove Components​ and select your example token from the list
(TokenExampleToken_T1)

Leave the ​Continue​ button empty for now.


Adding a new token and placing it
Now we have a working event and token, let's add another token for players to interact with.

First off we need to create the token, ​using the process above​.
Create it, name it and add some dialog.

Create an Event to place it, ​using the process above​ but do not set a trigger (since we can only
have one).

Create it, name it, add the token (we’ve just created) as a component, set the camera position
and add some dialog:
Open the PlaceExampleToken_T1 event we created earlier, from the ​Components ​menu. In
this event under the blank ​Continue​ button, click the green ​+​ and then select this new event we
have just created.

This event will now add the additional token in the starting event chain.

Feel free to Save and Test and watch it appear!


Configuring a new token with an interact button
The plan for this token is to use the Search token to give an option to “Investigate” the table,
with an unexpected event causing us to make a simple test and tell the App if we have “Passed”
or “Failed”.

So let’s open the Token (TokenExampleToken2_T1) from the components menu.

Rename the ​Continue​ button to ​{action} Investigate​ and click the green ​+​ to add an event.
Edit the created event and give it a name and some dialog, you can use the Icons in your text
since we are going to ask the investigator to make a roll.

Rename the ​Continue​ button to ​Passed

Click the green ​+​ next to ​Buttons​ to create a second button and name it “Failed”

I have added an {agility} test, in game this code will show as .

We will use the ​Passed ​Button to trigger an event, and explain puzzles.

We will use the ​Failed ​Button to trigger a Spawn and explain how monsters work.
Puzzles
In the created event, we will tell the player that they have successfully caught the Vase. Then
we can explain that there are several ripped up shreds of paper to “piece together” and trigger a
puzzle.

Use the Green ​+​ under the ​Passed​ button to create an event to describe that happens if the
Investigator Passes.

Edit the Event and add some dialog to explain that the investigator has caught the vase and
finds several shreds of paper on the desk.

Add a button and rename it to ​Tap to attempt Puzzle using {observation}


Click the Green ​+ ​under the button and click ​{New Puzzle}

Click the ​Blue to edit the Puzzle and give it a sensible name.

There are several puzzle class types, for this one we will do an ​Image ​puzzle. Click the box next
Class ​and select ​Image.
Set the skill to ​Observation
We’ll make this test a little easier than the default, so set the level to 3 and the alt level to 3.

Tip ​- Always test your puzzles in game, especially the Code and Image puzzles. Some images
are easier to slot together than others.

Click ​Image ​and then the image you would like to use. For this example we’ll use the
PuzzleOldJournal image.

Tip​ - You can select your own custom images from here, assuming that they are in the correct
format (PNG or JPEG) and copied to the Scenario folder
%appdata%Valkyrie\MoM\Editor\S​cenario1, (​ More on this in UI Elements).​ JPEGs are generally
the most suitable format for Puzzles as they are usually smaller in file size.

The button at the bottom will become available to the player when the puzzle is complete,
otherwise they will have an option to close. Only the first button will show for puzzles, so we can
only create one button

Enter the button text that is in context for your puzzle, for this example we’ll use “Complete”.
Click the green ​+​ to add a completion event, give it a dialogue explaining what the papers says
and give them a reward (maybe a clue or two), tell the players to remove the token and use
Remove Components​ to remove it from the app’s board.

Making it flow
Since the investigators might not pass this puzzle first time, we don’t want to make them roll an
agility check each time they interact with the Search token, we need the next time they click
(touch) the search token to present them with the puzzle.

We can do this in one of two ways, we can remove the token and add a new token in its place
(without dialogue so the players won’t notice).

Or​ - We can add the puzzle to the tokens “Investigate” section, putting it at the top of the list
(ordered), then tell it to “Test” if a certain variable is set to “1”. Before it becomes an option for
the players we would then have to assign the variable in the “EventLobbyTablePassed_T1
event” to 1, which would make the test the default option from then on, See​ Variables for more
information on this​.
I’ll explain the former, as its a little easier to understand at this stage and the function has its
uses.

Create a new token and give it a sensible name (TokenLobbyTokenExample2a_T1 in this


example).

Add some dialogue to explain what the table looks like now we’ve interacted with it, for example
there is a table with a notepad on it and the vase has been carefully placed on the floor beside
it.

Then give it a button ​{action} Investigate​ that opens the Puzzle.


Open the ​EventTablePassed_T1​ skill check, created earlier. In this event, remove the token
TokenLobbyExample2_T1​ using ​Remove Components​. Then add the replacement token with
TokenLobbyExample2a_T1​ using the ​Add Components​ section.

This is what I like to call a “Silent update” where the app changes things on the board, but the
players are not aware, since they don’t need to do anything (like removing or add tokens).

Now when a new Investigator approaches the token, they can attempt the puzzle without having
to do the “vase catch” skill check for a second time.
Spawn (a monster)
If you remember, back in​ Configuring a new token with an interact button​ we wanted to set the
events “Failed” button to trigger a spawn.
Spawns are used to make monsters appear, they can be generic monsters, custom monsters or
a mix of both. In this example I will explain a very basic monster spawn, you can find more
detailed information on Spawns, ​including custom monsters, here​.

Open the Skill test Event (​EventLobbyTableSkillCheck_T1)


Click the Green ​+​ under the ​Failed ​button and select ​{New Spawn}

Edit Spawn0 using the Blue arrow (or select it from the Components menu).
You’ll notice right away that the camera moves and a highlight circle pulses, this is the default
action for Spawns. Its intended to direct the Investigators attention to a space and indicate
where the Monster will spawn.

Rename ​the Spawn event to something more sensible, to make it easier to find and edit later.

Use the ​Snap ​button to position the highlight to the top right hand corner of the Lobby tile. This
is where the monster will spawn.

All monsters have a base health, you can adjust this using the ​Health​ and ​Per Hero​ options.
Under ​Types​ select ​Cultist ​from the menu.
In this example we’ll use a generic Cultist monster, these are pre-defined in the app. You can
make more complex ​custom monsters​ of your own, i’ll explain this more later.

Enter a ​Dialog​ for the event, explain to the players what has just happened and that they should
place the monster.
Now we have spawned a monster (the consequence of failing a skill test!) we can let the player
know about the ripped paper (puzzle) on the desk (same principle as the passed event above).

Under ​Continue​ click the green ​+​and add an event, give it a name and describe what's on the
table.

Notice in this event i’ve not put a follow on event (yeh, let’s assemble a puzzle with a cultist
stabbing us in the back!), this will exit the encounter and the player will have to interact with the
token again (using another action) to attempt to piece the paper together (puzzle).
Create a token in the same way as before (TokenLobbyTokenExample2a_T1) and give it a
sensible name (TokenLobbyToken2b_T1).

Go back to the previous event (EventLobbySmashVase_T1), add the new token and remove
the previous search token.
Finally edit the Puzzle Complete event and make sure you remove all of the search tokens, that
could be placed:
See it all in action!
Now that we have the basics of an event mapped out, lets see what it looks like.

Click the ​Save & Test​ button

The ​EventStart ​will trigger right away and run the Lobby_P1 event:

Notice that it’s entered the tile name, icon and moved the camera.

The camera moves to the search token


It then places the second search token for the table.

If we click on the left token, we are presented with the option to investigate a slick substance on
the steps.
If we investigate, it triggers the dialogue and removes the token

If we investigate the second token we are presented with the table.


Upon investigation we are presented with a skill test

Here is what happens if you pass, allows you to attempt puzzle


Heres what happens if you fail, monster spawn, then description of the table
This is the puzzle in action, either right away if you pass agility test or for another action if you
fail the agility test.

Puzzle complete (notice the search token is removed), click Continue

Click ​Menu​ and then click ​Scenario Editor​ to get back into edit mode.

Tip - ​You create Sight and Explore tokens exactly like this. Just trigger an event to place the
adjacent tile and add the tile in the event. Remember that explore tokens usually cost and
{action}, where as Sight tokens usually don't cost an action (just require the Investigator to b in
the same tile as the token.
Items

IMPORTANT: ​The fields in the item editor: , and


have specific behavior when used with random or a specific item selection. The
article ​[Link] gives a detailed explanation
of these fields. The rest of this chapter will guide you through the process of item selection step
by step.
Contributed by ​antontimmermans

Throughout your Scenario you will want to give your Investigators Items to help them complete
their mission.

Items can be added to the game using the ​Add Component ​option and also removed using
Remove Component ​(in events, spawns, etc).

Like Tiles and tokens, you have to first create the item before you can add it as a component.
Common Items, Spells and Unique items are created and given to players in the same way.

I’ve split this into 4 categories, to try to explain the different ways of distributing items.

Regular items - Giving a random item


For this example we’ll create an event that gives a Random Common Item. This is your go to
QItem Type for giving out items through events.

Create the item by opening the ​Components ​menu, clicking ​QItem ​then ​{New QItem}​.

Set ​Starting Item​ to ​False​, since we will give this out in the game later.

Rename the Item, you will use this name when you use ​Add Component​ to add the item to the
board or give to a player.
Use ​Traits ​and ​Pool traits​ to specify what ​Type​ of item you want to be generated. If you select
a ​Trait ​or ​Pool Trait​ and ​no​ ​Item​ then a random item that has that (Pool) Trait selected will be
given to the player, this adds a level of randomness to the item distribution.

In this case we will select the ​Traits - Common, ​click the ​red - ​next to ​Weapons​ to remove this
trait (it's added by default)​, ​and leave the ​Items ​section Blank.
This will give the Investigator that triggers this QItem, a random common item.

Tip - ​ You can exclude items from the list by adding them in the ​Items ​list. If a Trait or Pool trait
is selected, the ​Item ​section is used to exclude items. If no Trait or Pool trait is selected, then
the ​Item ​section is used to explicitly give that item.

Unique Items - Giving a single item


In this example i’ll create a Puzzle box item, this is a unique item.
Create a ​QItem ​as above but, give it a name and set the ​Starting Item​ to ​False​.
Under ​Item ​select the ​Puzzle Box
By default the ​Weapon​ Trait is selected and a red ​-​ has appeared. We don’t want to select an
item with a Trait (or pool trait) so we need to remove this to ensure that only the PuzzleBox item
is given. Click the red ​-​ next to ​Weapon ​to remove it.

Tip - ​You can see what items are in the list by selecting the Item Pool sections on the left hand
side, items that are used will be Greyed out, be sure to add them as exclusions on random item
QItems.
Starting Items - Giving a random Starting Item (and excluding specific items)
You can give players specific items or a random item from a group as starting items by setting
the ​Starting Item ​flag to ​True​. Starting items don’t need to be triggered or added as
components. They will just appear on the starting items screen before the scenario begins.

Create the item as you did with the ​Regular Item​.

Set the ​Starting Item​ to ​True​ this will now be given to the Investigators before the Scenario
Starts.

Let's assume that we don’t want to give the ​Shotgun​ or ​Tommy Gun ​here because we have an
event later to give it out (and they are OP). We will need to exclude them.

Assuming that you’ve created the item as you did the Regular item above the ​Common ​trait will
be set.

If we add ​Items ​above this, they will be excluded from the Trait’s random pick.

Add the ​Tommy Gun ​and ​Shotgun​ items to the ​Items ​list (for exclusion).
Interacting with Items
In a previous step we created a ​QitemPuzzleBox ​item. In this step we’ll configure it to create an
event to solve a puzzle.

You can add an ​Inspect​ event to an item, so that when you interact with it in the app it will
present some dialog.

In this example we’ll give the Puzzle Box some text and add an optional Puzzle.
Completing the puzzle will give the player the ​QItemRegularItem​ we created earlier.

First we need to create an event with some dialog that will pop up when a player inspects the
Puzzle Box from their Item Menu.

Tip - ​If you’re feeling fancy, you can trigger an event that displays some UI elements instead, to
show an image and text. More on ​UI Elements here

In this event add a generic description of the item and two buttons.
The first will be ​{action} Attempt Puzzle
The second will be ​Cancel

Note ​- The default ​Cancel ​button only appears on tokens, and since this Item inspect is an
event well need to add our own cancel.
Under the ​{action} Attempt Puzzle​ add a Slide Puzzle, then under the ​Guess​ button add
another event to give the item. ​More on Puzzles here

In this event add the ​QItemRandomItem ​in the ​Add Components​ section.

When the dialog pops up the item cards image will be displayed next to the dialog.
Tip - ​You can use the ​{c:​ItemName}​ ​ code to tell the app to print the random items name in the
dialogue.
Edit the ​QItemPuzzleBox​ and click ​Inspect
Click ​Event ​and select the ​EventInspectPuzzleBox ​you have just created (the first event in the
chain).

When a player inspects the puzzle box from the ​Items​ menu option in the app, they will be
presented with the opportunity to attempt a puzzle to open the box.

Add Items using Events


So far we have created three items, one is given as a starting item the other as a reward for
completing a puzzle. The final item, the ​Puzzle Box​ has not yet been given out.
We will give this out using a standard event. We’ll reuse the Person for this, we can edit the
default “Hello” event and have him give the player the Puzzle Box.

Edit the ​TokenPerson​ by clicking it from the ​Components ​menu (or right clicking and selecting
it).
Click the Blue arrow next to the ​EventTalkDefault
(or just select the event from the Components menu)

Change the dialog to explain that the person is giving you the Puzzle Box, and tell the player to
remove the person token (so we don’t keep giving out the puzzle box).

Tip - ​ instead of removing the person you could use variables to make a new option to give the
puzzle box,​ ​see Variables for more information on their use.

In ​Add Components​ select the ​QItemPuzzleBox​ item


In the ​Remove Components​ select the ​TokenPerson​ token
Let’s see Items in action

First of all we start the adventure, you will notice that we have a starting common item:

Duke or the Flux Stabilizer sometimes appear too, this is because the asave and Test function
select a random investigator team and the tool seems to like selecting Ashcan Pete (it does this
a lot) or the lady that has the Flux Stabilizer item (I forget her name).

When we talk to the chap he gives us the Puzzle box:

We can Interact with the puzzle box in the items menu:


When we interact with it, we get a dialogue:

Attempt the puzzle:

Completing the puzzle gives us the random item:

Who puts a lantern in a Puzzle Box! Maniacs.

Set Variables to flag that an item is obtained


Sometimes you may want to tell the App that the player has a certain item, this could be used to
unlock additional dialog or access. For example a player might need a Key to open a door, you
can edit the “Open Door” button response on a door token, if the player has the key (aka the
HaveKey ​variable is set to ​1​) to give them an option to open it. For more information on
Variables see the ​guide below.
Creating a Scenario - Advanced Functions
If you’re here I am assuming you understand the concepts explained above. Some assumptions
will be made, if you get lost go over the basics again!

Copy an Existing Scenario


A good way to understand a Scenario is to edit one that has already been created and that
works. You may find techniques in Scenarios that someone else has used and wish to
understand them more (I know I have!).

To copy an existing Scenario download it from the ​New Scenario > Download​ section.

From the main menu click ​Copy


Select the Scenario you wish to copy (that you have already downloaded) from the list:

There are some helpful demo’s try downloading these first before trying to dissect a full and
scenario:

It will then appear in your list as editable.

Please only use other published Scenarios for research purposes, don’t republish
without the content creators prior consent.

People have spent a lot of their own time making these Scenarios for free, so please treat
them with respect.
UI Elements
Now that we have a working scenario (albeit basic!) we can create a fancy splash screen to
introduce it. We’ll continue on from our current Scenario.

First off I will refer you to the Wiki which has some really useful information on UI Elements:
[Link]

Before we add a new ​EventStart​ we need to remove the EventStart trigger from the
EventPlace_Lobby_P1 event. Triggering both events will get confusing!

Open it up, click ​Trigger ​and select ​None

Now we want to create an awesome background image.

Click the ​Components​ menu and under ​UI​ select ​{New}


Give the UI a name, (such as “SplashImage”)

Click the box next to ​Image​ and select an image from the tile list.

Select if you want the image to display horizontally or vertically from the ​Units​ box.

Position the image and adjust the size, you can use minus numbers and decimals here. You’ll
have to fiddle with this to get it just right.

If you enter text into the dialog section, then it will put a dialog box in front of your image. This
looks a little odd, so we’ll leave it blank for now and add the text another way.
Create a second UI element for the Text.
Rename the UI element, but do not select an image.

Set the unit to Horizontal or Vertical

Set the position and ratio, again this will take some fiddling to get it just right.

Tip​ - Size here is the size of the window that the text can go in, you can see this by clicking the
border option on.

Adjust the text size if you wish, but remember that different people will have different size
screens to try to keep it well within the screens limits.
We’ll also create a ​Continue ​button for the players to click to trigger the adventure.

Create another UI Element the same way as the UISplashScreenText above but this time make
the size much smaller and turn the border on:

Add a button and have this trigger the Event that places the tiles. Since there is no dialog this
event will be triggered if the player clicks anywhere inside the UISplashScreenContinue element
(anywhere in the “Continue...” box).
Finally create an event and add the UI elements as a Components, when this event is triggered
it will display the Image, Text and Box all at the same time.

It's important to get the order right, Image first then text second, then box. This will mean that if
the image is large the text will be placed on top.

Tip:​ The order is especially important in some advanced graphical events, the interactive maps
in descent use these UI elements for example. You can also remove and reads UI elements in
subsequent events (though removing a UI element and adding the same one in the same event
will do nothing).

Edit the EventPlace_Lobby_P1 and tell it to remove the UI components:


Save and Test to see what it looks like:

It’s soo pretty….


You can use these UI elements all over your Scenario if you want to. Such as interacting with
Items or the end game dialogs, be creative.

Using built-in sound effects and music


.​(contributed by anton timmermans)

Using built-in sound effects and music is not very complicated. You simple click either the box
Audio or the + behind Music and you can select from the list of sounds that Valkyrie provides.
Using the correct sound effects on token selection, or triggered events adds much to the
suspense in your scenario, so use it frequent but also use it well.

Audio
The field audio is typically used for short sound effects like shutting doors, opening gates,
breaking glass. If here is background music playing or any other sounds, that sound is left
undisturbed and the new sound effect is added. Even if you have two fast events triggered in
succession, and each of those events has their own sound effect, then the second sound is
added to whatever sound may still be playing. Every sound selected in the ​audio​ field will
continue playing until it is completed.

Music
The music field is typically used for background music. The main difference between the ​music
selection and the audio field is that the selected sound in the ​music​ field is stopped (faded out)
and replaced with any new sound selected in the ​music​ field of a next event.
Example usage: This field should typically be used when you add your own narrative to the
introduction text (see also ​Custom Audio​). This allows players to stop the narrative playback if
they choose not to wait for it to end and want to skip to placing the starting tile.
Custom Content

Custom Images
Before you use these make sure you read the Wiki, it gives some great examples:
[Link]

You can add custom images to your Scenario, these can be used as UI elements, Puzzle
images and even Monster images.

To add a custom image to your game, source a suitable image. Save its as a PNG or JPEG
(JPEG’s work for most parts of the editor and tend to be smaller, but if you require transparency,
use a PNG).

Tip - ​Try not to make it too large, although Valkyrie supports high res images, you probably
won’t need images much bigger than 1920 x 1080px. As most people will be running Valkyrie on
a Laptop or Tablet. Try to keep the file sizes small, to avoid large scenario packages. All that
being said If you think people will be projecting their Scenario onto a wall (i’m totally doing that
next game), crack out those high res images!

You can also run the PNG through “PNG Optimizer” (thank RedWolf2 for this tip) that will
compress the image lossless.
[Link]

Once you have your image, copy it into the following folder:

%appdata%\Valkyrie\MoM\Editor\​Scenario1

~/.config/Valkyrie/MoM/Editor/EditorScenario1
(For MAC)

Scenario1 is the default name of a Scenario when it’s created, you can (and should) rename
this at any time.

Tip​: Do not put any spaces in the folder name. Generally speaking it's better to avoid spaces
and uppercase letters in any files names, such as sound files and images.

Once the image is copied into this location you can select it as an image in the Editor:
Custom Audio
There is a section on the Wiki that explains about Audio and Music, it can be found on this page
[Link]

Custom Audio or Sounds are added in the same way as images, just drop them into the
%appdata%\Valkyrie\MoM\Editor\​Scenario1 ​folder.

Tip: ​You can even best folders for images and sounds in this folder and they will be usable in
the editor.

Valkyrie only supports .ogg files for audio, this is an open container free sound format.

Once you have a working sound file (you’ll probably only get the free ones as .MP3) you will
need to convert them to .OGG and will probably need to trim them.
There are plenty of paid and free tools for this, but below are the two I use due to ease and
simplicity.

Online Audio Convert - Convert from many formats to OGG


[Link]
I would advise you only use this for free content, as the website probably keeps a copy.

Audio Trimmer - Crop and play sound files


[Link]
I would advise you only use this for free content, as the website probably keeps a copy.
Language specific UI and Audio
A feature was added to Valkyrie to allow alternate versions of Audio files and Image files to be
displayed when playing a scenario in a different language. For example if you have a UI
element that is a letter, you can display a different image in it's place when playing in another
language (the new image being a translated version of that letter).

First off open your scenario folder


(%appdata%\Valkyrie\MoM\Editor\​Scenario1​)

In this folder create a subfolder with the languages name (e.g. French, Polish, Chinese).

Note that there are two AV files ([Link] and [Link]) in the main folder.

Create your “translated” Image and Audio and give them the same name as the default
languages - in this case we’ll record a new ​[Link]​ and create a new ​[Link]

When you play the scenario in the alternate language, any translated image and audio files will
be displayed instead of the files in the root directory. If there is no alternative image or audio file
it will display the default.
Triggers
We have used these before (EventStart), but these are events that trigger on specific events.
The Wiki has an explanation of each of these:
[Link]

Triggers are useful when used in conjunction with events, to set Variables. See ​here​ for more
information on using variables in Events.

You can also use Triggers to run when a monster is defeated see ​this ​example and ​this​.
Variables
Variables are detailed here:
[Link]

Variable Types
There are three types of variables:

# Variables
These are variables that are set by the App and can vary throughout the game.
For example #round is the turn count of the current game, #heroes is the number of
investigators in the game.

$ Variables
These are variable that turn features on or off, for example, $fire turns on the 'Fire spreads’
prompt aflt the end of each turn.

@ Variables ​Contributed by ​antontimmermans


These variables are special types and can be used to trigger special events. For example if the
investigators made a discovery that triggers the spawn of a monster.

Assigning the trigger variable is done by setting the value ​‘1’​ to ​@<VariableName>​. Example:

Once you have defined a trigger variable. It will appear in you variable type list as an ​extra​ type
called ​Vars ​under the name ​Var<VariableName>​.

Now it can be easily selected in you spawn monster event in your trigger field. So instead of the
typically EndRound or StartRound triggers, you can simply select your variable instead:

A full list can be found on the Wiki article:


[Link]
Quest Variables
These are custom variables that are set by players with the ​Assign ​option in the editor
Elements (events, UI, Spawns, etc).

Quest Variables cannot contain special characters or spaces.

How are they used


Variables are used in the ​Tests ​and ​Assign ​sections of most elements (Events, Tokens,
Spawns, etc).

Tests
A test can be used as criteria for an Event or Spawn (or any of the other Elements that have
Tests as an option), if the criteria is met the Event or Spawn will run, it not it will be ignored.

Assign
Assign is used in Events or Spawns (or any other element that has the Assign option), to set a
variable. For example you can assign ​1 ​to the ​$fire​ variable to toggle on the “Fire Spreads”
Mythos Event.
More advanced uses
Variables are key to Mythos events, ​see here for more information​.

Another key use for variables is to “unlock” additional events and dialogs.​ See Advanced Events
for more information​.

You may also want a Custom Monster to appear based on a turn number, the spawn could be
triggered to happen at the End of each turn, then limited to a turn number (or a variable turn
based on number of investigators, ​similar to this​).

End dialog UI elements could also be triggered in the same way, for example if the ​#eliminated
is set to ​1​, it will have the same function as triggering 'investigator eliminated’ from the set menu
and the end game process (one full turn then end) will begin.

Assigning a random number to a variable

It is possible to assign a random number to a variable, this can be particularly useful when
creating random events.

Create a variable as normal by clicking the ​Green + ​clicking the ​Quest ​menu option then
clicking ​{New}

Click the ​0 ​(right hand box) and select ​Number


Instead of a number enter the command ​#rand​X
(where X is the max mimium number that can be generated).

For example ​#rand5​ will randomly generate a number between 1 and 5.

Random that is picked can be seen in the log


Selecting a random hero and calling them later
So I found myself recently wanting to single out a single investigator then using them later in the
scenario for shenanigans.

It turns out there is a Wiki entry on this also, but I didn’t really understand it when I read it.
[Link]
So i’ll do my best to explain it.
(Thank you NicolaZee and Bruce for helping me understand this!)

To do this, first create an event that selects a random hero.


In this event you can put any dialog to and then the {rnd:hero} code (click the “Rnd” button to
automatically generate this).

Once this event runs, the text that was printed for {rnd:hero} will be saved in the event.

I have highlighted the event name, for clarity

Create another event this one can then be used to print the name of the hero back again.
Use the following code to print the Hero text from the Event component above:
{c:​EventName​}
When the event runs the First event will randomly pick a hero:

The second event can run at any time and will print the same hero name.

Selecting a Random Hero is useful for Mythos events, but this method of identifying
investigators allows for an event to effect a random investigator, then events can continue to
effect this same investigator throughout the same scenario.

Note:​ In the Descent editor, it is possible to manually select investigators. It is not the case for
Mansions of Madness.

Mythos Events
There is an excellent guide on the Wiki:
[Link]

I will try to explain it in more detail with up to date screenshots.

How Mythos Events work in the App


Mythos is flavour text and events that happens in the Mythos Phase, which is after the
Investigator Phase and before the Monster Phase. They are binary variables that you turn On
(1) or Off (0), the default state of these variables is Off (0).

If the Mythos Event is turned on, they will begin to appear in the Mythos phase.

In Valkyrie these variables are symbolised as “$” Vars, they can only be turned on or off.
(we touched on this above)
Mythos Event variables are as follows (best to worst):

$mythoshelp​ - Gives helpful events for Investigators (heals, become focus, etc)
$mythosflavour​ - Gives flavour text, that generally doesn’t effect the investigators.
$mythosminor -​ Gives Minor mythos events, generally easy tests as bad stuff happens.
$mythosmajor​ - Gives Major mythos events, generally moderate tests as bad stuff happens.
$mythosdeadly​ - Gives Deadly mythos events, generally hard tests as very bad stuff happens.

In pretty much all elements (Events, Spawns, Tokens, UI, etc) you can ​Assign​ a number (or
another variable!). For Mythos Events that would be to Assign a “1” (on) to one or more of the
$Mythos​Level v​ ariables.

Create a Mythos Event


So let's assume we want to set the Mythos level to Minor.

The best way to do this is to create an event and trigger it at ​StartRound​, this event will run
every turn.

In this event we can hit the green ​+​ after ​Assign​, select the ​$MythosMinor ​variable.
Click the symbol between the two boxes and set it to ​=
Click the right hand box and select ​Number, ​then enter “​1”

I know what you’re thinking… We don’t want to set this variable ​every turn​. Helpfully we can use
variables to get around this too.

Under ​Tests​ click the green ​+ ​and select ​#round​ from the list. We know from the Variables
section that ​# ​variables are set by the game. This one specifically is the current turn the
investigators are on.

So we can set the symbol between the boxes to ​==​ (is equal to) and then enter the ​Number​ 5.

This event will compare the ​#round​ variable with the number 5 at the start of every turn, if it is
turn 5 then it will assign the number 1 (on) to the $mythosminor, thus turning on Minor Mythos
ready to trigger in this turns Mythos Phase.
Mythos Events Based on Player Numbers
Remember that you might have 2-5 investigators, so don't flag on $mythos* variables based on
static #round numbers, a 2 player team will have a much slower time devouring your content,
than a 5 player team.

A helpful chap on the BBG forums (thanks Howard) gave me a tip in regards to triggering
Mythos Levels.
This was:

Triggering Deadly Mythos at 20 - #Heroes, so round 18 for a 2 player team and round 15 for a 5
player team.
Major should then be set to DeathlyMythos / 2, Round 9 for 2 player, Round 7.5 for 5 players)
Minor can then be something along the lines of Major / 2, Round 4.5 for 2 players and round
3.75 for 5 players.

So first of all we need to setup these variables, it has to be done systematically, using Quest
Variables.

So in an early event, I would suggest whichever event triggers on “EventStart”, we have to set
the variables.

DeadlyMythos will happen on round 20 - investigators. So in the event under the ​Assign
section, create a new Quest variable called ​DeadlyMythos​, then set it to ​= 1

Then hit ​+ ​ again and select ​DeadlyMythos ​again, this time tell it to ​ - #heroes​.
(so thats 20 - 2 =18 for a 2 player game)

Now we can add the ​MajorMythos ​quest variable and set it to ​= DeadlyMythos
(MajorMythos = 18 in a 2 player game)

No we can add ​MajorMythos​ again and this time tell it to ​/ 2


(its now 18 / 2 = 9 in a 2 player game)
We can repeat the process for MinorMythos and set it to be half of Major mythos.

It will look like this in game.

We can now create events that trigger at ​StartRound​ and test these Quest Variables comparing
them to the ​#round​ number.

We can edit our Mythos Event above to trigger Minor Mythos at its new round (which varies
based on the number of players).

You may wonder why we are triggering these events on ​>=​ and not ​==​, this is because we are
dividing numbers in half multiple times. ​MinorMythos ​might end up as a decimal number
(3.33333 being a worst case!). If it was set to ​Is Equal​ (==) then it might never trigger.

By setting it to ​>=​ in this example the MinorMythos variable of 3.33333 will trigger on round 3
and above.
We don’t want it to trigger more than once, so I have added another variable
MinorMythosTriggered​. If the variable is 0 - which it will be by default then run.
(In Hindsight it may be more sensible to set this variable to ​MinrMythosTriggered != 1 ​so that if
the variable “is not” 1 it will run, but it will work either way).

Then set the ​Assign​ the variable to ​1​, meaning that next round (round 4) the event won’t run
again (since ​MinorMythosTriggered ​is not set to 0 anymore).

Testing your Mythos events

Now we have a working mythos event we can use ​Save & Test​ to test that it's all working.

Run the event and click ​Log, ​this will show you all of the variables that are set.

Notice that the ​#heroes​ is ​3,​ Save & Test randomly picks the number of players/
Also notice ​#round ​is ​1​.

You Mythos quest variables are there, with the Deadly being 20 - 5 (#heroes) = 15.
The others are divisions of this number, so have decimal numbers.
Exit the log and end the turn 3 times to get to round ​4​ (when Minor Mythos triggers).
Notice that you don’t have any mythos events.

Note in round 4 you can see that ​$mythosMinor​ has been set to ​1​ (On).

End the turn again and you’ll get a Minor Mythos event:
Advanced Events
Events can be very complex if you can get your head around them.

Single Token/Event with Random Outcomes


For example you can have a token with a single button action that does an unlimited number of
events on the button press. Each action could do something different and remove the token.

The purpose of these events is to give replayability to your Scenarios, change it up just a little
bit each time.

To do this you can create the ​Token ​as normal, then add a ​Button ​({“action} Investigate” for this
one) .

Set the ​Order​ to ​Random

Under the ​Button ​click the green ​+​ to add an event, edit it and give the event some dialog and
remove the search token.

Repeat the process as many times as you require to add variety.


Example:
Run 1:

Run 2:

Run 3:

Out of the three events it’s picked Event 2 - twice, event 3 once and not picked Event 1.
Single Event with Multiple Outcomes controlled by Variables
You can also use Variables to create ‘Hidden’ options. For example, you could add a dialog to a
person token that only triggers if a Variable is a particular number.

I’ll explain a Situation then explain how it's created in the Editor, it's important to understand how
the logic works.

Taking the example Scenario we are using in this Guide. We have an event where we knock
over a vase. We could spawn a person that we could talk to. If we talk to them without
interacting with anything else they will respond with the default response of, “Hello”.
If we have knocked over the vase, they will say “You broke my vase!”. If the monster is still alive
they will scream “Ahhh a bad guy”.

So we need to order these dialogs to get the correct responses and we need to assign a
Variable to each of the two “Hidden” dialog options so that we can control when they appear. It
should be like this:
So now we have the logic, we can quite easily create this in the editor.

So first off create a Token and select a ​Person ​token


Create an event to place the Person token and chain it from the Place tile events

Give the token some Dialog, a description of the person


Set the ​Next Events​ order to ​Ordered
Add a ​Button ​for the Investigators to use to talk to the person
Add Three Events, one for each conversation topic (order is important)

I’ve named the events to give more context.

The events will trigger in this order, so at present only the Monster dialog will show (every time).
We will need to set ​Tests ​to hide the Monster and Vase events until a certain event happens to
enable them.

Let’s start with the Monster Event, edit the first event and give it a relevant name (i’ve used
EventTalkMonster).

Give the event the ​dialog ​“Ahhh a bag guy”

Add a ​Test ​and in the ​Quest​ section click ​{New}

Name the Variable ​MonsterAlive


Set the Test type (middle) to ​>= ​(is equal or greater) and then the right box to ​1

Whenever this event is checked to be run, it will check the ​MonsterAlive​ variable to see if it is 1
or above. If it isn’t 1 or above, it will ignore the event and try the next event in the ordered list, if
it is 1 or higher it will run the event.

Now we need to change the event that spawns the monster to ​Assign​ the variable.
We know that when the vase is knocked from the table on the failed agility test, that a monster
is spawned.

So let’s edit this event to say that the monster has spawned.

Tip -​ You can right click the token from the map and select - ​TokenExampleToken2 ​then use
the blue arrows to go through events until you find the monster spawn. This is a good way to
test the logic of your events, without testing them.

Select the ​SpawnLobbyMonster_T1

In this event click the green ​+​ next to ​Assign​ select the ​MonsterAlive ​variable from the list
(refine the list by clicking the ​Quests​ sub menu item)

Change the Assign type to ​+​ and then enter the number ​1 ​to the right field.

When this monster spawns it will add 1 to the MonsterAlive variable (first spawn will make it 1)
Now that the Monster is alive, the variable is set to ​1​ if another monster spawns the same way it
will be ​2​. This variable is a count of the number of monsters alive.

We need to create an event now to tell the app that a monster has died.

So create a new event and give it a name (EventCultistDies).

Do not add any Dialog to make the event “Silent” to the players

Click the box next to ​Trigger ​and select ​DefeatMonsterCultist

Assign​ the variable ​MonsterAlive​ and set it to ​- 1

Every time a Cultist Monster dies, this “silent” event will be triggered and subtract 1 from the
MonsterAlive​ variable, thus tracking how many cultists are alive on the board. Now the person
will know if there is a monster alive or not!
We can add the Variable ​VaseSmashed​ to the event that triggers after the Monster spawns
(the one which details the puzzle, EventLobbyTableSmash_T1).

Note ​- I don’t like to add too many quest style variables to monster spawns because I like to
re-use the spawns in multiple eventualities, they also tend to be tied to “Defeat Monster”
triggered event, so the less variables on them the less confusing it gets. However it's perfectly
valid to do so, if it makes sense (or you can keep track!).

Add the new variable ​VaseSmashed ​as above, but this time set it to ​= 1

We will only trigger this event once, so we can just set the variable directly to a number.
Right click the ​Person ​from the map (or select it from the Components menu)

Edit the second Event (EventTalkVase) and enter the ​dialog​ “You broke my vase”

Add a ​Tests ​to check that ​VaseSmashed == 1

This event will now only trigger when the ​VaseSmashed​ is set to ​1​, i.e. if the Investigator fails to
catch the vase.

We will leave the default one empty, this will trigger if neither of the other variables are set.
Lets see it in action

The person is placed and we can interact with him.

Without doing anything else we talk to him and get the “default” dialog

Now lets re-test and​ s​ mash that vase and talk to him, without defeating the monster

​ onsterAlive​ is set to ​1
Notice the monster on the right, the person knows it's alive because M
Now lets defeat the monster and talk to him again

Apparently forgetting that you saved him from the Cultist, he complains about his broken vase.

Tip​ - You can hit the ​Log​ button during your ​Save & Test​ to see what variables are set to. This
is extremely useful when testing whether events are working. We explained this when ​Testing
the Mythos Events​. You can also do this in game by pressing ​Alt + d​ - thanks for the tip Bruce!
Single Event with outcome based on test.

​ ntontimmermans
Contributed by a

Some actions in the game may require a check of a skill (strength, agility, ...) to determine the
result. For example: to break open a door (test strength) or to catch a piece of paper fluttering
around in a dust-devil (agility or observation). The players should then check the appropriate
skill on their investigator card, roll the dice and enter the number of success.
Part of the fun is not knowing exactly which skill is required or which score will lead to a
success. Based on the story text that is shown to the investigators upon token selection, they
should decide if they want to take the action or not.

In the following example the investigators discover a heavy crate in the ally. Something
interesting may be hidden under the crate but they will only find out if they move it.
Selecting the Search token will display the story text that the crate is heavy and hinting that a
test may follow:

If the investigator commits to the action ‘Move crate’ he/she has to test their strength:

In the editor it looks like this:


First the event T​okenSearchCrate ​(see below: left image) that gets activated when the token is
selected. Explain the investigators that moving the crate might not be that easy.
When the action is committed you run the actual check event ​EventMoveCrate ​(see below;right
image).
​ rateCheck w
Note: variable C ​ hich will hold selected value that was entered using the + and -.

The event ‘​...Pass​’ (see below: left image) will only be active when the value of ​CrateCheck​ is
equal or higher then(>=) 3 and will display the success text and remove the Token.

If the value is lower then 3 the ‘​...Fail​’ (see below: right image) event will be called informing the
investigator of the result. You could also add the test ‘lower then’ (<) 3 to this event, but make
sure that when you add more tests that always one of the results is valid. To mimic the
FFC-App’s behavior, you should set the test variable (​CrateCheck​ in this example) back to zero
in the ​...Fail​ event. The next time you want to do the same tests, the check displays 0. Do not
change it if you want to ‘remember’ the value on the next roll.
Person Token with Several questions

This one was requested on the Valkyrie GitHub.

FASTNAVi wanted a way to create a person and have multiple questions that you can ask
them. Each time a question is asked it should be removed.

I touch on it in this section, but you need to extrapolate it out to get what you want:

[Link]
ding=h.xz3hn391u18p

S​o we start off with an event to place our guy:


In the token we do not add any dialog at all. We just create events for each set of options. You need
an event for each possible variable of questions, I have used online permutations calculators in the
past to work out what I need.

So in your example we need events for every possibility of:

Talk - How are you?


Cost - What is the cost?
Time - What is the time?

These are (forgive me if I get it wrong, its late!) 7 permutations, then we need another "catch all".

1 - Talk, Cost, Time


2 - Talk, Time
3 - Cost, Time
4- Talk, Cost
5 - Talk
6 - Cost
7 - Time
8 - No questions - catch all.
We need an event for each of these 7 permutations + 1 catch all (8 events):

Notice that the token has no dialog. This means it will pick one of those talking points. Because it is
set to "Ordered" it will go down the list one at a time.

Now we need to set up the events with their questions, and set Variables to hide them.
So the first event - Talk, Cost, Time (all questions)

I set a test on the event that checks a variable for each question, if they are all not = to 1, it will run.
So the first time we run it, we should expect to see this event.

We repeat the process for the next event, this time we are only asking 2 questions:
Talk, Time
(The idea being, that the cost question has already been asked).

Note​: I forgot to mention, in these events the "Cancel" button is not automatically added like the
Tokens are, so you have to add it yourself. Just add another button called "Cancel" with no event,
this will exit the event if the player clicks it.

So here is what that event will look like:

Notice I have highlighted a variable. Because we are assuming "Asking the cost" has been done, we
only want to show this event, if the variable has been set (this will become clear in a moment). The
questions asked are exactly the same as the variables that have != 1 next to them.
Here is how the rest will look:
Cost & Time

Talk & Cost


Talk Only

Cost only
Time Only

Ok now we have all of our questions ready, we need to make the events that are triggered by the
question, then flag the variables (Trader_*** = 1) for each one.

So lets do them one at a time, I will do this from the start event (Talk, Cost, Time).

I have created an event for each question, these same events will be used in every permutation
event:
So one for the answer to "Talk":

We put in the dialog, from the man (I would do it as a series of event usually. But one is fine for this
example).
Then we flag the variable "Trader_Talk = 1"

This variable signifies that we have talked to the trader, and when we click the trader token the next
time, the talk options will not trigger.
Now one for the answer to "Cost":

Same process.

Now one for the answer to "Time":


Go through all of the events and fill in the events under the corresponding questions:

Here is an example of the second one, im sure you can figure out the rest!
Finally create that catch all event, this should be at the bottom of the list:

Don't give it any variables, so it will always trigger if all of the above 3 variables get set to 1
(Trader_Talk/Cost/Time). In my example this event will also remove the trader person:
Ok so lets run it and see the fruits of our labour!
Start game, trader is placed:
We click the trader. Here are my variables:
Trader_Talk = 0
Trader_Cost = 0
Trader_Time = 0

(you can check variables by clicking the log if you've done a"save&test" or clicking log and then
pressing Alt+d (I think, or is it Ctrl+d? Try both!)

As you can see we have all 3 questions! Good start.

We we click and ask about the "Cost".


Now we re-click the person, and we should expect the variables to be:
Trader_Talk = 0
Trader_Cost = 1
Trader_Time = 0

Boom, the
"Cost" question is no longer there!

So we click on "Time" worried that we don't have time to finish talking to this guy (but of course we
don't intent to buy from a crazy man running into a mansion to sell bolts!?!).

So we click on the trader again, we expect the variables to be:


Trader_Talk = 0
Trader_Cost = 1
Trader_Time = 1
Nice, so we got what we expected. We ask him how he is!

At this point, I might consider putting an event after all three of the
"TraderDIALOG_/Cost_Used/Time_Used/Talk_Used, which trigger the no dialog option. This would
run after the final question was asked, and remove the token. But I haven't here.

So we click on the token again, expecting the variables to be:


Trader_Talk = 1
Trader_Cost = 1
Trader_Time = 1

All questions gone, so we should expect to see the "No Options" dialog and remove the guy.

And there, he goes. Crazy bolt salesman.


Event Loops
A user posted an issue on the Valkyrie GitHub about how to “force” investigators. While this is
not possible and it would have to be requested in the opening Dialogues.
However I knew it was possible to create a kind of “CheckSum” to prevent players from picking
the wrong investigators before starting.

This example contains a “Loop” which uses a repeating chain of events, until a certain objective
is met and the chain is broken (in this case, a counter is filled up). Be very careful when creating
these events, because it is possible to stick the scenario into an infinite loop! Anyway here goes.

In this example I'll use 3 investigators.


Jenny Barnes
Bob jenkins
Ritta young
Create an event that triggers from Startevent (EventStart). In this event set up some variables
using "assign"

LoopEnd = #heroes

This variable will be used to control the number of times the "Loop" will run.
Create an event in EventStart to act as the start of your "loop" (EventLoop).
Create an event under the EventLoop that will break the loop (EventBreakLoop)
In this event set a test:

CheckLoop == LoopEnd

Set the continue event for this to a new event called EventValidation (exiting the loop).
Under the "Loop" (EventLoop), set the event order to "ordered" (default). Then create an event for
each "valid" investigators.

EventJennyBarnes
EventBobJenkins
EventRittaYoung

In each of these events set a test checking if the investigators in question has been selected. And
add a section test to stop the event from triggering a second time.

Tests:

EventJennyBarnes
#herojennybarnes = 1
JennyBarnesChecked ! 1

Then create an assign variable to add one to "CheckLoop" and a second one to fill in the
investigators "checked" variable .(stopping it running more than once). Finally add an event to add
one to a variable called "ValidInvestigator".

Assign":

CheckLoop + 1
JennyBarnesChecked = 1
ValidInvestigator + 1
At the end of each of these events set the next event to the loop event (EventCheckLoop).

Note​: You will need to create custom variables for "Hero" here then use find and replace in the
[Link] file to replace them with #Hero. I believe the next version of Valkyrie will have the option to
select #hero variables in the app. ​There is a section on this just below this one
Add a "catch all" event under the loop event (EventLoop), under the other investigators events. This
event will have no test and simply add one to the CheckLoop variable.

Event catch all


Assign:
CheckLoop + 1.

At the end of this event point it back to the loop event (EventLoop).
Go back to the EventValidation event created earlier (in the EventBreakLoop) and in it create two
events:

EventValidationPassed
EventValidationFailed

Under EventValidationPassed set a test:

ValidInvestigators = #heroes
Then set the continue event to be your scenario chain, such as intro text etc.

Under the EventValidationFailed do not create any tests, this is a catch all. In here put some text to
say that the players didn't pick valid investigators.
See it in action

Correct Investigators:
Two of the correct investigators (None wrong)
Two correct and one wrong investigatosr:
You get the point!
Singling out an Investigator
This may be very useful if you wish to create an event that only triggers if a specific investigator
is in play.

For example in a Scenario I wanted to give the Duke Item to the party if “Ashcan” Pete was not
in play.

Investigator variables have been added in Valkyrie 2.1. So you can now add these directly from
the Test/Assign functions within the editor.
This is possible in Valkyrie however it is not supported directly in the UI in version 1.6.1, I
believe the enhancement is coming in a later version.

S​o here is a way to get it to work.

Create an Event to give Duke, then add a Test to check for a placehold variable for askcan
pete.
Ashcanplaceholder = 1
Save the Scenario and Exit.

Now we need to identify the Investigator.


Load any scenario and select the investigator in question (AshCan here).

Once in the scenario, open the ​Log​ and press ​Alt + D​ to enter the debug log. LOok down the
list for #hero<name> (in this case #HeroAshcanPete)

Note down the hero’s name (#HeroAshcanPete)


Navigate to the scenario folder and open the ​[Link]​ file using Notepad.

%appdata%\Roaming\Valkyrie\MoM\Editor\​Scenario1

Find the event with the placeholder variable (find function will do this quickly)

Copy the place holder name “ashcanplaceholder” and then open “Find and Replace”.

Note​: Doing it this way will ensure you didn’t type anything incorrectly.

Paste the placeholder name into the “Find” section and then enter the hero variable into the
Replace field.
Click ​Replace All.
Save the changes and close the text file.

Open up the scenario and navigate to your event, you should see the variable has been
replaced:
This event will only run if if Ashcan Pete is selected as an investigator.
I can now set that variable to not equal (!=) to tell it not to run if Ashcan Pete is a selected
investigator.
Tile Placement and Planning
This section was kindly written and submitted by ​Anton​. (thanks Anton!)
It gives some tips on how to pre-plan and organise tile placement chains.

Start-up behavior of a scenario


How to start creaton of a new scenario is nicely explained in the chapter ​Creating a Scenario -
The Basics​. While creating the initial events you should consider that from the official FFG
application we are (getting) used to start up in a default behaviour. In Valkyrie you have a lot of
freedom in the scenarios behaviour, but if you wish to mimic the standard application flow then
this sequence of events is suggested:

1. QStartEvent ​ - triggered by ​EventStart


a. Can be a ‘silent event’ and used to initialize your variables.
b. Calls the event(s) to hand out Clue(s).
2. QHandOutClue​x - called by ​QStartEvent
a. To mimic the standard Mansions of Madness application’s behavior you should
hand-out your Clue tokens
b. If you wish to tune your scenario difficulty a little you can do it in this step by
handing out a more clue tokens for 3 or less players. Example: Each of the
following events is called by QStartEvent and puts up a dialogue instructing to
hand out 1,2 or 3 clue(s). Each of the events has a Continue button and will call
the ​QIntroduction​.
i. QHandOutClues1 (test #heroes >= 4)
ii. QHandOutClues2 (test #heroes == 3)
iii. QHandOutClues3 (test #heroes <= 2)
3. QIntroduction ​- called by ​QHandOutClue​x
a. Build-up your Introduction UI and story as explained in ​UI Elements

Systematic and robust tile placement.


To make the in-game-tile-placement-flow-experience a bit easier and faster for player to handle,
the order placement of a room tile and items on it should always be the same. The players will
get into the ‘rhythm’ of which type of tokens to place next. Therefore I would suggest to always
have a basic placement scheme in place.
This standard placement scheme may look a bit elaborate, but for me it has proved useful.
Especially when you have a lot of conditional placements like: “place the Secret Door Token
only if the secret door is found”, “place a Search Token if a secret door is not found yet”, “Place
an explore token only if the tile to which it connects is not revealed yet”, “place a person token
only in round 3”
The standard placement scheme also makes it easier to find the event in your event list while
you are programming/debugging your scenario (assuming you alphabetically sort the list).
I found the following sequence to be most practical. For example:

EventOfficePlaceTile (Place the Office tile including dialogue)


->EventOfficePlaceDecoration (Place walls and doors - no dialogue)
->EventOfficePlaceConnections (Place Explore and/or Sight Tokens - no dialogue)
->EventOfficePlaceItems (Place Search and/or Interaction tokens - no dialogue)
->EventOfficePlacePeople (Place person tokens or spawns - no dialogue)
->EventQMoveOneSpace (Special event handling the "move one space dialogue"
that will be explained in a separate chapter)

Each placement event would always call the next placement event phase to make the flow
robust. This means that the second event in will call the third etc.:

EventOfficePlaceTile (Place the Office tile including dialogue)


->EventOfficePlaceDecoration

EventOfficePlaceDecoration
->EventOfficePlaceConnections

EventOfficePlaceConnections
->EventOfficePlaceItems
Etc…

Now this sequence only places the Office tile with some dialogue, but all other placement
events do not place anything YET. Let us say I want to place a ​Wall Token​ and a S​ ecret Door
Token​ (only if the secret door is discovered).
Then the sequence would look like:

EventOfficePlaceDecoration (no dialogue)


->​EventOfficePlaceWall (Place Wall Token including dialogue)
->​EventOfficePlaceSecretDoor (Place Secret Door Token including dialogue)
->EventOfficePlaceConnections (always call the next placement phase)

EventOfficePlaceWall (Place Wall Token including dialogue)


->​EventOfficePlaceSecretDoor
->EventOfficePlaceConnections (always call the next placement phase)

EventOfficePlaceSecretDoor (Place Secret Door Token including dialogue; add the test
if the secretdoor is found.)
->EventOfficePlaceConnections (always call the next placement phase)
The sequence above would only execute the event EventOfficePlaceSecretDoor if the test on
the variable were successful. If TRUE, then the placement and dialogue take place and the next
event will be called (EventOfficePlaceConnections). If the test is FALSE, then this event will not
be executed but the calling event EventOfficePlaceWall will then call
EventOfficePlaceConnections.

This might look as if EventOfficePlaceDecoration is an empty and useless event, but it is a


placeholder for placement of these type of items. If you later decide to add more decoration (an
extra door for example), or want to find a particular event for debugging your scenario, you will
know where to look without much thinking.
Calling the next standard placement event phase (in this case EventOfficePlaceConnections) at
the end of each placement even will guarantee proper handling of placement and has low
chance of programming mistakes.
EventQMoveOneSpace
When writing the scenario “disturbance at the Docks” that gave a lot of freedom to players to
move around however they would like, I stumbled upon the problem that a tile could be entered
via different entrances. The problem is then, to make a simple (single) tile placement event
sequence with a consistent behavior, that allows the players to “move one additional space”
My specific example uses the Yard4 tile that can be reached via the market tile or from the root
cellar. When entering from the market you would use a Sight Token, which should not allow you
to move one additional space. When entering from the root cellar you would use an explore
token, which should allow the player to move one additional space.
That is how I came up with the EventQMoveOneSpace (I typically use ‘Q’ to identify all generic
Quest events that are not connected to tiles, tokens or rounds). This event is ALWAYS called at
the end of placing ANY tile. (see also my description of Systematic and robust tile placement)
The EventQMoveOneSpace does the following:
1. Displays the dialogue “You may move one additional space in the revealed area”.
2. Has a test: MoveOneSpaceAllowed != 0
3. Assign: MoveOneSpaceAllowed = 0
4. Continue

This means that the text is only displayed if the variable is set to 1 (or any other value then 0).
And then flips the variable back 0 so that you don’t accidentally display the text then next time it
is called. Make sure initialize this MoveOneSpaceAllowed to 0 in your start event (which I would
call EventQStart).

Now the trick is to set the variable before the EventPlaceYard4Tile is called. This happens when
you select to tokens connecting to this tile:

TokenSightMarketYard4:
1. Dialogue: “The busy market next to the quiet small city park are quite in contrast. An
Investigator adjacent to this token may reveal the next area”
2. Button “Continue”: EventPlaceYard4Tile
3. Button “Cancel”: <nothing>
4. Assign: MoveOneSpaceAllowed = 0
TokenExploreRootcellarYard4:
1. Dialogue: “Moss is covering this rotten door”.
2. Button {action} Open: EventPlaceYard4Tile
3. Button “Cancel”: <nothing>
4. Assign: MoveOneSpaceAllowed = 1
Multiple entry possibilities to a tile
When allowing Investigators to move around freely you will bump into the puzzle of how to deal
with tile placement when investigators explore from tile A to tile B, but also have the option to go
the other way around. The trick to solve this is to add a test to tile placement. The connecting
explore (or sight) token would then have to call both tile placement events but the tile placement
events would have to test if they are not already revealed.
Example:
Players may have discovered the RootCellar tile and want to open a door to the Yard4 tile, or
the other way around. The connecting explore token would then look something like this:

TokenExploreRootCellarYard4​:
1. Dialogue: “Moss is covering this rotten door”.
2. Button {action} Open: ​EventYard4PlaceTile, EventRootCellarPlaceTile
3. Button “Cancel”: <nothing>
4. Assign: MoveOneSpaceAllowed = 1 (<- see chapter on EventQMoveOneSpace)

The tile placement events will then have to include a test if it is not already revealed:
EventRootcellarPlaceTile
1. Tile placement actions (see also Systematic and robust tile placement)
2. Test: RootcellarRevealed == 0
3. Assign: RootcellarRevealed = 1
EventYard4PlaceTile
1. Tile placement actions (see also Systematic and robust tile placement)
2. Test: Yard4Revealed == 0
3. Assign: YardRevealed = 1

A consequence of freely investigators moving around freely, is that when you place a tile you
need to test if a connection token (explore- or sight token) must be placed or not. Use the
<tile>Revealed variable to test the conditional placement of these connection tokens.
Make sure to initialize all <Tile>Revealed variables to 0 in your start event.
Organizing your events
​ ntontimmermans
Contributed by a

All your events will be stored in ​%appdata%Valkyrie\MoM\Editor\<ScenarioName>\[Link]​. As


your scenario grows you might want to group events related to each other: There are two ways
of doing that:
1. Use a systematic naming convention.
2. Group the events into separate *.ini files

I found the best way to deal with events in large scenarios is to apply both methods.

Systematic naming convention


A systematic naming convention of your events give the advantage that you can find your event
faster in the list of events when you sort the list alphabetically.

A nice example of naming convention can be found in in the chapter “Tile placement and
Planning” . Obviously the same applies to token naming, item naming, etc..

Multiple event*.ini files


When you want to group related events, you can also place them in a separate file. The
advantage is that if you have the non alphabetical sorted view, the related events will still be
close together in the list:

Second advantage is that you can narrow down the search list by selecting the related file in the
Source list, making it easier to find your event:
To move events to a separate source file all you need to do is click the ‘[Link]’ at the
Source:, select {NEW:File} and give it a new filename (or select a file you might have created
earlier).
Custom Monsters
Bruce’s Wiki has two sections on this
[Link]
[Link]

Think of a custom monster like a set of events that are automatically triggered each monster
phase.

Create framework of the monster


Click “New Custom Monster” and give it a suitable name.

Select a similar monster as the ​Base​, it will use this monster for anything you don’t set for it. (i.e.
if you leave activation, it will use the Base monsters activations).

Give the Monster a name, select traits select something similar to the monster. (not 100% sure
what this does, suspect it’s similar to “Base” for things that are not set).

Enter a health, or a health per investigator, then Horror and Awareness.

Remember how Horror and Awareness works, players have to choose the highest horror to
trigger, so if this is your big bad guy, make sure it’s horror is high enough to trigger (would be
boring in the final fight to find that a normal monster is “more terrifying” in the game’s eyes!)

A good rule for awareness is to keep it low for high horror monsters; this gives players a chance
to dodge away and live a bit longer.
Activations
This is the meat and bones of your monster. If you leave this blank, it will use the activations of
the base. Custom Monsters that use the base have their place, see use cases.

For this example I’ll detail some very basic activations.

Custom Monsters can only have one activation, think of this as a trigger event. It will happen
every single monster phase, while the monster is active. Make it simple and generic. If the
monster moves the same way every activation, put it in here.

Create an event (see above for more details) to act as the first activation of the monster:

“Monster moves 2 spaces towards the nearest Investigator, and attacks the Investigator in its
space with the highest {strength}” for example.

If you want the creature to do a variety of attack activations (like a ranged activation, horror
activation and a melee activation) make this first event very simple and descriptive; You can
also leave the dialog box blank to skip right to the randomised attack.

That trigger Event can then be used to trigger other Events, this will be your attacks or your
move actions (followed by attacks).

I’ll give you an example of a monster that has 2 random move events and 2 random attack
events:

Create a new event for the monsters activation and give it a suitable name.
In this event I’ve left the dialog empty, this means that the event will run “silently” (no dialog pop
up) and pick a random event automatically.

(although these are button actions, no button will be presented)

Add a “Continue” button and three events, these are its move/target events.
Set “Next Event” to “Random”, each activation it will randomly pick its move and target actions.
Edit the Move/Target events, and give them dialog box text. This is what the monster is doing
on it’s the action.

I will start with the second action, because it is quite simple. If there are no investigators to
attack we need an event for “No Investigators in Range”. This button will then move the monster
one more space, and end the monster activation.
Here is the event, leave the continue button empty to end the monster activation.

The first button action is the meat and bones of the monsters attack.
From the target/move event the monster will move 2 spaces and attack the investigator in it's
space with the highest Lore. If an Investigator is in the space then we have it attack with the
“Monster Attacks” button.

This is a melee activation, so an investigator must be in the space (if not the player would click
“No Investigators in Range” instead).

Under the “Monster Attacks” button we need events to to describe what the monster does.#

Note: ​If you’re wondering what all the other attack events are (MonsterAttack2&3), these are
similar events to MonsterAttack1 but with different dialog’s and skill tests. This is to add variety
to the monsters attacks.
Because MonsterAttack3 is much more powerful that monster attack 1 or 2, I have linked
MonsterAttack1&2 an additional time, decreasing the likelihood that MonsterAttack3 is selected
(to ⅕ chance).
Create an event for the melee attack:

Go back to the Monster Activation Event and create another Target/Move activation event, this
will be a ranged attack. Use the blue back button (top left) to go back to previous events. It
saves time!:
This time it will move 2 spaces to be in range (range is within 3 spaces)

Same as above “No investigators in range” is linked to the move event, so the monster will
move a space then end its activation.

If the “Monster Attacks” (i.e. is within 3 spaces of at least one investigator), it will trigger the
RangedAttack1 event:

You can scale these events as much as you like. Select “Next Event” as “Random” and keep
adding moves and their attacks! Variety is the spice of life.
You could even create events to attack all investigators in range! If you do, be sure to make it a
little less destructive than attacking a single target to keep the damage output balanced.
Evade
Evade works exactly the same way as Activations:
In this example I’ll just do one event, but you can use the method above to make it as complex
as you like:

Horror
This works exactly like Activations and Evade, I won’t repeat myself. I’ll leave this as base (will
use the Shoggoth horror text).
Spawn the monster:

Create a spawn event, this will be used to spawn the monster. Use the Highlight, to indicate
where the monster will spawn. You can use this descriptive to detail the rules or engagement -
does it walk through walls? What horrible thing happens when it arrives?

Trigger the Monster


Technically not part of the monster, but linked to it, so i’ll explain how it can be used.
You can find more information on Triggers ​here

Now trigger the monster


Triggers are used to start events, in this case we are going to use it to trigger the monster
spawn above based on the round number.

In the spawn event above, set it to “EndRound”, this event will attempt to run at the end of every
round. (​Note: you can also create your custom trigger variable as described in the chapter @
​ ntontimmermans​ )
Variables, ​Contributed by a

(see more about triggers above!)


Add a Test to stop it from spawning every round!
In this example i’ll put in a test to check the round and run the event if it’s round 10:

(See more about variables above - they are crazy useful)

Completed Monster:

It will spawn at the end of round 10 with a spawn event.


How the monster looks in game
Let’s see this bad boy in action!

Spawn

.Attacking the monster:

Generic attack actions for investigators:


Random move triggers a ranged attack:

The attack

Evading the monster (#nicetypo)


Use cases
There are several use cases for Custom Monsters, they are not just for “the big bad guy”.

You could have events that turn NPC’s to monsters, ​ohh double cross.​

You could use the custom monster which triggers to drop an item, even if it’s just a lowly
zombie. You’d want this Zombie to be a custom one, because you don’t want every single
zombie that dies dropping the item!

Also remember, monster attacks don’t have to always be attacks. They could be events to
spawn more monsters or even to attack other monsters (maybe to regain health! :D). Your
imagination is your limits when it comes to creating custom monsters.
Custom Monster Images
This would be a JPG or PNG of the monster (I would always advise using PNG’s)
(remember to keep it small ~200x200px as you’ll only see it as a tile on the monster tray)

I’d suggest always using PNG’s as some sections of the editor will not load a JPG.
I personally used GIMP (a free photoshop) to cut the border from an existing monster and paste
it over my image, then add transparency to the background.

There are some handy tutorials for using GIMP online, I won’t go into it here.
Interactive System / Puzzles

First off you need to build your Images, bare in mind that they will need to be layered over each
other, so must be PNG’s with transparency.

Personally I use GIMP 2 layers to create each aspect of the Image:

Base and A Page

The two combined (page layered over the book)


In this example I have created 6 images:
(The book, 2 heading buttons, two pages and a blank image)

You’ll notice that the “Blank Image” has a nice green box around it, this is intentional. We can’t
place a button we can’t see, once the work is completed, we can replace this image with a blank
counterpart (of the same name).

These images will make up our book.

If you are interested you can find the GIMP Template here:
[Link]

(Feel free to check the other folders in that Repo, but be aware that there are spoilers for my
scenarios in them)
Ok now we have these images, we can move back to Valkyrie and implement the in game event
chains to display them.

Create the QItem:

On this QItem, create an activation event, this will be the first event in your chain to place the
Journal.

In this event, put some flavour text and buttons to tell the players what they are interacting with,
create a button to initiate the book chain and a cancel button (since it's not a token so won’t
have one automatically.

Here I am telling the players they can interact with the book without using an action.
On the “Read” button add an event to start your book chain, in this event place a UI element for
your book “the background”, since this image will show for every page of the book.

Note​: Remember the size of the UI element and it's “Units” we’ll need this when placing the
pages. We are intentionally using images of the same size and dimensions, so we will want to
scale them to the same as this one to line up. This means that in any screen resolution the
images will always line up. If they are cut off the side of the screen or scale strangely they will all
do the same thing so still be legible.
Now we come to the tricky part, we need to use variables to control what information is
displayed.

First of all I will explain the logic of the Event chain.

We’ll place the image, then create an event that will act as a Start point for placing other UI
elements that will act as buttons.

This event will have two “Ordered” events in it that will only run if certain variables are set. If the
game has not set the variables as the event expects it will ignore them.

We can use these events to place our Journal topics based on if we have discovered them or
not.

The flowchart below explains this logic:

Ok now we should create these Events.


First off we Create the “Loop Start” event as a follow on even from the “Place Journal” event
above.

Then create three buttons, two “PlacePage” events and an End Loop event. The “Continue”
Button order should be “Ordered”.

The first two events will place the UI elements that will act as graphics for some “invisible
buttons” we will create later. The final event will end the event loop and also the event chain to
continue to the next phase.

Note​: You may notice that I have added “1_” to the start of this events name. The reason
behind this is that if I filter events by Name it will show at the top of the list. This can save a lot of
time when working with loop events like this. You’ll begin to realise how useful this is as
progress through this tutorial.
In the first “PlacePage” event, we’ll need to configure a couple of variables.

Test - ​Clue1Found == 1
Is a Test to see if the variable is set, the variable itself will be set in token event outside of this
item. The variable will persist for the entire Scenario once set.

Test - ​Page1Placed ! 1
Is Test to make sure that this variable is not set, this is a way to track what buttons are on the UI
and prevent the loop from getting stuck in an endless cycle. This variable will only be used in
this Journal Event Chain.

​ age1Placed = 1
Assign - P
This Assign action will set the variable to identify that the UI has been placed (therefore when
this event is attempted to be run again, it will not pass it's variable requirements and be
skipped). This will prevent the UI from being placed again and causing an endless cycle.

Also set the next event to the “Loop Start” event.


The UI will look like this, notice the text on the right side over the tile, you’ll see why this
transparency is important later:

Note: ​The Image size and Y coordinate are the same at the background.

Repeat this process for the Page 2 Event we created, be sure to use the following variables:

Test - Clue2Found == 1
Test - Page2Placed ! 1
Assign - Page2Placed = 1
Ok now that this loop is completed, we can go onto the “Loop End” event we created earlier.
In this event we want to validate what was placed and act accordingly. For example:

If no clues have yet been found in the scenario, we need an event to state that nothing has
been found and exit - removing the UI.

If clues have been found, we should expect to have at least one page header appearing. We will
then want to proceed (in this case we’ll run another loop to place some invisible buttons, before
we exit the event chains and let the players interact with it).

We’ll start with the “nothing found” event first. We can approach this in a couple of ways:

1. The easiest, just create an event that checks the variables “Clue1Found ! 1 &
Clue2Found ! 1. This would work for this event chain but in my experience does not
scale very well.
2. The second option is to run a calculation to add up the “PageXPlaced” then have the
“nothing found” event check to see if that variable is higher than 0.

We’ll use option 2 as it is a very good technique to start thinking about.

In the event, create a new variable (CluesFound) and add the values of Clue1Found and
Clue2Found into it.
In the “Nothing Found” event, we want to set a test to check if “CluesFound” is greater than 0.

Add a clean event, we will use this one whenever we come to exit the scenario. In this one
event we’ll remove all UI elements and non static variables that we may (or may not) be placing.

Note: ​This will be used a lot so I have prefixed it with “1_” again for easy access later on.

I’ll come back to the clean up event later. It will be the last thing to configure so that we can
ensure that we have added all possible UI and variables that are used in this Item function. Go
back a level to the loop end.
Now that we have an event for if we didn’t find anything, we can proceed to the “A clue was
found” event we created earlier.

We will start another event loop, this one will now place some invisible buttons on top of the
journal page entries that we we have just found.

Now I bet you’re wondering “Why didn’t we just make smaller images for the “Page X” UI
images earlier and make those the Buttons?”

It is a valid question, you could absolutely do it that way and save some time and complexity.
The reason I am showing you this way, is so that you can adapt the concept to create a
multitude of useful puzzles and systems when you get more comfortable with it. For example,
this would be very useful when creating Descent style campaign maps (which is something I
really want to do in MoM at some point).

The next question you’ll ask is ​“Why didn’t we just add these buttons in the event chain above?!”

This is also a valid question, however there is a very subtle reason why it would not work.

The reason we are doing these in two event chains is that “UI Elements” will lay sequentially. If
more than one UI element overlaps another, the last one laid will be “on top” therefore if you
click, that UI’s action will run. This has it's advantages and disadvantages and is what makes
this method complicated. Laying the buttons sequentially above would lay them in this order:

Full screen BG Image


Full Screen Page 1image
Smaller Page 1 Button
Full Screen Page 2 image
Smaller Page 2 Button

If you click the Page 2 button it will trigger it's action, because it's on top and small. If you try to
click the Page 1 button, it will do nothing because the full screen image “Full screen Page 2
image” is actually placed on top, despite Page 1 being a small button.

This simple order is what means we have to lay the buttons separately, it's also a nice habit get
into, drop all your pretty pictures all perfectly aligned, then slap some haphazardly placed
invisible buttons on top.
Here is the event logic in a flow chart, tacked on to the one above:
So lets create a new “Loop 2 Start” event (“Button Loop”), just like we did for the first Loop we
created:

We’ll add Buttons for each of the two pages we may have found and an end loop like we did
before.

Note: ​Notice that I added the “1_” prefix again! We’ll use this one a lot too!
Open up the first “Place Button” event, we can use the same logic as we used before. If “Clue 1
is found”, then place Button 1.

Variables:

Test - Clue1Found == 1
Test - Button1Placed ! 1
Assign - Button1Placed = 1

Remember to add the “Loop Start” event to roll us around to place the next button.
Also add the Page 1 Button UI, we’ll configure those in a moment as they can get a little fiddly.
Repeat the process for the Page 2 Button:
Now that we have created our event loop, lets open up those two UI elements and configure
those to act as buttons.

Open the Page 1 Button and assign the “[Link]” image to it. You’ll notice the Green box
appear. Now you can see why it's important to have this boarder, we can see it to position it!

Use the X and Y coordinates and the Size options to move and resize the UI element to position
it correctly.

Note​: Getting the position right is really tricky, so you can see why we’d rather place a blank
button, and not stress with getting an image to perfectly align and be sized perfectly.
A tip I have for aligning this stuff, is to use an app that is “Always on top” I personally use
PNGOptimzer (which I use to compress my PNG’s anyway), resize the window to simulate how
you want your button to look (all UI elements are rectangles remember, even if they have
transparency). Open the image you want to lay a button for in Valkyrie. Drag the App over the
text or part of the image that you want to be a button. Then open up the button without moving
the Valkyrie or “App always on top” windows and position your button.
On this UI element create a follow on event, this event will run when the button is clicked:

In the follow on event put in the dialogue “Page 1 Clicked”

Repeat this process for the Page 2 button.

Now we have our second loop working we can wrap it up by placing an exit button and run the
clean up script so we can rerun it again in the future.
Open up the “Button Loop End” event and add a UI Element “Exit” button.

In this UI element just enter the text ”Exit” into the first box, then align it.

Note​: At present in 2.1.5 the UI buttons have no backgrounds, so be sure to take it into account
when placing it over your images. Also use your overlay app to position this correctly as
explained above.
On this UI element, add an event that will be triggered when this button is clicked.

Link the “Clean up Event” to this new event.


Open up the Clean up event. The purpose of this is to remove all UI elements and set certain
Variables to 0, so that we can rerun the event
Add all of the UI elements we have created, then set the following assigns.

Note​: When removing components you can plan for every eventually, it will still run cleanly if the
event runs but there are no UI elements to remove.
Finally, not really part of this event. Create a token, that we can click to give us the clues we
need.

You’ll do this naturally in your scenario, but for the pupose of this Example i’ll create a token in
the center of the tile and add the following buttons to it:

“Give Clue 1”
“Give Clue 2”
(it's a token we don’t need a manual cancel button)

You should know how to create and add a token with buttons by now! In the events on each
button i’ve entered the dialogue and set the assign variable as follows:
Clue1Found = {var:Clue1Found}
Assign - Clue1Found = 1
We are not completely done, but the framework is there… SO lets run this and see how it looks!

Here is our Journal, there are many like it but this one is ours!

We can read the journal, how neat!

WTF, where is my stuff?! Oh yeh I didn’t find any clues. Lets try that again
Lets click the get a clue token and find clue 2! This will prove a point.

Look at me, I’ve got a clue!

Ok lets read what we have now!


Cool we have text for page 2 now… Is that the clue?

If we click it we get the prompt that we’ve clicked it

If we now click Continue and Exit, we are kicked out to the board as expected.

Good Job Team, that's the first part complete!

Now to put something on those pages and get it so that it can loop back round to re-read.
The last thing we need to do is create a navigation system, to read the pages of your journal.

There are many ways to do this but the cleanest (I feel) is to cause all button clicks to run the
“cleanup” script as if exiting. We can then flag on Variables for what button we have clicked to
then run a follow on event.

For example
Ok lets begin, open your scenario and find the “Page 1 Button” UI Element, in my example
above it was “Journal_Button_1”:

Open the “Button Clicked” event that we created earlier and remove the text.

Now add an ​Assign​ to set the ​PageClicked​ variable to 1.

On the follow on event, select the “Clean Up” event


Repeat the process for the “Button Clicked” on the “Page 2 Button” UI Element, but set the
PageClicked​ variable to “2”.

Now open the “Clean Up” event, all button clicks so far (exit, page1 page2) all point to this event
and this event just clears everything from the screen an exits. This means we have one cleanup
event that all events land on before we either exit, or run follow on events. This will ensure a
consistent experience for the player and avoid code bloat (from multiple events clean up UI
elements.
In the “Clean Up” event add two “Open Page” events, one for when Page1 is click and the other
for when page 2 is clicked.
Open the first “Open Page” event, add the Background UI (already created) and create a new
UI element for the “Page Text”. Also set an assign for ​PageClicked​ to set it back to 0.

Note: ​I am going to add the exit button here for simplicity, but you could add Next Page,
Previous Page or Index Page buttons if you prefer.

Repeat this for Page 2, substituting the PageClicked variable to “2”.


Finally Open the “Clean Up” event and add the two new UI elements.

Note​: Once you are confident that your system works or just before you publish your scenario,
replace the “Blank” image (the one that currently has a green border) with a completely blank
image. You may tempted to leave them in place, but from experience I have found it's better to
use more thematic flair on the images below the blank button, this will ensure you do not get
any alignment issues (or cause you to waste too much time lining up these buttons perfectly).
Lets see how it looks now, this time i’ll click and give myself both clues from the token!

As expected

Ohh two buttons

Great! Page 1 works!


Special Symbols
You can use special symbols in any Dialog within the Valkyrie App. A full list of special symbols
can be founds on the Wiki:
[Link]

Using Special symbols for components


When placing tiles and Items you will have to tell the Investigator in the Dialog what item to take
or what tile to place.

We can’t manually type out item names for random items, so we need to refer to the
component's name and let Valkyrie do this.

You can do this by entering the code ​{c:​ItemName}​

This will pull the Item name from the QItem’s randomly generated item and display it:
The same can be done when placing tiles (I spent ages looking for the symbol code to add my
tile, only to find out the app would do it for me!).

When the event dialog displays and a component is added, it will enter the components (tiles)
name in place of the code:
Translating a Scenario
First of all, reach out to the scenario owner and ask their permission to translate. It will be a
wasted effort if you translate it only to find that the Author is inactive or not willing to apply your
translation. All of the Scenario writers I have spoken to are awesome.

The best place to find out the owner is to post an Issue on the Valkyrie GitHub, it's highly
encouraged for the community to use this as a base for all dialogue, be it bug reports for
Valkyrie (and Scenarios) or just asking questions relating to the app and homebrew scenarios
as a whole.
[Link]

Set Language
Set your Valkyrie language to the one you want to translate to. On the main Mansions of
Madness menu, this can be found in ​Options​.
Download and Copy the Scenario
Go back to the main menu (back!) and then click Scenario, click Download and select the
Scenario that you want to translate.

Tip​: Be sure to update any scenarios that you already have downloaded, as if the versions don’t
match the translation might have parts missing.

Hit back to go to the main menu and click Scenario Editor, then click Copy.

This will list all of the scenarios you have downloaded:


Click the one you want to translate and it will make an editable copy and you will notice it in your
list!

Note​: What this is doing in the background is extracting the Scenario Package file and putting it
in %appdata%\Valkyrie\MoM\Editor

Click the Scenario to open it in the editor. You can then start translating the text.

Translation Tips
​ ntontimmermans
Contributed by a

I usually find the event with the StartEvent trigger and work through the options as if I was
playing, translating as I go. It's hard to find, but usually the Event names give it away:
In the case of Exotic Materials the start event is “EventMinCam”
I expected it to be EventStart!

You can then use the Buttons at the bottom of each event to navigate as the Scenario would
play out. Follow the blue links next to Components and Buttons to follow as the scenario
unfolds:
You can also editor the text directly in the Localisation File, this is a file that contains all story
text. It uses references to the .ini files that contain all of the background data that you won’t
want to change for the scenario, such as button coordinates or tile selections.

This file can be found in:


%appdata%\Valkyrie\MoM\Editor\<scenario name>

There will usually be just one localisation file that follows this name format:
localisation.<language>.txt
E.g. [Link]

Exotic Materials has 5!

Important​: If you decide to edit the localisation file, be very careful not to change the event
references, it's easy to completely break your translation if you are using find and replace or
accidently delete these references:
Once you have finished all of your translation, save it. Your localisation file will appear in the
Editor folder (%appdata%\Valkyrie\MoM\Editor\<scenario name>\).

Copy this out and give it to the author to add. If they are not sure how to add the translation file,
refer them to the ​guide below​!
Alternative Translation Method (Advanced)
Instead of using the editor to translate a scenario, could could do the work all in the
Localisation.<language>.txt files.

The high level steps are as follows:


- Copy the Localisation file that is to be translated (this should be the default language)
and rename the copied file reflect the translated language
- Modify the copied file using CTRL + H, click ​regular expression. ​Enter ​,(.*)​ into the
find field and ​\t$1​ into the replace field.
- Select all (File Select All) of the text in the newly edited file and copy it to the clipboard
- Create a Spreadsheet (I would recommend a google spreadsheet)
- In the Spreadsheet click in the A1 box and paste the contents of the clipboard.
- Once verified, delete the content from the NotePad file you just copied from (you could
just cut the text into the spreadsheet if it's easier)
- Translate the text
- Copy all of the cells in the spreadsheet and paste it back into the empty (copied)
localisation file.
- Modify the file using CTRL + H with the regular expression ​\t​ and replace all it with the
regular expression ​,​ .
- Save the file, follow the rest of the ​process below to add the translation file to the
[Link]​ and then test it in the editor using your chosen language.
Full explanation:

First of all download the scenario and copy its Localisation.<default>.txt file.
In this example i’ll show you 22:30 in the bird shop.

Rename the file to ​Localisation.<newlanguage>.txt

Open the file in a text editor, I would recommend ​Notepad++​ (free and very good)

Hit ​CTRL + H ​(find and replace) and enter this regular expression into the “Find What” field
(.*)

Hit ​Replace All​ it with the regular expression​ ​\t$1


Click ​Replace All​, this should be a high number

Select All of the text in the document using ​CTRL + A ​(or Edit > Select All) then copy the text
into the clipboard using ​CTRL + C

Note​: You can use ​CTRL​+ ​X​ to cut the text if you prefer, since we will need to replace all of the
text with the translated text later.

Create a ​Spreadsheet ​(I would recommend google, as it's free and you can easily share and
collaborate if required).
Click the ​A1​ field and paste the data in using ​CTRL + V​ (or Edit > Paste, or right click Paste)
Note:​ Once pasted in I adjust the columns and turn on text wrap so that the text is visible on
one screen.

Translate the text with your chosen method.

Note:​ I would recommend translating the text the next column so that you can refer back to the
original text during translation. But if you are confident you can translate in line to save some
copy/paste later.

Tip: ​Personally I don’t speak a second language, so I have deployed the use of translation
tools. I can rough translate the text then proofread the translation and make it fit context, while it
adds a little but of work with playtesting to find the context to a confusing translation, it allows
me to contribute without being multilingual. My method involves using the translate function built
into google sheets​. ​Please note that this function seems to only work on a desktop machine, it
didn’t work when I tried it in Android.

In the ​C2 Column ​(the column next to my first line of text to be translated) enter the following
formula:

=GoogleTranslate(B2, “​es​”, “​en​”)

Note:​ ​es​ in this example is the source language and e


​ n t​ he destination. You can look up the
supported languages online - ​here is one I found

Hit ​Enter​ it will show a message ​Loading…​ then the translated text should appear.

Click the ​Cell​, then in the bottom corner you’ll see a ​blue box​, click and drag this down to the
bottom of your sheet (be sure to keep it in the one column). If you prefer you can copy the cell
then highlight the cells below and ​paste​.

Proof read the translated text and be very aware of the embedded MoM code. Translator
programs do strange things with the Valkyrie code, such as {rnd:hero}, \n, etc.
Once the translation in completed we need to clean it up and turn the syntax back into
something Valkyrie understands.

Cut your ​C Column ​ and Paste Special… Values Only it over the ​B Column ​(if you edited in
line you can ignore this step)

Note​: The reason we use paste values, is if we did the google translate above it will just copy
the formula across.

Highlight Columns A and B and copy using ​CTRL + C

Open the Localisation.<newlanguage>.txt file that we were using earlier. Use ​CTRL + A to
Select All​ and hit the delete key to clear the file (if you didn’t use the CTRL + V method)

Paste the data you copied from the spreadsheet into the NotePad file using ​CTRL + V
Now that the translated text is back in the file, we need to Find and Replace the regular
expressions we changed earlier back into their original format.

Press ​CTRL+ H​ in the NotePad++ file and select regular expression as we did above.
In the ​Search What​ field enter \t and in the Replace field enter ,

Click ​Replace All​ and you should see a similar number of changes as we did previously.

Save the file, follow the rest of the ​process below to add the translation file to the ​[Link]​ and
then test it in the editor using your chosen language.

Thank you very much to ​BenRQ​ for providing the steps to this translation method. It will save us
all a huge amount of time!

Making your scenario ready for translation


​ ntontimmermans
Contributed by a

To make future translation of you scenario more easy it will help if you make some texts that you use
often (like the text “Continue” on a button) a standard [Link] text definitions must be placed in
%appdata%\Valkyrie\MoM\Editor\localization.<language>.txt​ and referenced to in the rest of the file
(or valkyrie editor). With this mechanism, a translator only has to translate a word (or sentence)
once.

Note​: when you edit these types of files you must use a ‘source code’ editor like for example
Notepad++ or atom (both freeware). These editors won’t add any markup code that can mess up
your file but do have some spellings checking capabilities.

A standard text definition contains a (unique) reference word and the text it refers to separated
by a comma (,). Syntax: ​<unique reference word>,<display text>

In the standard text examples below, the text in capital letters is the reference word. And the
text behind the comma (,) is what will be displayed in the game:
ATTACK,Attack
CANCEL,Cancel
CONTINUE,Continue
EXPLORE,{action} Explore
INSPECT,{action} Inspect
NEVERMIND,"<i>""Nevermind""</i>"
OPEN,{action} Open
PICKUP,{action} Pick-up
SEARCH,{action} Search

To refer to the standard texts you have to use the following syntax ​{qst:<reference word>}​.
Example reference:
EventTESTLightsOn.button1,{qst:CONTINUE}
Important:​ if you edit this text in a source code editor, do not change anything upto and including
the comma (,) or you will lose the reference to the event.

You can also use this reference syntax directly in the valkyrie editor:

Note: that when you type the text in the editor it will initially display the {qst:CONTINUE} syntax, but
when you leave the event and then go back to it you will see that Valkyrie automatically shows the
button text in your chosen language (provided that you put the standard definition text in the
localization.<language>.txt file.

Combining multiple standard text to generate a longer description is also possible.


Example:
Default text to be shown when inspecting the item:
ONECLUE,You receive 1 Clue.
CONCLUSIVE,You notice some dried blood on the knife.​.

The first time you inspect this item you wish to show the text and hand out one clue:
[Link],{qst:CONCLUSIVE} {qst:ONECLUE}
Will show:
You notice some dried blood on the knife. You receive 1 Clue.​.
The second time you inspect the same item, you only wish to repeat the information but NOT
hand out a clue again:
[Link],{qst:CONCLUSIVE}
Will show:
You notice some dried blood on the knife.​.
General Tips

Alternate Endings
Have a think about different ways that the players can complete the game. Do they have to kill a
big monster, can they disrupt the ritual before it is summoned, can they burn down the mansion
instead? Use your imagination, it will add a lot of flavour to your Scenario.

Late game events


One thing I found when play testing an earlier Scenario, was that late game the board looked
very empty. Try adding events that trigger based on the #round number (using the StartRound
trigger), this could trigger events that happen in another part of the board that the Investigators
may have already investigated. You can use this to remove board tokens, add tokens or spawn
monsters. You can also trigger events to remove components like tokens and even tiles.

Story is Key
A general useful tip is not to get precious or hung up about any element of the story. Every
element of the story can (and probably will) get changed as long as the core of the story and the
horror that arises from it are kept.

For example, let's imagine “The Thing” is your favourite movie and you're all fired up to create
an epic Mansions scenario based on the film. Well for a start there are no snowy wastes tiles or
ice station rooms or for that matter a 'Thing' monster figure but change the monster to be a
Thrall, change the setting to be an abandoned house in say the wilderness and it starts to looks
more feasible. The key question is what is the essential core of the movie? Well, I think the
horror comes not from the scariness of the creature in or of itself but relating to the stress of the
characters desperately trying to determine who is infected. Add a mechanism in the app for this
and things start to look more interesting - and the randomness how arisen from the core of the
story and the horror.

- ​Contributed by NicolaZee (Thank you!)

Useful Tools

Audio trimmer - Online tool to Trim sound files


[Link]
Audio Online - Online tool to convert MP3 to OGG (MP3 not usable in Valkyrie, but OGG are)
[Link]

PNG Optimiser - Great tool, download. Run the exe and drag the PNG in. It’ll rename the old file
to ​_​[Link] and then spit out a shrunk lossless PNG of your image (shout out to redwolf2 for this
tip)
[Link]

A couple of useful open sources for gaming art can be found below:
[Link]
[Link]

(Thanks for the tip ​MilesTeg81​!)


Publishing your Scenario
Before you think about publishing your scenario I will give one bit of advice (outside of tip text no
less!).

PLAY TEST!

Play it through, get the board pieces out, set it up and play it over and over. Clear out the
spelling mistakes, fix the event sequencing bugs, get it perfect.

Then invite your friends over and invite them to give brutal feedback… Play it, letting them lead
so you don’t spoil the Scenario and suck up all of their ideas.

Take the criticism back to your Scenario and add, adjust where you need to to abate their
concerns.

I was going to Publish my own Scenario. Play tested with my Wife and that put it right back on
the drawing board. You’ll be surprised how linear a Scenario can feel when playing it, compared
to writing it.

Only when you and your gaming group are happy, should you proceed to publish!

Publishing your scenario is the act of uploading it to a persistent (will always be available),
publically accessible website. Once it is online, it can be added to the “Download” list on the
Valkyrie app.

There is a Wiki entry on this that explains it in detail:


[Link]
[Link]

I will detail how I personally intend to publish my Scenario’s.


GitHub
Bruce has suggested using GitHub to publish scenarios. As it's a free​*​ and very stable platform
(and is what the Valkyrie team uses to develop the application itself!)

It also has many more benefits and is free to use for public repositories.

*“Public” means anyone can read the content. You can create private repositories, but you have
to pay a monthly subscription for these (they have to make money somehow!).

Anyway, GitHub comes with many useful features, that allow you to manage your scenario
code.

But I will just explain the very basics to get your Packaged Scenario on the internet and ready to
be pulled into Valkyrie. (If you are interested in using GitHub to it's full potential, there are loads
of great guide on their ​website​ and ​youtube​ channel).

To keep this as simple as possible I will use the Windows GitHub Desktop Client. There are 4
simple concepts to understand before using GitHub.

Repositories ​- Is a folders that exist on your computer than you synchronize to a Repository on
[Link].
Commit ​- Is an action where you confirm the changes you have made to files in your local
repository (folder on your PC) to be approved to be uploaded to GitHub. I.e you update your
Scenario and want to update it on [Link].
Push ​- Is a command that will mirror your local “commited copy” (see above) to the online
[Link] repository. Basically “upload the things I have said are OK for upload” (commited).
Pull ​- This will pull down any changes from [Link] to your local PC (imagine you have two
PC’s and work on your scenario from different machines, this is a way to those two PC’s and
[Link] in sync).

This is the bare bones that you need to understand to use GitHub, I would encourage you to
check out the guide above, if you are curious.
Create an Account
First of all create an account with GitHub:
[Link]

I won’t explain this step, the register feature takes you through it step by step.

Note:​ Remember that you don’t need to pay anything to use public repositories.

Install the Windows GitHub Desktop Application


Go to and hit the download link
[Link]

Follow the installer, it should auto run the application. If not you can find it in your start menu
under the name “GitHub Desktop”.

Follow the steps (sign in with your GitHub account) to link the desktop application with your
GitHub account.

Create a Local and Remote Repository


In this example I will create a local repository on my desktop, then publish it to [Link]
using the GitHub Desktop application.

In the GitHub Desktop application click ​File ​then ​New Repository


A window will pop up asking you where you want to save the Repository, this action will create a
folder in the selected “Local path”, I have selected the Desktop (since Valkyrie Package files are
created directly on the desktop anyway).

Click ​Create Repository​ you will notice a new folder empty folder on your desktop, if you show
hidden files you will see the GitHub configurations files, used to run it. Don’t delete these!
In the GitHub Desktop Application you will see your local repository.

Click the ​Publish repository​ to create the [Link] repository under your account.
Untick the ​Keep this code private​ option (unless you have signed up for private repositories)
Then click ​Publish Repository
Create a Valkyrie Package for your Scenario
Now that you have a place to put your Scenario, you need to export it to a “Package”.

A package is simply a renamed .zip file which contains all of your Scenario data and the “logo”
image.

Open Valkyrie and Edit your Scenario.


Click the ​Tool​ menu button and click ​Create Package

Minimise or Exit Valkyrie and open your desktop, you should see a folder with the scenario
name.

It will include the .valkyrie package file (renamed zip) the Logo image (mine doesn’t have a
logo) and a .ini file:
Add your Scenario to your Repository
Simply drag your Scenario file into the Local Repository (in this example “ExampleScenario”).

Open the GibHub Desktop application and it will show that some files have been added (under
changes).
In the bottom left is a comments section where you can “Commit” the changes you have made.
This will authorise the changes and give context.

If you need to later change your Scenario, you can copy over the files with the new package and
commit it with a comment here. GitHub will keep versions for you automatically (which will help if
you break your scenario by accident with an update!).

Enter a title and a comment then click ​Commit to Master

The changes will disappear, and you will notice a number next to ​Push

This indicates that there are changes in your local repository that need to be pushed to the
[Link] repository.

Click the ​Push Origin​ to upload the changes to your GitHub repository (it may take some time
based on your scenario size and internet speed).
Open your GitHub account and you will see your new repository and the scenario files:

Note:​ You won’t find this, as I have moved it to my “PublishedScenarios” repository -


[Link]

You can view the files or download them from [Link]. You can also download the GitHub
Desktop App to other PC’s and download/clone the repositories to those machines.

Request that your Scenario be linked to the Valkyrie Application


Create an issue on the Valkyrie Issue tracker:
[Link]

With the name “New Scenario” and put the URL into the issue.

The Valkyrie team can then link it in the Valkyrie App, so that you Scenario becomes available
in the “Downloads” section of the Valkyrie App.
Adding a Translation file
This process explains how to link a ​Localization.<language>.txt​ file to your Scenario.

Copy ​Localization.<language>.txt​ the Scenario file to your Scenario’s folder.


%appdata%Valkyrie\MoM\Editor\<ScenarioName>

Open the directory and edit the ​[Link]​ file.

You will notice a section that lists you localization files and the default language:

The default language will automatically be set to whichever language your client was set to
when you created the scenario. If you wish to change the default language, it can be done here.

Add a new line under the ​[QuestText] ​and type the name of the extra
Localization.<language>.txt

Save and Exit the file.

Open Valkyrie > Scenario Editor > ​Your Scenario


Click ​Tools​ and ​Create Package

The new package will now contain the additional language.


Copy these files to your online repository (​copy to local repository and commit changes​ if you
are using GitHub).
Appendix; Code Snippets and Templates
​ ntontimmermans
Contributed by a

Advanced scenario programmers may choose edit the source code files directly to save time.
Files like ​%appdata%Valkyrie\MoM\Editor\<ScenarioName>\[Link]​ and
%appdata%Valkyrie\MoM\Editor\<ScenarioName>\localization.<language>.txt​.

If you plan to edit those files make sure that you do not use an editor that adds additional
markup which could mess up your files. You should a source code editor like for example
Notepad++ or atom which are both free to use. After editing the editing the files you can reload
the scenario in valkyrie and see the result.

IMPORTANT​: Any typo in the syntax may result in loss of (part off) your work or unexpected
application behavior. Make sure to make regular back-ups. If you are uncertain how this works,
you should continue using the valkyrie editor only.

3 Question Dialogue template:


Instructions to add a 3 question dialogue to a person token. In the following instruction you can
rename "Person" to whatever token you want to link it and start filling the dialogue with story
text. Without any further editing it will look like this:

To make this run 3 variables need to be initialized at start of the scenario in your ‘EventStart’:
PersonAskA,=,0 PersonAskB,=,0 PersonAskC,=,0​ ​.
Copy this text into the file ​%appdata%Valkyrie\MoM\Editor\<ScenarioName>\[Link]
[EventPersonDialogue]
display=false
buttons=1
event1=EventPersonDialogueAll EventPersonDialogueAB EventPersonDialogueAC
EventPersonDialogueBC EventPersonDialogueA EventPersonDialogueB EventPersonDialogueC
EventPersonDialogueNone

[EventPersonDialogueAll]
conditions=PersonAskA,==,0 PersonAskB,==,0 PersonAskC,==,0
buttons=4
event1=EventPersonAskA
event2=EventPersonAskB
event3=EventPersonAskC
event4=

[EventPersonDialogueAB]
conditions=PersonAskA,==,0 PersonAskB,==,0 PersonAskC,==,1
buttons=3
event1=EventPersonAskA
event2=EventPersonAskB
event3=

[EventPersonDialogueAC]
conditions=PersonAskA,==,0 PersonAskB,==,1 PersonAskC,==,0
buttons=3
event1=EventPersonAskA
event2=EventPersonAskC
event3=

[EventPersonDialogueBC]
conditions=PersonAskA,==,1 PersonAskB,==,0 PersonAskC,==,0
buttons=3
event1=EventPersonAskB
event2=EventPersonAskC
event3=

[EventPersonDialogueA]
conditions=PersonAskA,==,0 PersonAskB,==,1 PersonAskC,==,1
buttons=2
event1=EventPersonAskA
event2=

[EventPersonDialogueB]
conditions=PersonAskA,==,1 PersonAskB,==,0 PersonAskC,==,1
buttons=2
event1=EventPersonAskB
event2=

[EventPersonDialogueC]
conditions=PersonAskA,==,1 PersonAskB,==,1 PersonAskC,==,0
buttons=2
event1=EventPersonAskC
event2=

[EventPersonDialogueNone]
conditions=PersonAskA,==,1 PersonAskB,==,1 PersonAskC,==,1
buttons=1
event1=

[EventPersonAskA]
operations=PersonAskA,=,1
buttons=1
event1=

[EventPersonAskB]
operations=PersonAskB,=,1
buttons=1
event1=
[EventPersonAskC]
operations=PersonAskC,=,1
buttons=1
event1=

Copy the following into the file


%appdata%Valkyrie\MoM\Editor\<ScenarioName>\localization.<language>.txt

CONTINUE,Continue
NEVERMIND,"<i>""Nevermind""</i>"
PERSONASKA,"{action} <i>""Question A""</i>"
PERSONASKB,"{action} <i>""Question B""</i>"
PERSONASKC,"{action} <i>""Question C""</i>"
[Link],Dialogue ALL.
[Link],Dialogue AC.
[Link],Dialogue AB.
[Link],Dialogue BC.
[Link],Dialogue A.
[Link],Dialogue B.
[Link],Dialogue C.
[Link],Dialogue None.
[Link],Answer A.
[Link],Answer B.
[Link],Answer C.
EventPersonDialogueAll.button1,{qst:PERSONASKA}
EventPersonDialogueAll.button2,{qst:PERSONASKB}
EventPersonDialogueAll.button3,{qst:PERSONASKC}
EventPersonDialogueAll.button4,{qst:NEVERMIND}
EventPersonDialogueAB.button1,{qst:PERSONASKA}
EventPersonDialogueAB.button2,{qst:PERSONASKB}
EventPersonDialogueAB.button3,{qst:NEVERMIND}
EventPersonDialogueAC.button1,{qst:PERSONASKA}
EventPersonDialogueAC.button2,{qst:PERSONASKC}
EventPersonDialogueAC.button3,{qst:NEVERMIND}
EventPersonDialogueBC.button1,{qst:PERSONASKB}
EventPersonDialogueBC.button2,{qst:PERSONASKC}
EventPersonDialogueBC.button3,{qst:NEVERMIND}
EventPersonDialogueA.button1,{qst:PERSONASKA}
EventPersonDialogueA.button2,{qst:NEVERMIND}
EventPersonDialogueB.button1,{qst:PERSONASKB}
EventPersonDialogueB.button2,{qst:NEVERMIND}
EventPersonDialogueC.button1,{qst:PERSONASKC}
EventPersonDialogueC.button2,{qst:NEVERMIND}
EventPersonDialogueNone.button1,{qst:NEVERMIND}
EventPersonAskA.button1,{qst:CONTINUE}
EventPersonAskB.button1,{qst:CONTINUE}
EventPersonAskC.button1,{qst:CONTINUE}

Change the text after ​PERSONASKx​,​ into the text you wish to display on the buttons.
Change the text after ​PERSONDIALOGUExxx​,​ into the dialogue text you wish to display when the
person token is selected. Note: that .​ ..All​ is visible when all questions can be asked, . ​ ..None​ is
visible when there is nothing more to ask, and (for example) . ​ ..AC​ is visible when question B is
asked but A and C are still available.

And finally link the ​EventPersonDialogue ​to the person token in your scenario.
Introduction UI - the prologue
(contributed by Anton Timmermans with thanks to EwinDC for his example and explanation)
This chapter will give you the images, positions and sizes of the UI elements to mimic the
opening screens of the FFC application. Obviously, it is not mandatory to use these settings and
images, you can use your own imagination to make whatever you want. However, you must
take into account that the game will be played on big AND small screens, and with aspect ratios
of 16*9 AND 16*10.
This layout does not add the frame around the picture like in the FFC app. This is to allow for
more variety in sizes of images and not to be limited to the rectangular shape. And I found it
near impossible to get the frame around my chosen image without making my own frame.

Prologue Layout
These two images show the result of the chosen settings in a 16*10 ratio (left image with yellow
numbers) and a 16*9 ratio.

Let’s start with identifying the elements that make up the prologue screen. The numbered
elements in the layout correspond with the order and numbered items in the picture and list
below. The order of placement is important as UI elements are placed on top of eachother.

1. UIntroductionBackground
2. UIIntroductionTextTop
3. UIIntroducitonContinueBackground
4. UIIntroductionContinueText
5. UIIntroductionImage
6. UIIntroductionText

Note: in the following chapters the placement of the


elements is ​always​ done from the ​center position​ and
Units set to ​vertical​. This ensures that the scaling and
positioning of the UI elements works with any aspect
ratio​.
UIIntroducitonBackground
First, I start with placing the green background. I
choose the ​ImageGreenBG​ from the built-in
images because it completely fills the screen and
allows for any shape and format introduction
image.

Note: chapter UIIntroductionImage contains an


alternative for the background.

UIIntroductionTextTop
The second element I place, is the curly bar that
decorates the top of the text. I choose the
ImageCutsceneTextTopper​ image from the
built-in images, which is the same as used in the
standard FFC app. The chosen size and position
will align it with the textbox that will be placed
later.

UIIntroductionContinueBackground
Third placement is the frame that will outline the
‘Continue’ button. The image that is from the
build-in images: ​ImageInvestigatorSelectTile​. It’s
location and size are important because the have
to align perfectly with the text ‘Continue’ that will
be placed on top of it later. The FFC app uses a
different image, but I haven’t discovered that one
yet in Valkyrie.
UIIntroductionContinueText
The fourth element to place is the ‘Continue’
button.
This will be the active button that will be clicked
to continue the scenario. The ​placement, size
and​ aspect ​alligns this button with the white
area of the UIIntroductionContinueBackground
image that was placed earlier. The text size
should be ​1​ and the colour ​Black ​to make it
nicely readable with the light background.

Note: It is also the active element on the


Prologue screen which should clean up the UI
elements (as shown in the images) and place
the initial start tile to get the scenario started.

UIIntroductionImage
Fifth element to place, is the picture to illustrate the
story. The position makes it fit nicely next to the text
on the page. You can choose your own image or a
built-in image. The ​location ​is strongly advised, but
the size depends on your chosen image. I found it
easiest to first remove the ‘-’ on the x position, size
the image and then put the ‘-’ back.

Note that if you want to mimic the FFC app more, then you should place this image BEFORE
UIIntroducitonBackground and choose image ImageCutsceneBG from the built-in images as
background. The image that you choose should than be rectangular in shape or placed in such
a way that the ‘window’ in this background image shows the correct part of your image.
UIIntroductionText
Last but not least I add the prologue text. The
displayed ​position​, ​size ​and ​aspect ​will
create a text box that aligns between the
UIIntroductionContinueBackground and
UIIntroductionTextTop. You can play a little
with the ​Text Size​ depending on how much
text you have. Just make sure it fits in the
box.
Finishing comments and Shout Outs

Anyway I hope this was educational and not a laborious read.


I had a fair bit of fun writing this, it's always good to test your knowledge with an audience.

Feel free drop an issue into my GitHub repository if you find any issues or want to make any
suggestions ​[Link]

I look forward to seeing all the awesome content that you guys create.

I wanted to thank Alex and Bruce for spending the time to proofread this, I appreciate the help!
Thank you to LordPyrex for explaining how to add ​translation files​!

A massive thanks to Joan (​EtiCarasoft​) for translating this guide to ​Spanish​!

Thanks ​NicolaZee ​for your comments and general tips! Always good to bounce ideas off you!
Thank you ​Anton​ for your guide on Tile Placement/Planning.

Thank you ​antontimmermans​ for joining me in maintaining this document and keeping it up to
date with all the latest and greatest tips!

Valkyrie - Mansions of Madness Second Edition Guide 
Content 
Installing Prerequisites
5 
Select Content
7 
Downloading Prema
Custom Audio
62 
Language specific UI and Audio
63 
Triggers
64 
Variables
65 
Variable Types
65 
How are they used
66 
Mor
Trigger the Monster
139 
Add a Test to stop it from spawning every round!
140 
Completed Monster:
140 
How the monster look
 
UIIntroductionImage
209 
UIIntroductionText
209 
Finishing comments and Shout Outs
211
Guide Translations 
 
This guide is now available in Spanish. 
 
https://docs.google.com/document/d/1yogKLaSEFFZvnJ0VdVDMKz
Select Content 
In this section you can select all of the game components you own. It is assumed that you own 
the main gam
Creating a Scenario - The Basics 
 
Right let’s get down to the fun stuff! Making your own Scenario! 
 
First off read what
Change the ​Scenario 1​ name and give it a name fitting your ideas of the Scenario. 
 
You can also select an ​Image ​for t

You might also like