Spilt (15, 117 mins, ★★★)

M Night Shyamalan (The Sixth Sense, The Village) has a reputation both for expertly disturbing his audiences and for erratic performances at the box-office; his latest film is being hailed as a return to form. Its star is James McAvoy, who plays a character, Kevin, with 23 personalities and another one on the way. Split seems too binary a title: it really should be Splintered.

The plot is solid B-movie schlock, cranked up by Shyamalan’s undoubted talent for suspense. When the class oddball, Casey (Anya Taylor-Joy), accepts a ride home with two popular teenage girls, Claire and Marcia (Haley Lu Richardson and Jessica Sula), a shaven-headed stranger pepper-sprays Claire’s dad and slides into the driving seat. The terrified girls are taken to a fortified room, where they come to realise that their captor is one person but many characters: chiefly Dennis, a meticulous, controlling man, Patricia, a sleekly sinister woman, and a nervy nine-year-old boy called Hedwig. These are but a few of the personalities contained within Kevin, but the fact that this trio appears to be dominant is worrisome. As only Casey – already a veteran of trauma – seems to realise, the key to escape is persuading the right character to help them.