Skip to content

Your first Entry

Julian Koberg edited this page Jul 1, 2025 · 44 revisions

Your first Entry

This following section will cover all the basics on how to create a new entry for NewSafetyHelp.

Setup

But first a small section on how to set up a new entry.

It is assumed that the mod is firstly 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 setup and all the necessary files are created.

The game's folder can be opened 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:
FolderSelect

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

Here we can create any new folder which can hold any amount of entries. It is required to create a folder for it, but you are free to name it anything.
Step inside the newly created folder and create a new text file:
NewTXT

If you have file extensions shown, replace the ".txt" to ".json" which is a format that NewSafetyHelp understands. A human-readable format.
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 extending it to the end of the file.
Incase its hidden for you, the image shows where you can disable hiding the file extension in Folder Options:
hiddenfolder

After converting it to a JSON file, it should look like this:
image

Open it up with your preferred editor and insert the following default layout for JSON Files (The curly brackets are required):

{
	"monster_name": "A monster name",
	"monster_description": "A monster description",
	"monster_portrait_image_name": "image_of_a_monster.png",

        "access_level": 0
}

After this, save the file and you have finished the setup. Next up, we will cover how to modify the entry.

Simple Entry

Now that we have a simple file containing the basic structure of an entry, we can start working on it. Please note, that technically all values are optional, though not including something may have unexpected or unwanted behavior.

As it can be seen, all options are separated by a line followed with a comma value. As it is required to follow the JSON Format (If interested: JSON Tutorial) all texts (strings) must be contained inside two double quotes, while numbers do not use any double quotes.

If you wish to add a new line or option, just append it below the lowest line and make sure that it stays between the curly brackets and that the previous line includes a comma to separate the lines. For now, ignore what exactly it means, but notice that the previous line now has a comma at the end followed by a new line:

{
	"monster_name": "A monster name",
	"monster_description": "A monster description",
	"monster_portrait_image_name": "image_of_a_monster.png",
        "monster_audio_clip_name": "monster_audio_clip.mp3"
}

Now, let us analyze what each line denotes.

"monster_name": "A monster name",

The option "monster_name" denotes how the entry/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", which can be renamed to any other name.

"monster_description": "A monster description",

Just as the name, we can also provide a description. The description for standard entries in the game are written in Rich Text Markup, so if you wish to color or change any part of the description, visit the official documentation.
For this example, let us see an example template how the game formats it's description:

"monster_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 a section. The "\n" denotes a newline, while the <b> TEXT BETWEEN </b> tags make the text in between the tags bold. For more tags, see the Rich Text Markup documentation.

We can also provide an image and an audio clip for our entry:

"monster_portrait_image_name": "image_of_a_monster.png",
"monster_audio_clip_name": "monster_audio_clip.mp3"

For these to work, the file names must also be included in the same folder ass the JSON file (Must be in the same folder):
image

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. See the Unity Documentation for a list if it is failing for you. (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): image

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. Just note that it caps out at 5 since there are no more than 6 days.
You can provide it like this:

"access_level": 3

The game also supports some accessibility features that automatically hides any image that may contain a phobia.
It is best to also allow the game to do it for our entry if present. Every phobia is set to false by default, so no need to mention every single one.
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) do not require them.

"spider_phobia": true,
"darkness_phobia": true,
"dog_phobia": true,
"holes_phobia": false,
"insect_phobia": true,
"watching_phobia": false,
"tight_space_phobia": true

For 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 it and use more features.

Extending the Example

We can not only create a new entry and be happy to see it, but we can even make a caller for it.
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": true

Allows us to enable the caller for main campaign, if not provided it will assume it's only for arcade/training mode. Arcade/Training mode, however, will only use the caller audio and the "arcade_calls" tag which contains a list (A list are multiple texts inside square brackets):

"arcade_calls": ["Hello call 1 random", "Hello call 2 random"]

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 maybe test it.
The caller has a random chance to replace the actual caller, we can adjust the chance to a higher one, we can set it to 100% (1.0) for example:

"caller_chance": 1.0

To make it more immersive and less annoying, the custom caller can be set to only be able to appear once and never again. We can set it to instead to save over game restarts. (Like the phobia section, we can provide either true or false (Default: false)):

"allow_calling_again_over_restarts": false

If we provide all valid lines, a caller could look like this now: image

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": true

The only DLC means the entry will only appear in the DLC, while include DLC means to also include it in the DLC.

Since the original caller may call back after a being provided a wrong answer (Consequence Caller), you can also provide a caller profile that call. This works the same as it works for the normal caller other than not requiring to provide a chance:

"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 the Mod, the next section will cover a more advanced topic of replacing an entry instead of adding a new one.

Advanced Features (Replacing an Entry)

In order to replace an entry, we can do it in two ways. Either we provide a monster ID and it will completely replace the entry or we only replace parts we provide.

Each entry in the game has its own ID, if we know the ID or wish to provide our own ID, we can do that:

"monster_id": 74

Note, you do not need to provide an ID for adding entries, it is automatically handled if not provided.
If you provide the same ID as an existing entry, it will replace it with everything provided.

Now, sometimes we only wish to update an entry instead of replacing the entire entry. We can do that by providing the replace entry tag:

"replace_entry": true

If true, it will replace the entry with the provided name. So for example if we wish to replace the Animation entrys description:

"monster_name": "Animation",
"replace_entry": true,

"monster_description": "No, no more entry for the Animation for you!"

With a nice hat added, it look like this: image

And that covers all the features!
If you want to read what each tags does in a quick overview, then check out the documentation.
Have fun creating your new Monsters!