Please note that you are required to have a exploited PlayStation 4 console on firmware 9.00 or lower to run the patches mentioned in this article.

Intro

With the recent release of the Uncharted Collection on the PS5 I thought it would be fun to try to skip the intro and understand a little more how the bootflow works.

Part 1 - Task ID differences

If you remember from a previous post where I discussed on finding task ID, the layout goes something like this.

String (ASCII)

Address pointer (32 or 64 Bit depending on the platform)

Task ID (usually 32 but 64 Bit in The Last of Us: Part 2 with the change to entirely 64 bit hashes).

32 Bit Pointer and Hashes (PS3, Big Endian, Uncharted 3)

64 Bit Pointer and Hashes (PS4, Litle Endian, The Last of Us: Part 2)

Part 2 - Intros or No Intros

HD era naughty dog games have this task called ndi which stands for Naughty Dog Intro. Simple enough. The ID associated with this task has not changed since Uncharted 1, which is 0xed857351 and menu with its ID being 0xd006e7b5.

Now why is this important? Because the game’s code looks up these id on what to load. For instance here is a snippet of code from Uncharted 3.

      // taken from uc3 ps3 code
      // language-selection is exclusive to uncharted 3
      if (skip_ndi) {
        task = 0x66b93942; // language-selection
       // bootflow goes like this: 
       // t1, uc4, and uc-tll
       // ndi -> menu
       // uc3
       // language-selection -> ndi (handled by language-selection flow) -> menu
       // uc1 and uc2
       // autosave-warning -> ndi -> menu
      } else {
        task = 0xd006e7b5; // menu
      }

Code is simple enough, in this case, if this condition is true, it will skip over language_selection and ndi. The very same process can be repeated for the following games.

Uncharted 1: Drake's Fortune   (PS4 only)
Uncharted 2: Among Thieves     (PS3/PS4)
Uncharted 3: Drake's Deception (PS3/PS4)
The Last of Us                 (PS3/PS4)
Uncharted 4: A Thief's End
Uncharted: The Lost Legacy
The Last of Us: Part 2         (not yet possible)

As to why Uncharted 1 intro skip is not yet possible on the PS3?

Because the compiled script file on that version is not the easiest thing to read. Well same for Uncharted 2 but in that case searching for the menu task ID and always booting into that does the trick but not for the first game.

As for The Last of Us Part 2, the intro is baked directly into the menu task. Which also explains why there are no ndi task to be found in the task list.

I think it is still possible if I look hard enough into the game’s code or it could simply be a case of…

Uncharted 1 task script file

Yeah.. I wouldn’t touch this script file with a ten foot pole.

Part 3 - Porting to newer system

Let’s see if the PS4 version is any difficult for the PS3 era titles. Thankfully, Bluepoint did all of the hard work for us on the trilogy collection and we can simply enable Boolean to skip over the video that plays during the ndi task and call it a day.

bp_skipintromovies this is a command line parameter, it only exists in Uncharted 1 and 2 but it shows that they probably got bored watching the intro so they implemented this cvar. :p

This Boolean is used when the user switches games from the option menu.

However, things are not as cut and dry as I would have thought.

In Uncharted 3, this string cannot be found. Another solution must have existed. And there is a solution to this. A while ago back in 2021..? When I was looking for a way to optimize the developer menu enable code I came across this magnificent piece of code.

  if (0x027b9d22 != 0) { // is game launched from app chooser?
    0x027baf7e =  true;
    0x027baf6a =  true;
    0x027baf67 =  true;
    0x027baf69 =  true;
    0x027baf64 = false; // dev menu bool
    0x027b9d21 =  true;
    0x027b9d6c =  true; // skip ndi bool
  }

The last one happens to be the same one that skips the intro in the public beta version of the original game. I can simply turn this Boolean off and there we go. Uncharted 3 on the PS4 intro is skipped. Nothing to be worried about as there are no multiplayer components to this one.

I got the motivation to do intro skips was from fixing a bug where Uncharted 3 Public Beta on the PS3 would crash upon entering the Lan menu, which will be an upcoming post for those curious about it.

Closing Words

Well that’s all for this post, below are the showcase video, where you can find the patch and support me as a independent patch creator.

Have a good rest of your day! I’ll catch you next time.

Credits

ZEROx for porting to the PS3 version.

Freako and HereisMe for publishing their knowledge about reversing Naughty Dog Titles.

Showcase

Patch

This patch is available for PS3 (RPCS3), and PS4.

For those looking to use the patch on the RPCS3 emulator, you can head over to the patch manager, click on the “Download Latest Patches” button and find the patch you wanted to use with your game Title ID and version, click on the checkbox to enable the patch and save changes.

Patch Source Code: Uncharted 2 (RPCS3)

Patch Source Code: Uncharted 3 (RPCS3)

Patch Source Code: The Last of Us (RPCS3)

PlayStation 4 users, can follow this guide on how to install the patch here. (the following tutorial does not cover how to build the update package. only to install the patch into the binary.)

Patch: Uncharted: The Nathan Drake Collection (PS4)

Patch: The Last of Us Remastered (PS4)

Patch: Uncharted 4 (PS4)

Patch: Uncharted: The Lost Legacy (PS4)

Supporters

Thanks to the patrons who supported me on various platforms! You guys are awesome!

Patreon:

  • ac2pic
  • alessaro92
  • faith
  • GarnetSunset
  • Ioritree
  • Jeff Eberlin
  • YveltalGriffin

Github Sponsors:

  • Asinine
  • regal.
  • projectrez
  • gorshco

BuyMeACoffee and Ko-fi:

  • John
  • InquisitionImplied
  • YveltalGriffin
  • Maestruleduardo
  • Ryan N