Community:Gates to Infinity Female Partner Guide

MDFW - The Mystery Dungeon Tree of Information.
Jump to navigation Jump to search
Female Partner in English.
Female Partner in English.

Female Partner Guide for Nintendo 3DS Pokémon Mystery Dungeon: Gates to Infinity. The female Partner option is normally only available in the Japanese version. This hacking guide brings it to the North American and European versions of the game. The most notable difference is Pikachu's apperance, however some of the partner's lines of dialogue may have small, hard to notice, changes as well. When other characters refer to the partner, they will still use male language if they did in the original text.

If using Windows, make sure file extensions are enabled.

Prerequisites

  • Either Luma (3DS CFW) or Citra (3DS emulator)
  • If using Luma, know whether you are using the North American or European version of the game, and know its Title ID
North American Title ID: 00040000000BA800
European Title ID: 00040000000BA900

Quick Method

function OpenGroundCharaSelectFlow(selectType)
  local retPokemonIndex
  if selectType == nil then
    selectType = "hero"
  end
  local resumeData = FlowSys:Suspend()
  FlowSys:Start()
  ShopSys:Start()
  function FlowSys.Proc.CharaSelectStart()
    if selectType == "hero" then
      retPokemonIndex = dispHeroSelectMenu()
    elseif selectType == "partner" then
      retPokemonIndex = dispPartnerSelectMenu()
    end
    GROUND:SetJoinedPokemon(retPokemonIndex)
    FlowSys:Next("FlowComplete")
  end
  function FlowSys.Proc.FlowComplete()
    WINDOW:CloseMessage()
    FlowSys:Return()
  end
  FlowSys:Call("CharaSelectStart")
  WINDOW:CloseMessage()
  FlowSys:Finish()
  ShopSys:Finish()
  FlowSys:Resume(resumeData)
  return retPokemonIndex
end
function OpenGroundCharaSelectNameInputFlow(selectType)
  local resumeData = FlowSys:Suspend()
  FlowSys:Start()
  ShopSys:Start()
  function FlowSys.Proc.CharaNameInputStart()
    local defaultName = ""
    local captionId = 695113495
    if selectType == "hero" then
      defaultName = GROUND:GetPokemonNameForPokemonWarehouseDefault(SymAct("HERO"):GetIndex())
      captionId = 1410949970
    elseif selectType == "partner" then
      defaultName = GROUND:GetPokemonNameForPokemonWarehouseDefault(SymAct("PARTNER"):GetIndex())
      captionId = 37995732
    elseif selectType == "team" then
      defaultName = 907005331
      captionId = 458814869
    end
    local nameInputMenu = MENU:CreateNameInputMenu(ScreenType.B)
    nameInputMenu:SetTitleText(captionId)
    nameInputMenu:SetText(defaultName)
    function nameInputMenu:decideAction()
      defaultName = nameInputMenu:GetText()
      self:Close()
    end
    function nameInputMenu:cancelAction()
      defaultName = nameInputMenu:GetText()
      self:Close()
    end
    function nameInputMenu:currentItemChange()
    end
    function nameInputMenu:openedAction()
    end
    function nameInputMenu:closedAction()
    end
    function nameInputMenu:ngAction()
      WINDOW:SetMessageScreenMode(ScreenType.B)
      WINDOW:SysMsg(998639762)
      WINDOW:CloseMessage()
      WINDOW:SetMessageScreenMode(ScreenType.A)
    end
    WINDOW:CloseMessage()
    CommonSys:BeginLowerMenuNavi(nil, nil, false)
    SCREEN_B:FadeIn(TimeSec(0), false)
    SCREEN_B:FadeInAll(TimeSec(0.5), false)
    nameInputMenu:Open()
    MENU:SetFocus(nameInputMenu)
    MENU:WaitClose(nameInputMenu)
    CommonSys:EndLowerMenuNavi(true)
    SCREEN_B:FadeOutAll(TimeSec(0.5), true)
    SCREEN_B:FadeOut(TimeSec(0), false)
    FlowSys.Stat.name = defaultName
    FlowSys:Next("Confirm")
  end
  function FlowSys.Proc.Confirm()
    local msg, yes, no
    if selectType == "hero" then
      msg = 390492974
      yes = -985343595
      no = 1693592328
    elseif selectType == "partner" then
      msg = -1854513717
      yes = -1423248690
      no = 1226420175
    elseif selectType == "team" then
      msg = -1717754978
      yes = 1179124890
      no = 1557528484
    end
    MENU:SetTag_String(0, FlowSys.Stat.name)
    ShopSys:SysMsgAskFlowNoClose(msg, nil, {
      next = "CharaNameInputStart"
    }, {
      text = yes,
      next = "FlowComplete"
    }, {
      text = no,
      next = "CharaNameInputStart"
    })
  end
  function FlowSys.Proc.FlowComplete()
    WINDOW:CloseMessage()
    if selectType == "hero" then
      GROUND:SetPokemonWarehouseHeroName(FlowSys.Stat.name)
    elseif selectType == "partner" then
      GROUND:SetPokemonWarehousePartnerName(FlowSys.Stat.name)
    elseif selectType == "team" then
      GROUND:SetPartyName(FlowSys.Stat.name)
    end
    FlowSys:Return()
  end
  FlowSys:Call("CharaNameInputStart")
  WINDOW:CloseMessage()
  FlowSys:Finish()
  ShopSys:Finish()
  FlowSys:Resume(resumeData)
