<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?action=history&amp;feed=atom&amp;title=Mod%3ANebula%27s_Mission_Board%2F_Hook_implementations</id>
	<title>Mod:Nebula&#039;s Mission Board/ Hook implementations - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?action=history&amp;feed=atom&amp;title=Mod%3ANebula%27s_Mission_Board%2F_Hook_implementations"/>
	<link rel="alternate" type="text/html" href="https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Hook_implementations&amp;action=history"/>
	<updated>2026-07-31T18:54:19Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://wiki.pmdo.pmdcollab.org/wiki/index.php?title=Mod:Nebula%27s_Mission_Board/_Hook_implementations&amp;diff=2808&amp;oldid=prev</id>
		<title>MistressNebula: MistressNebula moved page User:MistressNebula/MissionGen: Hook implementations to Mod:Nebula&#039;s Mission Board/ Hook implementations: Move to Mod namespace</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&amp;oldid=prev"/>
		<updated>2025-07-29T17:51:00Z</updated>

		<summary type="html">&lt;p&gt;MistressNebula moved page &lt;a href=&quot;/User:MistressNebula/MissionGen:_Hook_implementations&quot; class=&quot;mw-redirect&quot; title=&quot;User:MistressNebula/MissionGen: Hook implementations&quot;&gt;User:MistressNebula/MissionGen: Hook implementations&lt;/a&gt; to &lt;a href=&quot;/Mod:Nebula%27s_Mission_Board/_Hook_implementations&quot; title=&quot;Mod:Nebula&amp;#039;s Mission Board/ Hook implementations&quot;&gt;Mod:Nebula&amp;#039;s Mission Board/ Hook implementations&lt;/a&gt;: Move to Mod namespace&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:51, 29 July 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&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=2776&amp;oldid=prev</id>
		<title>MistressNebula: Make page</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=2776&amp;oldid=prev"/>
		<updated>2025-07-28T12:55:05Z</updated>

		<summary type="html">&lt;p&gt;Make page&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;This page contains the standard implementation of all of the library&amp;#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&amp;#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>
</feed>