jctwood









Level 10 Re: The Yearning « Reply #101 on: December 06, 2016, 05:32:02 PM » This is looking incredibly beautiful and I was so pleased to find out that after seeing the terminal gif retweeted somewhere and thinking "this game looks rad wonder what it is", it was mkzebra! Really looking forward to future updates. Logged PHOGS

etodd









Level 3 Re: The Yearning « Reply #103 on: December 21, 2016, 09:26:18 AM » Cracking



It wouldn't be a cyberpunk game without hacking of some sort. The idea here is to slow you down when entering a game to allow more time for matchmaking.







I used



Dock



I've been fleshing out the first few levels. The first one also doubles as the title screen:











Tarzan



Rope climbing and swinging is in, although still a bit WIPpy.



It wouldn't be a cyberpunk game without hacking of some sort. The idea here is to slow you down when entering a game to allow more time for matchmaking.I used Beautiful Soup to scrape 64 4x4 Sudoku puzzles from a website, then I randomly rotate the digits and flip the board to generate more puzzles. It's a fun little mini-game.I've been fleshing out the first few levels. The first one also doubles as the title screen:Rope climbing and swinging is in, although still a bit WIPpy. Logged

etodd









Level 3 Re: The Yearning « Reply #105 on: December 31, 2016, 09:54:43 AM » New map







This is the third map you'll discover, if you count the title screen. Which I do.



Parkour animations







These work exactly the way they did in my last game. While climbing a ledge, the player physics body moves straight up, and then straight forward in a jerky fashion. While this is happening, I offset the model and camera so that the climbing animation stays rooted at the same position even though the player entity is moving. After the animation is done, I blend everything back together so the model and physics body are in the same position again. I believe this is similar to something in UE4 called "root motion".



Animated characters







I started out thinking this game would work the same as my last in terms of story. Branching dialogue choices in a simple text-based system, plus random notes scattered throughout the levels.



This week I finally realized a few things:



I mainly play action games. This is an action game. Things happen in action games. Reading text is not a great fit.

None of my favorite games have branching dialogue. You choose a story branch by performing an action, not selecting it from a menu.

Games are most compelling when gameplay and story coexist and complement each other. That's difficult to do when they're totally separate. Pre-rendered cutscenes, or worse, animatics, foster a clear delineation between gameplay and story. The best games do everything in-engine, preferably without taking control away from the player. In an action game, heavy amounts of text lead to the same problem.

I now have enough modeling and animation experience to pull off fully animated characters if I take a lot of artistic license and stick to a stylized look.

In light of all that, I'm fully removing the text message system. You will now search out and talk to different characters throughout the game. The sailor above took me about two days to model, animate, and script. It's a slow process, but the end result is so much better than seeing a new message notification in the corner. This is the third map you'll discover, if you count the title screen. Which I do.These work exactly the way they did in my last game. While climbing a ledge, the player physics body moves straight up, and then straight forward in a jerky fashion. While this is happening, I offset the model and camera so that the climbing animation stays rooted at the same position even though the player entity is moving. After the animation is done, I blend everything back together so the model and physics body are in the same position again. I believe this is similar to something in UE4 called "root motion".I started out thinking this game would work the same as my last in terms of story. Branching dialogue choices in a simple text-based system, plus random notes scattered throughout the levels.This week I finally realized a few things:In light of all that, I'm fully removing the text message system. You will now search out and talk to different characters throughout the game. The sailor above took me about two days to model, animate, and script. It's a slow process, but the end result is so much better than seeing a new message notification in the corner. Logged

etodd









Level 3 Re: The Yearning « Reply #106 on: January 03, 2017, 01:47:44 PM »



I am considering renaming the game once again. "The Yearning" is still a good fit, but it's confusing, pretentious, and easy to forget. It's also impossible to infer anything about the game from the name alone.



I'm considering renaming it to "Skirr".







"Skirr" is the name of the city in which the game takes place. Reasons I like this name:



It means "to flee". The game is about fleeing the earth to escape an apocalypse.

It sounds like "scurry", which evokes the creepy-crawly nature of the spider-bots.

It doesn't have much competition on Google.

To me it sounds like an action/adventure title.

