Itinerant Story - first person platforming in an infinite procedural world

Itinerant Story is a first person parkour platforming game with procedurally generated levels. It features movement mechanics reminiscent of games like Mirror’s Edge, but with procedural levels more reminiscent of “roguelike” games like Spelunky or Super House of Dead Ninjas.

Vote for it now on Steam Greenlight!

The concept for the procedural generation was inspired by Spelunky, basically I’m generating 10 meter by 10 meter “tiles”, that are usually about 4 meters tall, the rooms have logic for generating what’s inside of them, the level just places them and gives the tiles some contextual information about where it is in a level. The level generates a 50 by 50 “region” of these “rooms”. The levels are currently made up of three of these ‘regions’. I intend to also have pre-fabricated scenes, to help add more level designy-elements to the game.

Well the procedural generation stuff has changed and isn’t great. But, parkour works better now!

I just moved my parkour platforming code over from blueprint to C++, which I do recommend using blueprint for rapid prototyping, I think C++ gives superior control over things and is really where you should ultimately go.

So I started with the C++ FPS template (which extends the ACharacter class), and then extending the Character Movement Component.

What I mean by “parkour” at this moment is specifically wallrunning (both vertical and horizontal - plus the ability to jump while wallrunning) and a simple version of what I’m calling “ledge vaulting” (similar to ledge hanging, but instead of hanging, the character throws themselves onto the platform rapidly instead of just hanging there.) I’ve accomplished these things by extending

virtual void ACharacter::MoveBlockedBy(const FHitResult& Impact) override;
void ACharacter::Landed(const FHitResult& Hit);

void UCharacterMovementComponent::OnMovementModeChanged(EMovementMode PreviousMovementMode, uint8 PreviousCustomMode);
virtual void UCharacterMovementComponent::PhysFalling(float deltaTime, int32 Iterations);

MoveBlockedBy() and PhysFalling() are the important ones. MoveBlockedBy seems to be called whenever your velocity is decreased because you’re colliding with something (usually a wall) crucially, it is called regardless of your movement mode (for some reason I thought it’d only be called when you’re walking - I needed it when “falling” so it worked out.) I detect the edges using code inspired by something I saw somewhere on these forums, it does a line trace starting from a point 600cm above and 42.01cm in front of the character and sends it downwards. If it finds a platform, it does another line trace, this time from the character to a point just above the platform, to see if the character can reach the point, then if that works it launches the character towards the point (presently I’m actually using the SafeMoveUpdatedComponent function to move the character, but I haven’t the foggiest idea if that’s actually a good way to go about it - I’m guessing not, but it works for now.)