end
function dispHeroSelectMenu()
  local charaSet = {
    45,
    122,
    39,
    1,
    42
  }
  local selectPokemonIndex = dispCharaSelectMenu({
    charaSet = charaSet,
    charaCenterScale = 1,
    msg_ask = 463952514,
    msg_select_ok = -769240979,
    msg_select_ok_yes = -1258137749,
    msg_select_ok_no = -954358346,
    isPartner = false
  })
  GROUND:SetPokemonWarehouseHero(selectPokemonIndex, "???", 5)
  return selectPokemonIndex
end
function dispPartnerSelectMenu()
  local charaSet = {
    45,
    122,
    39,
    1,
    42
  }
  charaSetNoHero = {}
  for i, v in ipairs(charaSet) do
    if SymAct("HERO"):GetIndex() ~= v then
      table.insert(charaSetNoHero, v)
    end
  end
  local selectPokemonIndex = dispCharaSelectMenu({
    charaSet = charaSetNoHero,
    charaCenterScale = 1,
    msg_ask = 1405772237,
    msg_select_ok = -624321941,
    msg_select_ok_yes = -865960769,
    msg_select_ok_no = 854504967,
    msg_select_sex = 832791183,
    msg_select_sex_girl = -769697820,
    msg_select_sex_boy = -1774124066,
    isPartner = true
  })
  local name = GROUND:GetPokemonNameForPokemonWarehouseDefault(selectPokemonIndex)
  GROUND:SetPokemonWarehousePartner(selectPokemonIndex, name, 5)
  if FLAG.PartnerSexType == CONST.SEX_TYPE_BOY then
    SYSTEM:SetPartnerSex(SEX.MALE)
  else
    SYSTEM:SetPartnerSex(SEX.FEMALE)
  end
  return selectPokemonIndex