Taking inspiration from Astroneer, "SKIRR" in all caps looks acceptable and could help draw attention.

Reasons I don't like it:

Confusing spelling. People who hear the title spoken might think it's spelled something like "Scur".

Confusing pronunciation. People who read the title might think it's pronounced something like "Skeer".

What say you? Too confusing still?



Another title I thought about for a while is "Caligula", after a play by Albert Camus. "Caligula" is the name of the refuge planet in the game. Unfortunately there's already a "Caligula" game in development.



Apologies for so many rebrands, but I would rather nail the title than stay shackled to a bad one in order to minimize confusion. Besides,



In other news, the dock is finally finished:



Friends! I need your feedback.I am considering renaming the game. "The Yearning" is still a good fit, but it's confusing, pretentious, and easy to forget. It's also impossible to infer anything about the game from the name alone.I'm considering renaming it to "Skirr"."Skirr" is the name of the city in which the game takes place. Reasons I like this name:Reasons I don't like it:What say you? Too confusing still?Another title I thought about for a while is "Caligula", after a play by Albert Camus. "Caligula" is the name of the refuge planet in the game. Unfortunately there's already a "Caligula" game in development.Apologies for so many rebrands, but I would rather nail the title than stay shackled to a bad one in order to minimize confusion. Besides, No One Knows About Your Game In other news, the dock is finally finished: Logged

etodd









Level 3 Re: The Yearning « Reply #108 on: January 21, 2017, 08:09:26 AM » Life stuff



I had my first anxiety attack on Tuesday! Feels like I've completed a gamedev rite of passage. I've been relaxing and hanging out with my family this week to try and get healthy again. Feeling much better now. Here's what got done before the break:



Hobo



This guy was supposed to look ragged, but his outfit was based on the







He's one of the first NPCs you'll meet. He just talks to himself.







Aerial kills



You can now kill minions from above. I haven't done anything to align the animation yet.







Behind-the-scenes work



Lots of bug fixes and small changes. I refactored the scripting system so that scripts can be executed on both the client and server in networked games. But the biggest time sinks (and of course the biggest overall challenges for this project) are the AI and netcode. I'll still be doing fun story stuff and character models through the end of February for a vertical slice to show at GDC. After that, it's time to dive in to network infrastructure and a completely new AI system.



Animations



I keep adding animations one by one. At one point, Assimp decided to optimize the root bone of the player model out of existence. This obviously caused some problems.



I had my first anxiety attack on Tuesday! Feels like I've completed a gamedev rite of passage. I've been relaxing and hanging out with my family this week to try and get healthy again. Feeling much better now. Here's what got done before the break:This guy was supposed to look ragged, but his outfit was based on the ridiculously photogenic homeless man so it ended up very stylish actually.He's one of the first NPCs you'll meet. He just talks to himself.You can now kill minions from above. I haven't done anything to align the animation yet.Lots of bug fixes and small changes. I refactored the scripting system so that scripts can be executed on both the client and server in networked games. But the biggest time sinks (and of course the biggest overall challenges for this project) are the AI and netcode. I'll still be doing fun story stuff and character models through the end of February for a vertical slice to show at GDC. After that, it's time to dive in to network infrastructure and a completely new AI system.I keep adding animations one by one. At one point, Assimp decided to optimize the root bone of the player model out of existence. This obviously caused some problems. « Last Edit: January 21, 2017, 08:57:05 AM by etodd » Logged

etodd









Level 3 Re: The Yearning « Reply #110 on: January 29, 2017, 07:58:32 PM » Projectile client-side prediction



All moving projectiles in the game are normal entities tracked via the usual interpolated transform sync system. This is fine for AI characters shooting at you, but it's incredibly frustrating when you are shooting projectiles. You have to wait for a network round-trip before the projectile shows up.



I often test netcode on localhost, where there is no lag. Since this feature is heavily dependent on lag, I took some time during the



I cranked the lag up to 300ms total round-trip time and fired some projectiles. The first problem was that, since the server took 150ms to register my "fire projectile" command, my target might have moved by the time the projectile got to it.



The solution works like this on the server:



Rewind the world 150ms to the point where the player fired

Step forward in increments of 1/60th of a second until we reach the present, checking for obstacles along the way

