During the last few months, I worked primarily on the in-VR beatmap editor. Unfortunately, this isn't ready for this release, yet. However, we also did quite a few technology updates and bugfixes that we silently pushed to separate branches dedicated to different Unity versions and eventually also (finally) updated to the new SteamVR Unity integration which has SteamVR Input 2.0. This lays the foundation for full Valve Index support. For now, it gives you the ability to re-bind input according to your preferences.
LIV Mixed Reality support is finally working again
Story Mode Level 1 / Paradise Beach has significantly improved performance and also looks better (the Ocean and sky in particular)
Slicing OctaDrops works much better now
The stats shown in Game Progression can now either use the legacy system (Steamworks), or our new server. For more details on what is changing here, see: Building Our Own Backend Server
Story Mode: Fixed the one event that was broken that prevented the "Knows The Secrets" achievement from being unlocked. This is secret is hidden in the tutorial.
Chronological Changes List
Updated to Unity 2018.4.3f1.
Removed old UNET (Unity Networking) code and promised myself to never ever touch a networking solution by Unity again.
Ported from using WWW to using UnityWebRequest; this should also solve some image loading hiccups in the Music Library.
Updated PostProcessing v2 from 2.1.4 to 2.1.7
Updated Oculus SDK from 1.29.1 to 1.36
Unity to Unity 2019.1.9f1.
Story Mode Bugfix: In Level 11, there were several fires where the background transparency was broken. Fixed.
Story Mode: Level 12 - this is a huge level but almost everything the player sees is at a large distance, so reduced lightmap resolution from 0.8 to 0.05 to improve baking time and significantly reduce memory consumption. This reduced the project asset
size from 750MB down to 40MB (in the build, the difference is much smaller but haven't checked the build size, yet).
Story Mode, Level 9 (Ice Desert): Optimized lightmapping for higher quality with lower memory consumption (this is also a huge area, and we have increased the detail right around the player, while significantly decreasing the detail in the wider area). This reduced the project asset size from 300MB down to 200MB. Altogether, the build size went from 6.3 GB down to 5.9 GB, download size from 2.3 GB to 2.2 GB. So that's nice.
Updated to Unity 2019.1.10 - this fixes the Toggle issue that caused our language selection to go crazy (I already had a workaround implemented but that workaround unfortunately didn't fix the issue as reliably as it should have).
Updated Volumetric Fog to 10.4
Updated HxVolumetrigLighting to 1.3.6e
Performance UI Polishing: Retro Clubbing and Triggered (available in Beat the Rhythm) have flashing lights that are always disabled when Flashes are disabled in the comfort settings. This could be confusing when the performance option is switched on but overridden by the photosensitive comfort setting. To prevent that kind of confusion, the performance Toggles are now disabled (non-interactive) when the comfort-setting has Flashes disabled, and an explanatory message is shown.
Updated LIV SDK from v0.1.0 to v0.1.5
Fixed LIV support
Fixed LIV-Issue: Progress from compositor showed up permanently in Mixed Reality because LIV SDK uses its own layer masks; fixed by adapting our approach (using VR-camera as base, and then adding/removing layers as needed, via two properties; we only need to remove one single layer)
Added Mixed Reality UI (LIV-logo, Mixed Reality label etc.) also to our Minimal UI because Mixed Reality might "kick off" already before entering "Streamer Mode".
Very nice: Using PostProcessing v2 instead of v1, bloom and color grading is now compatible with Mixed Reality. That is so cool!
Stage Paradise Beach / Story Mode Level 1: Massively improved quality of the sky while at the same time making the file size significantly smaller.
Applied similar changes to Level 2 ("Above the Clouds") and Level 9 ("Freezing Cold").
Removed the brief cleanup pause before and after songs because it was disorienting and should no longer be needed with Incremental Garbage Collection.
Time Dilation: For slicing, we had moved the Velocity Tracker into the blade - because that's usually what we want to derive velocity from. For Laserblade Time Dilation, however, the fun is in allowing intense rotations of the blades without speeding up time, and only speeding up time when the handle is moved quickly. To restore this feature, we now have two Velocity Trackers attached to the laserblades: One in the handle, for Time Dilation, and one in the blade, for everything else.
OctaDrop Orb Theme: Added proper physics for punched OctaDrops when they hit the ground.
OctaDrop Orb Theme: Added pretty decent physics for sliced OctaDrops when they hit the ground
Level 01 / Paradise Beach: Replaced PlayWay Water with Crest Ocean Renderer. Looks better, has much better performance, causes a lot less trouble.
Level 01 (Story Mode) / Paradise Beach: Major improvements to the look of the water; also fixed several issues in the environment (like, the beach falling off like a pool).
Retro Clubbing / Sci-Fi Attack: Fixed issue where fog was uniform instead of noisy. That bug had been introduced just recently.
Porting to SteamVR Unity Plugin 2.0 (SteamVR Input 2.0): Step 1: Package-ified SteamVR Unity Plugin 1.2.3 to make switching easier.
Performance Optimization: Removed roughly 0.5KB of memory allocations each frame.
Porting to SteamVR Unity Plugin 2.0 (SteamVR Input 2.0): Step 2: Switched to SteamVR Unity Plugin 2.3.2, fixed all the compilation issues (those were quite a few), adapted code to a simplified version of the actions. Works. Yay!
LIV Integration: Updated LIV-Logo to new style.
Porting to SteamVR Input 2.0: Step 3: Proper implementation of different actions (instead of faking them). We now use: InteractUI, Pause, Skip, LetGo, Scroll and Fire. Pause and Skip can be mapped separately for "playing". Fire should only be in the Action Set "gun" (for the gun mechanic) but due to an apparent bug in the Input system, added a fallback in the default Action Set for now.
Cleaned up the whole startup procedure: This fixes several warnings and errors during startup and made the whole thing more reliable.
Game Progression: Added an option to display the old Steam data.
Avatar System: Fixed a few issues, including a crash when selecting Jane. We had to remove the arms length setup. Eventually, we'll replace this whole system with something way better.
Updated Oculus Desktop from 1.36 to 1.38.1
Updated XR Legacy Input Helpers from 2.0.4 to 2.0.6
Performance: Minor memory allocation fixes (partially introduced with SteamVR 2.0)
Story Mode: Fixed the one event that was broken that prevented the "Knows The Secrets" achievement from being unlocked.
So this is kind of a huge one, because the last patch update was in June 25, roughly 9 months ago. We did post some updates to the alphadev channels and also beta channels but announced them only via our Official Discord. But this current version will probably go to the default channel in a week or two, so it would be awesome if you could opt-in to the alphadev or beta channel, try it, test it and let us know what you think about it (ideally in the forum to keep things organized).
This is a really long list, so here are some of the highlights:
Settings / Themes / Game Mechanics / Presets
This has been completely re-designed to make the different game mechanics easier to find and activate. Also, we previously had quite a few implicit changes in the settings (e.g. when you activated Laserblades or Guns) that did make sense when we originally introduced them but became pretty annoying over time, as development evolved (like, choosing guns would always activate the balloons - but actually shooting drones is more fun than shooting balloons ;-) ).
We have consolidated almost all the settings into one screen (Settings / Style / Presets & Themes), and have added a few presets that set up everything in a consistent way that hopefully makes sense. After activating one of the presets, you can still fine-tune everything according to your likes and dislikes. Here's the current list of presets:
We've had this in the game for a long time but polished it a lot during the last few months:
The explosions are now based on how perfectly you time shooting the drone. If the timing is perfect or near perfect, the explosion is very quick. If, however, the timing is a little off (a little too early, or a little too late), you get a longer explosion as a penalty. Before, the explosions were random and the longer explosions would unfairly obstruct the view. Now this is "by design" if your timing is off.
Also, all explosion effects were polished and optimized to work really well with the drone and gameplay.
The gun mechanic will still get proper support for sliders and spinners.
New Slider Visualization
This comes with the new OctaDrop theme (see below). We've had that theme in previous builds - but the slider visualization is new. It's true 3D: Sliders in the OctaDrop theme are now streams of the OctaDrop outline. ;-)
This now has its own hitsounds, also for sliders and spinners, and full support for punching and slicing as well as directionality. The OctaDrop theme will be the default theme for Beat the Rhythm but we'll also keep this as an option in Holodance as well. We're still polishing the OctaDrops and will make some of the mechanics more strict. But it's already close ... at least in our opinion ;-)
Improved Handling of Tempo Changes
Notes are now properly looking ahead so they use the tempo while they play for the buffered ahead spawning. Previously, the orbs were speeding up just when the tempo of the song already had increased. We need this for the original soundtrack of Beat the Rhythm which has quite a few tempo-changes, and even switches back and forth between 3/4 and 4/4 in one song.
This is currently only visible in the leaderboards that show up after a session. The leaderboard when you select a beatmap and the leaderboards in Story Mode are still the Steam Leaderboards, so currently, in some places, we have two different leaderboards, an old one, and a new one. That server not only has new leaderboards but will also let us do things like song ratings, beatmap ratings (in terms of "how fun is it"), and difficulty ratings and will also be used to host beatmaps you create with our upcoming beatmap editor. It will also let you do things like in-game "challenge me". The possibilities are literally endless, so this will evolve a lot over time.
Important: We might reset our backend server a few times until the release of Beat the Rhythm. But you won't lose your skill on such a reset ;-)
Scoring: Velocity and Directionality
In the first early versions of Holodance, the velocity bonus used the velocity on impact. Then, I thought using the maximum velocity between catching two orbs was a good idea. It wasn't. So that's reverted, and velocity on impact is what matters again. This is coherent with moving from primarily catching orbs to primarily punching orbs. You can still catch orbs - but punching is more fun and will give you the higher scores.
The OctaDrop theme also has directionality, so some of those drops will come at you with a direction (very short sliders in osu! beatmaps are converted into those directional drops). We had a rotation bonus but that never really felt right because how does wildly rotating your controller really matter in the game? Well, now that bonus is based on how well you are in tune with the rotation of the drop. Makes a lot more sense, doesn't it?
One really special thing about Holodance from the beginning was that you could also catch orbs with your head. One problem with this was that it gave you a bonus, so it does give you an advantage with your score - but not everyone enjoys this mechanic. So now, we're properly tracking which appendages you use: Two Hands (TH), Head and Hands (HAH), Head Hands and Feet (HHAF), Head Only (HO), Hands and Feet (HAF), Single Hand (SH), Two Feet (TF) or Single Foot (SF). And each gets its own leaderboard. While in principle, you could play each map in any way, maps designed for a specific gameplay style will also be preferable, so Beatographer will let you say what style a map was designed for. With guns, laserblades and bow and arrow, there are only single hand and dual wielding, or in the case of bow and arrow, obviously, only single hand.
We have started localization. We have quite a bit of Chinese already done, Japanese, Korean and Russian are there but very incomplete, and the translations we have were done using Google translate (so expect some weirdness). As many of the texts are still changing, we'll do a professional full translations when things have stabilized a bit.
Game Package Size
The game package has become much smaller, going from 9.5 GB down to 6.3 GB.
Lots of Bug Fixes and Unity Updates
A lot of bugs were fixed. A lot of new bugs were introduced by incrementally updating Unity, and then fixed (either by more Unity updates, or by implementing workarounds). But using Unity 2018.3 significantly improves the development process, especially due to the new nested prefabs workflow. I wish I had done this much earlier.
Also, ported PostProcessing from v1 to v2. As the color grading set up works differently in v2 compared to v1, there will be some changes in the color grading. Also, v2 has a new bloom effect that provides higher quality, at the cost of lower performance. But it has a "Fast Mode", which you can activate via the performance settings. We have both versions in a current builds, so you can easily switch between the two. But eventually, we'll remove v1 from the project.
Full Chronological Changes List:
Sliders: Now also play a hit sound the first time you touch them. Not having this was mildly disorienting.
Sliders: A completely new way to visualize Sliders - they are now streams of the OctaDrop outline.
Directional Drops: Part of the black magic hackery for the tracers is that very short sliders are now automatically converted to directional orbs.
OctaDrops: Moved spawning particle closer to player to prevent interference with screens.
Leaderboards: We had two release on alphadev with the new OctaDrops where we had storing your scores to the leaderboard disabled (because the new OctaDrops tracers, which are a new visualization for sliders, were still very experimental and I wasn't perfectly sure they wouldn't give you ridiculously high scores ;-) ). This is all safe now, so leaderboards are stored again.
Orbs / Drops / Flying Notes: We did some major refactoring to clean up years of adding cool things and make the whole thing much more modular. Still not quite perfect working towards that.
Directional Orbs: Moved logic that converts sliders into directional orbs from our new Tracer implementation to the beatmap parser which is a much more appropriate approach and solves several issues we've had previously.
OctaDrops: Orbs that were missed now properly dissolve instead of just disappearing; or worse, bumping to the floor causing plenty of physics action (we still have this for the old orbs).
Core Engine: Notes are now properly looking ahead so they use the tempo while they play for the buffered ahead spawning. Previously, the orbs were speeding up just when the tempo of the song already had increased.
Directional Orbs: We now use both, a minimum time and distance for sliders to determine whether we convert them to directional orbs. Only if both criteria are met, the slider is converted to a directional orb.
Core Engine: In some maps, we have fairly massive streams which both is a problem for visibility of the next notes and also can be a performance issue. For that, we now keep track of the distance and time between the current note and the next note, and if they are too close, we can use alternative visualizations. With this, we could even convert streams into sliders, which is more appropriate when we focus on punching instead of catching (with orbs; obviously you can't punch a slider).
Flatscreen UI: Fixed a bug that we have had in the game since forever which caused sliders and range sliders (the UI element) to not work when trying to control them via mouse. The problem were our UI audio events that didn't properly bubble the events. Interestingly, this only caused an issue with dragging - everything else always worked just fine.
OctaDrop Tracers: Now flash in and out like the full OctaDrops.
OctaDrop Tracers: Now have much improved particle effects for tracers - instead of emitting a turquoise old-style particle effect at the end of a tracer, you now get particles emitting from the catchers based on the catcher velocity during following the tracer, and one final effect based on the completion, and emitted from the catchers, at the end.
Main Score HUD: This went through a few iterations, from the "big smiling face" via the more sci-fi style HUD that we use in all the new environments. The truth, however, is that the tech we used for this was never really designed for that purpose (it was a good test-case for what can be done with our ScoreFlash Asset Store package, though). For the new Beat the Rhythm "Triggered" environment, we now have a shortcut that simply puts the information into UI elements that are part of the environment. This is not quite as flexible, so the old approach will remain for where we need the flexibility. But step by step we'll move some of this UI into appropriate styles and places for the environments where we can do that, which are most.
Main Score HUD: Fixed small glitch that caused the score per drop / slider to not be shown for sliders until the next note was caught again, after a note was missed (only in the special new shortcut approach).
Flatscreen UI Part 2: Range sliders were actually still broken, the fix for normal sliders didn't work for those. Reason was that for some unknown reason a OnPointerUp was sent, and Range Sliders used that to reset the state. They no longer do, and so now they work.
Localization: Started globalizing (= preparing for localizing) the UI. Used Google Translate to Chinese for testing. This is a pretty big one, including re-baking some of the fonts - there is still a lot of work to do ... but I made some really significant progress.
Beat the Rhythm / Beat Challenge: Fixed Gun Mode (using drones and showing the orb score huds). Particles still don't show up.
Play Area Calibration: Combined World Rotation / Movement and UI Rotation into one Element, added reset for the rotation (for some reason, only the position got reset, essentially making reset not have any effect on world/ui rotation). Also added a Recenter-Button - but only for hardware that actually has Recenter (we currently only use standing / room-scale setups).
Localization: We're currently in the process of localizing the whole game. We won't localize the voice acting in Story Mode for now, but all texts in the UI and messages during gameplay will be localized. For now, we start with Chinese. Japanese, Korean and Russian will follow very soon. If you want the game in your language, please let us know!
Analytics: Slowed down sending some of the analytics so they will hopefully get through more reliably.
Performance: Significantly reduced allocations, especially with the new OctaDrop theme and the new tracers.
Music Library: The "range sliders broken on flatscreen UI broken"-fix caused a new bug in VR, where clicking a button in a list would start dragging and basically scroll to the beginning of the list on each click. That issue only was on the alpha channel but boy was that an annoying one. Fixed.
Music Library: There was one super-annoying bug that sometimes occurred where you'd click on invisible panes and instead of getting what the button you clicked on shows (e.g. Favorites), you'd get what the button at the same location in another screen shows (e.g. Genres). This should be fixed now. Also, panes reacting to pointing and button presses when they are actually hidden below you should no longer happen.
Community Server: To cut dependencies on Steamworks, we are building our own community server for leaderboards, player state, achievements and also most popular and so forth. This is a larger project but we're making progress - players are now registered with the server ;-)
Gun Mode: Removed trails and multiplier rings from gun. Those looked pretty dumb and didn't really serve that much purpose.
osu! beatmaps: Fixed a bug that kept the slider velocity multipler of inherited timing points when there was another timing point. osu! handles this differently: Each timing point resets the multiplier to 1x and you need another inherited timing point to change it (if you want to change it). This had created issues with our Eternity map (Eternity is the last song of Beat the Rhythm and now I'm kind of glad I'm still using the osu! beatmap editor to build this one because our own, native beatmap editor isn't ready, yet)
osu! beatmaps / procedural maps: Fixed a few pretty nasty issues that caused wrong counts of total notes, especially with the new OctaDrop theme, which could, among other issues, trigger a "full combo" in the middle of a song.
Difficulty: This is a rather "hot" subject because we use the calculated difficulty as basis for the skill and style level. There were some rare cases, where the difficulty would use outdated data. While we still do display this outdated data, we make sure to use the actual mapping data, with any tweaks (e.g. the quick repeaters replaced with actual orbs in the OctaDrop theme), for the final calculation that will be used to determine skill and style levels.
New leaderboard UI: Finally upgraded the leaderboards to our new UI style (we had this integrated with the new UI style for quite a while - but it was very very hacky). The Steam leaderboards, however, still use the old UI (and will eventually disappear).
Smart Leaderboards: The new leaderboard lists are simplified and have less information and automatically show the most relevant entries: If you are in the top 10, the top 10 are shown. If you are below that, the top 1 and, depending on the number of entries available in the leaderboard, top 10 entry are shown, then the two ranks directly above you, and the ranks below you. This is linked to the new leaderboard community server. The leaderboards also show how your score has changed compared to your last session.
Tracked Appendages: One really special thing about Holodance from the beginning was that you could also catch orbs with your head. One problem with this was that it gave you a bonus, so it does give you an advantage with your score - but not everyone enjoys this mechanic. So now, we're properly tracking which appendages you use: Two Hands (TH), Head and Hands (HAH), Head Hands and Feet (HHAF), Head Only (HO), Hands and Feet (HAF), Single Hand (SH), Two Feet (TF) or Single Foot (SF). And each gets its own leaderboard. While in principle, you could play each map in any way, maps designed for a specific gameplay style will also be preferable, so Beatographer will let you say what style a map was designed for. With guns, laserblades and bow and arrow, there are only single hand and dual wielding, or in the case of bow and arrow, obviously, only single hand.
Hitsounds and Effects: The OctaDrops and Laserblade/laserbeam deflection have new hitsounds, and the gun also has a new gun sound.
Gun Mechanic - Shooting Drones: The explosions are now based on how perfectly you time shooting the drone. If the timing is perfect or near perfect, the explosion is very quick. If, however, the timing is a little off (a little too early, or a little too late), you get a longer explosion as a penalty. Before, the explosions were random and the longer explosions would unfairly obstruct the view. Now this is "by design" if your timing is off.
Gun Mechanic - Shooting Drones: All explosion effects were polished and optimized to work really well with the drone and gameplay.
Tracers (Sliders) & Spinners: Added possibility for looped sounds while following tracers and spinning spinners. For now, this is only used by the OctaDrop theme and we use the same loop for both.
OctaDrop Orb Theme / New Slider Visualization: Fixed a bug that caused sliders where you didn't catch the head caused a miss, breaking the combo. Finally, the new OctaDrop theme is fully working as intended ;-)
Added a little "cleanup phase" before and after each song, to avoid nasty things (framedrops) from happening while playing songs. This drops into the compositor; we'll probably remove that once we switch over to Unity 2019.1 which has incremental garbage collection.
File Scanners (MP3 / osu): In earlier versions of our file scanners, there were quite a few cases that could cause inconsistencies in the data, so we had a "do a full rescan every week" logic, that would make sure that if there were inconsistencies, they would be remedied within a reasonable time. That was added a long time ago, before we had a button to do a "Full Rescan", which does the exact same thing but by clicking a button. Also, inconsistencies should now be rare and really only occur when you change the library sources (add or remove local osu library, or local music and so forth). Long story short: We don't do automatic full rescans just because a week has passed. If you change the sources, do a "Full Rescan". Also, if you run into "Beatmap not found" errors when trying to start a song - do a "Full Rescan".
Community Server: Prepared logic for popular and recently played.
Story Mode: Fixed a long standing bug that caused all start/stop events to be called twice in Level-01.
Music Library: Fixed issue where locally loaded images were flipped upside down.
Music Library: Fixed a few more issues with image loading, some of which were introduced during the current iteration.
Leaderboards: Fixed problem that caused player avatar images to not be loaded.
Fixed issue that caused total notes to be off by one (one too few), which also resulted in full combos being triggered when players missed exactly one note, and this also threw off the leaderboard logic.
OctaDrop Theme: Polished hitsounds.
Player: Fixed issue that player height and player chest height (this is where the target area is) was not stored correctly.
Music Library: Fixed RecentlyAdded sorting issue (the most recently added songs were at the end of the list).
Audio Files (osu! beatmaps and local music): Fixed an issue that would have songs muted half way into the song. This was fairly rare but it did happen with a few osu! beatmaps, in particular when the audio files were mono. This should no longer happen now.
Music Library: Improved error message when beatmap files are not found (which is usually a result of changes to the folders and no 'Full Rescan' having been done).
Leaderboards: Fixed nasty issue that broke the "per beatmap" leaderboards
Added initial Oculus SDK support, using Oculus Integration 1.32.
Made controllers work properly with native Oculus support (tracking, position offsets, buttons).
Made haptic feedback on controllers properly work with native Oculus support.
Proper support for Dash (Holodance automatically goes into pause when Dash is activated).
Adapted loading screen to native Oculus SDK ... but that doesn't work too well because OVROverlay apparently is kind of buggy and also it seems the Oculus compositor lacks quite a few nice features that the SteamVR compositor has (fading things in and out conveniently, suspending rendering, working reliably).
Oculus Guardian system is now properly used to determine the Play Area.
Fixed broken Player Height check when using native Oculus SDK.
Now the haptic intensity slider also has the expected effect when using native Oculus SDK.
Fixed several issues in the loading screen when using Oculus SDK.
Fixed remaining issues with loading screen when using Oculus SDK: The progress and floor hadn't shown up; we had used a single texture for the logo instead of the 3D multi-billboard logo we used in SteamVR; there was no fading (in SteamVR, we crossfade, with Oculus SDK, due to limitations in the API, we have to fade out, switch to the compositor, then fade back in); and the overlays were in the wrong locations when entering levels where the player platform is not located at the origin (e.g. Paradise Beach).
Initialization on Game Load: Avoid unnecessary wait times.
Loading Screen: Fixed a really annoying bug that caused one progress bar to start up with the Beat the Rhythm color theme.
Music Library: Added UI-based universal keyboard. This still needs more input options but at least it's a start.
Native Oculus SDK: Fixed head gameplay objects not being tracked when not using SteamVR.
Music Library: Fixed theme-issue with keyboard that caused exception spam which also resulted in severe performance degradation.
Fixed automatic performance settings for 2080 (Ti), 2070 and 2060
Ported project to Unity 2018.2.20f1 - it was a bit of a hassle but it seems that almost nothing broke, so that is quite nice.
Ported project to Unity 2018.3.3f1. More hassles, and a few things did break (including a few fairly nasty crash bugs), but it seems there's nothing we can't handle.
One of the things that caused crashes was that we frequently used MeshFilter.mesh instead of MeshFilter.sharedMesh, when actually not really needing a new Mesh instance. Changing this not only fixes those Unity 2018.3 crash bugs but also slightly improves performance.
Story Mode almost completely broke in 2018.3.3 ... fixed all issues that I found: No audio, no voice acting, first orb thrown by Pritvitej didn't work, high five, fist bump, stroking and tickling didn't work, and a few more.
Another crash occurred more sporadically when storing the sessions; this is now hopefully also fixed.
Changed all Rigidbodies to "Continuous Speculative" which should be both, faster and more reliable.
Removed Slider/Tracer Themes because we only had two themes, and the non-default one was broken.
Added option to disable the orb trail particle effects (Themes / Orb Trails (Particles))
Ported project to Unity 2018.3.5f1, which fixed one extremely nasty "system crash" bug that happened both with the built game and the Unity editor: When closing the game, it would freeze for a while, then other running applications would randomly crash, the screen would go black, and usually, a hard reset would be required to continue working. This bug was specific to Unity 2018.3 and didn't occur on 2018.2 or 2019.1.
Ported PostProcessing from v1 to v2. As the color grading set up works differently in v2 compared to v1, there will be some changes in the color grading. Also, v2 has a new bloom effect that provides higher quality, at the cost of lower performance. But it has a "Fast Mode", which you can activate via the performance settings. We will have both versions in a few builds, so you can easily switch between the two - but eventually, we'll remove v1 from the project.
Major shader and shader keywords cleanup.
Major texture cleanup; took full game from 9.3 GB down to 6.3 GB. This should also speed up some of the level (environment/stage) and avatar loading times.
Using current velocity instead of max velocity (since last punch) for calculating the bonus. Using maximum velocity made sense when "catching" - but we're back to punching, and there, the current velocity on impact is best.
Made laserblades shorter - 80cm are long enough (that's just the blade).
Rotation is now based on direction of punch / slice vs. direction of the orb. With all themes except OctaDrop, the expected direction is "forward" (the opposite direction into which the orb is flying).
Finally, finished implementation of slicing.
Completely re-designed "Themes" UI: Added six presets (Casual Mode, Catch Orbs, Punch Drops, Slice Drops, Shoot Drones and Shoot Balloons). This also no longer makes arbitrary changes when changing the mechanic (it did this before - that's what the defaults are used for now).
just in case you missed it: Holodance takes part in the Steam Lunar New Year Sale, so if you don't have it, yet - now's a really good time to get it at a 50% discount (so that's $9.99 instead of $19.99). Please let everyone else know! ;-)
And those coming in from the sale: The default branch has received no updates in the last 6 months because we've been building our own server backend ... but we have a pretty long list of changes, including the long awaited native Oculus support on the beta-branch.
So, if you want to try something new, or if you use a Rift - make sure to opt-in to the beta. If you have never opted-in to a beta, check the Product Beta section in this guide.
A lot of work went into the Octadrop and Guns game mechanics, so be sure to check those out! Also, we're getting new leaderboards :-)
If you are really courageous, try the alphadev-branch: That's the bleeding edge of development and has been updated almost daily during the last two weeks.
This was (and still is) a big one! I actually knew we needed our own backend server for a very long time: One reason Holodance is still only available on Steam is because I heavily relied on the Steamworks backend for leaderboards, achievements and keeping state for players (i.e. progress in the game, mostly for Story Mode). In order to let you play with people on other platforms, like Oculus Home, Windows Store or PlayStation Network, we either need to use a third party service (there are some, like PlayFab or GameSparks, or roll our own.
With our second game, Beat the Rhythm VR, we not only want cross-platform but cross-game: All the community features, like leaderboards, song and beatmap quality rankings, session streams and so forth should be consistent and shared among both games, so that we can have one (hopefully) large community for both games, instead of two smaller, isolated player communities.
And there’s another thing: I’m still working on our own in-VR beatmap editor and the fun with that really only starts when you can conveniently share your hard mapping work with your fellow players. Which opens a whole other can of worms and tricky challenges that need to be faced.
Having our own backend server solves a lot of these issues; even if solving some of these issues makes developing that backend server significantly more complex than just a leaderboard-system.
A little Personal History
Before I started working on VR games full-time in 2015, after several years of doing it “on the side” (since 2007), as freelance software-engineer I had a really decent income. Which was really cool! But that was due to taking whatever software-engineering project came along. That was still kind of fun. But when I’m totally honest, this wasn’t really what I was here for, and I had known that for sure at least since 2007 … but really, as a hunch much much longer. Most of my time, I spent working with databases, Web frontends, early Java days mobile apps, some of which I developed from scratch on my own, some large and complex systems that had grown over many years, that I worked on in small teams.
One reason it took a long while to get started with this was because I knew I’d be facing some old demons when getting back into this, and I honestly wasn’t looking forward to that. While I know I can do these things, and actually do them quite well, I’d honestly rather have paid someone … except I know how much that would cost, and we have to be super-careful with our budget (2018 was twice as good as 2017, and 2017 three times as good as 2016 — but we* still have very little liquid cash and roughly €100K open loans … also, it’s not so hard to double and triple your revenue when you start from a base of roughly €10,000 … per year … revenue).
*we currently actually only means me, working from my basement to be able to sustain the company
When I finally did get started, I first spent a lot of time figuring out which technology stack to use, and learning to use that technology stack. That was fun — I love learning new things, and in terms of server backends and Web development, I was living at least 10 years in the past, probably more like 15 years. Eventually, I got it rolling and we have now had the new leaderboard and progress tracking on the alphadev branch of Holodance for a little while, we also already use it for a little side project based in Beat the Rhythm that I did for money called Beat Challenge or 节奏激战 (this one’s currently only available in China, for the Lenovo Mirage AR headset), and the internal builds of Beat the Rhythm. This is on the beta now for Holodance, so by the time we release Beat the Rhythm, it will have been in production for a little while (you may have noticed that we just pushed the release of Beat the Rhythm from “Fall 2018” to “Spring 2019”).
It’s done … well … almost!
(and we all know what that means ;-) )
The hardest parts are done. Obviously, there is still a lot more work on this end, but I am super-happy that the foundation is there and I can now build out the various systems step-by-step, one at a time.
There was a price to pay: One of the things I really enjoy about developing games is that it’s an incredible creative and lively process. Sometimes, I have an idea of my own, or a request coming in from a player in the middle of the night (Hello Discord), start coding in the morning, and can play test this new idea in the afternoon, to share it with you in the evening. Then, of course, there’s usually several days, sometimes weeks, sometimes months of polishing until it behaves in the most fun way — but it’s usually a fun process that involves designing game play mechanics, coding, visuals and effects, sometimes audio.
I have been missing that during the last few months, and after my last meditation retreat, I took a little break from the server work to play with something new. That will go into Devlog 3, so stay tuned!
One (fairly big) concern …
One final thing, also to get a little discussion going: Until recently, I wanted to use the game play data that we have been keeping on player’s PCs to rebuild the complete history on our server. In other words, upload your game sessions, rebuild the leaderboards from that, basically “migrate” everything. Technically, this is possible, and I could still do it … but there are a few concerns:
First of all, it does add a lot of complexity. There are a lot of things to be taken care of, and it would add a significant amount of time just to set up a reliable synchronization mechanism that can handle years worth of gameplay data without interrupting gameplay. We also changed the data format a few times, so that’s also something to be careful about.
Then, that data is not necessarily complete or reliable: You can disable recording the movement data, or you might have deleted the GameData folder — when it’s gone, it’s gone. So, the restored history would not be as complete as one would wish for.
A related issue: Without the movement data, there is a bit of potential for cheating by messing with the session data. With the new system, we’ll only record your session for the leaderboards if you opt-in to including the movement data. That way, cheating becomes near impossible. But handing that for lots of past (and partially incomplete) data is quite tricky.
Finally, there’s the privacy issue: I honestly don’t feel comfortable uploading up to three years of gameplay sessions to a new system without asking (and under current EU privacy laws, that would be illegal, too). But when I ask, I kind of invite people to cheat (say “no” now, mess with the data, then say “yes”). This is much easier with current / future data that is generated while playing.
So, at the moment, I lean towards making this a fresh start, probably even with a few resets during beta, to be able to polish how we store things without having to carry the burden of migrating. When I made some changes to how scoring works, player feedback on “wiping the leaderboards” was fairly positive — Holodance is still in Early Access, Beat the Rhythm not even released, yet, so that kind of thing is not totally unexpected. But still, it’s something I’m not taking lightly (which is also the reason why I haven’t updated the default-branch and only did alphadev- and now beta-updates for about six months).
When we started developing Holodance, which was originally called "Holodance Episode 1: Dancing with Dragons", after a few early prototypes, we fairly quickly moved into what is now called Story Mode and then, a lot of time went into building environments, modeling and animating dragons, voice-acting, making it all work together.
Of course, we also did polish the actual gameplay mechanics, added the target grid, added various ways of showing you how your score came about and even added orb themes and orbs with different shapes and materials.
But there were always a lot of other pressing things that needed to be done: Free Mode, properly handling osu! beatmaps, a music library so you could conveniently find music that you enjoy playing. Procedural mapping. More environments. Laserblades, guns ... lots of stuff a lot of people (including myself) enjoy.
Long story short, for Beat the Rhythm (and most of this work also immediately goes into Holodance), I'm kind of going back to the drawing board - with almost three years of VR rhythm game development (and playing ;-) ) experience. What I'm striving for is figuring out the most fun ways to interact with the music - and building the design and visual effects (and later also audio-effects) around that.
I have already talked a little about the new "orb theme" that we're building for Beat the Rhythm, which is also already available in Holodance in the V0.9.0b10 release notes.
Here's quick look a little tool I'm building to improve iteration times, test various color schemes and different ways of "dealing" with those orbs (if you click it, you get to the full YouTube video):
Let us know what you think in the comments!
Full Release Notes
Beat the Rhythm: Small Fixes in BtR Octagonal Drops (now called OctaDrops) - sliders and spinners are no longer completely broken with this theme but they are still using the old style and logic; that will change soon (and be also available for the old orb-themes).
Fixed file paths: Originally, we kept everything next to the game folder - but this does not work on all platforms, so this was now changed to a more appropriate location. Existing game installations should not be effected (spoiler alert - they were and the change that made this happen went live with the previous release, ooops :-/ ).
Cleanup: Removed "resources" which are automatically included in the builds, even if not used or not even working on a given platform, quite aggressively. I had done some of this before - but unfortunately, those changes got reverted in one of the updates.
Fixed file paths 2: Due to an earlier change, Configuration.json could land in Holodance_Data instead of the main game folder (the parent folder of Configuration.json). This no longer can happen - we now use the game folder again, and also do some cleanup in case players had run this version. If you made changes in Holodance_Data/Configuration.json and also had the file in the original location, Holodance will use the original file again and clean up the one in the wrong folder. If you only had the file in the wrong folder, Holodance will move it to the correct location and use it from there.
Beat the Rhythm "Octagonal Drops" / Octadrops: Major work on making appearing, disappearing and slicing those octagonal drops look awesome.
This is another fairly small release but it fixes one important issue and adds something fun:
It's kind of common to use 32-bit integers to store scores. In fact, it is so common that this is also how they are stored in the Steam leaderboards. The problem: We keep track of an accumulated score, each session can give you up to a few million, and (this is not a problem but awesome): We have some very active players. So, currently, three players "hit the ceiling" when it comes to the accumulated score: MechanicaL, koolaide95 and liqiyang.
This version changes how that score is stored internally, and also added a little hacky patch to at least display the correct score in-game, even when it's above 2,147,483,647 (maximum value a signed 32-bit integer can have).
While I was at it, I also added a first version of our "Game Progression" page:
The numbers in parenthesis are your rank in the leaderboards ... and yes ... we've had Style and Skill leaderboards for a little while but they are not shown in the game, yet.
You can view your progress at any time either via Pause or Game Settings:
... and ... I figured you'd usually want to see this right after playing a session, so I also included this pane in the after session stats, and re-arranged the layout a little:
So, while this is still kind of a small update, I hope you'll enjoy this new feature. Eventually, Game Progression will also let you access various leaderboards (which will also get a major visual polishing round), become more graphical and give you more convenient access to the different game mechanics.
Meanwhile, I'm also working on native Oculus and Windows VR (aka WMR) support, and multiplatform and making very nice progress there as well.
Full Release Notes
Accumulated Score: As we were using integers to keep track of the accumulated score (32-bit signed, to be precise), the maximum possible accumulated score was 2,147,483,647. We currently have three players (MechanicaL, koolaide95 and liqiyang) who hit that limit. Internally, this update moves tracking that score to a floating point value, which lets us go into numbers of any size - at the expense of some precision. The problem: Steam's leaderboards also use int. But with a little hack, we can display your actual score even there.
Game Progression: At any time via the settings, and also after each song, you can now check some progression stats: Your accumulated total score, how many notes you have caught (orbs, sliders, spinners), how many sessions you played (playing the same song multiple times counts multiple times), how many full combos or perfect sessions you have had, how often you started the game, and your current skill and style level, as well as the last skill / style level. Accumulated score, and skill and style level also have your current rank in the leaderboards.
So, this has been kind of an embarrassing one, tbh: I love Mixed Reality, a lot, and we have done plenty of Mixed Reality videos in the past. But during development, I don't always get to to MR-stuff ... and it turned out that both our 3rd party Mixed Reality integrations (LIV and MixCast) were both broken. Sorry everyone!
The other thing is something that during my vacation, I realized that Beat the Rhythm (and optionally also Holodance) might become much more interesting if we allowed beatmappers to define orbs for specific hands (as it was introduced by Audioshield), and specific directions (as it was introduced by BoxVR). Obviously this doesn't mean that we'll drop our orbs that you can take with any hand, in any direction ... but the "new thing" is not even an orb anymore. It's modeled as an octagonally shaped drop:
While we may still polish the design, the idea should be quite obvious: Due to the drop-like shape (which has direction), which is emphasized by the outline, the direction is immediately obvious without needing arrows or anything like that. Also, if you have followed the development of Holodance for a longer time, you noticed that we added outlines around the circles because we had visibility issues in bright environments. This shape doesn't have those issues.
One thing you don't see here, yet, is that we can also place symbols for 2x, 3x, 4x, long combo, almost full combo and combo. Those will be very simple (two dots, three dots, four dots, like dice, and a more or less filled square) and will be placed depending on the direction so that they are always inside the dark area (and with the same color as the outline).
With osu! maps, in many maps, there are a lot of very short, straight sliders that never really worked well in Holodance (they were basically just orbs in terms of gameplay). Those will become directional drops. The others will be straight (like the center one). Also, we have 5 colors, so head, hands and feet can be "assigned".
A very early prototype of this new "orb theme" is in this build - and while this is quite early (don't play this with sliders or spinners, yet, it's broken for those), I think you'll like the "physicality" of the behavior.
Full Release Notes
Orbs will be Drops: Well, not always, but a work in progress "orb" theme is now available in the Theme selection - it's called "Beat the Rhythm 2" and either play it with the Casual mechanic, or manually disable Sliders and Spinners if you want to try this.
Added a Privacy button to Pause and Settings that for now lets you opt-out of Analytics and get the data that has been collected. Eventually, this will become its own area with more settings - especially our upcoming community features will be quite interesting in that regard.
LIV SDK Integration: Updated to SDK version 0.1.1. Also fixed an issue with the foreground transparency layer.
MixCast Integration: Fixed issue that the MixCast button didn't show up in Streamer Mode even when it should have showed up. The way this works: You need to have either a 3rd controller or a Vive Tracker, or a driver that emulates that third controller / tracker active. Then, when you activate Streamer Mode, and activate the "Mixed Reality" camera, the MixCast button will appear.
Music Library: Fixed another issue that could cause caching to fail.
Music Library: Random now immediately delivers 7 songs instead of just one.
Music Library: May have fixed the issue that caused panes to go crazy after songs (disappearing, being stuck under the play area). This issue happened sporadically before, and I haven't done the "full big refactoring" that was supposed to fix this issue, yet ... but I may have found a single cause that triggered most of these issues, and if that really was it, it's now fixed.
Removed Unity Analytics for now, to comply with GDPR. UT has released an opt-out plugin just today but I kind of doubt that this will work reliably for VR and I'm leaving for a vacation in just a few hours. Also disabled HW statistics.
This is a fairly small release and I'm pushing it immediately only because it should fix the audio-stuttering that we've had in the previous release, which caused us to revert to a version before that. In case you still experience audio-stuttering issues, please let me know!
This version still doesn't work with SteamVR beta but Valve is aware of the issue and we know the cause already. From the looks of it, it's something that they will fix in SteamVR / OpenVR, and so far, I haven't found a way to work around this issue from my code. Valve fixed the SteamVR beta crashbug with SteamVR Beta Updated (1526522336)
Update 2018-05-17: There was an issue with caching - that is now fixed in this same release. I did a "hotfix" ;-)
Full Release Notes
Level 07 / Submarine Nightmare: Reduced how often the submarine shows up - before, it was about once every 45 seconds. Now it's only once every 4 1/2 minutes.
Level 11 / Asteroids: The Asteroids originally just moved and eventually would distribute into outer space. Now, they re-appear after exceeding a maximum distance. This can cause asteroids passing through each other close to the player but that seems like less of a problem than eventually, all asteroids being gone. Adding collisions between the asteroids, while certainly being quite interesting, would create quite a few problems so we don't do this for now ... but maybe some day.
Leaderboards: We are now shadowbanning in-game leaderboard entries by players that cheat. If you still find any leaderboard entries that look like something is wrong, either in the accumulated scores, or on a specific beatmap - please let us know (screenshots with the title visible help a lot finding those quickly).
Performance Settings: Anti Aliasing setting is now persistent.
Mutant Club: Fixed issue with light textures that were causing little "circles" appearing mid-air.
UI: Pushing UI back into VR now works without workarounds (pause / unpause did restore it before - but that's not needed anymore).
Fixed Audio Stuttering issue
Fixed issues with the old "smiley-style" Score HUD.
... because it will crash Holodance on startup. This does not happen with the current default (non-beta) SteamVR branch. I'm filing this with Valve and will try to come up with a workaround. The crash does not happen immediately but during initialization, so we're probably calling something in OpenVR that worked before, and now no longer works. Other games may or may not be effected depending on whether or not they call that broken function (I don't know which one it is, yet).