end
function dispCharaSelectMenu(optTbl)
  local selectPokemonIndex
  local titleBoardMenu = MENU:CreateBoardMenuWindow(ScreenType.A)
  titleBoardMenu:SetLayoutRect(Rectangle(0, 0, 400, 320))
  titleBoardMenu:SetTextOffset(0, 20)
  titleBoardMenu:Open()
  titleBoardMenu:SetOption({font = "FONT_16", showBgFrame = false})
  local charaInfoMenu = MENU:CreateBoardMenuWindow(ScreenType.B)
  charaInfoMenu:SetLayoutRect(Rectangle(24, 40, 272, 172))
  charaInfoMenu:SetTextOffset(0, 0)
  charaInfoMenu:Open()
  charaInfoMenu:SetOption({font = "FONT_12", showBgFrame = true})
  function charaInfoMenu:closedAction()
    if self.faceMenu then
      self.faceMenu:Close()
    end
  end
  local baseFunc = charaInfoMenu.SetVisible
  function charaInfoMenu:SetVisible(flag)
    baseFunc(self, flag)
    self.faceMenu:SetVisible(flag)
  end
  function charaInfoMenu:SetCharaType(pokemonIndex)
    if self.lastPokemonIndex == pokemonIndex then
      return
    end
    self.lastPokemonIndex = pokemonIndex
    if self.faceMenu then
      self.faceMenu:Close()
    end
    self.faceMenu = MENU:CreateFaceMenuWindow(ScreenType.B)
    self.faceMenu:SetFacePos(28, 44)
    self.faceMenu:SetPokemonIndex(pokemonIndex)
    self.faceMenu:SetFaceType(FACE_TYPE.NORMAL)
    self.faceMenu:Open()
    local pokeTbl = {
      [45] = -391927830,
      [122] = -757706441,
      [39] = 446223748,
      [1] = 494718355,
      [42] = 989755712
    }
    local textTbl = {
      1859713781,
      2016741011,
      -1592969662,
      804712554,
      -1346052610,
      -470462443,
      -414923681,
      194943263,
      pokeTbl[pokemonIndex]
    }
    local infTbl = GROUND:GetCharaSelectPokemonInfoTbl(pokemonIndex)
    if infTbl.wazaName[1] then
      table.insert(textTbl, -642297661)
    end
    if infTbl.wazaName[2] then
      table.insert(textTbl, -224787712)
    end
    if infTbl.wazaName[3] then
      table.insert(textTbl, -343854527)
    end
    if infTbl.wazaName[4] then
      table.insert(textTbl, -1530878842)
    end
    MENU:SetTag_Value(0, infTbl.lv)
    MENU:SetTag_Value(1, infTbl.hp)
    MENU:SetTag_Value(2, infTbl.atk)
    MENU:SetTag_Value(3, infTbl.def)
    MENU:SetTag_Value(4, infTbl.exAtk)
    MENU:SetTag_Value(5, infTbl.exDef)
    MENU:SetTag_Value(6, infTbl.wazaPP[1] and infTbl.wazaPP[1] or 0)
    MENU:SetTag_Value(7, infTbl.wazaPP[2] and infTbl.wazaPP[2] or 0)
    MENU:SetTag_Value(8, infTbl.wazaPP[3] and infTbl.wazaPP[3] or 0)
    MENU:SetTag_Value(9, infTbl.wazaPP[4] and infTbl.wazaPP[4] or 0)
    MENU:SetTag_String(0, infTbl.type0)
    MENU:SetTag_String(1, infTbl.type1)
    MENU:SetTag_String(2, infTbl.abiName)
    MENU:SetTag_String(3, infTbl.wazaName[1] and infTbl.wazaName[1] or "")
    MENU:SetTag_String(4, infTbl.wazaName[2] and infTbl.wazaName[2] or "")
    MENU:SetTag_String(5, infTbl.wazaName[3] and infTbl.wazaName[3] or "")
    MENU:SetTag_String(6, infTbl.wazaName[4] and infTbl.wazaName[4] or "")
    local text = ""
    for i, v in ipairs(textTbl) do
      text = text .. MENU:ReplaceTagText(v)
    end
    self:SetText(text)
  end
  local faceImgOffsTbl = {
    [1] = {u = 0, v = 0},
    [39] = {u = 80, v = 0},
    [42] = {u = 160, v = 0},
    [45] = {u = 0, v = 80},
    [122] = {u = 80, v = 80}
  }
  local sprPtnTbl = {}
  for i, pokeIdx in ipairs(optTbl.charaSet) do
    table.insert(sprPtnTbl, {
      name = "face0" .. i,
      img = "FACE_DOUBLE",
      u = faceImgOffsTbl[pokeIdx].u,
      v = faceImgOffsTbl[pokeIdx].v,
      w = 80,
      h = 80,
      cx = 40,
      cy = 40
    })
  end
  table.insert(sprPtnTbl, {
    name = "faceFrame",
    img = "FACE02",
    u = 0,
    v = 0,
    w = 112,
    h = 112,
    cx = 56,
    cy = 56
  })
  table.insert(sprPtnTbl, {
    name = "nameFrame",
    img = "WINDOW_NAME",
    u = 0,
    v = 0,
    w = 128,
    h = 32,
    cx = 64,
    cy = 16
  })
  SPRITE:CreatePatternSetFromTable("faceSet", sprPtnTbl)
  SAJI:CreateSajiPlayer("CursorL", "CURSOR_LEFT")
  SAJI:CreateSajiPlayer("CursorR", "CURSOR_RIGHT")
  SJ("CursorL"):SetPosition(Vector2(144, 112))
  SJ("CursorR"):SetPosition(Vector2(256, 112))
  SJ("CursorL"):Play(LOOP.ON)
  SJ("CursorR"):Play(LOOP.ON)
  SJ("CursorL"):SetVisible(true)
  SJ("CursorR"):SetVisible(true)
  SJ("CursorL"):SetDrawPriority(0)
  SJ("CursorR"):SetDrawPriority(0)
  SJ("CursorL"):SetParallax(-0.2)
  SJ("CursorR"):SetParallax(-0.2)
  local sprtNameFrame = SPRITE:CreateSprite("faceGrp", "sprNameFrame")
  sprtNameFrame:SetOption({
    textureFilter = TEXTURE_FILTER_MODE.LINEAR
  })
  sprtNameFrame:SetPosition(Vector2(200, 28))
  sprtNameFrame:SetPattern({
    setName = "faceSet",
    ptnName = "nameFrame",
    ofsX = 0,
    ofsY = 0,
    ofsPrio = 800,
    ofsParallax = -0.5
  })
  sprtNameFrame:SetVisible(true)
  local ptnNum = #optTbl.charaSet
  local ccScale = optTbl.charaCenterScale
  local pointTbl = {
    {
      pos = Vector2(104, 110),
      alpha = 0,
      scale = 0.13333333333333333,
      prio = 8,
      ofsPara = 2
    },
    {
      pos = Vector2(72, 110),
      alpha = 0.8,
      scale = 0.26666666666666666,
      prio = 4,
      ofsPara = 1
    },
    {
      pos = Vector2(123.2, 110),
      alpha = 1,
      scale = 0.5333333333333333,
      prio = 2,
      ofsPara = -0.5
    },
    {
      pos = Vector2(200, 110),
      alpha = 1,
      scale = ccScale,
      prio = 1,
      ofsPara = -1.4
    },
    {
      pos = Vector2(276.8, 110),
      alpha = 1,
      scale = 0.5333333333333333,
      prio = 2,
      ofsPara = -0.5
    },
    {
      pos = Vector2(328, 110),
      alpha = 0.8,
      scale = 0.26666666666666666,
      prio = 4,
      ofsPara = 1
    },
    {
      pos = Vector2(296, 110),
      alpha = 0,
      scale = 0.13333333333333333,
      prio = 8,
      ofsPara = 2
    }
  }
  local workTbl = {}
  local indexMod = function(idx, num)
    return (idx - 1) % num + 1
  end
  local alphaBlend = function(a, b, alpha)
    return a * alpha + b * (1 - alpha)
  end
  for idx = 1, 6 do
    workTbl[idx] = {}
    workTbl[idx].sprt = SPRITE:CreateSprite("faceGrp", "sprFace0" .. idx)
    workTbl[idx].sprt:SetOption({
      textureFilter = TEXTURE_FILTER_MODE.LINEAR
    })
    workTbl[idx].nowIdx = idx
    workTbl[idx].sprNo = (idx - 1) % ptnNum + 1
    workTbl[idx].nowPoint = pointTbl[workTbl[idx].nowIdx]
    workTbl[idx].Move = function(self, dir)
      if self.nowIdx == 1 and dir < 0 then
        self.nowPoint = pointTbl[7]
        self.nextPoint = pointTbl[6]
        self.sprNo = indexMod(workTbl[indexMod(idx - 1, 6)].sprNo + 1, ptnNum)
        self.nowIdx = 6
      elseif self.nowIdx == 7 and dir > 0 then
        self.nowPoint = pointTbl[1]
        self.nextPoint = pointTbl[2]
        self.sprNo = indexMod(workTbl[indexMod(idx + 1, 6)].sprNo - 1, ptnNum)
        self.nowIdx = 2
      else
        self.nowPoint = pointTbl[self.nowIdx]
        self.nextPoint = pointTbl[self.nowIdx + dir]
        self.nowIdx = self.nowIdx + dir
      end
      self.animRaito = 0
      self.animDelta = 0.2
      self.sprt:SetVisible(true)
    end
    workTbl[idx].Select = function(self)
      self.state = "select"
      self.animRaito = 0
      self.animDelta = 0.12
    end
    workTbl[idx].Continue = function(self)
      self.state = "continue"
      self.animRaito = 0
      self.animDelta = 0.2
    end
    workTbl[idx].Finish = function(self)
      self.state = "finish"
    end
    do
      local ptnTbl0 = {
        setName = "faceSet",
        ptnName = "",
        ofsX = 0,
        ofsY = 0,
        ofsPrio = 0,
        ofsParallax = 0
      }
      local ptnTbl1 = {
        setName = "faceSet",
        ptnName = "faceFrame",
        ofsX = 0,
        ofsY = 0,
        ofsPrio = 0,
        ofsParallax = 0
      }
      workTbl[idx].Tick = function(self)
        local pos = Vector2(self.nowPoint.pos)
        local alpha = self.nowPoint.alpha
        local scale = self.nowPoint.scale
        local prio = self.nowPoint.prio
        local ofsPara = self.nowPoint.ofsPara
        local state = self.state
        if state == "finish" then
          return
        elseif state == "select" then
          self.animRaito = self.animRaito + self.animDelta
          if self.nowIdx ~= 4 then
            alpha = alphaBlend(0, workTbl[idx].nowPoint.alpha, self.animRaito)
          else
            scale = scale + 0.2 * math.sin(self.animRaito * 3.1415)
          end
          if self.animRaito > 1 then
            self.state = "selectWait"
            return
          end
          SJ("CursorL"):SetVisible(false)
          SJ("CursorR"):SetVisible(false)
        elseif state == "selectWait" then
          if self.nowIdx ~= 4 then
            alpha = 0
          end
          SJ("CursorL"):SetVisible(false)
          SJ("CursorR"):SetVisible(false)
        elseif state == "continue" then
          self.animRaito = self.animRaito + self.animDelta
          if self.nowIdx ~= 4 then
            alpha = alphaBlend(workTbl[idx].nowPoint.alpha, 0, self.animRaito)
          end
          if self.animRaito > 1 then
            SJ("CursorL"):SetVisible(true)
            SJ("CursorR"):SetVisible(true)
            self.state = nil
            return
          end
        elseif self.nextPoint then
          pos.x = self.nextPoint.pos.x * self.animRaito + self.nowPoint.pos.x * (1 - self.animRaito)
          pos.y = self.nextPoint.pos.y * self.animRaito + self.nowPoint.pos.y * (1 - self.animRaito)
          alpha = self.nextPoint.alpha * self.animRaito + self.nowPoint.alpha * (1 - self.animRaito)
          scale = self.nextPoint.scale * self.animRaito + self.nowPoint.scale * (1 - self.animRaito)
          prio = self.nextPoint.prio * self.animRaito + self.nowPoint.prio * (1 - self.animRaito)
          ofsPara = self.nextPoint.ofsPara * self.animRaito + self.nowPoint.ofsPara * (1 - self.animRaito)
          self.animRaito = self.animRaito + self.animDelta
          if self.animRaito > 1 then
            self.nowPoint = self.nextPoint
            self.nextPoint = nil
            if self.nowIdx == 0 or self.nowIdx == 7 then
              self.sprt:SetVisible(false)
            else
              self.sprt:SetVisible(true)
            end
          end
        elseif self.nowIdx == 4 then
          selectPokemonIndex = optTbl.charaSet[self.sprNo]
          MENU:SetTag_MonsterIndex(0, selectPokemonIndex)
        end
        titleBoardMenu:SetText("[CN][PB:0]")
        charaInfoMenu:SetCharaType(selectPokemonIndex)
        self.sprt:SetPosition(pos)
        ptnTbl0.ptnName = "face0" .. self.sprNo
        ptnTbl0.ofsPrio = prio + 1
        ptnTbl0.ofsParallax = ofsPara
        ptnTbl1.ofsPrio = prio
        ptnTbl1.ofsParallax = ofsPara + 0.1
        self.sprt:SetPattern(ptnTbl0, ptnTbl1)
        self.sprt:SetOption({
          alpha = alpha * 255,
          scale = Scale(scale)
        })
      end
    end
  end
  local cursorWork = {}
  cursorWork.animRaito = 0
  cursorWork.animDelta = 0
  function cursorWork:Move(dir)
    if dir > 0 then
      SJ("CursorL"):Pause(true)
    else
      SJ("CursorR"):Pause(true)
    end
    SJ("CursorL"):SetVisible(false)
    SJ("CursorR"):SetVisible(false)
    cursorWork.animRaito = 0
    cursorWork.animDelta = 0.1
    cursorWork.nowStat = "move"
  end
  function cursorWork:Tick()
    if self.nowStat == "move" then
      self.animRaito = self.animRaito + self.animDelta
      if self.animRaito > 1 then
        SJ("CursorL"):SetVisible(true)
        SJ("CursorR"):SetVisible(true)
        SJ("CursorL"):SetScale(Scale(1))
        SJ("CursorR"):SetScale(Scale(1))
        SJ("CursorL"):Play(LOOP.ON)
        SJ("CursorR"):Play(LOOP.ON)
        SJ("CursorL"):SetFrameTime(0)
        SJ("CursorR"):SetFrameTime(0)
        self.nowStat = nil
      end
    end
  end
  local function waitWork(judge)
    while true do
      local bAllFinish = true
      for i, work in ipairs(workTbl) do
        if judge(work) == false then
          bAllFinish = false
        end
      end
      if bAllFinish then
        break
      end
      coroutine.yield()
    end
  end
  local stateFuncTbl = {
    start = function()
      coroutine.yield()
      WINDOW:SysMsg(optTbl.msg_ask)
      return "loop"
    end,
    loop = function()
      coroutine.yield()
      while true do
        if PAD:Edge("(LEFT|RIGHT)") then
          if PAD:Edge("RIGHT") then
            for i, work in ipairs(workTbl) do
              work:Move(-1)
            end
            cursorWork:Move(-1)
          else
            for i, work in ipairs(workTbl) do
              work:Move(1)
            end
            cursorWork:Move(1)
          end
          SOUND:PlaySe(SymSnd("SE_SYS_SLIDE"))
        elseif PAD:Edge("A") then
          SOUND:PlaySe(SymSnd("SE_SYS_DECIDE_2"))
          waitWork(function(work)
            return work.nextPoint == nil
          end)
          coroutine.yield()
          WINDOW:ForceCloseMessage()
          titleBoardMenu:SetVisible(false)
          charaInfoMenu:SetVisible(false)
          sprtNameFrame:SetVisible(false)
          for i, work in ipairs(workTbl) do
            work:Select()
          end
          waitWork(function(work)
            return work.state == "selectWait"
          end)
          break
        end
        coroutine.yield()
      end
      return "select"
    end,
    select = function()
      coroutine.yield()
      WINDOW:ForceCloseMessage()
      WINDOW:SysMsg(optTbl.msg_select_ok)
      WINDOW:SelectStart()
      WINDOW:SelectChain(optTbl.msg_select_ok_yes, 1)
      WINDOW:SelectChain(optTbl.msg_select_ok_no, 0)
      local isOk = false
      if WINDOW:SelectEnd(MENU_SELECT_MODE.ENABLE_CANCEL) == 1 then
        if optTbl.isPartner then
          WINDOW:SysMsg(optTbl.msg_select_sex)
          WINDOW:SelectStart()
          WINDOW:SelectChain(optTbl.msg_select_sex_boy, 0)
          WINDOW:SelectChain(optTbl.msg_select_sex_girl, 1)
          local selectSex = WINDOW:SelectEnd(MENU_SELECT_MODE.ENABLE_CANCEL)
          if selectSex == 0 then
            FLAG.PartnerSexType = CONST.SEX_TYPE_BOY
            isOk = true
          elseif selectSex == 1 then
            FLAG.PartnerSexType = CONST.SEX_TYPE_GIRL
            isOk = true
          elseif selectSex < 0 then
          end
        else
          isOk = true
        end
      end
      if isOk then
        for i, work in ipairs(workTbl) do
          work:Finish()
        end
        return "finish"
      else
        WINDOW:SysMsg(optTbl.msg_ask)
        titleBoardMenu:SetVisible(true)
        charaInfoMenu:SetVisible(true)
        sprtNameFrame:SetVisible(true)
        for i, work in ipairs(workTbl) do
          work:Continue()
        end
        waitWork(function(work)
          return work.state == nil
        end)
        return "loop"
      end
    end,
    finish = function()
      waitWork(function(work)
        return work.state == "finish"
      end)
      return "exit"
    end
  }
  SCREEN_B:FadeIn(TimeSec(0), false)
  SCREEN_B:FadeInAll(TimeSec(0.5), false)
  local nowStatFunc = coroutine.wrap(stateFuncTbl.start)
  while true do
    collectgarbage("stop")
    local nextStateName
    while true do
      nextStateName = nowStatFunc()
      if nextStateName == nil or nextStateName == "exit" then
        break
      end
      nowStatFunc = coroutine.wrap(stateFuncTbl[nextStateName])
    end
    if nextStateName == "exit" then
      break
    end
    for i = 1, #workTbl do
      workTbl[i]:Tick()
    end
    cursorWork:Tick()
    collectgarbage("restart")
    TASK:Sleep(TimeSec(0))
  end
  SCREEN_B:FadeOutAll(TimeSec(0.5), false)
  SCREEN_B:FadeOut(TimeSec(0.5), false)
  titleBoardMenu:Close()
  charaInfoMenu:Close()
  WINDOW:ForceCloseMessage()
  SAJI:DestroySajiPlayer("CursorL")
  SAJI:DestroySajiPlayer("CursorR")
  SPRITE:DestroySpriteGroup("faceGrp")
  SPRITE:DestroyPatternSet("faceSet")
  return selectPokemonIndex
end
  1. Copy the text above and save it as a text file named menu_ground_chara_select.lua
  2. Make the mod folder
    for Luma: in the SD card, open the folder "luma", then open the folder "titles", and create a new folder with the Title ID of your version as the name
    for Citra: right click on the game, select "Open Mods Location"
  3. Inside that folder, create a folder named "romfs"
  4. Inside the "romfs" folder, create a folder named "script"
  5. Inside the "script" folder, create a folder named "menu"
  6. Place the menu_ground_chara_select.lua file inside the "menu" folder
  7. Start playing the game from the beginning

Explanation

The restoration of the male/female selection screen is achieved by extracting the romfs, using unluac on the game's lua scripts to make them readable, finding and comparing the difference between the Japanese and western lua files that handle the partner selection, and using the Japanese version of the file to restore the scrapped feature.

Gallery

Trivia

  • When it asks whether the partner is male or female, this text (which is not supposed to be seen by players) is mistranslated in the English version, where it instead asks if the player is male or female.

See Also

References