There aren’t a lot of PS5 games. Not as many as you’d expect. I mean, you can get a lot of games on your PS5 but most of them are PS4 games.
That may or may not have to do with this:
In order to make a PS5 game, you have to implement this complicated thing Sony is trying to promote called “activities” or possibly “stories”. I don’t know exactly what it’s called; it’s complicated.
The idea is that it should let people jump into the game from the OS with minimum fuss – no splash screens (insofar as it’s possible), no title screens, no menus, no file selects. It’s like a menu your game has to support, outside the game. You could call it kind of like windows jump lists. I might have a limited view of this feature (I think it’s way more powerful) because I have made limited use of it.
If you haven’t heard of this thing, don’t feel bad. I don’t know if anyone actually uses it.
OK, so you want to do this. Prepare to turn your game inside out. You need to boot straight into gameplay, so any accidental dependencies your game had on earlier screens need to be handled differently. You have to tell the OS when the player has begun an activity (so it puts it in the list of resumable activities) and tell the OS when the player has ended it. You need to be able to handle an instruction from the OS to jump from whatever state the game is in IMMEDIATELY to the user’s selected activity. The meaning of jumping to the activity is left up to the game: it could be a save file, or it could spawn you in the starting area rather than where you left off last time so you can begin doing some more chores. That helps a bit.
But I’m working on these emulated games and I can’t turn them inside out. I can only make tiny laser incisions. Here’s some of the things I’ve had to do:
I need to decide when the player has “begun an activity” (namely, “goal: beat the game”.) The game has an attractmode that shows a gameplay demo so I can’t use anything in-game to identify that the player has done this. Before the game begins, it shows the weapon loadout selection menu. This it does NOT show in the attractmode. It DOES show it inbetween levels and when you die. So what I do is this: I check a tile in a certain spot to see if it’s part of the loadout menu. When I find it, I tick a state machine. If I don’t find it, I tick it again: and at that point the “activity” begins. I can’t trigger “begin” when the user exits the title menu because we’re supposed to skip as many menus as possible (making as many assumptions as we please) so I have to wait until after the menu is done and the gameplay has really begun.
I need to jump to the activity begin point even if the player has never begun the activity in the actual game. That means I possibly don’t even have a savestate. So I have prepared a savestate just before the first level fades in, along with an arbitrarily-selected loadout. What else am I supposed to do?
I need to jump to the activity begin point if the player has actually begun the activity. In this case, I use the last savestate he loaded or saved. Unless that one’s not there, then I punt to item 2.
I need to decide when the player has “ended an activity”. I have previously prepared hooks for when each level is beat, for achievements, but these hooks don’t exist in an “un-enhanced” version of the game shipped with the SKU. In case this is what the player’s playing, I still have to detect the end of the game. The achievement hook I created before was done when a specific cutscene is shown at the end of the game. It’s a good, dramatic timing. So, I decided to reproduce that for the activity ending. To do this I will repeatedly memcmp the beginning of VRAM where I happen to know the tiles for that cutscene are. The moment they appear, the game is over. Well… the cutscene is fading in, so the screen is black at that time (that’s not ideal for achievements because screenshots get taken at that time) but that’s what we’ve got for now.
In another game I’m working on, which wasn’t emulated, I had to skip the language selection menu and just assume the user wanted English. What else am I supposed to do? What else is anyone doing? I should probably get a PS5 so I can check some games. In retrospect I should have made an effort to base it on the user’s OS-selected language, but what about people using languages I don’t support?