-
Notifications
You must be signed in to change notification settings - Fork 0
Your first Custom Campaign
This following section will cover all the basics on how to create a custom campaign for NewSafetyHelp.
Please be aware that this will require some basic entry creation knowledge.
I will be skipping the syntax and installation on this page.
This section will not cover creating custom entries / monsters, but will tell you how to attach it to a custom campaign.
So, if you haven't made your first entry yet, be sure to check it out first.
We will first see how the custom campaign is defined and then how to add entries, calls, emails, and videos to it.
Similar to how we created a simple entry, we also have to create a .json file in a folder. This will contain the options and settings for your custom campaign.
A simple custom campaign should look like this (Don't forget syntax containg: braces {}, commas ,, the quotation marks "" and the colon :):
{
"custom_campaign_name": "Custom Campaign Name",
"custom_campaign_desktop_name": "Campaign Desktop Name",
"custom_campaign_icon_image_name": "campaign_desktop_icon.png",
"custom_campaign_days": 5
}The above JSON file defines the minimum to create a custom campaign. The first line:
"custom_campaign_name": "Custom Campaign Name"Is the internal name of the campaign. It is best to not reuse the same internal name as others, as this could lead to mix-ups. This is also the name that entries, videos, emails, and callers will need to be associated with the correct custom campaign.
The line:
"custom_campaign_desktop_name": "Campaign Desktop Name"Provides the name that is shown on the desktop; if you wish to have a name similar to an existing custom campaign, provide it here, as it won't interfere.
For the remaining lines:
"custom_campaign_icon_image_name": "campaign_desktop_icon.png",
"custom_campaign_days": 5The first line defines the icon that shows up on the desktop to switch into your custom campaign.
And the second line defines how long your campaign should go for. Please be aware that this is merely a way for the game to be able to save your progress, so you don't need to use all the provided days. However, if you are going to have more days than provided in the file, it will not be able to save your custom campaign progress.
If everything worked correctly, then you should be able to see this when you go to the desktop screen:
Before learning how to add things to the custom campaign, it's best to learn some options to make testing and working easier. And how to identify problems.
First, let us see how to always enable some default programs on the desktop.
"entry_browser_always_active": true
"scorecard_always_active": true
"artbook_always_active": true
"arcade_always_active": trueThese will make the provided programs always be unlocked while in the custom campaign. This may be helpful if you wish to see your scorecard or all entries.
If you enable the entry browser, you see all your custom entries without needing to start a day.
If you are testing the different calls, it is helpful to be able to skip the waiting time. As such, you can use the following option:
"always_show_skip_call_wait_time": trueNow, if your custom campaign or any attached things do not work, always be sure to check the console for any errors. An example of a syntax problem in your file is:
As you can see, the mod was unable of reading the provided JSON file. This could be due to a comma or quotation mark missing. So make sure to look for any red errors in the console if things do not work.
Another type of error are warnings. These tell you that something is missing or wrongly provided. These don't necessarily mean that something is wrong, but that something could go wrong or unexpected if not fixed. An example is providing a conflicting option, such as having a warning caller (A caller that call the player if you get too many answers wrong) and wanting the warning caller to also be a normal caller at the same time.
An example for this:
If you ever see your game stop working at some point, like after the 4th caller, and you don't see any errors or even warnings, it could be a silent fail (Meaning it fails but doesn't inform you).
This could mean that you may be missing a caller after the current one. Just make sure you aren't forgetting something.
If everything worked fine (no red errors) but it isn't working. Then don't hesitate to ask others or even me for help.
I know there are a lot of new things to learn. Don't worry, take your time. You don't need to know everything now, so feel free to try out and only return once you have some questions.
Later you might find testing 80 different callers in your custom campaign a bit exhausting, especially if you don't remember all the answers. You can use the following option to make all your answers correct, even if you provided the wrong answer (Just don't forget to disable it for others later!):
"skip_callers_correctly": trueJust as the main campaign uses existing videos, emails, and entries, we might wish to include or exclude them.
Per default, all emails and videos are removed, but not the entries. But if you wish to remove the default entries or include the emails and videos again, you can use the following options:
"custom_campaign_remove_main_entries": true"remove_default_emails": false,
"disable_main_campaign_videos": falseYou can also make all default entries instead be unlocked on day 1 with the following option:
"custom_campaign_empty_main_entries_permission": trueAnd if you want to disable the default music, you can as well. Just make sure to add some later, or else you won't hear anything:
"remove_default_music": trueIn the main campaign, if you get too many answers wrong, you get a warning call, and if you continue getting answers wrong, then you get a game over screen.
You may want to adjust the threshold or set how many callers must happen until a warning appears.
For adjusting the game over and warning threshold, you can use:
"custom_campaign_gameover_threshold": 60
"custom_campaign_warning_threshold": 60The default is 60. Which means that if you have less than or equal to 60% of calls wrong, it will then trigger a warning, and if it is the end of the day it will also trigger the game over.
To set how many calls with entries attached are required until a warning can appear, one must do it in the following way:
"custom_campaign_threshold_amount": [3, 2, 3, 4, 5, 7] The first number in the list is for the first day, the second number is for the second day, etc…
So if your campaign has 5 days, you would need to pass 5 numbers in the list. As an example, the first number “3” means that for the warning to appear, one must see at least 3 callers with entries. This does not mean you need to get 3 wrong, but the 3 can be a mixture of correct and wrongly answered callers. What matters is the warning threshold we provided before. If the 3 callers are the only callers, and we get 2 wrong and 1 correct, it will cause the warning caller to trigger (at 60% threshold) after the third caller.
After this, now let's see the perhaps more interesting option. Cutscene videos! One can now provide a video to play instead of the default after either a game over or normal game ending.
"custom_campaign_end_cutscene_video_name": "cat_dancing.mp4",
"custom_campaign_gameover_cutscene_video_name": "cat_punching_you.mp4"All you have to do is provide the name and the file inside the same folder. As a recommendation, if you wish to share your mod, make sure your files aren't too large.
That would cover all the basic functionality to have a basic campaign.
The next section will cover more customization for the custom campaign, but it is not needed.
If you wish to learn how to add emails, callers, and videos. And also learn how to attach your custom entries into the custom campaign instead; you can skip the next section.
To fit your theme better, you may want to change more than just the campaign parts.
First, let's see how to modify the campaign days and the desktop date.
Here is an example to show different types of days when loading into the main game. These will show up on their corresponding day based on order. The first item in the list corresponds to the first day, the second item to the second day, etc.
"custom_campaign_days_names": ["First Day", "Second Day", "Third Day", "Fourth Day", "Last Day"]It is best to have one element for each day to avoid any non-fitting days.
Now, you might also be interested in how to change the day on the desktop. To do so, provide the following:
"start_year": 1987
"start_month": 11
"start_day": 15With these 3 options, you can set the start date to any preferred day. Please note, due to how the game is coded, that the first day is 1 day after the start day. So if you wish your game to start on the 15th, provide your start day as the 14th instead.
Some may have noticed that the date format is from the United States. So if you prefer the European date format instead, you can use the following option:
"use_europe_date_format": trueAfter using these options, you may get a result similar to:
You can also provide options to change the desktop loading screen. \
"custom_campaign_loading_desktop_text1": ["First Text loading", "First Text loading.", "First Text loading..", "First Text loading..."],
"custom_campaign_loading_desktop_text2": ["Second Text loading", "Second Text loading\nSecond Text loading 2"]
The loading screen will loop through the first list. In this example, I added three dots to simulate it loading. The second option contains the second part of the loading screen, showing the computer start up and login. In this case, I only provided a dummy text.
Note: Any text in the game you can provide uses Rich Text Markup, so if you wish to customize it even further, use it at your hearts content!
A simpler option is the username on the desktop screen:
"desktop_username_text": "Different_Username"
As the name suggests, it just changes the username to a different one. Fancy.
Now for a "more" fun part. How to modify the desktop background. The background is split into two parts: first the logo shown on top, and the actual background. I will first show how to change the background first.
The background in the main game is changed every day and even has a custom one for finishing the game. You can provide the different backgrounds for each day with:
"custom_campaign_desktop_backgrounds": ["firstDayBackground.png", "secondDayBackground.png", "lastThirdDayBackground.png"],
"custom_campaign_desktop_game_finished_background": "IWONTHEGAMEimage.jpg",
"disable_green_color_on_desktop": trueSimilar to how we provided option on how to change the different day names. Each image in the list corresponds to its corresponding day. If you wish to have a background for multiple days, just provide the same image.
The second option as the name suggests is the background shown after beating your campaign.
Now for the third option. It is used to disable the green color filter over your image. If you wish to show your image in its pure color, use this option. But if you wish to keep the green CRT style of coloring, you can leave it on by not providing it.
Let us talk about the logo now. Per default it shows the Home Safety Hotline logo in the middle of your screen. If you don't care about the logo or do not want it, you can simply disable it with:
"disable_desktop_logo": trueIf however, you do wish to use it and even modify it, you can use the following options:
"custom_desktop_logo_name": "weird_cat.png"
"custom_desktop_logo_transparency": 0.2627The first option custom_desktop_logo_name provides the image for the logo. The second option custom_desktop_logo_transparency is used to define how transparent the logo is suppose to be. Per default it is set to 0.2627. So if you wish it less transparent, provide a higher number and if you want it more transparent, provide a lower number.
If you set your background and logo to your hearts content, you should see a result similar to this (or not similar):
Now, as you can see in the image, you can also change the main game's logo and text to a different one with:
"rename_main_game_desktop_icon": "John Safety Hotline"
"main_game_desktop_icon_path": "pizza_cat.png"And that covers all the custom campaign options. Next up is how to add custom callers to your custom campaign so that you can finally test and see it work.
Now after you have created your custom campaign it's time to add callers to it. For this, create a new JSON file (newCaller.json) and call it whatever you wish. Just be know that each custom caller must have their own file.
Every custom caller in a custom campaign needs the following form:
{
"custom_caller_name": "John Safety",
"custom_caller_transcript": "This doesn't seem to be safe. But I trust your judgement.",
"custom_caller_image_name": "john.png",
"custom_caller_audio_clip_name": "john_crying.mp3",
"custom_campaign_attached": "Name of custom campaign here",
"order_in_campaign": 23
}The first three lines should be familiar if you have created a custom entry before. The last two are, however, new.
The line custom_campaign_attached allows you to provide a name for the custom caller to be attached to (This refers to the internal name and not the desktop name).
The option order_in_campaign is to set the order it should appear in. If it is the first caller, you provide a 0. If the caller is the second, you provide the number 1, up until your n'th caller which will have the order n - 1. Make sure you don't forget to start at 0! And also don't forget to include all numbers without any gaps, so if you provide caller 0 and caller 2, you also need to provide caller 1, or else it won't work.
The current caller we defined above is called a dynamic caller, since it does not do anything other than provide its transcript and go away.
Callers that have a monster / entry attached are not dynamic callers. This may be helpful if you ever get an error.
Now there is something important to know! The last caller of your campaign should be a dynamic caller! If not, the game will not end your campaign! That means don't provide a monster / entry for the last caller.
Let's now see a few more options.
To provide a monster / entry to be asked by the custom caller, you need to provide any of the following:
"custom_caller_monster_name": "Pizza Cat",
"custom_caller_monster_id": 34The first option is the recommended way to have it ask for that monster. If, however, you want to instead use IDs, you can use them. But be aware that this ID is meant for testing. Be aware that due to how the game is made, you can not loose on the first day. This may change if there is enough interest to be able to lose on the first day; If you want this, don't be afraid to scream at me to implement it.
Now for a few interesting options.
"custom_caller_downed_network": true
"custom_caller_increases_tier": trueThe first option custom_caller_downed_network downs the "network". Which basically means that the player can not access the entries as if the internet were gone. This should be familiar if you have played the main campaign.
The second option allows you to increase the tier of the player in the campaign. That means that if your entries have a higher unlock requirement, you can use it to unlock it for them. How you use this is up to you to decide, but I recommend doing it like the main game at the beginning of the day with a dynamic caller.
Now, after adding a few callers, you may be interested in how to end the day after a call finishes (or else it will go through each caller on the first day and end the game on the first day). The option is quite straightforward:
"custom_caller_last_caller_day": trueIf set to true, it will end the day afterward. Any caller defined afterward will appear on the next day.
Now an extra option that many will probably will use are consequence callers (Different from warning calls!), which basically are a special call which only happen if the player got a an answer wrong. So, if the player said it's an "Ant" even though your custom monster "Ant Queen" was the correct answer. Then you can use this option to tell the game that the current caller should only play if the answer for a previous caller (For example for the caller ID: 23) was wrong. You can provide it in the consequence caller by:
"custom_caller_consequence_caller_id": 23Which says, "this caller should only happen if I choose wrongly for caller 23".
After you have successfully defined your custom caller, you should see something like this:
Now this is a lot, and you might be wondering if it is possible to replace callers in the main campaign. The answer is yes and no. You can provide the option:
"include_in_main_campaign": truePlease be aware that this is not guaranteed to work and is still in active development, but it works most of the time for basic callers.
That covers all the basics for a custom caller. The next section will show you how to create warning and game over callers. This will be useful if you don't want the default callers.
A warning caller is a caller that happens after the accuracy drops below the warning threshold provided in the custom campaign. (It also requires a number of non-dynamic callers to happen before the warning call happens, so if you want different values, provide them in your custom campaign file).
To define a warning caller, one must only need to create a normal custom caller (without attaching a monster or entry to it, as it wouldn't fit) and add the following line:
"is_warning_caller": trueThe line is always required to define the caller as a warning caller and not a normal caller. As such, providing an order is not needed. Now, if you only provide the above, it will replace all warning callers, but if you wish to use different warning callers for different days, you can provide the following line as well:
"warning_caller_day": 2Which will make the warning caller only appear on the second (2) day. That means you can have multiple warning callers for each different day and even one warning caller for all days except the ones you provided. It will always prioritize the warning callers with a day provided over general warning callers.
That's all for warning callers.
Another option is to convert your caller to game-over callers. These trigger when the player loses the game (can happen on each day except the first day).
It uses the lines:
"is_gameover_caller": true,
"gameover_caller_day": 1Similar to warning callers, if you don't provide the day, it will apply for each day and will be overridden by other game-over callers if they provide a day.
And that is all for custom callers! The next section will shortly cover on how to add your already / or soon to be monsters to the custom campaign.
This is a small section about attaching your custom monster / entry to the custom campaign. If you haven't yet, check out how to create a custom entry!
Now after you have created your entry, all you have to do is add the following line:
"attached_custom_campaign_name" : "Name of custom campaign"With this line you attach the entry to the custom campaign. Meaning that it won't be available for the main campaign. Please note if you didn't see the caller section, is that the name of the custom campaign is the internal name and not the desktop name.
A small tip for those interested: replacing an entry / monster is also possible in custom campaigns!
You can use the replace feature to delete an entry from the campaign. (This means you remove only a single entry instead of multiple). You delete an entry with the following lines as an example:
{
"monster_name": "Bees",
"attached_custom_campaign_name" : "Custom Campaign Name",
"replace_entry": true,
"delete_entry": true
}The line "delete_entry": true in combination with the line "replace_entry": true causes the entry 'Bees' ("monster_name": "Bees") to be deleted from the custom campaign. Please note that the replace_entry flag is required if you wish to delete an entry.
And that is all. Now the entry / monster will be available in the custom campaign. And last two sections will cover on how to add custom emails and videos to the custom campaign.
Emails in the game appear on certain days or are unlocked by reaching a certain score in the campaign.
Adding custom emails is done the same way as adding a new custom caller. You create a new file and add these required lines first:
{
"email_subject": "Title of the email here",
"email_sender": "Sender of the email",
"email_body": "Text that inside the email using any rich text markup features.",
"email_custom_campaign_name": "Name of the campaign the email belongs to"
}The first three lines define the email's subject, sender, and body. These terms should be familiar if you have written an email before. To attach the email to the custom campaign, one must only add the line email_custom_campaign_name which adds the email to the custom campaign.
Right now the mail is unlocked by default with no unlock condition. To change that, you can provide the following lines:
"email_unlock_day": 2,
"email_unlock_threshold": 90With the option email_unlock_day you can specify on which day the email gets unlocked. And if you combine it with the option email_unlock_threshold, you can specify at what score from the previous day the email gets unlocked. So if you had a score of 80% and you set the threshold to 90, you will not unlock the email, and it won't show up. This is similar to how the coupons are made in the main campaign.
Now, as you know, you can have a single image at the end of the email show up. You can provide an image for the custom email with:
"email_image": "image_at_the_end_of_the_email.png"If you provided everything correctly, you should see an email like the following appear:
For those advanced, you can change emails in the main campaign (disabled by default) as well with the following line:
"email_in_main_campaign": falseAnd that covers this small section. The next and last section will show you how to add videos on the desktop.
Similar to creating a custom emails, we must create a new file to define a video for the custom campaign. You need to provide the following lines:
"video_desktop_name": "Name of the video file on the desktop",
"video_file_name": "video_name.mp4",
"custom_campaign_attached": "Name of the campaign",The first line defines the name of the file as it should appear on the desktop.
You can make it appear as if it were an actual file or name it as you wish.
The second line video_file_name defines the video file name. You might have already done the same for the custom campaign end cutscenes.
The third line should be understood already, but it defines to which campaign to be attachted to.
Similar to emails, you may only want your video to appear on a specific day. You can do so with the following line:
"video_unlock_day": 1After creating a video, it should appear on the desktop like so:
And that should cover on how to add a custom videos to the custom campaign.
Adding custom music is done the same way as the previous sections:
{
"custom_campaign_attached": "Custom Campaign Name",
"music_audio_clip_name": "MusicClip1.wav",
"unlock_day": 0
}The first 2 lines should be easy to understand. The first line provides the custom campaign to be attached to, and the second line provides the audio clip to be heard.
The third line is a bit more complicated but similarly known. It sets when the music is allowed to play. By default any music is allowed to play from the first day. If you increase the unlock days to any higher day, it will only play starting from that day, not any time before.
One cool feature that you might want is custom themes!
Custom themes are very similar to in-game themes. You can select them in the in-game settings, or you can make them be the default theme for your campaign.
Here is a simple theme for your custom campaign. These are, as are all the other features, contained in a separate JSON file:
{
"theme_custom_campaign_attached": "Quiet On Hallows Eve",
"theme_name": "Default Custom Campaign Theme",
"title_bar_color": [0.5, 1, 1],
"menu_color": [0.325, 0.62, 0.263],
"main_window_color": [0.596, 0.263, 0.62],
"third_color": [0.62, 0.263, 0.263]
}The first two lines should be easy to understand. These define in which campaign to show your theme and the name of the theme.
The three lines after the first two define the color and are the main part of the theme. To better understand each color, here is a small image describing each:
Now, you might wonder, what about third_color? I do not know. I have not found its use case. So if you find out what it does, please do write me.
Let us continue with a few more options that you might find interesting. One of these is "conditional themes". These themes override a certain theme, but only on certain days. For example, it might be appealing to use for turning every menu option red on the last day. You can do so by adding these lines:
"attached_to_theme": "Default Custom Campaign Theme",
"unlock_day": [0, 1]The first option is to state that it should only override the theme called "Default Custom Campaign Theme". This is to allow the user more freedom when choosing a theme and it not being forced upon the user. Though you may not want the user to change the theme, for that you can add the option inside your custom campaign option (not in the theme file):
"disable_theme_dropdown": trueYou can also set which theme is the default theme of your campaign with:
"defaultTheme": "Default Custom Campaign Theme"Now, if you are interested, you can also add your themes to the main campaign. Please note, this will make it only appear in the main campaign!
"theme_in_main_campaign": trueThat is all for custom themes. Let us move to modifiers.
Modifiers allow you to modify certain aspects of the game. They can be applied globally or on certain days only. Please be aware that if you have a modifier that is active on one day, it will override any global modifiers. The simplest modifier you can make is:
{
"modifier_custom_campaign_attached": "Campaign Name without any typos"
}Similar to the campaign options, you can provide most of these options in modifiers. Here are a few options. For all available options, please check the documentation.
This small section is meant for more complicated features that may not be needed. So you can skip this section and not miss anything major.
Testing can be the most exhausting point of it all, so having to sit through the starting computer screen can take up much of your time. You can actually skip the initial cutscene entirely. This option is a bit different, however and as such may be a bit more difficult to find.
If you navigate from your games folder to UserData, you should be able to see a file named MelonPreferences.cfg:
Inside this file, you should be able to find the line:
[MainModSettings]
SkipComputerScene = falseHere simply change the false to true and now you won't have to watch the initial scene every time.
And that is also everything there is for now! Let's hope you found it at least a bit useful and could learn how to create your own custom campaign.
If you want every option displayed in a cleaner matter, you can check the documentation for a list of all used and available features.
In any case, if you want a feature that isn't added yet, don't be afraid to ask! This isn't all there will be.
Anyway, have fun creating your campaigns!
- 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