Orkn's Pulp Prototypes

Resonant Tale is finally approaching a complete game, and while it's not quite finished yet, yesterday I spent a surprisingly short amount of time trying to make the game more accessible. I thought my experience might be interesting to share :slightly_smiling_face:

Accessibility in Resonant Tale

Previously I have implemented some cheat codes in Resonant Tale that can be entered on the title screen, partly for fun and partly for making testing easier. One of those cheats was player invincibility, but it occured to me this would really be better as an easily discoverable option in some assistance settings. That prompted me to consider accessibility in the game in general.

I was a bit trepidatious about exploring accessibility. It's not something I'm familiar with or have consciously addressed before and I was worried about how much work the additional functionality would be, especially using Pulp. Obvious accessibility features that sprung to mind having seem them in other games, like adjustable font sizes, are not readily supported by Pulp (which I think is a fair trade off with Pulp's intended simplicity as a starting point into game development). Nethertheless I started reading up on Accessible Player Experiences and Game Accessibility Guidelines, both great resources. I geared my mindset to thinking about what can be easily done rather than getting hung up on what can't!

More details below, but this is the assist menu as it now looks in game:

resonant_tale_assist_menu

Settings persistence

Up until now my approach to save data has been really simple - if the player selects Continue from the title screen I use restore while if the player selects New Game I use toss. With assistance settings however I want them to persist even if a new game is started. I replaced my toss call with a custom game event (also called "toss") that looks like this:

on toss do
	toss
	// Re-store persistent vars
	store "assist_damage"
	store "assist_bosses"
	store "assist_crank"
	store "assist_timing"
	store
end

This works great and is going to be useful beyond these assist settings as I'm planning on keeping a record of whether the game has ever been beaten so I can offer a New Game Plus!

Player damage

I already had a version of this implemented in my invincibility cheat so this was easy. From an accessibility perspective being able to turn off player damage is a maybe heavy handed but simple solution to a host of potential issues.

I already had all player damage implemented through a player event takeDamage so this was as easy as adding this one conditional to the start of the event handler:

on takeDamage do
  if assist_damage==1 then
    done
  end
  // code handling player damage
end

Boss battles

I'd describe Resonant Tale as "low combat" - there are numerous hazards but few traditional enemies. Bosses are the exception as tests of player execution and as barriers to progress. While a valuable aspect of the game, making them optional prevents them blocking someone from enjoying the rest of the game which is not as challenging or demanding of execution.

Again I already had logic in place for triggering bosses, previously there to prevent bosses from being fought multiple times if returning to the boss room for example. This made implementing a simple skip almost trivial as (for the most part) I only needed to alter a few conditionals. The first dungeon's boss, for example, has a conditional changed from this

on enter do
  if has_bell_of_vitality==1 then
    // code toggling the boss
  end
end

to this

on enter do
  flags = has_bell_of_vitality
  flags += assist_bosses
  if flags>=1 then
    // code toggling the boss
  end
end

(The flags>=1 pattern is a pulpscript version of an or)

Crank puzzles

Input, especially analogue input, is an obvious consideration for accessibility. Resonant Tale has minimal use of the crank, used only in a couple of instances, only one of which is required to beat the game. A setting to remove those instances to prevent a small aspect of the game stopping someone from playing it entirely seems an obvious win!

With the assist option enabled, for an optional puzzle I simplify the puzzle to no longer require the crank. For the required puzzle simplifying it was not an option so I just made it pre-solved (although I may revisit this to make an alternative solution instead).

Timing puzzles

Timing puzzles refers to anything (outside of bosses) where precise timing is required from the player. This covers a relatively significant minority of Resonant Tale and was the most work to implement as I took different bespoke approaches depending on what content I was changing.

Take this room as an example - it has retracting spikes that the player must time passing over to not take damage:

resonant_tale_retracting_spikes_without_timing_assist

With the assist option enabled I replace the retracting spikes with static spikes and add a path through for the player to navigate:

resonant_tale_retracting_spikes_with_timing_assist

Not every timing puzzle has quite as nice a replacement as this and in multiple places I simply removed the challenge entirely, but I like being able to offer an alternative like this where I can!

2 Likes