I’ve been getting this quite a lot since the first builds … “I cannot customize the keys…”
Now you can 🙂
In the pause menu you can customize the keys to your heart’s content.
Trello board
Also, you can now vote for tasks to be prioritized in a trello board. I migrated the tasks/bugs from my local todo list to a trello board. You can see it here: https://trello.com/b/fhkZsXV4/pyramid-plunge. So some fixes/features will have a link to the card directly to the trello board.
Quick Update on Online Multiplayer
Besides this minor feature, I’ve been busy as well on the online multiplayer netcode. So far throwing, killing enemies and arrows are synched properly. So online multiplayer is not in this build, but hopefully soon 🙂
Support for partial damage, with hearts now having 4 quarters. Support for partial damage, with hearts having 4 quarters. This was done as it was a bit stupid that in 2p, the opponent cannot damage your friend (as she would be killed pretty quickly). So instead now this is introduced, so that throwables damage you by one quarter, while enemies, boulders, arrows, etc damage you be 1 whole heart.
Fixed
Dead bodies should be behind pickups
Switcheroo ghost should not chase exited players
Fixed issue with some pingponging animations
Fixed pivot points for Felicie swimming as it was very jarring when flipping direction
Draw friend avatar in multiplayer according to chosen color
Fix for multiplayer where player can pickup opponent friend while she’s climbing up the rop, causing a bit of a glitch
Do not allow to deploy explosives at edges of level
Fixed depths of characters when switcherooed
Modified
Tweak to tutorial so bomb part is easier
Improved exit animations
Chest can be flipped horizontally randomly in level generation
Tweaks for pause menu
Do not decrement flood timer when exiting the level
Tweak so you can steal back your stolen friend while being carried (As previously you had to be above the other player to steal back your friend)
It’s been a couple of long months with the pandemic lockdown going on. Nevertheless I found something on what to focus on – Pyramid Plunge!
This update is pretty huge and here’s a rundown of the biggest changes.
New graphics for the Egypt theme
I wasn’t happy with how the Egypt theme was looking which is the first theme players will be playing. So I experimented a bit with different color schemes and settled on this:
So the Egypt theme is almost complete. Need to create an improved Boss graphics, as for now the same graphic as the mummy is being used. I’ll be adding an evil Pharaoh kinda vibe to the boss where he will be getting angry and scarabs coming from his mouth, as well as farting spiders.
A New Theme
When killing the boss level of each world, a new theme will be used. There will be four in all, and the next theme to be implemented was the Mayan/Aztech theme. It’s still a WIP and the boss for this theme has not been implemented yet.
Switcheroo
You can now play as the female character. It’s pretty hilarious seeing thin Felicie throwing fat George against an enemy! Controlling Felicie will only happen when you find a Switcheroo ghost in a crate, which will hunt you down and if it comes in contact with George or Felicie, they will get switched. This “powerup” was quite hectic to implement especially with all the animation frames that had to be done, so you could control Felicie, and have George act as the one needing all the help. Surprisingly there were more animations for George to be done.
Multiplayer
I really believe multiplayer mode in this game is a lot fun. I know because I play it with my kids and it gets hilarious very quickly. If you’re not careful, your opponent can take your Felicie and put it on a trap to get hurt and subsequently killed. You can throw anything at each other, and if you get hit, half of your coins get thrown out. This results in some crazy action where if someone got a lot of loot from the level, the other opponent will try to hunt him down to steal from him. You can see some of this action in this gameplay trailerhttps://www.youtube.com/embed/PG8OAEEcE58
Implementing multiplayer correctly is tough. I’m trying to get some help on this as I got stuck back in November. Meanwhile Parsec can be used which is free software for 60fps online coach multiplayer. It’s pretty amazing at what it can do! I tried it with a friend of mine, and it was butter smooth and pretty lag free.
Secrets
This has been put off for a long time. I always wanted to have some sort of secret in the level. But I couldn’t nail down an easy way how to implement it which would make sense also in a multiplayer game. I finally found an easy way how to add secret. Randomly, on murals, there will be a specific spot which if hit by some thrown object, it spews out a number of coins. It’s quite satisfactory to hit jackpot, especially in a multiplayer scenario
New Music for Jelly-fish time
In multiplayer, if you exit the level before your opponent, the flood is triggered and you can control a jellyfish to hunt down your opponent. Initially I had made the jellyfish remove 1 heart to the player on touching them, but that was too punishing. So Instead I made it that you would be just zapping your opponent if you touch them, and so decrease his breath since he’s under water. The jelly fish isn’t as fast as the human player, and so he has to be careful how to control the jelly fish to continue zapping and annoying his opponent. This adds another layer of fun in the multiplayer
Give Up option in multiplayer
Sometimes a good opponent will take all the loot and exit. There isn’t any loot left so the only option was to die by the hands of some enemy or let the flood come up and remove all your breath. But that was killing (pun intended) the fun. So now there’s an option where you can give up by pressing the shoulder buttons simultaneously.
Make sure to check out this update as it’s a lot of fun. And I encourage you to try out Parsec with a friend to get a laugh.
This week’s focus was on lag compensation for carrying objects. However I got stuck with delay when throwing an object.
When the player is carrying something (including the Felicie), the item is switched to skip interpolation, meaning that it is not part of the 100ms lag of other objects, so it appears responsive. The problem arises when the player throws the object. There’s a delay between the sending of the throw command and the first server response showing the result. The 100ms lag compensation delay induced when switching off skip interpolation was subdued by recalculating from the render tick (which is 100ms in the past) to the present tick and also sending them to server. But there is still the transmission delay.
Something I will be working on next week is trying to get rid of this delay by letting the remote player simulate the throw similar to how we’re handling input prediction. For input prediction we are
doing the player movement simulation,
sending the keypress together with the x,y coordinates as calculated by the remote client to the server (and keeping track of the position and the current tick)
the server replies with its own calculation according to the keypress
the remote client verifies if its calculations match with the server and if it doesn’t it will correct the position.
We need to do something similar for the throw. The only difference is that no keypresses are done
This week was focused on getting lag compensation in place, and I focused on two specific events which should be to appear as responsive as possible, namely picking loot and landing on enemies’ head.
So remember that the player is seeing the world 100ms behind, but his avatar is updated immediately thanks to Input Prediction which was done last week. When picking up loot, it needs to be verified by the server. When avatar touches a loot, it sends a request to the server with the current render tick (~100ms behind). The server will go back in time to verify that he can take the loot, and reply with a yes/no answer.
The landing on an enemy head (and killing him) is slightly more complicated, namely because it we create a dead body instance that flies off from the position of the killing. So if it is accepted by the server, we need to simulate back in time to the current time for both the server and the client, since they are both rendering 100ms behind.
Since a lot of data structures are involved in making this possible, it was inevitable that I would do some typo or other stupid mistake. And this is where I miss Unity and it’s strong typed C#. In GameMaker you can do anything and it will not check for you. So for example you can delete a buffer instead of a list and it will not complain but will obviously corrupt the memory and then you start having all kind of weird crashes. I would accept this in a compiled released version where all checks are removed, but I was surprised no checks at all are being done in the debug VM version. Because of this, I think this will be my first and last project on GameMaker.
This week I focused on getting input prediction working. What I had working last week, I had the remote player pressing keys, sending them over to the server and waiting for the server to reply back with the next state of the player. Adding the 100ms delay for interpolation purposes you would have 100ms + ping time before you see your character move. That’s pretty bad as the game would feel very laggy.
What Input Prediction does is that the remote player’s avatar will appear moving immediately as if it’s a non-networked game. It will save the key strokes requests sent to the server by giving them an id together with the predicted position. The server will receive these key stroke requests, and will reply back with the resulting position as calculated by the server. The remote client will then receive these server-verified positions and double check if the positions calculated for that key stroke request matched or not. If it doesn’t match then it will start fixing the position according to what the server calculated.
The next part of the puzzle for next week is Lag Compensation. This will solve the issue for having events (like picking up loot or killing enemies) appear more responsive.
Pyramid Plunge already has local multiplayer implemented. It’s not cooperative as most have thought. It’s actually a competitive game where each player controls their own George+Felicie. The player who exits the level with the most coins wins. To make it more interesting you can steal the coins from the other player by throwing objects to the other player were half their coins will spew out of them ala Sonic. You cannot harm your opponent though as otherwise the game would be over pretty soon. The first one to exit triggers the flood and also becomes the jellyfish so he can hunt down the other player.
These last couple of weeks I decided to bite the bullet and start implementing online multiplayer. I know there is Steam Remote Play Together to play a local multiplayer game online, but there will be a bit of delay on the remote player since he’s basically streaming the game from the other player.
I’m following the basic principles outline in the Source Engine multiplayer, and I’m using peer-to-peer server-client architecture. The server will be authoritative, so whatever the server says is legit. The client will basically be a dummy client sending keystrokes 30 times per second, and the server sends world updates 20 times per second. I got that working so far with entity interpolation in place. So the next thing I will be working on next week will be input prediction to make it feel more responsive on the client side.
I’ve been chatting to some twitch streamers and it was very educational to get feedback. We had the first twitch stream 🙂 Thanks CadetLegend15.
I also got some valuable feedback from VeRKK and tried to implement some changes. Mainly there needs to be some difficulty setting to ease in the players. Also the ability of double jumping while carrying her should reduce some frustration.
Here’s the full release notes:
Release Notes v0.4.5
Added ===== * Highlight current tutorial step * Suggestion: Show picked up items descriptions * Suggestion: Added difficulty setting in single player mode
Fixes ===== * Fix for water on 2nd player view being misaligned * Fix for spider webline drawn incorrectly on 2nd player view * Fixed issue when using thumb joystick to exit level but you didn’t really do an up * Removed mouse cursor * Fix for friend being behind the player while swimming * Show Tutorial Complete instead of Level 1 Complete when completing tutorial level * Fix for shop not appearing in subsequent levels after completing tutorial * Fix for Boss dead body not rendering properly
Modified ======== * Removed C4 tutorial popup as it was annoying and useless * Don’t allow action key when in tutorial starting platform * Added some more coins to the tutorial so you can buy something * Suggestion: Tried making the throw more responsive (no more delay due to animation) * Suggestion: Allow double jump while carrying friend * Tweaked a bit the speed of the player * Made picking up things easier. You don’t need to be exactly on them anymore * When playing multiplayer fill up water more to avoid player hiding from jellyfish * To exit the level when swimming you also need to press up. * Show unaffordable items’ price in red