Valkyrie Guide for Mansions of Madness
Valkyrie Guide for Mansions of Madness
Content
Installing Prerequisites 5
Select Content 7
[Link]
edit?usp=sharing
Getting Set up
Installing Prerequisites
First off install Steam and download the Mansions of Madness App, from here:
[Link]
Fire up Valkyrie and under Mansions of Madness Second Edition hit Import Content
It can take some time as it collects all of the data from the Steam App, so be patient.
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).
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).
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.
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!
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.
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
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.
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}.
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
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.
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)
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.
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.
Click the green + next to Buttons to create a second button and name it “Failed”
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.
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\Scenario1, ( 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.
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.
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.
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.
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.
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
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
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.
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.
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.
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.
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.
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).
To copy an existing Scenario download it from the New Scenario > Download section.
There are some helpful demo’s try downloading these first before trying to dissect a full and
scenario:
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!
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 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).
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.
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.
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:
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.
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}
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!)
Once this event runs, the text that was printed for {rnd:hero} will be saved in the event.
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]
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
$MythosLevel v ariables.
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)
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).
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.
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) .
Under the Button click the green + to add an event, edit it and give the event some dialog and
remove the search token.
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.
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).
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.
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.
Do not add any Dialog to make the event “Silent” to the players
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”
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
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:
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
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
These are (forgive me if I get it wrong, its late!) 7 permutations, then we need another "catch all".
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.
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
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.
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!)
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!?!).
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.
All questions gone, so we should expect to see the "No Options" dialog and remove the guy.
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.
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.
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
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.
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.
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)
%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.
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.:
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:
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 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
I found the best way to deal with events in large scenarios is to apply both methods.
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..
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.
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).
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.
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.
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?
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
Completed Monster:
Spawn
The attack
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.
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).
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.
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.
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.
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.
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.
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:
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:
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.
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!
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.
If we now click Continue and Exit, we are kicked out to the board as expected.
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 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.
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
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.
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.
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.
There will usually be just one localisation file that follows this name format:
localisation.<language>.txt
E.g. [Link]
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.
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.
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
(.*)
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.
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:
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.
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!
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.
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.
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.
Useful Tools
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]
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.
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.
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.
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.
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!).
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:
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.
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.
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
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.
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=
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
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.
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
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!
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!









