Finally an update is here! This update focused on equipment systems, delivering content more deliberately, and code cleanup/refactoring in preparation for open-source.
Here's the change log:
Terrain and grass was vastly optimized, terrain details no longer render in reflection probes or Mirrors. This was an improvement of 30ms during reflection probe updates. And slight performance increase on mirrors. Terrain will have some mismatching layers while we clean up some of these broad optimizations.
Jigglebones and softbody physics now run on a partial fixed timestep, should keep them looking consistent at low framerates.
Graphics memory footprint reduced by around 400mb by deleting unnecessary shaders.
Decal system rework and optimization, I had an epiphany when I realized GPU's automatically solve memory fragmentation problems. Don't optimize when you don't have to! Now it's stupid simple and stupid fast to decal basically everything in the game. (Except terrain, terrain is impossible to decal due to how hardcoded they are into Unity...)
Added a seed extractor! It barely works, but it serves its purpose well enough as I focus on some other aspects.
Added seeds and plant types for every type of fruit, most of them are stand-ins, though they work! I bet you can figure out where you get the seeds.
Items now have big indicators that help you find them in grass or in trees, finding fruit has never been easier!
Reduced the scale of lots of the farm so it's a little more sane, it's probably going to take a few more passes to get the scale of things dialed in.
Physics animations now use derivatives of the animation curves to figure out their velocities. They're much more sharply animated now-- though the hands still flop around. This'll probably be tweaked for quite a bit more until I get happy with it.
Fixed GenericInflatables from being unable to translate or rotate jiggleboned bodies (balls now properly drop when they get bigger).
This is a big one: Kobolds can now have equipment, and they have equipment slots. All dildos are now equippable dicks.
Customization options from the main menu has been pared down, customization is now primarily a gameplay and loot feature. If options have been removed that you wanted, you'll have to find the corresponding customization feature within gameplay.
4 new kobold dildos, all being equipment that can just be plopped on by any Kobold that tries to "use" them.
Construction hardhat, and nipple piercings as equipment. Currently cosmetic, though it opens the path to lots of other kinds of cosmetic customization!
All equipment can be found as loot by exploring the world for chests. Keep an eye out for them!
Penetrators' shader has been upgraded to do some bezier curve adjustments to make them look malleable, and to correct for misalignment. This also allowed for physics constraints to be loosened, it looks and feels pretty good. Though probably will be iterated on continually as I learn more about it.
Networking refactor: It's only half way done, but I realized I probably shouldn't be over-optimizing things by writing custom events and managing the cache myself. Most of everything has been converted back into basic Pun observables and RPC calls. Player configuration is now done through Pun's PlayerCustomProperties feature. The few things that haven't been refactored are still pretty unstable. (Animation stations, and attachables like flasks). Over the next couple days it should get better and better as I get more familiar.
And that's it for now! Something to keep note of is that generated kobolds also have the pared down generation, and they have no way to equip different equipment currently. This will be fixed very soon, but for now you'll have to live with just being able to customize your playable kobold.
Unity upgrade from the 2019 LTS to the 2020 LTS! This comes with a variety of benefits.
Screen-space Ambient Occlusion is back, enabled by default in the Graphics Settings.
Dynamic Bones asset has been replaced completely. This new in-house jiggle bone system has trouble with completely inverting bones sometimes. Though allows for squash and stretch!
VertExmotion asset has been replaced completely. The new in-house softbody physics is simpler and more efficient.
DoozyUI asset has been completely replaced, this includes icons, button click sounds, animations, and other things. UI is much more static now, though still works!
Amplify Imposters was completely replaced by simple hand-made imposters. They have much less fidelity, but they can be open-sourced!
Map has been replaced with another work in progress by Firgof! This one uses Unity's built-in terrain which we're still getting used to. Things might be unoptimized for a while as we figure things out. Make sure your computer meets the recommended specs on the store page!
Player movement rework, now it's proper source b-hopping! Channel your phoon to go fast. A speedometer was included to help me debug it, and it'll stick around for a short time.
Complete ragdoll physics rework. I spent a lot of time flipping random switches on the black-box that is Unity's physics system. I learned a good number of things, and ragdoll physics have been improved immeasurably!
With the new improved ragdoll physics, animations are now physics driven! There's a bit of tweaking left to do, but in general any physics mishaps can be fixed by (or caused by) a proactive player!
Players with dicks now only get marginal slowdown from bumping into their own.
Feet now IK to the ground, it can look really goofy sometimes, but in general grounds kobold in the world.
Shadows no longer have seams in them, at the cost of having a bit more shadow acne. This was important with the number of structures that were affected by the shadow normal bias.
Dicks have staged flaccidity now, going from packed -> floppy -> erect. All done with generic monobehaviours. New dicks can have much more complex configurations!
Flared Equine was replaced with one done by the lovely uniform_vixen on Twitter.
I know I say this every other patch, but penetration physics were reworked yet again. Re-thought from the ground up, it includes fun stuff like solving things in an orbit, and does some cheating to purposefully stabilize most configurations. (This also had to be done to support non-centered penetrative shapes.)
Some VFX cleanup: splashes, goop, strands, and fluids were all touched up on.
Optimized a number of scripts, realized a lot of scripts that don't need to run very often should NOT run on FixedUpdate-- this leads to vicious cycles of trying to catch up on lost time by over-running expensive code.
Added VSync, and target frame rate options under Graphics.
Freecam now hides the UI.
We're still not quite at being able to open-source the game, but we're certainly a lot closer!
Here's the patch notes for all the changes in February:
Kobolds can face directions during an animation, it's really bad for NPCs but players can nod and look places while playing animations.
Fixed a large number of memory leaks. (Derivatives no longer uses Linq, strands allocate all memory needed up front, reusing physics collisions, no longer pass array copies for grabs, adjusted how components are searched for usables.)
NPC kobolds no longer have hover-hands, hover hands are still networked for players.
Complete reworking of inflatable systems, every kobold body part is driven from internal reagent containers.
Dicks use this same inflatable system to get hard.
Dicks actually source their cum from balls now (they cheat a tiny bit to at least get something out each time they pulse).
Balls can get bigger based on how much pineapple was consumed.
Balls and boobs both regenerate their reagents each night.
More network syncing. (fruit no longer gets stuck, all use events are cached and played back properly on first join.)
Added the new pawnshop, it's a full underground area with some stuff to buy! It has yet to have a progression system.
Debris was added to the farm plot, gotta clear it in order to make room for new plants!
Really big bombs can be purchased from the pawnshop.
Some networking fixes so certain reagent combos no longer cause infinite explosions.
There is now a 15% chance for it to rain each day.
Added a low quality cloud option (just some 2d clouds) so that they can thicken when it rains.
Ragdolls are actually synced now, this can cause them to slide around a bit but in general they're synced.
Finally actually included the ErrorScene, a blank scene that loads when you get disconnected or when you try to join/create a multiplayer game from an offline mode.
More props and map geometry is possible to cover in decals now. Paint the world!
Kobolds can now spawn with hemipenes.
The script that handles body proportions was optimized! Spawning 30 kobolds no longer freezes the game for 40+ seconds.
Dildos can grow by spraying them with eggplant juice or growth reagent.
Dialogue with NPCs has been disabled temporarily as it gets reworked.
Here's the patchnotes for all the changes in January:
Got clouds working again, they only enable if you're using DirectX, Metal, or Vulkan. Since OpenGL seems to have a race condition on the rendering causing some tearing.
Wrote a custom constraint for the precision grabber so that it doesn't mess up as much. Now things are less physically accurate, but things actually move and rotate consistently now.
Animations! A first pass of animations were added that can be initiated by pressing Use on Kobolds near a valid location. There's still lots of problems with it determining which kobold fits which animation best (or if they fit whatsoever), but in general it works and is really fun if you don't mind kobolds doing strange things.
Penetrator physics were adjusted to work with the animation system better. Penetratees now cheat to just be in the "right" spot. Makes characters look really gooey and flexible, but I think it's worth it to keep penetrations looking valid each frame.
Completely threw Unity's Animation Rigging package in the garbage. It didn't scale with character's limbs and was generally very expensive to turn on and off. Replaced it with a from-scratch IK system that knows how to deal with characters of random proportions and sizes. This is only used during Animations, and probably still needs a bit of tweaking.
Big optimization pass, after seeing a user with a KoboldKare executable needing 13 GB of memory; I spent a long time hunting down and squashing unnecessary memory allocations. This not only makes KoboldKare take less memory to run, but also prevents the Garbage Collector from kicking in as often. Game is much smoother and faster now! In general the game went from allocating 10kb PER FRAME to only allocating 40 bytes or so each frame. Slight framerate improvement too (less GC allocations means less ms spent on allocating).
Goopy strands were optimized, and in the process I found out they were deleting themselves too early, they now stretch until they snap, then properly fade out after snapping before self-destructing.
Kobolds now spawn with a random amount of fat.
Player kobolds can now adjust their ball size and chubbiness within the multiplayer options.
Finally, I've modularized how inflatable kobold parts work-- and made them entirely dependant on reagent containers. This comes with a variety of benefits:
Kobold's now have more containers: Belly, breasts, balls, subcutaneous, and penetrators.
Each container has a set of listeners that drive different aspects of the Kobold. For example a Kobold getting hard would require them to pump fluid into it. The listener will see this and drive the proper blendshapes and activate the correct monobehaviors with a slick animation curve. A Kobold digesting ice cream might turn it into fat and store it in the subcutaneous container, a listener will see the fat and drive some fattening blendshapes and adjust softbody physics.
These inflation listeners are unhooked from the metabolization timestep, so they can react instantly to changes that the player makes. This means spraying water at a kobold would instantly have an effect on their belly, rather than waiting the 1-2 seconds for the metabolization tick.
Kobolds are now just a set of penetrators, penetratees, and reagent containers grouped into categories. This can lead to kobolds with multiple sets of penetrators, unique reactions to certain chems, and opens the door to make it easy to add all sorts of other kinds of creatures.
There's a few things that are totally broken while I fix up interactions to work with these new modular systems. Just try to keep flasks away from breasts while I try to fix it over the next couple days!
I was late on these patch notes again because of the holidays! Sorry about that.
Completely reworked the reagent system, it now supports heat, potency, and serialization for multiplayer networking. (Though right now heat and potency aren't used yet.)
Added a banana fruit, it has potassium. Careful!
Added the ability to customize your Kobold within Options.
Options are saved as a JSON again, this is so lower powered laptops can change the settings without launching the game.
Added support for integrated GPUs. Game launches with Vulkan, Metal, Direct3D11, and OpenGL options.
Temporarily disabled clouds, they'll come back when I figure a graphics api agnostic way to render them.
Temporarily disabled two of the extra camera angles, going to replace it with a more robust 3rd person camera soon when animations come around.
Created a new procedural skybox.
Added multiplayer! This was a long time coming, but I'm comfortable enough with the structure of the game to add it!
Not a big list, most of my time was spent trying to stabilize Multiplayer, and get the game running on all kinds of hardware. I've partially succeeded at both! Though there's still quite a bit that needs to be done.
Sorry that these patch notes were a little late! Here they are:
Soft-body physics in the mirror work now.
Usable system rework, pretty much anything that's usable has icons and drag-and-drop conditions for being usable.
New fatten blendshape for Kobolds-- like, really really fat.
Added a new craftable chem: Icecream! Requires milk and ice, makes kobolds fat (see above).
Added subtractive blending to the decal system. Any fluid that's majorly water will actually wash decals now, rather than paint them neon blue!
Kobolds have much broader color expression now, almost pure white and black kobolds can exist.
Kobolds now express themselves as male or female a bit better-- with a blendshape that broaden/squares or softens/rounds. It's analogue so any kobold can have any combination.
Added working showers, faucets, bathrooms, drawers, fridges, ovens! This will be expanded upon later for some more unique interactions!
Fluid volume painting: You can paint kobolds by dipping them into a tub full of chems. The shower also washes them off!
You can precisely measure and mix chems in the tub, then store the resulting fluids into a flask.
Night-time no longer deals damage, it now instead accumulates monster shadow hands that drag you and anything left outside into darkness. Running inside quickly quells the monster! Stay safe!
This month I've been trying to pave way for full blown multiplayer-- This has so far been a really good decision because it's forcing me to clean up how objects interact, and clean up the structure of things. My code is getting cleaner and easier to work with as I approach actual multiplayer readiness.
With lots of new players in mind, I finally tried addressing the fact that the game has really weird controls. I watched a fair number of people play the game, and they all would try the same things at first-- So I tried to transform my controls to work with what these players tried!
I also finally got Localization in the pipeline, luckily I have a lot of friendly users who helped me with the translations-- I haven't got credits ready in the game yet so I might as well post it here: TabbyCatface: Russian, Ukrainian Translation Slowboii and Kujawiaczek: Polish Translation Snaked Snake: German Translation LynxModernWitcher: French Translation Adept Lughir: Dutch Translation
The rest of the languages are machine-translated, if you're interested in helping with the translation, join the KoboldKare discord! https://discord.gg/WGff3rR (and poke me)
Anyway, here's the patch notes for this month:
Added localizations for many languages, dialogue is still in the works though.
UI rework, well more like suddenly there's UI. Should help with figuring out the controls!
Press F to ragdoll.
The "advanced grab" is now buried under a context button (currently shift). This button immediately detaches the mouse and lets you aim and grab stuff. It also shows some helpful UI buttons you can press so you know you can rotate, freeze, and push/pull with it.
Controller inputs should now work properly, they still can't drive the UI, but it's possible to play with them now (with a bit of difficulty).
Casino prototype is in, it's looking really good! Some places inside might look empty because I had to temporarily disable the games.
Ragdoll adjustments and polish, they're still prone to clipping, still look dead, and sometimes their bones seem to unhinge-- but for the most part they've improved a lot!
I've enabled Developer Mode for the build, this is to let players give more meaningful bug-reports. It can open an annoying debug console though, click on it to close it!
Mirror no longer has an incorrect oblique clipping plane.
Switched to indirect lighting for baked lighting for just a slight improvement in the baked lighting.
Added a dynamic reflection probe that updates every 3 seconds, it can cause some weird artifacts, but in general it makes nights look nicer and the environment reflections more convincing.
Attachables no longer apply any physics (goodbye oscillating kobold-flask abominations...)
Hitboxes on penetrators have been refined, though if they're extremely large they'll still "magnet" into things. Smaller ones require much more specific aim and purpose.
Male kobolds can make eggs now, this might not stick around once more chems are added though.
Kobolds ragdoll when thrown, or when their feet are grabbed.
The advanced grab change is something that I've been thinking about for a long time. It used to be bound to the primary mouse button, and permanently affixed to the center of the screen. This caused a lot of confusion though because in practice it was secondary, or even tertiary to the primary game loop. The first thing any player does as they play the game is try to water the egg, and the advanced grab isn't useful at all for that.
And because it was fixed to the center of the screen, it made any sexual interaction really jarring as you had to shake your entire head with the motions. So I've decoupled it from the screen, and buried it behind a context button which switches how your mouse works. The decoupling lets you shake kobolds and penetrators without making yourself sick, and the context button allows for me to pop up a bunch of ui to help players learn how it works. Let me know what you all think about it!
I'll be spending the next couple days updating the patreon, twitter, and steam page to reflect the changes. Next month I'll hopefully actually be working on some multiplayer integrations.
Last month I was discovering a lot of users were completely unable to play the game, some of them even had VR-ready modern hardware!
I made the difficult decision to downgrade to Unity's URP pipeline. This means no more volumetric lights, ambient occlusion, and some other fancy effects.
However, this means even integrated, and mobile hardware can suddenly play the game reasonably! It took a while but I think I'll be sticking to URP for a while.
Casino temporarily removed to make room for the new one (soon).
Replaced decal system with an "infinite" decal system. Make a huge mess!
URP doesn't have a built-in decal solution. I don't actually care about the individual fidelity of each decal, so what I do is re-use the lightmap atlases to map some textures to the world. This allows you to paint the entire world with decals!
Remade the majority of shaders to work within URP, this required some reduction in interpolators so most shaders should be a fair bit more efficient!
The switch to URP allows for real-time reflection probes, I render one every 3 seconds and blend to it. Allows for much more accurate reflections (especially during night).
The player is now completely a Kobold, spawns with random stats just like any other Kobold. Can even get pregnant, have sex, drink potions, and do anything else a Kobold can do.
This was a really big systemic change which pretty much broke EVERYTHING. I really rushed to get this patch out by the end of the month, so there's probably a lot of broken things I haven't gotten to yet. Please be patient as I clean it up!
Penetrators now don't couple immediately on touch if they're not in range of the nearest hole. This means there's no more tripping over them. (This was especially frustrating as a player kobold).
Temporarily disabled AI for the transition into online multiplayer-capable systems.
Fixed the math on rotating props you're holding with R, it should make sense from any direction and perspective now. Still needs a bit of smoothing to look nice, but it's very functional at the moment.
Disabled procedural texture generation, this tech was far too unstable, slow, and made it difficult to test multiplayer. It probably won't come back either, people nowadays don't care about downloading an extra 200mb or so anyway.
Patch notes isn't super long since majority of my time this month was spent switching to URP. Though next month I'm going to have something extremely exciting to show, might have something to do with online multiplayer but no promises!