Before diving head-first into Act XIV I decided to do a small update first.
Part one was an experiment with AI and motion. I suspect it's because my life's been immersed in game development for two decades now, but for the last week it's felt as if the entire world was talking about AI (in a mixture of rage and wonder, depending).
There's been a lot of progress over the last few years, but November saw two really impressive updates, and I diverted into a rabbit hole for a couple of days playing with it.
The first of these is ChatGTP, an AI camouflaged as a chatbot.
It's remarkably intelligent, knows how to respond to feedback, and is very much a child of the internet. It also knows how to hotwire cars, but it really doesn't want to tell you... that's what happens when you give an AI training net access to the internet and let it go.
The second (and far more controversial) one is MidJourney, a text-to-image generator. Where ChatGTP was given access to the internet at large, ChatGTP was essentially handed a very very large selection of images download from Art websites, like ArtStation.
You interact with the AI like a bot in Discord, "prompting" it with inputs to which it responds.
a fairytale princess marries a dark, handsome prince 2D game, volumetric light, dust in air, realistic, ar 1:1 --v 4 --q 2 (In case you're curious, the tags at the end set the aspect ratio to 1:1, uses version 4 of the AI, and bumps up the quality to max).
There's a number of things that are controversial here. The first one is *where* the data came from; like ChatGTP the MidJourney AI has been quietly ingesting information from the internet, in this case hundreds of thousands of art pieces made by thousands and thousands of artists, most of whom never thought their hard work would be fed to an AI.
Well. Damn. Part of the reason most people didn't worry too much was that as late as 6 months ago the results of AI generated art was pretty low-quality, fiddly and hard to access. With MidJourney all of that changed, and a number of artists (understandably) panicked.
While the results look really impressive (especially in terms of lighting and shading), it's not without it's issues.
it can't do text to save its life, it struggles with details (especially hands, feet, swords, etc), and it doesn't really know composition (here is "red ball on top of a green cube"). You can get it to make a really impressive stand-alone scene, but making a VN using it is (so far) impossible; you couldn't get the specific details and composition you need.
You can also prompt it to use an image as input. Here I gave it my background from the Dark Paths of Elsewhere, and asked it for some variations:
Wow... that ended up looking *really* good. It's abstract enough that you don't need to worry about 6-fingered hands or messed up text, it's primarily derived from my image (which makes me feel a little less guilty about the art that went into the training set), and it looks pretty.
Now a sensible person would have said "neat", and either just forgotten about this, or picked one of the images to replace the existing one, and moved on. Sadly I'm not that sensible. So I crank up AfterEffects and go to work.
There's a couple of things happening here; I'm warping the image from one to the other, then adding special effects on top. I ended up loving it enough that I made two versions (one for the Dark paths, one for the Light paths). I then made 4 small clips (2 looping still images (A and B), and two transitions between them). When it plays, it goes something like: "Loop A 1-3 times, Play A->B, Loop B 1-3 times, Play B->A". It adds a nice bit of randomness, and captures the idea that the Paths are never quite static... they constantly change and morph.
I think AIs are at the cusp of revolutionizing a number of aspects of our society, and along the way we're going to run into various ethical challenges. I don't think it can be *stopped*, though, so at the very least we need to understand it, and know what it can and cannot do.
Apart from that, this update adds in an option for a replayable Chosen 4-some (at night in the KD Bedroom), and cleans up a number of little bugs and typos that snuck in. I've started writing and rendering Act XIV, so that's up next.
Was this kind of "behind the scenes" information useful? Should I do more of it, or less? Let me know in the comments.
Today we have some updates to the final boss, including a bugfix that I think was maybe introduced in one of the 2.X updates. Hopefully this resolves the issue:
Version 2.3 - December 20, 2022
Fixed issue with no items medal not unlocking during the final boss.
Bounty Hunter - "Hook and Cut+" had an issue where if the unit you use it on is at the furthest end of the battle arena, the unit will become uninteractable after. That has now been fixed.
- "Preparation+" range will sometimes change because of other Bounty Hunter's cards in hand. That is now fixed.
- "Versatility" animation and Armor preview has been fixed.
- "Barbed Bolt" text states that the card inflicts 2 BLEED. What it should have stated is that it will inflict 2 BLEED if target takes damage to their HP, which is how the majority of BLEED effects work.
Rogue - "Closing Act" x2 damage is only supposed to work if it's the last card in hand. But under certain conditions it could also work even if the card is played from the card-rack. That has now been corrected to only work if the card is played from hand.
Relics
- Volcanic Glass (cards that cost 0 Mana have +3 Power) had no actual effect on 0 cost cards. It should be working correctly now.
- Using Eternal Flame to burn a card when there's no cards left in both draw pile and discard pile will freeze the cards in hand, making them un-interactable. That has now been fixed.
Optimization
- If you manage to greatly increase your attack-range or movement-range, the game will lag or even crash whenever your Champions create movement or attack squares preview. The code responsible for that has been tweaked so that the game can handle a far higher amount of generated movement/attack squares.
New: - Every player has 1(!) self revive opportunity, you don't need to use it in multiplayer once you are down, just make sure you won't bleed out before you get revived
- Some small changes in the settings / options windows
Please note: In multiplayer, once a downed player bleeds out, the game ends for both players! This is intentional. Please do not report this as a bug. Duo play meant to be cooperative, so make sure you watch out for each other!
As always, please let me know of how do you feel each update. Do they get the game better or not? If you are not happy with something let me know on discord, i am working hard to get this game enjoyable.
We are finally ready to release our biggest update yet! Introducing Logic World v0.91: The Less Buggy Update. This update is now available, for free, to everyone who owns the game.
0.91 is a massive update that touches every area of the game, drastically improving performance, majorly improving stability, adding dozens upon dozens of little quality-of-life improvements and tweaks, and introducing a few radical new features. For this update, we've changed or added over 69,000 lines of code since 0.90.3 across over 1,000 files. It's been a big effort, but it's just the start of what's to come.
We're very happy with Logic World v0.91. It's the best version of Logic World yet, and it's an excellent foundation for the really ambitious updates we'll be doing next.
Thank you for playing our video game. Enjoy the update. From everyone at Mouse Hat Games, please have a happy holidays, and a wonderful new year!
0.91 Changelog
This update will reset your settings!
Building
Multi-Clone now supports cloning wires that connect the different selected objects (#73)
Multi-Grab and Multi-Clone handle a bunch of placement edge cases much better, particularly related to circuit boards
You can now configure the size of the Action Wheel
Added a button in the Action Wheel configuration screen to reset to the default Action Wheel configuration
Multi-Wire Placement is now treated as a single action in the undo/redo history, instead of one action per wire placed (#318)
Multi-Wire Placements with only one peg in the first selection now work properly
Wires can be slightly shorter now
During Grab, Clone, and Resize operations, the placing ghost will now update its circuit states instead of being frozen
You are now always allowed to proceed with a deleting operation when multiple components are selected (the previous rule was that you had to select all the children of a component)
Fixed sometimes not being able to rotate Switches, Buttons and Keys without grabbing them first (#206)
Fixed undo/redo stack breaking and causing errors sometimes (#396, #281)
Fixed undoing build actions that deleted wires breaking the undo stack (#399)
Fixed some issues with components moving around upon completing a multi-resize (among them #266)
Fixed canceling multi-wire placement not removing the outlines of the selected pegs (#233)
Fixed board drawing sometimes not properly snapping to a square size when holding shift (#203)
Fixed flip state not always being correctly detected for Grab/Clone operations (#351)
Fixed rotations getting out of sync during Multi-Clone if you try to rotate before the first successful placement (#268)
Fixed not being able to resize short Flags
Fixed warnings and errors in the console when grabbing and resizing Flags
Fixed log spam with “Look viewing rotation vector is zero” during some edge cases with grabbing
Fixed hovered colors in the Quick Color Chooser being persistently applied when the operation is canceled (#71)
Components
Added an option to Keys to only allow pressing them while in a Chair
Added a “reset” button to the Edit Delayer menu, to reset it to the default delay of 10 ticks
If you hold the Mod key while flipping a row of switches, they will all be set to the same state as the first switch flipped (#60)
Removed the server config value `SimulationTPS` as this is now configured per-save in ExtraData
Renamed the server command `step` to `simulation.step` for consistency
Fixed the simulation unpausing in multiplayer when a new player joins the server even if the players currently on the server have paused it (#347)
Fixed the simulation unpausing in singleplayer when accessing a sub-menu of the Pause menu
Circuitry
Outputs that should start on (such as the outputs of newly placed Inverters) now start on in the simulation
Fixed Clone operations not properly copying the circuit states of the original objects, which would often result in flickers and broken feedback loops (#116)
Fixed component outputs sometimes erroneously changing state when the number of inputs is changed
Fixed weird simulation glitches (and occasionally server crashes) that would occur when changing the number of pegs on a component that has connected output pegs (#104, #250)
Optimization
Significantly improved loading times, especially for large worlds
Improved game framerates for most scenarios, particularly for large worlds, and particularly if post-processing or shadow cascades are disabled
Component/wire geometry is now rendered with GPU instancing instead of in combined mesh chunks
Colliders are instantiated more efficiently
Improved performance and reduced allocations when grabbing or cloning stuff
Improved performance of checking Socket connections
The game now logs how long it takes the client to load a save
Removed the secret settings `MHG.Graphics.RenderDistance.Secret.IdealFramesBetweenRecalculations` and `MHG.Graphics.RenderDistance.Secret.MaxTimeBetweenRecalculationsSeconds`. Render distance is now recalculated when the player has moved to a new chunk, not on a time interval.
Improvements to physics performance
Added secret setting: `MHG.Secret.UnityFixedDeltaTime`. Increasing this value can massively increase the framerate in very large worlds (with a very large number of colliders), but will reduce the accuracy of game physics.
Component positions are now stored as fixed point rather than floating point
Component world positions are now calculated in the reference frame of the stack root component
Rounding of component rotations is smarter and more consistent
Due to these changes, components now stay perfectly aligned up to an arbitrary nesting depth (#269, #273) and no longer cause tiny erroneous intersections (#123)
Save Files
Upgraded to Blotter File Format v6, to store positions in the new way (fixed point rather than floating point)
Blotter v6 also has support for multi-root subassemblies, in preparation for some 0.92 features
Added save converter from v5 to v6
The game no longer considers a save to be “corrupted” if it uses a previous blotter format version; instead, a helpful save converter UI is offered
Fixed missing translation string for the file corruption state “unknown save type”
Fixed sandbox list displaying an empty info box for saves with an outdated format version
UI
The About menu, Languages menu, and Teleport menu can now be accessed from the Pause menu
The in-game changelog is much prettier, and the changelogs for each update can now be individually collapsed and expanded
The in-game changelog now automatically generates and displays links for mentioned issues
If another player edits the properties of a Flag (i.e. name, color, aspect ratio) while you have the Teleport Menu open, the Teleport Menu will now update to reflect those changes
By default, the Edit Flag menu will no longer close immediately when you select a new color
The markdown renderer does a better job of rendering lists and headers
The markdown renderer now supports superscript. This is disabled everywhere by default, but it can be enabled for chat via a new `Superscript` section in the secret setting `MHG.Chat.Secret.ChatMarkdownSettings`
Added command: `UI.Debug.LogObjectsUnderCursor`
Enabled smooth scrolling for the Settings Menu sidebar
Fixed setting descriptions being cut off in the Settings Menu sidebar if the description is sufficiently long (#342)
Fixed some visual issues with the Settings Menu sidebar for settings with names long enough to span multiple lines
Fixed some inconsistencies with UI text boxes
Fixed some visual issues with the custom avatar preview (under settings -> multiplayer)
Fixed some resizing arrows not being properly disabled on configurable menus that are not supposed to be resizable, such as the Edit Delayer Menu (#377)
Fixed the binding prompts in the Action Wheel not updating to show the new bindings if you change them
Fixed jankiness when using the scroll wheel in the debug console
Fixed some issues with UI usability when running the game at extremely wide aspect ratios
Fixed the debug console window rendering in front of its hover tags
Fixed hover tags sometimes not disappearing when they’re supposed to
Fixed console error spam if you have the Help menu open and you switch game states on two consecutive frames (#395)
Thumbnails
Thumbnails are now anti-aliased
Thumbnail lighting is now independent of environment lighting, so thumbnails will now always look consistent
When a single component has an output that is supposed to start on, such as the output of an Inverter, the output is now properly rendered as on in the thumbnail
Renamed the secret setting `MHG.Secret.ComponentDisplayRotation` to `MHG.Secret.Thumbnails.ThumbnailModelRotation`
Renamed the secret setting `MHG.Secret.ComponentDisplayRenderSize` to `MHG.Secret.Thumbnails.ThumbnailRenderResolution` and changed the default value from 256 to 128
Due to a limitation of the new rendering tech, new thumbnails will now be blank for a single frame after creation. To avoid this, thumbnails are pre-cached as much as possible.
Fixed visual artifacts when geometry intersects the edge of the thumbnail render
Text rendering
Added support for emojis (i.e. 🍆😆🐢🥗)
Added support for music symbols (i.e. 𝄞𝄿𝅘𝅥𝄇)
Added support for additional math symbols (i.e. 𝞉𝞩ϵϕ𝚤)
Added Hong Kong style option for CJK characters. Currently only accessible by setting the secret setting `LogicUI.Secret.CjkDefaultFontStyle` to `Hong_Kong`
All characters in the Adlam script are now displayed in the joined style (previously some were in an unjoined style)
All characters in the Arabic script are now displayed in a neutral Arabic style (previous some were in a Kufi style, and some were in a Naskh style)
Added support for the following scripts: Bassa Vah, Bhaiksuki, Caucasian Albanian, Duployan, Elbasan, Elymaic, Grantha, Gunjala Gondi, Hatran, Indic Siyaq Numbers, Khojki, Khudawadi, Linear A, Mahajani, Manichaean, Marchen, Masaram Gondi, Mayan Numerals, Medefaidrin, Meroitic, Miao, Modi, Mro, Multani, Nabataean, Newa, Nüshu, Old Hungarian, Old North Arabian, Old Permic, Old Sogdian, Pahawh Hmong, Palmyrene, Pau Cin Hau, Psalter Pahlavi, Sharada, Siddham, Sogdian, Sora Sompeng, Soyombo, Syriac, Takri, Tirhuta, Wancho, Warang Citi, and Zanabazar Square. PHEW
Updated Noto fonts
Updated Font Awesome to 6.1.2, with over 7,000 new icons!
Localization
Added WIP translations for Korean, Spanish (Spain), and Turkish
Updated translations and translator credits for Chinese (Simplified), Croatian, Czech, Dutch, Estonian, Finnish, French, German, Hebrew, Hungarian, Japanese, Polish, Portuguese (Brazil), Romanian, Russian, Slovenian, Swedish, and Ukrainian 🇺🇦 Thank you from the bottom of our hearts to all the volunteer translators! Because of your hard work, people from around the world can enjoy Logic World in their native language 💖
Movement
Fixed flying speed being non-configurable (and way too slow) when the setting “Lock Flight Y Axis” is disabled (#370)
Fixed the secret setting `MHG.Flying.Secret.AutoEnterNoclipOnStartFlying` not even working, and breaking the game in various ways when set to `true` (#279)
Fixed errors in the console when a player is standing on a component decoration (such as a Chair or the clicky part of a Button) and that component gets destroyed
Fixed incorrect footstep sounds being played in some situations
Fixed new player positions not being applied until all overlay UI is closed
Interactables
Added support for outlining Interactables that are not part of components. This is used for the big clicky button in the test world, which is now outlined when you look at it.
Interaction-dragging behavior is now consistent between chairs and standing: when the cursor is moved to be looking at a non-interactable, the interaction ends
You can now interact with the same Switch multiple times during one interaction
When interacting with a Chair to sit in it, the interaction will now immediately end, instead of continuing while you sit in the chair. Fixes #103
Music
Added a “Never” option to the Music Frequency setting
Changing Music Frequency will no longer cause music to stop playing (except when setting it to “Never”)
Reloading the settings (i.e. by switching settings profiles) no longer causes the music to stop playing
Tweaked the default parameters for the fancy pause menu music effects
Music is loaded from disk more reliably; fixed music playback issues on some systems (#422)
Modding
Fixed shared mod `.cs` files being in `shared/` instead of `src/shared/` (#341)
Fixed mod compilation failing when a mod assembly does not have a path, i.e. when using Harmony mods (#308)
Fixed exception when increasing the number of outputs on a component (#457)
Fixed `InputPeg.AddPhasicLinkWith` throwing a `NullReferenceException` in many cases
Server
Dedicated server binaries are now placed in a sub-folder, to keep the root directory clean
Periodic server tasks no longer cause a server death spiral if they take too long. This was often presenting when autosave was enabled on a very large world.
If the server fails to broadcast its existence on the local network, it will now disable local network broadcasting instead of just crashing
Reduced the minimum time between connections to a server from a single IP from 30 seconds to 3 seconds
Messages in the server console announcing player leaves/joins are prettier
Fixed the server always saving on close even if the server config value `SaveOnClose` is set to `false`
SUCC and settings files
Error messages about parsing SUCC files are much more helpful, and now contain the file path & line number
Various SUCC files, such as `settings_master.succ`, will now be automatically reloaded and their changes applied when the file is changed on disk
Configurable menu data is now stored in the profiled settings files instead of in a separate file for every menu. This means menu configurations now properly work with the settings profile system.
The game now updates `___LastLoadedGameVersion` in `settings_master.succ` with the most recently loaded game version every time the game starts
Removed `config_override` files. All server config values are now stored only in `config.succ`
There are far fewer disk writes related to game settings, especially on startup, which should improve startup performance
Technical
Fixed the game not properly detecting supported network protocols, which was causing various nasty bugs that made the game unplayable in certain network setups or when no external network interfaces are available (#204, #333, #229)
Updated Unity version from 2019.4.17f1 to 2019.4.40f1
Upgraded server runtime from .NET Core 3.1 to .NET 7.0. For now, .NET 6.0 binaries are also included with the dedicated server.
Fixed there being an omega (Ω) in the name of a dll, which prevented the game from working properly in some environments. This also accidentally prevented the game from working if you got it from a particular game pirating service, so uh, you’re welcome, pirates. YAARRRRRR
All error messages and APIs are now PG-13
Added a system for updating CustomData in saves when the layout for a component’s CustomData changes between versions
More kinds of errors in the game loop are now caught and trigger an error screen
The `PrintUnityEnvironmentInfo` command now reports much more information, especially about the system hardware and the graphics API. The information is also now formatted much more nicely.
Added command: `runtimeinfo`
Added command: `input.ExportSystemKeyNames`
The Resolution setting is now properly saved as a Vector2Int instead of a string with extraneous data
Custom MessagePack formatters now use MessagePack best practices (#259)
Fixed the integrated server process not being killed in some cases where it should be (#401)
The server now explicitly rejects wire requests between two outputs (previously, it would throw an error if sent one)
Graphics APIs
Added OpenGL as an optional graphics API on Windows and MacOS (used with the command-line argument `-force-glcore`)
Added Vulkan as an optional graphics API on Windows and Linux (used with the command-line argument `-force-vulkan`). Vulkan still has issues on some systems, but once we work those out it will become the default graphics API on Windows & Linux.
Platforms
Linux: fixed mouse button presses sometimes registering as phantom scroll wheel events (#146)
Linux: fixed the camera moving when the game window does not have focus and the cursor moves into the game window area (#148)
Linux: fixed Action Wheel segments being invisible on Linux OpenGL (#41)
MacOS: fixed keybindings in the UI sometimes displaying as empty/blank
Miscellaneous
Changed default offline player names from “Citizen [random number]” to “Bobby #[random number]”, and reduced the max size of the random numbers
When taking a screenshot, the screen now flashes grey for one frame (this is a necessary temporary limitation and will be removed in a future release)
The FPS counter no longer erroneously reports 60FPS for the first second it is enabled (#350)
The Resolution setting is now disabled while the game is running in windowed mode, and in general windowed mode is handled much better
The 4D option for barrier shader quality is not displayed anymore because it is too slow; however, it can still be used if you enable the secret setting `LogicSettings.Secret.ShowHiddenDropdownValues`
Updated the “Performance Impact” displayed in the settings menu for various graphics settings to be more accurate to the new rendering tech
Fixed sometimes not being able to delete sandboxes using the UI (#101)
Added a new setting: “Pause on Defocus”. Disabled by default. (#191)
Dear Haakers: We have added something new and optimized, please check the details below:
New content - You can feel Christmas in Haak now
Optimization - The feeling of sliding is optimized. Now keep pressing the jump button during sliding, and the state of sliding will not be interrupted by performing other actions (such as attacking, sprinting, etc.)