- restored "corrosion showers" in "beneath" - fixed loading save games at the initial section of "beneath" - fixed cases when the player could get embedded into ground when using smooth locomotion
plans for September
I took some vacations recently that I was looking forward to for a long time. This is the reason why there were no updates for the game.
For the next few weeks I should be mostly focused on porting the game (submissions). During the waiting time I don't want to start any bigger tasks for Tea For God but I should be adding some small content (EXMs, weapon nodes, enemies). Most of that will find its place in the main story for time being. But the main reason for adding them is the next big task.
And for that I decided to focus on the endless mode. I want it to be the main thing (once you go through the main story but you can speed that up with using infinite health or desolate modifiers). The endless mode will give me an opportunity to add more different content. The main story has its beat, pace, things coming one after another. With endless mode I can add anything and have a greater freedom at whether I now want to add enemies, items, new types of objectives, new zones or whole new levels.
Another news is that I will be attending PGA in October with Tea For God. Some of the time this month I will spend on preparing a build for that event.
After a few years of development of Tea For God, I also want to experiment a bit with something else that I'd like to show at PGA.
Stay tuned!
v 1.0.5 (#355)
- added a blinking effect on shield when it has low level of energy - exit in beneath is visible from a greater distance - enemies pause for a moment when the player should look at the elevator in "up" - player is reminded about the elevator in "up" after a while - fixed horizontal scaling preview - the grid in options always shows how it would look like with the currently selected horizontal scaling - fixed missing collision at the train platform in prelude - fixed incorrectly ending tasks that could lead to a crash - fixed crash on checking if a path is valid when part of the world got removed
v 1.0.4 (#349)
This is a quick update with one important change (+ a few smaller ones):
fixed a few never-ending level generation cases
fixed proximity mines and shields attached mid-air (where doors appeared)
fixed turn counter rendered in the place of real time
fixed typo for dock screen
One thing that I often do mention are crash fixes. Mostly because they would be dry "fixed some crashes" and I only mention them when they were something really specific.
Update 1.0.3 + roadmap
Another update mostly about fixes but there are some other changes as well.
The most important change is proper preparation of play-area size that is based on boundary points. It works now on SteamVR/OpenVR and OculusAPI. I will be investigating OpenXR as well.
Other non-fix changes are related to some gameplay mechanics.
Hitting (melee) is now easier as the speeds were lowered. You can get health and ammo from hitting small robots to make it consistent with hitting other objects. If the last hit is a kill and you have appropriate EXM installed, it won't give extra bonus for a normal hit. Also, melee kills provide loot now (same as other kills).
During the game, some people may encounter strange devices on walls that have a running circular pattern or just red lights. The read lights are "dead end" but the running pattern is an indicator that the world is being generated. I've seen players trying to interact with the device - this was not implemented and nothing happens when you touch or shoot it. To lessen the confusion about the device, I added "please wait" text displayed when you are close. Ideally, they should be never visible but the level generation may take more time in some cases and also if the game guesses where the player is going incorrectly, it will generate other places first.
I also added a small feature: you can customise weapon sights colour and outer ring's radius (set to 0 to make it disappear).
The other fixes:
fixed "mean machine" modifier
fixed some game scripts running when exiting game and starting new (or loading game state)
fixed bringing permanent EXMs through "another chance" chapter
fixed metal pilgrims in burial scene to move based on location, not time
fixed flashing door to repair hangar in "prelude"
fixed horizontal scaling preview
That's it for this week. The roadmap remains almost the same:
Short-term goals:
Fixing bugs. There are less and less of them but still some work is required.
Port to PICO and Vive. It still requires some work to bring the performance to a proper level. Also, my attempts at Quest Pro are failed ones. I will need to get the device as otherwise I can't really tell what's going on there.
Achievements.
Endless/tasks mode with three different maps and three types of missions.
Add chapters that were not made for 1.0.0.
Long-term goals:
More maps and types of missions for endless mode.
Short stories that will be unlocking new stuff for endless mode.
Challenges with leaderboards.
Modding support.
Multiplayer.
v 1.0.3 (#345)
added preparing play-area when playing on Quest on PC
this workaround works currently only for SteamVR and OculusAPI
fixed "mean machine" modifier
fixed some game scripts running when exiting game and starting new (or loading game state)
fixed bringing permanent EXMs through "another chance" chapter
fixed metal pilgrims in burial scene to move based on location, not time
fixed flashing door to repair hangar in "prelude"
fixed horizontal scaling preview
ammo/health for hit is given only if not given for kill
improvements for melee
easier to hit, particle effects on getting ammo/health on every hit added
small robots can be used to gain energy/health via melee
added weapon sights customisation options (color + outer ring radius)
added "please wait" info when region is being generated
melee kills provide loot
preparing play-area from boundary
Since Quest link has been introduced there was one thing that was a bit problematic. It was impossible to read “play area”. It was incorrect, too big, rotated, reaching outside the actual boundary. I reported it only to learn that there were other developers before me who also reported the issue but it has not been fixed.
When providing details for the bug and possible solution I found out that Oculus API is reading the boundary points correctly. The only problem was that the play area instead of being the biggest rectangle that fits INTO the boundary was just a rectangle that contained the boundary (with orientation just “as it is”). The same results I got for SteamVR.
For OpenXR it was also additionally offset but it seems that it was only because OpenXR by default has a centre in point 0,0,0 while Oculus API allows for offset centre.
I had everything I needed to try to implement an algorithm that would find the best rectangle that fits into the boundary. I heard that it is not a trivial task. I heard that it might be even impossible. And I was actually surprised to hear that as at least for the most common cases (more or less convex boundary) it seemed quite easy to do. For a few weeks, I had this task back in my head, coming up with better ways to find such a rectangle. And after 3 hours I had a working algorithm that successfully passed initial tests.
My approach is quite straightforward.
Reduce the number of points in the boundary – just remove all points that are closer than 5cm to the last added point.
Calculate the centre from the average of points – this should give a good enough central point that hopefully lies inside. For odd and twisted boundaries this is where the algorithm may fail.
Do the following points for angles -45 to 45 (no need to check more as all other angles are either the same or rotated by 90 degrees) I chose 5 degreeS interval
move boundary points into local coordinates
check intersections along x-axis
divide that into 5cm segments
for each segment check how far it can go in both directions along y-axis – this is an important step – it caches rectangles so there’s no need to do a bit more expensive segment intersections, note that the upper end is above 0 and the lower end is below 0
for all possible rectangles along x-axis (two loops: left-x goes for all rectangles, right-x goes from right-most to left-x) find the rectangle that fits into chosen rectangles prepared in the step above (min for upper ends, max for lower ends) and check if that rectangle is the best match so far
Initially the “best match” was based purely on size but I modified it a bit to prefer rectangles that have a bit smaller difference between sides. Might still change that, though.
It works fast enough (at least when I tried for a maximum of 4×3 spaces).
There’s no need to try all possible rectangles. There could be some further optimisations. There should be a way to make sure that the “centre” is within the boundary. But for 3 hours of work, I’m quite happy with the results.
And most important, it should make it much easier for people to play the game as currently when starting the game, the play area was incorrectly read, it was too small, too big, offset or just completely wrong.
Update 1.0.2 + roadmap
This update is mostly fixes but there are some changes about unlocks.
For run-based mode, unlocks can be unlocked only if there's no run in progress. You have to either fail or finish the game or - you can end the current run from the unlocks menu. I was a bit reluctant about this change as a long time ago I specifically made unlocks available during run as the unlocks do not affect the current run. But there were side effects I found attractive - if you buy an upgrade, consecutive permanent upgrades in the game will cost less. I have no idea why I liked this idea as it encourages to exit the game, buy stuff using menu and go back to the run. Although it adds a bit of tinkering, it works strongly against the immersion.
Another change is that all EXMs that were installed during a run are available to unlock from the unlocks menu. Before it was only about the EXMs that you had on yourself in the moment of death or when finishing the game. The old approach is a bit more limiting and frustrating. And also may encourage to end run too early only to have an EXM available at EXM kiosk in consecutive runs.
There's also a bunch of fixes related to unlocks. And while I tested them, I suspect that I could have missed something.
I base this on fact that all the features I implemented I tested once they were implemented and then while just playing the game. But not all as there are myriads of possible combinations of options. And there are still some bugs reported that I have to fix that I haven't encountered before. Some of the problems are because of various features overlapping in an unexpected way, while some are because things have changed.
Examples?
Crouching options was broken. When I implemented it, tested setting, saving, loading, generating levels. Worked fine. Then I added "no crouch" modifier, also tested it. And then I replaced "no crouch" modifier with a different one, tested the changes and it worked fine. But - I haven't removed the code for "no crouch" and later it was triggered by some other code which resulted in "crouch" option being replaced with non-existent "no crouch" modifier.
I don't regret adding too many options. I regret that I haven't came up with automatic tests to cover as many combinations as possible. Especially as things get broken after a while, when other parts of the code are changed. I still have to fix centipede that with "mean machine" modifier is broken and leads to soft-lock. I remember tweaking "mean machine" modifier for centipede as I wanted this modifer to make the fight much harder.
But back to what was fixed:
unlocks
"no crouch" option
"rotating elevators" in "breach" chapter when "no rotating elevators" option is chosen
fix for being forced into a wall after using a turret
creating new profile that was clearing savegames for the old one
various crashes (with one being very very specific about loading a savegame next to the train station in "the outer rim" when there was a platform bridge close to the starting room)
degree symbol being displayed incorrectly
Other important changes:
changed how memory is managed for music and narrative voiceovers: music is only kept in memory for particular level, narrative voiceovers are streamed (I chose keeping unpacked samples for music to not find myself with CPU being a bit more occupied with sound decompresion). The main reason for this change were some crashes I got reported by people playing on Quest (1) but not by my crash reporting tool nor the system. I suspected out-of-memory crashes, and although the reports were showing that there is still 200MB to spare on average, that "average" bit + no reports lead me to suspect OOMs.
added "swap joysticks" controls option to allow using right joystick for movement and left joystick for turning
improved visibility of exits for "beneath" and "breach". "Beneath" had only a very little red marker and "breach" didn't have even a tiny red marker, just a distinctive structure around the exit.
I have still a few bugs to fix, mostly gameplay related but also some functional. I might be also improving some functionalities - I'd like to fix the problem of inability to read play area while using Quest via airlink. While none of the existing systems is able to provide valid play area size and orientation, Oculus API allows to read raw boundary data and I should be able to find the most suitable play area using that.
I did also some work on PICO and Vive builds. More news on that should be available in the following weeks.
That's it for this week. It's one more thing, the roadmap that hasn't changed much since the last week:
Short-term goals:
Fixing bugs. I still need to replicate some rare crashes but right now it is mostly
Port to PICO and Vive. PICO seems to work really well using 5.6.0 update. And I've heard that 5.7.0 update improved the performance (before I did the recent changes). For Vive I improved dynamic scaling that it is much more responsive. Vive Focus 3 has enormous resolution and runs in 90FPS which requires some solutions that are not required on other systems (unless I would decide to run Tea For God on Quest 2 in 90FPS)
Achievements. The list is coming together.
Endless/tasks mode with three different maps and three types of missions. This has now a higher priority than "chapters" as it may bring more gameplay for the same amount of work as hand-made chapters. Especially that I will be reusing existing assets and adding more of actual gameplay rather than focusing on creating completely new things.
Add chapters that were not made for 1.0.0.
Long-term goals:
More maps and types of missions for endless mode.
Short stories that will be unlocking new stuff for endless mode.
Challenges with leaderboards.
Multiplayer.
v 1.0.2 (#340)
- unlocks in run-based mode can't be unlocked mid-run - all EXMs that were installed during game are available to be unlocked - added "swap joysticks" that swaps movement and rotation joysticks for sliding locomotion - fixes for unlocks menu - fixed "no crouch allowed" being replaced with "auto crouch" - fixed rotating elevators in "breach" when no rotating elevators were allowed - fixed crash when loading a savegame next to the train station and in there was a platform bridge close to the start of outer rim - fixed keeping player from walking through walls code that was actually forcing to be in the wall when exiting turret - fixed reading refresh rate for Quest Pro - fixed creating new player profile - fixed incorrectly displayed "degree" symbol - more visible exits on map for "beneath" and "breach" - lowered memory used by the game: - music is dynamically loaded (and unloaded) when needed - narration voiceovers are streams instead of samples
v 1.0.1 (#337)
Two bugs made it through. Both are now fixed.
crash on weapon nodes
pre-early ending when reaching the train station
Both features were tested but not tested enough.
The circumstances for the crash seem to be weird but the nature of the crash was quite straightforward.
The "pre-early ending" was due to an update to the demo version. Decided to end the demo earlier with more of "the journey begins" moment rather than "now you left the turret". And with changes, I was testing both versions. It was working fine but the timing could be better. Tweaked it and tested both versions again. And then I added a fail-safe for a very unlikely scenario in Demo. Tested the demo and thought that this scenario is so unlikely that without breaking the game internally, not even intentionally as a player, it may not happen, I haven't tested the full version.
I'm really sorry about that it this is a lesson that even the unlikeliest scenarios may affect other parts of the game.