<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.pmdo.pmdcollab.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=MistressNebula</id>
	<title>PMDOWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.pmdo.pmdcollab.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=MistressNebula"/>
	<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/Special:Contributions/MistressNebula"/>
	<updated>2026-07-31T12:48:27Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/Basic_setup&amp;diff=8011</id>
		<title>Mod:Nebula&#039;s Mission Board/Basic setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/Basic_setup&amp;diff=8011"/>
		<updated>2026-02-19T08:22:51Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: /* Importing the files */  Added instruction talking about mission items&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Despite it being created to be as easy to add inside mods as possible, it still takes a bit of work to get the Mission Generation Library up and running. This page will run through all the necessary steps, from file placement to function hooks and &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; calls.&lt;br /&gt;
&lt;br /&gt;
===== Importing the files =====&lt;br /&gt;
&lt;br /&gt;
# Download [https://github.com/435THz/NebulaMissionBoard/releases Nebula&#039;s Mission Board] from github and extract the zip&#039;s content wherever you like.&lt;br /&gt;
# Go to the mod&#039;s &amp;lt;code&amp;gt;Data/Script&amp;lt;/code&amp;gt; folder and copy the &amp;lt;code&amp;gt;missiongen_lib&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Paste the &amp;lt;code&amp;gt;missiongen_lib&amp;lt;/code&amp;gt; folder inside your own mod&#039;s &amp;lt;code&amp;gt;Data/Script&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
Note that the library files expect to be placed exactly inside &amp;lt;code&amp;gt;Data/Script/missiongen_lib&amp;lt;/code&amp;gt;. If you place them anywhere else, you will need to adjust all of the files&#039; &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt; calls accordingly, as well as all of the &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt; calls present in this guide.&lt;br /&gt;
Don&#039;t forget to also copy all of the strings inside the &amp;lt;code&amp;gt;strings.resx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;stringsEx.resx&amp;lt;/code&amp;gt; files over to your mod, as well as the mission items inside the &amp;lt;code&amp;gt;Data/Item&amp;lt;/code&amp;gt; folder!&lt;br /&gt;
&lt;br /&gt;
===== Initializing the library =====&lt;br /&gt;
&lt;br /&gt;
With the files imported in your mod, it&#039;s time to load it:&lt;br /&gt;
* Add &amp;lt;code&amp;gt;MissionGen = require(&amp;quot;missiongen_lib.missiongen_lib&amp;quot;)&amp;lt;/code&amp;gt; inside your mod&#039;s &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt; file. You can rename this variable however you want, but it must be a global variable.&lt;br /&gt;
* If your global variable is not named &amp;quot;MissionGen&amp;quot;, open missiongen_service.lua and change the &amp;lt;code&amp;gt;library_name&amp;lt;/code&amp;gt; string into your global variable&#039;s name. Doing this will ensure that the service will be able to find the library when it needs to interact with it.&lt;br /&gt;
* Add &amp;lt;code&amp;gt;require &#039;missiongen_lib.missiongen_service&#039;&amp;lt;/code&amp;gt; inside your mod&#039;s &amp;lt;code&amp;gt;main.lua&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
These steps will take care of most of the initialization process all by themselves. All of the library files will be loaded, and the &amp;lt;code&amp;gt;SV&amp;lt;/code&amp;gt; structure will be automatically have the library&#039;s save data added to it. This, however, does nothing in terms of gameplay, and more steps are needed for the library to actually function.&lt;br /&gt;
&lt;br /&gt;
===== Hooking up functions =====&lt;br /&gt;
This is the lengthiest part of the guide. There are a lot of functions that need to be set up in order for the library to work correctly, as highlighted by the many files inside Nebula&#039;s Mission Board mod. Luckily, they&#039;re pretty easy to port: All you need to do is copy-paste all functions in their respective files in your mod. For example, all functions inside Nebula&#039;s Mission Board&#039;s &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt; will need to go inside &#039;&#039;your mod&#039;s&#039;&#039; &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt;. Remember to also change any reference to the &amp;lt;code&amp;gt;nebula_mission_board&amp;lt;/code&amp;gt; namespace into a reference to your mod&#039;s namespace.&lt;br /&gt;
These are the files containing code that needs to be copied over:&lt;br /&gt;
* &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;common_vars.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event.lua&amp;lt;/code&amp;gt; (the &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; statements)&lt;br /&gt;
* &amp;lt;code&amp;gt;event.battle.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event_mapgen.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event.single.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You now need to hook up the dungeon generation code to the game. Open your mod in [[Dev Mode]], go to the Constants tab and open the Universal menu. Here, in Zone Steps, add a new Script Zone Step. Set its Script parameter to &amp;lt;code&amp;gt;GenerateJobInFloor&amp;lt;/code&amp;gt;.&lt;br /&gt;
Now save your changes, and that&#039;s it! This function will be responsible for dynamically adding the necessary steps and events whenever a destination floor is reached.&lt;br /&gt;
&lt;br /&gt;
Everything we did up until now takes care of everything when it comes to generating and handling jobs inside dungeons, but there is still nothing that allows players to take new jobs, or to hand in completed ones. Not to worry: all you need to do is to add a call to &amp;lt;code&amp;gt;MissionGen:BoardInteract(board_id)&amp;lt;/code&amp;gt;, and your players will be able to access your job board of choice and take its contents. &amp;lt;code&amp;gt;board_id&amp;lt;/code&amp;gt;s will be discussed in the page about [[Mod:Nebula&#039;s Mission Board/ Editing settings|Settings]].&lt;br /&gt;
As for how handing in missions works, you will need to write a cutscene for it. Nebula&#039;s Mission Board mod already has one inside &amp;lt;code&amp;gt;Data/Script/nebula_mission_board/ground/base_camp_2&amp;lt;/code&amp;gt; if you want to copy it, but here&#039;s a basic rundown of how the job completion cutscene is handled:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;If any mission has been completed in the last dungeon run, the library will send the player to the location set inside the &amp;lt;code&amp;gt;end_dungeon_day_destination&amp;lt;/code&amp;gt; setting. This location will need to call the &amp;lt;code&amp;gt;MissionGen:PlayJobsCompletedCutscene(callback)&amp;lt;/code&amp;gt; function. If you have multiple maps with job boards, this function will also handle switching between maps as needed. You will have to provide the callback. (see step 3 for more details)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;code&amp;gt;PlayJobsCompletedCutscene&amp;lt;/code&amp;gt; will generate a list of characters, that will be passed to the callback along with the job struct itself.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;the callback is ran. This is a modder-defined function with the following arguments:&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;a job table&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;a list of &amp;lt;code&amp;gt;GroundChar&amp;lt;/code&amp;gt;s. The first one is always the client, while the second, if present, is always the target. Third and fourth are only generated for law enforcement jobs, and represent the background officers that would normally keep the outlaw restrained during the cutscene.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
The callback is supposed to handle the cutscene itself, moving the characters where they need to be and displaying dialogue. It also needs to call &amp;lt;code&amp;gt;MissionGen:RewardPlayer(job, speaker, line1, line2)&amp;lt;/code&amp;gt;, otherwise the player will not actually receive any rewards for the job they completed.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Once the cutscene is finished, control goes back to &amp;lt;code&amp;gt;PlayJobsCompletedCutscene&amp;lt;/code&amp;gt;, which will get rid of the current job and keep scanning for other completed ones  until the end of the list, repeating steps 2 and 3 for each of them.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Finally, the function stored in the &amp;lt;&amp;gt;after_rewards_function&amp;lt;&amp;gt; settings is called, the boards are refreshed, and control is returned to the player.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That said, what you need to do is:&lt;br /&gt;
* call &amp;lt;code&amp;gt;MissionGen:PlayJobsCompletedCutscene(callback)&amp;lt;/code&amp;gt; in any and all maps that have a board assigned to it.&lt;br /&gt;
* write the callback for the function above; it needs to use the current job&#039;s data and the given list of characters to actually implement the cutscene itself, and call &amp;lt;code&amp;gt;MissionGen:RewardPlayer(job, speaker, line1, line2)&amp;lt;/code&amp;gt; so that players will receive their reward.&lt;br /&gt;
When that is done, the library will finally be fully set up and ready to use, though you will still need to edit its Settings to make sure that it generates jobs for your mod&#039;s dungeons.&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/Basic_setup&amp;diff=8001</id>
		<title>Mod:Nebula&#039;s Mission Board/Basic setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/Basic_setup&amp;diff=8001"/>
		<updated>2026-02-18T19:07:55Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: Add namespace change instruction&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Despite it being created to be as easy to add inside mods as possible, it still takes a bit of work to get the Mission Generation Library up and running. This page will run through all the necessary steps, from file placement to function hooks and &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; calls.&lt;br /&gt;
&lt;br /&gt;
===== Importing the files =====&lt;br /&gt;
&lt;br /&gt;
# Download [https://github.com/435THz/NebulaMissionBoard/releases Nebula&#039;s Mission Board] from github and extract the zip&#039;s content wherever you like.&lt;br /&gt;
# Go to the mod&#039;s &amp;lt;code&amp;gt;Data/Script&amp;lt;/code&amp;gt; folder and copy the &amp;lt;code&amp;gt;missiongen_lib&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Paste the &amp;lt;code&amp;gt;missiongen_lib&amp;lt;/code&amp;gt; folder inside your own mod&#039;s &amp;lt;code&amp;gt;Data/Script&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
Note that the library files expect to be placed exactly inside &amp;lt;code&amp;gt;Data/Script/missiongen_lib&amp;lt;/code&amp;gt;. If you place them anywhere else, you will need to adjust all of the files&#039; &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt; calls accordingly, as well as all of the &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt; calls present in this guide.&lt;br /&gt;
Don&#039;t forget to also copy all of the strings inside the &amp;lt;code&amp;gt;strings.resx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;stringsEx.resx&amp;lt;/code&amp;gt; files over to your mod!&lt;br /&gt;
&lt;br /&gt;
===== Initializing the library =====&lt;br /&gt;
&lt;br /&gt;
With the files imported in your mod, it&#039;s time to load it:&lt;br /&gt;
* Add &amp;lt;code&amp;gt;MissionGen = require(&amp;quot;missiongen_lib.missiongen_lib&amp;quot;)&amp;lt;/code&amp;gt; inside your mod&#039;s &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt; file. You can rename this variable however you want, but it must be a global variable.&lt;br /&gt;
* If your global variable is not named &amp;quot;MissionGen&amp;quot;, open missiongen_service.lua and change the &amp;lt;code&amp;gt;library_name&amp;lt;/code&amp;gt; string into your global variable&#039;s name. Doing this will ensure that the service will be able to find the library when it needs to interact with it.&lt;br /&gt;
* Add &amp;lt;code&amp;gt;require &#039;missiongen_lib.missiongen_service&#039;&amp;lt;/code&amp;gt; inside your mod&#039;s &amp;lt;code&amp;gt;main.lua&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
These steps will take care of most of the initialization process all by themselves. All of the library files will be loaded, and the &amp;lt;code&amp;gt;SV&amp;lt;/code&amp;gt; structure will be automatically have the library&#039;s save data added to it. This, however, does nothing in terms of gameplay, and more steps are needed for the library to actually function.&lt;br /&gt;
&lt;br /&gt;
===== Hooking up functions =====&lt;br /&gt;
This is the lengthiest part of the guide. There are a lot of functions that need to be set up in order for the library to work correctly, as highlighted by the many files inside Nebula&#039;s Mission Board mod. Luckily, they&#039;re pretty easy to port: All you need to do is copy-paste all functions in their respective files in your mod. For example, all functions inside Nebula&#039;s Mission Board&#039;s &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt; will need to go inside &#039;&#039;your mod&#039;s&#039;&#039; &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt;. Remember to also change any reference to the &amp;lt;code&amp;gt;nebula_mission_board&amp;lt;/code&amp;gt; namespace into a reference to your mod&#039;s namespace.&lt;br /&gt;
These are the files containing code that needs to be copied over:&lt;br /&gt;
* &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;common_vars.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event.lua&amp;lt;/code&amp;gt; (the &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; statements)&lt;br /&gt;
* &amp;lt;code&amp;gt;event.battle.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event_mapgen.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event.single.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You now need to hook up the dungeon generation code to the game. Open your mod in [[Dev Mode]], go to the Constants tab and open the Universal menu. Here, in Zone Steps, add a new Script Zone Step. Set its Script parameter to &amp;lt;code&amp;gt;GenerateJobInFloor&amp;lt;/code&amp;gt;.&lt;br /&gt;
Now save your changes, and that&#039;s it! This function will be responsible for dynamically adding the necessary steps and events whenever a destination floor is reached.&lt;br /&gt;
&lt;br /&gt;
Everything we did up until now takes care of everything when it comes to generating and handling jobs inside dungeons, but there is still nothing that allows players to take new jobs, or to hand in completed ones. Not to worry: all you need to do is to add a call to &amp;lt;code&amp;gt;MissionGen:BoardInteract(board_id)&amp;lt;/code&amp;gt;, and your players will be able to access your job board of choice and take its contents. &amp;lt;code&amp;gt;board_id&amp;lt;/code&amp;gt;s will be discussed in the page about [[Mod:Nebula&#039;s Mission Board/ Editing settings|Settings]].&lt;br /&gt;
As for how handing in missions works, you will need to write a cutscene for it. Nebula&#039;s Mission Board mod already has one inside &amp;lt;code&amp;gt;Data/Script/nebula_mission_board/ground/base_camp_2&amp;lt;/code&amp;gt; if you want to copy it, but here&#039;s a basic rundown of how the job completion cutscene is handled:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;If any mission has been completed in the last dungeon run, the library will send the player to the location set inside the &amp;lt;code&amp;gt;end_dungeon_day_destination&amp;lt;/code&amp;gt; setting. This location will need to call the &amp;lt;code&amp;gt;MissionGen:PlayJobsCompletedCutscene(callback)&amp;lt;/code&amp;gt; function. If you have multiple maps with job boards, this function will also handle switching between maps as needed. You will have to provide the callback. (see step 3 for more details)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;code&amp;gt;PlayJobsCompletedCutscene&amp;lt;/code&amp;gt; will generate a list of characters, that will be passed to the callback along with the job struct itself.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;the callback is ran. This is a modder-defined function with the following arguments:&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;a job table&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;a list of &amp;lt;code&amp;gt;GroundChar&amp;lt;/code&amp;gt;s. The first one is always the client, while the second, if present, is always the target. Third and fourth are only generated for law enforcement jobs, and represent the background officers that would normally keep the outlaw restrained during the cutscene.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
The callback is supposed to handle the cutscene itself, moving the characters where they need to be and displaying dialogue. It also needs to call &amp;lt;code&amp;gt;MissionGen:RewardPlayer(job, speaker, line1, line2)&amp;lt;/code&amp;gt;, otherwise the player will not actually receive any rewards for the job they completed.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Once the cutscene is finished, control goes back to &amp;lt;code&amp;gt;PlayJobsCompletedCutscene&amp;lt;/code&amp;gt;, which will get rid of the current job and keep scanning for other completed ones  until the end of the list, repeating steps 2 and 3 for each of them.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Finally, the function stored in the &amp;lt;&amp;gt;after_rewards_function&amp;lt;&amp;gt; settings is called, the boards are refreshed, and control is returned to the player.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That said, what you need to do is:&lt;br /&gt;
* call &amp;lt;code&amp;gt;MissionGen:PlayJobsCompletedCutscene(callback)&amp;lt;/code&amp;gt; in any and all maps that have a board assigned to it.&lt;br /&gt;
* write the callback for the function above; it needs to use the current job&#039;s data and the given list of characters to actually implement the cutscene itself, and call &amp;lt;code&amp;gt;MissionGen:RewardPlayer(job, speaker, line1, line2)&amp;lt;/code&amp;gt; so that players will receive their reward.&lt;br /&gt;
When that is done, the library will finally be fully set up and ready to use, though you will still need to edit its Settings to make sure that it generates jobs for your mod&#039;s dungeons.&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Editing_settings&amp;diff=5360</id>
		<title>Mod:Nebula&#039;s Mission Board/ Editing settings</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Editing_settings&amp;diff=5360"/>
		<updated>2026-01-03T15:27:41Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: Update documentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Mission Generation Library is designed to be highly customizable. This choice is reflected in its &amp;lt;code&amp;gt;missiongen_settings.lua&amp;lt;/code&amp;gt; file. This file is what modders are supposed to edit, changing the values inside the giant table it defines.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a list of all settings in the library, with documentation:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sv_root_name ==&lt;br /&gt;
&lt;br /&gt;
Name of the SV table that will contain all stored data. Use a table to specify a deeper path. If not present in the SV structure, the defined path will be generated automatically. An empty list would just use SV as root.&amp;lt;/br&amp;gt;&lt;br /&gt;
Examples:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;jobs&amp;quot;&amp;lt;/code&amp;gt; would use &amp;lt;code&amp;gt;SV.jobs&amp;lt;/code&amp;gt; as its root.&lt;br /&gt;
* &amp;lt;code&amp;gt;{&amp;quot;adventure&amp;quot;, &amp;quot;jobs&amp;quot;}&amp;lt;/code&amp;gt; would use &amp;lt;code&amp;gt;SV.adventure.jobs&amp;lt;/code&amp;gt; as its root.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;jobs&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== boards ==&lt;br /&gt;
&lt;br /&gt;
A list of board ids and the data necessary to define their behavior.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format for each board:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;board_id&amp;gt;: {&lt;br /&gt;
  display_key: string,&lt;br /&gt;
  size: integer,&lt;br /&gt;
  location: {&lt;br /&gt;
    zone: string,&lt;br /&gt;
    map: integer&lt;br /&gt;
  },&lt;br /&gt;
  condition: function(library),&lt;br /&gt;
  dungeons: string[],&lt;br /&gt;
  job_types: {id = string, weight = integer}[]&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &amp;lt;board_id&amp;gt;: The id of the board. It will be used to identify and reference this specific board inside scripts&lt;br /&gt;
* display_key: the string key used when displaying the job menu for this board.  The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
* size: the amount of quests this board can hold at a time&lt;br /&gt;
* location: a zone id and a map index. This data is where the player will be brought for the job completion cutscene. All of these maps must call library:PlayJobsCompletedCutscene before fade-in for the reward sequence to work correctly.&lt;br /&gt;
* condition: Optional. A function called to determine if library:PopulateBoards() should fill out this board. It receives the library object as an argument and returns a boolean. If it returns true, the board is filled out. If it returns false, it is left empty. If this property is missing, this board will always be active.&lt;br /&gt;
* dungeons: Optional. A list of zone ids to generate dungeons for. This board will never generate jobs for dungeons that do not appear in this list. If this property is missing, this board can generate jobs for any registered dungeon.&lt;br /&gt;
* job_types: a list of job types and their probability weight. Higher weight means more common.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  quest_board = {&lt;br /&gt;
    display_key = &amp;quot;BOARD_QUEST_TITLE&amp;quot;,&lt;br /&gt;
    size = 8,&lt;br /&gt;
    location = {zone = &amp;quot;guildmaster_island&amp;quot;, map = 2},&lt;br /&gt;
    condition = function (library)&lt;br /&gt;
      local root = library.root&lt;br /&gt;
      local completed = 0&lt;br /&gt;
      for _, segments in pairs(root.dungeon_progress) do&lt;br /&gt;
        for _, state in pairs(segments) do&lt;br /&gt;
          if state then&lt;br /&gt;
            completed = completed + 1&lt;br /&gt;
            if completed&amp;gt;=3 then return true end&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      return false&lt;br /&gt;
    end,&lt;br /&gt;
    job_types = {&lt;br /&gt;
      {id = &amp;quot;RESCUE_SELF&amp;quot;, weight = 5},&lt;br /&gt;
      {id = &amp;quot;RESCUE_FRIEND&amp;quot;, weight = 5},&lt;br /&gt;
      {id = &amp;quot;ESCORT&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;EXPLORATION&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;DELIVERY&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;LOST_ITEM&amp;quot;, weight = 4},&lt;br /&gt;
      {id = &amp;quot;OUTLAW&amp;quot;, weight =  5},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_ITEM&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_ITEM_UNK&amp;quot;, weight = 1},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_MONSTER_HOUSE&amp;quot;, weight = 1},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_FLEE&amp;quot;, weight = 1}&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== end_dungeon_day_destination ==&lt;br /&gt;
&lt;br /&gt;
Zone and map id of the ground map where players will be sent to when a day ends and there is at least one mission to hand in. This map must contain a call to library:PlayJobsCompletedCutscene&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{zone: string, map: integer}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ zone = &amp;quot;guildmaster_island&amp;quot;, map = 2 },&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== after_rewards_function ==&lt;br /&gt;
&lt;br /&gt;
Function ran after the game is done with the job completion cutscene. It takes no arguments, and is not expected to return anything.&lt;br /&gt;
You can use it to fix up the game state however you like before returning control to the player.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
after_rewards_function = function()&lt;br /&gt;
  GAME:MoveCamera(0, 0, 1, true)&lt;br /&gt;
  SOUND:PlayBGM(SV.base_town.Song, true)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== taken_limit ==&lt;br /&gt;
&lt;br /&gt;
The maximum number of jobs that can be taken from job boards at a time.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;8&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== taken_jobs_start_active ==&lt;br /&gt;
&lt;br /&gt;
If true, taken jobs will be activated automatically. Players can always deactivate them manually if they so choose.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;true&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== max_guests ==&lt;br /&gt;
&lt;br /&gt;
The maximum amount of guest-based jobs that can be generated in the same dungeon.&amp;lt;/br&amp;gt;&lt;br /&gt;
Guest-based jobs are: ESCORT, EXPLORATION&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== guests_take_up_space ==&lt;br /&gt;
&lt;br /&gt;
The maximum amount of guest-based jobs that can be generated in the same dungeon.&amp;lt;/br&amp;gt;&lt;br /&gt;
Guest-based jobs are: ESCORT, EXPLORATION&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== min_party_limit ==&lt;br /&gt;
&lt;br /&gt;
Minimum number for the party limit when it is reduced because of guests.&lt;br /&gt;
This value cannot be lower than 1, for obvious reasons.&lt;br /&gt;
Any excess guests will simply add to the party count, without reducing the limit.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== losing_guests_means_defeat ==&lt;br /&gt;
&lt;br /&gt;
If true, losing any guest will count as a loss for the entire exploration.&lt;br /&gt;
If false, it will simply mark that specific job as failed.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_boss_steps_piority ==&lt;br /&gt;
&lt;br /&gt;
The priority of the SpawnOutlaw handler event. It can be either an integer or a list of integers.&lt;br /&gt;
This value should always be lower than dungeon_gen_steps_piority.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;-11&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_gen_steps_piority ==&lt;br /&gt;
&lt;br /&gt;
The priority that most of the job handlers will have when being added to the event list. It can be either an integer or a list of integers.&lt;br /&gt;
This value should always be equal to or higher than the priority set for the event that calls library:GenerateJobInFloor.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;-6&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_npc_steps_piority ==&lt;br /&gt;
&lt;br /&gt;
The priority that job npc spawners will have when being added to the event list. It can be either an integer or a list of integers.&lt;br /&gt;
This value should always be equal to or higher than dungeon_gen_steps_piority.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ 5, 2, 1 }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== difficulty_list ==&lt;br /&gt;
&lt;br /&gt;
A list of all difficulty rank id strings you want to use.&lt;br /&gt;
The order of these strings will define the difficulty scale used by the library.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ &amp;quot;F&amp;quot;, &amp;quot;E&amp;quot;, &amp;quot;D&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;A&amp;quot;, &amp;quot;S&amp;quot;, &amp;quot;STAR_1&amp;quot;, &amp;quot;STAR_2&amp;quot;, &amp;quot;STAR_3&amp;quot;, &amp;quot;STAR_4&amp;quot;, &amp;quot;STAR_5&amp;quot;, &amp;quot;STAR_6&amp;quot;, &amp;quot;STAR_7&amp;quot;, &amp;quot;STAR_8&amp;quot;, &amp;quot;STAR_9&amp;quot; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== difficulty_data ==&lt;br /&gt;
&lt;br /&gt;
All the data required to define difficulty rank behavior. There must be an entry for every rank defined in difficulty_list:&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;diff_id&amp;gt;: {display_key: string, money_reward: integer, extra_reward: integer, outlaw_level: integer, escort_level: integer}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;diff_id&amp;gt;: one of the difficulties defined in &amp;quot;difficulty_list&amp;quot;&lt;br /&gt;
* display_key: string key used when displaying the name of the rank.  The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
* money_reward: the amount of money awarded at the end of the job. If set to 0, money rewards will simply not award anything&lt;br /&gt;
* extra_reward: the points of extra reward awarded at the end of the job. What these points are depends on extra_reward_type. If set to 0, extra_reward_type will be considered to be &amp;quot;none&amp;quot;&lt;br /&gt;
* outlaw_level: Optional. The base level of all outlaws spawned by jobs with this difficulty. If omitted, it will be equal to the dungeon&#039;s expected level.&lt;br /&gt;
* escort_level: Optional. The level of all guests spawned by jobs with this difficulty. If omitted, it will be equal to the dungeon&#039;s expected level.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  F = {display_key = &amp;quot;RANK_STRING_F&amp;quot;, money_reward = 100, extra_reward = 0},&lt;br /&gt;
  E = {display_key = &amp;quot;RANK_STRING_E&amp;quot;, money_reward = 200, extra_reward = 100},&lt;br /&gt;
  D = {display_key = &amp;quot;RANK_STRING_D&amp;quot;, money_reward = 400, extra_reward = 200},&lt;br /&gt;
  C = {display_key = &amp;quot;RANK_STRING_C&amp;quot;, money_reward = 600, extra_reward = 400},&lt;br /&gt;
  B = {display_key = &amp;quot;RANK_STRING_B&amp;quot;, money_reward = 700, extra_reward = 1250},&lt;br /&gt;
  A = {display_key = &amp;quot;RANK_STRING_A&amp;quot;, money_reward = 1500, extra_reward = 2500},&lt;br /&gt;
  S = {display_key = &amp;quot;RANK_STRING_S&amp;quot;, money_reward = 3000, extra_reward = 5000},&lt;br /&gt;
  STAR_1 = {display_key = &amp;quot;RANK_STRING_STAR_1&amp;quot;, money_reward = 6000, extra_reward = 10000},&lt;br /&gt;
  STAR_2 = {display_key = &amp;quot;RANK_STRING_STAR_2&amp;quot;, money_reward = 10000, extra_reward = 20000},&lt;br /&gt;
  STAR_3 = {display_key = &amp;quot;RANK_STRING_STAR_3&amp;quot;, money_reward = 15000, extra_reward = 30000},&lt;br /&gt;
  STAR_4 = {display_key = &amp;quot;RANK_STRING_STAR_4&amp;quot;, money_reward = 20000, extra_reward = 40000},&lt;br /&gt;
  STAR_5 = {display_key = &amp;quot;RANK_STRING_STAR_5&amp;quot;, money_reward = 25000, extra_reward = 50000},&lt;br /&gt;
  STAR_6 = {display_key = &amp;quot;RANK_STRING_STAR_6&amp;quot;, money_reward = 30000, extra_reward = 60000},&lt;br /&gt;
  STAR_7 = {display_key = &amp;quot;RANK_STRING_STAR_7&amp;quot;, money_reward = 35000, extra_reward = 70000},&lt;br /&gt;
  STAR_8 = {display_key = &amp;quot;RANK_STRING_STAR_8&amp;quot;, money_reward = 40000, extra_reward = 80000},&lt;br /&gt;
  STAR_9 = {display_key = &amp;quot;RANK_STRING_STAR_9&amp;quot;, money_reward = 45000, extra_reward = 90000}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== guest_level_scaling ==&lt;br /&gt;
&lt;br /&gt;
Function that changes the level of guests based on the player&#039;s level. It must return the new level for the guest, or it will have no effect.&amp;lt;/br&amp;gt;&lt;br /&gt;
Arguments:&lt;br /&gt;
* lvl: base level of the guest.&lt;br /&gt;
* dungeon: if true, the level is the dungeon&#039;s recommended level. If false, it&#039;s taken from the difficulty data.&lt;br /&gt;
* avg_team_lvl: average level of the player team. It may or may not be an integer.&lt;br /&gt;
* hst_team_lvl: highest level in the player team.&lt;br /&gt;
* settings: the settings data structure itself&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(lvl, dungeon, avg_team_lvl, hst_team_lvl, settings)&lt;br /&gt;
  local add = 0&lt;br /&gt;
  if dungeon then lvl = lvl*4//5 end&lt;br /&gt;
  if avg_team_lvl &amp;gt; lvl then add = (avg_team_lvl - lvl) // 10 end&lt;br /&gt;
  return lvl + add&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== outlaw_level_scaling ==&lt;br /&gt;
&lt;br /&gt;
Function that changes the level of guests based on the player&#039;s level. It must return the new level for the guest, or it will have no effect.&amp;lt;/br&amp;gt;&lt;br /&gt;
Arguments:&lt;br /&gt;
* lvl: base level of the guest.&lt;br /&gt;
* dungeon: if true, the level is the dungeon&#039;s recommended level. If false, it&#039;s taken from the difficulty data.&lt;br /&gt;
* avg_team_lvl: average level of the player team. It may or may not be an integer.&lt;br /&gt;
* hst_team_lvl: highest level in the player team.&lt;br /&gt;
* settings: the settings data structure itself&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(lvl, dungeon, avg_team_lvl, hst_team_lvl, settings)&lt;br /&gt;
  local add = 0&lt;br /&gt;
  if dungeon then lvl = lvl*23//20 end&lt;br /&gt;
  if avg_team_lvl &amp;gt; lvl then add = (avg_team_lvl - lvl) // 8 end&lt;br /&gt;
  add = add + (hst_team_lvl - avg_team_lvl) // 4&lt;br /&gt;
  return lvl + add&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== apply_outlaw_changes ==&lt;br /&gt;
&lt;br /&gt;
Function that allows you to edit an outlaw&#039;s data just before they are spawned.&lt;br /&gt;
You can change just about anything except its position and recruitability state. Its HP will also&lt;br /&gt;
always be automatically set to full after this function is called.&lt;br /&gt;
You will also be unable to change the EquippedItem of an &amp;quot;OUTLAW_ITEM&amp;quot; or &amp;quot;OUTLAW_ITEM_UNK&amp;quot; outlaw.&amp;lt;/br&amp;gt;&lt;br /&gt;
Arguments:&lt;br /&gt;
* outlaw: the outlaw Character itself&lt;br /&gt;
* job: the current job data table&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(outlaw, job)&lt;br /&gt;
  local max_boost = PMDC.Data.MonsterFormData.MAX_STAT_BOOST&lt;br /&gt;
  outlaw.MaxHPBonus = math.min(outlaw.Level * max_boost // 64, max_boost);&lt;br /&gt;
  if job.Type == &amp;quot;OUTLAW_FLEE&amp;quot; then&lt;br /&gt;
    local speedMin = math.floor(outlaw.Level * 4 // 3)&lt;br /&gt;
    local speedMax = math.floor(outlaw.Level * 6 // 2)&lt;br /&gt;
    outlaw.SpeedBonus = math.min(_DATA.Save.Rand:Next(speedMin, speedMax), 100)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== fleeing_outlaw_restrictions ==&lt;br /&gt;
&lt;br /&gt;
A list of ids for types that are banned from ever being picked as fleeing outlaws.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ &amp;quot;ghost&amp;quot; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== outlaw_music_name ==&lt;br /&gt;
&lt;br /&gt;
The name of the outlaw music file. This file will be sourced from the Content/Music folder.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;Outlaw.ogg&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeons ==&lt;br /&gt;
&lt;br /&gt;
This is where dungeon difficulty is set. Quests can only generate for dungeons inside this list.&lt;br /&gt;
Given the complexity of this structure, it is best generated using the [[Mod:Nebula&#039;s Mission Board/ Editing settings#settings.AddDungeonSection(zone, segment, start, difficulty, finish, must_end)||AddDungeonSection]] function at the bottom of this page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_order ==&lt;br /&gt;
&lt;br /&gt;
Jobs are sorted by dungeon, following the order defined in this table. Missing dungeons are shoved at the bottom and sorted alphabetically.&lt;br /&gt;
This list is automatically populated in call order when using the &amp;quot;AddDungeonSection&amp;quot; function near the bottom of this file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== external_events ==&lt;br /&gt;
&lt;br /&gt;
A list of events unrelated to this library that can cause job generation to ignore a specific dungeon.&lt;br /&gt;
They can also be displayed in the objectives log if you so choose.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{condition: function(zone), message_key: string, message_args: function(zone), icon: string}&amp;lt;/code&amp;gt;&lt;br /&gt;
* condition: a function that takes a zone and returns a boolean. If it returns true, jobs will not be generated for this dungeon, and all already taken jobs will be automatically suspended.&lt;br /&gt;
* message_key: Optional. It will be used in the objectives log instead of the default message if the condition is true.&lt;br /&gt;
* message_args: Optional. If the message&#039;s localization string contains placeholders, this function is in charge of taking a zone and returning a list of values that will be used for those placeholders in the form of a table array (Up to 5).&lt;br /&gt;
* icon: Optional. The icon that will be displayed beside the corresponding dungeon in the dungeon selection menu if the condition is true for any of its segments. Defaults to &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  {condition = function(zone) return COMMON.HasSidequestInZone(zone) end, icon = &amp;quot;\\uE111&amp;quot;, message_key = &amp;quot;MENU_JOB_OBJECTIVE_DEFAULT&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== external_events_icon_mode ==&lt;br /&gt;
&lt;br /&gt;
How to display external event icons in the dungeon list. This value can only be either &amp;quot;FIRST&amp;quot; or ALL&amp;quot;.&lt;br /&gt;
* If set to &amp;quot;ALL&amp;quot;, they will always be displayed in the order defined by external_events. Only one copy of the same icon will be shown, no matter how many conditions require it.&lt;br /&gt;
* If set to &amp;quot;FIRST&amp;quot;, only the first event in the list&#039;s order will be displayed, no matter how many events are actually there. This setting does not prevent multiple messages from appearing in the objectives list.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;FIRST&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_list_pattern ==&lt;br /&gt;
&lt;br /&gt;
The pattern that will define how to display entries in the dungeon list.&amp;lt;/br&amp;gt;&lt;br /&gt;
{0} is the placeholder for the dungeon name, {1} for pending job icon and {2} for external condition icons.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;FIRST&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== job_types ==&lt;br /&gt;
&lt;br /&gt;
Table used to determine various properties regarding job types.&lt;br /&gt;
Remove a job type entirely to disable its generation altogether.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: {rank_modifier: integer, min_rank: string}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: one of RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
* rank_modifier (optional): these jobs will always have this modifier applied to their rank.&lt;br /&gt;
* min_rank (optional): this type of jobs can never be of a rank lower than this.&lt;br /&gt;
: This influences possible dungeon spawn: a rank_modifier 1 job with min_rank &amp;quot;C&amp;quot; can also spawn in &amp;quot;D&amp;quot; rank dungeons.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  RESCUE_SELF = {rank_modifier = 0, min_rank = &amp;quot;F&amp;quot;},&lt;br /&gt;
  RESCUE_FRIEND = {rank_modifier = 0, min_rank = &amp;quot;E&amp;quot;},&lt;br /&gt;
  ESCORT = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  EXPLORATION = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  DELIVERY = {rank_modifier = 0, min_rank = &amp;quot;D&amp;quot;},&lt;br /&gt;
  LOST_ITEM = {rank_modifier = 0, min_rank = &amp;quot;D&amp;quot;},&lt;br /&gt;
  OUTLAW = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  OUTLAW_ITEM = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  OUTLAW_ITEM_UNK = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  OUTLAW_MONSTER_HOUSE = {rank_modifier = 2, min_rank = &amp;quot;S&amp;quot;},&lt;br /&gt;
  OUTLAW_FLEE = {rank_modifier = 1, min_rank = &amp;quot;B&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_job_modifiers ==&lt;br /&gt;
&lt;br /&gt;
Special table that allows modders to specify chance multipliers for job types depending on the dungeon.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;dungeon_id&amp;gt;: {&amp;lt;job_type_id&amp;gt;: &amp;lt;multiplier&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;dungeon_id&amp;gt;: the string id of a dungeon&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: one of RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
* &amp;lt;multiplier&amp;gt;: a multiplier number. It doesn&#039;t need to be an integer. It will be multiplied with the board&#039;s base chances, rounding up, when choosing the type of a job. Set it to 0 or less to disable the job type altogether.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  ambush_forest = {&lt;br /&gt;
    OUTLAW = 3,&lt;br /&gt;
    OUTLAW_ITEM = 3,&lt;br /&gt;
    OUTLAW_ITEM_UNK = 3,&lt;br /&gt;
    OUTLAW_MONSTER_HOUSE = 3,&lt;br /&gt;
    OUTLAW_FLEE = 3&lt;br /&gt;
  },&lt;br /&gt;
  treacherous_mountain = {&lt;br /&gt;
    OUTLAW = 3,&lt;br /&gt;
    OUTLAW_ITEM = 3,&lt;br /&gt;
    OUTLAW_ITEM_UNK = 3,&lt;br /&gt;
    OUTLAW_MONSTER_HOUSE = 3,&lt;br /&gt;
    OUTLAW_FLEE = 3&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== special_chance ==&lt;br /&gt;
&lt;br /&gt;
Chance of special missions to be generated. Special missions are just handcrafted scenarios with specific client and target pairs and custom flavor texts. Set to 0 to disable altogether.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;0.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== special_jobs ==&lt;br /&gt;
&lt;br /&gt;
This is where you can define special cases for specific types of jobs.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;special_id&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: one of RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
* &amp;lt;special_id&amp;gt;: any id of your choosing except RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  RESCUE_FRIEND = {&amp;quot;CHILD&amp;quot;, &amp;quot;LOVER&amp;quot;, &amp;quot;RIVAL&amp;quot;, &amp;quot;FRIEND&amp;quot;}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== hidden_floor_chance ==&lt;br /&gt;
&lt;br /&gt;
Chance for supported quest types to have their destination floor hidden. Set to 0 to disable altogether.&amp;lt;/br&amp;gt;&lt;br /&gt;
Players will still be notified when reaching the floor. It just won&#039;t show in the quest description.&amp;lt;/br&amp;gt;&lt;br /&gt;
Job types that can have their floor hidden are: RESCUE_FRIEND, EXPLORATION, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_FLEE.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;0.15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== reward_types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A list of all types of rewards to be offered to players.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{id: string, weight: integer, min_rank: string}&amp;lt;/code&amp;gt;&lt;br /&gt;
* id: one of the supported reward types. You can use duplicate values to alter odds depending on job rank.&lt;br /&gt;
: Supported reward types are: item, money, item_item, money_item, client, exclusive&lt;br /&gt;
* weight: Chance of appearing. Set to 0 or delete altogether to stop a type of reward from being offered.&lt;br /&gt;
* min_rank: optional. If set, this type of reward will only be offered if the job is this rank or higher.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  {id = &amp;quot;item&amp;quot;, weight = 6},&lt;br /&gt;
  {id = &amp;quot;money&amp;quot;, weight = 2},&lt;br /&gt;
  {id = &amp;quot;item_item&amp;quot;, weight = 3},&lt;br /&gt;
  {id = &amp;quot;money_item&amp;quot;, weight = 1},&lt;br /&gt;
  {id = &amp;quot;client&amp;quot;, weight = 1, min_rank = &amp;quot;STAR_1&amp;quot;},&lt;br /&gt;
  {id = &amp;quot;exclusive&amp;quot;, weight = 1, min_rank = &amp;quot;STAR_4&amp;quot;}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== extra_reward_type ==&lt;br /&gt;
&lt;br /&gt;
The type of extra reward for all quests. It can be &amp;quot;none&amp;quot;, &amp;quot;rank&amp;quot; or &amp;quot;exp&amp;quot;. Any other value will result in &amp;quot;none&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;exp&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== rewards_per_difficulty ==&lt;br /&gt;
&lt;br /&gt;
This table assigns different weights to reward pools depending on the difficulty rank of the mission.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;diff_id&amp;gt;: {id: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;diff_id&amp;gt;: one of the difficulties defined in difficulty_list&amp;quot;&lt;br /&gt;
* id: the id of one of the reward pools defined in &amp;quot;reward_pools&amp;quot;&lt;br /&gt;
* weight: Chance of appearing. Set to 0 or delete altogether to stop a reward pool from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  F = {&lt;br /&gt;
    {id = &amp;quot;NECESSITIES&amp;quot;, weight = 10}&lt;br /&gt;
  },&lt;br /&gt;
  E = {&lt;br /&gt;
    {id = &amp;quot;NECESSITIES&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;APRICORN_GENERIC&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;FOOD_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;SEED_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;HELD_LOW&amp;quot;, weight = 3},&lt;br /&gt;
    {id = &amp;quot;LOOT_LOW&amp;quot;, weight = 3},&lt;br /&gt;
    {id = &amp;quot;EVO_ITEMS&amp;quot;, weight = 1},&lt;br /&gt;
    {id = &amp;quot;WANDS_LOW&amp;quot;, weight = 10}&lt;br /&gt;
  },&lt;br /&gt;
  D = {&lt;br /&gt;
    {id = &amp;quot;NECESSITIES&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;AMMO_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;APRICORN_GENERIC&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;APRICORN_TYPED&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;FOOD_LOW&amp;quot;, weight = 4},&lt;br /&gt;
    {id = &amp;quot;SEED_LOW&amp;quot;, weight = 4},&lt;br /&gt;
    {id = &amp;quot;SEED_MID&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;HELD_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;HELD_TYPE&amp;quot;, weight = 3},&lt;br /&gt;
    {id = &amp;quot;LOOT_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;EVO_ITEMS&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;ORBS_LOW&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;WANDS_LOW&amp;quot;, weight = 4},&lt;br /&gt;
    {id = &amp;quot;WANDS_MID&amp;quot;, weight = 10},&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== reward_pools ==&lt;br /&gt;
&lt;br /&gt;
List of all reward pools and the items they contain. You must at least include all pools referenced in the rewards_per_difficulty table, but you can add more.&amp;lt;/br&amp;gt;&lt;br /&gt;
Entry ids may be either items or other pools. A pool doesn&#039;t have to only contain one of the two.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;pool id&amp;gt;: {id: string, count: integer, hidden: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;pool_id&amp;gt;: the id of the pool. It should be used somewhere else either in this table or in rewards_per_difficulty.&lt;br /&gt;
* id: item_id or pool_id. If it matches a pool, count and hidden will be ignored.&lt;br /&gt;
* count: Optional. The amount of items awarded. It cannot be higher than the item&#039;s max stack. Defaults to the item&#039;s max stack.&lt;br /&gt;
* hidden: Optional. Hidden value that can be used for various purposes depending on the item. Defaults to &amp;quot;&amp;quot;.&lt;br /&gt;
* weight: Chance of appearing. Set to 0 or delete altogether to stop an entry from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  NECESSITIES = {&lt;br /&gt;
    {id = &amp;quot;seed_reviver&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;berry_leppa&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;berry_oran&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;berry_lum&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;food_apple&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;orb_escape&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;apricorn_plain&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;key&amp;quot;,count = 3,  weight = 2}&lt;br /&gt;
  },&lt;br /&gt;
  AMMO_LOW = {&lt;br /&gt;
    {id = &amp;quot;ammo_iron_thorn&amp;quot;, count = 3, weight = 5},&lt;br /&gt;
    {id = &amp;quot;ammo_geo_pebble&amp;quot;, count = 3, weight = 1},&lt;br /&gt;
    {id = &amp;quot;ammo_stick&amp;quot;, count = 3, weight = 1},&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== target_items ==&lt;br /&gt;
&lt;br /&gt;
Ids of items that can be used as targets, divided depending on the job type.&lt;br /&gt;
Make sure they&#039;re either easy enough to obtain or impossible to lose, depending on the job.&lt;br /&gt;
Using stackable items is highly discouraged for all job types, as it may result in odd behaviors.&amp;lt;/br&amp;gt;&lt;br /&gt;
&#039;&#039;Please keep in mind that if you want to use the &amp;quot;mission_&amp;quot; items shown in the example you must either recreate them or copy them over from the example mod.&#039;&#039;&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;item_id&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: the id of a job type defined inside &amp;quot;job_types&amp;quot;&lt;br /&gt;
* &amp;lt;item_id&amp;gt;: the id of the item to use&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  LOST_ITEM = {&lt;br /&gt;
    &amp;quot;mission_lost_scarf&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_lost_specs&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_lost_band&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  OUTLAW_ITEM = {&lt;br /&gt;
    &amp;quot;mission_stolen_scarf&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_stolen_band&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_stolen_specs&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  DELIVERY = {&lt;br /&gt;
    &amp;quot;berry_oran&amp;quot;,&lt;br /&gt;
    &amp;quot;berry_leppa&amp;quot;,&lt;br /&gt;
    &amp;quot;food_apple&amp;quot;,&lt;br /&gt;
    &amp;quot;berry_lum&amp;quot;,&lt;br /&gt;
    &amp;quot;apricorn_plain&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== difficulty_to_tier ==&lt;br /&gt;
&lt;br /&gt;
Weighted table that associates mission difficulty to a specific tier of characters and outlaws.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;diff_id&amp;gt;: {id: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;diff_id&amp;gt;: one of the difficulties defined in &amp;quot;difficulty_list&amp;quot;&lt;br /&gt;
* id: A string that defines a pokémon tier id.&lt;br /&gt;
* weight: Chance of being picked. Set to 0 or delete altogether to stop an entry from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  F = {&lt;br /&gt;
    {id = &amp;quot;TIER_LOW&amp;quot;, weight = 10}&lt;br /&gt;
  },&lt;br /&gt;
  E = {&lt;br /&gt;
    {id = &amp;quot;TIER_LOW&amp;quot;, weight = 9},&lt;br /&gt;
    {id = &amp;quot;TIER_MID&amp;quot;, weight = 1}&lt;br /&gt;
  },&lt;br /&gt;
  D = {&lt;br /&gt;
    {id = &amp;quot;TIER_LOW&amp;quot;, weight = 7},&lt;br /&gt;
    {id = &amp;quot;TIER_MID&amp;quot;, weight = 3}&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== pokemon ==&lt;br /&gt;
&lt;br /&gt;
A list of Pokémon that will be used for job generation, sorted by arbitrary quest tiers.&lt;br /&gt;
Any of these entries may be picked when choosing client and target.&lt;br /&gt;
If the client picked is not in the seen dex, the reward type can never be &amp;quot;client&amp;quot; nor &amp;quot;exclusive&amp;quot;.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;tier&amp;gt;: &amp;lt;monster_id&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;tier&amp;gt;: one of the tier ids used in difficulty_to_tier&lt;br /&gt;
* &amp;lt;monster_id&amp;gt;: either the species id of a pokémon or a MonsterIDTable&lt;br /&gt;
Format of MonsterIDTable: see the &amp;quot;monsterIdTemplate&amp;quot; function in missiongen_lib.lua&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  TIER_LOW = {&lt;br /&gt;
&amp;quot;abra&amp;quot;,&amp;quot;amaura&amp;quot;,&amp;quot;anorith&amp;quot;,&amp;quot;applin&amp;quot;,&amp;quot;archen&amp;quot;,&amp;quot;aron&amp;quot;,&amp;quot;arrokuda&amp;quot;,&amp;quot;axew&amp;quot;,&amp;quot;azurill&amp;quot;, [...]&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== job_titles ==&lt;br /&gt;
&lt;br /&gt;
A list of all possible job display titles, divided by job type.&lt;br /&gt;
You must also include lists for any special job types you intend to use.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;string_key&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: either the id of a job type defined inside &amp;quot;job_types&amp;quot;, or the id of a special job type&lt;br /&gt;
* &amp;lt;string_key&amp;gt;: the localization key used for the title. The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
* {3}: client&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  RESCUE_SELF = {&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_001&amp;quot;,&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_002&amp;quot;,&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_003&amp;quot;,&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_004&amp;quot;,&lt;br /&gt;
    [...]&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== job_flavor ==&lt;br /&gt;
&lt;br /&gt;
A list of all possible job flavor text entries, divided by job type and by line.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: {&amp;lt;string_key&amp;gt;[], &amp;lt;string_key&amp;gt;[]}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: either the id of a job type defined inside &amp;quot;job_types&amp;quot;, or the id of a special job type&lt;br /&gt;
* &amp;lt;string_key&amp;gt;: the localization key used for the flavor text. Every job has 2 lists assigned: one for the top string and one for the bottom one.&lt;br /&gt;
If only the first list is specified, the second one will be left empty.&lt;br /&gt;
The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
* {3}: client&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  RESCUE_SELF = {&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_001&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_002&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_003&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_004&amp;quot;,&lt;br /&gt;
      [...]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;MISSION_BODY_BOTTOM_RESCUE_SELF_001&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_BOTTOM_RESCUE_SELF_002&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_BOTTOM_RESCUE_SELF_003&amp;quot;,&lt;br /&gt;
      [...]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== law_enforcement ==&lt;br /&gt;
&lt;br /&gt;
Law enforcement characters in your setting. All OUTLAW jobs except OUTLAW_ITEM and OUTLAW_ITEM_UNK use these characters as job clients.&lt;br /&gt;
You may specify only 1 officer, and then a list containing any number of agents. Two of the latter will be randomly picked every time the job completion cutscene is played.&amp;lt;/br&amp;gt;&lt;br /&gt;
You may add a weight property to agents to specify a custom chance of being picked. Any without will&lt;br /&gt;
have a weight of 1.&amp;lt;/br&amp;gt;&lt;br /&gt;
Add &amp;quot;unique = true&amp;quot; to the MonsterIDTable to stop an agent from being picked twice. You must&lt;br /&gt;
have at least either 1 non-unique agent or 2 unique ones for this list table to be valid.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format of MonsterIDTable: see the &amp;quot;monsterIdTemplate&amp;quot; function in missiongen_lib.lua&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  OFFICER = {Species = &amp;quot;magnezone&amp;quot;, Gender = 0},&lt;br /&gt;
  AGENT = {&lt;br /&gt;
    {Species = &amp;quot;magnemite&amp;quot;, Gender = 0, Weight = 31},&lt;br /&gt;
    {Species = &amp;quot;magnemite&amp;quot;, Gender = 0, Skin = &amp;quot;shiny&amp;quot;, Weight = 1, Unique = true}&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== enforcer_chance ==&lt;br /&gt;
&lt;br /&gt;
Defines the chance of either the officer or an agent being the client of a mission depending on the character tier of the mission, as defined in difficulty_to_tier.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;tier&amp;gt;: {id: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;tier&amp;gt;: one of the tier ids used in difficulty_to_tier&lt;br /&gt;
* id: One of: OFFICER, AGENT&lt;br /&gt;
* index: Optional. Ignored if id is OFFICER. You can set it to specify a specific agent instead of rolling using their chance in &amp;quot;law_enforcement&amp;quot;.&lt;br /&gt;
* weight: Chance of being picked. Set to 0 or delete altogether to stop an entry from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  TIER_LOW = {&lt;br /&gt;
    {id = &amp;quot;OFFICER&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;AGENT&amp;quot;, weight = 8}&lt;br /&gt;
  },&lt;br /&gt;
  TIER_MID = {&lt;br /&gt;
    {id = &amp;quot;OFFICER&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;AGENT&amp;quot;, weight = 5}&lt;br /&gt;
  },&lt;br /&gt;
  TIER_HIGH = {&lt;br /&gt;
    {id = &amp;quot;OFFICER&amp;quot;, weight = 8},&lt;br /&gt;
    {id = &amp;quot;AGENT&amp;quot;, weight = 2}&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== special_data ==&lt;br /&gt;
&lt;br /&gt;
Data of characters and flavor key used for special jobs, divided by tier.&lt;br /&gt;
In outlaw related quests, you may use ENFORCER as a keyword for a random law enforcement character.&lt;br /&gt;
You may also use OFFICER or AGENT to specify a more specific selection.&lt;br /&gt;
These keywords can only be used in place of MonsterIDTables.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;special_type&amp;gt;: {&amp;lt;tier&amp;gt;: {client: MonsterIDTable, target: MonsterIDTable, item: string, flavor: string}[]}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;special_type&amp;gt;: an id of your choosing. It must be different from any basic job id&lt;br /&gt;
* &amp;lt;tier&amp;gt;: one of the tier ids used in difficulty_to_tier&lt;br /&gt;
* client: the data used to generate this Pokémon.&lt;br /&gt;
* target: the data used to generate this Pokémon.  Only used in job types that require a target.&lt;br /&gt;
* item: the id of the item that will be used for this job. Only used in job types that require an item.&lt;br /&gt;
* flavor: flavor string key used for the job, sourced from the Menu Text list (strings.resx)&lt;br /&gt;
Format of MonsterIDTable: see the &amp;quot;monsterIdTemplate&amp;quot; function in missiongen_lib.lua&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
* {3}: client&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  LOVER = {&lt;br /&gt;
    TIER_LOW = {&lt;br /&gt;
      {client = {Species = &amp;quot;volbeat&amp;quot;, Gender = 1}, target = {Species = &amp;quot;illumise&amp;quot;, Gender = 2}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_001&amp;quot;},&lt;br /&gt;
      {client = {Species = &amp;quot;minun&amp;quot;, Gender = 1}, target = {Species = &amp;quot;plusle&amp;quot;, Gender = 2}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_002&amp;quot;},&lt;br /&gt;
      {client = {Species = &amp;quot;mareep&amp;quot;, Gender = 2}, target = {Species = &amp;quot;wooloo&amp;quot;, Gender = 1}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_003&amp;quot;},&lt;br /&gt;
      [...]&lt;br /&gt;
    },&lt;br /&gt;
    TIER_MID = {&lt;br /&gt;
      {client = {Species = &amp;quot;miltank&amp;quot;, Gender = 2}, target = {Species = &amp;quot;tauros&amp;quot;, Gender = 1}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_005&amp;quot;},&lt;br /&gt;
      {client = {Species = &amp;quot;venomoth&amp;quot;, Gender = 1}, target = {Species = &amp;quot;butterfree&amp;quot;, Gender = 2}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_006&amp;quot;},&lt;br /&gt;
      [...]&lt;br /&gt;
    },&lt;br /&gt;
    [...]&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== escort_talks ==&lt;br /&gt;
&lt;br /&gt;
String keys to be used whenever the player interacts with an escort mission client, depending on the job type.&lt;br /&gt;
You can also include tables for special escort jobs. If no such table exists for a specific case, the generic table for the job type will be used.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;string_key&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: &amp;quot;ESCORT&amp;quot;, &amp;quot;EXPLORATION&amp;quot;, or the id of a special job type that corresponds to one of these job types&lt;br /&gt;
* &amp;lt;string_key&amp;gt;: the localization key of possible messages. The localized strings are fetched from the Gameplay Text list (stringsEx.resx)&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  ESCORT = {&lt;br /&gt;
    &amp;quot;MISSION_ESCORT_INTERACT&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  EXPLORATION = {&lt;br /&gt;
    &amp;quot;MISSION_EXPLORATION_INTERACT&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== rescue_responses ==&lt;br /&gt;
&lt;br /&gt;
Strings keys to be used whenever the player interacts with a pokémon that needs rescue, depending on the job type and the response given.&lt;br /&gt;
You must include a &amp;quot;_DEFAULT&amp;quot; table, but you can also include tables for special job types. _DEFAULT will still be used for any special&lt;br /&gt;
case that doesn&#039;t have a table associated with it.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{rescue_yes: {&amp;lt;case_id&amp;gt;: {key: string, emotion: string}[]}, rescue_no: {&amp;lt;case_id&amp;gt;: {key: string, emotion: string}[]}}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;case_id&amp;gt;: &amp;quot;_DEFAULT&amp;quot;, or the id of a special job type that corresponds to either &amp;quot;RESCUE_SELF&amp;quot; or &amp;quot;RESCUE_FRIEND&amp;quot;&lt;br /&gt;
* key: the localization key of possible messages. The localized strings are fetched from the Gameplay Text list (stringsEx.resx)&lt;br /&gt;
* emotion: Optional. An emotion id to use with this specific message. Defaults to &amp;quot;Normal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: client&lt;br /&gt;
* {1}: target&lt;br /&gt;
* {2}: dungeon&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  rescue_yes = {&lt;br /&gt;
    _DEFAULT = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_DEFAULT&amp;quot;} },&lt;br /&gt;
    CHILD  = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_CHILD&amp;quot;, emotion = &amp;quot;Joyous&amp;quot;} },&lt;br /&gt;
    FRIEND = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_FRIEND&amp;quot;} },&lt;br /&gt;
    RIVAL  = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_RIVAL&amp;quot;} },&lt;br /&gt;
    LOVER  = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_LOVER&amp;quot;, emotion = &amp;quot;Joyous&amp;quot;} }&lt;br /&gt;
  },&lt;br /&gt;
  rescue_no = {&lt;br /&gt;
    _DEFAULT = { {key = &amp;quot;MISSION_RESCUE_DENY_DEFAULT&amp;quot;, emotion = &amp;quot;Surprised&amp;quot;} },&lt;br /&gt;
    CHILD  = { {key = &amp;quot;MISSION_RESCUE_DENY_CHILD&amp;quot;, emotion = &amp;quot;Crying&amp;quot;} },&lt;br /&gt;
    FRIEND = { {key = &amp;quot;MISSION_RESCUE_DENY_FRIEND&amp;quot;, emotion = &amp;quot;Surprised&amp;quot;} },&lt;br /&gt;
    RIVAL  = { {key = &amp;quot;MISSION_RESCUE_DENY_RIVAL&amp;quot;, emotion = &amp;quot;Stunned&amp;quot;} },&lt;br /&gt;
    LOVER  = { {key = &amp;quot;MISSION_RESCUE_DENY_LOVER&amp;quot;, emotion = &amp;quot;Stunned&amp;quot;} }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== mission_callback_root ==&lt;br /&gt;
&lt;br /&gt;
The object that contains job callback functions. It is recommended to define this object somewhere else.&amp;lt;/br&amp;gt;&lt;br /&gt;
Job callbacks are stored inside jobs as strings. These strings are then used as an index in the callback root object to retrieve the actual function.&lt;br /&gt;
&lt;br /&gt;
The callback system is a pretty involved one, that gives a modder the ability to handcraft entirely new types of jobs if they so choose, but is also pretty difficult to handle, so it will be discussed in [[Mod:Nebula&#039;s Mission Board/ Job callbacks|its own guide]].&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;COMMON&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== settings.AddDungeonSection(zone, segment, start, difficulty, finish, must_end, weight) ==&lt;br /&gt;
&lt;br /&gt;
Adds a new dungeon section to the list of possible job destinations.&lt;br /&gt;
Section start values must always be added in ascending order. Failing to do so may cause inconsistent behaviors.&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;zone&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: the string id of the dungeon zone.&lt;br /&gt;
* &amp;lt;code&amp;gt;segment&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: the numeric id of the dungeon segment.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: the starting floor of this dungeon section (start counting from 1 for this).&lt;br /&gt;
* &amp;lt;code&amp;gt;difficulty&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: the string id of the difficulty assigned to this section.&lt;br /&gt;
* &amp;lt;code&amp;gt;finish&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: Only considered when first adding a segment to the list. Can be omitted otherwise. This will be the last floor of the segment where jobs can spawn (start counting from 1 for this). If higher than the dungeon floors, it will default to the full dungeon length.&lt;br /&gt;
* &amp;lt;code&amp;gt;must_end&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; Only considered when first adding a segment to the list. Can be omitted otherwise. If true, this segment must be completed before jobs can spawn in it. If false, the segment must be accessed at least once, unless it&#039;s segment 0, which just needs to be unlocked. Defaults to true.&lt;br /&gt;
* &amp;lt;code&amp;gt;weight&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer|function(table, string):integer&amp;lt;/code&amp;gt; Only considered when first adding a zone to the list. Can be omitted otherwise. This is the weight that the dungeon will have when rolling for job destinations. If set to a function, it takes the library and current board id as arguments and must return an integer. If not set, defaults to 1.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
settings.AddDungeonSection(&amp;quot;faultline_ridge&amp;quot;, 0, 6, &amp;quot;D&amp;quot;, 10)&lt;br /&gt;
settings.AddDungeonSection(&amp;quot;sickly_hollow&amp;quot;, 0, 9, &amp;quot;S&amp;quot;, 16, false, 8)&lt;br /&gt;
settings.AddDungeonSection(&amp;quot;sickly_hollow&amp;quot;, 0, 13, &amp;quot;STAR_1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Handcrafted_jobs&amp;diff=5359</id>
		<title>Mod:Nebula&#039;s Mission Board/ Handcrafted jobs</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Handcrafted_jobs&amp;diff=5359"/>
		<updated>2026-01-01T10:47:31Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: Fixes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Mission Generation Library contains a method that allows the creation of basic jobs with arbitrarily chosen parameters. These jobs do not have to abide by any of the rules that the normal job generation uses, so do keep in mind that you might have to run a few checks to make sure you&#039;re not going off script, or to simply give the job to the player only when the rules are all respected. You can also choose not to care, of course, but that might have some consequences depending on what isn&#039;t being respected.&amp;lt;/br&amp;gt;&lt;br /&gt;
Here&#039;s a quick rundown of the rules followed by the library, and how to check if your desired job data would break them:&lt;br /&gt;
* &#039;&#039;&#039;No two jobs should be on the same floor&#039;&#039;&#039; - If this is not respected, the player will only be able to keep one of the jobs active at the same time.&lt;br /&gt;
: Check with: &amp;lt;code&amp;gt;MissionGen:IsDestinationOccupied(zone, segment, floor)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;The number of guest jobs in the same dungeon should not be higher than &amp;quot;max_guests&amp;quot;&#039;&#039;&#039; - This might make the adventure more difficult if &amp;quot;guests_take_up_space&amp;quot; is true, because the game might remove more party members than expected.&lt;br /&gt;
: Check with: &amp;lt;code&amp;gt;MissionGen:GetDungeonsGuestCount()[zone]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After handling all the rules you care about respecting, you can move on to actually creating the job. This is done with the following function:&lt;br /&gt;
&amp;lt;pre&amp;gt;MissionGen:MakeNewJob(zone, segment, floor, job_type, client, target, target_item, reward_type, rewards, title, flavor, hide_floor)&amp;lt;/pre&amp;gt;&lt;br /&gt;
As you can see, there are a lot of parameters, though the great majority of them is optional. Those that are will have a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; beside their type. Any missing parameter that is required for the given job type to function will be generated randomly:&lt;br /&gt;
* &amp;lt;code&amp;gt;zone&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: The id of the zone this job takes place in.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;segment&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: The specific segment this job takes place in.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: The destination floor of this job.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;job_type&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: The id of the type of this job. It must always be equal to one of the following values: &amp;quot;RESCUE_SELF&amp;quot;, &amp;quot;RESCUE_FRIEND&amp;quot;, &amp;quot;ESCORT&amp;quot;, &amp;quot;EXPLORATION&amp;quot;, &amp;quot;DELIVERY&amp;quot;, &amp;quot;LOST_ITEM&amp;quot;, &amp;quot;OUTLAW&amp;quot;, &amp;quot;OUTLAW_ITEM&amp;quot;, &amp;quot;OUTLAW_ITEM_UNK&amp;quot;, &amp;quot;OUTLAW_MONSTER_HOUSE&amp;quot;, &amp;quot;OUTLAW_FLEE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string|monsterIDTable?&amp;lt;/code&amp;gt;: Data that will be used for the client of this job. If it&#039;s not a mosterIdTable (see below), it must be either &amp;quot;ENFORCER&amp;quot;, &amp;quot;OFFICER&amp;quot; or &amp;quot;AGENT&amp;quot;. A law enforcement character will be selected using different rules depending on the string.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string|monsterIDTable?&amp;lt;/code&amp;gt;: Data that will be used for the target of this job. If it&#039;s not a mosterIdTable (see below), it must be either &amp;quot;ENFORCER&amp;quot;, &amp;quot;OFFICER&amp;quot; or &amp;quot;AGENT&amp;quot;. A law enforcement character will be selected using different rules depending on the string. This value will be used only if the job type requires a target.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_item&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string?&amp;lt;/code&amp;gt;: The id of the item that will be used as target. This value will be used only if the job type requires an item.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;reward_type&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string?&amp;lt;/code&amp;gt;: The combination of rewards that will be awarded for this job. It must always be equal to one of the following values: &amp;quot;item&amp;quot;, &amp;quot;money&amp;quot;, &amp;quot;item_item&amp;quot;, &amp;quot;money_item&amp;quot;, &amp;quot;client&amp;quot;, &amp;quot;exclusive&amp;quot;. If &amp;lt;code&amp;gt;rewards&amp;lt;/code&amp;gt; is set, this value will be inferred from the items used, even if a value was already provided.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;rewards&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;{string|itemTable?, string|itemTable?}&amp;lt;/code&amp;gt;: The item rewards that will be awarded for this job. If not set but &amp;lt;code&amp;gt;reward_type&amp;lt;/code&amp;gt; is, they will be generated automatically. You can either write only the id of the item, or use a full itemTable (see below). If the first item is nil, it will award money in its place.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string?&amp;lt;/code&amp;gt;: The string key to use for this job&#039;s title. If not set, it will be chosen randomly.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;flavor&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;{string, string?}?&amp;lt;/code&amp;gt;: The string key, or keys, to use for this job&#039;s flavor text. If not set, they will be chosen randomly.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;hide_floor&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;boolean?&amp;lt;/code&amp;gt;: If true, the job&#039;s floor will be hidden when viewing the job inside menus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;monsterIDTable&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  Species:string,&lt;br /&gt;
  Form:integer?,&lt;br /&gt;
  Skin:string?,&lt;br /&gt;
  Gender:integer?,&lt;br /&gt;
  Nickname:string?&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;itemTable&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;{id:string, count:integer?, hidden:string?}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MakeNewJob&amp;lt;/code&amp;gt; will return a fully-formed [[Mod:Nebula&#039;s Mission Board/ Job Table|JobTable]], which can then be edited further either indirectly or with other functions. Once you&#039;re done, however, you will need to add a BackReference to it, otherwise the game won&#039;t know where to send the player for the reward cutscene. This can be done in two ways, depending on what you want to accomplish; if you want to give the job directly to the player, you can do this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:SetBackReference(&amp;lt;job&amp;gt;, &amp;lt;board_id&amp;gt;)&lt;br /&gt;
MissionGen:AddJobToTaken(&amp;lt;job&amp;gt;, &amp;lt;startActive&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the JobTable.&lt;br /&gt;
* &amp;lt;code&amp;gt;board_id&amp;lt;/code&amp;gt; is the board the job should bring the player to after completing it.&lt;br /&gt;
* &amp;lt;code&amp;gt;startActive&amp;lt;/code&amp;gt; is an optional boolean that tells the game whether or not to set the job as active as it gets added to the taken list. Defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. &lt;br /&gt;
If, instead of giving it directly to the player, you want to add the job to a board, you can do this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:AddJobToBoard(&amp;lt;board_id&amp;gt;, &amp;lt;job&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;board_id&amp;lt;/code&amp;gt; is the board the job will be added to, and that will be set as BackReference.&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the JobTable.&lt;br /&gt;
With this done, the job is now fully set up and can be safely presented to the player.&lt;br /&gt;
&lt;br /&gt;
===== Custom text =====&lt;br /&gt;
You can further customize the jobs you create by editing the text displayed in the various fields of the job menu. There are a few functions that allow you to set overrides for some of the job&#039;s sensitive information:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:SetClientOverride(&amp;lt;job&amp;gt;, &amp;lt;string_key&amp;gt;)&lt;br /&gt;
MissionGen:SetObjectiveOverride(&amp;lt;job&amp;gt;, &amp;lt;string_key&amp;gt;)&lt;br /&gt;
MissionGen:SetDungeonOverride(&amp;lt;job&amp;gt;, &amp;lt;string_key&amp;gt;)&lt;br /&gt;
MissionGen:SetDifficultyOverride(&amp;lt;job&amp;gt;, &amp;lt;string_key&amp;gt;)&lt;br /&gt;
MissionGen:SetRewardOverride(&amp;lt;job&amp;gt;, &amp;lt;string_key&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the JobTable you want to edit.&lt;br /&gt;
* &amp;lt;code&amp;gt;string_key&amp;lt;/code&amp;gt; is the localization key of the string you want to set.&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Adding_New_Settings&amp;diff=4073</id>
		<title>Tutorial:Adding New Settings</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Tutorial:Adding_New_Settings&amp;diff=4073"/>
		<updated>2025-08-31T09:26:45Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: Fix links that were still broken&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Version 0.8.4 contained a heavy rework of the Settings menu. The new menu supports multiple pages of settings, and allows modders to add new pages at will thanks to the [[Service Events#EngineServiceEvents.AddMenu|AddMenu]] service callback. Please refer to the [[Editing Menus#Prerequisites]] section to know how to interact with menus using this callback.&lt;br /&gt;
&lt;br /&gt;
The label we need is literally just &amp;lt;code&amp;gt;&amp;quot;SETTINGS_MENU&amp;quot;&amp;lt;/code&amp;gt;. Keep in mind that this is the label of the settings menu TITLE window. The actual settings pages are supposed to be populated indirectly by using the functions described in this page.&lt;br /&gt;
&lt;br /&gt;
Despite the menu being technically an InteractableMenu, using any function described in the Editing Menus page is highly discouraged, with the ILabeled functions being the only exception.&lt;br /&gt;
&lt;br /&gt;
Feel free to visit the [[Settings Menu Reference]] page for a more in-depth explanation of all of the functions and values provided by the settings engine specifically.&lt;br /&gt;
&lt;br /&gt;
== Making a new settings page ==&lt;br /&gt;
With all that said, adding new settings is very simple. Call &amp;lt;code&amp;gt;SettingsTitleMenu:NewPage&amp;lt;/code&amp;gt;, and then register new settings with &amp;lt;code&amp;gt;SettingsPage:AddSetting&amp;lt;/code&amp;gt;, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if menu:HasLabel() and menu.Label == labels.SETTINGS_MENU and menu.InGame then&lt;br /&gt;
    local page = menu:AddPage(&amp;quot;my_namespace&amp;quot;, &amp;quot;My Mod&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    local options = {&amp;quot;Off&amp;quot;, 1, 2, 3, 4, 5}&lt;br /&gt;
    local saveFunction = function(setting) SV.MySetting = setting.CurrentChoice end&lt;br /&gt;
    local choiceChangedFunction = function(setting) PrintInfo(&amp;quot;MySetting preview: &amp;quot;..setting.CurrentChoice) end&lt;br /&gt;
    page:AddSetting(&amp;quot;My Setting&amp;quot;, options, SV.MySetting or 0, saveFunction, choiceChangedFunction)&lt;br /&gt;
&lt;br /&gt;
    page.GlobalSaveAction = function() PrintInfo(&amp;quot;SV.MySetting has been set to &amp;quot;..SV.MySetting) end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course, the code has something more going on, so let&#039;s check it out in more detail:&lt;br /&gt;
The first thing we need to do is, as usual, to make sure that we&#039;re editing the right menu. Then we check if we&#039;re in game or not. Making a setting work from the Top Menu requires a bit more work than what is shown here, so we&#039;re going avoid that entirely for now.&lt;br /&gt;
&lt;br /&gt;
The first step now is to create a [[Settings Menu Reference#SettingsPage|SettingsPage]] and store it in a variable. Then we prepare the structures we need for our setting: a list of options and a function that saves our settings when the player presses the confirm button. Since this is a demonstration, we will also include a function that runs every time the setting&#039;s value change, even though it is both optional and not necessary here.&lt;br /&gt;
&lt;br /&gt;
It is now time to create our setting, giving it also a display name and using its previous value (or a default value if there wasn&#039;t one yet) as the starting choice for the setting. This default value is a 0-based index into the list of options, so, for this setting, valid values go from 0 to 5.&lt;br /&gt;
&lt;br /&gt;
Finally, the last line registers a special function that is ran at the end of every other save actions in the page when the player confirms their changes. This is also optional, and it&#039;s included here simply for demonstration.&lt;br /&gt;
&lt;br /&gt;
Notice how the saveFunction and the choiceChangedFunction both accept an argument. This is because the engine always passes the [https://github.com/RogueCollab/RogueEssence/tree/master/RogueEssence/Menu/MenuElements/MenuSetting.cs MenuSetting] in question to our function. In almost all cases, all we are interested in doing is store its &amp;lt;code&amp;gt; CurrentChoice&amp;lt;/code&amp;gt; value somewhere in our code, but it IS technically possible to tamper with any of the object&#039;s &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; properties and fields.&lt;br /&gt;
&lt;br /&gt;
== Top Menu settings ==&lt;br /&gt;
As stated previously, making a setting work from the Top Menu requires a bit more work. The SV structure is already loaded when a player reaches the Top Menu, but it is also loaded again as soon as the Continue button is pressed, so any changes made to it in this state will be completely lost.&lt;br /&gt;
&lt;br /&gt;
Fortunately for us, we don&#039;t HAVE to save our changes on the SV structure immediately, and we can use a buffer instead:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if menu:HasLabel() and menu.Label == labels.SETTINGS_MENU then&lt;br /&gt;
    local page = menu:AddPage(&amp;quot;my_namespace&amp;quot;, &amp;quot;My Mod&amp;quot;)&lt;br /&gt;
    if not MY_SETTINGS then&lt;br /&gt;
        MY_SETTINGS = {&lt;br /&gt;
            Setting = SV.MySetting or 0&lt;br /&gt;
        }&lt;br /&gt;
    end&lt;br /&gt;
    local options = {&amp;quot;Off&amp;quot;, 1, 2, 3, 4, 5}&lt;br /&gt;
    local saveFunction = function(setting)&lt;br /&gt;
        if menu.InGame then&lt;br /&gt;
            SV.MySetting = setting.CurrentChoice&lt;br /&gt;
        else&lt;br /&gt;
            MY_SETTINGS.Setting = setting.CurrentChoice&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    page:AddSetting(&amp;quot;My Setting&amp;quot;, options, MY_SETTINGS.Setting, saveFunction, choiceChangedFunction)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first noticeable difference is that the initial check does not care about us being in game or not anymore. We are then creating a new global table called MY_SETTINGS and loading the current state of the setting inside of it (or a default value if it doesn&#039;t exist yet). Of course, we also check if MY_SETTINGS already exists, because we don&#039;t want to reset the player&#039;s choices if they already opened the menu once.&lt;br /&gt;
The save function has also changed to account for the two cases of being inside the game or in the top menu. We save our data directly in the SV structure if we&#039;re in game, and save in the MY_SETTINGS table if we&#039;re not.&lt;br /&gt;
&lt;br /&gt;
And that&#039;s it!&amp;lt;/br&amp;gt;&lt;br /&gt;
Except, it&#039;s not. We need to load our temporary table in the SV structure if we want to ACTUALLY save our setting. For that, we will need another service callback: [[Service Events#EngineServiceEvents.LoadSavedData|LoadSavedData]].&lt;br /&gt;
&lt;br /&gt;
This is all we need to finish the job. Once subscribed to the callback, the function below will be called as soon as the Continue button is pressed on the Top Menu, finally storing our setting inside the SV structure.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function MenuTools.OnSaveLoad()&lt;br /&gt;
    if MY_SETTINGS then&lt;br /&gt;
        SV.MySetting = MY_SETTINGS.Setting&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Category:Modding]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Editing_settings&amp;diff=3992</id>
		<title>Mod:Nebula&#039;s Mission Board/ Editing settings</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Editing_settings&amp;diff=3992"/>
		<updated>2025-08-24T09:02:50Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: /* boards */  1.0.3 changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Mission Generation Library is designed to be highly customizable. This choice is reflected in its &amp;lt;code&amp;gt;missiongen_settings.lua&amp;lt;/code&amp;gt; file. This file is what modders are supposed to edit, changing the values inside the giant table it defines.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a list of all settings in the library, with documentation:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sv_root_name ==&lt;br /&gt;
&lt;br /&gt;
Name of the SV table that will contain all stored data. Use a table to specify a deeper path. If not present in the SV structure, the defined path will be generated automatically. An empty list would just use SV as root.&amp;lt;/br&amp;gt;&lt;br /&gt;
Examples:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;jobs&amp;quot;&amp;lt;/code&amp;gt; would use &amp;lt;code&amp;gt;SV.jobs&amp;lt;/code&amp;gt; as its root.&lt;br /&gt;
* &amp;lt;code&amp;gt;{&amp;quot;adventure&amp;quot;, &amp;quot;jobs&amp;quot;}&amp;lt;/code&amp;gt; would use &amp;lt;code&amp;gt;SV.adventure.jobs&amp;lt;/code&amp;gt; as its root.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;jobs&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== boards ==&lt;br /&gt;
&lt;br /&gt;
A list of board ids and the data necessary to define their behavior.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format for each board:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;board_id&amp;gt;: {&lt;br /&gt;
  display_key: string,&lt;br /&gt;
  size: integer,&lt;br /&gt;
  location: {&lt;br /&gt;
    zone: string,&lt;br /&gt;
    map: integer&lt;br /&gt;
  },&lt;br /&gt;
  condition: function(library),&lt;br /&gt;
  dungeons: string[],&lt;br /&gt;
  job_types: {id = string, weight = integer}[]&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &amp;lt;board_id&amp;gt;: The id of the board. It will be used to identify and reference this specific board inside scripts&lt;br /&gt;
* display_key: the string key used when displaying the job menu for this board.  The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
* size: the amount of quests this board can hold at a time&lt;br /&gt;
* location: a zone id and a map index. This data is where the player will be brought for the job completion cutscene. All of these maps must call library:PlayJobsCompletedCutscene before fade-in for the reward sequence to work correctly.&lt;br /&gt;
* condition: Optional. A function called to determine if library:PopulateBoards() should fill out this board. It receives the library object as an argument and returns a boolean. If it returns true, the board is filled out. If it returns false, it is left empty. If this property is missing, this board will always be active.&lt;br /&gt;
* dungeons: Optional. A list of zone ids to generate dungeons for. This board will never generate jobs for dungeons that do not appear in this list. If this property is missing, this board can generate jobs for any registered dungeon.&lt;br /&gt;
* job_types: a list of job types and their probability weight. Higher weight means more common.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  quest_board = {&lt;br /&gt;
    display_key = &amp;quot;BOARD_QUEST_TITLE&amp;quot;,&lt;br /&gt;
    size = 8,&lt;br /&gt;
    location = {zone = &amp;quot;guildmaster_island&amp;quot;, map = 2},&lt;br /&gt;
    condition = function (library)&lt;br /&gt;
      local root = library.root&lt;br /&gt;
      local completed = 0&lt;br /&gt;
      for _, segments in pairs(root.dungeon_progress) do&lt;br /&gt;
        for _, state in pairs(segments) do&lt;br /&gt;
          if state then&lt;br /&gt;
            completed = completed + 1&lt;br /&gt;
            if completed&amp;gt;=3 then return true end&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      return false&lt;br /&gt;
    end,&lt;br /&gt;
    job_types = {&lt;br /&gt;
      {id = &amp;quot;RESCUE_SELF&amp;quot;, weight = 5},&lt;br /&gt;
      {id = &amp;quot;RESCUE_FRIEND&amp;quot;, weight = 5},&lt;br /&gt;
      {id = &amp;quot;ESCORT&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;EXPLORATION&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;DELIVERY&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;LOST_ITEM&amp;quot;, weight = 4},&lt;br /&gt;
      {id = &amp;quot;OUTLAW&amp;quot;, weight =  5},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_ITEM&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_ITEM_UNK&amp;quot;, weight = 1},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_MONSTER_HOUSE&amp;quot;, weight = 1},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_FLEE&amp;quot;, weight = 1}&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== end_dungeon_day_destination ==&lt;br /&gt;
&lt;br /&gt;
Zone and map id of the ground map where players will be sent to when a day ends and there is at least one mission to hand in. This map must contain a call to library:PlayJobsCompletedCutscene&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{zone: string, map: integer}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ zone = &amp;quot;guildmaster_island&amp;quot;, map = 2 },&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== after_rewards_function ==&lt;br /&gt;
&lt;br /&gt;
Function ran after the game is done with the job completion cutscene. It takes no arguments, and is not expected to return anything.&lt;br /&gt;
You can use it to fix up the game state however you like before returning control to the player.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
after_rewards_function = function()&lt;br /&gt;
  GAME:MoveCamera(0, 0, 1, true)&lt;br /&gt;
  SOUND:PlayBGM(SV.base_town.Song, true)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== taken_limit ==&lt;br /&gt;
&lt;br /&gt;
The maximum number of jobs that can be taken from job boards at a time.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;8&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== taken_jobs_start_active ==&lt;br /&gt;
&lt;br /&gt;
If true, taken jobs will be activated automatically. Players can always deactivate them manually if they so choose.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;true&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== max_guests ==&lt;br /&gt;
&lt;br /&gt;
The maximum amount of guest-based jobs that can be generated in the same dungeon.&amp;lt;/br&amp;gt;&lt;br /&gt;
Guest-based jobs are: ESCORT, EXPLORATION&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== guests_take_up_space ==&lt;br /&gt;
&lt;br /&gt;
The maximum amount of guest-based jobs that can be generated in the same dungeon.&amp;lt;/br&amp;gt;&lt;br /&gt;
Guest-based jobs are: ESCORT, EXPLORATION&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== min_party_limit ==&lt;br /&gt;
&lt;br /&gt;
Minimum number for the party limit when it is reduced because of guests.&lt;br /&gt;
This value cannot be lower than 1, for obvious reasons.&lt;br /&gt;
Any excess guests will simply add to the party count, without reducing the limit.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== losing_guests_means_defeat ==&lt;br /&gt;
&lt;br /&gt;
If true, losing any guest will count as a loss for the entire exploration.&lt;br /&gt;
If false, it will simply mark that specific job as failed.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_boss_steps_piority ==&lt;br /&gt;
&lt;br /&gt;
The priority of the SpawnOutlaw handler event. It can be either an integer or a list of integers.&lt;br /&gt;
This value should always be lower than dungeon_gen_steps_piority.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;-11&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_gen_steps_piority ==&lt;br /&gt;
&lt;br /&gt;
The priority that most of the job handlers will have when being added to the event list. It can be either an integer or a list of integers.&lt;br /&gt;
This value should always be equal to or higher than the priority set for the event that calls library:GenerateJobInFloor.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;-6&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_npc_steps_piority ==&lt;br /&gt;
&lt;br /&gt;
The priority that job npc spawners will have when being added to the event list. It can be either an integer or a list of integers.&lt;br /&gt;
This value should always be equal to or higher than dungeon_gen_steps_piority.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ 5, 2, 1 }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== difficulty_list ==&lt;br /&gt;
&lt;br /&gt;
A list of all difficulty rank id strings you want to use.&lt;br /&gt;
The order of these strings will define the difficulty scale used by the library.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ &amp;quot;F&amp;quot;, &amp;quot;E&amp;quot;, &amp;quot;D&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;A&amp;quot;, &amp;quot;S&amp;quot;, &amp;quot;STAR_1&amp;quot;, &amp;quot;STAR_2&amp;quot;, &amp;quot;STAR_3&amp;quot;, &amp;quot;STAR_4&amp;quot;, &amp;quot;STAR_5&amp;quot;, &amp;quot;STAR_6&amp;quot;, &amp;quot;STAR_7&amp;quot;, &amp;quot;STAR_8&amp;quot;, &amp;quot;STAR_9&amp;quot; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== difficulty_data ==&lt;br /&gt;
&lt;br /&gt;
All the data required to define difficulty rank behavior. There must be an entry for every rank defined in difficulty_list:&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;diff_id&amp;gt;: {display_key: string, money_reward: integer, extra_reward: integer, outlaw_level: integer, escort_level: integer}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;diff_id&amp;gt;: one of the difficulties defined in &amp;quot;difficulty_list&amp;quot;&lt;br /&gt;
* display_key: string key used when displaying the name of the rank.  The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
* money_reward: the amount of money awarded at the end of the job. If set to 0, money rewards will simply not award anything&lt;br /&gt;
* extra_reward: the points of extra reward awarded at the end of the job. What these points are depends on extra_reward_type. If set to 0, extra_reward_type will be considered to be &amp;quot;none&amp;quot;&lt;br /&gt;
* outlaw_level: Optional. The base level of all outlaws spawned by jobs with this difficulty. If omitted, it will be equal to the dungeon&#039;s expected level.&lt;br /&gt;
* escort_level: Optional. The level of all guests spawned by jobs with this difficulty. If omitted, it will be equal to the dungeon&#039;s expected level.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  F = {display_key = &amp;quot;RANK_STRING_F&amp;quot;, money_reward = 100, extra_reward = 0},&lt;br /&gt;
  E = {display_key = &amp;quot;RANK_STRING_E&amp;quot;, money_reward = 200, extra_reward = 100},&lt;br /&gt;
  D = {display_key = &amp;quot;RANK_STRING_D&amp;quot;, money_reward = 400, extra_reward = 200},&lt;br /&gt;
  C = {display_key = &amp;quot;RANK_STRING_C&amp;quot;, money_reward = 600, extra_reward = 400},&lt;br /&gt;
  B = {display_key = &amp;quot;RANK_STRING_B&amp;quot;, money_reward = 700, extra_reward = 1250},&lt;br /&gt;
  A = {display_key = &amp;quot;RANK_STRING_A&amp;quot;, money_reward = 1500, extra_reward = 2500},&lt;br /&gt;
  S = {display_key = &amp;quot;RANK_STRING_S&amp;quot;, money_reward = 3000, extra_reward = 5000},&lt;br /&gt;
  STAR_1 = {display_key = &amp;quot;RANK_STRING_STAR_1&amp;quot;, money_reward = 6000, extra_reward = 10000},&lt;br /&gt;
  STAR_2 = {display_key = &amp;quot;RANK_STRING_STAR_2&amp;quot;, money_reward = 10000, extra_reward = 20000},&lt;br /&gt;
  STAR_3 = {display_key = &amp;quot;RANK_STRING_STAR_3&amp;quot;, money_reward = 15000, extra_reward = 30000},&lt;br /&gt;
  STAR_4 = {display_key = &amp;quot;RANK_STRING_STAR_4&amp;quot;, money_reward = 20000, extra_reward = 40000},&lt;br /&gt;
  STAR_5 = {display_key = &amp;quot;RANK_STRING_STAR_5&amp;quot;, money_reward = 25000, extra_reward = 50000},&lt;br /&gt;
  STAR_6 = {display_key = &amp;quot;RANK_STRING_STAR_6&amp;quot;, money_reward = 30000, extra_reward = 60000},&lt;br /&gt;
  STAR_7 = {display_key = &amp;quot;RANK_STRING_STAR_7&amp;quot;, money_reward = 35000, extra_reward = 70000},&lt;br /&gt;
  STAR_8 = {display_key = &amp;quot;RANK_STRING_STAR_8&amp;quot;, money_reward = 40000, extra_reward = 80000},&lt;br /&gt;
  STAR_9 = {display_key = &amp;quot;RANK_STRING_STAR_9&amp;quot;, money_reward = 45000, extra_reward = 90000}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== guest_level_scaling ==&lt;br /&gt;
&lt;br /&gt;
Function that changes the level of guests based on the player&#039;s level. It must return the new level for the guest, or it will have no effect.&amp;lt;/br&amp;gt;&lt;br /&gt;
Arguments:&lt;br /&gt;
* lvl: base level of the guest.&lt;br /&gt;
* dungeon: if true, the level is the dungeon&#039;s recommended level. If false, it&#039;s taken from the difficulty data.&lt;br /&gt;
* avg_team_lvl: average level of the player team. It may or may not be an integer.&lt;br /&gt;
* hst_team_lvl: highest level in the player team.&lt;br /&gt;
* settings: the settings data structure itself&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(lvl, dungeon, avg_team_lvl, hst_team_lvl, settings)&lt;br /&gt;
  local add = 0&lt;br /&gt;
  if dungeon then lvl = lvl*4//5 end&lt;br /&gt;
  if avg_team_lvl &amp;gt; lvl then add = (avg_team_lvl - lvl) // 10 end&lt;br /&gt;
  return lvl + add&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== outlaw_level_scaling ==&lt;br /&gt;
&lt;br /&gt;
Function that changes the level of guests based on the player&#039;s level. It must return the new level for the guest, or it will have no effect.&amp;lt;/br&amp;gt;&lt;br /&gt;
Arguments:&lt;br /&gt;
* lvl: base level of the guest.&lt;br /&gt;
* dungeon: if true, the level is the dungeon&#039;s recommended level. If false, it&#039;s taken from the difficulty data.&lt;br /&gt;
* avg_team_lvl: average level of the player team. It may or may not be an integer.&lt;br /&gt;
* hst_team_lvl: highest level in the player team.&lt;br /&gt;
* settings: the settings data structure itself&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(lvl, dungeon, avg_team_lvl, hst_team_lvl, settings)&lt;br /&gt;
  local add = 0&lt;br /&gt;
  if dungeon then lvl = lvl*23//20 end&lt;br /&gt;
  if avg_team_lvl &amp;gt; lvl then add = (avg_team_lvl - lvl) // 8 end&lt;br /&gt;
  add = add + (hst_team_lvl - avg_team_lvl) // 4&lt;br /&gt;
  return lvl + add&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== apply_outlaw_changes ==&lt;br /&gt;
&lt;br /&gt;
Function that allows you to edit an outlaw&#039;s data just before they are spawned.&lt;br /&gt;
You can change just about anything except its position and recruitability state. Its HP will also&lt;br /&gt;
always be automatically set to full after this function is called.&lt;br /&gt;
You will also be unable to change the EquippedItem of an &amp;quot;OUTLAW_ITEM&amp;quot; or &amp;quot;OUTLAW_ITEM_UNK&amp;quot; outlaw.&amp;lt;/br&amp;gt;&lt;br /&gt;
Arguments:&lt;br /&gt;
* outlaw: the outlaw Character itself&lt;br /&gt;
* job: the current job data table&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(outlaw, job)&lt;br /&gt;
  local max_boost = PMDC.Data.MonsterFormData.MAX_STAT_BOOST&lt;br /&gt;
  outlaw.MaxHPBonus = math.min(outlaw.Level * max_boost // 64, max_boost);&lt;br /&gt;
  if job.Type == &amp;quot;OUTLAW_FLEE&amp;quot; then&lt;br /&gt;
    local speedMin = math.floor(outlaw.Level * 4 // 3)&lt;br /&gt;
    local speedMax = math.floor(outlaw.Level * 6 // 2)&lt;br /&gt;
    outlaw.SpeedBonus = math.min(_DATA.Save.Rand:Next(speedMin, speedMax), 100)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== fleeing_outlaw_restrictions ==&lt;br /&gt;
&lt;br /&gt;
A list of ids for types that are banned from ever being picked as fleeing outlaws.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ &amp;quot;ghost&amp;quot; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== outlaw_music_name ==&lt;br /&gt;
&lt;br /&gt;
The name of the outlaw music file. This file will be sourced from the Content/Music folder.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;Outlaw.ogg&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeons ==&lt;br /&gt;
&lt;br /&gt;
This is where dungeon difficulty is set. Quests can only generate for dungeons inside this list.&lt;br /&gt;
Given the complexity of this structure, it is best generated using the [[Mod:Nebula&#039;s Mission Board/ Editing settings#settings.AddDungeonSection(zone, segment, start, difficulty, finish, must_end)||AddDungeonSection]] function at the bottom of this page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_order ==&lt;br /&gt;
&lt;br /&gt;
Jobs are sorted by dungeon, following the order defined in this table. Missing dungeons are shoved at the bottom and sorted alphabetically.&lt;br /&gt;
This list is automatically populated in call order when using the &amp;quot;AddDungeonSection&amp;quot; function near the bottom of this file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== external_events ==&lt;br /&gt;
&lt;br /&gt;
A list of events unrelated to this library that can cause job generation to ignore a specific dungeon.&lt;br /&gt;
They can also be displayed in the objectives log if you so choose.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{condition: function(zone), message_key: string, message_args: function(zone), icon: string}&amp;lt;/code&amp;gt;&lt;br /&gt;
* condition: a function that takes a zone and returns a boolean. If it returns true, jobs will not be generated for this dungeon, and all already taken jobs will be automatically suspended.&lt;br /&gt;
* message_key: Optional. It will be used in the objectives log instead of the default message if the condition is true.&lt;br /&gt;
* message_args: Optional. If the message&#039;s localization string contains placeholders, this function is in charge of taking a zone and returning a list of values that will be used for those placeholders in the form of a table array (Up to 5).&lt;br /&gt;
* icon: Optional. The icon that will be displayed beside the corresponding dungeon in the dungeon selection menu if the condition is true for any of its segments. Defaults to &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  {condition = function(zone) return COMMON.HasSidequestInZone(zone) end, icon = &amp;quot;\\uE111&amp;quot;, message_key = &amp;quot;MENU_JOB_OBJECTIVE_DEFAULT&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== external_events_icon_mode ==&lt;br /&gt;
&lt;br /&gt;
How to display external event icons in the dungeon list. This value can only be either &amp;quot;FIRST&amp;quot; or ALL&amp;quot;.&lt;br /&gt;
* If set to &amp;quot;ALL&amp;quot;, they will always be displayed in the order defined by external_events. Only one copy of the same icon will be shown, no matter how many conditions require it.&lt;br /&gt;
* If set to &amp;quot;FIRST&amp;quot;, only the first event in the list&#039;s order will be displayed, no matter how many events are actually there. This setting does not prevent multiple messages from appearing in the objectives list.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;FIRST&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_list_pattern ==&lt;br /&gt;
&lt;br /&gt;
The pattern that will define how to display entries in the dungeon list.&amp;lt;/br&amp;gt;&lt;br /&gt;
{0} is the placeholder for the dungeon name, {1} for pending job icon and {2} for external condition icons.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;FIRST&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== job_types ==&lt;br /&gt;
&lt;br /&gt;
Table used to determine various properties regarding job types.&lt;br /&gt;
Remove a job type entirely to disable its generation altogether.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: {rank_modifier: integer, min_rank: string}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: one of RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
* rank_modifier (optional): these jobs will always have this modifier applied to their rank.&lt;br /&gt;
* min_rank (optional): this type of jobs can never be of a rank lower than this.&lt;br /&gt;
: This influences possible dungeon spawn: a rank_modifier 1 job with min_rank &amp;quot;C&amp;quot; can also spawn in &amp;quot;D&amp;quot; rank dungeons.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  RESCUE_SELF = {rank_modifier = 0, min_rank = &amp;quot;F&amp;quot;},&lt;br /&gt;
  RESCUE_FRIEND = {rank_modifier = 0, min_rank = &amp;quot;E&amp;quot;},&lt;br /&gt;
  ESCORT = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  EXPLORATION = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  DELIVERY = {rank_modifier = 0, min_rank = &amp;quot;D&amp;quot;},&lt;br /&gt;
  LOST_ITEM = {rank_modifier = 0, min_rank = &amp;quot;D&amp;quot;},&lt;br /&gt;
  OUTLAW = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  OUTLAW_ITEM = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  OUTLAW_ITEM_UNK = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  OUTLAW_MONSTER_HOUSE = {rank_modifier = 2, min_rank = &amp;quot;S&amp;quot;},&lt;br /&gt;
  OUTLAW_FLEE = {rank_modifier = 1, min_rank = &amp;quot;B&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_job_modifiers ==&lt;br /&gt;
&lt;br /&gt;
Special table that allows modders to specify chance multipliers for job types depending on the dungeon.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;dungeon_id&amp;gt;: {&amp;lt;job_type_id&amp;gt;: &amp;lt;multiplier&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;dungeon_id&amp;gt;: the string id of a dungeon&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: one of RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
* &amp;lt;multiplier&amp;gt;: a multiplier number. It doesn&#039;t need to be an integer. It will be multiplied with the board&#039;s base chances, rounding up, when choosing the type of a job. Set it to 0 or less to disable the job type altogether.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  ambush_forest = {&lt;br /&gt;
    OUTLAW = 3,&lt;br /&gt;
    OUTLAW_ITEM = 3,&lt;br /&gt;
    OUTLAW_ITEM_UNK = 3,&lt;br /&gt;
    OUTLAW_MONSTER_HOUSE = 3,&lt;br /&gt;
    OUTLAW_FLEE = 3&lt;br /&gt;
  },&lt;br /&gt;
  treacherous_mountain = {&lt;br /&gt;
    OUTLAW = 3,&lt;br /&gt;
    OUTLAW_ITEM = 3,&lt;br /&gt;
    OUTLAW_ITEM_UNK = 3,&lt;br /&gt;
    OUTLAW_MONSTER_HOUSE = 3,&lt;br /&gt;
    OUTLAW_FLEE = 3&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== special_chance ==&lt;br /&gt;
&lt;br /&gt;
Chance of special missions to be generated. Special missions are just handcrafted scenarios with specific client and target pairs and custom flavor texts. Set to 0 to disable altogether.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;0.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== special_jobs ==&lt;br /&gt;
&lt;br /&gt;
This is where you can define special cases for specific types of jobs.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;special_id&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: one of RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
* &amp;lt;special_id&amp;gt;: any id of your choosing except RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  RESCUE_FRIEND = {&amp;quot;CHILD&amp;quot;, &amp;quot;LOVER&amp;quot;, &amp;quot;RIVAL&amp;quot;, &amp;quot;FRIEND&amp;quot;}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== hidden_floor_chance ==&lt;br /&gt;
&lt;br /&gt;
Chance for supported quest types to have their destination floor hidden. Set to 0 to disable altogether.&amp;lt;/br&amp;gt;&lt;br /&gt;
Players will still be notified when reaching the floor. It just won&#039;t show in the quest description.&amp;lt;/br&amp;gt;&lt;br /&gt;
Job types that can have their floor hidden are: RESCUE_FRIEND, EXPLORATION, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_FLEE.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;0.15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== reward_types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A list of all types of rewards to be offered to players.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{id: string, weight: integer, min_rank: string}&amp;lt;/code&amp;gt;&lt;br /&gt;
* id: one of the supported reward types. You can use duplicate values to alter odds depending on job rank.&lt;br /&gt;
: Supported reward types are: item, money, item_item, money_item, client, exclusive&lt;br /&gt;
* weight: Chance of appearing. Set to 0 or delete altogether to stop a type of reward from being offered.&lt;br /&gt;
* min_rank: optional. If set, this type of reward will only be offered if the job is this rank or higher.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  {id = &amp;quot;item&amp;quot;, weight = 6},&lt;br /&gt;
  {id = &amp;quot;money&amp;quot;, weight = 2},&lt;br /&gt;
  {id = &amp;quot;item_item&amp;quot;, weight = 3},&lt;br /&gt;
  {id = &amp;quot;money_item&amp;quot;, weight = 1},&lt;br /&gt;
  {id = &amp;quot;client&amp;quot;, weight = 1, min_rank = &amp;quot;STAR_1&amp;quot;},&lt;br /&gt;
  {id = &amp;quot;exclusive&amp;quot;, weight = 1, min_rank = &amp;quot;STAR_4&amp;quot;}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== extra_reward_type ==&lt;br /&gt;
&lt;br /&gt;
The type of extra reward for all quests. It can be &amp;quot;none&amp;quot;, &amp;quot;rank&amp;quot; or &amp;quot;exp&amp;quot;. Any other value will result in &amp;quot;none&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;exp&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== rewards_per_difficulty ==&lt;br /&gt;
&lt;br /&gt;
This table assigns different weights to reward pools depending on the difficulty rank of the mission.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;diff_id&amp;gt;: {id: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;diff_id&amp;gt;: one of the difficulties defined in difficulty_list&amp;quot;&lt;br /&gt;
* id: the id of one of the reward pools defined in &amp;quot;reward_pools&amp;quot;&lt;br /&gt;
* weight: Chance of appearing. Set to 0 or delete altogether to stop a reward pool from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  F = {&lt;br /&gt;
    {id = &amp;quot;NECESSITIES&amp;quot;, weight = 10}&lt;br /&gt;
  },&lt;br /&gt;
  E = {&lt;br /&gt;
    {id = &amp;quot;NECESSITIES&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;APRICORN_GENERIC&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;FOOD_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;SEED_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;HELD_LOW&amp;quot;, weight = 3},&lt;br /&gt;
    {id = &amp;quot;LOOT_LOW&amp;quot;, weight = 3},&lt;br /&gt;
    {id = &amp;quot;EVO_ITEMS&amp;quot;, weight = 1},&lt;br /&gt;
    {id = &amp;quot;WANDS_LOW&amp;quot;, weight = 10}&lt;br /&gt;
  },&lt;br /&gt;
  D = {&lt;br /&gt;
    {id = &amp;quot;NECESSITIES&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;AMMO_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;APRICORN_GENERIC&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;APRICORN_TYPED&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;FOOD_LOW&amp;quot;, weight = 4},&lt;br /&gt;
    {id = &amp;quot;SEED_LOW&amp;quot;, weight = 4},&lt;br /&gt;
    {id = &amp;quot;SEED_MID&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;HELD_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;HELD_TYPE&amp;quot;, weight = 3},&lt;br /&gt;
    {id = &amp;quot;LOOT_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;EVO_ITEMS&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;ORBS_LOW&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;WANDS_LOW&amp;quot;, weight = 4},&lt;br /&gt;
    {id = &amp;quot;WANDS_MID&amp;quot;, weight = 10},&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== reward_pools ==&lt;br /&gt;
&lt;br /&gt;
List of all reward pools and the items they contain. You must at least include all pools referenced in the rewards_per_difficulty table, but you can add more.&amp;lt;/br&amp;gt;&lt;br /&gt;
Entry ids may be either items or other pools. A pool doesn&#039;t have to only contain one of the two.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;pool id&amp;gt;: {id: string, count: integer, hidden: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;pool_id&amp;gt;: the id of the pool. It should be used somewhere else either in this table or in rewards_per_difficulty.&lt;br /&gt;
* id: item_id or pool_id. If it matches a pool, count and hidden will be ignored.&lt;br /&gt;
* count: Optional. The amount of items awarded. It cannot be higher than the item&#039;s max stack. Defaults to the item&#039;s max stack.&lt;br /&gt;
* hidden: Optional. Hidden value that can be used for various purposes depending on the item. Defaults to &amp;quot;&amp;quot;.&lt;br /&gt;
* weight: Chance of appearing. Set to 0 or delete altogether to stop an entry from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  NECESSITIES = {&lt;br /&gt;
    {id = &amp;quot;seed_reviver&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;berry_leppa&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;berry_oran&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;berry_lum&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;food_apple&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;orb_escape&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;apricorn_plain&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;key&amp;quot;,count = 3,  weight = 2}&lt;br /&gt;
  },&lt;br /&gt;
  AMMO_LOW = {&lt;br /&gt;
    {id = &amp;quot;ammo_iron_thorn&amp;quot;, count = 3, weight = 5},&lt;br /&gt;
    {id = &amp;quot;ammo_geo_pebble&amp;quot;, count = 3, weight = 1},&lt;br /&gt;
    {id = &amp;quot;ammo_stick&amp;quot;, count = 3, weight = 1},&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== target_items ==&lt;br /&gt;
&lt;br /&gt;
Ids of items that can be used as targets, divided depending on the job type.&lt;br /&gt;
Make sure they&#039;re either easy enough to obtain or impossible to lose, depending on the job.&lt;br /&gt;
Using stackable items is highly discouraged for all job types, as it may result in odd behaviors.&amp;lt;/br&amp;gt;&lt;br /&gt;
&#039;&#039;Please keep in mind that if you want to use the &amp;quot;mission_&amp;quot; items shown in the example you must either recreate them or copy them over from the example mod.&#039;&#039;&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;item_id&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: the id of a job type defined inside &amp;quot;job_types&amp;quot;&lt;br /&gt;
* &amp;lt;item_id&amp;gt;: the id of the item to use&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  LOST_ITEM = {&lt;br /&gt;
    &amp;quot;mission_lost_scarf&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_lost_specs&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_lost_band&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  OUTLAW_ITEM = {&lt;br /&gt;
    &amp;quot;mission_stolen_scarf&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_stolen_band&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_stolen_specs&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  DELIVERY = {&lt;br /&gt;
    &amp;quot;berry_oran&amp;quot;,&lt;br /&gt;
    &amp;quot;berry_leppa&amp;quot;,&lt;br /&gt;
    &amp;quot;food_apple&amp;quot;,&lt;br /&gt;
    &amp;quot;berry_lum&amp;quot;,&lt;br /&gt;
    &amp;quot;apricorn_plain&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== difficulty_to_tier ==&lt;br /&gt;
&lt;br /&gt;
Weighted table that associates mission difficulty to a specific tier of characters and outlaws.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;diff_id&amp;gt;: {id: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;diff_id&amp;gt;: one of the difficulties defined in &amp;quot;difficulty_list&amp;quot;&lt;br /&gt;
* id: A string that defines a pokémon tier id.&lt;br /&gt;
* weight: Chance of being picked. Set to 0 or delete altogether to stop an entry from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  F = {&lt;br /&gt;
    {id = &amp;quot;TIER_LOW&amp;quot;, weight = 10}&lt;br /&gt;
  },&lt;br /&gt;
  E = {&lt;br /&gt;
    {id = &amp;quot;TIER_LOW&amp;quot;, weight = 9},&lt;br /&gt;
    {id = &amp;quot;TIER_MID&amp;quot;, weight = 1}&lt;br /&gt;
  },&lt;br /&gt;
  D = {&lt;br /&gt;
    {id = &amp;quot;TIER_LOW&amp;quot;, weight = 7},&lt;br /&gt;
    {id = &amp;quot;TIER_MID&amp;quot;, weight = 3}&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== pokemon ==&lt;br /&gt;
&lt;br /&gt;
A list of Pokémon that will be used for job generation, sorted by arbitrary quest tiers.&lt;br /&gt;
Any of these entries may be picked when choosing client and target.&lt;br /&gt;
If the client picked is not in the seen dex, the reward type can never be &amp;quot;client&amp;quot; nor &amp;quot;exclusive&amp;quot;.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;tier&amp;gt;: &amp;lt;monster_id&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;tier&amp;gt;: one of the tier ids used in difficulty_to_tier&lt;br /&gt;
* &amp;lt;monster_id&amp;gt;: either the species id of a pokémon or a MonsterIDTable&lt;br /&gt;
Format of MonsterIDTable: see the &amp;quot;monsterIdTemplate&amp;quot; function in missiongen_lib.lua&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  TIER_LOW = {&lt;br /&gt;
&amp;quot;abra&amp;quot;,&amp;quot;amaura&amp;quot;,&amp;quot;anorith&amp;quot;,&amp;quot;applin&amp;quot;,&amp;quot;archen&amp;quot;,&amp;quot;aron&amp;quot;,&amp;quot;arrokuda&amp;quot;,&amp;quot;axew&amp;quot;,&amp;quot;azurill&amp;quot;, [...]&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== job_titles ==&lt;br /&gt;
&lt;br /&gt;
A list of all possible job display titles, divided by job type.&lt;br /&gt;
You must also include lists for any special job types you intend to use.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;string_key&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: either the id of a job type defined inside &amp;quot;job_types&amp;quot;, or the id of a special job type&lt;br /&gt;
* &amp;lt;string_key&amp;gt;: the localization key used for the title. The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
* {3}: client&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  RESCUE_SELF = {&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_001&amp;quot;,&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_002&amp;quot;,&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_003&amp;quot;,&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_004&amp;quot;,&lt;br /&gt;
    [...]&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== job_flavor ==&lt;br /&gt;
&lt;br /&gt;
A list of all possible job flavor text entries, divided by job type and by line.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: {&amp;lt;string_key&amp;gt;[], &amp;lt;string_key&amp;gt;[]}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: either the id of a job type defined inside &amp;quot;job_types&amp;quot;, or the id of a special job type&lt;br /&gt;
* &amp;lt;string_key&amp;gt;: the localization key used for the flavor text. Every job has 2 lists assigned: one for the top string and one for the bottom one.&lt;br /&gt;
If only the first list is specified, the second one will be left empty.&lt;br /&gt;
The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
* {3}: client&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  RESCUE_SELF = {&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_001&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_002&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_003&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_004&amp;quot;,&lt;br /&gt;
      [...]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;MISSION_BODY_BOTTOM_RESCUE_SELF_001&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_BOTTOM_RESCUE_SELF_002&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_BOTTOM_RESCUE_SELF_003&amp;quot;,&lt;br /&gt;
      [...]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== law_enforcement ==&lt;br /&gt;
&lt;br /&gt;
Law enforcement characters in your setting. All OUTLAW jobs except OUTLAW_ITEM and OUTLAW_ITEM_UNK use these characters as job clients.&lt;br /&gt;
You may specify only 1 officer, and then a list containing any number of agents. Two of the latter will be randomly picked every time the job completion cutscene is played.&amp;lt;/br&amp;gt;&lt;br /&gt;
You may add a weight property to agents to specify a custom chance of being picked. Any without will&lt;br /&gt;
have a weight of 1.&amp;lt;/br&amp;gt;&lt;br /&gt;
Add &amp;quot;unique = true&amp;quot; to the MonsterIDTable to stop an agent from being picked twice. You must&lt;br /&gt;
have at least either 1 non-unique agent or 2 unique ones for this list table to be valid.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format of MonsterIDTable: see the &amp;quot;monsterIdTemplate&amp;quot; function in missiongen_lib.lua&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  OFFICER = {Species = &amp;quot;magnezone&amp;quot;, Gender = 0},&lt;br /&gt;
  AGENT = {&lt;br /&gt;
    {Species = &amp;quot;magnemite&amp;quot;, Gender = 0, Weight = 31},&lt;br /&gt;
    {Species = &amp;quot;magnemite&amp;quot;, Gender = 0, Skin = &amp;quot;shiny&amp;quot;, Weight = 1, Unique = true}&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== enforcer_chance ==&lt;br /&gt;
&lt;br /&gt;
Defines the chance of either the officer or an agent being the client of a mission depending on the character tier of the mission, as defined in difficulty_to_tier.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;tier&amp;gt;: {id: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;tier&amp;gt;: one of the tier ids used in difficulty_to_tier&lt;br /&gt;
* id: One of: OFFICER, AGENT&lt;br /&gt;
* index: Optional. Ignored if id is OFFICER. You can set it to specify a specific agent instead of rolling using their chance in &amp;quot;law_enforcement&amp;quot;.&lt;br /&gt;
* weight: Chance of being picked. Set to 0 or delete altogether to stop an entry from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  TIER_LOW = {&lt;br /&gt;
    {id = &amp;quot;OFFICER&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;AGENT&amp;quot;, weight = 8}&lt;br /&gt;
  },&lt;br /&gt;
  TIER_MID = {&lt;br /&gt;
    {id = &amp;quot;OFFICER&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;AGENT&amp;quot;, weight = 5}&lt;br /&gt;
  },&lt;br /&gt;
  TIER_HIGH = {&lt;br /&gt;
    {id = &amp;quot;OFFICER&amp;quot;, weight = 8},&lt;br /&gt;
    {id = &amp;quot;AGENT&amp;quot;, weight = 2}&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== special_data ==&lt;br /&gt;
&lt;br /&gt;
Data of characters and flavor key used for special jobs, divided by tier.&lt;br /&gt;
In outlaw related quests, you may use ENFORCER as a keyword for a random law enforcement character.&lt;br /&gt;
You may also use OFFICER or AGENT to specify a more specific selection.&lt;br /&gt;
These keywords can only be used in place of MonsterIDTables.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;special_type&amp;gt;: {&amp;lt;tier&amp;gt;: {client: MonsterIDTable, target: MonsterIDTable, item: string, flavor: string}[]}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;special_type&amp;gt;: an id of your choosing. It must be different from any basic job id&lt;br /&gt;
* &amp;lt;tier&amp;gt;: one of the tier ids used in difficulty_to_tier&lt;br /&gt;
* client: the data used to generate this Pokémon.&lt;br /&gt;
* target: the data used to generate this Pokémon.  Only used in job types that require a target.&lt;br /&gt;
* item: the id of the item that will be used for this job. Only used in job types that require an item.&lt;br /&gt;
* flavor: flavor string key used for the job, sourced from the Menu Text list (strings.resx)&lt;br /&gt;
Format of MonsterIDTable: see the &amp;quot;monsterIdTemplate&amp;quot; function in missiongen_lib.lua&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
* {3}: client&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  LOVER = {&lt;br /&gt;
    TIER_LOW = {&lt;br /&gt;
      {client = {Species = &amp;quot;volbeat&amp;quot;, Gender = 1}, target = {Species = &amp;quot;illumise&amp;quot;, Gender = 2}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_001&amp;quot;},&lt;br /&gt;
      {client = {Species = &amp;quot;minun&amp;quot;, Gender = 1}, target = {Species = &amp;quot;plusle&amp;quot;, Gender = 2}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_002&amp;quot;},&lt;br /&gt;
      {client = {Species = &amp;quot;mareep&amp;quot;, Gender = 2}, target = {Species = &amp;quot;wooloo&amp;quot;, Gender = 1}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_003&amp;quot;},&lt;br /&gt;
      [...]&lt;br /&gt;
    },&lt;br /&gt;
    TIER_MID = {&lt;br /&gt;
      {client = {Species = &amp;quot;miltank&amp;quot;, Gender = 2}, target = {Species = &amp;quot;tauros&amp;quot;, Gender = 1}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_005&amp;quot;},&lt;br /&gt;
      {client = {Species = &amp;quot;venomoth&amp;quot;, Gender = 1}, target = {Species = &amp;quot;butterfree&amp;quot;, Gender = 2}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_006&amp;quot;},&lt;br /&gt;
      [...]&lt;br /&gt;
    },&lt;br /&gt;
    [...]&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== escort_talks ==&lt;br /&gt;
&lt;br /&gt;
String keys to be used whenever the player interacts with an escort mission client, depending on the job type.&lt;br /&gt;
You can also include tables for special escort jobs. If no such table exists for a specific case, the generic table for the job type will be used.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;string_key&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: &amp;quot;ESCORT&amp;quot;, &amp;quot;EXPLORATION&amp;quot;, or the id of a special job type that corresponds to one of these job types&lt;br /&gt;
* &amp;lt;string_key&amp;gt;: the localization key of possible messages. The localized strings are fetched from the Gameplay Text list (stringsEx.resx)&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  ESCORT = {&lt;br /&gt;
    &amp;quot;MISSION_ESCORT_INTERACT&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  EXPLORATION = {&lt;br /&gt;
    &amp;quot;MISSION_EXPLORATION_INTERACT&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== rescue_responses ==&lt;br /&gt;
&lt;br /&gt;
Strings keys to be used whenever the player interacts with a pokémon that needs rescue, depending on the job type and the response given.&lt;br /&gt;
You must include a &amp;quot;_DEFAULT&amp;quot; table, but you can also include tables for special job types. _DEFAULT will still be used for any special&lt;br /&gt;
case that doesn&#039;t have a table associated with it.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{rescue_yes: {&amp;lt;case_id&amp;gt;: {key: string, emotion: string}[]}, rescue_no: {&amp;lt;case_id&amp;gt;: {key: string, emotion: string}[]}}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;case_id&amp;gt;: &amp;quot;_DEFAULT&amp;quot;, or the id of a special job type that corresponds to either &amp;quot;RESCUE_SELF&amp;quot; or &amp;quot;RESCUE_FRIEND&amp;quot;&lt;br /&gt;
* key: the localization key of possible messages. The localized strings are fetched from the Gameplay Text list (stringsEx.resx)&lt;br /&gt;
* emotion: Optional. An emotion id to use with this specific message. Defaults to &amp;quot;Normal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: client&lt;br /&gt;
* {1}: target&lt;br /&gt;
* {2}: dungeon&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  rescue_yes = {&lt;br /&gt;
    _DEFAULT = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_DEFAULT&amp;quot;} },&lt;br /&gt;
    CHILD  = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_CHILD&amp;quot;, emotion = &amp;quot;Joyous&amp;quot;} },&lt;br /&gt;
    FRIEND = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_FRIEND&amp;quot;} },&lt;br /&gt;
    RIVAL  = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_RIVAL&amp;quot;} },&lt;br /&gt;
    LOVER  = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_LOVER&amp;quot;, emotion = &amp;quot;Joyous&amp;quot;} }&lt;br /&gt;
  },&lt;br /&gt;
  rescue_no = {&lt;br /&gt;
    _DEFAULT = { {key = &amp;quot;MISSION_RESCUE_DENY_DEFAULT&amp;quot;, emotion = &amp;quot;Surprised&amp;quot;} },&lt;br /&gt;
    CHILD  = { {key = &amp;quot;MISSION_RESCUE_DENY_CHILD&amp;quot;, emotion = &amp;quot;Crying&amp;quot;} },&lt;br /&gt;
    FRIEND = { {key = &amp;quot;MISSION_RESCUE_DENY_FRIEND&amp;quot;, emotion = &amp;quot;Surprised&amp;quot;} },&lt;br /&gt;
    RIVAL  = { {key = &amp;quot;MISSION_RESCUE_DENY_RIVAL&amp;quot;, emotion = &amp;quot;Stunned&amp;quot;} },&lt;br /&gt;
    LOVER  = { {key = &amp;quot;MISSION_RESCUE_DENY_LOVER&amp;quot;, emotion = &amp;quot;Stunned&amp;quot;} }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== mission_callback_root ==&lt;br /&gt;
&lt;br /&gt;
The object that contains job callback functions. It is recommended to define this object somewhere else.&amp;lt;/br&amp;gt;&lt;br /&gt;
Job callbacks are stored inside jobs as strings. These strings are then used as an index in the callback root object to retrieve the actual function.&lt;br /&gt;
&lt;br /&gt;
The callback system is a pretty involved one, that gives a modder the ability to handcraft entirely new types of jobs if they so choose, but is also pretty difficult to handle, so it will be discussed in [[Mod:Nebula&#039;s Mission Board/ Job callbacks|its own guide]].&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;COMMON&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== settings.AddDungeonSection(zone, segment, start, difficulty, finish, must_end) ==&lt;br /&gt;
&lt;br /&gt;
Adds a new dungeon section to the list of possible job destinations.&lt;br /&gt;
Section start values must always be added in ascending order. Failing to do so may cause inconsistent behaviors.&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;zone&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: the string id of the dungeon zone.&lt;br /&gt;
* &amp;lt;code&amp;gt;segment&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: the numeric id of the dungeon segment.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: the starting floor of this dungeon section (start counting from 1 for this).&lt;br /&gt;
* &amp;lt;code&amp;gt;difficulty&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: the string id of the difficulty assigned to this section.&lt;br /&gt;
* &amp;lt;code&amp;gt;finish&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: Only considered when first adding a segment to the list. Can be omitted otherwise. This will be the last floor of the segment where jobs can spawn (start counting from 1 for this). If higher than the dungeon floors, it will default to the full dungeon length.&lt;br /&gt;
* &amp;lt;code&amp;gt;must_end&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; Only considered when first adding a segment to the list. Can be omitted otherwise. If true, this segment must be completed before jobs can spawn in it. If false, the segment must be accessed at least once, unless it&#039;s segment 0, which just needs to be unlocked. Defaults to true.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
settings.AddDungeonSection(&amp;quot;faultline_ridge&amp;quot;, 0, 6, &amp;quot;D&amp;quot;, 10)&lt;br /&gt;
settings.AddDungeonSection(&amp;quot;sickly_hollow&amp;quot;, 0, 9, &amp;quot;S&amp;quot;, 16, false)&lt;br /&gt;
settings.AddDungeonSection(&amp;quot;sickly_hollow&amp;quot;, 0, 13, &amp;quot;STAR_1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Job_callbacks&amp;diff=2831</id>
		<title>Mod:Nebula&#039;s Mission Board/ Job callbacks</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Job_callbacks&amp;diff=2831"/>
		<updated>2025-08-01T17:44:16Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: Account for 1.0.1 changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The library contains a callback system that allows modders to attach code to specific jobs to customize their behavior. It functions very similarly to how the base game handles scripted events: you attach a function name and a series of arguments to an id, and the system will fetch a function from somewhere, passing those arguments to it. Let&#039;s see exactly how this works.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
There are a few places in which the library checks a job&#039;s &amp;lt;code&amp;gt;Callback&amp;lt;/code&amp;gt; field. These are called &amp;quot;events&amp;quot;, and there are ten in total. Most events can also be interrupted; we will discuss how to do that next.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;JobTake&amp;quot;&amp;lt;/code&amp;gt;: Happens when a job is taken using the board menu, or when &amp;lt;code&amp;gt;MissionGen:TakeJob(&amp;lt;board_id&amp;gt;, &amp;lt;index&amp;gt;)&amp;lt;/code&amp;gt; is called directly. Interrupting this event will cause it to not add the job to the taken list or mark it as taken.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;JobActivate&amp;quot;&amp;lt;/code&amp;gt;: Called when a job is activated from the taken menu, or when &amp;lt;code&amp;gt;MissionGen:ToggleTakenJob(&amp;lt;index&amp;gt;)&amp;lt;/code&amp;gt; is called directly on a currently inactive job. Interrupting this event will cause the job to not be activated.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;JobDeactivate&amp;quot;&amp;lt;/code&amp;gt;: Called when a job is deactivated from the taken menu, or when &amp;lt;code&amp;gt;MissionGen:ToggleTakenJob(&amp;lt;index&amp;gt;)&amp;lt;/code&amp;gt; is called directly on a currently active job. Interrupting this event will cause the job to not be deactivated.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;DungeonStart&amp;quot;&amp;lt;/code&amp;gt;: Called right before checking if the job is supposed to have a guest. This event cannot be interrupted.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;DungeonEnd&amp;quot;&amp;lt;/code&amp;gt;: Called right before checking for job completion. This event cannot be interrupted.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;FloorStart&amp;quot;&amp;lt;/code&amp;gt;: Called at the start of the destination floor of a job, right after applying the segment&#039;s generation steps but before applying the floor&#039;s specific generation steps. Interrupting this event will prevent any battle event and floor generation step normally required by the job&#039;s type from being added to the queue. &lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;JobComplete&amp;quot;&amp;lt;/code&amp;gt;: Called when a job is marked as completed, or when &amp;lt;code&amp;gt;MissionGen:MarkJobCompleted(&amp;lt;job&amp;gt;)&amp;lt;/code&amp;gt; is called directly. Interrupting this event will prevent the job from being marked as completed.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;JobFail&amp;quot;&amp;lt;/code&amp;gt;: Called when a job is marked as failed, or when &amp;lt;code&amp;gt;MissionGen:MarkJobFailed(&amp;lt;job&amp;gt;)&amp;lt;/code&amp;gt; is called directly. Interrupting this event will prevent the job from being marked as failed.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;BeforeReward&amp;quot;&amp;lt;/code&amp;gt;: Called right before the reward cutscene is about to start for a specific job. Interrupting this event will skip the cutscene altogether.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;AfterReward&amp;quot;&amp;lt;/code&amp;gt;: Called right after the reward cutscene ends for a specific job. Interrupting this event will prevent the job from being removed from the taken list.&lt;br /&gt;
&lt;br /&gt;
By attaching code to these events, one can change how the library handles a job; jobs that unlock their target dungeons when activated become possible, for example. Expert modders might even be able to create completely new types of jobs, given enough effort.&lt;br /&gt;
&lt;br /&gt;
=== The Event Table ===&lt;br /&gt;
When an event is called, a small table of data is generated and then passed to whatever callback is assigned to it. This table contains the following data:&lt;br /&gt;
* &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt;: Begins equal to false. If true, it will interrupt the event if possible.&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;[[Mod:Nebula&#039;s Mission Board/ Job Table|JobTable]]&amp;lt;/code&amp;gt;: The job that this instance of the event applies to.&lt;br /&gt;
* &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt;: Some extra parameters that may be useful to the callback.&lt;br /&gt;
&lt;br /&gt;
This gives you full access to all data stored inside the job table, making it easy to write general purpose functions. Plus, as you can see, interrupting an event is as easy as setting &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. This is not all, though; the &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; table might contain different properties depending on the event. If an event is not on this list, its data table will be empty:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;JobTake&amp;quot;&amp;lt;/code&amp;gt;:&lt;br /&gt;
** &amp;lt;code&amp;gt;board&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: the id of the board this job is being taken from.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;JobActivate&amp;quot;&amp;lt;/code&amp;gt;: Nothing.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;JobDeactivate&amp;quot;&amp;lt;/code&amp;gt;: Nothing.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;DungeonStart&amp;quot;&amp;lt;/code&amp;gt;: Nothing.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;DungeonEnd&amp;quot;&amp;lt;/code&amp;gt;:&lt;br /&gt;
** &amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;[https://github.com/RogueCollab/RogueEssence/blob/master/RogueEssence/Data/GameProgress.cs#L72 ResultType]&amp;lt;/code&amp;gt;: The final result of this exploration.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;FloorStart&amp;quot;&amp;lt;/code&amp;gt;:&lt;br /&gt;
** &amp;lt;code&amp;gt;zoneContext&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;[https://github.com/RogueCollab/RogueEssence/blob/master/RogueEssence/LevelGen/Zones/ZoneSegment.cs#L288 ZoneGenContext]&amp;lt;/code&amp;gt; the collection of zone gen data associated to the current task&lt;br /&gt;
** &amp;lt;code&amp;gt;context&amp;lt;/code&amp;gt; - any &amp;lt;code&amp;gt;[https://github.com/RogueCollab/RogueEssence/blob/master/RogueEssence/LevelGen/MapGenContext.cs BaseMapGenContext]&amp;lt;/code&amp;gt; implementation: an object that describes the map in its during-generation state&lt;br /&gt;
** &amp;lt;code&amp;gt;queue&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;[https://github.com/audinowho/RogueElements/blob/master/RogueElements/StablePriorityQueue.cs StablePriorityQueue]&amp;lt;[https://github.com/audinowho/RogueElements/blob/master/RogueElements/Priority/Priority.cs Priority],any [https://github.com/audinowho/RogueElements/blob/master/RogueElements/MapGen/IGenStep.cs IGenStep] implementation&amp;gt;&amp;lt;/code&amp;gt;: the list of floor generation steps to apply after this callback returns.&lt;br /&gt;
** &amp;lt;code&amp;gt;seed&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: the numeric seed supplied to the ZoneStep that is handling this code.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;BeforeReward&amp;quot;&amp;lt;/code&amp;gt;:&lt;br /&gt;
** &amp;lt;code&amp;gt;zone&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; the id of the zone the player is currently in.&lt;br /&gt;
** &amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt; the index of the map the player is currently in.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;AfterReward&amp;quot;&amp;lt;/code&amp;gt;:&lt;br /&gt;
** &amp;lt;code&amp;gt;zone&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; the id of the zone the player is currently in.&lt;br /&gt;
** &amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt; the index of the map the player is currently in.&lt;br /&gt;
After the callback returns, the table will be returned to the event-calling code, which will check for the field&#039;s state and react accordingly.&lt;br /&gt;
&lt;br /&gt;
== Callbacks ==&lt;br /&gt;
To use the callback system, you first need to set the [[Mod:Nebula&#039;s Mission Board/ Editing settings#mission_callback_root|mission_callback_root]] setting to a global table of your choice. All callbacks will then need to be stored inside that table. Furthermore, this is what their signature should look like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(&amp;lt;evt&amp;gt;, &amp;lt;args&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;evt&amp;lt;/code&amp;gt; is the event table discussed above&lt;br /&gt;
* &amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt; is the list of arguments set when registering the callback.&lt;br /&gt;
&lt;br /&gt;
Any changes to the job table will be kept after the callback ends, so you can even use this to change the job&#039;s properties if you want.&lt;br /&gt;
&lt;br /&gt;
=== Registering a callback ===&lt;br /&gt;
Once you have your callback ready, you need to register it to a job. This is done by using this function:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:RegisterCallback(&amp;lt;job&amp;gt;, &amp;lt;event&amp;gt;, &amp;lt;func&amp;gt;, &amp;lt;args&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the job table to add the callback to.&lt;br /&gt;
* &amp;lt;code&amp;gt;event&amp;lt;/code&amp;gt; is the id of the event to subscribe to, as discussed at the top.&lt;br /&gt;
* &amp;lt;code&amp;gt;func&amp;lt;/code&amp;gt; is the name of the callback function.&lt;br /&gt;
* &amp;lt;code&amp;gt;event&amp;lt;/code&amp;gt; is optional, and is the table of arguments to pass to this instance of the callback. If not set, it defaults to an empty table. You should not save C# objects or functions in here, because they wouldn&#039;t be saved correctly.&lt;br /&gt;
&lt;br /&gt;
This will make it so that the given function is called when the given event is triggered. Do keep in mind that only one callback per event can be registered inside a job. Trying to register a second function will remove the previous one.&lt;br /&gt;
&lt;br /&gt;
Once your callback is registered, just give the job to the player in some way, and you&#039;re good to go.&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Handcrafted_jobs&amp;diff=2830</id>
		<title>Mod:Nebula&#039;s Mission Board/ Handcrafted jobs</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Handcrafted_jobs&amp;diff=2830"/>
		<updated>2025-08-01T15:27:11Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: Add override info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Mission Generation Library contains a method that allows the creation of basic jobs with arbitrarily chosen parameters. These jobs do not have to abide by any of the rules that the normal job generation uses, so do keep in mind that you might have to run a few checks to make sure you&#039;re not going off script, or to simply give the job to the player only when the rules are all respected. You can also choose not to care, of course, but that might have some consequences depending on what isn&#039;t being respected.&amp;lt;/br&amp;gt;&lt;br /&gt;
Here&#039;s a quick rundown of the rules followed by the library, and how to check if your desired job data would break them:&lt;br /&gt;
* &#039;&#039;&#039;No two jobs should be on the same floor&#039;&#039;&#039; - If this is not respected, the player will only be able to keep one of the jobs active at the same time.&lt;br /&gt;
: Check with: &amp;lt;code&amp;gt;MissionGen:IsDestinationOccupied(zone, segment, floor)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;The number of guest jobs in the same dungeon should not be higher than &amp;quot;max_guests&amp;quot;&#039;&#039;&#039; - This might make the adventure more difficult if &amp;quot;guests_take_up_space&amp;quot; is true, because the game might remove more party members than expected.&lt;br /&gt;
: Check with: &amp;lt;code&amp;gt;MissionGen:GetDungeonsGuestCount()[zone]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After handling all the rules you care about respecting, you can move on to actually creating the job. This is done with the following function:&lt;br /&gt;
&amp;lt;pre&amp;gt;MissionGen:MakeNewJob(zone, segment, floor, job_type, client, target, target_item, reward_type, rewards, title, flavor, hide_floor)&amp;lt;/pre&amp;gt;&lt;br /&gt;
As you can see, there are a lot of parameters, though the great majority of them is optional. Those that are will have a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; beside its type. Any missing parameter that is required for the given job type to function will be generated randomly:&lt;br /&gt;
* &amp;lt;code&amp;gt;zone&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: The id of the zone this job takes place in.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;segment&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: The specific segment this job takes place in.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: The destination floor of this job.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;job_type&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: The id of the type of this job. It must always be equal to one of the following values: &amp;quot;RESCUE_SELF&amp;quot;, &amp;quot;RESCUE_FRIEND&amp;quot;, &amp;quot;ESCORT&amp;quot;, &amp;quot;EXPLORATION&amp;quot;, &amp;quot;DELIVERY&amp;quot;, &amp;quot;LOST_ITEM&amp;quot;, &amp;quot;OUTLAW&amp;quot;, &amp;quot;OUTLAW_ITEM&amp;quot;, &amp;quot;OUTLAW_ITEM_UNK&amp;quot;, &amp;quot;OUTLAW_MONSTER_HOUSE&amp;quot;, &amp;quot;OUTLAW_FLEE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string|monsterIDTable&amp;lt;/code&amp;gt;: Data that will be used for the client of this job. If it&#039;s not a mosterIdTable (see below), it must be either &amp;quot;ENFORCER&amp;quot;, &amp;quot;OFFICER&amp;quot; or &amp;quot;AGENT&amp;quot;. A law enforcement character will be selected using different rules depending on the string.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string|monsterIDTable&amp;lt;/code&amp;gt;: Data that will be used for the target of this job. If it&#039;s not a mosterIdTable (see below), it must be either &amp;quot;ENFORCER&amp;quot;, &amp;quot;OFFICER&amp;quot; or &amp;quot;AGENT&amp;quot;. A law enforcement character will be selected using different rules depending on the string. This value will be used only if the job type requires a target.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_item&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string?&amp;lt;/code&amp;gt;: The id of the item that will be used as target. This value will be used only if the job type requires an item.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;reward_type&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string?&amp;lt;/code&amp;gt;: The combination of rewards that will be awarded for this job. It must always be equal to one of the following values: &amp;quot;item&amp;quot;, &amp;quot;money&amp;quot;, &amp;quot;item_item&amp;quot;, &amp;quot;money_item&amp;quot;, &amp;quot;client&amp;quot;, &amp;quot;exclusive&amp;quot;. If &amp;lt;code&amp;gt;rewards&amp;lt;/code&amp;gt; is set, this value will be inferred from the items used, even if a value was already provided.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;rewards&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;{string|itemTable?, string|itemTable?}&amp;lt;/code&amp;gt;: The item rewards that will be awarded for this job. If not set but &amp;lt;code&amp;gt;reward_type&amp;lt;/code&amp;gt; is, they will be generated automatically. You can either write only the id of the item, or use a full itemTable (see below). If the first item is nil, it will award money in its place.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string?&amp;lt;/code&amp;gt;: The string key to use for this job&#039;s title. If not set, it will be chosen randomly.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;flavor&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;{string, string?}?&amp;lt;/code&amp;gt;: The string key, or keys, to use for this job&#039;s flavor text. If not set, they will be chosen randomly.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;hide_floor&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;boolean?&amp;lt;/code&amp;gt;: If true, the job&#039;s floor will be hidden when viewing the job inside menus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;monsterIDTable&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  Species:string,&lt;br /&gt;
  Form:integer,&lt;br /&gt;
  Skin:string,&lt;br /&gt;
  Gender:integer,&lt;br /&gt;
  Nickname:string?&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;itemTable&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;{id:string, count:integer?, hidden:string?}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MakeNewJob&amp;lt;/code&amp;gt; will return a fully-formed [[Mod:Nebula&#039;s Mission Board/ Job Table|JobTable]], which can then be edited further either indirectly or with other functions. Once you&#039;re done, however, you will need to add a BackReference to it, otherwise the game won&#039;t know where to send the player for the reward cutscene. This can be done in two ways, depending on what you want to accomplish; if you want to give the job directly to the player, you can do this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:SetBackReference(&amp;lt;job&amp;gt;, &amp;lt;board_id&amp;gt;)&lt;br /&gt;
MissionGen:AddJobToTaken(&amp;lt;job&amp;gt;, &amp;lt;startActive&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the JobTable.&lt;br /&gt;
* &amp;lt;code&amp;gt;board_id&amp;lt;/code&amp;gt; is the board the job should bring the player to after completing it.&lt;br /&gt;
* &amp;lt;code&amp;gt;startActive&amp;lt;/code&amp;gt; is an optional boolean that tells the game whether or not to set the job as active as it gets added to the taken list. Defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. &lt;br /&gt;
If, instead of giving it directly to the player, you want to add the job to a board, you can do this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:AddJobToBoard(&amp;lt;board_id&amp;gt;, &amp;lt;job&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;board_id&amp;lt;/code&amp;gt; is the board the job will be added to, and that will be set as BackReference.&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the JobTable.&lt;br /&gt;
With this done, the job is now fully set up and can be safely presented to the player.&lt;br /&gt;
&lt;br /&gt;
===== Custom text =====&lt;br /&gt;
You can further customize the jobs you create by editing the text displayed in the various fields of the job menu. There are a few functions that allow you to set overrides for some of the job&#039;s sensitive information:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:SetClientOverride(&amp;lt;job&amp;gt;, &amp;lt;string_key&amp;gt;)&lt;br /&gt;
MissionGen:SetObjectiveOverride(&amp;lt;job&amp;gt;, &amp;lt;string_key&amp;gt;)&lt;br /&gt;
MissionGen:SetDungeonOverride(&amp;lt;job&amp;gt;, &amp;lt;string_key&amp;gt;)&lt;br /&gt;
MissionGen:SetDifficultyOverride(&amp;lt;job&amp;gt;, &amp;lt;string_key&amp;gt;)&lt;br /&gt;
MissionGen:SetRewardOverride(&amp;lt;job&amp;gt;, &amp;lt;string_key&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the JobTable you want to edit.&lt;br /&gt;
* &amp;lt;code&amp;gt;string_key&amp;lt;/code&amp;gt; is the localization key of the string you want to set.&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Handcrafted_jobs&amp;diff=2829</id>
		<title>Mod:Nebula&#039;s Mission Board/ Handcrafted jobs</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Handcrafted_jobs&amp;diff=2829"/>
		<updated>2025-08-01T15:06:17Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: Account for 1.0.1 changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Mission Generation Library contains a method that allows the creation of basic jobs with arbitrarily chosen parameters. These jobs do not have to abide by any of the rules that the normal job generation uses, so do keep in mind that you might have to run a few checks to make sure you&#039;re not going off script, or to simply give the job to the player only when the rules are all respected. You can also choose not to care, of course, but that might have some consequences depending on what isn&#039;t being respected.&amp;lt;/br&amp;gt;&lt;br /&gt;
Here&#039;s a quick rundown of the rules followed by the library, and how to check if your desired job data would break them:&lt;br /&gt;
* &#039;&#039;&#039;No two jobs should be on the same floor&#039;&#039;&#039; - If this is not respected, the player will only be able to keep one of the jobs active at the same time.&lt;br /&gt;
: Check with: &amp;lt;code&amp;gt;MissionGen:IsDestinationOccupied(zone, segment, floor)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;The number of guest jobs in the same dungeon should not be higher than &amp;quot;max_guests&amp;quot;&#039;&#039;&#039; - This might make the adventure more difficult if &amp;quot;guests_take_up_space&amp;quot; is true, because the game might remove more party members than expected.&lt;br /&gt;
: Check with: &amp;lt;code&amp;gt;MissionGen:GetDungeonsGuestCount()[zone]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After handling all the rules you care about respecting, you can move on to actually creating the job. This is done with the following function:&lt;br /&gt;
&amp;lt;pre&amp;gt;MissionGen:MakeNewJob(zone, segment, floor, job_type, client, target, target_item, reward_type, rewards, title, flavor, hide_floor)&amp;lt;/pre&amp;gt;&lt;br /&gt;
As you can see, there are a lot of parameters, though the great majority of them is optional. Those that are will have a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; beside its type. Any missing parameter that is required for the given job type to function will be generated randomly:&lt;br /&gt;
* &amp;lt;code&amp;gt;zone&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: The id of the zone this job takes place in.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;segment&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: The specific segment this job takes place in.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: The destination floor of this job.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;job_type&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: The id of the type of this job. It must always be equal to one of the following values: &amp;quot;RESCUE_SELF&amp;quot;, &amp;quot;RESCUE_FRIEND&amp;quot;, &amp;quot;ESCORT&amp;quot;, &amp;quot;EXPLORATION&amp;quot;, &amp;quot;DELIVERY&amp;quot;, &amp;quot;LOST_ITEM&amp;quot;, &amp;quot;OUTLAW&amp;quot;, &amp;quot;OUTLAW_ITEM&amp;quot;, &amp;quot;OUTLAW_ITEM_UNK&amp;quot;, &amp;quot;OUTLAW_MONSTER_HOUSE&amp;quot;, &amp;quot;OUTLAW_FLEE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string|monsterIDTable&amp;lt;/code&amp;gt;: Data that will be used for the client of this job. If it&#039;s not a mosterIdTable (see below), it must be either &amp;quot;ENFORCER&amp;quot;, &amp;quot;OFFICER&amp;quot; or &amp;quot;AGENT&amp;quot;. A law enforcement character will be selected using different rules depending on the string.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string|monsterIDTable&amp;lt;/code&amp;gt;: Data that will be used for the target of this job. If it&#039;s not a mosterIdTable (see below), it must be either &amp;quot;ENFORCER&amp;quot;, &amp;quot;OFFICER&amp;quot; or &amp;quot;AGENT&amp;quot;. A law enforcement character will be selected using different rules depending on the string. This value will be used only if the job type requires a target.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_item&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string?&amp;lt;/code&amp;gt;: The id of the item that will be used as target. This value will be used only if the job type requires an item.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;reward_type&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string?&amp;lt;/code&amp;gt;: The combination of rewards that will be awarded for this job. It must always be equal to one of the following values: &amp;quot;item&amp;quot;, &amp;quot;money&amp;quot;, &amp;quot;item_item&amp;quot;, &amp;quot;money_item&amp;quot;, &amp;quot;client&amp;quot;, &amp;quot;exclusive&amp;quot;. If &amp;lt;code&amp;gt;rewards&amp;lt;/code&amp;gt; is set, this value will be inferred from the items used, even if a value was already provided.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;rewards&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;{string|itemTable?, string|itemTable?}&amp;lt;/code&amp;gt;: The item rewards that will be awarded for this job. If not set but &amp;lt;code&amp;gt;reward_type&amp;lt;/code&amp;gt; is, they will be generated automatically. You can either write only the id of the item, or use a full itemTable (see below). If the first item is nil, it will award money in its place.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string?&amp;lt;/code&amp;gt;: The string key to use for this job&#039;s title. If not set, it will be chosen randomly.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;flavor&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;{string, string?}?&amp;lt;/code&amp;gt;: The string key, or keys, to use for this job&#039;s flavor text. If not set, they will be chosen randomly.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;hide_floor&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;boolean?&amp;lt;/code&amp;gt;: If true, the job&#039;s floor will be hidden when viewing the job inside menus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;monsterIDTable&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  Species:string,&lt;br /&gt;
  Form:integer,&lt;br /&gt;
  Skin:string,&lt;br /&gt;
  Gender:integer,&lt;br /&gt;
  Nickname:string?&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;itemTable&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;{id:string, count:integer?, hidden:string?}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MakeNewJob&amp;lt;/code&amp;gt; will return a fully-formed [[Mod:Nebula&#039;s Mission Board/ Job Table|JobTable]], which can then be edited further either indirectly or with other functions. Once you&#039;re done, however, you will need to add a BackReference to it, otherwise the game won&#039;t know where to send the player for the reward cutscene. This can be done in two ways, depending on what you want to accomplish; if you want to give the job directly to the player, you can do this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:SetBackReference(&amp;lt;job&amp;gt;, &amp;lt;board_id&amp;gt;)&lt;br /&gt;
MissionGen:AddJobToTaken(&amp;lt;job&amp;gt;, &amp;lt;startActive&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the JobTable.&lt;br /&gt;
* &amp;lt;code&amp;gt;board_id&amp;lt;/code&amp;gt; is the board the job should bring the player to after completing it.&lt;br /&gt;
* &amp;lt;code&amp;gt;startActive&amp;lt;/code&amp;gt; is an optional boolean that tells the game whether or not to set the job as active as it gets added to the taken list. Defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. &lt;br /&gt;
If, instead of giving it directly to the player, you want to add the job to a board, you can do this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:AddJobToBoard(&amp;lt;board_id&amp;gt;, &amp;lt;job&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;board_id&amp;lt;/code&amp;gt; is the board the job will be added to, and that will be set as BackReference.&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the JobTable.&lt;br /&gt;
With this done, the job is now fully set up and can be safely presented to the player.&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Job_Table&amp;diff=2828</id>
		<title>Mod:Nebula&#039;s Mission Board/ Job Table</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Job_Table&amp;diff=2828"/>
		<updated>2025-08-01T15:03:46Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: /* ObjectiveOverride */ Account for 1.0.1 changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of all fields contained inside a Job Table.&amp;lt;/br&amp;gt;&lt;br /&gt;
Fields with a ? to their side can be safely set to &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; depending on the circumstances.&lt;br /&gt;
&lt;br /&gt;
==== Client ====&lt;br /&gt;
A MonsterID-style table describing the client of the job.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  Species:string,&lt;br /&gt;
  Form:integer?,&lt;br /&gt;
  Skin:string?,&lt;br /&gt;
  Gender:integer?,&lt;br /&gt;
  Nickname:string?&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Target ====&lt;br /&gt;
MonsterID style table describing the target. Must be set if the job type expects a target.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  Species:string,&lt;br /&gt;
  Form:integer?,&lt;br /&gt;
  Skin:string?,&lt;br /&gt;
  Gender:integer?,&lt;br /&gt;
  Nickname:string?&lt;br /&gt;
}?&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Flavor ====&lt;br /&gt;
Pair of string keys displayed when the job details are displayed. The second key is optional.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;{string, string?}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Title ====&lt;br /&gt;
String key displayed when browsing quest boards.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;string&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Zone ====&lt;br /&gt;
The id of the zone this job takes place in.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;string&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Segment ====&lt;br /&gt;
The specific segment this job takes place in.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;integer&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Floor ====&lt;br /&gt;
The destination floor of this job.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;integer&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== RewardType ====&lt;br /&gt;
The id of the combination of rewards that will be awarded by this job. It must always be equal to one of the following values:&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;money&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;item&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;money_item&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;item_item&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;client&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;exclusive&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;string&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Reward1 ====&lt;br /&gt;
Data of the first item awarded by the job. Must be set if RewardType expects a visible item reward.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;{id:string, count:integer?, hidden:string?}?&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Reward2 ====&lt;br /&gt;
Data of the second item awarded by the job. Must be set if RewardType expects a hidden item reward.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;{id:string, count:integer?, hidden:string?}?&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Type ====&lt;br /&gt;
The id of the type of this job. It must always be equal to one of the following values:&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;RESCUE_SELF&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;RESCUE_FRIEND&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;ESCORT&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;EXPLORATION&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;DELIVERY&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;LOST_ITEM&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;OUTLAW&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;OUTLAW_ITEM&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;OUTLAW_ITEM_UNK&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;OUTLAW_MONSTER_HOUSE&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;OUTLAW_FLEE&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;string&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Completion ====&lt;br /&gt;
The state of the job. -1 means failed. 0 means not completed. 1 means completed. This is always reset to 0 on day end if the job rewards are not claimed (like when an adventure is failed).&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;integer&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Taken ====&lt;br /&gt;
This variable means different things depending on what list this job is in:&lt;br /&gt;
* Taken list: if true, the job is active.&lt;br /&gt;
* Boards: if true, the job is considered to be inside the taken list.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;boolean&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== BackReference ====&lt;br /&gt;
Contains the id of the board it was in. It is used only in the taken list for discarding jobs and for routing the player during the reward process.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;string?&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Difficulty ====&lt;br /&gt;
The difficulty index of this job. It is stored as a number instead of a string for ease of calculations.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;integer&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Item ====&lt;br /&gt;
The id of the item this job requires. It must be set if the job type requires a target item.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;string?&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Special ====&lt;br /&gt;
Special jobs can be triggered sometimes. If so, this will contain the special job category id.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;string?&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== HideFloor ====&lt;br /&gt;
If this is true, the target floor of this job will be hidden when inside menus.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;boolean&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Callbacks ====&lt;br /&gt;
Table of callbacks with their respective parameters. Empty by default. You can add callbacks using the &amp;lt;code&amp;gt;RegisterCallback&amp;lt;/code&amp;gt; library function. Every job can only have one callback per event.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;table&amp;lt;string, {name:string, args:table}&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== MenuOverrides ====&lt;br /&gt;
String keys to be used instead of the normal ones in various places in the Job Menu. They only affect menus. Please refer to the normal usage of the string you&#039;re replacing for more info on its placeholders.  &lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;table&amp;lt;string, string&amp;gt;?&amp;lt;/pre&amp;gt;&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Editing_settings&amp;diff=2827</id>
		<title>Mod:Nebula&#039;s Mission Board/ Editing settings</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Editing_settings&amp;diff=2827"/>
		<updated>2025-08-01T14:17:59Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: Account for 1.0.1 changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Mission Generation Library is designed to be highly customizable. This choice is reflected in its &amp;lt;code&amp;gt;missiongen_settings.lua&amp;lt;/code&amp;gt; file. This file is what modders are supposed to edit, changing the values inside the giant table it defines.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a list of all settings in the library, with documentation:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sv_root_name ==&lt;br /&gt;
&lt;br /&gt;
Name of the SV table that will contain all stored data. Use a table to specify a deeper path. If not present in the SV structure, the defined path will be generated automatically. An empty list would just use SV as root.&amp;lt;/br&amp;gt;&lt;br /&gt;
Examples:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;jobs&amp;quot;&amp;lt;/code&amp;gt; would use &amp;lt;code&amp;gt;SV.jobs&amp;lt;/code&amp;gt; as its root.&lt;br /&gt;
* &amp;lt;code&amp;gt;{&amp;quot;adventure&amp;quot;, &amp;quot;jobs&amp;quot;}&amp;lt;/code&amp;gt; would use &amp;lt;code&amp;gt;SV.adventure.jobs&amp;lt;/code&amp;gt; as its root.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;jobs&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== boards ==&lt;br /&gt;
&lt;br /&gt;
A list of board ids and the data necessary to define their behavior.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format for each board:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;board_id&amp;gt;: {&lt;br /&gt;
  display_key: string,&lt;br /&gt;
  size: integer,&lt;br /&gt;
  location: {&lt;br /&gt;
    zone: string,&lt;br /&gt;
    map: integer&lt;br /&gt;
  },&lt;br /&gt;
  condition: function(library),&lt;br /&gt;
  job_types: {id = string, weight = integer}[]&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &amp;lt;board_id&amp;gt;: The id of the board. It will be used to identify and reference this specific board inside scripts&lt;br /&gt;
* display_key: the string key used when displaying the job menu for this board.  The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
* size: the amount of quests this board can hold at a time&lt;br /&gt;
* location: a zone id and a map index. This data is where the player will be brought for the job completion cutscene. All of these maps must call library:PlayJobsCompletedCutscene before fade-in for the reward sequence to work correctly.&lt;br /&gt;
* condition: Optional. A function called to determine if library:PopulateBoards() should fill out this board. It receives the library object as an argument and returns a boolean. If it returns true, the board is filled out. If it returns false, it is left empty. If this property is missing, this board will always be active.&lt;br /&gt;
* job_types: a list of job types and their probability weight. Higher weight means more common.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  quest_board = {&lt;br /&gt;
    display_key = &amp;quot;BOARD_QUEST_TITLE&amp;quot;,&lt;br /&gt;
    size = 8,&lt;br /&gt;
    location = {zone = &amp;quot;guildmaster_island&amp;quot;, map = 2},&lt;br /&gt;
    condition = function (library)&lt;br /&gt;
      local root = library.root&lt;br /&gt;
      local completed = 0&lt;br /&gt;
      for _, segments in pairs(root.dungeon_progress) do&lt;br /&gt;
        for _, state in pairs(segments) do&lt;br /&gt;
          if state then&lt;br /&gt;
            completed = completed + 1&lt;br /&gt;
            if completed&amp;gt;=3 then return true end&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      return false&lt;br /&gt;
    end,&lt;br /&gt;
    job_types = {&lt;br /&gt;
      {id = &amp;quot;RESCUE_SELF&amp;quot;, weight = 5},&lt;br /&gt;
      {id = &amp;quot;RESCUE_FRIEND&amp;quot;, weight = 5},&lt;br /&gt;
      {id = &amp;quot;ESCORT&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;EXPLORATION&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;DELIVERY&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;LOST_ITEM&amp;quot;, weight = 4},&lt;br /&gt;
      {id = &amp;quot;OUTLAW&amp;quot;, weight =  5},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_ITEM&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_ITEM_UNK&amp;quot;, weight = 1},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_MONSTER_HOUSE&amp;quot;, weight = 1},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_FLEE&amp;quot;, weight = 1}&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== end_dungeon_day_destination ==&lt;br /&gt;
&lt;br /&gt;
Zone and map id of the ground map where players will be sent to when a day ends and there is at least one mission to hand in. This map must contain a call to library:PlayJobsCompletedCutscene&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{zone: string, map: integer}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ zone = &amp;quot;guildmaster_island&amp;quot;, map = 2 },&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== after_rewards_function ==&lt;br /&gt;
&lt;br /&gt;
Function ran after the game is done with the job completion cutscene. It takes no arguments, and is not expected to return anything.&lt;br /&gt;
You can use it to fix up the game state however you like before returning control to the player.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
after_rewards_function = function()&lt;br /&gt;
  GAME:MoveCamera(0, 0, 1, true)&lt;br /&gt;
  SOUND:PlayBGM(SV.base_town.Song, true)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== taken_limit ==&lt;br /&gt;
&lt;br /&gt;
The maximum number of jobs that can be taken from job boards at a time.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;8&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== taken_jobs_start_active ==&lt;br /&gt;
&lt;br /&gt;
If true, taken jobs will be activated automatically. Players can always deactivate them manually if they so choose.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;true&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== max_guests ==&lt;br /&gt;
&lt;br /&gt;
The maximum amount of guest-based jobs that can be generated in the same dungeon.&amp;lt;/br&amp;gt;&lt;br /&gt;
Guest-based jobs are: ESCORT, EXPLORATION&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== guests_take_up_space ==&lt;br /&gt;
&lt;br /&gt;
The maximum amount of guest-based jobs that can be generated in the same dungeon.&amp;lt;/br&amp;gt;&lt;br /&gt;
Guest-based jobs are: ESCORT, EXPLORATION&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== min_party_limit ==&lt;br /&gt;
&lt;br /&gt;
Minimum number for the party limit when it is reduced because of guests.&lt;br /&gt;
This value cannot be lower than 1, for obvious reasons.&lt;br /&gt;
Any excess guests will simply add to the party count, without reducing the limit.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== losing_guests_means_defeat ==&lt;br /&gt;
&lt;br /&gt;
If true, losing any guest will count as a loss for the entire exploration.&lt;br /&gt;
If false, it will simply mark that specific job as failed.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_boss_steps_piority ==&lt;br /&gt;
&lt;br /&gt;
The priority of the SpawnOutlaw handler event. It can be either an integer or a list of integers.&lt;br /&gt;
This value should always be lower than dungeon_gen_steps_piority.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;-11&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_gen_steps_piority ==&lt;br /&gt;
&lt;br /&gt;
The priority that most of the job handlers will have when being added to the event list. It can be either an integer or a list of integers.&lt;br /&gt;
This value should always be equal to or higher than the priority set for the event that calls library:GenerateJobInFloor.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;-6&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_npc_steps_piority ==&lt;br /&gt;
&lt;br /&gt;
The priority that job npc spawners will have when being added to the event list. It can be either an integer or a list of integers.&lt;br /&gt;
This value should always be equal to or higher than dungeon_gen_steps_piority.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ 5, 2, 1 }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== difficulty_list ==&lt;br /&gt;
&lt;br /&gt;
A list of all difficulty rank id strings you want to use.&lt;br /&gt;
The order of these strings will define the difficulty scale used by the library.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ &amp;quot;F&amp;quot;, &amp;quot;E&amp;quot;, &amp;quot;D&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;A&amp;quot;, &amp;quot;S&amp;quot;, &amp;quot;STAR_1&amp;quot;, &amp;quot;STAR_2&amp;quot;, &amp;quot;STAR_3&amp;quot;, &amp;quot;STAR_4&amp;quot;, &amp;quot;STAR_5&amp;quot;, &amp;quot;STAR_6&amp;quot;, &amp;quot;STAR_7&amp;quot;, &amp;quot;STAR_8&amp;quot;, &amp;quot;STAR_9&amp;quot; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== difficulty_data ==&lt;br /&gt;
&lt;br /&gt;
All the data required to define difficulty rank behavior. There must be an entry for every rank defined in difficulty_list:&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;diff_id&amp;gt;: {display_key: string, money_reward: integer, extra_reward: integer, outlaw_level: integer, escort_level: integer}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;diff_id&amp;gt;: one of the difficulties defined in &amp;quot;difficulty_list&amp;quot;&lt;br /&gt;
* display_key: string key used when displaying the name of the rank.  The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
* money_reward: the amount of money awarded at the end of the job. If set to 0, money rewards will simply not award anything&lt;br /&gt;
* extra_reward: the points of extra reward awarded at the end of the job. What these points are depends on extra_reward_type. If set to 0, extra_reward_type will be considered to be &amp;quot;none&amp;quot;&lt;br /&gt;
* outlaw_level: Optional. The base level of all outlaws spawned by jobs with this difficulty. If omitted, it will be equal to the dungeon&#039;s expected level.&lt;br /&gt;
* escort_level: Optional. The level of all guests spawned by jobs with this difficulty. If omitted, it will be equal to the dungeon&#039;s expected level.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  F = {display_key = &amp;quot;RANK_STRING_F&amp;quot;, money_reward = 100, extra_reward = 0},&lt;br /&gt;
  E = {display_key = &amp;quot;RANK_STRING_E&amp;quot;, money_reward = 200, extra_reward = 100},&lt;br /&gt;
  D = {display_key = &amp;quot;RANK_STRING_D&amp;quot;, money_reward = 400, extra_reward = 200},&lt;br /&gt;
  C = {display_key = &amp;quot;RANK_STRING_C&amp;quot;, money_reward = 600, extra_reward = 400},&lt;br /&gt;
  B = {display_key = &amp;quot;RANK_STRING_B&amp;quot;, money_reward = 700, extra_reward = 1250},&lt;br /&gt;
  A = {display_key = &amp;quot;RANK_STRING_A&amp;quot;, money_reward = 1500, extra_reward = 2500},&lt;br /&gt;
  S = {display_key = &amp;quot;RANK_STRING_S&amp;quot;, money_reward = 3000, extra_reward = 5000},&lt;br /&gt;
  STAR_1 = {display_key = &amp;quot;RANK_STRING_STAR_1&amp;quot;, money_reward = 6000, extra_reward = 10000},&lt;br /&gt;
  STAR_2 = {display_key = &amp;quot;RANK_STRING_STAR_2&amp;quot;, money_reward = 10000, extra_reward = 20000},&lt;br /&gt;
  STAR_3 = {display_key = &amp;quot;RANK_STRING_STAR_3&amp;quot;, money_reward = 15000, extra_reward = 30000},&lt;br /&gt;
  STAR_4 = {display_key = &amp;quot;RANK_STRING_STAR_4&amp;quot;, money_reward = 20000, extra_reward = 40000},&lt;br /&gt;
  STAR_5 = {display_key = &amp;quot;RANK_STRING_STAR_5&amp;quot;, money_reward = 25000, extra_reward = 50000},&lt;br /&gt;
  STAR_6 = {display_key = &amp;quot;RANK_STRING_STAR_6&amp;quot;, money_reward = 30000, extra_reward = 60000},&lt;br /&gt;
  STAR_7 = {display_key = &amp;quot;RANK_STRING_STAR_7&amp;quot;, money_reward = 35000, extra_reward = 70000},&lt;br /&gt;
  STAR_8 = {display_key = &amp;quot;RANK_STRING_STAR_8&amp;quot;, money_reward = 40000, extra_reward = 80000},&lt;br /&gt;
  STAR_9 = {display_key = &amp;quot;RANK_STRING_STAR_9&amp;quot;, money_reward = 45000, extra_reward = 90000}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== guest_level_scaling ==&lt;br /&gt;
&lt;br /&gt;
Function that changes the level of guests based on the player&#039;s level. It must return the new level for the guest, or it will have no effect.&amp;lt;/br&amp;gt;&lt;br /&gt;
Arguments:&lt;br /&gt;
* lvl: base level of the guest.&lt;br /&gt;
* dungeon: if true, the level is the dungeon&#039;s recommended level. If false, it&#039;s taken from the difficulty data.&lt;br /&gt;
* avg_team_lvl: average level of the player team. It may or may not be an integer.&lt;br /&gt;
* hst_team_lvl: highest level in the player team.&lt;br /&gt;
* settings: the settings data structure itself&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(lvl, dungeon, avg_team_lvl, hst_team_lvl, settings)&lt;br /&gt;
  local add = 0&lt;br /&gt;
  if dungeon then lvl = lvl*4//5 end&lt;br /&gt;
  if avg_team_lvl &amp;gt; lvl then add = (avg_team_lvl - lvl) // 10 end&lt;br /&gt;
  return lvl + add&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== outlaw_level_scaling ==&lt;br /&gt;
&lt;br /&gt;
Function that changes the level of guests based on the player&#039;s level. It must return the new level for the guest, or it will have no effect.&amp;lt;/br&amp;gt;&lt;br /&gt;
Arguments:&lt;br /&gt;
* lvl: base level of the guest.&lt;br /&gt;
* dungeon: if true, the level is the dungeon&#039;s recommended level. If false, it&#039;s taken from the difficulty data.&lt;br /&gt;
* avg_team_lvl: average level of the player team. It may or may not be an integer.&lt;br /&gt;
* hst_team_lvl: highest level in the player team.&lt;br /&gt;
* settings: the settings data structure itself&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(lvl, dungeon, avg_team_lvl, hst_team_lvl, settings)&lt;br /&gt;
  local add = 0&lt;br /&gt;
  if dungeon then lvl = lvl*23//20 end&lt;br /&gt;
  if avg_team_lvl &amp;gt; lvl then add = (avg_team_lvl - lvl) // 8 end&lt;br /&gt;
  add = add + (hst_team_lvl - avg_team_lvl) // 4&lt;br /&gt;
  return lvl + add&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== apply_outlaw_changes ==&lt;br /&gt;
&lt;br /&gt;
Function that allows you to edit an outlaw&#039;s data just before they are spawned.&lt;br /&gt;
You can change just about anything except its position and recruitability state. Its HP will also&lt;br /&gt;
always be automatically set to full after this function is called.&lt;br /&gt;
You will also be unable to change the EquippedItem of an &amp;quot;OUTLAW_ITEM&amp;quot; or &amp;quot;OUTLAW_ITEM_UNK&amp;quot; outlaw.&amp;lt;/br&amp;gt;&lt;br /&gt;
Arguments:&lt;br /&gt;
* outlaw: the outlaw Character itself&lt;br /&gt;
* job: the current job data table&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(outlaw, job)&lt;br /&gt;
  local max_boost = PMDC.Data.MonsterFormData.MAX_STAT_BOOST&lt;br /&gt;
  outlaw.MaxHPBonus = math.min(outlaw.Level * max_boost // 64, max_boost);&lt;br /&gt;
  if job.Type == &amp;quot;OUTLAW_FLEE&amp;quot; then&lt;br /&gt;
    local speedMin = math.floor(outlaw.Level * 4 // 3)&lt;br /&gt;
    local speedMax = math.floor(outlaw.Level * 6 // 2)&lt;br /&gt;
    outlaw.SpeedBonus = math.min(_DATA.Save.Rand:Next(speedMin, speedMax), 100)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== fleeing_outlaw_restrictions ==&lt;br /&gt;
&lt;br /&gt;
A list of ids for types that are banned from ever being picked as fleeing outlaws.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ &amp;quot;ghost&amp;quot; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== outlaw_music_name ==&lt;br /&gt;
&lt;br /&gt;
The name of the outlaw music file. This file will be sourced from the Content/Music folder.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;Outlaw.ogg&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeons ==&lt;br /&gt;
&lt;br /&gt;
This is where dungeon difficulty is set. Quests can only generate for dungeons inside this list.&lt;br /&gt;
Given the complexity of this structure, it is best generated using the [[Mod:Nebula&#039;s Mission Board/ Editing settings#settings.AddDungeonSection(zone, segment, start, difficulty, finish, must_end)||AddDungeonSection]] function at the bottom of this page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_order ==&lt;br /&gt;
&lt;br /&gt;
Jobs are sorted by dungeon, following the order defined in this table. Missing dungeons are shoved at the bottom and sorted alphabetically.&lt;br /&gt;
This list is automatically populated in call order when using the &amp;quot;AddDungeonSection&amp;quot; function near the bottom of this file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== external_events ==&lt;br /&gt;
&lt;br /&gt;
A list of events unrelated to this library that can cause job generation to ignore a specific dungeon.&lt;br /&gt;
They can also be displayed in the objectives log if you so choose.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{condition: function(zone), message_key: string, message_args: function(zone), icon: string}&amp;lt;/code&amp;gt;&lt;br /&gt;
* condition: a function that takes a zone and returns a boolean. If it returns true, jobs will not be generated for this dungeon, and all already taken jobs will be automatically suspended.&lt;br /&gt;
* message_key: Optional. It will be used in the objectives log instead of the default message if the condition is true.&lt;br /&gt;
* message_args: Optional. If the message&#039;s localization string contains placeholders, this function is in charge of taking a zone and returning a list of values that will be used for those placeholders in the form of a table array (Up to 5).&lt;br /&gt;
* icon: Optional. The icon that will be displayed beside the corresponding dungeon in the dungeon selection menu if the condition is true for any of its segments. Defaults to &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  {condition = function(zone) return COMMON.HasSidequestInZone(zone) end, icon = &amp;quot;\\uE111&amp;quot;, message_key = &amp;quot;MENU_JOB_OBJECTIVE_DEFAULT&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== external_events_icon_mode ==&lt;br /&gt;
&lt;br /&gt;
How to display external event icons in the dungeon list. This value can only be either &amp;quot;FIRST&amp;quot; or ALL&amp;quot;.&lt;br /&gt;
* If set to &amp;quot;ALL&amp;quot;, they will always be displayed in the order defined by external_events. Only one copy of the same icon will be shown, no matter how many conditions require it.&lt;br /&gt;
* If set to &amp;quot;FIRST&amp;quot;, only the first event in the list&#039;s order will be displayed, no matter how many events are actually there. This setting does not prevent multiple messages from appearing in the objectives list.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;FIRST&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_list_pattern ==&lt;br /&gt;
&lt;br /&gt;
The pattern that will define how to display entries in the dungeon list.&amp;lt;/br&amp;gt;&lt;br /&gt;
{0} is the placeholder for the dungeon name, {1} for pending job icon and {2} for external condition icons.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;FIRST&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== job_types ==&lt;br /&gt;
&lt;br /&gt;
Table used to determine various properties regarding job types.&lt;br /&gt;
Remove a job type entirely to disable its generation altogether.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: {rank_modifier: integer, min_rank: string}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: one of RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
* rank_modifier (optional): these jobs will always have this modifier applied to their rank.&lt;br /&gt;
* min_rank (optional): this type of jobs can never be of a rank lower than this.&lt;br /&gt;
: This influences possible dungeon spawn: a rank_modifier 1 job with min_rank &amp;quot;C&amp;quot; can also spawn in &amp;quot;D&amp;quot; rank dungeons.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  RESCUE_SELF = {rank_modifier = 0, min_rank = &amp;quot;F&amp;quot;},&lt;br /&gt;
  RESCUE_FRIEND = {rank_modifier = 0, min_rank = &amp;quot;E&amp;quot;},&lt;br /&gt;
  ESCORT = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  EXPLORATION = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  DELIVERY = {rank_modifier = 0, min_rank = &amp;quot;D&amp;quot;},&lt;br /&gt;
  LOST_ITEM = {rank_modifier = 0, min_rank = &amp;quot;D&amp;quot;},&lt;br /&gt;
  OUTLAW = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  OUTLAW_ITEM = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  OUTLAW_ITEM_UNK = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  OUTLAW_MONSTER_HOUSE = {rank_modifier = 2, min_rank = &amp;quot;S&amp;quot;},&lt;br /&gt;
  OUTLAW_FLEE = {rank_modifier = 1, min_rank = &amp;quot;B&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_job_modifiers ==&lt;br /&gt;
&lt;br /&gt;
Special table that allows modders to specify chance multipliers for job types depending on the dungeon.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;dungeon_id&amp;gt;: {&amp;lt;job_type_id&amp;gt;: &amp;lt;multiplier&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;dungeon_id&amp;gt;: the string id of a dungeon&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: one of RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
* &amp;lt;multiplier&amp;gt;: a multiplier number. It doesn&#039;t need to be an integer. It will be multiplied with the board&#039;s base chances, rounding up, when choosing the type of a job. Set it to 0 or less to disable the job type altogether.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  ambush_forest = {&lt;br /&gt;
    OUTLAW = 3,&lt;br /&gt;
    OUTLAW_ITEM = 3,&lt;br /&gt;
    OUTLAW_ITEM_UNK = 3,&lt;br /&gt;
    OUTLAW_MONSTER_HOUSE = 3,&lt;br /&gt;
    OUTLAW_FLEE = 3&lt;br /&gt;
  },&lt;br /&gt;
  treacherous_mountain = {&lt;br /&gt;
    OUTLAW = 3,&lt;br /&gt;
    OUTLAW_ITEM = 3,&lt;br /&gt;
    OUTLAW_ITEM_UNK = 3,&lt;br /&gt;
    OUTLAW_MONSTER_HOUSE = 3,&lt;br /&gt;
    OUTLAW_FLEE = 3&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== special_chance ==&lt;br /&gt;
&lt;br /&gt;
Chance of special missions to be generated. Special missions are just handcrafted scenarios with specific client and target pairs and custom flavor texts. Set to 0 to disable altogether.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;0.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== special_jobs ==&lt;br /&gt;
&lt;br /&gt;
This is where you can define special cases for specific types of jobs.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;special_id&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: one of RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
* &amp;lt;special_id&amp;gt;: any id of your choosing except RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  RESCUE_FRIEND = {&amp;quot;CHILD&amp;quot;, &amp;quot;LOVER&amp;quot;, &amp;quot;RIVAL&amp;quot;, &amp;quot;FRIEND&amp;quot;}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== hidden_floor_chance ==&lt;br /&gt;
&lt;br /&gt;
Chance for supported quest types to have their destination floor hidden. Set to 0 to disable altogether.&amp;lt;/br&amp;gt;&lt;br /&gt;
Players will still be notified when reaching the floor. It just won&#039;t show in the quest description.&amp;lt;/br&amp;gt;&lt;br /&gt;
Job types that can have their floor hidden are: RESCUE_FRIEND, EXPLORATION, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_FLEE.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;0.15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== reward_types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A list of all types of rewards to be offered to players.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{id: string, weight: integer, min_rank: string}&amp;lt;/code&amp;gt;&lt;br /&gt;
* id: one of the supported reward types. You can use duplicate values to alter odds depending on job rank.&lt;br /&gt;
: Supported reward types are: item, money, item_item, money_item, client, exclusive&lt;br /&gt;
* weight: Chance of appearing. Set to 0 or delete altogether to stop a type of reward from being offered.&lt;br /&gt;
* min_rank: optional. If set, this type of reward will only be offered if the job is this rank or higher.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  {id = &amp;quot;item&amp;quot;, weight = 6},&lt;br /&gt;
  {id = &amp;quot;money&amp;quot;, weight = 2},&lt;br /&gt;
  {id = &amp;quot;item_item&amp;quot;, weight = 3},&lt;br /&gt;
  {id = &amp;quot;money_item&amp;quot;, weight = 1},&lt;br /&gt;
  {id = &amp;quot;client&amp;quot;, weight = 1, min_rank = &amp;quot;STAR_1&amp;quot;},&lt;br /&gt;
  {id = &amp;quot;exclusive&amp;quot;, weight = 1, min_rank = &amp;quot;STAR_4&amp;quot;}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== extra_reward_type ==&lt;br /&gt;
&lt;br /&gt;
The type of extra reward for all quests. It can be &amp;quot;none&amp;quot;, &amp;quot;rank&amp;quot; or &amp;quot;exp&amp;quot;. Any other value will result in &amp;quot;none&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;exp&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== rewards_per_difficulty ==&lt;br /&gt;
&lt;br /&gt;
This table assigns different weights to reward pools depending on the difficulty rank of the mission.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;diff_id&amp;gt;: {id: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;diff_id&amp;gt;: one of the difficulties defined in difficulty_list&amp;quot;&lt;br /&gt;
* id: the id of one of the reward pools defined in &amp;quot;reward_pools&amp;quot;&lt;br /&gt;
* weight: Chance of appearing. Set to 0 or delete altogether to stop a reward pool from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  F = {&lt;br /&gt;
    {id = &amp;quot;NECESSITIES&amp;quot;, weight = 10}&lt;br /&gt;
  },&lt;br /&gt;
  E = {&lt;br /&gt;
    {id = &amp;quot;NECESSITIES&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;APRICORN_GENERIC&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;FOOD_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;SEED_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;HELD_LOW&amp;quot;, weight = 3},&lt;br /&gt;
    {id = &amp;quot;LOOT_LOW&amp;quot;, weight = 3},&lt;br /&gt;
    {id = &amp;quot;EVO_ITEMS&amp;quot;, weight = 1},&lt;br /&gt;
    {id = &amp;quot;WANDS_LOW&amp;quot;, weight = 10}&lt;br /&gt;
  },&lt;br /&gt;
  D = {&lt;br /&gt;
    {id = &amp;quot;NECESSITIES&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;AMMO_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;APRICORN_GENERIC&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;APRICORN_TYPED&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;FOOD_LOW&amp;quot;, weight = 4},&lt;br /&gt;
    {id = &amp;quot;SEED_LOW&amp;quot;, weight = 4},&lt;br /&gt;
    {id = &amp;quot;SEED_MID&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;HELD_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;HELD_TYPE&amp;quot;, weight = 3},&lt;br /&gt;
    {id = &amp;quot;LOOT_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;EVO_ITEMS&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;ORBS_LOW&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;WANDS_LOW&amp;quot;, weight = 4},&lt;br /&gt;
    {id = &amp;quot;WANDS_MID&amp;quot;, weight = 10},&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== reward_pools ==&lt;br /&gt;
&lt;br /&gt;
List of all reward pools and the items they contain. You must at least include all pools referenced in the rewards_per_difficulty table, but you can add more.&amp;lt;/br&amp;gt;&lt;br /&gt;
Entry ids may be either items or other pools. A pool doesn&#039;t have to only contain one of the two.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;pool id&amp;gt;: {id: string, count: integer, hidden: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;pool_id&amp;gt;: the id of the pool. It should be used somewhere else either in this table or in rewards_per_difficulty.&lt;br /&gt;
* id: item_id or pool_id. If it matches a pool, count and hidden will be ignored.&lt;br /&gt;
* count: Optional. The amount of items awarded. It cannot be higher than the item&#039;s max stack. Defaults to the item&#039;s max stack.&lt;br /&gt;
* hidden: Optional. Hidden value that can be used for various purposes depending on the item. Defaults to &amp;quot;&amp;quot;.&lt;br /&gt;
* weight: Chance of appearing. Set to 0 or delete altogether to stop an entry from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  NECESSITIES = {&lt;br /&gt;
    {id = &amp;quot;seed_reviver&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;berry_leppa&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;berry_oran&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;berry_lum&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;food_apple&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;orb_escape&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;apricorn_plain&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;key&amp;quot;,count = 3,  weight = 2}&lt;br /&gt;
  },&lt;br /&gt;
  AMMO_LOW = {&lt;br /&gt;
    {id = &amp;quot;ammo_iron_thorn&amp;quot;, count = 3, weight = 5},&lt;br /&gt;
    {id = &amp;quot;ammo_geo_pebble&amp;quot;, count = 3, weight = 1},&lt;br /&gt;
    {id = &amp;quot;ammo_stick&amp;quot;, count = 3, weight = 1},&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== target_items ==&lt;br /&gt;
&lt;br /&gt;
Ids of items that can be used as targets, divided depending on the job type.&lt;br /&gt;
Make sure they&#039;re either easy enough to obtain or impossible to lose, depending on the job.&lt;br /&gt;
Using stackable items is highly discouraged for all job types, as it may result in odd behaviors.&amp;lt;/br&amp;gt;&lt;br /&gt;
&#039;&#039;Please keep in mind that if you want to use the &amp;quot;mission_&amp;quot; items shown in the example you must either recreate them or copy them over from the example mod.&#039;&#039;&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;item_id&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: the id of a job type defined inside &amp;quot;job_types&amp;quot;&lt;br /&gt;
* &amp;lt;item_id&amp;gt;: the id of the item to use&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  LOST_ITEM = {&lt;br /&gt;
    &amp;quot;mission_lost_scarf&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_lost_specs&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_lost_band&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  OUTLAW_ITEM = {&lt;br /&gt;
    &amp;quot;mission_stolen_scarf&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_stolen_band&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_stolen_specs&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  DELIVERY = {&lt;br /&gt;
    &amp;quot;berry_oran&amp;quot;,&lt;br /&gt;
    &amp;quot;berry_leppa&amp;quot;,&lt;br /&gt;
    &amp;quot;food_apple&amp;quot;,&lt;br /&gt;
    &amp;quot;berry_lum&amp;quot;,&lt;br /&gt;
    &amp;quot;apricorn_plain&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== difficulty_to_tier ==&lt;br /&gt;
&lt;br /&gt;
Weighted table that associates mission difficulty to a specific tier of characters and outlaws.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;diff_id&amp;gt;: {id: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;diff_id&amp;gt;: one of the difficulties defined in &amp;quot;difficulty_list&amp;quot;&lt;br /&gt;
* id: A string that defines a pokémon tier id.&lt;br /&gt;
* weight: Chance of being picked. Set to 0 or delete altogether to stop an entry from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  F = {&lt;br /&gt;
    {id = &amp;quot;TIER_LOW&amp;quot;, weight = 10}&lt;br /&gt;
  },&lt;br /&gt;
  E = {&lt;br /&gt;
    {id = &amp;quot;TIER_LOW&amp;quot;, weight = 9},&lt;br /&gt;
    {id = &amp;quot;TIER_MID&amp;quot;, weight = 1}&lt;br /&gt;
  },&lt;br /&gt;
  D = {&lt;br /&gt;
    {id = &amp;quot;TIER_LOW&amp;quot;, weight = 7},&lt;br /&gt;
    {id = &amp;quot;TIER_MID&amp;quot;, weight = 3}&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== pokemon ==&lt;br /&gt;
&lt;br /&gt;
A list of Pokémon that will be used for job generation, sorted by arbitrary quest tiers.&lt;br /&gt;
Any of these entries may be picked when choosing client and target.&lt;br /&gt;
If the client picked is not in the seen dex, the reward type can never be &amp;quot;client&amp;quot; nor &amp;quot;exclusive&amp;quot;.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;tier&amp;gt;: &amp;lt;monster_id&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;tier&amp;gt;: one of the tier ids used in difficulty_to_tier&lt;br /&gt;
* &amp;lt;monster_id&amp;gt;: either the species id of a pokémon or a MonsterIDTable&lt;br /&gt;
Format of MonsterIDTable: see the &amp;quot;monsterIdTemplate&amp;quot; function in missiongen_lib.lua&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  TIER_LOW = {&lt;br /&gt;
&amp;quot;abra&amp;quot;,&amp;quot;amaura&amp;quot;,&amp;quot;anorith&amp;quot;,&amp;quot;applin&amp;quot;,&amp;quot;archen&amp;quot;,&amp;quot;aron&amp;quot;,&amp;quot;arrokuda&amp;quot;,&amp;quot;axew&amp;quot;,&amp;quot;azurill&amp;quot;, [...]&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== job_titles ==&lt;br /&gt;
&lt;br /&gt;
A list of all possible job display titles, divided by job type.&lt;br /&gt;
You must also include lists for any special job types you intend to use.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;string_key&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: either the id of a job type defined inside &amp;quot;job_types&amp;quot;, or the id of a special job type&lt;br /&gt;
* &amp;lt;string_key&amp;gt;: the localization key used for the title. The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
* {3}: client&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  RESCUE_SELF = {&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_001&amp;quot;,&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_002&amp;quot;,&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_003&amp;quot;,&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_004&amp;quot;,&lt;br /&gt;
    [...]&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== job_flavor ==&lt;br /&gt;
&lt;br /&gt;
A list of all possible job flavor text entries, divided by job type and by line.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: {&amp;lt;string_key&amp;gt;[], &amp;lt;string_key&amp;gt;[]}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: either the id of a job type defined inside &amp;quot;job_types&amp;quot;, or the id of a special job type&lt;br /&gt;
* &amp;lt;string_key&amp;gt;: the localization key used for the flavor text. Every job has 2 lists assigned: one for the top string and one for the bottom one.&lt;br /&gt;
If only the first list is specified, the second one will be left empty.&lt;br /&gt;
The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
* {3}: client&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  RESCUE_SELF = {&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_001&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_002&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_003&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_004&amp;quot;,&lt;br /&gt;
      [...]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;MISSION_BODY_BOTTOM_RESCUE_SELF_001&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_BOTTOM_RESCUE_SELF_002&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_BOTTOM_RESCUE_SELF_003&amp;quot;,&lt;br /&gt;
      [...]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== law_enforcement ==&lt;br /&gt;
&lt;br /&gt;
Law enforcement characters in your setting. All OUTLAW jobs except OUTLAW_ITEM and OUTLAW_ITEM_UNK use these characters as job clients.&lt;br /&gt;
You may specify only 1 officer, and then a list containing any number of agents. Two of the latter will be randomly picked every time the job completion cutscene is played.&amp;lt;/br&amp;gt;&lt;br /&gt;
You may add a weight property to agents to specify a custom chance of being picked. Any without will&lt;br /&gt;
have a weight of 1.&amp;lt;/br&amp;gt;&lt;br /&gt;
Add &amp;quot;unique = true&amp;quot; to the MonsterIDTable to stop an agent from being picked twice. You must&lt;br /&gt;
have at least either 1 non-unique agent or 2 unique ones for this list table to be valid.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format of MonsterIDTable: see the &amp;quot;monsterIdTemplate&amp;quot; function in missiongen_lib.lua&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  OFFICER = {Species = &amp;quot;magnezone&amp;quot;, Gender = 0},&lt;br /&gt;
  AGENT = {&lt;br /&gt;
    {Species = &amp;quot;magnemite&amp;quot;, Gender = 0, Weight = 31},&lt;br /&gt;
    {Species = &amp;quot;magnemite&amp;quot;, Gender = 0, Skin = &amp;quot;shiny&amp;quot;, Weight = 1, Unique = true}&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== enforcer_chance ==&lt;br /&gt;
&lt;br /&gt;
Defines the chance of either the officer or an agent being the client of a mission depending on the character tier of the mission, as defined in difficulty_to_tier.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;tier&amp;gt;: {id: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;tier&amp;gt;: one of the tier ids used in difficulty_to_tier&lt;br /&gt;
* id: One of: OFFICER, AGENT&lt;br /&gt;
* index: Optional. Ignored if id is OFFICER. You can set it to specify a specific agent instead of rolling using their chance in &amp;quot;law_enforcement&amp;quot;.&lt;br /&gt;
* weight: Chance of being picked. Set to 0 or delete altogether to stop an entry from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  TIER_LOW = {&lt;br /&gt;
    {id = &amp;quot;OFFICER&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;AGENT&amp;quot;, weight = 8}&lt;br /&gt;
  },&lt;br /&gt;
  TIER_MID = {&lt;br /&gt;
    {id = &amp;quot;OFFICER&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;AGENT&amp;quot;, weight = 5}&lt;br /&gt;
  },&lt;br /&gt;
  TIER_HIGH = {&lt;br /&gt;
    {id = &amp;quot;OFFICER&amp;quot;, weight = 8},&lt;br /&gt;
    {id = &amp;quot;AGENT&amp;quot;, weight = 2}&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== special_data ==&lt;br /&gt;
&lt;br /&gt;
Data of characters and flavor key used for special jobs, divided by tier.&lt;br /&gt;
In outlaw related quests, you may use ENFORCER as a keyword for a random law enforcement character.&lt;br /&gt;
You may also use OFFICER or AGENT to specify a more specific selection.&lt;br /&gt;
These keywords can only be used in place of MonsterIDTables.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;special_type&amp;gt;: {&amp;lt;tier&amp;gt;: {client: MonsterIDTable, target: MonsterIDTable, item: string, flavor: string}[]}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;special_type&amp;gt;: an id of your choosing. It must be different from any basic job id&lt;br /&gt;
* &amp;lt;tier&amp;gt;: one of the tier ids used in difficulty_to_tier&lt;br /&gt;
* client: the data used to generate this Pokémon.&lt;br /&gt;
* target: the data used to generate this Pokémon.  Only used in job types that require a target.&lt;br /&gt;
* item: the id of the item that will be used for this job. Only used in job types that require an item.&lt;br /&gt;
* flavor: flavor string key used for the job, sourced from the Menu Text list (strings.resx)&lt;br /&gt;
Format of MonsterIDTable: see the &amp;quot;monsterIdTemplate&amp;quot; function in missiongen_lib.lua&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
* {3}: client&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  LOVER = {&lt;br /&gt;
    TIER_LOW = {&lt;br /&gt;
      {client = {Species = &amp;quot;volbeat&amp;quot;, Gender = 1}, target = {Species = &amp;quot;illumise&amp;quot;, Gender = 2}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_001&amp;quot;},&lt;br /&gt;
      {client = {Species = &amp;quot;minun&amp;quot;, Gender = 1}, target = {Species = &amp;quot;plusle&amp;quot;, Gender = 2}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_002&amp;quot;},&lt;br /&gt;
      {client = {Species = &amp;quot;mareep&amp;quot;, Gender = 2}, target = {Species = &amp;quot;wooloo&amp;quot;, Gender = 1}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_003&amp;quot;},&lt;br /&gt;
      [...]&lt;br /&gt;
    },&lt;br /&gt;
    TIER_MID = {&lt;br /&gt;
      {client = {Species = &amp;quot;miltank&amp;quot;, Gender = 2}, target = {Species = &amp;quot;tauros&amp;quot;, Gender = 1}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_005&amp;quot;},&lt;br /&gt;
      {client = {Species = &amp;quot;venomoth&amp;quot;, Gender = 1}, target = {Species = &amp;quot;butterfree&amp;quot;, Gender = 2}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_006&amp;quot;},&lt;br /&gt;
      [...]&lt;br /&gt;
    },&lt;br /&gt;
    [...]&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== escort_talks ==&lt;br /&gt;
&lt;br /&gt;
String keys to be used whenever the player interacts with an escort mission client, depending on the job type.&lt;br /&gt;
You can also include tables for special escort jobs. If no such table exists for a specific case, the generic table for the job type will be used.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;string_key&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: &amp;quot;ESCORT&amp;quot;, &amp;quot;EXPLORATION&amp;quot;, or the id of a special job type that corresponds to one of these job types&lt;br /&gt;
* &amp;lt;string_key&amp;gt;: the localization key of possible messages. The localized strings are fetched from the Gameplay Text list (stringsEx.resx)&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  ESCORT = {&lt;br /&gt;
    &amp;quot;MISSION_ESCORT_INTERACT&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  EXPLORATION = {&lt;br /&gt;
    &amp;quot;MISSION_EXPLORATION_INTERACT&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== rescue_responses ==&lt;br /&gt;
&lt;br /&gt;
Strings keys to be used whenever the player interacts with a pokémon that needs rescue, depending on the job type and the response given.&lt;br /&gt;
You must include a &amp;quot;_DEFAULT&amp;quot; table, but you can also include tables for special job types. _DEFAULT will still be used for any special&lt;br /&gt;
case that doesn&#039;t have a table associated with it.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{rescue_yes: {&amp;lt;case_id&amp;gt;: {key: string, emotion: string}[]}, rescue_no: {&amp;lt;case_id&amp;gt;: {key: string, emotion: string}[]}}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;case_id&amp;gt;: &amp;quot;_DEFAULT&amp;quot;, or the id of a special job type that corresponds to either &amp;quot;RESCUE_SELF&amp;quot; or &amp;quot;RESCUE_FRIEND&amp;quot;&lt;br /&gt;
* key: the localization key of possible messages. The localized strings are fetched from the Gameplay Text list (stringsEx.resx)&lt;br /&gt;
* emotion: Optional. An emotion id to use with this specific message. Defaults to &amp;quot;Normal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: client&lt;br /&gt;
* {1}: target&lt;br /&gt;
* {2}: dungeon&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  rescue_yes = {&lt;br /&gt;
    _DEFAULT = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_DEFAULT&amp;quot;} },&lt;br /&gt;
    CHILD  = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_CHILD&amp;quot;, emotion = &amp;quot;Joyous&amp;quot;} },&lt;br /&gt;
    FRIEND = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_FRIEND&amp;quot;} },&lt;br /&gt;
    RIVAL  = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_RIVAL&amp;quot;} },&lt;br /&gt;
    LOVER  = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_LOVER&amp;quot;, emotion = &amp;quot;Joyous&amp;quot;} }&lt;br /&gt;
  },&lt;br /&gt;
  rescue_no = {&lt;br /&gt;
    _DEFAULT = { {key = &amp;quot;MISSION_RESCUE_DENY_DEFAULT&amp;quot;, emotion = &amp;quot;Surprised&amp;quot;} },&lt;br /&gt;
    CHILD  = { {key = &amp;quot;MISSION_RESCUE_DENY_CHILD&amp;quot;, emotion = &amp;quot;Crying&amp;quot;} },&lt;br /&gt;
    FRIEND = { {key = &amp;quot;MISSION_RESCUE_DENY_FRIEND&amp;quot;, emotion = &amp;quot;Surprised&amp;quot;} },&lt;br /&gt;
    RIVAL  = { {key = &amp;quot;MISSION_RESCUE_DENY_RIVAL&amp;quot;, emotion = &amp;quot;Stunned&amp;quot;} },&lt;br /&gt;
    LOVER  = { {key = &amp;quot;MISSION_RESCUE_DENY_LOVER&amp;quot;, emotion = &amp;quot;Stunned&amp;quot;} }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== mission_callback_root ==&lt;br /&gt;
&lt;br /&gt;
The object that contains job callback functions. It is recommended to define this object somewhere else.&amp;lt;/br&amp;gt;&lt;br /&gt;
Job callbacks are stored inside jobs as strings. These strings are then used as an index in the callback root object to retrieve the actual function.&lt;br /&gt;
&lt;br /&gt;
The callback system is a pretty involved one, that gives a modder the ability to handcraft entirely new types of jobs if they so choose, but is also pretty difficult to handle, so it will be discussed in [[Mod:Nebula&#039;s Mission Board/ Job callbacks|its own guide]].&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;COMMON&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== settings.AddDungeonSection(zone, segment, start, difficulty, finish, must_end) ==&lt;br /&gt;
&lt;br /&gt;
Adds a new dungeon section to the list of possible job destinations.&lt;br /&gt;
Section start values must always be added in ascending order. Failing to do so may cause inconsistent behaviors.&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;zone&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: the string id of the dungeon zone.&lt;br /&gt;
* &amp;lt;code&amp;gt;segment&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: the numeric id of the dungeon segment.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: the starting floor of this dungeon section (start counting from 1 for this).&lt;br /&gt;
* &amp;lt;code&amp;gt;difficulty&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: the string id of the difficulty assigned to this section.&lt;br /&gt;
* &amp;lt;code&amp;gt;finish&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: Only considered when first adding a segment to the list. Can be omitted otherwise. This will be the last floor of the segment where jobs can spawn (start counting from 1 for this). If higher than the dungeon floors, it will default to the full dungeon length.&lt;br /&gt;
* &amp;lt;code&amp;gt;must_end&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; Only considered when first adding a segment to the list. Can be omitted otherwise. If true, this segment must be completed before jobs can spawn in it. If false, the segment must be accessed at least once, unless it&#039;s segment 0, which just needs to be unlocked. Defaults to true.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
settings.AddDungeonSection(&amp;quot;faultline_ridge&amp;quot;, 0, 6, &amp;quot;D&amp;quot;, 10)&lt;br /&gt;
settings.AddDungeonSection(&amp;quot;sickly_hollow&amp;quot;, 0, 9, &amp;quot;S&amp;quot;, 16, false)&lt;br /&gt;
settings.AddDungeonSection(&amp;quot;sickly_hollow&amp;quot;, 0, 13, &amp;quot;STAR_1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Job_callbacks&amp;diff=2826</id>
		<title>Mod:Nebula&#039;s Mission Board/ Job callbacks</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Job_callbacks&amp;diff=2826"/>
		<updated>2025-07-30T15:43:09Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: Make page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The library contains a callback system that allows modders to attach code to specific jobs to customize their behavior. It functions very similarly to how the base game handles scripted events: you attach a function name and a series of arguments to an id, and the system will fetch a function from somewhere, passing those arguments to it. Let&#039;s see exactly how this works.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
There are a few places in which the library checks a job&#039;s &amp;lt;code&amp;gt;Callback&amp;lt;/code&amp;gt; field. These are called &amp;quot;events&amp;quot;, and there are nine in total. Most events can also be interrupted; we will discuss how to do that next.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;JobTake&amp;quot;&amp;lt;/code&amp;gt;: Happens when a job is taken using the board menu, or when &amp;lt;code&amp;gt;MissionGen:TakeJob(&amp;lt;board_id&amp;gt;, &amp;lt;index&amp;gt;)&amp;lt;/code&amp;gt; is called directly. Interrupting this event will cause it to not add the job to the taken list or mark it as taken.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;JobActivate&amp;quot;&amp;lt;/code&amp;gt;: Called when a job is activated from the taken menu, or when &amp;lt;code&amp;gt;MissionGen:ToggleTakenJob(&amp;lt;index&amp;gt;)&amp;lt;/code&amp;gt; is called directly on a currently inactive job. Interrupting this event will cause the job to not be activated.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;JobDeactivate&amp;quot;&amp;lt;/code&amp;gt; Called when a job is deactivated from the taken menu, or when &amp;lt;code&amp;gt;MissionGen:ToggleTakenJob(&amp;lt;index&amp;gt;)&amp;lt;/code&amp;gt; is called directly on a currently active job. Interrupting this event will cause the job to not be deactivated.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;DungeonStart&amp;quot;&amp;lt;/code&amp;gt; Called right before checking if the job is supposed to have a guest. This event cannot be interrupted.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;FloorStart&amp;quot;&amp;lt;/code&amp;gt; Called at the start of the destination floor of a job. Interrupting this event will prevent any battle event and floor generation step normally required by the job&#039;s type from occurring at all. &lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;JobComplete&amp;quot;&amp;lt;/code&amp;gt; Called when a job is marked as completed, or when &amp;lt;code&amp;gt;MissionGen:MarkJobCompleted(&amp;lt;job&amp;gt;)&amp;lt;/code&amp;gt; is called directly. Interrupting this event will prevent the job from being marked as completed.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;JobFail&amp;quot;&amp;lt;/code&amp;gt; Called when a job is marked as failed, or when &amp;lt;code&amp;gt;MissionGen:MarkJobFailed(&amp;lt;job&amp;gt;)&amp;lt;/code&amp;gt; is called directly. Interrupting this event will prevent the job from being marked as failed.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;BeforeReward&amp;quot;&amp;lt;/code&amp;gt; Called right before the reward cutscene is about to start for a specific job. Interrupting this event will skip the cutscene altogether.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;AfterReward&amp;quot;&amp;lt;/code&amp;gt; Called right after the reward cutscene ends for a specific job. Interrupting this event will prevent the job from being removed from the taken list.&lt;br /&gt;
&lt;br /&gt;
By attaching code to these events, one can change how the library handles a job; jobs that unlock their target dungeons when activated become possible, for example. Expert modders might even be able to create completely new types of jobs, given enough effort.&lt;br /&gt;
&lt;br /&gt;
=== The Event Table ===&lt;br /&gt;
When an event is called, a small table of data is generated and then passed to whatever callback is assigned to it. This table contains the following data:&lt;br /&gt;
* &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt;: Begins equal to false. If true, it will interrupt the event if possible.&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;[[Mod:Nebula&#039;s Mission Board/ Job Table|JobTable]]&amp;lt;/code&amp;gt;: The job that this instance of the event applies to.&lt;br /&gt;
&lt;br /&gt;
This gives you full access to all data stored inside the job table, making it easy to write general purpose functions. Plus, as you can see, interrupting an event is as easy as setting &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. The table will then be returned to the event-calling code, which will check for the field&#039;s state and react accordingly.&lt;br /&gt;
&lt;br /&gt;
== Callbacks ==&lt;br /&gt;
To use the callback system, you first need to set the [[Mod:Nebula&#039;s Mission Board/ Editing settings#mission_callback_root|mission_callback_root]] setting to a global table of your choice. All callbacks will then need to be stored inside that table. Furthermore, this is what their signature should look like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(&amp;lt;evt&amp;gt;, &amp;lt;args&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;evt&amp;lt;/code&amp;gt; is the event table discussed above&lt;br /&gt;
* &amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt; is the list of arguments set when registering the callback.&lt;br /&gt;
&lt;br /&gt;
Any changes to the job table will be kept after the callback ends, so you can even use this to change the job&#039;s properties if you want.&lt;br /&gt;
&lt;br /&gt;
=== Registering a callback ===&lt;br /&gt;
Once you have your callback ready, you need to register it to a job. This is done by using this function:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:RegisterCallback(&amp;lt;job&amp;gt;, &amp;lt;event&amp;gt;, &amp;lt;func&amp;gt;, &amp;lt;args&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the job table to add the callback to.&lt;br /&gt;
* &amp;lt;code&amp;gt;event&amp;lt;/code&amp;gt; is the id of the event to subscribe to, as discussed at the top.&lt;br /&gt;
* &amp;lt;code&amp;gt;func&amp;lt;/code&amp;gt; is the name of the callback function.&lt;br /&gt;
* &amp;lt;code&amp;gt;event&amp;lt;/code&amp;gt; is optional, and is the table of arguments to pass to this instance of the callback. If not set, it defaults to an empty table. You should not save C# objects or functions in here, because they wouldn&#039;t be saved correctly.&lt;br /&gt;
&lt;br /&gt;
This will make it so that the given function is called when the given event is triggered. Do keep in mind that only one callback per event can be registered inside a job. Trying to register a second function will remove the previous one.&lt;br /&gt;
&lt;br /&gt;
Once your callback is registered, just give the job to the player in some way, and you&#039;re good to go.&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Editing_settings&amp;diff=2825</id>
		<title>Mod:Nebula&#039;s Mission Board/ Editing settings</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Editing_settings&amp;diff=2825"/>
		<updated>2025-07-30T13:55:49Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: /* mission_callback_root */  Redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Mission Generation Library is designed to be highly customizable. This choice is reflected in its &amp;lt;code&amp;gt;missiongen_settings.lua&amp;lt;/code&amp;gt; file. This file is what modders are supposed to edit, changing the values inside the giant table it defines.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a list of all settings in the library, with documentation:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sv_root_name ==&lt;br /&gt;
&lt;br /&gt;
Name of the SV table that will contain all stored data. Use a table to specify a deeper path. If not present in the SV structure, the defined path will be generated automatically. An empty list would just use SV as root.&amp;lt;/br&amp;gt;&lt;br /&gt;
Examples:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;jobs&amp;quot;&amp;lt;/code&amp;gt; would use &amp;lt;code&amp;gt;SV.jobs&amp;lt;/code&amp;gt; as its root.&lt;br /&gt;
* &amp;lt;code&amp;gt;{&amp;quot;adventure&amp;quot;, &amp;quot;jobs&amp;quot;}&amp;lt;/code&amp;gt; would use &amp;lt;code&amp;gt;SV.adventure.jobs&amp;lt;/code&amp;gt; as its root.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;jobs&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== boards ==&lt;br /&gt;
&lt;br /&gt;
A list of board ids and the data necessary to define their behavior.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format for each board:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;board_id&amp;gt;: {&lt;br /&gt;
  display_key: string,&lt;br /&gt;
  size: integer,&lt;br /&gt;
  location: {&lt;br /&gt;
    zone: string,&lt;br /&gt;
    map: integer&lt;br /&gt;
  },&lt;br /&gt;
  condition: function(library),&lt;br /&gt;
  job_types: {id = string, weight = integer}[]&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &amp;lt;board_id&amp;gt;: The id of the board. It will be used to identify and reference this specific board inside scripts&lt;br /&gt;
* display_key: the string key used when displaying the job menu for this board.  The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
* size: the amount of quests this board can hold at a time&lt;br /&gt;
* location: a zone id and a map index. This data is where the player will be brought for the job completion cutscene. All of these maps must call library:PlayJobsCompletedCutscene before fade-in for the reward sequence to work correctly.&lt;br /&gt;
* condition: Optional. A function called to determine if library:PopulateBoards() should fill out this board. It receives the library object as an argument and returns a boolean. If it returns true, the board is filled out. If it returns false, it is left empty. If this property is missing, this board will always be active.&lt;br /&gt;
* job_types: a list of job types and their probability weight. Higher weight means more common.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  quest_board = {&lt;br /&gt;
    display_key = &amp;quot;BOARD_QUEST_TITLE&amp;quot;,&lt;br /&gt;
    size = 8,&lt;br /&gt;
    location = {zone = &amp;quot;guildmaster_island&amp;quot;, map = 2},&lt;br /&gt;
    condition = function (library)&lt;br /&gt;
      local root = library.root&lt;br /&gt;
      local completed = 0&lt;br /&gt;
      for _, segments in pairs(root.dungeon_progress) do&lt;br /&gt;
        for _, state in pairs(segments) do&lt;br /&gt;
          if state then&lt;br /&gt;
            completed = completed + 1&lt;br /&gt;
            if completed&amp;gt;=3 then return true end&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      return false&lt;br /&gt;
    end,&lt;br /&gt;
    job_types = {&lt;br /&gt;
      {id = &amp;quot;RESCUE_SELF&amp;quot;, weight = 5},&lt;br /&gt;
      {id = &amp;quot;RESCUE_FRIEND&amp;quot;, weight = 5},&lt;br /&gt;
      {id = &amp;quot;ESCORT&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;EXPLORATION&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;DELIVERY&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;LOST_ITEM&amp;quot;, weight = 4},&lt;br /&gt;
      {id = &amp;quot;OUTLAW&amp;quot;, weight =  5},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_ITEM&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_ITEM_UNK&amp;quot;, weight = 1},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_MONSTER_HOUSE&amp;quot;, weight = 1},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_FLEE&amp;quot;, weight = 1}&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== end_dungeon_day_destination ==&lt;br /&gt;
&lt;br /&gt;
Zone and map id of the ground map where players will be sent to when a day ends and there is at least one mission to hand in. This map must contain a call to library:PlayJobsCompletedCutscene&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{zone: string, map: integer}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ zone = &amp;quot;guildmaster_island&amp;quot;, map = 2 },&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== after_rewards_function ==&lt;br /&gt;
&lt;br /&gt;
Function ran after the game is done with the job completion cutscene. It takes no arguments, and is not expected to return anything.&lt;br /&gt;
You can use it to fix up the game state however you like before returning control to the player.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
after_rewards_function = function()&lt;br /&gt;
  GAME:MoveCamera(0, 0, 1, true)&lt;br /&gt;
  SOUND:PlayBGM(SV.base_town.Song, true)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== taken_limit ==&lt;br /&gt;
&lt;br /&gt;
The maximum number of jobs that can be taken from job boards at a time.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;8&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== taken_jobs_start_active ==&lt;br /&gt;
&lt;br /&gt;
If true, taken jobs will be activated automatically. Players can always deactivate them manually if they so choose.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;true&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== max_guests ==&lt;br /&gt;
&lt;br /&gt;
The maximum amount of guest-based jobs that can be generated in the same dungeon.&amp;lt;/br&amp;gt;&lt;br /&gt;
Guest-based jobs are: ESCORT, EXPLORATION&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== guests_take_up_space ==&lt;br /&gt;
&lt;br /&gt;
The maximum amount of guest-based jobs that can be generated in the same dungeon.&amp;lt;/br&amp;gt;&lt;br /&gt;
Guest-based jobs are: ESCORT, EXPLORATION&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== min_party_limit ==&lt;br /&gt;
&lt;br /&gt;
Minimum number for the party limit when it is reduced because of guests.&lt;br /&gt;
This value cannot be lower than 1, for obvious reasons.&lt;br /&gt;
Any excess guests will simply add to the party count, without reducing the limit.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== losing_guests_means_defeat ==&lt;br /&gt;
&lt;br /&gt;
If true, losing any guest will count as a loss for the entire exploration.&lt;br /&gt;
If false, it will simply mark that specific job as failed.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_boss_steps_piority ==&lt;br /&gt;
&lt;br /&gt;
The priority of the SpawnOutlaw handler event. It can be either an integer or a list of integers.&lt;br /&gt;
This value should always be lower than dungeon_gen_steps_piority.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;-11&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_gen_steps_piority ==&lt;br /&gt;
&lt;br /&gt;
The priority that most of the job handlers will have when being added to the event list. It can be either an integer or a list of integers.&lt;br /&gt;
This value should always be equal to or higher than the priority set for the event that calls library:GenerateJobInFloor.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;-6&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_npc_steps_piority ==&lt;br /&gt;
&lt;br /&gt;
The priority that job npc spawners will have when being added to the event list. It can be either an integer or a list of integers.&lt;br /&gt;
This value should always be equal to or higher than dungeon_gen_steps_piority.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ 5, 2, 1 }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== difficulty_list ==&lt;br /&gt;
&lt;br /&gt;
A list of all difficulty rank id strings you want to use.&lt;br /&gt;
The order of these strings will define the difficulty scale used by the library.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ &amp;quot;F&amp;quot;, &amp;quot;E&amp;quot;, &amp;quot;D&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;A&amp;quot;, &amp;quot;S&amp;quot;, &amp;quot;STAR_1&amp;quot;, &amp;quot;STAR_2&amp;quot;, &amp;quot;STAR_3&amp;quot;, &amp;quot;STAR_4&amp;quot;, &amp;quot;STAR_5&amp;quot;, &amp;quot;STAR_6&amp;quot;, &amp;quot;STAR_7&amp;quot;, &amp;quot;STAR_8&amp;quot;, &amp;quot;STAR_9&amp;quot; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== difficulty_data ==&lt;br /&gt;
&lt;br /&gt;
All the data required to define difficulty rank behavior. There must be an entry for every rank defined in difficulty_list:&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;diff_id&amp;gt;: {display_key: string, money_reward: integer, extra_reward: integer, outlaw_level: integer, escort_level: integer}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;diff_id&amp;gt;: one of the difficulties defined in &amp;quot;difficulty_list&amp;quot;&lt;br /&gt;
* display_key: string key used when displaying the name of the rank.  The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
* money_reward: the amount of money awarded at the end of the job. If set to 0, money rewards will simply not award anything&lt;br /&gt;
* extra_reward: the points of extra reward awarded at the end of the job. What these points are depends on extra_reward_type. If set to 0, extra_reward_type will be considered to be &amp;quot;none&amp;quot;&lt;br /&gt;
* outlaw_level: Optional. The base level of all outlaws spawned by jobs with this difficulty. If omitted, it will be equal to the dungeon&#039;s expected level.&lt;br /&gt;
* escort_level: Optional. The level of all guests spawned by jobs with this difficulty. If omitted, it will be equal to the dungeon&#039;s expected level.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  F = {display_key = &amp;quot;RANK_STRING_F&amp;quot;, money_reward = 100, extra_reward = 0},&lt;br /&gt;
  E = {display_key = &amp;quot;RANK_STRING_E&amp;quot;, money_reward = 200, extra_reward = 100},&lt;br /&gt;
  D = {display_key = &amp;quot;RANK_STRING_D&amp;quot;, money_reward = 400, extra_reward = 200},&lt;br /&gt;
  C = {display_key = &amp;quot;RANK_STRING_C&amp;quot;, money_reward = 600, extra_reward = 400},&lt;br /&gt;
  B = {display_key = &amp;quot;RANK_STRING_B&amp;quot;, money_reward = 700, extra_reward = 1250},&lt;br /&gt;
  A = {display_key = &amp;quot;RANK_STRING_A&amp;quot;, money_reward = 1500, extra_reward = 2500},&lt;br /&gt;
  S = {display_key = &amp;quot;RANK_STRING_S&amp;quot;, money_reward = 3000, extra_reward = 5000},&lt;br /&gt;
  STAR_1 = {display_key = &amp;quot;RANK_STRING_STAR_1&amp;quot;, money_reward = 6000, extra_reward = 10000},&lt;br /&gt;
  STAR_2 = {display_key = &amp;quot;RANK_STRING_STAR_2&amp;quot;, money_reward = 10000, extra_reward = 20000},&lt;br /&gt;
  STAR_3 = {display_key = &amp;quot;RANK_STRING_STAR_3&amp;quot;, money_reward = 15000, extra_reward = 30000},&lt;br /&gt;
  STAR_4 = {display_key = &amp;quot;RANK_STRING_STAR_4&amp;quot;, money_reward = 20000, extra_reward = 40000},&lt;br /&gt;
  STAR_5 = {display_key = &amp;quot;RANK_STRING_STAR_5&amp;quot;, money_reward = 25000, extra_reward = 50000},&lt;br /&gt;
  STAR_6 = {display_key = &amp;quot;RANK_STRING_STAR_6&amp;quot;, money_reward = 30000, extra_reward = 60000},&lt;br /&gt;
  STAR_7 = {display_key = &amp;quot;RANK_STRING_STAR_7&amp;quot;, money_reward = 35000, extra_reward = 70000},&lt;br /&gt;
  STAR_8 = {display_key = &amp;quot;RANK_STRING_STAR_8&amp;quot;, money_reward = 40000, extra_reward = 80000},&lt;br /&gt;
  STAR_9 = {display_key = &amp;quot;RANK_STRING_STAR_9&amp;quot;, money_reward = 45000, extra_reward = 90000}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== guest_level_scaling ==&lt;br /&gt;
&lt;br /&gt;
Function that changes the level of guests based on the player&#039;s level. It must return the new level for the guest, or it will have no effect.&amp;lt;/br&amp;gt;&lt;br /&gt;
Arguments:&lt;br /&gt;
* lvl: base level of the guest.&lt;br /&gt;
* dungeon: if true, the level is the dungeon&#039;s recommended level. If false, it&#039;s taken from the difficulty data.&lt;br /&gt;
* avg_team_lvl: average level of the player team. It may or may not be an integer.&lt;br /&gt;
* hst_team_lvl: highest level in the player team.&lt;br /&gt;
* settings: the settings data structure itself&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(lvl, dungeon, avg_team_lvl, hst_team_lvl, settings)&lt;br /&gt;
  local add = 0&lt;br /&gt;
  if dungeon then lvl = lvl*4//5 end&lt;br /&gt;
  if avg_team_lvl &amp;gt; lvl then add = (avg_team_lvl - lvl) // 10 end&lt;br /&gt;
  return lvl + add&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== outlaw_level_scaling ==&lt;br /&gt;
&lt;br /&gt;
Function that changes the level of guests based on the player&#039;s level. It must return the new level for the guest, or it will have no effect.&amp;lt;/br&amp;gt;&lt;br /&gt;
Arguments:&lt;br /&gt;
* lvl: base level of the guest.&lt;br /&gt;
* dungeon: if true, the level is the dungeon&#039;s recommended level. If false, it&#039;s taken from the difficulty data.&lt;br /&gt;
* avg_team_lvl: average level of the player team. It may or may not be an integer.&lt;br /&gt;
* hst_team_lvl: highest level in the player team.&lt;br /&gt;
* settings: the settings data structure itself&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(lvl, dungeon, avg_team_lvl, hst_team_lvl, settings)&lt;br /&gt;
  local add = 0&lt;br /&gt;
  if dungeon then lvl = lvl*23//20 end&lt;br /&gt;
  if avg_team_lvl &amp;gt; lvl then add = (avg_team_lvl - lvl) // 8 end&lt;br /&gt;
  add = add + (hst_team_lvl - avg_team_lvl) // 4&lt;br /&gt;
  return lvl + add&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== apply_outlaw_changes ==&lt;br /&gt;
&lt;br /&gt;
Function that allows you to edit an outlaw&#039;s data just before they are spawned.&lt;br /&gt;
You can change just about anything except its position and recruitability state. Its HP will also&lt;br /&gt;
always be automatically set to full after this function is called.&lt;br /&gt;
You will also be unable to change the EquippedItem of an &amp;quot;OUTLAW_ITEM&amp;quot; or &amp;quot;OUTLAW_ITEM_UNK&amp;quot; outlaw.&amp;lt;/br&amp;gt;&lt;br /&gt;
Arguments:&lt;br /&gt;
* outlaw: the outlaw Character itself&lt;br /&gt;
* job: the current job data table&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(outlaw, job)&lt;br /&gt;
  local max_boost = PMDC.Data.MonsterFormData.MAX_STAT_BOOST&lt;br /&gt;
  outlaw.MaxHPBonus = math.min(outlaw.Level * max_boost // 64, max_boost);&lt;br /&gt;
  if job.Type == &amp;quot;OUTLAW_FLEE&amp;quot; then&lt;br /&gt;
    local speedMin = math.floor(outlaw.Level * 4 // 3)&lt;br /&gt;
    local speedMax = math.floor(outlaw.Level * 6 // 2)&lt;br /&gt;
    outlaw.SpeedBonus = math.min(_DATA.Save.Rand:Next(speedMin, speedMax), 100)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== fleeing_outlaw_restrictions ==&lt;br /&gt;
&lt;br /&gt;
A list of ids for types that are banned from ever being picked as fleeing outlaws.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ &amp;quot;ghost&amp;quot; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== outlaw_music_name ==&lt;br /&gt;
&lt;br /&gt;
The name of the outlaw music file. This file will be sourced from the Content/Music folder.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;Outlaw.ogg&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeons ==&lt;br /&gt;
&lt;br /&gt;
This is where dungeon difficulty is set. Quests can only generate for dungeons inside this list.&lt;br /&gt;
Given the complexity of this structure, it is best generated using the [[Mod:Nebula&#039;s Mission Board/ Editing settings#settings.AddDungeonSection(zone, segment, start, difficulty, finish, must_end)||AddDungeonSection]] function at the bottom of this page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_order ==&lt;br /&gt;
&lt;br /&gt;
Jobs are sorted by dungeon, following the order defined in this table. Missing dungeons are shoved at the bottom and sorted alphabetically.&lt;br /&gt;
This list is automatically populated in call order when using the &amp;quot;AddDungeonSection&amp;quot; function near the bottom of this file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== external_events ==&lt;br /&gt;
&lt;br /&gt;
A list of events unrelated to this library that can cause job generation to ignore a specific dungeon.&lt;br /&gt;
They can also be displayed in the objectives log if you so choose.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{condition: function(zone), message_key: string, message_args: function(zone), icon: string}&amp;lt;/code&amp;gt;&lt;br /&gt;
* condition: a function that takes a zone and returns a boolean. If it returns true, jobs will not be generated for this dungeon, and all already taken jobs will be automatically suspended.&lt;br /&gt;
* message_key: Optional. It will be used in the objectives log instead of the default message if the condition is true.&lt;br /&gt;
* message_args: Optional. If the message&#039;s localization string contains placeholders, this function is in charge of taking a zone and returning a list of values that will be used for those placeholders in the form of a table array (Up to 5).&lt;br /&gt;
* icon: Optional. The icon that will be displayed beside the corresponding dungeon in the dungeon selection menu if the condition is true for any of its segments. Defaults to &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  {condition = function(zone) return COMMON.HasSidequestInZone(zone) end, icon = &amp;quot;\\uE111&amp;quot;, message_key = &amp;quot;MENU_JOB_OBJECTIVE_DEFAULT&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== external_events_icon_mode ==&lt;br /&gt;
&lt;br /&gt;
How to display external event icons in the dungeon list. This value can only be either &amp;quot;FIRST&amp;quot; or ALL&amp;quot;.&lt;br /&gt;
* If set to &amp;quot;ALL&amp;quot;, they will always be displayed in the order defined by external_events. Only one copy of the same icon will be shown, no matter how many conditions require it.&lt;br /&gt;
* If set to &amp;quot;FIRST&amp;quot;, only the first event in the list&#039;s order will be displayed, no matter how many events are actually there. This setting does not prevent multiple messages from appearing in the objectives list.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;FIRST&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_list_pattern ==&lt;br /&gt;
&lt;br /&gt;
The pattern that will define how to display entries in the dungeon list.&amp;lt;/br&amp;gt;&lt;br /&gt;
{0} is the placeholder for the dungeon name, {1} for pending job icon and {2} for external condition icons.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;FIRST&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== job_types ==&lt;br /&gt;
&lt;br /&gt;
Table used to determine various properties regarding job types.&lt;br /&gt;
Remove a job type entirely to disable its generation altogether.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: {rank_modifier: integer, min_rank: string}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: one of RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
* rank_modifier (optional): these jobs will always have this modifier applied to their rank.&lt;br /&gt;
* min_rank (optional): this type of jobs can never be of a rank lower than this.&lt;br /&gt;
: This influences possible dungeon spawn: a rank_modifier 1 job with min_rank &amp;quot;C&amp;quot; can also spawn in &amp;quot;D&amp;quot; rank dungeons.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  RESCUE_SELF = {rank_modifier = 0, min_rank = &amp;quot;F&amp;quot;},&lt;br /&gt;
  RESCUE_FRIEND = {rank_modifier = 0, min_rank = &amp;quot;E&amp;quot;},&lt;br /&gt;
  ESCORT = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  EXPLORATION = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  DELIVERY = {rank_modifier = 0, min_rank = &amp;quot;D&amp;quot;},&lt;br /&gt;
  LOST_ITEM = {rank_modifier = 0, min_rank = &amp;quot;D&amp;quot;},&lt;br /&gt;
  OUTLAW = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  OUTLAW_ITEM = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  OUTLAW_ITEM_UNK = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  OUTLAW_MONSTER_HOUSE = {rank_modifier = 2, min_rank = &amp;quot;S&amp;quot;},&lt;br /&gt;
  OUTLAW_FLEE = {rank_modifier = 1, min_rank = &amp;quot;B&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_job_modifiers ==&lt;br /&gt;
&lt;br /&gt;
Special table that allows modders to specify chance multipliers for job types depending on the dungeon.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;dungeon_id&amp;gt;: {&amp;lt;job_type_id&amp;gt;: &amp;lt;multiplier&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;dungeon_id&amp;gt;: the string id of a dungeon&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: one of RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
* &amp;lt;multiplier&amp;gt;: a multiplier number. It doesn&#039;t need to be an integer. It will be multiplied with the board&#039;s base chances, rounding up, when choosing the type of a job. Set it to 0 or less to disable the job type altogether.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  ambush_forest = {&lt;br /&gt;
    OUTLAW = 3,&lt;br /&gt;
    OUTLAW_ITEM = 3,&lt;br /&gt;
    OUTLAW_ITEM_UNK = 3,&lt;br /&gt;
    OUTLAW_MONSTER_HOUSE = 3,&lt;br /&gt;
    OUTLAW_FLEE = 3&lt;br /&gt;
  },&lt;br /&gt;
  treacherous_mountain = {&lt;br /&gt;
    OUTLAW = 3,&lt;br /&gt;
    OUTLAW_ITEM = 3,&lt;br /&gt;
    OUTLAW_ITEM_UNK = 3,&lt;br /&gt;
    OUTLAW_MONSTER_HOUSE = 3,&lt;br /&gt;
    OUTLAW_FLEE = 3&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== special_chance ==&lt;br /&gt;
&lt;br /&gt;
Chance of special missions to be generated. Special missions are just handcrafted scenarios with specific client and target pairs and custom flavor texts. Set to 0 to disable altogether.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;0.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== special_jobs ==&lt;br /&gt;
&lt;br /&gt;
This is where you can define special cases for specific types of jobs.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;special_id&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: one of RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
* &amp;lt;special_id&amp;gt;: any id of your choosing except RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  RESCUE_FRIEND = {&amp;quot;CHILD&amp;quot;, &amp;quot;LOVER&amp;quot;, &amp;quot;RIVAL&amp;quot;, &amp;quot;FRIEND&amp;quot;}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== hidden_floor_chance ==&lt;br /&gt;
&lt;br /&gt;
Chance for supported quest types to have their destination floor hidden. Set to 0 to disable altogether.&amp;lt;/br&amp;gt;&lt;br /&gt;
Players will still be notified when reaching the floor. It just won&#039;t show in the quest description.&amp;lt;/br&amp;gt;&lt;br /&gt;
Job types that can have their floor hidden are: RESCUE_FRIEND, EXPLORATION, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_FLEE.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;0.15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== reward_types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A list of all types of rewards to be offered to players.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{id: string, weight: integer, min_rank: string}&amp;lt;/code&amp;gt;&lt;br /&gt;
* id: one of the supported reward types. You can use duplicate values to alter odds depending on job rank.&lt;br /&gt;
: Supported reward types are: item, money, item_item, money_item, client, exclusive&lt;br /&gt;
* weight: Chance of appearing. Set to 0 or delete altogether to stop a type of reward from being offered.&lt;br /&gt;
* min_rank: optional. If set, this type of reward will only be offered if the job is this rank or higher.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  {id = &amp;quot;item&amp;quot;, weight = 6},&lt;br /&gt;
  {id = &amp;quot;money&amp;quot;, weight = 2},&lt;br /&gt;
  {id = &amp;quot;item_item&amp;quot;, weight = 3},&lt;br /&gt;
  {id = &amp;quot;money_item&amp;quot;, weight = 1},&lt;br /&gt;
  {id = &amp;quot;client&amp;quot;, weight = 1, min_rank = &amp;quot;STAR_1&amp;quot;},&lt;br /&gt;
  {id = &amp;quot;exclusive&amp;quot;, weight = 1, min_rank = &amp;quot;STAR_4&amp;quot;}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== extra_reward_type ==&lt;br /&gt;
&lt;br /&gt;
The type of extra reward for all quests. It can be &amp;quot;none&amp;quot;, &amp;quot;rank&amp;quot; or &amp;quot;exp&amp;quot;. Any other value will result in &amp;quot;none&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;exp&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== rewards_per_difficulty ==&lt;br /&gt;
&lt;br /&gt;
This table assigns different weights to reward pools depending on the difficulty rank of the mission.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;diff_id&amp;gt;: {id: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;diff_id&amp;gt;: one of the difficulties defined in difficulty_list&amp;quot;&lt;br /&gt;
* id: the id of one of the reward pools defined in &amp;quot;reward_pools&amp;quot;&lt;br /&gt;
* weight: Chance of appearing. Set to 0 or delete altogether to stop a reward pool from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  F = {&lt;br /&gt;
    {id = &amp;quot;NECESSITIES&amp;quot;, weight = 10}&lt;br /&gt;
  },&lt;br /&gt;
  E = {&lt;br /&gt;
    {id = &amp;quot;NECESSITIES&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;APRICORN_GENERIC&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;FOOD_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;SEED_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;HELD_LOW&amp;quot;, weight = 3},&lt;br /&gt;
    {id = &amp;quot;LOOT_LOW&amp;quot;, weight = 3},&lt;br /&gt;
    {id = &amp;quot;EVO_ITEMS&amp;quot;, weight = 1},&lt;br /&gt;
    {id = &amp;quot;WANDS_LOW&amp;quot;, weight = 10}&lt;br /&gt;
  },&lt;br /&gt;
  D = {&lt;br /&gt;
    {id = &amp;quot;NECESSITIES&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;AMMO_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;APRICORN_GENERIC&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;APRICORN_TYPED&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;FOOD_LOW&amp;quot;, weight = 4},&lt;br /&gt;
    {id = &amp;quot;SEED_LOW&amp;quot;, weight = 4},&lt;br /&gt;
    {id = &amp;quot;SEED_MID&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;HELD_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;HELD_TYPE&amp;quot;, weight = 3},&lt;br /&gt;
    {id = &amp;quot;LOOT_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;EVO_ITEMS&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;ORBS_LOW&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;WANDS_LOW&amp;quot;, weight = 4},&lt;br /&gt;
    {id = &amp;quot;WANDS_MID&amp;quot;, weight = 10},&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== reward_pools ==&lt;br /&gt;
&lt;br /&gt;
List of all reward pools and the items they contain. You must at least include all pools referenced in the rewards_per_difficulty table, but you can add more.&amp;lt;/br&amp;gt;&lt;br /&gt;
Entry ids may be either items or other pools. A pool doesn&#039;t have to only contain one of the two.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;pool id&amp;gt;: {id: string, count: integer, hidden: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;pool_id&amp;gt;: the id of the pool. It should be used somewhere else either in this table or in rewards_per_difficulty.&lt;br /&gt;
* id: item_id or pool_id. If it matches a pool, count and hidden will be ignored.&lt;br /&gt;
* count: Optional. The amount of items awarded. It cannot be higher than the item&#039;s max stack. Defaults to the item&#039;s max stack.&lt;br /&gt;
* hidden: Optional. Hidden value that can be used for various purposes depending on the item. Defaults to &amp;quot;&amp;quot;.&lt;br /&gt;
* weight: Chance of appearing. Set to 0 or delete altogether to stop an entry from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  NECESSITIES = {&lt;br /&gt;
    {id = &amp;quot;seed_reviver&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;berry_leppa&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;berry_oran&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;berry_lum&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;food_apple&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;orb_escape&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;apricorn_plain&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;key&amp;quot;,count = 3,  weight = 2}&lt;br /&gt;
  },&lt;br /&gt;
  AMMO_LOW = {&lt;br /&gt;
    {id = &amp;quot;ammo_iron_thorn&amp;quot;, count = 3, weight = 5},&lt;br /&gt;
    {id = &amp;quot;ammo_geo_pebble&amp;quot;, count = 3, weight = 1},&lt;br /&gt;
    {id = &amp;quot;ammo_stick&amp;quot;, count = 3, weight = 1},&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== target_items ==&lt;br /&gt;
&lt;br /&gt;
Ids of items that can be used as targets, divided depending on the job type.&lt;br /&gt;
Make sure they&#039;re either easy enough to obtain or impossible to lose, depending on the job.&lt;br /&gt;
Using stackable items is highly discouraged for all job types, as it may result in odd behaviors.&amp;lt;/br&amp;gt;&lt;br /&gt;
&#039;&#039;Please keep in mind that if you want to use the &amp;quot;mission_&amp;quot; items shown in the example you must either recreate them or copy them over from the example mod.&#039;&#039;&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;item_id&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: the id of a job type defined inside &amp;quot;job_types&amp;quot;&lt;br /&gt;
* &amp;lt;item_id&amp;gt;: the id of the item to use&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  LOST_ITEM = {&lt;br /&gt;
    &amp;quot;mission_lost_scarf&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_lost_specs&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_lost_band&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  OUTLAW_ITEM = {&lt;br /&gt;
    &amp;quot;mission_stolen_scarf&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_stolen_band&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_stolen_specs&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  DELIVERY = {&lt;br /&gt;
    &amp;quot;berry_oran&amp;quot;,&lt;br /&gt;
    &amp;quot;berry_leppa&amp;quot;,&lt;br /&gt;
    &amp;quot;food_apple&amp;quot;,&lt;br /&gt;
    &amp;quot;berry_lum&amp;quot;,&lt;br /&gt;
    &amp;quot;apricorn_plain&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== difficulty_to_tier ==&lt;br /&gt;
&lt;br /&gt;
Weighted table that associates mission difficulty to a specific tier of characters and outlaws.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;diff_id&amp;gt;: {id: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;diff_id&amp;gt;: one of the difficulties defined in &amp;quot;difficulty_list&amp;quot;&lt;br /&gt;
* id: A string that defines a pokémon tier id.&lt;br /&gt;
* weight: Chance of being picked. Set to 0 or delete altogether to stop an entry from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  F = {&lt;br /&gt;
    {id = &amp;quot;TIER_LOW&amp;quot;, weight = 10}&lt;br /&gt;
  },&lt;br /&gt;
  E = {&lt;br /&gt;
    {id = &amp;quot;TIER_LOW&amp;quot;, weight = 9},&lt;br /&gt;
    {id = &amp;quot;TIER_MID&amp;quot;, weight = 1}&lt;br /&gt;
  },&lt;br /&gt;
  D = {&lt;br /&gt;
    {id = &amp;quot;TIER_LOW&amp;quot;, weight = 7},&lt;br /&gt;
    {id = &amp;quot;TIER_MID&amp;quot;, weight = 3}&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== pokemon ==&lt;br /&gt;
&lt;br /&gt;
A list of Pokémon that will be used for job generation, sorted by arbitrary quest tiers.&lt;br /&gt;
Any of these entries may be picked when choosing client and target.&lt;br /&gt;
If the client picked is not in the seen dex, the reward type can never be &amp;quot;client&amp;quot; nor &amp;quot;exclusive&amp;quot;.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;tier&amp;gt;: &amp;lt;monster_id&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;tier&amp;gt;: one of the tier ids used in difficulty_to_tier&lt;br /&gt;
* &amp;lt;monster_id&amp;gt;: either the species id of a pokémon or a MonsterIDTable&lt;br /&gt;
Format of MonsterIDTable: see the &amp;quot;monsterIdTemplate&amp;quot; function in missiongen_lib.lua&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  TIER_LOW = {&lt;br /&gt;
&amp;quot;abra&amp;quot;,&amp;quot;amaura&amp;quot;,&amp;quot;anorith&amp;quot;,&amp;quot;applin&amp;quot;,&amp;quot;archen&amp;quot;,&amp;quot;aron&amp;quot;,&amp;quot;arrokuda&amp;quot;,&amp;quot;axew&amp;quot;,&amp;quot;azurill&amp;quot;, [...]&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== job_titles ==&lt;br /&gt;
&lt;br /&gt;
A list of all possible job display titles, divided by job type.&lt;br /&gt;
You must also include lists for any special job types you intend to use.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;string_key&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: either the id of a job type defined inside &amp;quot;job_types&amp;quot;, or the id of a special job type&lt;br /&gt;
* &amp;lt;string_key&amp;gt;: the localization key used for the title. The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target (or client, if there is no target)&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  RESCUE_SELF = {&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_001&amp;quot;,&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_002&amp;quot;,&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_003&amp;quot;,&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_004&amp;quot;,&lt;br /&gt;
    [...]&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== job_flavor ==&lt;br /&gt;
&lt;br /&gt;
A list of all possible job flavor text entries, divided by job type and by line.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: {&amp;lt;string_key&amp;gt;[], &amp;lt;string_key&amp;gt;[]}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: either the id of a job type defined inside &amp;quot;job_types&amp;quot;, or the id of a special job type&lt;br /&gt;
* &amp;lt;string_key&amp;gt;: the localization key used for the flavor text. Every job has 2 lists assigned: one for the top string and one for the bottom one.&lt;br /&gt;
If only the first list is specified, the second one will be left empty.&lt;br /&gt;
The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target (or client, if there is no target)&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  RESCUE_SELF = {&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_001&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_002&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_003&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_004&amp;quot;,&lt;br /&gt;
      [...]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;MISSION_BODY_BOTTOM_RESCUE_SELF_001&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_BOTTOM_RESCUE_SELF_002&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_BOTTOM_RESCUE_SELF_003&amp;quot;,&lt;br /&gt;
      [...]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== law_enforcement ==&lt;br /&gt;
&lt;br /&gt;
Law enforcement characters in your setting. All OUTLAW jobs except OUTLAW_ITEM and OUTLAW_ITEM_UNK use these characters as job clients.&lt;br /&gt;
You may specify only 1 officer, and then a list containing any number of agents. Two of the latter will be randomly picked every time the job completion cutscene is played.&amp;lt;/br&amp;gt;&lt;br /&gt;
You may add a weight property to agents to specify a custom chance of being picked. Any without will&lt;br /&gt;
have a weight of 1.&amp;lt;/br&amp;gt;&lt;br /&gt;
Add &amp;quot;unique = true&amp;quot; to the MonsterIDTable to stop an agent from being picked twice. You must&lt;br /&gt;
have at least either 1 non-unique agent or 2 unique ones for this list table to be valid.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format of MonsterIDTable: see the &amp;quot;monsterIdTemplate&amp;quot; function in missiongen_lib.lua&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  OFFICER = {Species = &amp;quot;magnezone&amp;quot;, Gender = 0},&lt;br /&gt;
  AGENT = {&lt;br /&gt;
    {Species = &amp;quot;magnemite&amp;quot;, Gender = 0, Weight = 31},&lt;br /&gt;
    {Species = &amp;quot;magnemite&amp;quot;, Gender = 0, Skin = &amp;quot;shiny&amp;quot;, Weight = 1, Unique = true}&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== enforcer_chance ==&lt;br /&gt;
&lt;br /&gt;
Defines the chance of either the officer or an agent being the client of a mission depending on the character tier of the mission, as defined in difficulty_to_tier.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;tier&amp;gt;: {id: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;tier&amp;gt;: one of the tier ids used in difficulty_to_tier&lt;br /&gt;
* id: One of: OFFICER, AGENT&lt;br /&gt;
* index: Optional. Ignored if id is OFFICER. You can set it to specify a specific agent instead of rolling using their chance in &amp;quot;law_enforcement&amp;quot;.&lt;br /&gt;
* weight: Chance of being picked. Set to 0 or delete altogether to stop an entry from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  TIER_LOW = {&lt;br /&gt;
    {id = &amp;quot;OFFICER&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;AGENT&amp;quot;, weight = 8}&lt;br /&gt;
  },&lt;br /&gt;
  TIER_MID = {&lt;br /&gt;
    {id = &amp;quot;OFFICER&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;AGENT&amp;quot;, weight = 5}&lt;br /&gt;
  },&lt;br /&gt;
  TIER_HIGH = {&lt;br /&gt;
    {id = &amp;quot;OFFICER&amp;quot;, weight = 8},&lt;br /&gt;
    {id = &amp;quot;AGENT&amp;quot;, weight = 2}&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== special_data ==&lt;br /&gt;
&lt;br /&gt;
Data of characters and flavor key used for special jobs, divided by tier.&lt;br /&gt;
In outlaw related quests, you may use ENFORCER as a keyword for a random law enforcement character.&lt;br /&gt;
You may also use OFFICER or AGENT to specify a more specific selection.&lt;br /&gt;
These keywords can only be used in place of MonsterIDTables.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;special_type&amp;gt;: {&amp;lt;tier&amp;gt;: {client: MonsterIDTable, target: MonsterIDTable, item: string, flavor: string}[]}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;special_type&amp;gt;: an id of your choosing. It must be different from any basic job id&lt;br /&gt;
* &amp;lt;tier&amp;gt;: one of the tier ids used in difficulty_to_tier&lt;br /&gt;
* client: the data used to generate this Pokémon.&lt;br /&gt;
* target: the data used to generate this Pokémon.  Only used in job types that require a target.&lt;br /&gt;
* item: the id of the item that will be used for this job. Only used in job types that require an item.&lt;br /&gt;
* flavor: flavor string key used for the job, sourced from the Menu Text list (strings.resx)&lt;br /&gt;
Format of MonsterIDTable: see the &amp;quot;monsterIdTemplate&amp;quot; function in missiongen_lib.lua&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target (or client, if there is no target)&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  LOVER = {&lt;br /&gt;
    TIER_LOW = {&lt;br /&gt;
      {client = {Species = &amp;quot;volbeat&amp;quot;, Gender = 1}, target = {Species = &amp;quot;illumise&amp;quot;, Gender = 2}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_001&amp;quot;},&lt;br /&gt;
      {client = {Species = &amp;quot;minun&amp;quot;, Gender = 1}, target = {Species = &amp;quot;plusle&amp;quot;, Gender = 2}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_002&amp;quot;},&lt;br /&gt;
      {client = {Species = &amp;quot;mareep&amp;quot;, Gender = 2}, target = {Species = &amp;quot;wooloo&amp;quot;, Gender = 1}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_003&amp;quot;},&lt;br /&gt;
      [...]&lt;br /&gt;
    },&lt;br /&gt;
    TIER_MID = {&lt;br /&gt;
      {client = {Species = &amp;quot;miltank&amp;quot;, Gender = 2}, target = {Species = &amp;quot;tauros&amp;quot;, Gender = 1}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_005&amp;quot;},&lt;br /&gt;
      {client = {Species = &amp;quot;venomoth&amp;quot;, Gender = 1}, target = {Species = &amp;quot;butterfree&amp;quot;, Gender = 2}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_006&amp;quot;},&lt;br /&gt;
      [...]&lt;br /&gt;
    },&lt;br /&gt;
    [...]&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== escort_talks ==&lt;br /&gt;
&lt;br /&gt;
String keys to be used whenever the player interacts with an escort mission client, depending on the job type.&lt;br /&gt;
You can also include tables for special escort jobs. If no such table exists for a specific case, the generic table for the job type will be used.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;string_key&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: &amp;quot;ESCORT&amp;quot;, &amp;quot;EXPLORATION&amp;quot;, or the id of a special job type that corresponds to one of these job types&lt;br /&gt;
* &amp;lt;string_key&amp;gt;: the localization key of possible messages. The localized strings are fetched from the Gameplay Text list (stringsEx.resx)&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  ESCORT = {&lt;br /&gt;
    &amp;quot;MISSION_ESCORT_INTERACT&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  EXPLORATION = {&lt;br /&gt;
    &amp;quot;MISSION_EXPLORATION_INTERACT&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== rescue_responses ==&lt;br /&gt;
&lt;br /&gt;
Strings keys to be used whenever the player interacts with a pokémon that needs rescue, depending on the job type and the response given.&lt;br /&gt;
You must include a &amp;quot;_DEFAULT&amp;quot; table, but you can also include tables for special job types. _DEFAULT will still be used for any special&lt;br /&gt;
case that doesn&#039;t have a table associated with it.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{rescue_yes: {&amp;lt;case_id&amp;gt;: {key: string, emotion: string}[]}, rescue_no: {&amp;lt;case_id&amp;gt;: {key: string, emotion: string}[]}}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;case_id&amp;gt;: &amp;quot;_DEFAULT&amp;quot;, or the id of a special job type that corresponds to either &amp;quot;RESCUE_SELF&amp;quot; or &amp;quot;RESCUE_FRIEND&amp;quot;&lt;br /&gt;
* key: the localization key of possible messages. The localized strings are fetched from the Gameplay Text list (stringsEx.resx)&lt;br /&gt;
* emotion: Optional. An emotion id to use with this specific message. Defaults to &amp;quot;Normal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: client&lt;br /&gt;
* {1}: target&lt;br /&gt;
* {2}: dungeon&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  rescue_yes = {&lt;br /&gt;
    _DEFAULT = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_DEFAULT&amp;quot;} },&lt;br /&gt;
    CHILD  = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_CHILD&amp;quot;, emotion = &amp;quot;Joyous&amp;quot;} },&lt;br /&gt;
    FRIEND = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_FRIEND&amp;quot;} },&lt;br /&gt;
    RIVAL  = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_RIVAL&amp;quot;} },&lt;br /&gt;
    LOVER  = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_LOVER&amp;quot;, emotion = &amp;quot;Joyous&amp;quot;} }&lt;br /&gt;
  },&lt;br /&gt;
  rescue_no = {&lt;br /&gt;
    _DEFAULT = { {key = &amp;quot;MISSION_RESCUE_DENY_DEFAULT&amp;quot;, emotion = &amp;quot;Surprised&amp;quot;} },&lt;br /&gt;
    CHILD  = { {key = &amp;quot;MISSION_RESCUE_DENY_CHILD&amp;quot;, emotion = &amp;quot;Crying&amp;quot;} },&lt;br /&gt;
    FRIEND = { {key = &amp;quot;MISSION_RESCUE_DENY_FRIEND&amp;quot;, emotion = &amp;quot;Surprised&amp;quot;} },&lt;br /&gt;
    RIVAL  = { {key = &amp;quot;MISSION_RESCUE_DENY_RIVAL&amp;quot;, emotion = &amp;quot;Stunned&amp;quot;} },&lt;br /&gt;
    LOVER  = { {key = &amp;quot;MISSION_RESCUE_DENY_LOVER&amp;quot;, emotion = &amp;quot;Stunned&amp;quot;} }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== mission_callback_root ==&lt;br /&gt;
&lt;br /&gt;
The object that contains job callback functions. It is recommended to define this object somewhere else.&amp;lt;/br&amp;gt;&lt;br /&gt;
Job callbacks are stored inside jobs as strings. These strings are then used as an index in the callback root object to retrieve the actual function.&lt;br /&gt;
&lt;br /&gt;
The callback system is a pretty involved one, that gives a modder the ability to handcraft entirely new types of jobs if they so choose, but is also pretty difficult to handle, so it will be discussed in [[Mod:Nebula&#039;s Mission Board/ Job callbacks|its own guide]].&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;COMMON&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== settings.AddDungeonSection(zone, segment, start, difficulty, finish, must_end) ==&lt;br /&gt;
&lt;br /&gt;
Adds a new dungeon section to the list of possible job destinations.&lt;br /&gt;
Section start values must always be added in ascending order. Failing to do so may cause inconsistent behaviors.&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;zone&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: the string id of the dungeon zone.&lt;br /&gt;
* &amp;lt;code&amp;gt;segment&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: the numeric id of the dungeon segment.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: the starting floor of this dungeon section (start counting from 1 for this).&lt;br /&gt;
* &amp;lt;code&amp;gt;difficulty&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: the string id of the difficulty assigned to this section.&lt;br /&gt;
* &amp;lt;code&amp;gt;finish&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: Only considered when first adding a segment to the list. Can be omitted otherwise. This will be the last floor of the segment where jobs can spawn (start counting from 1 for this). If higher than the dungeon floors, it will default to the full dungeon length.&lt;br /&gt;
* &amp;lt;code&amp;gt;must_end&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; Only considered when first adding a segment to the list. Can be omitted otherwise. If true, this segment must be completed before jobs can spawn in it. If false, the segment must be accessed at least once, unless it&#039;s segment 0, which just needs to be unlocked. Defaults to true.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
settings.AddDungeonSection(&amp;quot;faultline_ridge&amp;quot;, 0, 6, &amp;quot;D&amp;quot;, 10)&lt;br /&gt;
settings.AddDungeonSection(&amp;quot;sickly_hollow&amp;quot;, 0, 9, &amp;quot;S&amp;quot;, 16, false)&lt;br /&gt;
settings.AddDungeonSection(&amp;quot;sickly_hollow&amp;quot;, 0, 13, &amp;quot;STAR_1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board&amp;diff=2824</id>
		<title>Mod:Nebula&#039;s Mission Board</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board&amp;diff=2824"/>
		<updated>2025-07-29T20:21:14Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: Link github&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[User:MistressNebula|Nebula]]&#039;s Mission Board is a mod that adds a mission board to the base PMDO game, allowing players to embark in missions to gain special items and money and to gain experience.&lt;br /&gt;
It looks and plays essentially the same as the base game&#039;s Enable Mission Board mod, except that all job generation and job handling functions are dealt with by a highly customizable library bundled within the mod, built with the express purpose of being as easy to import and implement as possible while giving experienced modders the tools they need to make even more complex systems and behaviors.&amp;lt;/br&amp;gt;&lt;br /&gt;
You can download the mod [https://github.com/435THz/NebulaMissionBoard here].&lt;br /&gt;
&lt;br /&gt;
== PMDO Mission Generation Library ==&lt;br /&gt;
The library itself is fully contained inside the Data/Script/missiongen_lib folder inside the mod. By taking this folder and moving it to your mod, you will have access to all of its functions. Remember to credit MistressNebula if you include this library in your project!&lt;br /&gt;
&lt;br /&gt;
Do keep in mind that simply moving the files inside your mod is not enough to set up the library: you will also need to hook all of the necessary events to your mod. Please refer to the links at the bottom of this page for a more in-depth guide on how to do it.&lt;br /&gt;
&lt;br /&gt;
===== How the library is structured =====&lt;br /&gt;
The library is broken up into 5 files:&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_lib.lua&amp;lt;/code&amp;gt; is the core file of the library. It&#039;s where the most important structures, functions and global variables are defined and handled, as well as the one containing all the hooks that mods are expected to use to interface with it.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_settings.lua&amp;lt;/code&amp;gt; contains a table of parameters and properties used by the library to function. This is the file that modders are supposed to edit to alter the behavior of the library. Every setting is documented individually, describing its format, what it is used for and what kind of data it requires. The file is loaded directly by the main file, and is not supposed to be loaded directly.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_menus.lua&amp;lt;/code&amp;gt; is a file whose sole purpose is to contain the menus used by the library. It is loaded automatically by the main file, and its functions are not supposed to be interacted with directly.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_service.lua&amp;lt;/code&amp;gt; is the file that contains the service required by the library to handle loading, menu edits and dungeon completion tracking. It needs to be loaded separately from the main file. This file also contains the only value outside of the settings file that MIGHT require changing. More details in the setup guide below.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_devcheck.lua&amp;lt;/code&amp;gt; contains a function, called by the main file when loading, whose purpose is to check, to the best of its abilities, if the values inside the settings file are valid, and print the results of its test to the console. If this file is deleted or misplaced, the check will simply be skipped. This file is only loaded when the game is in [[Dev Mode]]. If you hear the music restart when loading your save data, it&#039;s because of this file.&lt;br /&gt;
&lt;br /&gt;
===== Setup guides =====&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/Basic setup|Basic setup]]&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Hook implementations|Hook implementations]]&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Editing settings|Editing settings]]&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ String keys|String keys]]&lt;br /&gt;
&lt;br /&gt;
===== Easy guides =====&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Job boards|Setting up job boards]]&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Reward cutscenes|Making reward cutscenes]]&lt;br /&gt;
** [[Mod:Nebula&#039;s Mission Board/ Job Table|Job Table Documentation]]&lt;br /&gt;
&lt;br /&gt;
===== Intermediate guide =====&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Handcrafted jobs|Making handcrafted jobs]]&lt;br /&gt;
&lt;br /&gt;
===== Advanced guide =====&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Job callbacks|Job callbacks]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Modding_Hub&amp;diff=2823</id>
		<title>Modding Hub</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Modding_Hub&amp;diff=2823"/>
		<updated>2025-07-29T20:19:03Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: /* Scripts */ Add User link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tutorials ==&lt;br /&gt;
If it&#039;s your first time making a mod, start here:&lt;br /&gt;
* [[Modding Intro]]&lt;br /&gt;
* [https://www.youtube.com/playlist?list=PLXlJTVdeyhO-rQnuRU7A0BIxutM8mL0Wg Audino&#039;s Video Tutorials]&lt;br /&gt;
&lt;br /&gt;
Optional but &#039;&#039;highly&#039;&#039; recommended:&lt;br /&gt;
* [[Getting Started With Git]]&lt;br /&gt;
&lt;br /&gt;
=== Graphics ===&lt;br /&gt;
* [[Modding Portraits and Sprites]]&lt;br /&gt;
* [[Modding Objects and VFX]]&lt;br /&gt;
* [[Modding Tilesets]]&lt;br /&gt;
* [[Modding Font]]&lt;br /&gt;
&lt;br /&gt;
=== Audio ===&lt;br /&gt;
* [[Modding Music]]&lt;br /&gt;
&lt;br /&gt;
=== Dungeon Generation ===&lt;br /&gt;
* [[Creating Dungeons]] by editing Tropical Path&lt;br /&gt;
* [[Creating Dungeons from Scratch]]&lt;br /&gt;
** [[Using Themes]]&lt;br /&gt;
** [[Using SpreadPlans]]&lt;br /&gt;
** [[Creating Dungeon Shops]]&lt;br /&gt;
** [[Creating Monster Houses]]&lt;br /&gt;
** [[Creating Vaults]]&lt;br /&gt;
** [[Creating Mid-Dungeon Boss Rooms]]&lt;br /&gt;
** [[Creating Branching Dungeons]]&lt;br /&gt;
* [[Creating Dungeon Maps]]&lt;br /&gt;
* [[Custom Floor Generation Steps]]&lt;br /&gt;
&lt;br /&gt;
=== Game Mechanics ===&lt;br /&gt;
* [[Creating Items]]&lt;br /&gt;
** [[Creating TMs]]&lt;br /&gt;
* [[Creating Moves]]&lt;br /&gt;
* [[Creating Map Statuses]] (i.e. weather and field effects)&lt;br /&gt;
* [[Creating New Types]]&lt;br /&gt;
* [[Creating Terrain]]&lt;br /&gt;
* [[Creating New Pokémon]]&lt;br /&gt;
&lt;br /&gt;
=== Ground Maps and Cutscenes ===&lt;br /&gt;
* [[Creating Ground Maps]]&lt;br /&gt;
* [[Creating Ground Map NPCs]]&lt;br /&gt;
* [[Custom Ground Item Actions]]&lt;br /&gt;
&lt;br /&gt;
=== Scripting ===&lt;br /&gt;
* [[Services]]&lt;br /&gt;
* [[Making Custom Menus]]&lt;br /&gt;
** [[Editing the Top Menu]]&lt;br /&gt;
** [[Editing the Main Menu]]&lt;br /&gt;
* [[Lua Conversion Guide|Converting C# classes to Lua]]&lt;br /&gt;
* [[Avoiding Desyncs]] in replays and quicksaves&lt;br /&gt;
* [[Basic Zone Scripts]]&lt;br /&gt;
&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* [[Manual Install]]&lt;br /&gt;
* [[Contributing Code]] to the engine&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[Dev Mode]]&lt;br /&gt;
&lt;br /&gt;
=== Graphics ===&lt;br /&gt;
* [[PMD Sprite Format]]&lt;br /&gt;
* [[Sprite Tool|Sprite Tool Manual]]&lt;br /&gt;
* [[Mass Sprite Import]] (Advanced. Modders can skip this page.)&lt;br /&gt;
&lt;br /&gt;
=== Audio ===&lt;br /&gt;
* [[Ogg Tags]]&lt;br /&gt;
&lt;br /&gt;
=== Dungeon Generation ===&lt;br /&gt;
* [[Floor Generation Overview]]&lt;br /&gt;
* [[Zone Step Overview]]&lt;br /&gt;
&lt;br /&gt;
=== Game Mechanics ===&lt;br /&gt;
* [[AI Overview]]&lt;br /&gt;
* Pokémon [[Spawn Features]]&lt;br /&gt;
* [[Move Ranges]]&lt;br /&gt;
* [[Map Statuses]] (weather, Electric Terrain, Trick Room, etc.)&lt;br /&gt;
* [[Terrain]]&lt;br /&gt;
** Floor [[Darkness]]&lt;br /&gt;
* [[Statistics]]&lt;br /&gt;
* [[Status Conditions]]&lt;br /&gt;
* [[Recruitment]]&lt;br /&gt;
* [[Traps]]&lt;br /&gt;
* [[:Category:Moves|Moves]]&lt;br /&gt;
* [[:Category:Items|Items]]&lt;br /&gt;
* [[:Category:Abilities|Abilities]]&lt;br /&gt;
* [[:Category:Game Mechanics|Misc. game mechanics]]&lt;br /&gt;
&lt;br /&gt;
=== Ground Maps and Cutscenes ===&lt;br /&gt;
* [[Text Guide|Text Tag Guide]]&lt;br /&gt;
&lt;br /&gt;
=== Scripting ===&lt;br /&gt;
* [[Script Reference]]&lt;br /&gt;
** [[Scripting Cheat Sheet]]&lt;br /&gt;
* [[Service Events]]&lt;br /&gt;
* [[Random Number Generators]]&lt;br /&gt;
* Data Structure Documentation&lt;br /&gt;
** [[BattleContext Reference| BattleContext]]&lt;br /&gt;
** [[BattleData Reference| BattleData]] (Effects of moves, items, etc.)&lt;br /&gt;
** [[DataManager Reference| DataManager]] (_DATA module)&lt;br /&gt;
** [[IntrinsicData Reference| IntrinsicData]] (Abilities)&lt;br /&gt;
** [[ItemData Reference| ItemData]] (Items)&lt;br /&gt;
** [[MapStatusData Reference| MapStatusData]] (Map Statuses/Weather)&lt;br /&gt;
** [[MonsterData Reference| MonsterData]] (Pokémon)&lt;br /&gt;
** [[SkillData Reference| SkillData]] (Moves)&lt;br /&gt;
** [[StatusData Reference| StatusData]] (Status conditions)&lt;br /&gt;
** [[TileData Reference| TileData]] (Traps et. al.)&lt;br /&gt;
* [[Modding Strings]]&lt;br /&gt;
* [[List of BattleEvents]]&lt;br /&gt;
&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* [[Controller Support]]&lt;br /&gt;
* C# [[Code Documentation]] links&lt;br /&gt;
&lt;br /&gt;
== Free-to-use Resources ==&lt;br /&gt;
&lt;br /&gt;
=== Scripts ===&lt;br /&gt;
* [[SingleEvent Scripts]] (custom dungeon events)&lt;br /&gt;
* [[BattleEvent Scripts]] (custom moves/abilities/items etc.)&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board|Mission Generation Library]] by [[User:MistressNebula|MistressNebula]]&lt;br /&gt;
&lt;br /&gt;
=== Graphics ===&lt;br /&gt;
* [https://drive.google.com/drive/u/0/folders/1OzUciIeuqk2GsQ7Q645vBi4yRjToKBWV PMD Cleaned Assets] by [[User:Imbion|Imbion]] for cleaned Explorers and Rescuers assets, including some tilesets. Credit should be either linked to the drive itself or to PMD Cleaned Assets.&lt;br /&gt;
&lt;br /&gt;
==== Ground Map Props ====&lt;br /&gt;
* [https://drive.google.com/drive/folders/1Mp-8VpNXNdnfI-hZk7eEiuKGscZZ3lXJ &amp;quot;New Neighborhood November&amp;quot; town assets] by [https://bsky.app/profile/jaidonkin.bsky.social/ JaiFain]&lt;br /&gt;
* [https://www.dropbox.com/scl/fi/owxfyzqqegvrb96l5pq2m/House-sprites.png?rlkey=pwrkfnhq1kjs1aowvtk3csswt&amp;amp;st=7nizxe4v&amp;amp;dl=0 Rescue Team-style house sprites] by oulongtea&lt;br /&gt;
&lt;br /&gt;
==== Pokémon Sprites ====&lt;br /&gt;
* [https://sprites.pmdcollab.org/ SpriteCollab]. Most of these are in PMDO already. If you use something that wasn&#039;t, you &#039;&#039;&#039;must&#039;&#039;&#039; credit the artist in your mod.&lt;br /&gt;
* [https://nsc.pmdcollab.org/ NotSpriteCollab]. Non-Pokémon sprites. You &#039;&#039;&#039;must&#039;&#039;&#039; credit the artist in your mod if you use these.&lt;br /&gt;
&lt;br /&gt;
=== Music ===&lt;br /&gt;
* [https://drive.google.com/file/d/1oNXa9SO45sNwuTdYnbFsvsmMzctnlhOs/view?usp=sharing Rescue Team, Explorers, Gates to Infinity, and Zwei!! looped OGG files]&lt;br /&gt;
&lt;br /&gt;
[[Category: Modding]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Modding_Hub&amp;diff=2822</id>
		<title>Modding Hub</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Modding_Hub&amp;diff=2822"/>
		<updated>2025-07-29T20:17:55Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: /* Scripts */  Add Mission Generation Library&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tutorials ==&lt;br /&gt;
If it&#039;s your first time making a mod, start here:&lt;br /&gt;
* [[Modding Intro]]&lt;br /&gt;
* [https://www.youtube.com/playlist?list=PLXlJTVdeyhO-rQnuRU7A0BIxutM8mL0Wg Audino&#039;s Video Tutorials]&lt;br /&gt;
&lt;br /&gt;
Optional but &#039;&#039;highly&#039;&#039; recommended:&lt;br /&gt;
* [[Getting Started With Git]]&lt;br /&gt;
&lt;br /&gt;
=== Graphics ===&lt;br /&gt;
* [[Modding Portraits and Sprites]]&lt;br /&gt;
* [[Modding Objects and VFX]]&lt;br /&gt;
* [[Modding Tilesets]]&lt;br /&gt;
* [[Modding Font]]&lt;br /&gt;
&lt;br /&gt;
=== Audio ===&lt;br /&gt;
* [[Modding Music]]&lt;br /&gt;
&lt;br /&gt;
=== Dungeon Generation ===&lt;br /&gt;
* [[Creating Dungeons]] by editing Tropical Path&lt;br /&gt;
* [[Creating Dungeons from Scratch]]&lt;br /&gt;
** [[Using Themes]]&lt;br /&gt;
** [[Using SpreadPlans]]&lt;br /&gt;
** [[Creating Dungeon Shops]]&lt;br /&gt;
** [[Creating Monster Houses]]&lt;br /&gt;
** [[Creating Vaults]]&lt;br /&gt;
** [[Creating Mid-Dungeon Boss Rooms]]&lt;br /&gt;
** [[Creating Branching Dungeons]]&lt;br /&gt;
* [[Creating Dungeon Maps]]&lt;br /&gt;
* [[Custom Floor Generation Steps]]&lt;br /&gt;
&lt;br /&gt;
=== Game Mechanics ===&lt;br /&gt;
* [[Creating Items]]&lt;br /&gt;
** [[Creating TMs]]&lt;br /&gt;
* [[Creating Moves]]&lt;br /&gt;
* [[Creating Map Statuses]] (i.e. weather and field effects)&lt;br /&gt;
* [[Creating New Types]]&lt;br /&gt;
* [[Creating Terrain]]&lt;br /&gt;
* [[Creating New Pokémon]]&lt;br /&gt;
&lt;br /&gt;
=== Ground Maps and Cutscenes ===&lt;br /&gt;
* [[Creating Ground Maps]]&lt;br /&gt;
* [[Creating Ground Map NPCs]]&lt;br /&gt;
* [[Custom Ground Item Actions]]&lt;br /&gt;
&lt;br /&gt;
=== Scripting ===&lt;br /&gt;
* [[Services]]&lt;br /&gt;
* [[Making Custom Menus]]&lt;br /&gt;
** [[Editing the Top Menu]]&lt;br /&gt;
** [[Editing the Main Menu]]&lt;br /&gt;
* [[Lua Conversion Guide|Converting C# classes to Lua]]&lt;br /&gt;
* [[Avoiding Desyncs]] in replays and quicksaves&lt;br /&gt;
* [[Basic Zone Scripts]]&lt;br /&gt;
&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* [[Manual Install]]&lt;br /&gt;
* [[Contributing Code]] to the engine&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[Dev Mode]]&lt;br /&gt;
&lt;br /&gt;
=== Graphics ===&lt;br /&gt;
* [[PMD Sprite Format]]&lt;br /&gt;
* [[Sprite Tool|Sprite Tool Manual]]&lt;br /&gt;
* [[Mass Sprite Import]] (Advanced. Modders can skip this page.)&lt;br /&gt;
&lt;br /&gt;
=== Audio ===&lt;br /&gt;
* [[Ogg Tags]]&lt;br /&gt;
&lt;br /&gt;
=== Dungeon Generation ===&lt;br /&gt;
* [[Floor Generation Overview]]&lt;br /&gt;
* [[Zone Step Overview]]&lt;br /&gt;
&lt;br /&gt;
=== Game Mechanics ===&lt;br /&gt;
* [[AI Overview]]&lt;br /&gt;
* Pokémon [[Spawn Features]]&lt;br /&gt;
* [[Move Ranges]]&lt;br /&gt;
* [[Map Statuses]] (weather, Electric Terrain, Trick Room, etc.)&lt;br /&gt;
* [[Terrain]]&lt;br /&gt;
** Floor [[Darkness]]&lt;br /&gt;
* [[Statistics]]&lt;br /&gt;
* [[Status Conditions]]&lt;br /&gt;
* [[Recruitment]]&lt;br /&gt;
* [[Traps]]&lt;br /&gt;
* [[:Category:Moves|Moves]]&lt;br /&gt;
* [[:Category:Items|Items]]&lt;br /&gt;
* [[:Category:Abilities|Abilities]]&lt;br /&gt;
* [[:Category:Game Mechanics|Misc. game mechanics]]&lt;br /&gt;
&lt;br /&gt;
=== Ground Maps and Cutscenes ===&lt;br /&gt;
* [[Text Guide|Text Tag Guide]]&lt;br /&gt;
&lt;br /&gt;
=== Scripting ===&lt;br /&gt;
* [[Script Reference]]&lt;br /&gt;
** [[Scripting Cheat Sheet]]&lt;br /&gt;
* [[Service Events]]&lt;br /&gt;
* [[Random Number Generators]]&lt;br /&gt;
* Data Structure Documentation&lt;br /&gt;
** [[BattleContext Reference| BattleContext]]&lt;br /&gt;
** [[BattleData Reference| BattleData]] (Effects of moves, items, etc.)&lt;br /&gt;
** [[DataManager Reference| DataManager]] (_DATA module)&lt;br /&gt;
** [[IntrinsicData Reference| IntrinsicData]] (Abilities)&lt;br /&gt;
** [[ItemData Reference| ItemData]] (Items)&lt;br /&gt;
** [[MapStatusData Reference| MapStatusData]] (Map Statuses/Weather)&lt;br /&gt;
** [[MonsterData Reference| MonsterData]] (Pokémon)&lt;br /&gt;
** [[SkillData Reference| SkillData]] (Moves)&lt;br /&gt;
** [[StatusData Reference| StatusData]] (Status conditions)&lt;br /&gt;
** [[TileData Reference| TileData]] (Traps et. al.)&lt;br /&gt;
* [[Modding Strings]]&lt;br /&gt;
* [[List of BattleEvents]]&lt;br /&gt;
&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* [[Controller Support]]&lt;br /&gt;
* C# [[Code Documentation]] links&lt;br /&gt;
&lt;br /&gt;
== Free-to-use Resources ==&lt;br /&gt;
&lt;br /&gt;
=== Scripts ===&lt;br /&gt;
* [[SingleEvent Scripts]] (custom dungeon events)&lt;br /&gt;
* [[BattleEvent Scripts]] (custom moves/abilities/items etc.)&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board|Mission Generation Library]] by MistressNebula&lt;br /&gt;
&lt;br /&gt;
=== Graphics ===&lt;br /&gt;
* [https://drive.google.com/drive/u/0/folders/1OzUciIeuqk2GsQ7Q645vBi4yRjToKBWV PMD Cleaned Assets] by [[User:Imbion|Imbion]] for cleaned Explorers and Rescuers assets, including some tilesets. Credit should be either linked to the drive itself or to PMD Cleaned Assets.&lt;br /&gt;
&lt;br /&gt;
==== Ground Map Props ====&lt;br /&gt;
* [https://drive.google.com/drive/folders/1Mp-8VpNXNdnfI-hZk7eEiuKGscZZ3lXJ &amp;quot;New Neighborhood November&amp;quot; town assets] by [https://bsky.app/profile/jaidonkin.bsky.social/ JaiFain]&lt;br /&gt;
* [https://www.dropbox.com/scl/fi/owxfyzqqegvrb96l5pq2m/House-sprites.png?rlkey=pwrkfnhq1kjs1aowvtk3csswt&amp;amp;st=7nizxe4v&amp;amp;dl=0 Rescue Team-style house sprites] by oulongtea&lt;br /&gt;
&lt;br /&gt;
==== Pokémon Sprites ====&lt;br /&gt;
* [https://sprites.pmdcollab.org/ SpriteCollab]. Most of these are in PMDO already. If you use something that wasn&#039;t, you &#039;&#039;&#039;must&#039;&#039;&#039; credit the artist in your mod.&lt;br /&gt;
* [https://nsc.pmdcollab.org/ NotSpriteCollab]. Non-Pokémon sprites. You &#039;&#039;&#039;must&#039;&#039;&#039; credit the artist in your mod if you use these.&lt;br /&gt;
&lt;br /&gt;
=== Music ===&lt;br /&gt;
* [https://drive.google.com/file/d/1oNXa9SO45sNwuTdYnbFsvsmMzctnlhOs/view?usp=sharing Rescue Team, Explorers, Gates to Infinity, and Zwei!! looped OGG files]&lt;br /&gt;
&lt;br /&gt;
[[Category: Modding]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board&amp;diff=2821</id>
		<title>Mod:Nebula&#039;s Mission Board</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board&amp;diff=2821"/>
		<updated>2025-07-29T18:54:12Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: /* Advanced guide */ Redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[User:MistressNebula|Nebula]]&#039;s Mission Board is a mod that adds a mission board to the base PMDO game, allowing players to embark in missions to gain special items and money and to gain experience.&lt;br /&gt;
It looks and plays essentially the same as the base game&#039;s Enable Mission Board mod, except that all job generation and job handling functions are dealt with by a highly customizable library bundled within the mod, built with the express purpose of being as easy to import and implement as possible while giving experienced modders the tools they need to make even more complex systems and behaviors.&lt;br /&gt;
&lt;br /&gt;
== PMDO Mission Generation Library ==&lt;br /&gt;
The library itself is fully contained inside the Data/Script/missiongen_lib folder inside the mod. By taking this folder and moving it to your mod, you will have access to all of its functions. Remember to credit MistressNebula if you include this library in your project!&lt;br /&gt;
&lt;br /&gt;
Do keep in mind that simply moving the files inside your mod is not enough to set up the library: you will also need to hook all of the necessary events to your mod. Please refer to the links at the bottom of this page for a more in-depth guide on how to do it.&lt;br /&gt;
&lt;br /&gt;
===== How the library is structured =====&lt;br /&gt;
The library is broken up into 5 files:&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_lib.lua&amp;lt;/code&amp;gt; is the core file of the library. It&#039;s where the most important structures, functions and global variables are defined and handled, as well as the one containing all the hooks that mods are expected to use to interface with it.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_settings.lua&amp;lt;/code&amp;gt; contains a table of parameters and properties used by the library to function. This is the file that modders are supposed to edit to alter the behavior of the library. Every setting is documented individually, describing its format, what it is used for and what kind of data it requires. The file is loaded directly by the main file, and is not supposed to be loaded directly.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_menus.lua&amp;lt;/code&amp;gt; is a file whose sole purpose is to contain the menus used by the library. It is loaded automatically by the main file, and its functions are not supposed to be interacted with directly.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_service.lua&amp;lt;/code&amp;gt; is the file that contains the service required by the library to handle loading, menu edits and dungeon completion tracking. It needs to be loaded separately from the main file. This file also contains the only value outside of the settings file that MIGHT require changing. More details in the setup guide below.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_devcheck.lua&amp;lt;/code&amp;gt; contains a function, called by the main file when loading, whose purpose is to check, to the best of its abilities, if the values inside the settings file are valid, and print the results of its test to the console. If this file is deleted or misplaced, the check will simply be skipped. This file is only loaded when the game is in [[Dev Mode]]. If you hear the music restart when loading your save data, it&#039;s because of this file.&lt;br /&gt;
&lt;br /&gt;
===== Setup guides =====&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/Basic setup|Basic setup]]&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Hook implementations|Hook implementations]]&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Editing settings|Editing settings]]&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ String keys|String keys]]&lt;br /&gt;
&lt;br /&gt;
===== Easy guides =====&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Job boards|Setting up job boards]]&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Reward cutscenes|Making reward cutscenes]]&lt;br /&gt;
** [[Mod:Nebula&#039;s Mission Board/ Job Table|Job Table Documentation]]&lt;br /&gt;
&lt;br /&gt;
===== Intermediate guide =====&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Handcrafted jobs|Making handcrafted jobs]]&lt;br /&gt;
&lt;br /&gt;
===== Advanced guide =====&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Job callbacks|Job callbacks]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Handcrafted_jobs&amp;diff=2820</id>
		<title>Mod:Nebula&#039;s Mission Board/ Handcrafted jobs</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Handcrafted_jobs&amp;diff=2820"/>
		<updated>2025-07-29T18:53:05Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: Redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Mission Generation Library contains a method that allows the creation of basic jobs with arbitrarily chosen parameters. These jobs do not have to abide by any of the rules that the normal job generation uses, so do keep in mind that you might have to run a few checks to make sure you&#039;re not going off script, or to simply give the job to the player only when the rules are all respected. You can also choose not to care, of course, but that might have some consequences depending on what isn&#039;t being respected.&amp;lt;/br&amp;gt;&lt;br /&gt;
Here&#039;s a quick rundown of the rules followed by the library, and how to check if your desired job data would break them:&lt;br /&gt;
* &#039;&#039;&#039;No two jobs should be on the same floor&#039;&#039;&#039; - If this is not respected, the player will only be able to keep one of the jobs active at the same time.&lt;br /&gt;
: Check with: &amp;lt;code&amp;gt;MissionGen:IsDestinationOccupied(zone, segment, floor)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;The number of guest jobs in the same dungeon should not be higher than &amp;quot;max_guests&amp;quot;&#039;&#039;&#039; - This might make the adventure more difficult if &amp;quot;guests_take_up_space&amp;quot; is true, because the game might remove more party members than expected.&lt;br /&gt;
: Check with: &amp;lt;code&amp;gt;MissionGen:GetDungeonsGuestCount()[zone]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After handling all the rules you care about respecting, you can move on to actually creating the job. This is done with the following function:&lt;br /&gt;
&amp;lt;pre&amp;gt;MissionGen:MakeNewJob(zone, segment, floor, job_type, client, target, target_item, reward_type, rewards, title, flavor, hide_floor, objective_key)&amp;lt;/pre&amp;gt;&lt;br /&gt;
As you can see, there are a lot of parameters, though the great majority of them is optional. Those that are will have a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; beside its type. Any missing parameter that is required for the given job type to function will be generated randomly:&lt;br /&gt;
* &amp;lt;code&amp;gt;zone&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: The id of the zone this job takes place in.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;segment&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: The specific segment this job takes place in.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: The destination floor of this job.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;job_type&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: The id of the type of this job. It must always be equal to one of the following values: &amp;quot;RESCUE_SELF&amp;quot;, &amp;quot;RESCUE_FRIEND&amp;quot;, &amp;quot;ESCORT&amp;quot;, &amp;quot;EXPLORATION&amp;quot;, &amp;quot;DELIVERY&amp;quot;, &amp;quot;LOST_ITEM&amp;quot;, &amp;quot;OUTLAW&amp;quot;, &amp;quot;OUTLAW_ITEM&amp;quot;, &amp;quot;OUTLAW_ITEM_UNK&amp;quot;, &amp;quot;OUTLAW_MONSTER_HOUSE&amp;quot;, &amp;quot;OUTLAW_FLEE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string|monsterIDTable&amp;lt;/code&amp;gt;: Data that will be used for the client of this job. If it&#039;s not a mosterIdTable (see below), it must be either &amp;quot;ENFORCER&amp;quot;, &amp;quot;OFFICER&amp;quot; or &amp;quot;AGENT&amp;quot;. A law enforcement character will be selected using different rules depending on the string.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string|monsterIDTable&amp;lt;/code&amp;gt;: Data that will be used for the target of this job. If it&#039;s not a mosterIdTable (see below), it must be either &amp;quot;ENFORCER&amp;quot;, &amp;quot;OFFICER&amp;quot; or &amp;quot;AGENT&amp;quot;. A law enforcement character will be selected using different rules depending on the string. This value will be used only if the job type requires a target.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_item&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string?&amp;lt;/code&amp;gt;: The id of the item that will be used as target. This value will be used only if the job type requires an item.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;reward_type&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string?&amp;lt;/code&amp;gt;: The combination of rewards that will be awarded for this job. It must always be equal to one of the following values: &amp;quot;item&amp;quot;, &amp;quot;money&amp;quot;, &amp;quot;item_item&amp;quot;, &amp;quot;money_item&amp;quot;, &amp;quot;client&amp;quot;, &amp;quot;exclusive&amp;quot;. If &amp;lt;code&amp;gt;rewards&amp;lt;/code&amp;gt; is set, this value will be inferred from the items used, even if a value was already provided.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;rewards&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;{string|itemTable?, string|itemTable?}&amp;lt;/code&amp;gt;: The item rewards that will be awarded for this job. If not set but &amp;lt;code&amp;gt;reward_type&amp;lt;/code&amp;gt; is, they will be generated automatically. You can either write only the id of the item, or use a full itemTable (see below). If the first item is nil, it will award money in its place.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string?&amp;lt;/code&amp;gt;: The string key to use for this job&#039;s title. If not set, it will be chosen randomly.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;flavor&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;{string, string?}?&amp;lt;/code&amp;gt;: The string key, or keys, to use for this job&#039;s flavor text. If not set, they will be chosen randomly.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;hide_floor&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;boolean?&amp;lt;/code&amp;gt;: If true, the job&#039;s floor will be hidden when viewing the job inside menus.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;objective_key&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string?&amp;lt;/code&amp;gt; A string key that will be used instead of the job_type one to display this job&#039;s objective.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;monsterIDTable&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  Species:string,&lt;br /&gt;
  Form:integer,&lt;br /&gt;
  Skin:string,&lt;br /&gt;
  Gender:integer,&lt;br /&gt;
  Nickname:string?&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;itemTable&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;{id:string, count:integer?, hidden:string?}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MakeNewJob&amp;lt;/code&amp;gt; will return a fully-formed [[Mod:Nebula&#039;s Mission Board/ Job Table|JobTable]], which can then be edited further either indirectly or with other functions. Once you&#039;re done, however, you will need to add a BackReference to it, otherwise the game won&#039;t know where to send the player for the reward cutscene. This can be done in two ways, depending on what you want to accomplish; if you want to give the job directly to the player, you can do this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:SetBackReference(&amp;lt;job&amp;gt;, &amp;lt;board_id&amp;gt;)&lt;br /&gt;
MissionGen:AddJobToTaken(&amp;lt;job&amp;gt;, &amp;lt;startActive&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the JobTable.&lt;br /&gt;
* &amp;lt;code&amp;gt;board_id&amp;lt;/code&amp;gt; is the board the job should bring the player to after completing it.&lt;br /&gt;
* &amp;lt;code&amp;gt;startActive&amp;lt;/code&amp;gt; is an optional boolean that tells the game whether or not to set the job as active as it gets added to the taken list. Defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. &lt;br /&gt;
If, instead of giving it directly to the player, you want to add the job to a board, you can do this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:AddJobToBoard(&amp;lt;board_id&amp;gt;, &amp;lt;job&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;board_id&amp;lt;/code&amp;gt; is the board the job will be added to, and that will be set as BackReference.&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the JobTable.&lt;br /&gt;
With this done, the job is now fully set up and can be safely presented to the player.&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board&amp;diff=2819</id>
		<title>Mod:Nebula&#039;s Mission Board</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board&amp;diff=2819"/>
		<updated>2025-07-29T18:52:01Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: /* Intermediate guide */ Redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[User:MistressNebula|Nebula]]&#039;s Mission Board is a mod that adds a mission board to the base PMDO game, allowing players to embark in missions to gain special items and money and to gain experience.&lt;br /&gt;
It looks and plays essentially the same as the base game&#039;s Enable Mission Board mod, except that all job generation and job handling functions are dealt with by a highly customizable library bundled within the mod, built with the express purpose of being as easy to import and implement as possible while giving experienced modders the tools they need to make even more complex systems and behaviors.&lt;br /&gt;
&lt;br /&gt;
== PMDO Mission Generation Library ==&lt;br /&gt;
The library itself is fully contained inside the Data/Script/missiongen_lib folder inside the mod. By taking this folder and moving it to your mod, you will have access to all of its functions. Remember to credit MistressNebula if you include this library in your project!&lt;br /&gt;
&lt;br /&gt;
Do keep in mind that simply moving the files inside your mod is not enough to set up the library: you will also need to hook all of the necessary events to your mod. Please refer to the links at the bottom of this page for a more in-depth guide on how to do it.&lt;br /&gt;
&lt;br /&gt;
===== How the library is structured =====&lt;br /&gt;
The library is broken up into 5 files:&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_lib.lua&amp;lt;/code&amp;gt; is the core file of the library. It&#039;s where the most important structures, functions and global variables are defined and handled, as well as the one containing all the hooks that mods are expected to use to interface with it.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_settings.lua&amp;lt;/code&amp;gt; contains a table of parameters and properties used by the library to function. This is the file that modders are supposed to edit to alter the behavior of the library. Every setting is documented individually, describing its format, what it is used for and what kind of data it requires. The file is loaded directly by the main file, and is not supposed to be loaded directly.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_menus.lua&amp;lt;/code&amp;gt; is a file whose sole purpose is to contain the menus used by the library. It is loaded automatically by the main file, and its functions are not supposed to be interacted with directly.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_service.lua&amp;lt;/code&amp;gt; is the file that contains the service required by the library to handle loading, menu edits and dungeon completion tracking. It needs to be loaded separately from the main file. This file also contains the only value outside of the settings file that MIGHT require changing. More details in the setup guide below.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_devcheck.lua&amp;lt;/code&amp;gt; contains a function, called by the main file when loading, whose purpose is to check, to the best of its abilities, if the values inside the settings file are valid, and print the results of its test to the console. If this file is deleted or misplaced, the check will simply be skipped. This file is only loaded when the game is in [[Dev Mode]]. If you hear the music restart when loading your save data, it&#039;s because of this file.&lt;br /&gt;
&lt;br /&gt;
===== Setup guides =====&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/Basic setup|Basic setup]]&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Hook implementations|Hook implementations]]&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Editing settings|Editing settings]]&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ String keys|String keys]]&lt;br /&gt;
&lt;br /&gt;
===== Easy guides =====&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Job boards|Setting up job boards]]&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Reward cutscenes|Making reward cutscenes]]&lt;br /&gt;
** [[Mod:Nebula&#039;s Mission Board/ Job Table|Job Table Documentation]]&lt;br /&gt;
&lt;br /&gt;
===== Intermediate guide =====&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Handcrafted jobs|Making handcrafted jobs]]&lt;br /&gt;
&lt;br /&gt;
===== Advanced guide =====&lt;br /&gt;
* [[MissionGen guide: Job callbacks|Job callbacks]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula/MissionGen:_Handcrafted_jobs&amp;diff=2818</id>
		<title>User:MistressNebula/MissionGen: Handcrafted jobs</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula/MissionGen:_Handcrafted_jobs&amp;diff=2818"/>
		<updated>2025-07-29T18:51:06Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page User:MistressNebula/MissionGen: Handcrafted jobs to Mod:Nebula&amp;#039;s Mission Board/ Handcrafted jobs: Move to Mod namespace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Mod:Nebula&#039;s Mission Board/ Handcrafted jobs]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Handcrafted_jobs&amp;diff=2817</id>
		<title>Mod:Nebula&#039;s Mission Board/ Handcrafted jobs</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Handcrafted_jobs&amp;diff=2817"/>
		<updated>2025-07-29T18:51:06Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page User:MistressNebula/MissionGen: Handcrafted jobs to Mod:Nebula&amp;#039;s Mission Board/ Handcrafted jobs: Move to Mod namespace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Mission Generation Library contains a method that allows the creation of basic jobs with arbitrarily chosen parameters. These jobs do not have to abide by any of the rules that the normal job generation uses, so do keep in mind that you might have to run a few checks to make sure you&#039;re not going off script, or to simply give the job to the player only when the rules are all respected. You can also choose not to care, of course, but that might have some consequences depending on what isn&#039;t being respected.&amp;lt;/br&amp;gt;&lt;br /&gt;
Here&#039;s a quick rundown of the rules followed by the library, and how to check if your desired job data would break them:&lt;br /&gt;
* &#039;&#039;&#039;No two jobs should be on the same floor&#039;&#039;&#039; - If this is not respected, the player will only be able to keep one of the jobs active at the same time.&lt;br /&gt;
: Check with: &amp;lt;code&amp;gt;MissionGen:IsDestinationOccupied(zone, segment, floor)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;The number of guest jobs in the same dungeon should not be higher than &amp;quot;max_guests&amp;quot;&#039;&#039;&#039; - This might make the adventure more difficult if &amp;quot;guests_take_up_space&amp;quot; is true, because the game might remove more party members than expected.&lt;br /&gt;
: Check with: &amp;lt;code&amp;gt;MissionGen:GetDungeonsGuestCount()[zone]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After handling all the rules you care about respecting, you can move on to actually creating the job. This is done with the following function:&lt;br /&gt;
&amp;lt;pre&amp;gt;MissionGen:MakeNewJob(zone, segment, floor, job_type, client, target, target_item, reward_type, rewards, title, flavor, hide_floor, objective_key)&amp;lt;/pre&amp;gt;&lt;br /&gt;
As you can see, there are a lot of parameters, though the great majority of them is optional. Those that are will have a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; beside its type. Any missing parameter that is required for the given job type to function will be generated randomly:&lt;br /&gt;
* &amp;lt;code&amp;gt;zone&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: The id of the zone this job takes place in.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;segment&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: The specific segment this job takes place in.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: The destination floor of this job.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;job_type&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: The id of the type of this job. It must always be equal to one of the following values: &amp;quot;RESCUE_SELF&amp;quot;, &amp;quot;RESCUE_FRIEND&amp;quot;, &amp;quot;ESCORT&amp;quot;, &amp;quot;EXPLORATION&amp;quot;, &amp;quot;DELIVERY&amp;quot;, &amp;quot;LOST_ITEM&amp;quot;, &amp;quot;OUTLAW&amp;quot;, &amp;quot;OUTLAW_ITEM&amp;quot;, &amp;quot;OUTLAW_ITEM_UNK&amp;quot;, &amp;quot;OUTLAW_MONSTER_HOUSE&amp;quot;, &amp;quot;OUTLAW_FLEE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string|monsterIDTable&amp;lt;/code&amp;gt;: Data that will be used for the client of this job. If it&#039;s not a mosterIdTable (see below), it must be either &amp;quot;ENFORCER&amp;quot;, &amp;quot;OFFICER&amp;quot; or &amp;quot;AGENT&amp;quot;. A law enforcement character will be selected using different rules depending on the string.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string|monsterIDTable&amp;lt;/code&amp;gt;: Data that will be used for the target of this job. If it&#039;s not a mosterIdTable (see below), it must be either &amp;quot;ENFORCER&amp;quot;, &amp;quot;OFFICER&amp;quot; or &amp;quot;AGENT&amp;quot;. A law enforcement character will be selected using different rules depending on the string. This value will be used only if the job type requires a target.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;target_item&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string?&amp;lt;/code&amp;gt;: The id of the item that will be used as target. This value will be used only if the job type requires an item.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;reward_type&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string?&amp;lt;/code&amp;gt;: The combination of rewards that will be awarded for this job. It must always be equal to one of the following values: &amp;quot;item&amp;quot;, &amp;quot;money&amp;quot;, &amp;quot;item_item&amp;quot;, &amp;quot;money_item&amp;quot;, &amp;quot;client&amp;quot;, &amp;quot;exclusive&amp;quot;. If &amp;lt;code&amp;gt;rewards&amp;lt;/code&amp;gt; is set, this value will be inferred from the items used, even if a value was already provided.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;rewards&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;{string|itemTable?, string|itemTable?}&amp;lt;/code&amp;gt;: The item rewards that will be awarded for this job. If not set but &amp;lt;code&amp;gt;reward_type&amp;lt;/code&amp;gt; is, they will be generated automatically. You can either write only the id of the item, or use a full itemTable (see below). If the first item is nil, it will award money in its place.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string?&amp;lt;/code&amp;gt;: The string key to use for this job&#039;s title. If not set, it will be chosen randomly.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;flavor&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;{string, string?}?&amp;lt;/code&amp;gt;: The string key, or keys, to use for this job&#039;s flavor text. If not set, they will be chosen randomly.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;hide_floor&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;boolean?&amp;lt;/code&amp;gt;: If true, the job&#039;s floor will be hidden when viewing the job inside menus.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;objective_key&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string?&amp;lt;/code&amp;gt; A string key that will be used instead of the job_type one to display this job&#039;s objective.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;monsterIDTable&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  Species:string,&lt;br /&gt;
  Form:integer,&lt;br /&gt;
  Skin:string,&lt;br /&gt;
  Gender:integer,&lt;br /&gt;
  Nickname:string?&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;itemTable&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;{id:string, count:integer?, hidden:string?}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MakeNewJob&amp;lt;/code&amp;gt; will return a fully-formed [[User:MistressNebula/MissionGen: Job Table|JobTable]], which can then be edited further either indirectly or with other functions. Once you&#039;re done, however, you will need to add a BackReference to it, otherwise the game won&#039;t know where to send the player for the reward cutscene. This can be done in two ways, depending on what you want to accomplish; if you want to give the job directly to the player, you can do this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:SetBackReference(&amp;lt;job&amp;gt;, &amp;lt;board_id&amp;gt;)&lt;br /&gt;
MissionGen:AddJobToTaken(&amp;lt;job&amp;gt;, &amp;lt;startActive&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the JobTable.&lt;br /&gt;
* &amp;lt;code&amp;gt;board_id&amp;lt;/code&amp;gt; is the board the job should bring the player to after completing it.&lt;br /&gt;
* &amp;lt;code&amp;gt;startActive&amp;lt;/code&amp;gt; is an optional boolean that tells the game whether or not to set the job as active as it gets added to the taken list. Defaults to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. &lt;br /&gt;
If, instead of giving it directly to the player, you want to add the job to a board, you can do this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:AddJobToBoard(&amp;lt;board_id&amp;gt;, &amp;lt;job&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;board_id&amp;lt;/code&amp;gt; is the board the job will be added to, and that will be set as BackReference.&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the JobTable.&lt;br /&gt;
With this done, the job is now fully set up and can be safely presented to the player.&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Reward_cutscenes&amp;diff=2816</id>
		<title>Mod:Nebula&#039;s Mission Board/ Reward cutscenes</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Reward_cutscenes&amp;diff=2816"/>
		<updated>2025-07-29T18:03:12Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: Redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When players leave a dungeon successfully after completing at least one job, they will be brought to the map defined inside the &amp;lt;code&amp;gt;[[Mod:Nebula&#039;s Mission Board/ Editing settings#end_dungeon_day_destination|end_dungeon_day_destination]]&amp;lt;/code&amp;gt; setting. The library will then expect your code to use the reward handler here.&amp;lt;/br&amp;gt;&lt;br /&gt;
Do note that the end_dungeon_day_destination can also be a place where you assigned one or more job boards. It doesn&#039;t need to be a completely separate place.&lt;br /&gt;
&lt;br /&gt;
Go to your &amp;lt;code&amp;gt;end_dungeon_day_destination&amp;lt;/code&amp;gt;&#039;s &amp;lt;code&amp;gt;Enter&amp;lt;/code&amp;gt; function and paste this code in it, before any kind of fade-in occurs:&lt;br /&gt;
&amp;lt;pre&amp;gt;if MissionGen:HasCompletedMissions() then&lt;br /&gt;
  MissionGen:PlayJobsCompletedCutscene()&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
If the map has no job board assigned to it, this is already everything you need to do. &amp;lt;code&amp;gt;PlayJobsCompletedCutscene&amp;lt;/code&amp;gt; will move the flow of execution to the maps where the completed jobs&#039; board is set and then simply return, letting those maps handle the rest.&lt;br /&gt;
If that is not the case, however, you will also need to write the reward cutscene, and then pass it to the function like so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:PlayJobsCompletedCutscene(&amp;lt;callback&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This should be done in any map where there&#039;s a job board.&lt;br /&gt;
&lt;br /&gt;
=== Writing a Reward Cutscene ===&lt;br /&gt;
When &amp;lt;code&amp;gt;PlayJobsCompletedCutscene&amp;lt;/code&amp;gt; is called, it looks for the first completed job in the taken list. If the board that job has been taken from is not assigned to the current map, the player is transported to the correct map, where another instance of the function is then expected to run. If the map is correct, however, a list of [https://github.com/RogueCollab/RogueEssence/blob/master/RogueEssence/Ground/GroundChar.cs GroundChars] is created and then passed to the callback you provided the function with, alongside the job table itself. In other words, the callback needs to be a function with the following signature:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(job, npcs)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the Job Table. See the [[Mod:Nebula&#039;s Mission Board/ Job Table|Job Table Documentation]] page for more details&lt;br /&gt;
* &amp;lt;code&amp;gt;npcs&amp;lt;/code&amp;gt; is the list of GroundChars, already added to the map at the coordinates 0, 0. It contains 4 characters for law enforcement jobs, 2 for jobs with a friendly target, and 1 for jobs with no targets&lt;br /&gt;
&lt;br /&gt;
This function is what needs to implement the reward cutscene. You can use the job data and the number of npcs created to move the characters to the correct positions, differentiate between multiple boardss in the same map, if you have to, and then display a different introductory dialogue depending on the job type. Then, whenever you need to actually give the rewards to your players, call the following function&lt;br /&gt;
&amp;lt;pre&amp;gt;MissionGen:RewardPlayer(job, speaker, line1, line2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the Job Table, needed to read what the rewards are&lt;br /&gt;
* &amp;lt;code&amp;gt;speaker&amp;lt;/code&amp;gt; is the character that will say the lines given in the next parameters. If omitted, the lines will be displayed with no speaker.&lt;br /&gt;
* &amp;lt;code&amp;gt;line1&amp;lt;/code&amp;gt; is the line that &amp;lt;code&amp;gt;speaker&amp;lt;/code&amp;gt; will say before giving the first reward to the player, unless the client itself is the reward&lt;br /&gt;
* &amp;lt;code&amp;gt;line2&amp;lt;/code&amp;gt; is the line that &amp;lt;code&amp;gt;speaker&amp;lt;/code&amp;gt; will say before giving the second reward to the player, if it exists&lt;br /&gt;
&lt;br /&gt;
This function will handle everything in regards to rewards, without moving the characters around. You will then be able to add more actions after it returns.&lt;br /&gt;
&lt;br /&gt;
When the cutscene is done, simply add a fade-out, and you&#039;ll be good to go. &amp;lt;code&amp;gt;PlayJobsCompletedCutscene&amp;lt;/code&amp;gt; will dispose of the characters and move to the next completed job, or return control to the player if there are no more completed jobs.&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board&amp;diff=2815</id>
		<title>Mod:Nebula&#039;s Mission Board</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board&amp;diff=2815"/>
		<updated>2025-07-29T18:01:31Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: /* Easy guides */  Redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[User:MistressNebula|Nebula]]&#039;s Mission Board is a mod that adds a mission board to the base PMDO game, allowing players to embark in missions to gain special items and money and to gain experience.&lt;br /&gt;
It looks and plays essentially the same as the base game&#039;s Enable Mission Board mod, except that all job generation and job handling functions are dealt with by a highly customizable library bundled within the mod, built with the express purpose of being as easy to import and implement as possible while giving experienced modders the tools they need to make even more complex systems and behaviors.&lt;br /&gt;
&lt;br /&gt;
== PMDO Mission Generation Library ==&lt;br /&gt;
The library itself is fully contained inside the Data/Script/missiongen_lib folder inside the mod. By taking this folder and moving it to your mod, you will have access to all of its functions. Remember to credit MistressNebula if you include this library in your project!&lt;br /&gt;
&lt;br /&gt;
Do keep in mind that simply moving the files inside your mod is not enough to set up the library: you will also need to hook all of the necessary events to your mod. Please refer to the links at the bottom of this page for a more in-depth guide on how to do it.&lt;br /&gt;
&lt;br /&gt;
===== How the library is structured =====&lt;br /&gt;
The library is broken up into 5 files:&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_lib.lua&amp;lt;/code&amp;gt; is the core file of the library. It&#039;s where the most important structures, functions and global variables are defined and handled, as well as the one containing all the hooks that mods are expected to use to interface with it.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_settings.lua&amp;lt;/code&amp;gt; contains a table of parameters and properties used by the library to function. This is the file that modders are supposed to edit to alter the behavior of the library. Every setting is documented individually, describing its format, what it is used for and what kind of data it requires. The file is loaded directly by the main file, and is not supposed to be loaded directly.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_menus.lua&amp;lt;/code&amp;gt; is a file whose sole purpose is to contain the menus used by the library. It is loaded automatically by the main file, and its functions are not supposed to be interacted with directly.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_service.lua&amp;lt;/code&amp;gt; is the file that contains the service required by the library to handle loading, menu edits and dungeon completion tracking. It needs to be loaded separately from the main file. This file also contains the only value outside of the settings file that MIGHT require changing. More details in the setup guide below.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_devcheck.lua&amp;lt;/code&amp;gt; contains a function, called by the main file when loading, whose purpose is to check, to the best of its abilities, if the values inside the settings file are valid, and print the results of its test to the console. If this file is deleted or misplaced, the check will simply be skipped. This file is only loaded when the game is in [[Dev Mode]]. If you hear the music restart when loading your save data, it&#039;s because of this file.&lt;br /&gt;
&lt;br /&gt;
===== Setup guides =====&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/Basic setup|Basic setup]]&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Hook implementations|Hook implementations]]&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Editing settings|Editing settings]]&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ String keys|String keys]]&lt;br /&gt;
&lt;br /&gt;
===== Easy guides =====&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Job boards|Setting up job boards]]&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Reward cutscenes|Making reward cutscenes]]&lt;br /&gt;
** [[Mod:Nebula&#039;s Mission Board/ Job Table|Job Table Documentation]]&lt;br /&gt;
&lt;br /&gt;
===== Intermediate guide =====&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Handcrafted jobs|Making handcrafted jobs]]&lt;br /&gt;
&lt;br /&gt;
===== Advanced guide =====&lt;br /&gt;
* [[MissionGen guide: Job callbacks|Job callbacks]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula/MissionGen:_Job_Table&amp;diff=2814</id>
		<title>User:MistressNebula/MissionGen: Job Table</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula/MissionGen:_Job_Table&amp;diff=2814"/>
		<updated>2025-07-29T18:00:42Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page User:MistressNebula/MissionGen: Job Table to Mod:Nebula&amp;#039;s Mission Board/ Job Table: Move to Mod namespace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Mod:Nebula&#039;s Mission Board/ Job Table]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Job_Table&amp;diff=2813</id>
		<title>Mod:Nebula&#039;s Mission Board/ Job Table</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Job_Table&amp;diff=2813"/>
		<updated>2025-07-29T18:00:42Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page User:MistressNebula/MissionGen: Job Table to Mod:Nebula&amp;#039;s Mission Board/ Job Table: Move to Mod namespace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of all fields contained inside a Job Table.&amp;lt;/br&amp;gt;&lt;br /&gt;
Fields with a ? to their side can be safely set to &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; depending on the circumstances.&lt;br /&gt;
&lt;br /&gt;
==== Client ====&lt;br /&gt;
A MonsterID-style table describing the client of the job.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  Species:string,&lt;br /&gt;
  Form:integer?,&lt;br /&gt;
  Skin:string?,&lt;br /&gt;
  Gender:integer?,&lt;br /&gt;
  Nickname:string?&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Target ====&lt;br /&gt;
MonsterID style table describing the target. Must be set if the job type expects a target.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  Species:string,&lt;br /&gt;
  Form:integer?,&lt;br /&gt;
  Skin:string?,&lt;br /&gt;
  Gender:integer?,&lt;br /&gt;
  Nickname:string?&lt;br /&gt;
}?&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Flavor ====&lt;br /&gt;
Pair of string keys displayed when the job details are displayed. The second key is optional.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;{string, string?}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Title ====&lt;br /&gt;
String key displayed when browsing quest boards.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;string&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Zone ====&lt;br /&gt;
The id of the zone this job takes place in.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;string&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Segment ====&lt;br /&gt;
The specific segment this job takes place in.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;integer&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Floor ====&lt;br /&gt;
The destination floor of this job.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;integer&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== RewardType ====&lt;br /&gt;
The id of the combination of rewards that will be awarded by this job. It must always be equal to one of the following values:&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;money&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;item&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;money_item&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;item_item&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;client&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;exclusive&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;string&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Reward1 ====&lt;br /&gt;
Data of the first item awarded by the job. Must be set if RewardType expects a visible item reward.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;{id:string, count:integer?, hidden:string?}?&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Reward2 ====&lt;br /&gt;
Data of the second item awarded by the job. Must be set if RewardType expects a hidden item reward.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;{id:string, count:integer?, hidden:string?}?&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Type ====&lt;br /&gt;
The id of the type of this job. It must always be equal to one of the following values:&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;RESCUE_SELF&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;RESCUE_FRIEND&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;ESCORT&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;EXPLORATION&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;DELIVERY&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;LOST_ITEM&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;OUTLAW&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;OUTLAW_ITEM&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;OUTLAW_ITEM_UNK&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;OUTLAW_MONSTER_HOUSE&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;OUTLAW_FLEE&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;string&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Completion ====&lt;br /&gt;
The state of the job. -1 means failed. 0 means not completed. 1 means completed. This is always reset to 0 on day end if the job rewards are not claimed (like when an adventure is failed).&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;integer&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Taken ====&lt;br /&gt;
This variable means different things depending on what list this job is in:&lt;br /&gt;
* Taken list: if true, the job is active.&lt;br /&gt;
* Boards: if true, the job is considered to be inside the taken list.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;boolean&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== BackReference ====&lt;br /&gt;
Contains the id of the board it was in. It is used only in the taken list for discarding jobs and for routing the player during the reward process.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;string?&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Difficulty ====&lt;br /&gt;
The difficulty index of this job. It is stored as a number instead of a string for ease of calculations.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;integer&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Item ====&lt;br /&gt;
The id of the item this job requires. It must be set if the job type requires a target item.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;string?&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Special ====&lt;br /&gt;
Special jobs can be triggered sometimes. If so, this will contain the special job category id.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;string?&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== HideFloor ====&lt;br /&gt;
If this is true, the target floor of this job will be hidden when inside menus.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;boolean&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Callbacks ====&lt;br /&gt;
Table of callbacks with their respective parameters. Empty by default. You can add callbacks using the &amp;lt;code&amp;gt;RegisterCallback&amp;lt;/code&amp;gt; library function. Every job can only have one callback per event.&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;table&amp;lt;string, {name:string, args:table}&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ObjectiveOverride ====&lt;br /&gt;
A string key that, if set, is used instead of the job type&#039;s objective key. It only affects menus.&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: client&lt;br /&gt;
* {1}: target&lt;br /&gt;
* {2}: item&lt;br /&gt;
====== Type ======&lt;br /&gt;
&amp;lt;pre&amp;gt;string?&amp;lt;/pre&amp;gt;&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula/MissionGen:_Job_boards&amp;diff=2812</id>
		<title>User:MistressNebula/MissionGen: Job boards</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula/MissionGen:_Job_boards&amp;diff=2812"/>
		<updated>2025-07-29T17:59:51Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page User:MistressNebula/MissionGen: Job boards to Mod:Nebula&amp;#039;s Mission Board/ Job boards: Move to Mod namespace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Mod:Nebula&#039;s Mission Board/ Job boards]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Job_boards&amp;diff=2811</id>
		<title>Mod:Nebula&#039;s Mission Board/ Job boards</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Job_boards&amp;diff=2811"/>
		<updated>2025-07-29T17:59:50Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page User:MistressNebula/MissionGen: Job boards to Mod:Nebula&amp;#039;s Mission Board/ Job boards: Move to Mod namespace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;small&amp;gt;This guide expects you to have completed the setup guides.&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Mission Generation Library is equipped with functions to make interacting with jobs as easy as possible, both for modders and for players. This includes a full set of menus that allow the player to interact with jobs and job boards, and a group of functions made to effortlessly and safely open those menus.&lt;br /&gt;
&lt;br /&gt;
The first thing you need to do is to add an object to the ground map. It might be a mailbox, an actual mission board or even an NPC, it makes no difference. You will then have to add this code somewhere in the interact function:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:BoardInteract(&amp;lt;board_id&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will call a menu that allows the player to interact the board whose id corresponds to the given string, or to check their taken jobs. If you want them to skip directly to the board without displaying this first menu, call the following function instead:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:OpenBoardMenu(&amp;lt;board_id&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
There is also the option of displaying a single job, like the NPCs in the Spinda Cafe do. All you have to do is call this function:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:ShowSingularJob(&amp;lt;board_id&amp;gt;, [index])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This is best used in conjunction with boards with a size of 1, which would then allow you to omit the index altogether.&lt;br /&gt;
&lt;br /&gt;
As a bonus, here&#039;s how to display the taken list by itself. If default is omitted, slot 1 will be selected:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:OpenTakenMenu([default])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And that&#039;s it! When it comes to it, displaying job boards is really simple! Just remember that if a board is empty, its menu will not be shown at all, so remember to make sure the board has something in it by using these functions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:IsBoardEmpty(&amp;lt;board_id&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
MissionGen:IsTakenListEmpty()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board&amp;diff=2810</id>
		<title>Mod:Nebula&#039;s Mission Board</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board&amp;diff=2810"/>
		<updated>2025-07-29T17:53:56Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: /* Setup guides */  Redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[User:MistressNebula|Nebula]]&#039;s Mission Board is a mod that adds a mission board to the base PMDO game, allowing players to embark in missions to gain special items and money and to gain experience.&lt;br /&gt;
It looks and plays essentially the same as the base game&#039;s Enable Mission Board mod, except that all job generation and job handling functions are dealt with by a highly customizable library bundled within the mod, built with the express purpose of being as easy to import and implement as possible while giving experienced modders the tools they need to make even more complex systems and behaviors.&lt;br /&gt;
&lt;br /&gt;
== PMDO Mission Generation Library ==&lt;br /&gt;
The library itself is fully contained inside the Data/Script/missiongen_lib folder inside the mod. By taking this folder and moving it to your mod, you will have access to all of its functions. Remember to credit MistressNebula if you include this library in your project!&lt;br /&gt;
&lt;br /&gt;
Do keep in mind that simply moving the files inside your mod is not enough to set up the library: you will also need to hook all of the necessary events to your mod. Please refer to the links at the bottom of this page for a more in-depth guide on how to do it.&lt;br /&gt;
&lt;br /&gt;
===== How the library is structured =====&lt;br /&gt;
The library is broken up into 5 files:&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_lib.lua&amp;lt;/code&amp;gt; is the core file of the library. It&#039;s where the most important structures, functions and global variables are defined and handled, as well as the one containing all the hooks that mods are expected to use to interface with it.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_settings.lua&amp;lt;/code&amp;gt; contains a table of parameters and properties used by the library to function. This is the file that modders are supposed to edit to alter the behavior of the library. Every setting is documented individually, describing its format, what it is used for and what kind of data it requires. The file is loaded directly by the main file, and is not supposed to be loaded directly.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_menus.lua&amp;lt;/code&amp;gt; is a file whose sole purpose is to contain the menus used by the library. It is loaded automatically by the main file, and its functions are not supposed to be interacted with directly.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_service.lua&amp;lt;/code&amp;gt; is the file that contains the service required by the library to handle loading, menu edits and dungeon completion tracking. It needs to be loaded separately from the main file. This file also contains the only value outside of the settings file that MIGHT require changing. More details in the setup guide below.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_devcheck.lua&amp;lt;/code&amp;gt; contains a function, called by the main file when loading, whose purpose is to check, to the best of its abilities, if the values inside the settings file are valid, and print the results of its test to the console. If this file is deleted or misplaced, the check will simply be skipped. This file is only loaded when the game is in [[Dev Mode]]. If you hear the music restart when loading your save data, it&#039;s because of this file.&lt;br /&gt;
&lt;br /&gt;
===== Setup guides =====&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/Basic setup|Basic setup]]&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Hook implementations|Hook implementations]]&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ Editing settings|Editing settings]]&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board/ String keys|String keys]]&lt;br /&gt;
&lt;br /&gt;
===== Easy guides =====&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Job boards|Setting up job boards]]&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Reward cutscenes|Making reward cutscenes]]&lt;br /&gt;
** [[User:MistressNebula/MissionGen: Job Table|Job Table Documentation]]&lt;br /&gt;
&lt;br /&gt;
===== Intermediate guide =====&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Handcrafted jobs|Making handcrafted jobs]]&lt;br /&gt;
&lt;br /&gt;
===== Advanced guide =====&lt;br /&gt;
* [[MissionGen guide: Job callbacks|Job callbacks]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula/MissionGen:_Hook_implementations&amp;diff=2809</id>
		<title>User:MistressNebula/MissionGen: Hook implementations</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula/MissionGen:_Hook_implementations&amp;diff=2809"/>
		<updated>2025-07-29T17:51:00Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page User:MistressNebula/MissionGen: Hook implementations to Mod:Nebula&amp;#039;s Mission Board/ Hook implementations: Move to Mod namespace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Mod:Nebula&#039;s Mission Board/ Hook implementations]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Hook_implementations&amp;diff=2808</id>
		<title>Mod:Nebula&#039;s Mission Board/ Hook implementations</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Hook_implementations&amp;diff=2808"/>
		<updated>2025-07-29T17:51:00Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page User:MistressNebula/MissionGen: Hook implementations to Mod:Nebula&amp;#039;s Mission Board/ Hook implementations: Move to Mod namespace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains the standard implementation of all of the library&#039;s most essential hooks, sorted by the file the are supposed to be in. You are free to copy-paste them from here, instead of the example mod&#039;s files, and edit them afterwards if you need to do so.&amp;lt;br/&amp;gt;&lt;br /&gt;
Most event calls just consist of calling the corresponding library function and passing all parameters down to it, but the common functions can be a bit more involved.&lt;br /&gt;
&lt;br /&gt;
=== common.lua ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen = require(&amp;quot;missiongen_lib.missiongen_lib&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
function COMMON.ShowDestinationMenu(dungeon_entrances, ground_entrances, force_list, speaker, confirm_msg)&lt;br /&gt;
  local job_dests = MissionGen:LoadJobDestinations()&lt;br /&gt;
&lt;br /&gt;
  local open_dests = {}&lt;br /&gt;
  -- check for unlock of grounds&lt;br /&gt;
  for ii = 1, #ground_entrances, 1 do&lt;br /&gt;
    if ground_entrances[ii].Flag then&lt;br /&gt;
      local ground_id = ground_entrances[ii].Zone&lt;br /&gt;
      local zone_summary = _DATA.DataIndices[RogueEssence.Data.DataManager.DataType.Zone]:Get(ground_id)&lt;br /&gt;
      local ground = _DATA:GetGround(zone_summary.Grounds[ground_entrances[ii].ID])&lt;br /&gt;
      local ground_name = ground:GetColoredName()&lt;br /&gt;
      table.insert(open_dests, {&lt;br /&gt;
        Name = ground_name,&lt;br /&gt;
        Dest = RogueEssence.Dungeon.ZoneLoc(ground_id, -1, ground_entrances[ii].ID, ground_entrances[ii].Entry)&lt;br /&gt;
      })&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  -- check for unlock of dungeons&lt;br /&gt;
  for ii = 1, #dungeon_entrances, 1 do&lt;br /&gt;
    if GAME:DungeonUnlocked(dungeon_entrances[ii]) then&lt;br /&gt;
      local zone_summary = _DATA.DataIndices[RogueEssence.Data.DataManager.DataType.Zone]:Get(dungeon_entrances[ii])&lt;br /&gt;
      if zone_summary.Released then&lt;br /&gt;
        local zone_name = &amp;quot;&amp;quot;&lt;br /&gt;
        if _DATA.Save:GetDungeonUnlock(dungeon_entrances[ii]) ==&lt;br /&gt;
          RogueEssence.Data.GameProgress.UnlockState.Completed then&lt;br /&gt;
          zone_name = zone_summary:GetColoredName()&lt;br /&gt;
        else&lt;br /&gt;
          zone_name = &amp;quot;[color=#00FFFF]&amp;quot; .. zone_summary.Name:ToLocal() .. &amp;quot;[color]&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        zone_name = MissionGen:FormatDestinationMenuZoneName(job_dests, dungeon_entrances[ii], zone_name) -- missiongen_lib.lua&lt;br /&gt;
&lt;br /&gt;
        table.insert(open_dests, {&lt;br /&gt;
          Name = zone_name,&lt;br /&gt;
          Dest = RogueEssence.Dungeon.ZoneLoc(dungeon_entrances[ii], 0, 0, 0)&lt;br /&gt;
        })&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  local dest = RogueEssence.Dungeon.ZoneLoc.Invalid&lt;br /&gt;
  if #open_dests &amp;gt; 1 or force_list then&lt;br /&gt;
    if before_list ~= nil then&lt;br /&gt;
      before_list(dest)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    SOUND:PlaySE(&amp;quot;Menu/Skip&amp;quot;)&lt;br /&gt;
    local default_choice = 1&lt;br /&gt;
    while true do&lt;br /&gt;
      UI:ResetSpeaker()&lt;br /&gt;
      UI:DestinationMenu(open_dests, default_choice)&lt;br /&gt;
      UI:WaitForChoice()&lt;br /&gt;
      default_choice = UI:ChoiceResult()&lt;br /&gt;
&lt;br /&gt;
      if default_choice == nil then&lt;br /&gt;
        break&lt;br /&gt;
      end&lt;br /&gt;
      local ask_dest = open_dests[default_choice].Dest&lt;br /&gt;
      if ask_dest.StructID.Segment &amp;gt;= 0 then&lt;br /&gt;
        -- chosen dungeon entry&lt;br /&gt;
        if speaker ~= nil then&lt;br /&gt;
          UI:SetSpeaker(speaker)&lt;br /&gt;
        else&lt;br /&gt;
          UI:ResetSpeaker(false)&lt;br /&gt;
        end&lt;br /&gt;
        UI:DungeonChoice(open_dests[default_choice].Name, ask_dest)&lt;br /&gt;
        UI:WaitForChoice()&lt;br /&gt;
        if UI:ChoiceResult() then&lt;br /&gt;
          dest = ask_dest&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      else&lt;br /&gt;
        dest = ask_dest&lt;br /&gt;
        break&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  elseif #open_dests == 1 then&lt;br /&gt;
    if open_dests[1].Dest.StructID.Segment &amp;lt; 0 then&lt;br /&gt;
      -- single ground entry&lt;br /&gt;
      if speaker ~= nil then&lt;br /&gt;
        UI:SetSpeaker(speaker)&lt;br /&gt;
      else&lt;br /&gt;
        UI:ResetSpeaker(false)&lt;br /&gt;
        SOUND:PlaySE(&amp;quot;Menu/Skip&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
      UI:ChoiceMenuYesNo(STRINGS:FormatKey(&amp;quot;DLG_ASK_ENTER_GROUND&amp;quot;, open_dests[1].Name))&lt;br /&gt;
      UI:WaitForChoice()&lt;br /&gt;
      if UI:ChoiceResult() then&lt;br /&gt;
        dest = open_dests[1].Dest&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      -- single dungeon entry&lt;br /&gt;
      if speaker ~= nil then&lt;br /&gt;
        UI:SetSpeaker(speaker)&lt;br /&gt;
      else&lt;br /&gt;
        UI:ResetSpeaker(false)&lt;br /&gt;
        SOUND:PlaySE(&amp;quot;Menu/Skip&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
      UI:DungeonChoice(open_dests[1].Name, open_dests[1].Dest)&lt;br /&gt;
      UI:WaitForChoice()&lt;br /&gt;
      if UI:ChoiceResult() then&lt;br /&gt;
        dest = open_dests[1].Dest&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  else&lt;br /&gt;
    PrintInfo(&amp;quot;No valid destinations found!&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if dest:IsValid() then&lt;br /&gt;
    if confirm_msg ~= nil then&lt;br /&gt;
      UI:WaitShowDialogue(confirm_msg)&lt;br /&gt;
    end&lt;br /&gt;
    if dest.StructID.Segment &amp;gt; -1 then&lt;br /&gt;
      -- pre-loads the zone on a separate thread while we fade out, just for a little optimization&lt;br /&gt;
      _DATA:PreLoadZone(dest.ID)&lt;br /&gt;
      SOUND:PlayBGM(&amp;quot;&amp;quot;, true)&lt;br /&gt;
      GAME:FadeOut(false, 20)&lt;br /&gt;
      GAME:EnterDungeon(dest.ID, dest.StructID.Segment, dest.StructID.ID, dest.EntryPoint,&lt;br /&gt;
          RogueEssence.Data.GameProgress.DungeonStakes.Risk, true, false)&lt;br /&gt;
    else&lt;br /&gt;
      SOUND:PlayBGM(&amp;quot;&amp;quot;, true)&lt;br /&gt;
      GAME:FadeOut(false, 20)&lt;br /&gt;
      GAME:EnterZone(dest.ID, dest.StructID.Segment, dest.StructID.ID, dest.EntryPoint)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function COMMON.EnterDungeonMissionCheck(zoneId, segmentID)&lt;br /&gt;
  local escort_jobs, removed_names = MissionGen:EnterDungeonPrepareParty(zoneId)&lt;br /&gt;
  MissionGen:PrintSentHome(removed_names)&lt;br /&gt;
&lt;br /&gt;
  local added_names = MissionGen:EnterDungeonAddJobEscorts(zoneId, escort_jobs)&lt;br /&gt;
  for _, name in ipairs(COMMON.GetSortedKeys(SV.missions.Missions)) do&lt;br /&gt;
    local mission = SV.missions.Missions[name]&lt;br /&gt;
    if mission.Complete == COMMON.MISSION_INCOMPLETE and zoneId == mission.DestZone and segmentID ==&lt;br /&gt;
      mission.DestSegment then&lt;br /&gt;
      if mission.Type == 1 then -- escort&lt;br /&gt;
        -- add escort to team&lt;br /&gt;
        local mon_id = mission.EscortSpecies&lt;br /&gt;
        local new_mob = _DATA.Save.ActiveTeam:CreatePlayer(_DATA.Save.Rand, mon_id, 50, &amp;quot;&amp;quot;, -1)&lt;br /&gt;
        _DATA.Save.ActiveTeam.Guests:Add(new_mob)&lt;br /&gt;
&lt;br /&gt;
        local talk_evt = RogueEssence.Dungeon.BattleScriptEvent(&amp;quot;EscortInteract&amp;quot;)&lt;br /&gt;
        new_mob.ActionEvents:Add(talk_evt)&lt;br /&gt;
&lt;br /&gt;
        local tbl = LTBL(new_mob)&lt;br /&gt;
        tbl.Escort = name&lt;br /&gt;
&lt;br /&gt;
        table.insert(added_names, new_mob.Name)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  MissionGen:PrintEscortAdd(added_names)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== common_vars.lua ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---Check used in missiongen_settings to see if there is an active sidequest in the current zone&lt;br /&gt;
function COMMON.HasSidequestInZone(zone)&lt;br /&gt;
  for _, mission in pairs(SV.missions.Missions) do&lt;br /&gt;
    if mission.DestZone == zone then&lt;br /&gt;
      return true&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---Overrides origin function.&lt;br /&gt;
function COMMON.ExitDungeonMissionCheckEx(result, rescue, zoneId, segmentID)&lt;br /&gt;
  --remove all guests from the dungeon&lt;br /&gt;
  return MissionGen:ExitDungeonMissionCheckEx(result, rescue, zoneId, segmentID)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== event_battle.lua ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--- Reuse origin code&lt;br /&gt;
local base_game_escort_interact = BATTLE_SCRIPT.EscortInteract&lt;br /&gt;
function BATTLE_SCRIPT.EscortInteract(owner, ownerChar, context, args)&lt;br /&gt;
  if (context.Target.LuaData.JobReference) then&lt;br /&gt;
    MissionGen:EscortInteract(owner, ownerChar, context, args)&lt;br /&gt;
  else&lt;br /&gt;
    base_game_escort_interact(owner, ownerChar, context, args)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function BATTLE_SCRIPT.EscortReached(owner, ownerChar, context, args)&lt;br /&gt;
  MissionGen:EscortReached(owner, ownerChar, context, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function BATTLE_SCRIPT.RescueReached(owner, ownerChar, context, args)&lt;br /&gt;
  MissionGen:RescueReached(owner, ownerChar, context, args)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== event_mapgen.lua ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function ZONE_GEN_SCRIPT.GenerateJobInFloor(zoneContext, context, queue, seed, args)&lt;br /&gt;
  MissionGen:GenerateJobInFloor(zoneContext, context, queue, seed, args)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== event_single.lua ===&lt;br /&gt;
&amp;lt;pre&amp;gt;function SINGLE_CHAR_SCRIPT.SpawnOutlaw(owner, ownerChar, context, args)&lt;br /&gt;
  MissionGen:SpawnOutlaw(owner, ownerChar, context, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function SINGLE_CHAR_SCRIPT.OutlawFloor(owner, ownerChar, context, args)&lt;br /&gt;
  MissionGen:OutlawFloor(owner, ownerChar, context, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function SINGLE_CHAR_SCRIPT.OutlawDeathCheck(owner, ownerChar, context, args)&lt;br /&gt;
  MissionGen:OutlawDeathCheck(owner, ownerChar, context, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function SINGLE_CHAR_SCRIPT.OutlawCheck(owner, ownerChar, context, args)&lt;br /&gt;
  MissionGen:OutlawCheck(owner, ownerChar, context, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function SINGLE_CHAR_SCRIPT.MonsterHouseOutlawCheck(owner, ownerChar, context, args)&lt;br /&gt;
  MissionGen:MonsterHouseOutlawCheck(owner, ownerChar, context, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function SINGLE_CHAR_SCRIPT.OutlawItemCheckItem(owner, ownerChar, context, args)&lt;br /&gt;
  MissionGen:OutlawItemCheckItem(owner, ownerChar, context, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function SINGLE_CHAR_SCRIPT.OutlawItemCheck(owner, ownerChar, context, args)&lt;br /&gt;
  MissionGen:OutlawItemCheck(owner, ownerChar, context, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function SINGLE_CHAR_SCRIPT.OutlawFleeStairsCheck(owner, ownerChar, context, args)&lt;br /&gt;
  MissionGen:OutlawFleeStairsCheck(owner, ownerChar, context, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function SINGLE_CHAR_SCRIPT.ExplorationReached(owner, ownerChar, context, args)&lt;br /&gt;
  MissionGen:ExplorationReached(owner, ownerChar, context, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function SINGLE_CHAR_SCRIPT.MissionItemCheck(owner, ownerChar, context, args)&lt;br /&gt;
  MissionGen:MissionItemCheck(owner, ownerChar, context, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function SINGLE_CHAR_SCRIPT.MissionGuestCheck(owner, ownerChar, context, args)&lt;br /&gt;
  MissionGen:MissionGuestCheck(owner, ownerChar, context, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function SINGLE_CHAR_SCRIPT.MobilityEndTurn(owner, ownerChar, context, args)&lt;br /&gt;
  MissionGen:MobilityEndTurn(owner, ownerChar, context, args)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula/MissionGen:_String_keys&amp;diff=2807</id>
		<title>User:MistressNebula/MissionGen: String keys</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula/MissionGen:_String_keys&amp;diff=2807"/>
		<updated>2025-07-29T17:47:35Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page User:MistressNebula/MissionGen: String keys to Mod:Nebula&amp;#039;s Mission Board/ String keys: Move to Mod namespace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Mod:Nebula&#039;s Mission Board/ String keys]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_String_keys&amp;diff=2806</id>
		<title>Mod:Nebula&#039;s Mission Board/ String keys</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_String_keys&amp;diff=2806"/>
		<updated>2025-07-29T17:47:35Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page User:MistressNebula/MissionGen: String keys to Mod:Nebula&amp;#039;s Mission Board/ String keys: Move to Mod namespace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Mission Generation Library requires a selection of strings to be set up in order to display things correctly. Most of them are defined by modders using the &amp;lt;code&amp;gt;missiongen_settings.lua&amp;lt;/code&amp;gt; file, and every setting specifies in its documentation which string file needs to contain its entries. There are, however, a few string keys that are defined by the library itself, and are used by key components of the system, like for displaying objectives and rewards, or as event messages during jobs.&lt;br /&gt;
These strings are defined near the top of &amp;lt;code&amp;gt;missiongen_lib.lua&amp;lt;/code&amp;gt;, but are also listed here for convenience. Every string has its own list of allowed text placeholders:&lt;br /&gt;
==strings.resx==&lt;br /&gt;
Static display keys that are fetched from &amp;lt;code&amp;gt;strings.resx&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_OBJECTIVE_RESCUE_SELF ===&lt;br /&gt;
&lt;br /&gt;
Objective string for jobs where you rescue the client. &lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: Client&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_OBJECTIVE_RESCUE_FRIEND ===&lt;br /&gt;
&lt;br /&gt;
Objective string for jobs where you rescue the target. &lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: Client&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: Target&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_OBJECTIVE_ESCORT ===&lt;br /&gt;
&lt;br /&gt;
Objective string for escort jobs. &lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: Client&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: Target&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_OBJECTIVE_EXPLORATION ===&lt;br /&gt;
&lt;br /&gt;
Objective string for exploration jobs. &lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: Client&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_OBJECTIVE_DELIVERY ===&lt;br /&gt;
&lt;br /&gt;
Objective string for delivery jobs. &lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: Client&lt;br /&gt;
* &amp;lt;code&amp;gt;{2}&amp;lt;/code&amp;gt;: Item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_OBJECTIVE_LOST_ITEM ===&lt;br /&gt;
&lt;br /&gt;
Objective string for lost item jobs. &lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: Client&lt;br /&gt;
* &amp;lt;code&amp;gt;{2}&amp;lt;/code&amp;gt;: Item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_OBJECTIVE_OUTLAW ===&lt;br /&gt;
&lt;br /&gt;
Objective string for regular outlaw jobs. &lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: Client&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: Target,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_OBJECTIVE_OUTLAW_ITEM ===&lt;br /&gt;
&lt;br /&gt;
Objective string for stolen item outlaw jobs. &lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: Client&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: Target&lt;br /&gt;
* &amp;lt;code&amp;gt;{2}&amp;lt;/code&amp;gt;: Item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_OBJECTIVE_OUTLAW_ITEM_UNK ===&lt;br /&gt;
&lt;br /&gt;
Objective string for stolen item outlaw jobs whose target is supposed to be hidden. &lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: Client&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: Target&lt;br /&gt;
* &amp;lt;code&amp;gt;{2}&amp;lt;/code&amp;gt;: Item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_OBJECTIVE_OUTLAW_MONSTER_HOUSE ===&lt;br /&gt;
&lt;br /&gt;
Objective string for outlaw monster house jobs. &lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: Client&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: Target&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_OBJECTIVE_OUTLAW_FLEE ===&lt;br /&gt;
&lt;br /&gt;
Objective string for fleeing outlaw jobs. &lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: Client&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: Target&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_OBJECTIVE_DEFAULT ===&lt;br /&gt;
&lt;br /&gt;
Objective string displayed when there are no jobs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_OBJECTIVE_REACH_SEGMENT ===&lt;br /&gt;
&lt;br /&gt;
Objective string displayed when there are jobs in a different segment. &lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: Segment&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_OPTION_JOBLIST ===&lt;br /&gt;
&lt;br /&gt;
Name of the main menu button that displays the taken list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_OPTION_OBJECTIVES_LIST ===&lt;br /&gt;
&lt;br /&gt;
Name of the main menu button that displays the current objectives&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BOARD_TAKEN_TITLE ===&lt;br /&gt;
&lt;br /&gt;
Name of the taken board in the board menu&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_OBJECTIVES_TITLE ===&lt;br /&gt;
&lt;br /&gt;
Label for the button used to view mission objectives in dungeons&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_ACCEPTED ===&lt;br /&gt;
&lt;br /&gt;
Displayed when viewing boards. It shows how full the taken list is. &lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt; Current Taken Count&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: Taken Limit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_SUMMARY ===&lt;br /&gt;
&lt;br /&gt;
Displays the Job Summary label text&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_CLIENT ===&lt;br /&gt;
&lt;br /&gt;
Displays the Client label text&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_OBJECTIVE ===&lt;br /&gt;
&lt;br /&gt;
Displays the Objective label text&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_PLACE ===&lt;br /&gt;
&lt;br /&gt;
Displays the Place label text&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_DIFFICULTY ===&lt;br /&gt;
&lt;br /&gt;
Displays the Difficulty label text&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_REWARD ===&lt;br /&gt;
&lt;br /&gt;
Displays the Reward label text&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== EXTRA_REWARD_AMOUNT ===&lt;br /&gt;
&lt;br /&gt;
Displays the Extra Reward. &lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: Amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_REWARD_SINGLE ===&lt;br /&gt;
&lt;br /&gt;
Reward string for a job with 1 reward. &lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: Reward1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_REWARD_DOUBLE ===&lt;br /&gt;
&lt;br /&gt;
Reward string for a job with 2 rewards. &lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: Reward1&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: Reward2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_REWARD_UNKNOWN ===&lt;br /&gt;
&lt;br /&gt;
Reward string for special rewards. Meant to be hidden. &lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: Reward1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_TAKE ===&lt;br /&gt;
&lt;br /&gt;
Label for the button used to take jobs or to activate them&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_DELETE ===&lt;br /&gt;
&lt;br /&gt;
Label for the button used to delete taken jobs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MENU_JOB_SUSPEND ===&lt;br /&gt;
&lt;br /&gt;
Label for the button used to suspend jobs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==stringsEx.resx==&lt;br /&gt;
Static display keys that are fetched from &amp;lt;code&amp;gt;stringsEx.resx&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_RESCUE_FOUND === &lt;br /&gt;
&lt;br /&gt;
Message for finding a rescue target and asking whether or not to warp it out.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: pokémon&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_RESCUE_CONFIRM === &lt;br /&gt;
&lt;br /&gt;
Message for agreeing to warp out a rescue target.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: pokémon&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_DELIVERY_FOUND === &lt;br /&gt;
&lt;br /&gt;
Message for finding a delivery target and asking whether or not to give it the requested item.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: pokémon&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_DELIVERY_CONFIRM === &lt;br /&gt;
&lt;br /&gt;
Dialogue from the target thanking the player for the item.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_DELIVERY_DENY === &lt;br /&gt;
&lt;br /&gt;
Dialogue from the target being sad about the player refusing to give the item.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_DELIVERY_NO_ITEM === &lt;br /&gt;
&lt;br /&gt;
Message for not having the requested item.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: pokémon&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_DELIVERY_NO_ITEM_CHAR === &lt;br /&gt;
&lt;br /&gt;
Dialogue from the target being sad about the player not having the item.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_TARGET_LEFT === &lt;br /&gt;
&lt;br /&gt;
Message for the target warping out after completing its mission.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: pokémon&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MISSION_ESCORT_ADD === &lt;br /&gt;
&lt;br /&gt;
Message for adding one escort guest to the party&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: guest&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MISSION_ESCORT_ADD_PLURAL === &lt;br /&gt;
&lt;br /&gt;
Message for adding multiple escort guests to the party.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: list of guests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MISSION_ESCORT_REACHED === &lt;br /&gt;
&lt;br /&gt;
Message for finding an escort target.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: client&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: target&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MISSION_ESCORT_THANKS === &lt;br /&gt;
&lt;br /&gt;
Dialogue from the guest thanking the player.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: target&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MISSION_ESCORT_DEPART === &lt;br /&gt;
&lt;br /&gt;
Message for client and target leaving the dungeon.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: client&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: target&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MISSION_ESCORT_UNAVAILABLE === &lt;br /&gt;
&lt;br /&gt;
Message for the guest being fainted or not close enough to the target.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: client&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: target&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MISSION_ESCORT_FAINTED === &lt;br /&gt;
&lt;br /&gt;
Message for the escort getting knocked out&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MISSION_EXPLORATION_REACHED === &lt;br /&gt;
&lt;br /&gt;
Message for reaching an exploration target floor.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: client&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: dungeon&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MISSION_EXPLORATION_THANKS === &lt;br /&gt;
&lt;br /&gt;
Dialogue from the guest thanking the player.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: dungeon&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MISSION_EXPLORATION_DEPART === &lt;br /&gt;
&lt;br /&gt;
Message for the exploration client leaving the dungeon.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: client&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: dungeon&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_LOST_ITEM_RETRIEVED === &lt;br /&gt;
&lt;br /&gt;
Message for retrieving a lost item.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: client&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_OUTLAW_SPAWN_FAIL === &lt;br /&gt;
&lt;br /&gt;
Message for whenever an outlaw fails to spawn&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_OUTLAW_REACHED === &lt;br /&gt;
&lt;br /&gt;
Message for reaching an outlaw floor.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: outlaw&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_OUTLAW_FLEE === &lt;br /&gt;
&lt;br /&gt;
Intro dialogue for a fleeing outlaw.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_OUTLAW_FLED === &lt;br /&gt;
&lt;br /&gt;
Message for a fleeing outlaw managing to escape.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: outlaw&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_OUTLAW_MONSTER_HOUSE === &lt;br /&gt;
&lt;br /&gt;
Intro dialogue for an outlaw with monster house.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_OUTLAW_DEFEATED === &lt;br /&gt;
&lt;br /&gt;
Message for an outlaw being defeated.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: outlaw&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_OUTLAW_MINIONS_DEFEATED === &lt;br /&gt;
&lt;br /&gt;
Dialogue from an outlaw thanking the player&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_OUTLAW_BOSS_DEFEATED === &lt;br /&gt;
&lt;br /&gt;
Message for an outlaw with monster house being defeated.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: outlaw&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_OUTLAW_HOUSE_DEFEATED === &lt;br /&gt;
&lt;br /&gt;
Message for an outlaw monster house being fully defeated.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: outlaw&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_OUTLAW_ITEM_RETRIEVED === &lt;br /&gt;
&lt;br /&gt;
Message for retrieving the stolen item from an outlaw.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: outlaw&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_OUTLAW_ITEM_UNK_RETRIEVED === &lt;br /&gt;
&lt;br /&gt;
Message for retrieving the stolen item from an outlaw before defeating the outlaw.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: outlaw&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_OUTLAW_ITEM_UNK_DEFEATED === &lt;br /&gt;
&lt;br /&gt;
Message for defeating an outlaw whose identity was unknown and seeing it drop the stolen item.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: outlaw&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_CONTINUE_ONGOING === &lt;br /&gt;
&lt;br /&gt;
Message that asks whether or not to stay in a dungeon when there are still more jobs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_CONTINUE_CONFIRM === &lt;br /&gt;
&lt;br /&gt;
Message that asks for confirmation before leaving a dungeon when there are still more jobs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DLG_MISSION_CONTINUE_NO_ONGOING === &lt;br /&gt;
&lt;br /&gt;
Message that asks whether or not to stay in a dungeon when there are no more jobs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MISSION_COMPLETED_CUTSCENE_AWARD_ITEM === &lt;br /&gt;
&lt;br /&gt;
Message used to notify the player about the item they were awarded.&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: team&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MISSION_COMPLETED_CUTSCENE_AWARD_ITEM_STORAGE === &lt;br /&gt;
&lt;br /&gt;
Message used to notify the player about fact that the item they were awarded was sent to storage.&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: team&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MISSION_COMPLETED_CUTSCENE_AWARD_MONEY === &lt;br /&gt;
&lt;br /&gt;
Message used to notify the player about the sum of money they were awarded.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: team&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: money&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MISSION_COMPLETED_CUTSCENE_AWARD_CHAR === &lt;br /&gt;
&lt;br /&gt;
Dialogue from a client that wants to join the team as the reward.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: team&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MISSION_COMPLETED_CUTSCENE_AWARD_CHAR_PROMPT === &lt;br /&gt;
&lt;br /&gt;
Message asking the player if they want the client as a team member.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: team&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: client&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MISSION_COMPLETED_CUTSCENE_AWARD_EXTRA === &lt;br /&gt;
&lt;br /&gt;
Message used to notify the player about the extra reward they were awarded.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: team&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: amount&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MISSION_COMPLETED_CUTSCENE_AWARD_RANK_UP === &lt;br /&gt;
&lt;br /&gt;
Message used to notify the player about a rank up.&lt;br /&gt;
&lt;br /&gt;
==== Placeholders ====&lt;br /&gt;
* &amp;lt;code&amp;gt;{0}&amp;lt;/code&amp;gt;: team&lt;br /&gt;
* &amp;lt;code&amp;gt;{1}&amp;lt;/code&amp;gt;: original rank&lt;br /&gt;
* &amp;lt;code&amp;gt;{2}&amp;lt;/code&amp;gt;: new rank&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Reward_cutscenes&amp;diff=2805</id>
		<title>Mod:Nebula&#039;s Mission Board/ Reward cutscenes</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Reward_cutscenes&amp;diff=2805"/>
		<updated>2025-07-29T17:44:07Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: Redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When players leave a dungeon successfully after completing at least one job, they will be brought to the map defined inside the &amp;lt;code&amp;gt;[[Mod:Nebula&#039;s Mission Board/ Editing settings#end_dungeon_day_destination|end_dungeon_day_destination]]&amp;lt;/code&amp;gt; setting. The library will then expect your code to use the reward handler here.&amp;lt;/br&amp;gt;&lt;br /&gt;
Do note that the end_dungeon_day_destination can also be a place where you assigned one or more job boards. It doesn&#039;t need to be a completely separate place.&lt;br /&gt;
&lt;br /&gt;
Go to your &amp;lt;code&amp;gt;end_dungeon_day_destination&amp;lt;/code&amp;gt;&#039;s &amp;lt;code&amp;gt;Enter&amp;lt;/code&amp;gt; function and paste this code in it, before any kind of fade-in occurs:&lt;br /&gt;
&amp;lt;pre&amp;gt;if MissionGen:HasCompletedMissions() then&lt;br /&gt;
  MissionGen:PlayJobsCompletedCutscene()&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
If the map has no job board assigned to it, this is already everything you need to do. &amp;lt;code&amp;gt;PlayJobsCompletedCutscene&amp;lt;/code&amp;gt; will move the flow of execution to the maps where the completed jobs&#039; board is set and then simply return, letting those maps handle the rest.&lt;br /&gt;
If that is not the case, however, you will also need to write the reward cutscene, and then pass it to the function like so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:PlayJobsCompletedCutscene(&amp;lt;callback&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This should be done in any map where there&#039;s a job board.&lt;br /&gt;
&lt;br /&gt;
=== Writing a Reward Cutscene ===&lt;br /&gt;
When &amp;lt;code&amp;gt;PlayJobsCompletedCutscene&amp;lt;/code&amp;gt; is called, it looks for the first completed job in the taken list. If the board that job has been taken from is not assigned to the current map, the player is transported to the correct map, where another instance of the function is then expected to run. If the map is correct, however, a list of [https://github.com/RogueCollab/RogueEssence/blob/master/RogueEssence/Ground/GroundChar.cs GroundChars] is created and then passed to the callback you provided the function with, alongside the job table itself. In other words, the callback needs to be a function with the following signature:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(job, npcs)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the Job Table. See the [[User:MistressNebula/MissionGen: Job Table|Job Table Documentation]] page for more details&lt;br /&gt;
* &amp;lt;code&amp;gt;npcs&amp;lt;/code&amp;gt; is the list of GroundChars, already added to the map at the coordinates 0, 0. It contains 4 characters for law enforcement jobs, 2 for jobs with a friendly target, and 1 for jobs with no targets&lt;br /&gt;
&lt;br /&gt;
This function is what needs to implement the reward cutscene. You can use the job data and the number of npcs created to move the characters to the correct positions, differentiate between multiple boardss in the same map, if you have to, and then display a different introductory dialogue depending on the job type. Then, whenever you need to actually give the rewards to your players, call the following function&lt;br /&gt;
&amp;lt;pre&amp;gt;MissionGen:RewardPlayer(job, speaker, line1, line2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the Job Table, needed to read what the rewards are&lt;br /&gt;
* &amp;lt;code&amp;gt;speaker&amp;lt;/code&amp;gt; is the character that will say the lines given in the next parameters. If omitted, the lines will be displayed with no speaker.&lt;br /&gt;
* &amp;lt;code&amp;gt;line1&amp;lt;/code&amp;gt; is the line that &amp;lt;code&amp;gt;speaker&amp;lt;/code&amp;gt; will say before giving the first reward to the player, unless the client itself is the reward&lt;br /&gt;
* &amp;lt;code&amp;gt;line2&amp;lt;/code&amp;gt; is the line that &amp;lt;code&amp;gt;speaker&amp;lt;/code&amp;gt; will say before giving the second reward to the player, if it exists&lt;br /&gt;
&lt;br /&gt;
This function will handle everything in regards to rewards, without moving the characters around. You will then be able to add more actions after it returns.&lt;br /&gt;
&lt;br /&gt;
When the cutscene is done, simply add a fade-out, and you&#039;ll be good to go. &amp;lt;code&amp;gt;PlayJobsCompletedCutscene&amp;lt;/code&amp;gt; will dispose of the characters and move to the next completed job, or return control to the player if there are no more completed jobs.&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula/MissionGen:_Reward_cutscenes&amp;diff=2804</id>
		<title>User:MistressNebula/MissionGen: Reward cutscenes</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula/MissionGen:_Reward_cutscenes&amp;diff=2804"/>
		<updated>2025-07-29T17:43:26Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page User:MistressNebula/MissionGen: Reward cutscenes to Mod:Nebula&amp;#039;s Mission Board/ Reward cutscenes: Move to Mod namespace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Mod:Nebula&#039;s Mission Board/ Reward cutscenes]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Reward_cutscenes&amp;diff=2803</id>
		<title>Mod:Nebula&#039;s Mission Board/ Reward cutscenes</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Reward_cutscenes&amp;diff=2803"/>
		<updated>2025-07-29T17:43:26Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page User:MistressNebula/MissionGen: Reward cutscenes to Mod:Nebula&amp;#039;s Mission Board/ Reward cutscenes: Move to Mod namespace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When players leave a dungeon successfully after completing at least one job, they will be brought to the map defined inside the &amp;lt;code&amp;gt;[[User:MistressNebula/MissionGen: Editing settings#end_dungeon_day_destination|end_dungeon_day_destination]]&amp;lt;/code&amp;gt; setting. The library will then expect your code to use the reward handler here.&amp;lt;/br&amp;gt;&lt;br /&gt;
Do note that the end_dungeon_day_destination can also be a place where you assigned one or more job boards. It doesn&#039;t need to be a completely separate place.&lt;br /&gt;
&lt;br /&gt;
Go to your &amp;lt;code&amp;gt;end_dungeon_day_destination&amp;lt;/code&amp;gt;&#039;s &amp;lt;code&amp;gt;Enter&amp;lt;/code&amp;gt; function and paste this code in it, before any kind of fade-in occurs:&lt;br /&gt;
&amp;lt;pre&amp;gt;if MissionGen:HasCompletedMissions() then&lt;br /&gt;
  MissionGen:PlayJobsCompletedCutscene()&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
If the map has no job board assigned to it, this is already everything you need to do. &amp;lt;code&amp;gt;PlayJobsCompletedCutscene&amp;lt;/code&amp;gt; will move the flow of execution to the maps where the completed jobs&#039; board is set and then simply return, letting those maps handle the rest.&lt;br /&gt;
If that is not the case, however, you will also need to write the reward cutscene, and then pass it to the function like so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MissionGen:PlayJobsCompletedCutscene(&amp;lt;callback&amp;gt;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This should be done in any map where there&#039;s a job board.&lt;br /&gt;
&lt;br /&gt;
=== Writing a Reward Cutscene ===&lt;br /&gt;
When &amp;lt;code&amp;gt;PlayJobsCompletedCutscene&amp;lt;/code&amp;gt; is called, it looks for the first completed job in the taken list. If the board that job has been taken from is not assigned to the current map, the player is transported to the correct map, where another instance of the function is then expected to run. If the map is correct, however, a list of [https://github.com/RogueCollab/RogueEssence/blob/master/RogueEssence/Ground/GroundChar.cs GroundChars] is created and then passed to the callback you provided the function with, alongside the job table itself. In other words, the callback needs to be a function with the following signature:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(job, npcs)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the Job Table. See the [[User:MistressNebula/MissionGen: Job Table|Job Table Documentation]] page for more details&lt;br /&gt;
* &amp;lt;code&amp;gt;npcs&amp;lt;/code&amp;gt; is the list of GroundChars, already added to the map at the coordinates 0, 0. It contains 4 characters for law enforcement jobs, 2 for jobs with a friendly target, and 1 for jobs with no targets&lt;br /&gt;
&lt;br /&gt;
This function is what needs to implement the reward cutscene. You can use the job data and the number of npcs created to move the characters to the correct positions, differentiate between multiple boardss in the same map, if you have to, and then display a different introductory dialogue depending on the job type. Then, whenever you need to actually give the rewards to your players, call the following function&lt;br /&gt;
&amp;lt;pre&amp;gt;MissionGen:RewardPlayer(job, speaker, line1, line2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
* &amp;lt;code&amp;gt;job&amp;lt;/code&amp;gt; is the Job Table, needed to read what the rewards are&lt;br /&gt;
* &amp;lt;code&amp;gt;speaker&amp;lt;/code&amp;gt; is the character that will say the lines given in the next parameters. If omitted, the lines will be displayed with no speaker.&lt;br /&gt;
* &amp;lt;code&amp;gt;line1&amp;lt;/code&amp;gt; is the line that &amp;lt;code&amp;gt;speaker&amp;lt;/code&amp;gt; will say before giving the first reward to the player, unless the client itself is the reward&lt;br /&gt;
* &amp;lt;code&amp;gt;line2&amp;lt;/code&amp;gt; is the line that &amp;lt;code&amp;gt;speaker&amp;lt;/code&amp;gt; will say before giving the second reward to the player, if it exists&lt;br /&gt;
&lt;br /&gt;
This function will handle everything in regards to rewards, without moving the characters around. You will then be able to add more actions after it returns.&lt;br /&gt;
&lt;br /&gt;
When the cutscene is done, simply add a fade-out, and you&#039;ll be good to go. &amp;lt;code&amp;gt;PlayJobsCompletedCutscene&amp;lt;/code&amp;gt; will dispose of the characters and move to the next completed job, or return control to the player if there are no more completed jobs.&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/Basic_setup&amp;diff=2802</id>
		<title>Mod:Nebula&#039;s Mission Board/Basic setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/Basic_setup&amp;diff=2802"/>
		<updated>2025-07-29T17:41:25Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: Redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Despite it being created to be as easy to add inside mods as possible, it still takes a bit of work to get the Mission Generation Library up and running. This page will run through all the necessary steps, from file placement to function hooks and &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; calls.&lt;br /&gt;
&lt;br /&gt;
===== Importing the files =====&lt;br /&gt;
&lt;br /&gt;
# Download [https://github.com/435THz/NebulaMissionBoard/releases Nebula&#039;s Mission Board] from github and extract the zip&#039;s content wherever you like.&lt;br /&gt;
# Go to the mod&#039;s &amp;lt;code&amp;gt;Data/Script&amp;lt;/code&amp;gt; folder and copy the &amp;lt;code&amp;gt;missiongen_lib&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Paste the &amp;lt;code&amp;gt;missiongen_lib&amp;lt;/code&amp;gt; folder inside your own mod&#039;s &amp;lt;code&amp;gt;Data/Script&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
Note that the library files expect to be placed exactly inside &amp;lt;code&amp;gt;Data/Script/missiongen_lib&amp;lt;/code&amp;gt;. If you place them anywhere else, you will need to adjust all of the files&#039; &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt; calls accordingly, as well as all of the &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt; calls present in this guide.&lt;br /&gt;
Don&#039;t forget to also copy all of the strings inside the &amp;lt;code&amp;gt;strings.resx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;stringsEx.resx&amp;lt;/code&amp;gt; files over to your mod!&lt;br /&gt;
&lt;br /&gt;
===== Initializing the library =====&lt;br /&gt;
&lt;br /&gt;
With the files imported in your mod, it&#039;s time to load it:&lt;br /&gt;
* Add &amp;lt;code&amp;gt;MissionGen = require(&amp;quot;missiongen_lib.missiongen_lib&amp;quot;)&amp;lt;/code&amp;gt; inside your mod&#039;s &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt; file. You can rename this variable however you want, but it must be a global variable.&lt;br /&gt;
* If your global variable is not named &amp;quot;MissionGen&amp;quot;, open missiongen_service.lua and change the &amp;lt;code&amp;gt;library_name&amp;lt;/code&amp;gt; string into your global variable&#039;s name. Doing this will ensure that the service will be able to find the library when it needs to interact with it.&lt;br /&gt;
* Add &amp;lt;code&amp;gt;require &#039;missiongen_lib.missiongen_service&#039;&amp;lt;/code&amp;gt; inside your mod&#039;s &amp;lt;code&amp;gt;main.lua&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
These steps will take care of most of the initialization process all by themselves. All of the library files will be loaded, and the &amp;lt;code&amp;gt;SV&amp;lt;/code&amp;gt; structure will be automatically have the library&#039;s save data added to it. This, however, does nothing in terms of gameplay, and more steps are needed for the library to actually function.&lt;br /&gt;
&lt;br /&gt;
===== Hooking up functions =====&lt;br /&gt;
This is the lengthiest part of the guide. There are a lot of functions that need to be set up in order for the library to work correctly, as highlighted by the many files inside Nebula&#039;s Mission Board mod. Luckily, they&#039;re pretty easy to port: All you need to do is copy-paste all functions in their respective files in your mod. For example, all functions inside Nebula&#039;s Mission Board&#039;s &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt; will need to go inside &#039;&#039;your mod&#039;s&#039;&#039; &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt;.&lt;br /&gt;
These are the files containing code that needs to be copied over:&lt;br /&gt;
* &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;common_vars.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event.lua&amp;lt;/code&amp;gt; (the &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; statements)&lt;br /&gt;
* &amp;lt;code&amp;gt;event.battle.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event_mapgen.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event.single.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You now need to hook up the dungeon generation code to the game. Open your mod in [[Dev Mode]], go to the Constants tab and open the Universal menu. Here, in Zone Steps, add a new Script Zone Step. Set its Script parameter to &amp;lt;code&amp;gt;GenerateJobInFloor&amp;lt;/code&amp;gt;.&lt;br /&gt;
Now save your changes, and that&#039;s it! This function will be responsible for dynamically adding the necessary steps and events whenever a destination floor is reached.&lt;br /&gt;
&lt;br /&gt;
Everything we did up until now takes care of everything when it comes to generating and handling jobs inside dungeons, but there is still nothing that allows players to take new jobs, or to hand in completed ones. Not to worry: all you need to do is to add a call to &amp;lt;code&amp;gt;MissionGen:BoardInteract(board_id)&amp;lt;/code&amp;gt;, and your players will be able to access your job board of choice and take its contents. &amp;lt;code&amp;gt;board_id&amp;lt;/code&amp;gt;s will be discussed in the page about [[Mod:Nebula&#039;s Mission Board/ Editing settings|Settings]].&lt;br /&gt;
As for how handing in missions works, you will need to write a cutscene for it. Nebula&#039;s Mission Board mod already has one inside &amp;lt;code&amp;gt;Data/Script/nebula_mission_board/ground/base_camp_2&amp;lt;/code&amp;gt; if you want to copy it, but here&#039;s a basic rundown of how the job completion cutscene is handled:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;If any mission has been completed in the last dungeon run, the library will send the player to the location set inside the &amp;lt;code&amp;gt;end_dungeon_day_destination&amp;lt;/code&amp;gt; setting. This location will need to call the &amp;lt;code&amp;gt;MissionGen:PlayJobsCompletedCutscene(callback)&amp;lt;/code&amp;gt; function. If you have multiple maps with job boards, this function will also handle switching between maps as needed. You will have to provide the callback. (see step 3 for more details)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;code&amp;gt;PlayJobsCompletedCutscene&amp;lt;/code&amp;gt; will generate a list of characters, that will be passed to the callback along with the job struct itself.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;the callback is ran. This is a modder-defined function with the following arguments:&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;a job table&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;a list of &amp;lt;code&amp;gt;GroundChar&amp;lt;/code&amp;gt;s. The first one is always the client, while the second, if present, is always the target. Third and fourth are only generated for law enforcement jobs, and represent the background officers that would normally keep the outlaw restrained during the cutscene.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
The callback is supposed to handle the cutscene itself, moving the characters where they need to be and displaying dialogue. It also needs to call &amp;lt;code&amp;gt;MissionGen:RewardPlayer(job, speaker, line1, line2)&amp;lt;/code&amp;gt;, otherwise the player will not actually receive any rewards for the job they completed.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Once the cutscene is finished, control goes back to &amp;lt;code&amp;gt;PlayJobsCompletedCutscene&amp;lt;/code&amp;gt;, which will get rid of the current job and keep scanning for other completed ones  until the end of the list, repeating steps 2 and 3 for each of them.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Finally, the function stored in the &amp;lt;&amp;gt;after_rewards_function&amp;lt;&amp;gt; settings is called, the boards are refreshed, and control is returned to the player.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That said, what you need to do is:&lt;br /&gt;
* call &amp;lt;code&amp;gt;MissionGen:PlayJobsCompletedCutscene(callback)&amp;lt;/code&amp;gt; in any and all maps that have a board assigned to it.&lt;br /&gt;
* write the callback for the function above; it needs to use the current job&#039;s data and the given list of characters to actually implement the cutscene itself, and call &amp;lt;code&amp;gt;MissionGen:RewardPlayer(job, speaker, line1, line2)&amp;lt;/code&amp;gt; so that players will receive their reward.&lt;br /&gt;
When that is done, the library will finally be fully set up and ready to use, though you will still need to edit its Settings to make sure that it generates jobs for your mod&#039;s dungeons.&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Editing_settings&amp;diff=2801</id>
		<title>Mod:Nebula&#039;s Mission Board/ Editing settings</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Editing_settings&amp;diff=2801"/>
		<updated>2025-07-29T17:41:02Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: Redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Mission Generation Library is designed to be highly customizable. This choice is reflected in its &amp;lt;code&amp;gt;missiongen_settings.lua&amp;lt;/code&amp;gt; file. This file is what modders are supposed to edit, changing the values inside the giant table it defines.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a list of all settings in the library, with documentation:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sv_root_name ==&lt;br /&gt;
&lt;br /&gt;
Name of the SV table that will contain all stored data. Use a table to specify a deeper path. If not present in the SV structure, the defined path will be generated automatically. An empty list would just use SV as root.&amp;lt;/br&amp;gt;&lt;br /&gt;
Examples:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;jobs&amp;quot;&amp;lt;/code&amp;gt; would use &amp;lt;code&amp;gt;SV.jobs&amp;lt;/code&amp;gt; as its root.&lt;br /&gt;
* &amp;lt;code&amp;gt;{&amp;quot;adventure&amp;quot;, &amp;quot;jobs&amp;quot;}&amp;lt;/code&amp;gt; would use &amp;lt;code&amp;gt;SV.adventure.jobs&amp;lt;/code&amp;gt; as its root.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;jobs&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== boards ==&lt;br /&gt;
&lt;br /&gt;
A list of board ids and the data necessary to define their behavior.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format for each board:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;board_id&amp;gt;: {&lt;br /&gt;
  display_key: string,&lt;br /&gt;
  size: integer,&lt;br /&gt;
  location: {&lt;br /&gt;
    zone: string,&lt;br /&gt;
    map: integer&lt;br /&gt;
  },&lt;br /&gt;
  condition: function(library),&lt;br /&gt;
  job_types: {id = string, weight = integer}[]&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &amp;lt;board_id&amp;gt;: The id of the board. It will be used to identify and reference this specific board inside scripts&lt;br /&gt;
* display_key: the string key used when displaying the job menu for this board.  The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
* size: the amount of quests this board can hold at a time&lt;br /&gt;
* location: a zone id and a map index. This data is where the player will be brought for the job completion cutscene. All of these maps must call library:PlayJobsCompletedCutscene before fade-in for the reward sequence to work correctly.&lt;br /&gt;
* condition: Optional. A function called to determine if library:PopulateBoards() should fill out this board. It receives the library object as an argument and returns a boolean. If it returns true, the board is filled out. If it returns false, it is left empty. If this property is missing, this board will always be active.&lt;br /&gt;
* job_types: a list of job types and their probability weight. Higher weight means more common.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  quest_board = {&lt;br /&gt;
    display_key = &amp;quot;BOARD_QUEST_TITLE&amp;quot;,&lt;br /&gt;
    size = 8,&lt;br /&gt;
    location = {zone = &amp;quot;guildmaster_island&amp;quot;, map = 2},&lt;br /&gt;
    condition = function (library)&lt;br /&gt;
      local root = library.root&lt;br /&gt;
      local completed = 0&lt;br /&gt;
      for _, segments in pairs(root.dungeon_progress) do&lt;br /&gt;
        for _, state in pairs(segments) do&lt;br /&gt;
          if state then&lt;br /&gt;
            completed = completed + 1&lt;br /&gt;
            if completed&amp;gt;=3 then return true end&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      return false&lt;br /&gt;
    end,&lt;br /&gt;
    job_types = {&lt;br /&gt;
      {id = &amp;quot;RESCUE_SELF&amp;quot;, weight = 5},&lt;br /&gt;
      {id = &amp;quot;RESCUE_FRIEND&amp;quot;, weight = 5},&lt;br /&gt;
      {id = &amp;quot;ESCORT&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;EXPLORATION&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;DELIVERY&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;LOST_ITEM&amp;quot;, weight = 4},&lt;br /&gt;
      {id = &amp;quot;OUTLAW&amp;quot;, weight =  5},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_ITEM&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_ITEM_UNK&amp;quot;, weight = 1},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_MONSTER_HOUSE&amp;quot;, weight = 1},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_FLEE&amp;quot;, weight = 1}&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== end_dungeon_day_destination ==&lt;br /&gt;
&lt;br /&gt;
Zone and map id of the ground map where players will be sent to when a day ends and there is at least one mission to hand in. This map must contain a call to library:PlayJobsCompletedCutscene&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{zone: string, map: integer}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ zone = &amp;quot;guildmaster_island&amp;quot;, map = 2 },&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== after_rewards_function ==&lt;br /&gt;
&lt;br /&gt;
Function ran after the game is done with the job completion cutscene. It takes no arguments, and is not expected to return anything.&lt;br /&gt;
You can use it to fix up the game state however you like before returning control to the player.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
after_rewards_function = function()&lt;br /&gt;
  GAME:MoveCamera(0, 0, 1, true)&lt;br /&gt;
  SOUND:PlayBGM(SV.base_town.Song, true)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== taken_limit ==&lt;br /&gt;
&lt;br /&gt;
The maximum number of jobs that can be taken from job boards at a time.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;8&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== taken_jobs_start_active ==&lt;br /&gt;
&lt;br /&gt;
If true, taken jobs will be activated automatically. Players can always deactivate them manually if they so choose.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;true&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== max_guests ==&lt;br /&gt;
&lt;br /&gt;
The maximum amount of guest-based jobs that can be generated in the same dungeon.&amp;lt;/br&amp;gt;&lt;br /&gt;
Guest-based jobs are: ESCORT, EXPLORATION&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== guests_take_up_space ==&lt;br /&gt;
&lt;br /&gt;
The maximum amount of guest-based jobs that can be generated in the same dungeon.&amp;lt;/br&amp;gt;&lt;br /&gt;
Guest-based jobs are: ESCORT, EXPLORATION&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== min_party_limit ==&lt;br /&gt;
&lt;br /&gt;
Minimum number for the party limit when it is reduced because of guests.&lt;br /&gt;
This value cannot be lower than 1, for obvious reasons.&lt;br /&gt;
Any excess guests will simply add to the party count, without reducing the limit.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== losing_guests_means_defeat ==&lt;br /&gt;
&lt;br /&gt;
If true, losing any guest will count as a loss for the entire exploration.&lt;br /&gt;
If false, it will simply mark that specific job as failed.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_boss_steps_piority ==&lt;br /&gt;
&lt;br /&gt;
The priority of the SpawnOutlaw handler event. It can be either an integer or a list of integers.&lt;br /&gt;
This value should always be lower than dungeon_gen_steps_piority.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;-11&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_gen_steps_piority ==&lt;br /&gt;
&lt;br /&gt;
The priority that most of the job handlers will have when being added to the event list. It can be either an integer or a list of integers.&lt;br /&gt;
This value should always be equal to or higher than the priority set for the event that calls library:GenerateJobInFloor.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;-6&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_npc_steps_piority ==&lt;br /&gt;
&lt;br /&gt;
The priority that job npc spawners will have when being added to the event list. It can be either an integer or a list of integers.&lt;br /&gt;
This value should always be equal to or higher than dungeon_gen_steps_piority.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ 5, 2, 1 }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== difficulty_list ==&lt;br /&gt;
&lt;br /&gt;
A list of all difficulty rank id strings you want to use.&lt;br /&gt;
The order of these strings will define the difficulty scale used by the library.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ &amp;quot;F&amp;quot;, &amp;quot;E&amp;quot;, &amp;quot;D&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;A&amp;quot;, &amp;quot;S&amp;quot;, &amp;quot;STAR_1&amp;quot;, &amp;quot;STAR_2&amp;quot;, &amp;quot;STAR_3&amp;quot;, &amp;quot;STAR_4&amp;quot;, &amp;quot;STAR_5&amp;quot;, &amp;quot;STAR_6&amp;quot;, &amp;quot;STAR_7&amp;quot;, &amp;quot;STAR_8&amp;quot;, &amp;quot;STAR_9&amp;quot; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== difficulty_data ==&lt;br /&gt;
&lt;br /&gt;
All the data required to define difficulty rank behavior. There must be an entry for every rank defined in difficulty_list:&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;diff_id&amp;gt;: {display_key: string, money_reward: integer, extra_reward: integer, outlaw_level: integer, escort_level: integer}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;diff_id&amp;gt;: one of the difficulties defined in &amp;quot;difficulty_list&amp;quot;&lt;br /&gt;
* display_key: string key used when displaying the name of the rank.  The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
* money_reward: the amount of money awarded at the end of the job. If set to 0, money rewards will simply not award anything&lt;br /&gt;
* extra_reward: the points of extra reward awarded at the end of the job. What these points are depends on extra_reward_type. If set to 0, extra_reward_type will be considered to be &amp;quot;none&amp;quot;&lt;br /&gt;
* outlaw_level: Optional. The base level of all outlaws spawned by jobs with this difficulty. If omitted, it will be equal to the dungeon&#039;s expected level.&lt;br /&gt;
* escort_level: Optional. The level of all guests spawned by jobs with this difficulty. If omitted, it will be equal to the dungeon&#039;s expected level.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  F = {display_key = &amp;quot;RANK_STRING_F&amp;quot;, money_reward = 100, extra_reward = 0},&lt;br /&gt;
  E = {display_key = &amp;quot;RANK_STRING_E&amp;quot;, money_reward = 200, extra_reward = 100},&lt;br /&gt;
  D = {display_key = &amp;quot;RANK_STRING_D&amp;quot;, money_reward = 400, extra_reward = 200},&lt;br /&gt;
  C = {display_key = &amp;quot;RANK_STRING_C&amp;quot;, money_reward = 600, extra_reward = 400},&lt;br /&gt;
  B = {display_key = &amp;quot;RANK_STRING_B&amp;quot;, money_reward = 700, extra_reward = 1250},&lt;br /&gt;
  A = {display_key = &amp;quot;RANK_STRING_A&amp;quot;, money_reward = 1500, extra_reward = 2500},&lt;br /&gt;
  S = {display_key = &amp;quot;RANK_STRING_S&amp;quot;, money_reward = 3000, extra_reward = 5000},&lt;br /&gt;
  STAR_1 = {display_key = &amp;quot;RANK_STRING_STAR_1&amp;quot;, money_reward = 6000, extra_reward = 10000},&lt;br /&gt;
  STAR_2 = {display_key = &amp;quot;RANK_STRING_STAR_2&amp;quot;, money_reward = 10000, extra_reward = 20000},&lt;br /&gt;
  STAR_3 = {display_key = &amp;quot;RANK_STRING_STAR_3&amp;quot;, money_reward = 15000, extra_reward = 30000},&lt;br /&gt;
  STAR_4 = {display_key = &amp;quot;RANK_STRING_STAR_4&amp;quot;, money_reward = 20000, extra_reward = 40000},&lt;br /&gt;
  STAR_5 = {display_key = &amp;quot;RANK_STRING_STAR_5&amp;quot;, money_reward = 25000, extra_reward = 50000},&lt;br /&gt;
  STAR_6 = {display_key = &amp;quot;RANK_STRING_STAR_6&amp;quot;, money_reward = 30000, extra_reward = 60000},&lt;br /&gt;
  STAR_7 = {display_key = &amp;quot;RANK_STRING_STAR_7&amp;quot;, money_reward = 35000, extra_reward = 70000},&lt;br /&gt;
  STAR_8 = {display_key = &amp;quot;RANK_STRING_STAR_8&amp;quot;, money_reward = 40000, extra_reward = 80000},&lt;br /&gt;
  STAR_9 = {display_key = &amp;quot;RANK_STRING_STAR_9&amp;quot;, money_reward = 45000, extra_reward = 90000}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== guest_level_scaling ==&lt;br /&gt;
&lt;br /&gt;
Function that changes the level of guests based on the player&#039;s level. It must return the new level for the guest, or it will have no effect.&amp;lt;/br&amp;gt;&lt;br /&gt;
Arguments:&lt;br /&gt;
* lvl: base level of the guest.&lt;br /&gt;
* dungeon: if true, the level is the dungeon&#039;s recommended level. If false, it&#039;s taken from the difficulty data.&lt;br /&gt;
* avg_team_lvl: average level of the player team. It may or may not be an integer.&lt;br /&gt;
* hst_team_lvl: highest level in the player team.&lt;br /&gt;
* settings: the settings data structure itself&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(lvl, dungeon, avg_team_lvl, hst_team_lvl, settings)&lt;br /&gt;
  local add = 0&lt;br /&gt;
  if dungeon then lvl = lvl*4//5 end&lt;br /&gt;
  if avg_team_lvl &amp;gt; lvl then add = (avg_team_lvl - lvl) // 10 end&lt;br /&gt;
  return lvl + add&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== outlaw_level_scaling ==&lt;br /&gt;
&lt;br /&gt;
Function that changes the level of guests based on the player&#039;s level. It must return the new level for the guest, or it will have no effect.&amp;lt;/br&amp;gt;&lt;br /&gt;
Arguments:&lt;br /&gt;
* lvl: base level of the guest.&lt;br /&gt;
* dungeon: if true, the level is the dungeon&#039;s recommended level. If false, it&#039;s taken from the difficulty data.&lt;br /&gt;
* avg_team_lvl: average level of the player team. It may or may not be an integer.&lt;br /&gt;
* hst_team_lvl: highest level in the player team.&lt;br /&gt;
* settings: the settings data structure itself&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(lvl, dungeon, avg_team_lvl, hst_team_lvl, settings)&lt;br /&gt;
  local add = 0&lt;br /&gt;
  if dungeon then lvl = lvl*23//20 end&lt;br /&gt;
  if avg_team_lvl &amp;gt; lvl then add = (avg_team_lvl - lvl) // 8 end&lt;br /&gt;
  add = add + (hst_team_lvl - avg_team_lvl) // 4&lt;br /&gt;
  return lvl + add&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== apply_outlaw_changes ==&lt;br /&gt;
&lt;br /&gt;
Function that allows you to edit an outlaw&#039;s data just before they are spawned.&lt;br /&gt;
You can change just about anything except its position and recruitability state. Its HP will also&lt;br /&gt;
always be automatically set to full after this function is called.&lt;br /&gt;
You will also be unable to change the EquippedItem of an &amp;quot;OUTLAW_ITEM&amp;quot; or &amp;quot;OUTLAW_ITEM_UNK&amp;quot; outlaw.&amp;lt;/br&amp;gt;&lt;br /&gt;
Arguments:&lt;br /&gt;
* outlaw: the outlaw Character itself&lt;br /&gt;
* job: the current job data table&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(outlaw, job)&lt;br /&gt;
  local max_boost = PMDC.Data.MonsterFormData.MAX_STAT_BOOST&lt;br /&gt;
  outlaw.MaxHPBonus = math.min(outlaw.Level * max_boost // 64, max_boost);&lt;br /&gt;
  if job.Type == &amp;quot;OUTLAW_FLEE&amp;quot; then&lt;br /&gt;
    local speedMin = math.floor(outlaw.Level * 4 // 3)&lt;br /&gt;
    local speedMax = math.floor(outlaw.Level * 6 // 2)&lt;br /&gt;
    outlaw.SpeedBonus = math.min(_DATA.Save.Rand:Next(speedMin, speedMax), 100)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== fleeing_outlaw_restrictions ==&lt;br /&gt;
&lt;br /&gt;
A list of ids for types that are banned from ever being picked as fleeing outlaws.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ &amp;quot;ghost&amp;quot; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== outlaw_music_name ==&lt;br /&gt;
&lt;br /&gt;
The name of the outlaw music file. This file will be sourced from the Content/Music folder.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;Outlaw.ogg&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeons ==&lt;br /&gt;
&lt;br /&gt;
This is where dungeon difficulty is set. Quests can only generate for dungeons inside this list.&lt;br /&gt;
Given the complexity of this structure, it is best generated using the [[Mod:Nebula&#039;s Mission Board/ Editing settings#settings.AddDungeonSection(zone, segment, start, difficulty, finish, must_end)||AddDungeonSection]] function at the bottom of this page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_order ==&lt;br /&gt;
&lt;br /&gt;
Jobs are sorted by dungeon, following the order defined in this table. Missing dungeons are shoved at the bottom and sorted alphabetically.&lt;br /&gt;
This list is automatically populated in call order when using the &amp;quot;AddDungeonSection&amp;quot; function near the bottom of this file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== external_events ==&lt;br /&gt;
&lt;br /&gt;
A list of events unrelated to this library that can cause job generation to ignore a specific dungeon.&lt;br /&gt;
They can also be displayed in the objectives log if you so choose.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{condition: function(zone), message_key: string, message_args: function(zone), icon: string}&amp;lt;/code&amp;gt;&lt;br /&gt;
* condition: a function that takes a zone and returns a boolean. If it returns true, jobs will not be generated for this dungeon, and all already taken jobs will be automatically suspended.&lt;br /&gt;
* message_key: Optional. It will be used in the objectives log instead of the default message if the condition is true.&lt;br /&gt;
* message_args: Optional. If the message&#039;s localization string contains placeholders, this function is in charge of taking a zone and returning a list of values that will be used for those placeholders in the form of a table array (Up to 5).&lt;br /&gt;
* icon: Optional. The icon that will be displayed beside the corresponding dungeon in the dungeon selection menu if the condition is true for any of its segments. Defaults to &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  {condition = function(zone) return COMMON.HasSidequestInZone(zone) end, icon = &amp;quot;\\uE111&amp;quot;, message_key = &amp;quot;MENU_JOB_OBJECTIVE_DEFAULT&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== external_events_icon_mode ==&lt;br /&gt;
&lt;br /&gt;
How to display external event icons in the dungeon list. This value can only be either &amp;quot;FIRST&amp;quot; or ALL&amp;quot;.&lt;br /&gt;
* If set to &amp;quot;ALL&amp;quot;, they will always be displayed in the order defined by external_events. Only one copy of the same icon will be shown, no matter how many conditions require it.&lt;br /&gt;
* If set to &amp;quot;FIRST&amp;quot;, only the first event in the list&#039;s order will be displayed, no matter how many events are actually there. This setting does not prevent multiple messages from appearing in the objectives list.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;FIRST&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_list_pattern ==&lt;br /&gt;
&lt;br /&gt;
The pattern that will define how to display entries in the dungeon list.&amp;lt;/br&amp;gt;&lt;br /&gt;
{0} is the placeholder for the dungeon name, {1} for pending job icon and {2} for external condition icons.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;FIRST&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== job_types ==&lt;br /&gt;
&lt;br /&gt;
Table used to determine various properties regarding job types.&lt;br /&gt;
Remove a job type entirely to disable its generation altogether.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: {rank_modifier: integer, min_rank: string}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: one of RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
* rank_modifier (optional): these jobs will always have this modifier applied to their rank.&lt;br /&gt;
* min_rank (optional): this type of jobs can never be of a rank lower than this.&lt;br /&gt;
: This influences possible dungeon spawn: a rank_modifier 1 job with min_rank &amp;quot;C&amp;quot; can also spawn in &amp;quot;D&amp;quot; rank dungeons.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  RESCUE_SELF = {rank_modifier = 0, min_rank = &amp;quot;F&amp;quot;},&lt;br /&gt;
  RESCUE_FRIEND = {rank_modifier = 0, min_rank = &amp;quot;E&amp;quot;},&lt;br /&gt;
  ESCORT = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  EXPLORATION = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  DELIVERY = {rank_modifier = 0, min_rank = &amp;quot;D&amp;quot;},&lt;br /&gt;
  LOST_ITEM = {rank_modifier = 0, min_rank = &amp;quot;D&amp;quot;},&lt;br /&gt;
  OUTLAW = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  OUTLAW_ITEM = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  OUTLAW_ITEM_UNK = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  OUTLAW_MONSTER_HOUSE = {rank_modifier = 2, min_rank = &amp;quot;S&amp;quot;},&lt;br /&gt;
  OUTLAW_FLEE = {rank_modifier = 1, min_rank = &amp;quot;B&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_job_modifiers ==&lt;br /&gt;
&lt;br /&gt;
Special table that allows modders to specify chance multipliers for job types depending on the dungeon.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;dungeon_id&amp;gt;: {&amp;lt;job_type_id&amp;gt;: &amp;lt;multiplier&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;dungeon_id&amp;gt;: the string id of a dungeon&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: one of RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
* &amp;lt;multiplier&amp;gt;: a multiplier number. It doesn&#039;t need to be an integer. It will be multiplied with the board&#039;s base chances, rounding up, when choosing the type of a job. Set it to 0 or less to disable the job type altogether.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  ambush_forest = {&lt;br /&gt;
    OUTLAW = 3,&lt;br /&gt;
    OUTLAW_ITEM = 3,&lt;br /&gt;
    OUTLAW_ITEM_UNK = 3,&lt;br /&gt;
    OUTLAW_MONSTER_HOUSE = 3,&lt;br /&gt;
    OUTLAW_FLEE = 3&lt;br /&gt;
  },&lt;br /&gt;
  treacherous_mountain = {&lt;br /&gt;
    OUTLAW = 3,&lt;br /&gt;
    OUTLAW_ITEM = 3,&lt;br /&gt;
    OUTLAW_ITEM_UNK = 3,&lt;br /&gt;
    OUTLAW_MONSTER_HOUSE = 3,&lt;br /&gt;
    OUTLAW_FLEE = 3&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== special_chance ==&lt;br /&gt;
&lt;br /&gt;
Chance of special missions to be generated. Special missions are just handcrafted scenarios with specific client and target pairs and custom flavor texts. Set to 0 to disable altogether.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;0.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== special_jobs ==&lt;br /&gt;
&lt;br /&gt;
This is where you can define special cases for specific types of jobs.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;special_id&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: one of RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
* &amp;lt;special_id&amp;gt;: any id of your choosing except RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  RESCUE_FRIEND = {&amp;quot;CHILD&amp;quot;, &amp;quot;LOVER&amp;quot;, &amp;quot;RIVAL&amp;quot;, &amp;quot;FRIEND&amp;quot;}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== hidden_floor_chance ==&lt;br /&gt;
&lt;br /&gt;
Chance for supported quest types to have their destination floor hidden. Set to 0 to disable altogether.&amp;lt;/br&amp;gt;&lt;br /&gt;
Players will still be notified when reaching the floor. It just won&#039;t show in the quest description.&amp;lt;/br&amp;gt;&lt;br /&gt;
Job types that can have their floor hidden are: RESCUE_FRIEND, EXPLORATION, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_FLEE.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;0.15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== reward_types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A list of all types of rewards to be offered to players.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{id: string, weight: integer, min_rank: string}&amp;lt;/code&amp;gt;&lt;br /&gt;
* id: one of the supported reward types. You can use duplicate values to alter odds depending on job rank.&lt;br /&gt;
: Supported reward types are: item, money, item_item, money_item, client, exclusive&lt;br /&gt;
* weight: Chance of appearing. Set to 0 or delete altogether to stop a type of reward from being offered.&lt;br /&gt;
* min_rank: optional. If set, this type of reward will only be offered if the job is this rank or higher.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  {id = &amp;quot;item&amp;quot;, weight = 6},&lt;br /&gt;
  {id = &amp;quot;money&amp;quot;, weight = 2},&lt;br /&gt;
  {id = &amp;quot;item_item&amp;quot;, weight = 3},&lt;br /&gt;
  {id = &amp;quot;money_item&amp;quot;, weight = 1},&lt;br /&gt;
  {id = &amp;quot;client&amp;quot;, weight = 1, min_rank = &amp;quot;STAR_1&amp;quot;},&lt;br /&gt;
  {id = &amp;quot;exclusive&amp;quot;, weight = 1, min_rank = &amp;quot;STAR_4&amp;quot;}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== extra_reward_type ==&lt;br /&gt;
&lt;br /&gt;
The type of extra reward for all quests. It can be &amp;quot;none&amp;quot;, &amp;quot;rank&amp;quot; or &amp;quot;exp&amp;quot;. Any other value will result in &amp;quot;none&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;exp&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== rewards_per_difficulty ==&lt;br /&gt;
&lt;br /&gt;
This table assigns different weights to reward pools depending on the difficulty rank of the mission.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;diff_id&amp;gt;: {id: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;diff_id&amp;gt;: one of the difficulties defined in difficulty_list&amp;quot;&lt;br /&gt;
* id: the id of one of the reward pools defined in &amp;quot;reward_pools&amp;quot;&lt;br /&gt;
* weight: Chance of appearing. Set to 0 or delete altogether to stop a reward pool from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  F = {&lt;br /&gt;
    {id = &amp;quot;NECESSITIES&amp;quot;, weight = 10}&lt;br /&gt;
  },&lt;br /&gt;
  E = {&lt;br /&gt;
    {id = &amp;quot;NECESSITIES&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;APRICORN_GENERIC&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;FOOD_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;SEED_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;HELD_LOW&amp;quot;, weight = 3},&lt;br /&gt;
    {id = &amp;quot;LOOT_LOW&amp;quot;, weight = 3},&lt;br /&gt;
    {id = &amp;quot;EVO_ITEMS&amp;quot;, weight = 1},&lt;br /&gt;
    {id = &amp;quot;WANDS_LOW&amp;quot;, weight = 10}&lt;br /&gt;
  },&lt;br /&gt;
  D = {&lt;br /&gt;
    {id = &amp;quot;NECESSITIES&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;AMMO_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;APRICORN_GENERIC&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;APRICORN_TYPED&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;FOOD_LOW&amp;quot;, weight = 4},&lt;br /&gt;
    {id = &amp;quot;SEED_LOW&amp;quot;, weight = 4},&lt;br /&gt;
    {id = &amp;quot;SEED_MID&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;HELD_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;HELD_TYPE&amp;quot;, weight = 3},&lt;br /&gt;
    {id = &amp;quot;LOOT_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;EVO_ITEMS&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;ORBS_LOW&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;WANDS_LOW&amp;quot;, weight = 4},&lt;br /&gt;
    {id = &amp;quot;WANDS_MID&amp;quot;, weight = 10},&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== reward_pools ==&lt;br /&gt;
&lt;br /&gt;
List of all reward pools and the items they contain. You must at least include all pools referenced in the rewards_per_difficulty table, but you can add more.&amp;lt;/br&amp;gt;&lt;br /&gt;
Entry ids may be either items or other pools. A pool doesn&#039;t have to only contain one of the two.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;pool id&amp;gt;: {id: string, count: integer, hidden: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;pool_id&amp;gt;: the id of the pool. It should be used somewhere else either in this table or in rewards_per_difficulty.&lt;br /&gt;
* id: item_id or pool_id. If it matches a pool, count and hidden will be ignored.&lt;br /&gt;
* count: Optional. The amount of items awarded. It cannot be higher than the item&#039;s max stack. Defaults to the item&#039;s max stack.&lt;br /&gt;
* hidden: Optional. Hidden value that can be used for various purposes depending on the item. Defaults to &amp;quot;&amp;quot;.&lt;br /&gt;
* weight: Chance of appearing. Set to 0 or delete altogether to stop an entry from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  NECESSITIES = {&lt;br /&gt;
    {id = &amp;quot;seed_reviver&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;berry_leppa&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;berry_oran&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;berry_lum&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;food_apple&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;orb_escape&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;apricorn_plain&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;key&amp;quot;,count = 3,  weight = 2}&lt;br /&gt;
  },&lt;br /&gt;
  AMMO_LOW = {&lt;br /&gt;
    {id = &amp;quot;ammo_iron_thorn&amp;quot;, count = 3, weight = 5},&lt;br /&gt;
    {id = &amp;quot;ammo_geo_pebble&amp;quot;, count = 3, weight = 1},&lt;br /&gt;
    {id = &amp;quot;ammo_stick&amp;quot;, count = 3, weight = 1},&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== target_items ==&lt;br /&gt;
&lt;br /&gt;
Ids of items that can be used as targets, divided depending on the job type.&lt;br /&gt;
Make sure they&#039;re either easy enough to obtain or impossible to lose, depending on the job.&lt;br /&gt;
Using stackable items is highly discouraged for all job types, as it may result in odd behaviors.&amp;lt;/br&amp;gt;&lt;br /&gt;
&#039;&#039;Please keep in mind that if you want to use the &amp;quot;mission_&amp;quot; items shown in the example you must either recreate them or copy them over from the example mod.&#039;&#039;&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;item_id&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: the id of a job type defined inside &amp;quot;job_types&amp;quot;&lt;br /&gt;
* &amp;lt;item_id&amp;gt;: the id of the item to use&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  LOST_ITEM = {&lt;br /&gt;
    &amp;quot;mission_lost_scarf&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_lost_specs&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_lost_band&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  OUTLAW_ITEM = {&lt;br /&gt;
    &amp;quot;mission_stolen_scarf&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_stolen_band&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_stolen_specs&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  DELIVERY = {&lt;br /&gt;
    &amp;quot;berry_oran&amp;quot;,&lt;br /&gt;
    &amp;quot;berry_leppa&amp;quot;,&lt;br /&gt;
    &amp;quot;food_apple&amp;quot;,&lt;br /&gt;
    &amp;quot;berry_lum&amp;quot;,&lt;br /&gt;
    &amp;quot;apricorn_plain&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== difficulty_to_tier ==&lt;br /&gt;
&lt;br /&gt;
Weighted table that associates mission difficulty to a specific tier of characters and outlaws.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;diff_id&amp;gt;: {id: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;diff_id&amp;gt;: one of the difficulties defined in &amp;quot;difficulty_list&amp;quot;&lt;br /&gt;
* id: A string that defines a pokémon tier id.&lt;br /&gt;
* weight: Chance of being picked. Set to 0 or delete altogether to stop an entry from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  F = {&lt;br /&gt;
    {id = &amp;quot;TIER_LOW&amp;quot;, weight = 10}&lt;br /&gt;
  },&lt;br /&gt;
  E = {&lt;br /&gt;
    {id = &amp;quot;TIER_LOW&amp;quot;, weight = 9},&lt;br /&gt;
    {id = &amp;quot;TIER_MID&amp;quot;, weight = 1}&lt;br /&gt;
  },&lt;br /&gt;
  D = {&lt;br /&gt;
    {id = &amp;quot;TIER_LOW&amp;quot;, weight = 7},&lt;br /&gt;
    {id = &amp;quot;TIER_MID&amp;quot;, weight = 3}&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== pokemon ==&lt;br /&gt;
&lt;br /&gt;
A list of Pokémon that will be used for job generation, sorted by arbitrary quest tiers.&lt;br /&gt;
Any of these entries may be picked when choosing client and target.&lt;br /&gt;
If the client picked is not in the seen dex, the reward type can never be &amp;quot;client&amp;quot; nor &amp;quot;exclusive&amp;quot;.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;tier&amp;gt;: &amp;lt;monster_id&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;tier&amp;gt;: one of the tier ids used in difficulty_to_tier&lt;br /&gt;
* &amp;lt;monster_id&amp;gt;: either the species id of a pokémon or a MonsterIDTable&lt;br /&gt;
Format of MonsterIDTable: see the &amp;quot;monsterIdTemplate&amp;quot; function in missiongen_lib.lua&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  TIER_LOW = {&lt;br /&gt;
&amp;quot;abra&amp;quot;,&amp;quot;amaura&amp;quot;,&amp;quot;anorith&amp;quot;,&amp;quot;applin&amp;quot;,&amp;quot;archen&amp;quot;,&amp;quot;aron&amp;quot;,&amp;quot;arrokuda&amp;quot;,&amp;quot;axew&amp;quot;,&amp;quot;azurill&amp;quot;, [...]&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== job_titles ==&lt;br /&gt;
&lt;br /&gt;
A list of all possible job display titles, divided by job type.&lt;br /&gt;
You must also include lists for any special job types you intend to use.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;string_key&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: either the id of a job type defined inside &amp;quot;job_types&amp;quot;, or the id of a special job type&lt;br /&gt;
* &amp;lt;string_key&amp;gt;: the localization key used for the title. The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target (or client, if there is no target)&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  RESCUE_SELF = {&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_001&amp;quot;,&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_002&amp;quot;,&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_003&amp;quot;,&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_004&amp;quot;,&lt;br /&gt;
    [...]&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== job_flavor ==&lt;br /&gt;
&lt;br /&gt;
A list of all possible job flavor text entries, divided by job type and by line.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: {&amp;lt;string_key&amp;gt;[], &amp;lt;string_key&amp;gt;[]}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: either the id of a job type defined inside &amp;quot;job_types&amp;quot;, or the id of a special job type&lt;br /&gt;
* &amp;lt;string_key&amp;gt;: the localization key used for the flavor text. Every job has 2 lists assigned: one for the top string and one for the bottom one.&lt;br /&gt;
If only the first list is specified, the second one will be left empty.&lt;br /&gt;
The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target (or client, if there is no target)&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  RESCUE_SELF = {&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_001&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_002&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_003&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_004&amp;quot;,&lt;br /&gt;
      [...]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;MISSION_BODY_BOTTOM_RESCUE_SELF_001&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_BOTTOM_RESCUE_SELF_002&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_BOTTOM_RESCUE_SELF_003&amp;quot;,&lt;br /&gt;
      [...]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== law_enforcement ==&lt;br /&gt;
&lt;br /&gt;
Law enforcement characters in your setting. All OUTLAW jobs except OUTLAW_ITEM and OUTLAW_ITEM_UNK use these characters as job clients.&lt;br /&gt;
You may specify only 1 officer, and then a list containing any number of agents. Two of the latter will be randomly picked every time the job completion cutscene is played.&amp;lt;/br&amp;gt;&lt;br /&gt;
You may add a weight property to agents to specify a custom chance of being picked. Any without will&lt;br /&gt;
have a weight of 1.&amp;lt;/br&amp;gt;&lt;br /&gt;
Add &amp;quot;unique = true&amp;quot; to the MonsterIDTable to stop an agent from being picked twice. You must&lt;br /&gt;
have at least either 1 non-unique agent or 2 unique ones for this list table to be valid.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format of MonsterIDTable: see the &amp;quot;monsterIdTemplate&amp;quot; function in missiongen_lib.lua&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  OFFICER = {Species = &amp;quot;magnezone&amp;quot;, Gender = 0},&lt;br /&gt;
  AGENT = {&lt;br /&gt;
    {Species = &amp;quot;magnemite&amp;quot;, Gender = 0, Weight = 31},&lt;br /&gt;
    {Species = &amp;quot;magnemite&amp;quot;, Gender = 0, Skin = &amp;quot;shiny&amp;quot;, Weight = 1, Unique = true}&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== enforcer_chance ==&lt;br /&gt;
&lt;br /&gt;
Defines the chance of either the officer or an agent being the client of a mission depending on the character tier of the mission, as defined in difficulty_to_tier.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;tier&amp;gt;: {id: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;tier&amp;gt;: one of the tier ids used in difficulty_to_tier&lt;br /&gt;
* id: One of: OFFICER, AGENT&lt;br /&gt;
* index: Optional. Ignored if id is OFFICER. You can set it to specify a specific agent instead of rolling using their chance in &amp;quot;law_enforcement&amp;quot;.&lt;br /&gt;
* weight: Chance of being picked. Set to 0 or delete altogether to stop an entry from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  TIER_LOW = {&lt;br /&gt;
    {id = &amp;quot;OFFICER&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;AGENT&amp;quot;, weight = 8}&lt;br /&gt;
  },&lt;br /&gt;
  TIER_MID = {&lt;br /&gt;
    {id = &amp;quot;OFFICER&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;AGENT&amp;quot;, weight = 5}&lt;br /&gt;
  },&lt;br /&gt;
  TIER_HIGH = {&lt;br /&gt;
    {id = &amp;quot;OFFICER&amp;quot;, weight = 8},&lt;br /&gt;
    {id = &amp;quot;AGENT&amp;quot;, weight = 2}&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== special_data ==&lt;br /&gt;
&lt;br /&gt;
Data of characters and flavor key used for special jobs, divided by tier.&lt;br /&gt;
In outlaw related quests, you may use ENFORCER as a keyword for a random law enforcement character.&lt;br /&gt;
You may also use OFFICER or AGENT to specify a more specific selection.&lt;br /&gt;
These keywords can only be used in place of MonsterIDTables.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;special_type&amp;gt;: {&amp;lt;tier&amp;gt;: {client: MonsterIDTable, target: MonsterIDTable, item: string, flavor: string}[]}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;special_type&amp;gt;: an id of your choosing. It must be different from any basic job id&lt;br /&gt;
* &amp;lt;tier&amp;gt;: one of the tier ids used in difficulty_to_tier&lt;br /&gt;
* client: the data used to generate this Pokémon.&lt;br /&gt;
* target: the data used to generate this Pokémon.  Only used in job types that require a target.&lt;br /&gt;
* item: the id of the item that will be used for this job. Only used in job types that require an item.&lt;br /&gt;
* flavor: flavor string key used for the job, sourced from the Menu Text list (strings.resx)&lt;br /&gt;
Format of MonsterIDTable: see the &amp;quot;monsterIdTemplate&amp;quot; function in missiongen_lib.lua&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target (or client, if there is no target)&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  LOVER = {&lt;br /&gt;
    TIER_LOW = {&lt;br /&gt;
      {client = {Species = &amp;quot;volbeat&amp;quot;, Gender = 1}, target = {Species = &amp;quot;illumise&amp;quot;, Gender = 2}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_001&amp;quot;},&lt;br /&gt;
      {client = {Species = &amp;quot;minun&amp;quot;, Gender = 1}, target = {Species = &amp;quot;plusle&amp;quot;, Gender = 2}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_002&amp;quot;},&lt;br /&gt;
      {client = {Species = &amp;quot;mareep&amp;quot;, Gender = 2}, target = {Species = &amp;quot;wooloo&amp;quot;, Gender = 1}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_003&amp;quot;},&lt;br /&gt;
      [...]&lt;br /&gt;
    },&lt;br /&gt;
    TIER_MID = {&lt;br /&gt;
      {client = {Species = &amp;quot;miltank&amp;quot;, Gender = 2}, target = {Species = &amp;quot;tauros&amp;quot;, Gender = 1}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_005&amp;quot;},&lt;br /&gt;
      {client = {Species = &amp;quot;venomoth&amp;quot;, Gender = 1}, target = {Species = &amp;quot;butterfree&amp;quot;, Gender = 2}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_006&amp;quot;},&lt;br /&gt;
      [...]&lt;br /&gt;
    },&lt;br /&gt;
    [...]&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== escort_talks ==&lt;br /&gt;
&lt;br /&gt;
String keys to be used whenever the player interacts with an escort mission client, depending on the job type.&lt;br /&gt;
You can also include tables for special escort jobs. If no such table exists for a specific case, the generic table for the job type will be used.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;string_key&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: &amp;quot;ESCORT&amp;quot;, &amp;quot;EXPLORATION&amp;quot;, or the id of a special job type that corresponds to one of these job types&lt;br /&gt;
* &amp;lt;string_key&amp;gt;: the localization key of possible messages. The localized strings are fetched from the Gameplay Text list (stringsEx.resx)&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  ESCORT = {&lt;br /&gt;
    &amp;quot;MISSION_ESCORT_INTERACT&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  EXPLORATION = {&lt;br /&gt;
    &amp;quot;MISSION_EXPLORATION_INTERACT&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== rescue_responses ==&lt;br /&gt;
&lt;br /&gt;
Strings keys to be used whenever the player interacts with a pokémon that needs rescue, depending on the job type and the response given.&lt;br /&gt;
You must include a &amp;quot;_DEFAULT&amp;quot; table, but you can also include tables for special job types. _DEFAULT will still be used for any special&lt;br /&gt;
case that doesn&#039;t have a table associated with it.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{rescue_yes: {&amp;lt;case_id&amp;gt;: {key: string, emotion: string}[]}, rescue_no: {&amp;lt;case_id&amp;gt;: {key: string, emotion: string}[]}}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;case_id&amp;gt;: &amp;quot;_DEFAULT&amp;quot;, or the id of a special job type that corresponds to either &amp;quot;RESCUE_SELF&amp;quot; or &amp;quot;RESCUE_FRIEND&amp;quot;&lt;br /&gt;
* key: the localization key of possible messages. The localized strings are fetched from the Gameplay Text list (stringsEx.resx)&lt;br /&gt;
* emotion: Optional. An emotion id to use with this specific message. Defaults to &amp;quot;Normal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: client&lt;br /&gt;
* {1}: target&lt;br /&gt;
* {2}: dungeon&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  rescue_yes = {&lt;br /&gt;
    _DEFAULT = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_DEFAULT&amp;quot;} },&lt;br /&gt;
    CHILD  = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_CHILD&amp;quot;, emotion = &amp;quot;Joyous&amp;quot;} },&lt;br /&gt;
    FRIEND = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_FRIEND&amp;quot;} },&lt;br /&gt;
    RIVAL  = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_RIVAL&amp;quot;} },&lt;br /&gt;
    LOVER  = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_LOVER&amp;quot;, emotion = &amp;quot;Joyous&amp;quot;} }&lt;br /&gt;
  },&lt;br /&gt;
  rescue_no = {&lt;br /&gt;
    _DEFAULT = { {key = &amp;quot;MISSION_RESCUE_DENY_DEFAULT&amp;quot;, emotion = &amp;quot;Surprised&amp;quot;} },&lt;br /&gt;
    CHILD  = { {key = &amp;quot;MISSION_RESCUE_DENY_CHILD&amp;quot;, emotion = &amp;quot;Crying&amp;quot;} },&lt;br /&gt;
    FRIEND = { {key = &amp;quot;MISSION_RESCUE_DENY_FRIEND&amp;quot;, emotion = &amp;quot;Surprised&amp;quot;} },&lt;br /&gt;
    RIVAL  = { {key = &amp;quot;MISSION_RESCUE_DENY_RIVAL&amp;quot;, emotion = &amp;quot;Stunned&amp;quot;} },&lt;br /&gt;
    LOVER  = { {key = &amp;quot;MISSION_RESCUE_DENY_LOVER&amp;quot;, emotion = &amp;quot;Stunned&amp;quot;} }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== mission_callback_root ==&lt;br /&gt;
&lt;br /&gt;
The object that contains job callback functions. It is recommended to define this object somewhere else.&amp;lt;/br&amp;gt;&lt;br /&gt;
Job callbacks are stored inside jobs as strings. These strings are then used as an index in the callback root object to retrieve the actual function.&lt;br /&gt;
&lt;br /&gt;
The callback system is a pretty involved one, that gives a modder the ability to handcraft entirely new types of jobs if they so choose, but is also pretty difficult to handle, so it will be discussed in [[User:MistressNebula/MissionGen: Job callbacks|its own guide]].&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;COMMON&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== settings.AddDungeonSection(zone, segment, start, difficulty, finish, must_end) ==&lt;br /&gt;
&lt;br /&gt;
Adds a new dungeon section to the list of possible job destinations.&lt;br /&gt;
Section start values must always be added in ascending order. Failing to do so may cause inconsistent behaviors.&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;zone&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: the string id of the dungeon zone.&lt;br /&gt;
* &amp;lt;code&amp;gt;segment&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: the numeric id of the dungeon segment.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: the starting floor of this dungeon section (start counting from 1 for this).&lt;br /&gt;
* &amp;lt;code&amp;gt;difficulty&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: the string id of the difficulty assigned to this section.&lt;br /&gt;
* &amp;lt;code&amp;gt;finish&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: Only considered when first adding a segment to the list. Can be omitted otherwise. This will be the last floor of the segment where jobs can spawn (start counting from 1 for this). If higher than the dungeon floors, it will default to the full dungeon length.&lt;br /&gt;
* &amp;lt;code&amp;gt;must_end&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; Only considered when first adding a segment to the list. Can be omitted otherwise. If true, this segment must be completed before jobs can spawn in it. If false, the segment must be accessed at least once, unless it&#039;s segment 0, which just needs to be unlocked. Defaults to true.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
settings.AddDungeonSection(&amp;quot;faultline_ridge&amp;quot;, 0, 6, &amp;quot;D&amp;quot;, 10)&lt;br /&gt;
settings.AddDungeonSection(&amp;quot;sickly_hollow&amp;quot;, 0, 9, &amp;quot;S&amp;quot;, 16, false)&lt;br /&gt;
settings.AddDungeonSection(&amp;quot;sickly_hollow&amp;quot;, 0, 13, &amp;quot;STAR_1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula/MissionGen:_Editing_settings&amp;diff=2800</id>
		<title>User:MistressNebula/MissionGen: Editing settings</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula/MissionGen:_Editing_settings&amp;diff=2800"/>
		<updated>2025-07-29T17:38:05Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page User:MistressNebula/MissionGen: Editing settings to Mod:Nebula&amp;#039;s Mission Board/ Editing settings: Move to Mod namespace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Mod:Nebula&#039;s Mission Board/ Editing settings]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Editing_settings&amp;diff=2799</id>
		<title>Mod:Nebula&#039;s Mission Board/ Editing settings</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Editing_settings&amp;diff=2799"/>
		<updated>2025-07-29T17:38:05Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page User:MistressNebula/MissionGen: Editing settings to Mod:Nebula&amp;#039;s Mission Board/ Editing settings: Move to Mod namespace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Mission Generation Library is designed to be highly customizable. This choice is reflected in its &amp;lt;code&amp;gt;missiongen_settings.lua&amp;lt;/code&amp;gt; file. This file is what modders are supposed to edit, changing the values inside the giant table it defines.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a list of all settings in the library, with documentation:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sv_root_name ==&lt;br /&gt;
&lt;br /&gt;
Name of the SV table that will contain all stored data. Use a table to specify a deeper path. If not present in the SV structure, the defined path will be generated automatically. An empty list would just use SV as root.&amp;lt;/br&amp;gt;&lt;br /&gt;
Examples:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;jobs&amp;quot;&amp;lt;/code&amp;gt; would use &amp;lt;code&amp;gt;SV.jobs&amp;lt;/code&amp;gt; as its root.&lt;br /&gt;
* &amp;lt;code&amp;gt;{&amp;quot;adventure&amp;quot;, &amp;quot;jobs&amp;quot;}&amp;lt;/code&amp;gt; would use &amp;lt;code&amp;gt;SV.adventure.jobs&amp;lt;/code&amp;gt; as its root.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;jobs&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== boards ==&lt;br /&gt;
&lt;br /&gt;
A list of board ids and the data necessary to define their behavior.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format for each board:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;board_id&amp;gt;: {&lt;br /&gt;
  display_key: string,&lt;br /&gt;
  size: integer,&lt;br /&gt;
  location: {&lt;br /&gt;
    zone: string,&lt;br /&gt;
    map: integer&lt;br /&gt;
  },&lt;br /&gt;
  condition: function(library),&lt;br /&gt;
  job_types: {id = string, weight = integer}[]&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &amp;lt;board_id&amp;gt;: The id of the board. It will be used to identify and reference this specific board inside scripts&lt;br /&gt;
* display_key: the string key used when displaying the job menu for this board.  The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
* size: the amount of quests this board can hold at a time&lt;br /&gt;
* location: a zone id and a map index. This data is where the player will be brought for the job completion cutscene. All of these maps must call library:PlayJobsCompletedCutscene before fade-in for the reward sequence to work correctly.&lt;br /&gt;
* condition: Optional. A function called to determine if library:PopulateBoards() should fill out this board. It receives the library object as an argument and returns a boolean. If it returns true, the board is filled out. If it returns false, it is left empty. If this property is missing, this board will always be active.&lt;br /&gt;
* job_types: a list of job types and their probability weight. Higher weight means more common.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  quest_board = {&lt;br /&gt;
    display_key = &amp;quot;BOARD_QUEST_TITLE&amp;quot;,&lt;br /&gt;
    size = 8,&lt;br /&gt;
    location = {zone = &amp;quot;guildmaster_island&amp;quot;, map = 2},&lt;br /&gt;
    condition = function (library)&lt;br /&gt;
      local root = library.root&lt;br /&gt;
      local completed = 0&lt;br /&gt;
      for _, segments in pairs(root.dungeon_progress) do&lt;br /&gt;
        for _, state in pairs(segments) do&lt;br /&gt;
          if state then&lt;br /&gt;
            completed = completed + 1&lt;br /&gt;
            if completed&amp;gt;=3 then return true end&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      return false&lt;br /&gt;
    end,&lt;br /&gt;
    job_types = {&lt;br /&gt;
      {id = &amp;quot;RESCUE_SELF&amp;quot;, weight = 5},&lt;br /&gt;
      {id = &amp;quot;RESCUE_FRIEND&amp;quot;, weight = 5},&lt;br /&gt;
      {id = &amp;quot;ESCORT&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;EXPLORATION&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;DELIVERY&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;LOST_ITEM&amp;quot;, weight = 4},&lt;br /&gt;
      {id = &amp;quot;OUTLAW&amp;quot;, weight =  5},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_ITEM&amp;quot;, weight = 2},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_ITEM_UNK&amp;quot;, weight = 1},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_MONSTER_HOUSE&amp;quot;, weight = 1},&lt;br /&gt;
      {id = &amp;quot;OUTLAW_FLEE&amp;quot;, weight = 1}&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== end_dungeon_day_destination ==&lt;br /&gt;
&lt;br /&gt;
Zone and map id of the ground map where players will be sent to when a day ends and there is at least one mission to hand in. This map must contain a call to library:PlayJobsCompletedCutscene&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{zone: string, map: integer}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ zone = &amp;quot;guildmaster_island&amp;quot;, map = 2 },&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== after_rewards_function ==&lt;br /&gt;
&lt;br /&gt;
Function ran after the game is done with the job completion cutscene. It takes no arguments, and is not expected to return anything.&lt;br /&gt;
You can use it to fix up the game state however you like before returning control to the player.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
after_rewards_function = function()&lt;br /&gt;
  GAME:MoveCamera(0, 0, 1, true)&lt;br /&gt;
  SOUND:PlayBGM(SV.base_town.Song, true)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== taken_limit ==&lt;br /&gt;
&lt;br /&gt;
The maximum number of jobs that can be taken from job boards at a time.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;8&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== taken_jobs_start_active ==&lt;br /&gt;
&lt;br /&gt;
If true, taken jobs will be activated automatically. Players can always deactivate them manually if they so choose.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;true&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== max_guests ==&lt;br /&gt;
&lt;br /&gt;
The maximum amount of guest-based jobs that can be generated in the same dungeon.&amp;lt;/br&amp;gt;&lt;br /&gt;
Guest-based jobs are: ESCORT, EXPLORATION&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== guests_take_up_space ==&lt;br /&gt;
&lt;br /&gt;
The maximum amount of guest-based jobs that can be generated in the same dungeon.&amp;lt;/br&amp;gt;&lt;br /&gt;
Guest-based jobs are: ESCORT, EXPLORATION&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== min_party_limit ==&lt;br /&gt;
&lt;br /&gt;
Minimum number for the party limit when it is reduced because of guests.&lt;br /&gt;
This value cannot be lower than 1, for obvious reasons.&lt;br /&gt;
Any excess guests will simply add to the party count, without reducing the limit.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== losing_guests_means_defeat ==&lt;br /&gt;
&lt;br /&gt;
If true, losing any guest will count as a loss for the entire exploration.&lt;br /&gt;
If false, it will simply mark that specific job as failed.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;false&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_boss_steps_piority ==&lt;br /&gt;
&lt;br /&gt;
The priority of the SpawnOutlaw handler event. It can be either an integer or a list of integers.&lt;br /&gt;
This value should always be lower than dungeon_gen_steps_piority.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;-11&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_gen_steps_piority ==&lt;br /&gt;
&lt;br /&gt;
The priority that most of the job handlers will have when being added to the event list. It can be either an integer or a list of integers.&lt;br /&gt;
This value should always be equal to or higher than the priority set for the event that calls library:GenerateJobInFloor.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;-6&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_npc_steps_piority ==&lt;br /&gt;
&lt;br /&gt;
The priority that job npc spawners will have when being added to the event list. It can be either an integer or a list of integers.&lt;br /&gt;
This value should always be equal to or higher than dungeon_gen_steps_piority.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ 5, 2, 1 }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== difficulty_list ==&lt;br /&gt;
&lt;br /&gt;
A list of all difficulty rank id strings you want to use.&lt;br /&gt;
The order of these strings will define the difficulty scale used by the library.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ &amp;quot;F&amp;quot;, &amp;quot;E&amp;quot;, &amp;quot;D&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;A&amp;quot;, &amp;quot;S&amp;quot;, &amp;quot;STAR_1&amp;quot;, &amp;quot;STAR_2&amp;quot;, &amp;quot;STAR_3&amp;quot;, &amp;quot;STAR_4&amp;quot;, &amp;quot;STAR_5&amp;quot;, &amp;quot;STAR_6&amp;quot;, &amp;quot;STAR_7&amp;quot;, &amp;quot;STAR_8&amp;quot;, &amp;quot;STAR_9&amp;quot; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== difficulty_data ==&lt;br /&gt;
&lt;br /&gt;
All the data required to define difficulty rank behavior. There must be an entry for every rank defined in difficulty_list:&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;diff_id&amp;gt;: {display_key: string, money_reward: integer, extra_reward: integer, outlaw_level: integer, escort_level: integer}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;diff_id&amp;gt;: one of the difficulties defined in &amp;quot;difficulty_list&amp;quot;&lt;br /&gt;
* display_key: string key used when displaying the name of the rank.  The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
* money_reward: the amount of money awarded at the end of the job. If set to 0, money rewards will simply not award anything&lt;br /&gt;
* extra_reward: the points of extra reward awarded at the end of the job. What these points are depends on extra_reward_type. If set to 0, extra_reward_type will be considered to be &amp;quot;none&amp;quot;&lt;br /&gt;
* outlaw_level: Optional. The base level of all outlaws spawned by jobs with this difficulty. If omitted, it will be equal to the dungeon&#039;s expected level.&lt;br /&gt;
* escort_level: Optional. The level of all guests spawned by jobs with this difficulty. If omitted, it will be equal to the dungeon&#039;s expected level.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  F = {display_key = &amp;quot;RANK_STRING_F&amp;quot;, money_reward = 100, extra_reward = 0},&lt;br /&gt;
  E = {display_key = &amp;quot;RANK_STRING_E&amp;quot;, money_reward = 200, extra_reward = 100},&lt;br /&gt;
  D = {display_key = &amp;quot;RANK_STRING_D&amp;quot;, money_reward = 400, extra_reward = 200},&lt;br /&gt;
  C = {display_key = &amp;quot;RANK_STRING_C&amp;quot;, money_reward = 600, extra_reward = 400},&lt;br /&gt;
  B = {display_key = &amp;quot;RANK_STRING_B&amp;quot;, money_reward = 700, extra_reward = 1250},&lt;br /&gt;
  A = {display_key = &amp;quot;RANK_STRING_A&amp;quot;, money_reward = 1500, extra_reward = 2500},&lt;br /&gt;
  S = {display_key = &amp;quot;RANK_STRING_S&amp;quot;, money_reward = 3000, extra_reward = 5000},&lt;br /&gt;
  STAR_1 = {display_key = &amp;quot;RANK_STRING_STAR_1&amp;quot;, money_reward = 6000, extra_reward = 10000},&lt;br /&gt;
  STAR_2 = {display_key = &amp;quot;RANK_STRING_STAR_2&amp;quot;, money_reward = 10000, extra_reward = 20000},&lt;br /&gt;
  STAR_3 = {display_key = &amp;quot;RANK_STRING_STAR_3&amp;quot;, money_reward = 15000, extra_reward = 30000},&lt;br /&gt;
  STAR_4 = {display_key = &amp;quot;RANK_STRING_STAR_4&amp;quot;, money_reward = 20000, extra_reward = 40000},&lt;br /&gt;
  STAR_5 = {display_key = &amp;quot;RANK_STRING_STAR_5&amp;quot;, money_reward = 25000, extra_reward = 50000},&lt;br /&gt;
  STAR_6 = {display_key = &amp;quot;RANK_STRING_STAR_6&amp;quot;, money_reward = 30000, extra_reward = 60000},&lt;br /&gt;
  STAR_7 = {display_key = &amp;quot;RANK_STRING_STAR_7&amp;quot;, money_reward = 35000, extra_reward = 70000},&lt;br /&gt;
  STAR_8 = {display_key = &amp;quot;RANK_STRING_STAR_8&amp;quot;, money_reward = 40000, extra_reward = 80000},&lt;br /&gt;
  STAR_9 = {display_key = &amp;quot;RANK_STRING_STAR_9&amp;quot;, money_reward = 45000, extra_reward = 90000}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== guest_level_scaling ==&lt;br /&gt;
&lt;br /&gt;
Function that changes the level of guests based on the player&#039;s level. It must return the new level for the guest, or it will have no effect.&amp;lt;/br&amp;gt;&lt;br /&gt;
Arguments:&lt;br /&gt;
* lvl: base level of the guest.&lt;br /&gt;
* dungeon: if true, the level is the dungeon&#039;s recommended level. If false, it&#039;s taken from the difficulty data.&lt;br /&gt;
* avg_team_lvl: average level of the player team. It may or may not be an integer.&lt;br /&gt;
* hst_team_lvl: highest level in the player team.&lt;br /&gt;
* settings: the settings data structure itself&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(lvl, dungeon, avg_team_lvl, hst_team_lvl, settings)&lt;br /&gt;
  local add = 0&lt;br /&gt;
  if dungeon then lvl = lvl*4//5 end&lt;br /&gt;
  if avg_team_lvl &amp;gt; lvl then add = (avg_team_lvl - lvl) // 10 end&lt;br /&gt;
  return lvl + add&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== outlaw_level_scaling ==&lt;br /&gt;
&lt;br /&gt;
Function that changes the level of guests based on the player&#039;s level. It must return the new level for the guest, or it will have no effect.&amp;lt;/br&amp;gt;&lt;br /&gt;
Arguments:&lt;br /&gt;
* lvl: base level of the guest.&lt;br /&gt;
* dungeon: if true, the level is the dungeon&#039;s recommended level. If false, it&#039;s taken from the difficulty data.&lt;br /&gt;
* avg_team_lvl: average level of the player team. It may or may not be an integer.&lt;br /&gt;
* hst_team_lvl: highest level in the player team.&lt;br /&gt;
* settings: the settings data structure itself&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(lvl, dungeon, avg_team_lvl, hst_team_lvl, settings)&lt;br /&gt;
  local add = 0&lt;br /&gt;
  if dungeon then lvl = lvl*23//20 end&lt;br /&gt;
  if avg_team_lvl &amp;gt; lvl then add = (avg_team_lvl - lvl) // 8 end&lt;br /&gt;
  add = add + (hst_team_lvl - avg_team_lvl) // 4&lt;br /&gt;
  return lvl + add&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== apply_outlaw_changes ==&lt;br /&gt;
&lt;br /&gt;
Function that allows you to edit an outlaw&#039;s data just before they are spawned.&lt;br /&gt;
You can change just about anything except its position and recruitability state. Its HP will also&lt;br /&gt;
always be automatically set to full after this function is called.&lt;br /&gt;
You will also be unable to change the EquippedItem of an &amp;quot;OUTLAW_ITEM&amp;quot; or &amp;quot;OUTLAW_ITEM_UNK&amp;quot; outlaw.&amp;lt;/br&amp;gt;&lt;br /&gt;
Arguments:&lt;br /&gt;
* outlaw: the outlaw Character itself&lt;br /&gt;
* job: the current job data table&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function(outlaw, job)&lt;br /&gt;
  local max_boost = PMDC.Data.MonsterFormData.MAX_STAT_BOOST&lt;br /&gt;
  outlaw.MaxHPBonus = math.min(outlaw.Level * max_boost // 64, max_boost);&lt;br /&gt;
  if job.Type == &amp;quot;OUTLAW_FLEE&amp;quot; then&lt;br /&gt;
    local speedMin = math.floor(outlaw.Level * 4 // 3)&lt;br /&gt;
    local speedMax = math.floor(outlaw.Level * 6 // 2)&lt;br /&gt;
    outlaw.SpeedBonus = math.min(_DATA.Save.Rand:Next(speedMin, speedMax), 100)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== fleeing_outlaw_restrictions ==&lt;br /&gt;
&lt;br /&gt;
A list of ids for types that are banned from ever being picked as fleeing outlaws.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{ &amp;quot;ghost&amp;quot; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== outlaw_music_name ==&lt;br /&gt;
&lt;br /&gt;
The name of the outlaw music file. This file will be sourced from the Content/Music folder.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;Outlaw.ogg&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeons ==&lt;br /&gt;
&lt;br /&gt;
This is where dungeon difficulty is set. Quests can only generate for dungeons inside this list.&lt;br /&gt;
Given the complexity of this structure, it is best generated using the [[User:MistressNebula/MissionGen: Editing settings#settings.AddDungeonSection(zone, segment, start, difficulty, finish, must_end)||AddDungeonSection]] function at the bottom of this page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_order ==&lt;br /&gt;
&lt;br /&gt;
Jobs are sorted by dungeon, following the order defined in this table. Missing dungeons are shoved at the bottom and sorted alphabetically.&lt;br /&gt;
This list is automatically populated in call order when using the &amp;quot;AddDungeonSection&amp;quot; function near the bottom of this file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== external_events ==&lt;br /&gt;
&lt;br /&gt;
A list of events unrelated to this library that can cause job generation to ignore a specific dungeon.&lt;br /&gt;
They can also be displayed in the objectives log if you so choose.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{condition: function(zone), message_key: string, message_args: function(zone), icon: string}&amp;lt;/code&amp;gt;&lt;br /&gt;
* condition: a function that takes a zone and returns a boolean. If it returns true, jobs will not be generated for this dungeon, and all already taken jobs will be automatically suspended.&lt;br /&gt;
* message_key: Optional. It will be used in the objectives log instead of the default message if the condition is true.&lt;br /&gt;
* message_args: Optional. If the message&#039;s localization string contains placeholders, this function is in charge of taking a zone and returning a list of values that will be used for those placeholders in the form of a table array (Up to 5).&lt;br /&gt;
* icon: Optional. The icon that will be displayed beside the corresponding dungeon in the dungeon selection menu if the condition is true for any of its segments. Defaults to &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  {condition = function(zone) return COMMON.HasSidequestInZone(zone) end, icon = &amp;quot;\\uE111&amp;quot;, message_key = &amp;quot;MENU_JOB_OBJECTIVE_DEFAULT&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== external_events_icon_mode ==&lt;br /&gt;
&lt;br /&gt;
How to display external event icons in the dungeon list. This value can only be either &amp;quot;FIRST&amp;quot; or ALL&amp;quot;.&lt;br /&gt;
* If set to &amp;quot;ALL&amp;quot;, they will always be displayed in the order defined by external_events. Only one copy of the same icon will be shown, no matter how many conditions require it.&lt;br /&gt;
* If set to &amp;quot;FIRST&amp;quot;, only the first event in the list&#039;s order will be displayed, no matter how many events are actually there. This setting does not prevent multiple messages from appearing in the objectives list.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;FIRST&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_list_pattern ==&lt;br /&gt;
&lt;br /&gt;
The pattern that will define how to display entries in the dungeon list.&amp;lt;/br&amp;gt;&lt;br /&gt;
{0} is the placeholder for the dungeon name, {1} for pending job icon and {2} for external condition icons.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;FIRST&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== job_types ==&lt;br /&gt;
&lt;br /&gt;
Table used to determine various properties regarding job types.&lt;br /&gt;
Remove a job type entirely to disable its generation altogether.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: {rank_modifier: integer, min_rank: string}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: one of RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
* rank_modifier (optional): these jobs will always have this modifier applied to their rank.&lt;br /&gt;
* min_rank (optional): this type of jobs can never be of a rank lower than this.&lt;br /&gt;
: This influences possible dungeon spawn: a rank_modifier 1 job with min_rank &amp;quot;C&amp;quot; can also spawn in &amp;quot;D&amp;quot; rank dungeons.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  RESCUE_SELF = {rank_modifier = 0, min_rank = &amp;quot;F&amp;quot;},&lt;br /&gt;
  RESCUE_FRIEND = {rank_modifier = 0, min_rank = &amp;quot;E&amp;quot;},&lt;br /&gt;
  ESCORT = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  EXPLORATION = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  DELIVERY = {rank_modifier = 0, min_rank = &amp;quot;D&amp;quot;},&lt;br /&gt;
  LOST_ITEM = {rank_modifier = 0, min_rank = &amp;quot;D&amp;quot;},&lt;br /&gt;
  OUTLAW = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  OUTLAW_ITEM = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  OUTLAW_ITEM_UNK = {rank_modifier = 1, min_rank = &amp;quot;C&amp;quot;},&lt;br /&gt;
  OUTLAW_MONSTER_HOUSE = {rank_modifier = 2, min_rank = &amp;quot;S&amp;quot;},&lt;br /&gt;
  OUTLAW_FLEE = {rank_modifier = 1, min_rank = &amp;quot;B&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== dungeon_job_modifiers ==&lt;br /&gt;
&lt;br /&gt;
Special table that allows modders to specify chance multipliers for job types depending on the dungeon.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;dungeon_id&amp;gt;: {&amp;lt;job_type_id&amp;gt;: &amp;lt;multiplier&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;dungeon_id&amp;gt;: the string id of a dungeon&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: one of RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
* &amp;lt;multiplier&amp;gt;: a multiplier number. It doesn&#039;t need to be an integer. It will be multiplied with the board&#039;s base chances, rounding up, when choosing the type of a job. Set it to 0 or less to disable the job type altogether.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  ambush_forest = {&lt;br /&gt;
    OUTLAW = 3,&lt;br /&gt;
    OUTLAW_ITEM = 3,&lt;br /&gt;
    OUTLAW_ITEM_UNK = 3,&lt;br /&gt;
    OUTLAW_MONSTER_HOUSE = 3,&lt;br /&gt;
    OUTLAW_FLEE = 3&lt;br /&gt;
  },&lt;br /&gt;
  treacherous_mountain = {&lt;br /&gt;
    OUTLAW = 3,&lt;br /&gt;
    OUTLAW_ITEM = 3,&lt;br /&gt;
    OUTLAW_ITEM_UNK = 3,&lt;br /&gt;
    OUTLAW_MONSTER_HOUSE = 3,&lt;br /&gt;
    OUTLAW_FLEE = 3&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== special_chance ==&lt;br /&gt;
&lt;br /&gt;
Chance of special missions to be generated. Special missions are just handcrafted scenarios with specific client and target pairs and custom flavor texts. Set to 0 to disable altogether.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;0.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== special_jobs ==&lt;br /&gt;
&lt;br /&gt;
This is where you can define special cases for specific types of jobs.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;special_id&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: one of RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
* &amp;lt;special_id&amp;gt;: any id of your choosing except RESCUE_SELF, RESCUE_FRIEND, ESCORT, EXPLORATION, DELIVERY, LOST_ITEM, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_MONSTER_HOUSE, OUTLAW_FLEE&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  RESCUE_FRIEND = {&amp;quot;CHILD&amp;quot;, &amp;quot;LOVER&amp;quot;, &amp;quot;RIVAL&amp;quot;, &amp;quot;FRIEND&amp;quot;}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== hidden_floor_chance ==&lt;br /&gt;
&lt;br /&gt;
Chance for supported quest types to have their destination floor hidden. Set to 0 to disable altogether.&amp;lt;/br&amp;gt;&lt;br /&gt;
Players will still be notified when reaching the floor. It just won&#039;t show in the quest description.&amp;lt;/br&amp;gt;&lt;br /&gt;
Job types that can have their floor hidden are: RESCUE_FRIEND, EXPLORATION, OUTLAW, OUTLAW_ITEM, OUTLAW_ITEM_UNK, OUTLAW_FLEE.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;0.15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== reward_types ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A list of all types of rewards to be offered to players.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{id: string, weight: integer, min_rank: string}&amp;lt;/code&amp;gt;&lt;br /&gt;
* id: one of the supported reward types. You can use duplicate values to alter odds depending on job rank.&lt;br /&gt;
: Supported reward types are: item, money, item_item, money_item, client, exclusive&lt;br /&gt;
* weight: Chance of appearing. Set to 0 or delete altogether to stop a type of reward from being offered.&lt;br /&gt;
* min_rank: optional. If set, this type of reward will only be offered if the job is this rank or higher.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  {id = &amp;quot;item&amp;quot;, weight = 6},&lt;br /&gt;
  {id = &amp;quot;money&amp;quot;, weight = 2},&lt;br /&gt;
  {id = &amp;quot;item_item&amp;quot;, weight = 3},&lt;br /&gt;
  {id = &amp;quot;money_item&amp;quot;, weight = 1},&lt;br /&gt;
  {id = &amp;quot;client&amp;quot;, weight = 1, min_rank = &amp;quot;STAR_1&amp;quot;},&lt;br /&gt;
  {id = &amp;quot;exclusive&amp;quot;, weight = 1, min_rank = &amp;quot;STAR_4&amp;quot;}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== extra_reward_type ==&lt;br /&gt;
&lt;br /&gt;
The type of extra reward for all quests. It can be &amp;quot;none&amp;quot;, &amp;quot;rank&amp;quot; or &amp;quot;exp&amp;quot;. Any other value will result in &amp;quot;none&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;exp&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== rewards_per_difficulty ==&lt;br /&gt;
&lt;br /&gt;
This table assigns different weights to reward pools depending on the difficulty rank of the mission.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;diff_id&amp;gt;: {id: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;diff_id&amp;gt;: one of the difficulties defined in difficulty_list&amp;quot;&lt;br /&gt;
* id: the id of one of the reward pools defined in &amp;quot;reward_pools&amp;quot;&lt;br /&gt;
* weight: Chance of appearing. Set to 0 or delete altogether to stop a reward pool from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  F = {&lt;br /&gt;
    {id = &amp;quot;NECESSITIES&amp;quot;, weight = 10}&lt;br /&gt;
  },&lt;br /&gt;
  E = {&lt;br /&gt;
    {id = &amp;quot;NECESSITIES&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;APRICORN_GENERIC&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;FOOD_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;SEED_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;HELD_LOW&amp;quot;, weight = 3},&lt;br /&gt;
    {id = &amp;quot;LOOT_LOW&amp;quot;, weight = 3},&lt;br /&gt;
    {id = &amp;quot;EVO_ITEMS&amp;quot;, weight = 1},&lt;br /&gt;
    {id = &amp;quot;WANDS_LOW&amp;quot;, weight = 10}&lt;br /&gt;
  },&lt;br /&gt;
  D = {&lt;br /&gt;
    {id = &amp;quot;NECESSITIES&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;AMMO_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;APRICORN_GENERIC&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;APRICORN_TYPED&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;FOOD_LOW&amp;quot;, weight = 4},&lt;br /&gt;
    {id = &amp;quot;SEED_LOW&amp;quot;, weight = 4},&lt;br /&gt;
    {id = &amp;quot;SEED_MID&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;HELD_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;HELD_TYPE&amp;quot;, weight = 3},&lt;br /&gt;
    {id = &amp;quot;LOOT_LOW&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;EVO_ITEMS&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;ORBS_LOW&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;WANDS_LOW&amp;quot;, weight = 4},&lt;br /&gt;
    {id = &amp;quot;WANDS_MID&amp;quot;, weight = 10},&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== reward_pools ==&lt;br /&gt;
&lt;br /&gt;
List of all reward pools and the items they contain. You must at least include all pools referenced in the rewards_per_difficulty table, but you can add more.&amp;lt;/br&amp;gt;&lt;br /&gt;
Entry ids may be either items or other pools. A pool doesn&#039;t have to only contain one of the two.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;pool id&amp;gt;: {id: string, count: integer, hidden: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;pool_id&amp;gt;: the id of the pool. It should be used somewhere else either in this table or in rewards_per_difficulty.&lt;br /&gt;
* id: item_id or pool_id. If it matches a pool, count and hidden will be ignored.&lt;br /&gt;
* count: Optional. The amount of items awarded. It cannot be higher than the item&#039;s max stack. Defaults to the item&#039;s max stack.&lt;br /&gt;
* hidden: Optional. Hidden value that can be used for various purposes depending on the item. Defaults to &amp;quot;&amp;quot;.&lt;br /&gt;
* weight: Chance of appearing. Set to 0 or delete altogether to stop an entry from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  NECESSITIES = {&lt;br /&gt;
    {id = &amp;quot;seed_reviver&amp;quot;, weight = 10},&lt;br /&gt;
    {id = &amp;quot;berry_leppa&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;berry_oran&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;berry_lum&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;food_apple&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;orb_escape&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;apricorn_plain&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;key&amp;quot;,count = 3,  weight = 2}&lt;br /&gt;
  },&lt;br /&gt;
  AMMO_LOW = {&lt;br /&gt;
    {id = &amp;quot;ammo_iron_thorn&amp;quot;, count = 3, weight = 5},&lt;br /&gt;
    {id = &amp;quot;ammo_geo_pebble&amp;quot;, count = 3, weight = 1},&lt;br /&gt;
    {id = &amp;quot;ammo_stick&amp;quot;, count = 3, weight = 1},&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== target_items ==&lt;br /&gt;
&lt;br /&gt;
Ids of items that can be used as targets, divided depending on the job type.&lt;br /&gt;
Make sure they&#039;re either easy enough to obtain or impossible to lose, depending on the job.&lt;br /&gt;
Using stackable items is highly discouraged for all job types, as it may result in odd behaviors.&amp;lt;/br&amp;gt;&lt;br /&gt;
&#039;&#039;Please keep in mind that if you want to use the &amp;quot;mission_&amp;quot; items shown in the example you must either recreate them or copy them over from the example mod.&#039;&#039;&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;item_id&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: the id of a job type defined inside &amp;quot;job_types&amp;quot;&lt;br /&gt;
* &amp;lt;item_id&amp;gt;: the id of the item to use&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  LOST_ITEM = {&lt;br /&gt;
    &amp;quot;mission_lost_scarf&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_lost_specs&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_lost_band&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  OUTLAW_ITEM = {&lt;br /&gt;
    &amp;quot;mission_stolen_scarf&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_stolen_band&amp;quot;,&lt;br /&gt;
    &amp;quot;mission_stolen_specs&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  DELIVERY = {&lt;br /&gt;
    &amp;quot;berry_oran&amp;quot;,&lt;br /&gt;
    &amp;quot;berry_leppa&amp;quot;,&lt;br /&gt;
    &amp;quot;food_apple&amp;quot;,&lt;br /&gt;
    &amp;quot;berry_lum&amp;quot;,&lt;br /&gt;
    &amp;quot;apricorn_plain&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== difficulty_to_tier ==&lt;br /&gt;
&lt;br /&gt;
Weighted table that associates mission difficulty to a specific tier of characters and outlaws.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;diff_id&amp;gt;: {id: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;diff_id&amp;gt;: one of the difficulties defined in &amp;quot;difficulty_list&amp;quot;&lt;br /&gt;
* id: A string that defines a pokémon tier id.&lt;br /&gt;
* weight: Chance of being picked. Set to 0 or delete altogether to stop an entry from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  F = {&lt;br /&gt;
    {id = &amp;quot;TIER_LOW&amp;quot;, weight = 10}&lt;br /&gt;
  },&lt;br /&gt;
  E = {&lt;br /&gt;
    {id = &amp;quot;TIER_LOW&amp;quot;, weight = 9},&lt;br /&gt;
    {id = &amp;quot;TIER_MID&amp;quot;, weight = 1}&lt;br /&gt;
  },&lt;br /&gt;
  D = {&lt;br /&gt;
    {id = &amp;quot;TIER_LOW&amp;quot;, weight = 7},&lt;br /&gt;
    {id = &amp;quot;TIER_MID&amp;quot;, weight = 3}&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== pokemon ==&lt;br /&gt;
&lt;br /&gt;
A list of Pokémon that will be used for job generation, sorted by arbitrary quest tiers.&lt;br /&gt;
Any of these entries may be picked when choosing client and target.&lt;br /&gt;
If the client picked is not in the seen dex, the reward type can never be &amp;quot;client&amp;quot; nor &amp;quot;exclusive&amp;quot;.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;tier&amp;gt;: &amp;lt;monster_id&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;tier&amp;gt;: one of the tier ids used in difficulty_to_tier&lt;br /&gt;
* &amp;lt;monster_id&amp;gt;: either the species id of a pokémon or a MonsterIDTable&lt;br /&gt;
Format of MonsterIDTable: see the &amp;quot;monsterIdTemplate&amp;quot; function in missiongen_lib.lua&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  TIER_LOW = {&lt;br /&gt;
&amp;quot;abra&amp;quot;,&amp;quot;amaura&amp;quot;,&amp;quot;anorith&amp;quot;,&amp;quot;applin&amp;quot;,&amp;quot;archen&amp;quot;,&amp;quot;aron&amp;quot;,&amp;quot;arrokuda&amp;quot;,&amp;quot;axew&amp;quot;,&amp;quot;azurill&amp;quot;, [...]&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== job_titles ==&lt;br /&gt;
&lt;br /&gt;
A list of all possible job display titles, divided by job type.&lt;br /&gt;
You must also include lists for any special job types you intend to use.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;string_key&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: either the id of a job type defined inside &amp;quot;job_types&amp;quot;, or the id of a special job type&lt;br /&gt;
* &amp;lt;string_key&amp;gt;: the localization key used for the title. The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target (or client, if there is no target)&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  RESCUE_SELF = {&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_001&amp;quot;,&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_002&amp;quot;,&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_003&amp;quot;,&lt;br /&gt;
    &amp;quot;MISSION_TITLE_RESCUE_SELF_004&amp;quot;,&lt;br /&gt;
    [...]&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== job_flavor ==&lt;br /&gt;
&lt;br /&gt;
A list of all possible job flavor text entries, divided by job type and by line.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: {&amp;lt;string_key&amp;gt;[], &amp;lt;string_key&amp;gt;[]}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: either the id of a job type defined inside &amp;quot;job_types&amp;quot;, or the id of a special job type&lt;br /&gt;
* &amp;lt;string_key&amp;gt;: the localization key used for the flavor text. Every job has 2 lists assigned: one for the top string and one for the bottom one.&lt;br /&gt;
If only the first list is specified, the second one will be left empty.&lt;br /&gt;
The localized strings are fetched from the Menu Text list (strings.resx)&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target (or client, if there is no target)&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  RESCUE_SELF = {&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_001&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_002&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_003&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_TOP_RESCUE_SELF_004&amp;quot;,&lt;br /&gt;
      [...]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;MISSION_BODY_BOTTOM_RESCUE_SELF_001&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_BOTTOM_RESCUE_SELF_002&amp;quot;,&lt;br /&gt;
      &amp;quot;MISSION_BODY_BOTTOM_RESCUE_SELF_003&amp;quot;,&lt;br /&gt;
      [...]&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== law_enforcement ==&lt;br /&gt;
&lt;br /&gt;
Law enforcement characters in your setting. All OUTLAW jobs except OUTLAW_ITEM and OUTLAW_ITEM_UNK use these characters as job clients.&lt;br /&gt;
You may specify only 1 officer, and then a list containing any number of agents. Two of the latter will be randomly picked every time the job completion cutscene is played.&amp;lt;/br&amp;gt;&lt;br /&gt;
You may add a weight property to agents to specify a custom chance of being picked. Any without will&lt;br /&gt;
have a weight of 1.&amp;lt;/br&amp;gt;&lt;br /&gt;
Add &amp;quot;unique = true&amp;quot; to the MonsterIDTable to stop an agent from being picked twice. You must&lt;br /&gt;
have at least either 1 non-unique agent or 2 unique ones for this list table to be valid.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format of MonsterIDTable: see the &amp;quot;monsterIdTemplate&amp;quot; function in missiongen_lib.lua&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  OFFICER = {Species = &amp;quot;magnezone&amp;quot;, Gender = 0},&lt;br /&gt;
  AGENT = {&lt;br /&gt;
    {Species = &amp;quot;magnemite&amp;quot;, Gender = 0, Weight = 31},&lt;br /&gt;
    {Species = &amp;quot;magnemite&amp;quot;, Gender = 0, Skin = &amp;quot;shiny&amp;quot;, Weight = 1, Unique = true}&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== enforcer_chance ==&lt;br /&gt;
&lt;br /&gt;
Defines the chance of either the officer or an agent being the client of a mission depending on the character tier of the mission, as defined in difficulty_to_tier.&amp;lt;/br&amp;gt;&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;tier&amp;gt;: {id: string, weight: integer}[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;tier&amp;gt;: one of the tier ids used in difficulty_to_tier&lt;br /&gt;
* id: One of: OFFICER, AGENT&lt;br /&gt;
* index: Optional. Ignored if id is OFFICER. You can set it to specify a specific agent instead of rolling using their chance in &amp;quot;law_enforcement&amp;quot;.&lt;br /&gt;
* weight: Chance of being picked. Set to 0 or delete altogether to stop an entry from being picked.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  TIER_LOW = {&lt;br /&gt;
    {id = &amp;quot;OFFICER&amp;quot;, weight = 2},&lt;br /&gt;
    {id = &amp;quot;AGENT&amp;quot;, weight = 8}&lt;br /&gt;
  },&lt;br /&gt;
  TIER_MID = {&lt;br /&gt;
    {id = &amp;quot;OFFICER&amp;quot;, weight = 5},&lt;br /&gt;
    {id = &amp;quot;AGENT&amp;quot;, weight = 5}&lt;br /&gt;
  },&lt;br /&gt;
  TIER_HIGH = {&lt;br /&gt;
    {id = &amp;quot;OFFICER&amp;quot;, weight = 8},&lt;br /&gt;
    {id = &amp;quot;AGENT&amp;quot;, weight = 2}&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== special_data ==&lt;br /&gt;
&lt;br /&gt;
Data of characters and flavor key used for special jobs, divided by tier.&lt;br /&gt;
In outlaw related quests, you may use ENFORCER as a keyword for a random law enforcement character.&lt;br /&gt;
You may also use OFFICER or AGENT to specify a more specific selection.&lt;br /&gt;
These keywords can only be used in place of MonsterIDTables.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;special_type&amp;gt;: {&amp;lt;tier&amp;gt;: {client: MonsterIDTable, target: MonsterIDTable, item: string, flavor: string}[]}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;special_type&amp;gt;: an id of your choosing. It must be different from any basic job id&lt;br /&gt;
* &amp;lt;tier&amp;gt;: one of the tier ids used in difficulty_to_tier&lt;br /&gt;
* client: the data used to generate this Pokémon.&lt;br /&gt;
* target: the data used to generate this Pokémon.  Only used in job types that require a target.&lt;br /&gt;
* item: the id of the item that will be used for this job. Only used in job types that require an item.&lt;br /&gt;
* flavor: flavor string key used for the job, sourced from the Menu Text list (strings.resx)&lt;br /&gt;
Format of MonsterIDTable: see the &amp;quot;monsterIdTemplate&amp;quot; function in missiongen_lib.lua&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target (or client, if there is no target)&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{&lt;br /&gt;
  LOVER = {&lt;br /&gt;
    TIER_LOW = {&lt;br /&gt;
      {client = {Species = &amp;quot;volbeat&amp;quot;, Gender = 1}, target = {Species = &amp;quot;illumise&amp;quot;, Gender = 2}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_001&amp;quot;},&lt;br /&gt;
      {client = {Species = &amp;quot;minun&amp;quot;, Gender = 1}, target = {Species = &amp;quot;plusle&amp;quot;, Gender = 2}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_002&amp;quot;},&lt;br /&gt;
      {client = {Species = &amp;quot;mareep&amp;quot;, Gender = 2}, target = {Species = &amp;quot;wooloo&amp;quot;, Gender = 1}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_003&amp;quot;},&lt;br /&gt;
      [...]&lt;br /&gt;
    },&lt;br /&gt;
    TIER_MID = {&lt;br /&gt;
      {client = {Species = &amp;quot;miltank&amp;quot;, Gender = 2}, target = {Species = &amp;quot;tauros&amp;quot;, Gender = 1}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_005&amp;quot;},&lt;br /&gt;
      {client = {Species = &amp;quot;venomoth&amp;quot;, Gender = 1}, target = {Species = &amp;quot;butterfree&amp;quot;, Gender = 2}, flavor = &amp;quot;MISSION_BODY_SPECIAL_LOVER_006&amp;quot;},&lt;br /&gt;
      [...]&lt;br /&gt;
    },&lt;br /&gt;
    [...]&lt;br /&gt;
  },&lt;br /&gt;
  [...]&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== escort_talks ==&lt;br /&gt;
&lt;br /&gt;
String keys to be used whenever the player interacts with an escort mission client, depending on the job type.&lt;br /&gt;
You can also include tables for special escort jobs. If no such table exists for a specific case, the generic table for the job type will be used.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;&amp;lt;job_type_id&amp;gt;: &amp;lt;string_key&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;job_type_id&amp;gt;: &amp;quot;ESCORT&amp;quot;, &amp;quot;EXPLORATION&amp;quot;, or the id of a special job type that corresponds to one of these job types&lt;br /&gt;
* &amp;lt;string_key&amp;gt;: the localization key of possible messages. The localized strings are fetched from the Gameplay Text list (stringsEx.resx)&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: target&lt;br /&gt;
* {1}: dungeon&lt;br /&gt;
* {2}: item&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  ESCORT = {&lt;br /&gt;
    &amp;quot;MISSION_ESCORT_INTERACT&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  EXPLORATION = {&lt;br /&gt;
    &amp;quot;MISSION_EXPLORATION_INTERACT&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== rescue_responses ==&lt;br /&gt;
&lt;br /&gt;
Strings keys to be used whenever the player interacts with a pokémon that needs rescue, depending on the job type and the response given.&lt;br /&gt;
You must include a &amp;quot;_DEFAULT&amp;quot; table, but you can also include tables for special job types. _DEFAULT will still be used for any special&lt;br /&gt;
case that doesn&#039;t have a table associated with it.&lt;br /&gt;
Format: &amp;lt;code&amp;gt;{rescue_yes: {&amp;lt;case_id&amp;gt;: {key: string, emotion: string}[]}, rescue_no: {&amp;lt;case_id&amp;gt;: {key: string, emotion: string}[]}}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;case_id&amp;gt;: &amp;quot;_DEFAULT&amp;quot;, or the id of a special job type that corresponds to either &amp;quot;RESCUE_SELF&amp;quot; or &amp;quot;RESCUE_FRIEND&amp;quot;&lt;br /&gt;
* key: the localization key of possible messages. The localized strings are fetched from the Gameplay Text list (stringsEx.resx)&lt;br /&gt;
* emotion: Optional. An emotion id to use with this specific message. Defaults to &amp;quot;Normal&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Localization placeholders:&lt;br /&gt;
* {0}: client&lt;br /&gt;
* {1}: target&lt;br /&gt;
* {2}: dungeon&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  rescue_yes = {&lt;br /&gt;
    _DEFAULT = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_DEFAULT&amp;quot;} },&lt;br /&gt;
    CHILD  = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_CHILD&amp;quot;, emotion = &amp;quot;Joyous&amp;quot;} },&lt;br /&gt;
    FRIEND = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_FRIEND&amp;quot;} },&lt;br /&gt;
    RIVAL  = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_RIVAL&amp;quot;} },&lt;br /&gt;
    LOVER  = { {key = &amp;quot;MISSION_RESCUE_CONFIRM_LOVER&amp;quot;, emotion = &amp;quot;Joyous&amp;quot;} }&lt;br /&gt;
  },&lt;br /&gt;
  rescue_no = {&lt;br /&gt;
    _DEFAULT = { {key = &amp;quot;MISSION_RESCUE_DENY_DEFAULT&amp;quot;, emotion = &amp;quot;Surprised&amp;quot;} },&lt;br /&gt;
    CHILD  = { {key = &amp;quot;MISSION_RESCUE_DENY_CHILD&amp;quot;, emotion = &amp;quot;Crying&amp;quot;} },&lt;br /&gt;
    FRIEND = { {key = &amp;quot;MISSION_RESCUE_DENY_FRIEND&amp;quot;, emotion = &amp;quot;Surprised&amp;quot;} },&lt;br /&gt;
    RIVAL  = { {key = &amp;quot;MISSION_RESCUE_DENY_RIVAL&amp;quot;, emotion = &amp;quot;Stunned&amp;quot;} },&lt;br /&gt;
    LOVER  = { {key = &amp;quot;MISSION_RESCUE_DENY_LOVER&amp;quot;, emotion = &amp;quot;Stunned&amp;quot;} }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== mission_callback_root ==&lt;br /&gt;
&lt;br /&gt;
The object that contains job callback functions. It is recommended to define this object somewhere else.&amp;lt;/br&amp;gt;&lt;br /&gt;
Job callbacks are stored inside jobs as strings. These strings are then used as an index in the callback root object to retrieve the actual function.&lt;br /&gt;
&lt;br /&gt;
The callback system is a pretty involved one, that gives a modder the ability to handcraft entirely new types of jobs if they so choose, but is also pretty difficult to handle, so it will be discussed in [[User:MistressNebula/MissionGen: Job callbacks|its own guide]].&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&amp;lt;pre&amp;gt;COMMON&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== settings.AddDungeonSection(zone, segment, start, difficulty, finish, must_end) ==&lt;br /&gt;
&lt;br /&gt;
Adds a new dungeon section to the list of possible job destinations.&lt;br /&gt;
Section start values must always be added in ascending order. Failing to do so may cause inconsistent behaviors.&lt;br /&gt;
&lt;br /&gt;
=== Arguments ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;zone&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: the string id of the dungeon zone.&lt;br /&gt;
* &amp;lt;code&amp;gt;segment&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: the numeric id of the dungeon segment.&lt;br /&gt;
* &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: the starting floor of this dungeon section (start counting from 1 for this).&lt;br /&gt;
* &amp;lt;code&amp;gt;difficulty&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;: the string id of the difficulty assigned to this section.&lt;br /&gt;
* &amp;lt;code&amp;gt;finish&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;: Only considered when first adding a segment to the list. Can be omitted otherwise. This will be the last floor of the segment where jobs can spawn (start counting from 1 for this). If higher than the dungeon floors, it will default to the full dungeon length.&lt;br /&gt;
* &amp;lt;code&amp;gt;must_end&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; Only considered when first adding a segment to the list. Can be omitted otherwise. If true, this segment must be completed before jobs can spawn in it. If false, the segment must be accessed at least once, unless it&#039;s segment 0, which just needs to be unlocked. Defaults to true.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
settings.AddDungeonSection(&amp;quot;faultline_ridge&amp;quot;, 0, 6, &amp;quot;D&amp;quot;, 10)&lt;br /&gt;
settings.AddDungeonSection(&amp;quot;sickly_hollow&amp;quot;, 0, 9, &amp;quot;S&amp;quot;, 16, false)&lt;br /&gt;
settings.AddDungeonSection(&amp;quot;sickly_hollow&amp;quot;, 0, 13, &amp;quot;STAR_1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board_Mod/Basic_setup&amp;diff=2798</id>
		<title>Mod:Nebula&#039;s Mission Board Mod/Basic setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board_Mod/Basic_setup&amp;diff=2798"/>
		<updated>2025-07-29T17:33:13Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page Mod:Nebula&amp;#039;s Mission Board Mod/Basic setup to Mod:Nebula&amp;#039;s Mission Board/Basic setup: Misspelled title&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Mod:Nebula&#039;s Mission Board/Basic setup]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/Basic_setup&amp;diff=2797</id>
		<title>Mod:Nebula&#039;s Mission Board/Basic setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/Basic_setup&amp;diff=2797"/>
		<updated>2025-07-29T17:33:13Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page Mod:Nebula&amp;#039;s Mission Board Mod/Basic setup to Mod:Nebula&amp;#039;s Mission Board/Basic setup: Misspelled title&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Despite it being created to be as easy to add inside mods as possible, it still takes a bit of work to get the Mission Generation Library up and running. This page will run through all the necessary steps, from file placement to function hooks and &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; calls.&lt;br /&gt;
&lt;br /&gt;
===== Importing the files =====&lt;br /&gt;
&lt;br /&gt;
# Download [https://github.com/435THz/NebulaMissionBoard/releases Nebula&#039;s Mission Board] from github and extract the zip&#039;s content wherever you like.&lt;br /&gt;
# Go to the mod&#039;s &amp;lt;code&amp;gt;Data/Script&amp;lt;/code&amp;gt; folder and copy the &amp;lt;code&amp;gt;missiongen_lib&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Paste the &amp;lt;code&amp;gt;missiongen_lib&amp;lt;/code&amp;gt; folder inside your own mod&#039;s &amp;lt;code&amp;gt;Data/Script&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
Note that the library files expect to be placed exactly inside &amp;lt;code&amp;gt;Data/Script/missiongen_lib&amp;lt;/code&amp;gt;. If you place them anywhere else, you will need to adjust all of the files&#039; &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt; calls accordingly, as well as all of the &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt; calls present in this guide.&lt;br /&gt;
Don&#039;t forget to also copy all of the strings inside the &amp;lt;code&amp;gt;strings.resx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;stringsEx.resx&amp;lt;/code&amp;gt; files over to your mod!&lt;br /&gt;
&lt;br /&gt;
===== Initializing the library =====&lt;br /&gt;
&lt;br /&gt;
With the files imported in your mod, it&#039;s time to load it:&lt;br /&gt;
* Add &amp;lt;code&amp;gt;MissionGen = require(&amp;quot;missiongen_lib.missiongen_lib&amp;quot;)&amp;lt;/code&amp;gt; inside your mod&#039;s &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt; file. You can rename this variable however you want, but it must be a global variable.&lt;br /&gt;
* If your global variable is not named &amp;quot;MissionGen&amp;quot;, open missiongen_service.lua and change the &amp;lt;code&amp;gt;library_name&amp;lt;/code&amp;gt; string into your global variable&#039;s name. Doing this will ensure that the service will be able to find the library when it needs to interact with it.&lt;br /&gt;
* Add &amp;lt;code&amp;gt;require &#039;missiongen_lib.missiongen_service&#039;&amp;lt;/code&amp;gt; inside your mod&#039;s &amp;lt;code&amp;gt;main.lua&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
These steps will take care of most of the initialization process all by themselves. All of the library files will be loaded, and the &amp;lt;code&amp;gt;SV&amp;lt;/code&amp;gt; structure will be automatically have the library&#039;s save data added to it. This, however, does nothing in terms of gameplay, and more steps are needed for the library to actually function.&lt;br /&gt;
&lt;br /&gt;
===== Hooking up functions =====&lt;br /&gt;
This is the lengthiest part of the guide. There are a lot of functions that need to be set up in order for the library to work correctly, as highlighted by the many files inside Nebula&#039;s Mission Board mod. Luckily, they&#039;re pretty easy to port: All you need to do is copy-paste all functions in their respective files in your mod. For example, all functions inside Nebula&#039;s Mission Board&#039;s &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt; will need to go inside &#039;&#039;your mod&#039;s&#039;&#039; &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt;.&lt;br /&gt;
These are the files containing code that needs to be copied over:&lt;br /&gt;
* &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;common_vars.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event.lua&amp;lt;/code&amp;gt; (the &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; statements)&lt;br /&gt;
* &amp;lt;code&amp;gt;event.battle.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event_mapgen.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event.single.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You now need to hook up the dungeon generation code to the game. Open your mod in [[Dev Mode]], go to the Constants tab and open the Universal menu. Here, in Zone Steps, add a new Script Zone Step. Set its Script parameter to &amp;lt;code&amp;gt;GenerateJobInFloor&amp;lt;/code&amp;gt;.&lt;br /&gt;
Now save your changes, and that&#039;s it! This function will be responsible for dynamically adding the necessary steps and events whenever a destination floor is reached.&lt;br /&gt;
&lt;br /&gt;
Everything we did up until now takes care of everything when it comes to generating and handling jobs inside dungeons, but there is still nothing that allows players to take new jobs, or to hand in completed ones. Not to worry: all you need to do is to add a call to &amp;lt;code&amp;gt;MissionGen:BoardInteract(board_id)&amp;lt;/code&amp;gt;, and your players will be able to access your job board of choice and take its contents. &amp;lt;code&amp;gt;board_id&amp;lt;/code&amp;gt;s will be discussed in the page about [[User:MistressNebula/MissionGen: Editing settings|Settings]].&lt;br /&gt;
As for how handing in missions works, you will need to write a cutscene for it. Nebula&#039;s Mission Board mod already has one inside &amp;lt;code&amp;gt;Data/Script/nebula_mission_board/ground/base_camp_2&amp;lt;/code&amp;gt; if you want to copy it, but here&#039;s a basic rundown of how the job completion cutscene is handled:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;If any mission has been completed in the last dungeon run, the library will send the player to the location set inside the &amp;lt;code&amp;gt;end_dungeon_day_destination&amp;lt;/code&amp;gt; setting. This location will need to call the &amp;lt;code&amp;gt;MissionGen:PlayJobsCompletedCutscene(callback)&amp;lt;/code&amp;gt; function. If you have multiple maps with job boards, this function will also handle switching between maps as needed. You will have to provide the callback. (see step 3 for more details)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;code&amp;gt;PlayJobsCompletedCutscene&amp;lt;/code&amp;gt; will generate a list of characters, that will be passed to the callback along with the job struct itself.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;the callback is ran. This is a modder-defined function with the following arguments:&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;a job table&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;a list of &amp;lt;code&amp;gt;GroundChar&amp;lt;/code&amp;gt;s. The first one is always the client, while the second, if present, is always the target. Third and fourth are only generated for law enforcement jobs, and represent the background officers that would normally keep the outlaw restrained during the cutscene.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
The callback is supposed to handle the cutscene itself, moving the characters where they need to be and displaying dialogue. It also needs to call &amp;lt;code&amp;gt;MissionGen:RewardPlayer(job, speaker, line1, line2)&amp;lt;/code&amp;gt;, otherwise the player will not actually receive any rewards for the job they completed.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Once the cutscene is finished, control goes back to &amp;lt;code&amp;gt;PlayJobsCompletedCutscene&amp;lt;/code&amp;gt;, which will get rid of the current job and keep scanning for other completed ones  until the end of the list, repeating steps 2 and 3 for each of them.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Finally, the function stored in the &amp;lt;&amp;gt;after_rewards_function&amp;lt;&amp;gt; settings is called, the boards are refreshed, and control is returned to the player.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That said, what you need to do is:&lt;br /&gt;
* call &amp;lt;code&amp;gt;MissionGen:PlayJobsCompletedCutscene(callback)&amp;lt;/code&amp;gt; in any and all maps that have a board assigned to it.&lt;br /&gt;
* write the callback for the function above; it needs to use the current job&#039;s data and the given list of characters to actually implement the cutscene itself, and call &amp;lt;code&amp;gt;MissionGen:RewardPlayer(job, speaker, line1, line2)&amp;lt;/code&amp;gt; so that players will receive their reward.&lt;br /&gt;
When that is done, the library will finally be fully set up and ready to use, though you will still need to edit its Settings to make sure that it generates jobs for your mod&#039;s dungeons.&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula&amp;diff=2796</id>
		<title>User:MistressNebula</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula&amp;diff=2796"/>
		<updated>2025-07-29T17:32:29Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: Redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MistressNebula is a PMDO modder and source code contributor.&lt;br /&gt;
&lt;br /&gt;
Notable modding works include:&lt;br /&gt;
* [[User:MistressNebula/Dungeon Recruitment List|Dungeon Recruitment List]] ([https://github.com/435THz/Dungeon_Recruitment_List github])&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board|Mission Generation Library]] ([https://github.com/435THz/NebulaMissionBoard github])&lt;br /&gt;
* [[User:MistressNebula/PMD:New Leaf|PMD:NewLeaf]] (WIP, currently unreleased)&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board_Mod&amp;diff=2795</id>
		<title>Mod:Nebula&#039;s Mission Board Mod</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board_Mod&amp;diff=2795"/>
		<updated>2025-07-29T17:31:44Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page Mod:Nebula&amp;#039;s Mission Board Mod to Mod:Nebula&amp;#039;s Mission Board: Misspelled title&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Mod:Nebula&#039;s Mission Board]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board&amp;diff=2794</id>
		<title>Mod:Nebula&#039;s Mission Board</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board&amp;diff=2794"/>
		<updated>2025-07-29T17:31:44Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page Mod:Nebula&amp;#039;s Mission Board Mod to Mod:Nebula&amp;#039;s Mission Board: Misspelled title&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[User:MistressNebula|Nebula]]&#039;s Mission Board is a mod that adds a mission board to the base PMDO game, allowing players to embark in missions to gain special items and money and to gain experience.&lt;br /&gt;
It looks and plays essentially the same as the base game&#039;s Enable Mission Board mod, except that all job generation and job handling functions are dealt with by a highly customizable library bundled within the mod, built with the express purpose of being as easy to import and implement as possible while giving experienced modders the tools they need to make even more complex systems and behaviors.&lt;br /&gt;
&lt;br /&gt;
== PMDO Mission Generation Library ==&lt;br /&gt;
The library itself is fully contained inside the Data/Script/missiongen_lib folder inside the mod. By taking this folder and moving it to your mod, you will have access to all of its functions. Remember to credit MistressNebula if you include this library in your project!&lt;br /&gt;
&lt;br /&gt;
Do keep in mind that simply moving the files inside your mod is not enough to set up the library: you will also need to hook all of the necessary events to your mod. Please refer to the links at the bottom of this page for a more in-depth guide on how to do it.&lt;br /&gt;
&lt;br /&gt;
===== How the library is structured =====&lt;br /&gt;
The library is broken up into 5 files:&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_lib.lua&amp;lt;/code&amp;gt; is the core file of the library. It&#039;s where the most important structures, functions and global variables are defined and handled, as well as the one containing all the hooks that mods are expected to use to interface with it.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_settings.lua&amp;lt;/code&amp;gt; contains a table of parameters and properties used by the library to function. This is the file that modders are supposed to edit to alter the behavior of the library. Every setting is documented individually, describing its format, what it is used for and what kind of data it requires. The file is loaded directly by the main file, and is not supposed to be loaded directly.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_menus.lua&amp;lt;/code&amp;gt; is a file whose sole purpose is to contain the menus used by the library. It is loaded automatically by the main file, and its functions are not supposed to be interacted with directly.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_service.lua&amp;lt;/code&amp;gt; is the file that contains the service required by the library to handle loading, menu edits and dungeon completion tracking. It needs to be loaded separately from the main file. This file also contains the only value outside of the settings file that MIGHT require changing. More details in the setup guide below.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_devcheck.lua&amp;lt;/code&amp;gt; contains a function, called by the main file when loading, whose purpose is to check, to the best of its abilities, if the values inside the settings file are valid, and print the results of its test to the console. If this file is deleted or misplaced, the check will simply be skipped. This file is only loaded when the game is in [[Dev Mode]]. If you hear the music restart when loading your save data, it&#039;s because of this file.&lt;br /&gt;
&lt;br /&gt;
===== Setup guides =====&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Basic setup|Basic setup]]&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Hook implementations|Hook implementations]]&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Editing settings|Editing settings]]&lt;br /&gt;
* [[User:MistressNebula/MissionGen: String keys|String keys]]&lt;br /&gt;
&lt;br /&gt;
===== Easy guides =====&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Job boards|Setting up job boards]]&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Reward cutscenes|Making reward cutscenes]]&lt;br /&gt;
** [[User:MistressNebula/MissionGen: Job Table|Job Table Documentation]]&lt;br /&gt;
&lt;br /&gt;
===== Intermediate guide =====&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Handcrafted jobs|Making handcrafted jobs]]&lt;br /&gt;
&lt;br /&gt;
===== Advanced guide =====&lt;br /&gt;
* [[MissionGen guide: Job callbacks|Job callbacks]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula/MissionGen:_Basic_setup&amp;diff=2793</id>
		<title>User:MistressNebula/MissionGen: Basic setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula/MissionGen:_Basic_setup&amp;diff=2793"/>
		<updated>2025-07-29T16:35:57Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page User:MistressNebula/MissionGen: Basic setup to Mod:Nebula&amp;#039;s Mission Board Mod/Basic setup: Move to Mod namespace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Mod:Nebula&#039;s Mission Board Mod/Basic setup]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/Basic_setup&amp;diff=2792</id>
		<title>Mod:Nebula&#039;s Mission Board/Basic setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/Basic_setup&amp;diff=2792"/>
		<updated>2025-07-29T16:35:57Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page User:MistressNebula/MissionGen: Basic setup to Mod:Nebula&amp;#039;s Mission Board Mod/Basic setup: Move to Mod namespace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Despite it being created to be as easy to add inside mods as possible, it still takes a bit of work to get the Mission Generation Library up and running. This page will run through all the necessary steps, from file placement to function hooks and &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; calls.&lt;br /&gt;
&lt;br /&gt;
===== Importing the files =====&lt;br /&gt;
&lt;br /&gt;
# Download [https://github.com/435THz/NebulaMissionBoard/releases Nebula&#039;s Mission Board] from github and extract the zip&#039;s content wherever you like.&lt;br /&gt;
# Go to the mod&#039;s &amp;lt;code&amp;gt;Data/Script&amp;lt;/code&amp;gt; folder and copy the &amp;lt;code&amp;gt;missiongen_lib&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Paste the &amp;lt;code&amp;gt;missiongen_lib&amp;lt;/code&amp;gt; folder inside your own mod&#039;s &amp;lt;code&amp;gt;Data/Script&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
Note that the library files expect to be placed exactly inside &amp;lt;code&amp;gt;Data/Script/missiongen_lib&amp;lt;/code&amp;gt;. If you place them anywhere else, you will need to adjust all of the files&#039; &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt; calls accordingly, as well as all of the &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt; calls present in this guide.&lt;br /&gt;
Don&#039;t forget to also copy all of the strings inside the &amp;lt;code&amp;gt;strings.resx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;stringsEx.resx&amp;lt;/code&amp;gt; files over to your mod!&lt;br /&gt;
&lt;br /&gt;
===== Initializing the library =====&lt;br /&gt;
&lt;br /&gt;
With the files imported in your mod, it&#039;s time to load it:&lt;br /&gt;
* Add &amp;lt;code&amp;gt;MissionGen = require(&amp;quot;missiongen_lib.missiongen_lib&amp;quot;)&amp;lt;/code&amp;gt; inside your mod&#039;s &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt; file. You can rename this variable however you want, but it must be a global variable.&lt;br /&gt;
* If your global variable is not named &amp;quot;MissionGen&amp;quot;, open missiongen_service.lua and change the &amp;lt;code&amp;gt;library_name&amp;lt;/code&amp;gt; string into your global variable&#039;s name. Doing this will ensure that the service will be able to find the library when it needs to interact with it.&lt;br /&gt;
* Add &amp;lt;code&amp;gt;require &#039;missiongen_lib.missiongen_service&#039;&amp;lt;/code&amp;gt; inside your mod&#039;s &amp;lt;code&amp;gt;main.lua&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
These steps will take care of most of the initialization process all by themselves. All of the library files will be loaded, and the &amp;lt;code&amp;gt;SV&amp;lt;/code&amp;gt; structure will be automatically have the library&#039;s save data added to it. This, however, does nothing in terms of gameplay, and more steps are needed for the library to actually function.&lt;br /&gt;
&lt;br /&gt;
===== Hooking up functions =====&lt;br /&gt;
This is the lengthiest part of the guide. There are a lot of functions that need to be set up in order for the library to work correctly, as highlighted by the many files inside Nebula&#039;s Mission Board mod. Luckily, they&#039;re pretty easy to port: All you need to do is copy-paste all functions in their respective files in your mod. For example, all functions inside Nebula&#039;s Mission Board&#039;s &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt; will need to go inside &#039;&#039;your mod&#039;s&#039;&#039; &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt;.&lt;br /&gt;
These are the files containing code that needs to be copied over:&lt;br /&gt;
* &amp;lt;code&amp;gt;common.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;common_vars.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event.lua&amp;lt;/code&amp;gt; (the &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; statements)&lt;br /&gt;
* &amp;lt;code&amp;gt;event.battle.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event_mapgen.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;event.single.lua&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You now need to hook up the dungeon generation code to the game. Open your mod in [[Dev Mode]], go to the Constants tab and open the Universal menu. Here, in Zone Steps, add a new Script Zone Step. Set its Script parameter to &amp;lt;code&amp;gt;GenerateJobInFloor&amp;lt;/code&amp;gt;.&lt;br /&gt;
Now save your changes, and that&#039;s it! This function will be responsible for dynamically adding the necessary steps and events whenever a destination floor is reached.&lt;br /&gt;
&lt;br /&gt;
Everything we did up until now takes care of everything when it comes to generating and handling jobs inside dungeons, but there is still nothing that allows players to take new jobs, or to hand in completed ones. Not to worry: all you need to do is to add a call to &amp;lt;code&amp;gt;MissionGen:BoardInteract(board_id)&amp;lt;/code&amp;gt;, and your players will be able to access your job board of choice and take its contents. &amp;lt;code&amp;gt;board_id&amp;lt;/code&amp;gt;s will be discussed in the page about [[User:MistressNebula/MissionGen: Editing settings|Settings]].&lt;br /&gt;
As for how handing in missions works, you will need to write a cutscene for it. Nebula&#039;s Mission Board mod already has one inside &amp;lt;code&amp;gt;Data/Script/nebula_mission_board/ground/base_camp_2&amp;lt;/code&amp;gt; if you want to copy it, but here&#039;s a basic rundown of how the job completion cutscene is handled:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;If any mission has been completed in the last dungeon run, the library will send the player to the location set inside the &amp;lt;code&amp;gt;end_dungeon_day_destination&amp;lt;/code&amp;gt; setting. This location will need to call the &amp;lt;code&amp;gt;MissionGen:PlayJobsCompletedCutscene(callback)&amp;lt;/code&amp;gt; function. If you have multiple maps with job boards, this function will also handle switching between maps as needed. You will have to provide the callback. (see step 3 for more details)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;code&amp;gt;PlayJobsCompletedCutscene&amp;lt;/code&amp;gt; will generate a list of characters, that will be passed to the callback along with the job struct itself.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;the callback is ran. This is a modder-defined function with the following arguments:&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;a job table&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;a list of &amp;lt;code&amp;gt;GroundChar&amp;lt;/code&amp;gt;s. The first one is always the client, while the second, if present, is always the target. Third and fourth are only generated for law enforcement jobs, and represent the background officers that would normally keep the outlaw restrained during the cutscene.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
The callback is supposed to handle the cutscene itself, moving the characters where they need to be and displaying dialogue. It also needs to call &amp;lt;code&amp;gt;MissionGen:RewardPlayer(job, speaker, line1, line2)&amp;lt;/code&amp;gt;, otherwise the player will not actually receive any rewards for the job they completed.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Once the cutscene is finished, control goes back to &amp;lt;code&amp;gt;PlayJobsCompletedCutscene&amp;lt;/code&amp;gt;, which will get rid of the current job and keep scanning for other completed ones  until the end of the list, repeating steps 2 and 3 for each of them.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Finally, the function stored in the &amp;lt;&amp;gt;after_rewards_function&amp;lt;&amp;gt; settings is called, the boards are refreshed, and control is returned to the player.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That said, what you need to do is:&lt;br /&gt;
* call &amp;lt;code&amp;gt;MissionGen:PlayJobsCompletedCutscene(callback)&amp;lt;/code&amp;gt; in any and all maps that have a board assigned to it.&lt;br /&gt;
* write the callback for the function above; it needs to use the current job&#039;s data and the given list of characters to actually implement the cutscene itself, and call &amp;lt;code&amp;gt;MissionGen:RewardPlayer(job, speaker, line1, line2)&amp;lt;/code&amp;gt; so that players will receive their reward.&lt;br /&gt;
When that is done, the library will finally be fully set up and ready to use, though you will still need to edit its Settings to make sure that it generates jobs for your mod&#039;s dungeons.&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board&amp;diff=2791</id>
		<title>Mod:Nebula&#039;s Mission Board</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board&amp;diff=2791"/>
		<updated>2025-07-29T16:33:41Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: Add link to user page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[User:MistressNebula|Nebula]]&#039;s Mission Board is a mod that adds a mission board to the base PMDO game, allowing players to embark in missions to gain special items and money and to gain experience.&lt;br /&gt;
It looks and plays essentially the same as the base game&#039;s Enable Mission Board mod, except that all job generation and job handling functions are dealt with by a highly customizable library bundled within the mod, built with the express purpose of being as easy to import and implement as possible while giving experienced modders the tools they need to make even more complex systems and behaviors.&lt;br /&gt;
&lt;br /&gt;
== PMDO Mission Generation Library ==&lt;br /&gt;
The library itself is fully contained inside the Data/Script/missiongen_lib folder inside the mod. By taking this folder and moving it to your mod, you will have access to all of its functions. Remember to credit MistressNebula if you include this library in your project!&lt;br /&gt;
&lt;br /&gt;
Do keep in mind that simply moving the files inside your mod is not enough to set up the library: you will also need to hook all of the necessary events to your mod. Please refer to the links at the bottom of this page for a more in-depth guide on how to do it.&lt;br /&gt;
&lt;br /&gt;
===== How the library is structured =====&lt;br /&gt;
The library is broken up into 5 files:&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_lib.lua&amp;lt;/code&amp;gt; is the core file of the library. It&#039;s where the most important structures, functions and global variables are defined and handled, as well as the one containing all the hooks that mods are expected to use to interface with it.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_settings.lua&amp;lt;/code&amp;gt; contains a table of parameters and properties used by the library to function. This is the file that modders are supposed to edit to alter the behavior of the library. Every setting is documented individually, describing its format, what it is used for and what kind of data it requires. The file is loaded directly by the main file, and is not supposed to be loaded directly.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_menus.lua&amp;lt;/code&amp;gt; is a file whose sole purpose is to contain the menus used by the library. It is loaded automatically by the main file, and its functions are not supposed to be interacted with directly.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_service.lua&amp;lt;/code&amp;gt; is the file that contains the service required by the library to handle loading, menu edits and dungeon completion tracking. It needs to be loaded separately from the main file. This file also contains the only value outside of the settings file that MIGHT require changing. More details in the setup guide below.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_devcheck.lua&amp;lt;/code&amp;gt; contains a function, called by the main file when loading, whose purpose is to check, to the best of its abilities, if the values inside the settings file are valid, and print the results of its test to the console. If this file is deleted or misplaced, the check will simply be skipped. This file is only loaded when the game is in [[Dev Mode]]. If you hear the music restart when loading your save data, it&#039;s because of this file.&lt;br /&gt;
&lt;br /&gt;
===== Setup guides =====&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Basic setup|Basic setup]]&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Hook implementations|Hook implementations]]&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Editing settings|Editing settings]]&lt;br /&gt;
* [[User:MistressNebula/MissionGen: String keys|String keys]]&lt;br /&gt;
&lt;br /&gt;
===== Easy guides =====&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Job boards|Setting up job boards]]&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Reward cutscenes|Making reward cutscenes]]&lt;br /&gt;
** [[User:MistressNebula/MissionGen: Job Table|Job Table Documentation]]&lt;br /&gt;
&lt;br /&gt;
===== Intermediate guide =====&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Handcrafted jobs|Making handcrafted jobs]]&lt;br /&gt;
&lt;br /&gt;
===== Advanced guide =====&lt;br /&gt;
* [[MissionGen guide: Job callbacks|Job callbacks]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula&amp;diff=2790</id>
		<title>User:MistressNebula</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula&amp;diff=2790"/>
		<updated>2025-07-29T16:32:31Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: Redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MistressNebula is a PMDO modder and source code contributor.&lt;br /&gt;
&lt;br /&gt;
Notable modding works include:&lt;br /&gt;
* [[User:MistressNebula/Dungeon Recruitment List|Dungeon Recruitment List]] ([https://github.com/435THz/Dungeon_Recruitment_List github])&lt;br /&gt;
* [[Mod:Nebula&#039;s Mission Board Mod|Mission Generation Library]] ([https://github.com/435THz/NebulaMissionBoard github])&lt;br /&gt;
* [[User:MistressNebula/PMD:New Leaf|PMD:NewLeaf]] (WIP, currently unreleased)&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula/Nebula%27s_Mission_Board_Mod&amp;diff=2789</id>
		<title>User:MistressNebula/Nebula&#039;s Mission Board Mod</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=User:MistressNebula/Nebula%27s_Mission_Board_Mod&amp;diff=2789"/>
		<updated>2025-07-29T16:31:15Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page User:MistressNebula/Nebula&amp;#039;s Mission Board Mod to Mod:Nebula&amp;#039;s Mission Board Mod: Moving to Mod namespce&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Mod:Nebula&#039;s Mission Board Mod]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board&amp;diff=2788</id>
		<title>Mod:Nebula&#039;s Mission Board</title>
		<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board&amp;diff=2788"/>
		<updated>2025-07-29T16:31:15Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula: MistressNebula moved page User:MistressNebula/Nebula&amp;#039;s Mission Board Mod to Mod:Nebula&amp;#039;s Mission Board Mod: Moving to Mod namespce&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nebula&#039;s Mission Board is a mod that adds a mission board to the base PMDO game, allowing players to embark in missions to gain special items and money and to gain experience.&lt;br /&gt;
It looks and plays essentially the same as the base game&#039;s Enable Mission Board mod, except that all job generation and job handling functions are dealt with by a highly customizable library bundled within the mod, built with the express purpose of being as easy to import and implement as possible while giving experienced modders the tools they need to make even more complex systems and behaviors.&lt;br /&gt;
&lt;br /&gt;
== PMDO Mission Generation Library ==&lt;br /&gt;
The library itself is fully contained inside the Data/Script/missiongen_lib folder inside the mod. By taking this folder and moving it to your mod, you will have access to all of its functions. Remember to credit MistressNebula if you include this library in your project!&lt;br /&gt;
&lt;br /&gt;
Do keep in mind that simply moving the files inside your mod is not enough to set up the library: you will also need to hook all of the necessary events to your mod. Please refer to the links at the bottom of this page for a more in-depth guide on how to do it.&lt;br /&gt;
&lt;br /&gt;
===== How the library is structured =====&lt;br /&gt;
The library is broken up into 5 files:&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_lib.lua&amp;lt;/code&amp;gt; is the core file of the library. It&#039;s where the most important structures, functions and global variables are defined and handled, as well as the one containing all the hooks that mods are expected to use to interface with it.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_settings.lua&amp;lt;/code&amp;gt; contains a table of parameters and properties used by the library to function. This is the file that modders are supposed to edit to alter the behavior of the library. Every setting is documented individually, describing its format, what it is used for and what kind of data it requires. The file is loaded directly by the main file, and is not supposed to be loaded directly.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_menus.lua&amp;lt;/code&amp;gt; is a file whose sole purpose is to contain the menus used by the library. It is loaded automatically by the main file, and its functions are not supposed to be interacted with directly.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_service.lua&amp;lt;/code&amp;gt; is the file that contains the service required by the library to handle loading, menu edits and dungeon completion tracking. It needs to be loaded separately from the main file. This file also contains the only value outside of the settings file that MIGHT require changing. More details in the setup guide below.&lt;br /&gt;
* &amp;lt;code&amp;gt;missiongen_devcheck.lua&amp;lt;/code&amp;gt; contains a function, called by the main file when loading, whose purpose is to check, to the best of its abilities, if the values inside the settings file are valid, and print the results of its test to the console. If this file is deleted or misplaced, the check will simply be skipped. This file is only loaded when the game is in [[Dev Mode]]. If you hear the music restart when loading your save data, it&#039;s because of this file.&lt;br /&gt;
&lt;br /&gt;
===== Setup guides =====&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Basic setup|Basic setup]]&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Hook implementations|Hook implementations]]&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Editing settings|Editing settings]]&lt;br /&gt;
* [[User:MistressNebula/MissionGen: String keys|String keys]]&lt;br /&gt;
&lt;br /&gt;
===== Easy guides =====&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Job boards|Setting up job boards]]&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Reward cutscenes|Making reward cutscenes]]&lt;br /&gt;
** [[User:MistressNebula/MissionGen: Job Table|Job Table Documentation]]&lt;br /&gt;
&lt;br /&gt;
===== Intermediate guide =====&lt;br /&gt;
* [[User:MistressNebula/MissionGen: Handcrafted jobs|Making handcrafted jobs]]&lt;br /&gt;
&lt;br /&gt;
===== Advanced guide =====&lt;br /&gt;
* [[MissionGen guide: Job callbacks|Job callbacks]]&lt;/div&gt;</summary>
		<author><name>MistressNebula</name></author>
	</entry>
</feed>