Spawn the projectile at the final position

If a target was hit during this process, delete the projectile and apply any damage effects

To the player, there is still a 300ms delay before anything happens, but the projectile will pop into existence 20 feet out, where it would have been if there were no lag. This makes it easier to aim, but it's still annoying to have no immediate visual feedback when you fire.



I thought about spawning the projectile on the client. The problem is, projectiles are entities, and the entity system is controlled by the server. If I spawned projectiles on the client, IDs would get out of sync and things would explode.



So instead, I made a new system for fake projectiles, totally separate from the entities. Actually "system" is too strong a word, it's just an array of structs. These fake projectiles live for up to half a second, and the client removes them in order as soon as the server spawns a real projectile.



Here's the end result running with over 300ms of lag:









Shops



You can now buy stuff at these special locations known as "shops".







Locke has a number of greetings he can give, which will have accompanying animations. I'm really starting to enjoy animation work! Actually had a blast making this:







Also, this thing is now over 50,000 lines of code All moving projectiles in the game are normal entities tracked via the usual interpolated transform sync system. This is fine for AI characters shooting at you, but it's incredibly frustrating whenare shooting projectiles. You have to wait for a network round-trip before the projectile shows up.I often test netcode on localhost, where there is no lag. Since this feature is heavily dependent on lag, I took some time during the stream this past Friday to implement a buffer that simulates network lag.I cranked the lag up to 300ms total round-trip time and fired some projectiles. The first problem was that, since the server took 150ms to register my "fire projectile" command, my target might have moved by the time the projectile got to it.The solution works like this on the server:To the player, there is still a 300ms delay before anything happens, but the projectile will pop into existence 20 feet out, where it would have been if there were no lag. This makes it easier to aim, but it's still annoying to have no immediate visual feedback when you fire.I thought about spawning the projectile on the client. The problem is, projectiles are entities, and the entity system is controlled by the server. If I spawned projectiles on the client, IDs would get out of sync and things would explode.So instead, I made a new system for fake projectiles, totally separate from the entities. Actually "system" is too strong a word, it's just an array of structs. These fake projectiles live for up to half a second, and the client removes them in order as soon as the server spawns a real projectile.Here's the end result running with over 300ms of lag:You can now buy stuff at these special locations known as "shops".Locke has a number of greetings he can give, which will have accompanying animations. I'm really starting to enjoy animation work! Actually had a blast making this:Also, this thing is now over 50,000 lines of code Logged

etodd









Level 3 Re: The Yearning « Reply #112 on: February 20, 2017, 08:24:46 AM » Health v11



I added an extra shield hitpoint, so it takes three total hits to kill a player. I'm hoping this will encourage players to use abilities rather than only attacking each other directly.



Master server



I have the beginnings of a master server, which facilitates connections between players and servers. It's pretty basic at this point, but it works. I'll continue to expand this in the future with authentication and matchmaking.



AI



I threw out the behavior tree system, which badly needed refactoring anyway. Now I'm working on a system which will record player inputs into a database, then search through the database for specific scenarios and play back the correct actions. It's maybe halfway to a rough draft working prototype.



Clouds



Just another cool thing I wanted to pull in from my last game. They're animated and actually cast shadows on the environment.







GDC and PAX East



I'll be present for the first two days of GDC, plus out of nowhere I got an opportunity to show at a booth at PAX East! Beyond excited I added an extra shield hitpoint, so it takes three total hits to kill a player. I'm hoping this will encourage players to use abilities rather than only attacking each other directly.I have the beginnings of a master server, which facilitates connections between players and servers. It's pretty basic at this point, but it works. I'll continue to expand this in the future with authentication and matchmaking.I threw out the behavior tree system, which badly needed refactoring anyway. Now I'm working on a system which will record player inputs into a database, then search through the database for specific scenarios and play back the correct actions. It's maybe halfway to a rough draft working prototype.Just another cool thing I wanted to pull in from my last game. They're animated and actually cast shadows on the environment.I'll be present for the first two days of GDC, plus out of nowhere I got an opportunity to show at a booth at PAX East! Beyond excited Logged

etodd









