-
Notifications
You must be signed in to change notification settings - Fork 0
Your first Entry
This following section will cover all the basics on how to create a new entry for NewSafetyHelp.
But first, a small section on how to set up a new entry.
First, please make sure the mod is correctly installed.
That means MelonLoader installed and the NewSafetyHelp ".dll" file moved to the mod's folder.
After this, launch the game at least once.
This will ensure that it is correctly set up and all the necessary files are created.
You can find the game's folder via Steam
(Right-click the game and choose "Manage" and then "Browse local files")
or by pressing the folder icon in the MelonLoader Installer.
Here, navigate to UserData:

A folder named NewSafetyHelp should be here. If not, launch the game once.
The inside of this folder should be empty if no extra user mods or entries were installed.

Here we can create any new folder that can hold any amount of entries and custom content.
We do require creating a folder (inside this empty folder), but you are free to name it anything.
Step inside the newly created folder and create a new text file:

If you have file extensions shown, replace the ".txt" to ".json" which is a format that NewSafetyHelp understands.
JSON is a human-readable format, that machines also understand.
If you cannot see the ".txt" either enable it under Folder Options
(Recommended) or open the file and make sure to save it as a ".json" file by writing it to the end of the file name.
In case the file ending (extension) is hidden for you, see the image,
which shows where you can disable the hiding of file extensions (Folder Options):
\
After converting or creating the JSON file, it should look like this:

Open the file with your preferred editor (for example, Notepad++ or Visual Studio Code) and insert the following lines for a simple entry in the game. Before we continue, please know that "Entry", simply means "Monster" or "Creature" in the game. We simply call it entry, because it's an entry in the list of monsters. Going back to the JSON: (The curly brackets are required, so don't forget to copy them):
{
"entry_name": "A monster name",
"entry_description": "A monster description",
"entry_portrait_image_name": "image_of_a_monster.png",
"access_level": 0
}After this, save the file, and you have finished the setup for a simple monster. Next up, we will cover how to modify the entry.
Now that we have a simple file containing the basic structure of an entry, we can start working on it.
As you can see, all options are separated by a line followed with a comma value, this is required, so that the mod knows where a line start or where a line ends.
All texts (Like "A monster name") (strings) must be contained inside two double quotes: "a random description". Numbers (such as 2 or 3.4) do not use any double quotes.
If you wish to add a new line or option,
just add it below the lowest line and make sure that it stays between the curly brackets.
And don't forget to use commas!
For now, we ignore what exactly it means,
but notice that every line (execpt the last) has a comma at the end:
{
"entry_name": "A monster name",
"entry_description": "A monster description",
"entry_portrait_image_name": "image_of_a_monster.png",
"access_level": 0
}Now, let us analyze what each line actually means.
"entry_name": "A monster name",The option "entry_name" denotes how the monster should be named.
The option is then separated by a colon ":" followed by the name of the entry in double quotes.
For this case, we have as the name "A monster name". Feel free to name it whatever you wish (Like: "Bob").
"entry_description": "A monster description",Just as the name implies, we can also provide a description. The description for standard entries in the game are written in Rich Text Markup, this allows for a lot of customization but can get quite difficult to understand.
But if you ever wish to change the color or do some crazy things, visit the link above.
Now, let us see an example of how the game formats it's description:
"entry_description": "<b>DESCRIPTION:</b>\n\nExample Description. \n\n<b>DANGER:</b>\n\nExample Danger Description. \n\n<b>SOLUTION:</b>\n\nExample Solution Description.",Here, all sections are divided by a \n\n<b>SECTION_NAME:</b>\n\n attribute string,
anything followed by it will appear as if it belonged to that section.
The "\n" denotes a newline (You can add more "\n" if you wish to add more empty lines).
While the 'b' around the text <b> TEXT BETWEEN </b> makes the text in between bold.
We can also provide an image and an audio clip for our entry:
"entry_portrait_image_name": "image_of_a_monster.png",
"entry_audio_clip_name": "monster_audio_clip.mp3"For these to work,
the file names must also be included in the same folder as the JSON file:

(Tip for the advance: You can create subfolders for organizing)
Now after I added the audio clip, our file should look something like this:
Now, after adding one or two phobias, our file looks like this (a new line added):
{
"entry_name": "A monster name",
"entry_description": "A monster description",
"entry_portrait_image_name": "image_of_a_monster.png",
"access_level": 0,
"entry_audio_clip_name": "monster_audio_clip.mp3"
}In the JSON file, the name of the file with its extension must be provided. This ensures that they are correctly imported. Not all formats are supported, but most modern and most used are. If your image or audio isn't loading, you can find a list of supported audio files here: (Audio Types, Image, and other File Types)
Excluding the audio and the image,
you should see a new entry appear in the game that looks like this (Renamed to "Random Name" for example):