Level 3 Re: Deceiver [née The Yearning] « Reply #113 on: March 08, 2017, 11:47:03 AM » Another rebrand



This is the last time, I promise. The game is called Deceiver.







Easier to remember, and a surprisingly uncontested name within video games at least.



Some people know the reasoning behind the name, but unfortunately it's extremely spoilery.



Rain







This system does raycasts to determine how far each raindrop should fall. Unfortunately, my particle system (and most particle systems I believe) requires that particles be removed in the same order they were added, meaning all particles must have the same lifetime. To get around this, I store each particle's individual lifetime in a vertex attribute and clip the particle out of existence in the pixel shader if the particle is too old.



The system keeps a cache of raycasts around each camera, updating the cache over time at a rate of about 1000 raycasts per second. As an improvement over my last rain system, it can also "fill in" missing particles when the camera moves or teleports too quickly for the normal spawn rate to keep up with.



Miscellaneous



Added a network lag simulator and made more changes to further harden the netcode. One example: the server was using the client's running average RTT to rewind the world when doing collision detection for that client. Problem is, if the player sends a "jump" command that gets dropped by the network and resent later, the timing of that command is out of sync on the server and client, and it will only be resolved when the player lands. So now the server uses the sequence ID of the command to calculate and store an RTT value for rewinding purposes, which remains constant until the player lands.

For the longest time I was bothered by the game's performance on my laptop, which has a GTX 950M capable of running Rocket League on decent settings at over 60 FPS. For a while this made me doubt a little bit my ability to write performant shaders. Turns out, my game was being relegated to the Intel integrated graphics chip. Tweaking the nVidia settings brought performance to over 150 FPS. Yay!

Upgraded to VS 2017. I think it's an improvement from 2015 overall. Certainly the install experience was much better.

The local/online multiplayer menu system is maybe half done. Multiplayer might be completely done soon. I am considering an Early Access release to stress test the netcode and collect gameplay feedback.

Showed the game to a few publishers at GDC last week. Headed to PAX East this weekend. Stay tuned.

This is the last time, I promise. The game is called Deceiver.Easier to remember, and a surprisingly uncontested name within video games at least.Some people know the reasoning behind the name, but unfortunately it's extremely spoilery.This system does raycasts to determine how far each raindrop should fall. Unfortunately, my particle system (and most particle systems I believe) requires that particles be removed in the same order they were added, meaning all particles must have the same lifetime. To get around this, I store each particle's individual lifetime in a vertex attribute and clip the particle out of existence in the pixel shader if the particle is too old.The system keeps a cache of raycasts around each camera, updating the cache over time at a rate of about 1000 raycasts per second. As an improvement over my last rain system, it can also "fill in" missing particles when the camera moves or teleports too quickly for the normal spawn rate to keep up with.Showed the game to a few publishers at GDC last week. Headed to PAX East this weekend. Stay tuned. Logged

etodd









Level 3 Re: Deceiver [née The Yearning] « Reply #118 on: March 22, 2017, 10:20:15 AM » PAX East







I had an opportunity to show the game as part of the Playcrafting booth at PAX East. It was fun getting to meet a lot of cool people, but I realized that you get back what you put in when it comes to expos and shows. It's difficult to attract interest when you're part of a larger booth and have no signage.



Attract mode



To help attract attention at PAX, I wrote up a quick and dirty "attract mode". The game can now record matches and automatically play them back after 60 seconds of inactivity. As soon as someone touches a controller, the game goes back to the main menu. It was very straightforward to write; I just record the network packets and play them back in order. Unfortunately I couldn't get anyone to play a match with me before PAX, so the feature went unused. But it will come in handy in the future!



UTF-8 support



This was a lot easier than I expected. Essentially the only code that needs to think about multi-byte codepoints is the text rendering code.



This was necessary because I wanted...



Playstation button prompts







The game now displays different button prompts for each player, depending on what kind of controller they plugged in, if any. It also instantly switches to keyboard prompts if you touch the mouse. My last game always showed controller prompts as long as a controller was plugged in, and that proved to be confusing to some players. Besides, this is a feature that impressed me in The Witcher 3, so I decided to steal it.



Clipping v4 (?)



Still experimenting with new camera clipping techniques. If anyone knows any of the graphics programmers who worked on For Honor, I would love to know how they do their effect.







In this version, I'm rendering backfaces the same as camera-facing tris, but in pure black. I'm working on removing the white outlines inside the black areas. If I can also fix a few weird clipping situations that block the camera view, I think the effect will finally be complete.



Hacking improvements







The sudoku hacking game had one flaw, which is that sometimes it gave you a number that could belong in a currently unsolvable portion of the puzzle. To fix this, I made it calculate the number of possibilities for each cell and give you the one with the least number of possible values.



AI



I scrapped the old behavior tree system a while back, so the AI players have been sitting idle since then. I'm finally making significant progress on a new system which will be able to seamlessly playback recordings of player moves, mixed with ad-libbed AI actions. The recording system is done, and now I'm working on the AI actions. After that, I'll work on the playback system which will select which recordings to use in each situation.



Having AI players in the game again revealed to me a major issue with the gameplay...



Skill shots



I realized that the core shooting mechanic was a bit rock-paper-scissorsy, because it always takes the same number of hits to kill. Three hits is also too many; it feels tiresome, especially if the other player is trying to get away. The possibility of getting one-shotted as constant fear adds some thrill to the game. At the same time, I don't want a single dumb mistake to result in death, especially at the hands of a non-player character.



With that in mind, I'm bringing back an old concept I tried a while back: skill shots. Your shot can take away 1 hit point or all 3, depending on how good it is. I think it's especially satisfying to get a 1-hit kill because you don't bounce off at all.



I had an opportunity to show the game as part of the Playcrafting booth at PAX East. It was fun getting to meet a lot of cool people, but I realized that you get back what you put in when it comes to expos and shows. It's difficult to attract interest when you're part of a larger booth and have no signage.To help attract attention at PAX, I wrote up a quick and dirty "attract mode". The game can now record matches and automatically play them back after 60 seconds of inactivity. As soon as someone touches a controller, the game goes back to the main menu. It was very straightforward to write; I just record the network packets and play them back in order. Unfortunately I couldn't get anyone to play a match with me before PAX, so the feature went unused. But it will come in handy in the future!This was a lot easier than I expected. Essentially the only code that needs to think about multi-byte codepoints is the text rendering code.This was necessary because I wanted...The game now displays different button prompts for each player, depending on what kind of controller they plugged in, if any. It also instantly switches to keyboard prompts if you touch the mouse. My last game always showed controller prompts as long as a controller was plugged in, and that proved to be confusing to some players. Besides, this is a feature that impressed me in The Witcher 3, so I decided to steal it.Still experimenting with new camera clipping techniques. If anyone knows any of the graphics programmers who worked on For Honor, I would love to know how they do their effect.In this version, I'm rendering backfaces the same as camera-facing tris, but in pure black. I'm working on removing the white outlines inside the black areas. If I can also fix a few weird clipping situations that block the camera view, I think the effect will finally be complete.The sudoku hacking game had one flaw, which is that sometimes it gave you a number that could belong in a currently unsolvable portion of the puzzle. To fix this, I made it calculate the number of possibilities for each cell and give you the one with the least number of possible values.I scrapped the old behavior tree system a while back, so the AI players have been sitting idle since then. I'm finally making significant progress on a new system which will be able to seamlessly playback recordings of player moves, mixed with ad-libbed AI actions. The recording system is done, and now I'm working on the AI actions. After that, I'll work on the playback system which will select which recordings to use in each situation.Having AI players in the game again revealed to me a major issue with the gameplay...I realized that the core shooting mechanic was a bit rock-paper-scissorsy, because it always takes the same number of hits to kill. Three hits is also too many; it feels tiresome, especially if the other player is trying to get away. The possibility of getting one-shotted as constant fear adds some thrill to the game. At the same time, I don't want a single dumb mistake to result in death, especially at the hands of a non-player character.With that in mind, I'm bringing back an old concept I tried a while back: skill shots. Your shot can take away 1 hit point or all 3, depending on how good it is. I think it's especially satisfying to get a 1-hit kill because you don't bounce off at all. « Last Edit: March 22, 2017, 10:26:39 AM by etodd » Logged