Now an extra section we have glossed over is the access_level,
this allows us to set when the entry is allowed to be accessed.
Since some entries need a specific day to be accessed,
perhaps you may also want your entry to only be accessed on a specific day.
By default, it is 0, which means it can be accessed at any time, no matter the current day.
We can set the entry to unlock on day 3 with the following line:
"access_level": 3The game also supports some accessibility features that automatically hides any image that may contain a phobia.
I recommend doing so since it allows others to also enjoy your custom entries.
Every phobia is set to false by default, so there is no need to mention or add every single one. (Only add those you require)
Here is a list of all available phobias and how to enable them.
They can hold either the value true or false.
Which is different to the strings (text) we previously had which required the double quotes.
Booleans (true or false) describe if something should be turned on or off.
They do not use double quotes.
"spider_phobia": true,
"darkness_phobia": true,
"dog_phobia": true,
"holes_phobia": false,
"insect_phobia": true,
"watching_phobia": false,
"tight_space_phobia": trueFor a more detailed description, you can read the documentation section on each of the values and much more.
This should cover how a simple entry works, for the next section, let us expand our monster and use more features.
We can not only create a new entry and be happy to see it, but we can even make a caller for it.
Please be aware, that the following caller sections are for the main game only!
Custom Campaigns use different files for callers.
This is because custom campaigns add new callers and not replace callers.
So use the following section if you wish to use it in the main campaign only!
A custom caller will replace a main campaign caller with a certain chance (By default: 10% = 0.1).
For this, we add this new example section into our JSON. It must be in the same JSON file for it to be associated to the same entry.
"include_campaign": true,
"caller_name": "Caller Name Here",
"caller_transcript": "Caller Text Here: Hello I need help!",
"caller_image_name": "caller_image.jpg",
"caller_audio_clip_name": "caller_audio.mp3"The first line:
"include_campaign": trueAllows us to enable the caller for the main campaign. If not provided, it will assume it's only for arcade/training mode. Since the internals of the game call it "arcade", we stick to that name, but it just means the training mode.
Let's get back to the caller, similar to how we can set the name and the description, we can set the name and the call's transcript:
"caller_name": "Caller Name Here",
"caller_transcript": "Caller Text Here: Hello, I need help!",(Note, the transcript will automatically be adjusted to the clip's length, so no need to adjust the audio)
And again, we can set the audio and the image of the caller:
"caller_image_name": "caller_image.jpg",
"caller_audio_clip_name": "caller_audio.mp3"Now let us see a more advanced caller and how to test it.
The caller has a random chance to replace the actual caller. We can adjust the chance to a higher one.
By setting it to 100% (1.0), we get:
"caller_chance": 1.0By default, the callers can appear every time you restart the game.
But for immersion, you may want it to instead only call once.
With the below option, you can set the entry caller to only call once and never again (Until you set it back to true).
(Like the phobia section, we can provide either true or false (Default: true)).
Here we set the caller to only call once.
PS: You can skip this for now, since we are still testing:
"allow_calling_again_over_restarts": falseIf we provide all the valid lines, a caller could look like this now:

We can also allow the custom entry to work only in the DLC (Seasonal Worker) or in both the main game and the DLC.
We can provide either one of these:
"only_dlc": true,
"include_dlc": trueThe only DLC option means the entry will only appear in the DLC,
while "include_dlc" means to also include it in the DLC along with the base campaign.
Since the original caller may call back after being provided a wrong answer (Consequence Caller), you can also provide a caller profile for that call. Again, this is for the main campaign and not custom campaigns. This works the same as it works for the normal caller, other than not requiring to provide a chance (since it will always happen):
"consequence_caller_name": "Consequence Caller Name Here",
"consequence_caller_transcript": "ConsequenceCaller Text Here: Hello I need help!",
"consequence_caller_image_name": "consequence_caller_image.jpg",
"consequence_caller_audio_clip_name": "consequence_caller_audio.mp3"This covers all the basic functionalities of creating entries in the mod, the next section will cover a more advanced topic of replacing an entry instead of adding a new one.
In order to replace an entry, we do it the following way:
We do so by providing the replace_entry tag:
"replace_entry": trueIf true, it will replace the entry with the provided name. So, for example, if we wish to replace the Animation entries description, we would create the following file:
{
"entry_name": "Animation",
"replace_entry": true,
"entry_description": "No, no more entry for the Animation for you!"
}Now, the "Animation" entry should look like this (I also added a hat to it):

And that covers how to create a monster!
If you want to read what each tag does in a quick overview, then feel free to check out the documentation.
If you want to dig deeper into JSON, here is a small tutorial: JSON Tutorial.
Have fun creating your new monsters!
- Home
- Installation
- Your first Entry
- Your first Custom Campaign
-
Customize your Custom Campaign
- Extra campaign customization
- Adding custom emails
- Adding custom videos
- Adding custom music
- Adding intermission music
- Adding custom ringtones
- Adding custom text files
- Adding custom cutscene
- Adding custom themes
- Accuracy Callers
- Advanced Accuracy Checks and Caller Requirements
- Adding custom modifiers
- Advanced Settings
- Documentation