1. Logic World
  2. News

Logic World News

State of the Logic World: December 2023

Hello, it's me, Jimmy from Mouse Hat Games. If you're reading this, you've probably been following Logic World for some time, and you've probably noticed that for the past year, there's been very little official communication about Logic World. I'm truly sorry for the silence. It ends now.

Beginning in January, a number of things began falling apart in my life. Throughout this year I've suffered a host of physical health problems, mental health problems, and other personal issues. I wanted desperately to be working on this game that means so much to me, but I just wasn't capable of it. I felt embarrassed and ashamed of that, so I just disappeared from our community. (One of many things I've learned about myself this year is that I have avoidant tendencies. I'm working on it.)

The good news is that, since June, I have been laser-focused on fixing my life, and I've been extremely successful. May 2023 was perhaps the worst month of my life. November 2023 was the best so far.

I'm able to work again, and to love working, so I've been working a lot. Much has been happening recently and the future of Logic World has never looked so bright.

It's good to be back. Let me tell you a bit about what's been happening, and what's next.



A New Team


For the first year of this project's history, I was the only programmer working on Logic World. Felipe, an exemplary modder of the early prototypes I had released, joined the team in 2018. For the following years up through the Early Access launch of Logic World in 2021, Felipe and I developed the game together as a tight two-person team.

I'm pleased to announce that, for the first time in five years, we've gained another programmer. And another. And another. The core Logic World development team is now five coders strong: joining myself and Felipe are Zoey, Ecconia, and GHXX.

I LOVE working in this new expanded team. Everyone is so passionate and so capable. The skillsets and perspectives that each team member brings are diverse and complementary; we bring out strengths in each other, and truly I believe we are greater than the sum of our parts. The development velocity is amazing -- stuff gets done way faster than it ever did when we were less than half this size.

It has been an intimidating challenge to step into my new leadership role, overseeing so many people and moving parts, but I'm learning fast and I think I'm really growing into it. Managing people is hard, much harder than I thought it would be, but it's also profoundly rewarding. I'm thrilled and honored to be at the helm of this metaphorical ship.

You'll see the new developers around in devblogs, youtube videos, and hanging around in community spaces like our discord. I'll take a moment now to introduce our three new team members, and give them each a space to say hello in their own words.

Please give a warm welcome to:

[h2]Zoey[/h2]

Zoey is maybe the smartest person I've ever met. It's quite a common occurrence that we'll be discussing architecture & design for some incredibly complex system, and with a sinking feeling of dread, I'll realize that there's a terribly hard problem with it, the kind of problem that takes me days of thinking and researching before I start to feel like I might be approaching a good solution. I'll vocalize this problem to Zoey and ask her thoughts on it. "Oh, that's easy. We don't need to worry about that," she'll say, and then she'll describe a brilliant, perfect, ingenious solution that not only solves the problem I brought up but also five others I hadn't yet realized were there.

Zoey sees computers and code with a clarity of thought I've never encountered before. The experience and expertise she brings to the team is invaluable.

Hello! I'm Zoey, a self taught software engineer from England.

So what's my story? Well, let's start at the beginning.

13.8 billion years ago there was nothing, and then, there wasn't. A short while later, I was born. Ever since then I've had a fascination for technology, an unquenchable thirst for knowledge, and a passion to create. As a result, I have worked on hundreds of random personal projects over the years, from terrain generators and physics engines to robots and computer vision.

The full list of projects would be too much to put here, and frankly, I doubt I could remember them all, but here are a couple of my favourites:

Sparse Voxel Octree Ray Tracer (SVORT).
Voxels are fun, and ray tracing is fun, so why not combine the two? Standard voxels use too much ram, and are slow to traverse, so let's use a Sparse Voxel Octree, and write it all in CUDA!
To create my SVORT I began by designing a custom SVO data format, allowing for a compact data representation and efficient traversal. After that, I needed something to actually render, so I wrote a 3D model to SVO converter, allowing me to convert textured 3D models to my custom SVO format. Once all of that was done, it was time for the ray tracer itself. The most complex part of the ray tracer was figuring out a way to efficiently traverse the SVO on a GPU, but in the end I got everything working smoothly, and was able to render scenes at a scale of 4096^3 voxels with 24 bit colour (192GB without compression) in real time on a card with 8GB of VRAM.

Custom CPU Design.
Another subject that I enjoy is custom CPU design. Whether it is in Minecraft or a logic simulator, I have always found this area fascinating. The project I took the furthest started with designing my own Instruction Set Architecture. Though next, rather than stepping into a logic simulator, this time I wrote an emulator with an output terminal, along with some initial bytecode for testing. Once I had verified that it was working, I proceeded to write an assembler to ease the process of writing code for the CPU. That was all well and good, but for this one I decided to take it one step further. Buying a cheap FPGA development kit, I decided to bring my CPU into the real world. Writing the implementation for the CPU out in Verilog, along with an interface for the UART transceiver, I managed to get my custom CPU running and communicating with a terminal on my computer, bringing the project to a satisfying conclusion.

Throughout all that I've worked on, computer science has always held a special place in my heart, and when I came across Logic World, I knew I had found something I just had to be a part of.

As part of the Logic World team, my primary contributions will be improving performance and efficiency, and the occasional fancy algorithm to add a new feature.


[h2]Ecconia[/h2]

Ecconia is the biggest superfan of Logic World there ever was. For years he's been building incredible machines in the game, creating dozens of spectacular, joyful mods (not to mention creating modding tools and frameworks), hosting servers, helping newbies get on their feet, and one time even re-coding the whole game from scratch in Java. The years-long dedication he's had to Logic World is awe-inspiring, and it's only natural that he now joins the dev team to drive the game's success in the most direct way possible.

Ecconia understands deeply what makes Logic World good, where exactly it's lacking, and just what needs to happen for it to fulfill its potential and be the best it can be.

Heya, I am Ecconia.

I live in Germany, studying Computer Science. My primary hobby is ice skating. I like to write big messages.

I started doing boolean logic circuits as a young boy on the playground, drawing a Full Adder circuit into the sand. Eventually that led me to Redstone, but I never felt happy there. There were many inconsistencies and weird unintentional behaviors.

But being active in such a community brought my attention to [code single]Logic World
: a boolean logic simulator, which did not give me nightmares. Being fascinated with the game and waiting for the Early Access release, I consumed all information about the game there is -- reading all LWW posts, watching all related videos -- which gave me a lot of insight.

During the long time of waiting, I started the OpenTUNG project, which basically is a rewrite of LW's alpha version without the bugs. But now that LW is released, we're all using LW, so I'm no longer working on OpenTUNG.

Being a programmer and gamer/modder, after some time I got annoyed by a certain bug in Logic World: it was not possible to automatically noclip when flying without freezing the game. I wrote a mod which fixed this bug, making it possible for me to enjoy LW more. If you've ever done game modding, you know it's a dangerous rabbithole. Once you start ... there is no going back.

At first I made simple mods like DisableCollision, but I soon moved onto really ambitious mods like CustomWirePlacer -- a mod that fully replaces the vanilla wire drawing to add 2D wire placement support and much more. In my eagerness to explore all the possibilities and features of modding I got to know all core code of the game.

Btw, my ultimate goal in LW is to build a computer which I can write programs for from inside the game. Starting with a capable typewriter to input assembly code...

As part of the Logic World developer team I am going to squish bugs and enhance the moddability of the game. I am excited to be part of the team and to discuss and develop things together, to make solutions even better. Let me be a gateway for modders to suggest API features. Happy :)


[h2]GHXX[/h2]

GHXX is a brilliant engineer, both within Logic World and beyond it, who pushes the boundaries of this game like nobody else. He has an incredible amount of skill and knowledge across technical domains, and he applies it to this project with invigorating fervor. In-game, he creates intricate yet expansive machines that I adore -- so much so that I used screenshots of them in the 0.91 release blog.

GHXX's excellence and passion are constantly pushing me to be a better developer, and shaping Logic World into a better game.

Hi, I'm GHXX, a self-taught programmer, with around 10 years of experience in C# (the language that Logic World is primarily written in) and a varying, but smaller amount of experience in a plethora of other languages. I also like to reverse-engineer code, even on the assembly level and, of course, play modded games.

Over the course of this timespan I have written many mods/tools for several games (Rimworld, KTaNE, Cookie Clicker, Garrys Mod, Factorio, Logic World and others), and even some modloaders/tools that make modding a whole lot easier for some games.

My most intensive reverse-engineering project to date is my modding interface for a very nice chess-spinoff game called *5D Chess With Multiverse Time Travel*. My interface adds a bunch of features to that game and enables easy modding of it, with zero modifications to game files, by patching the code at runtime -- and it's even quite stable. I'm proud of this project but it came at the cost of spending well over one hundred hours digging through compiled C++ code.

I have also created a few Logic World mods and personal dll patches back in the day for 0.90.3 which addressed a few problems when playing on pretty large worlds. In fact, all of those mods/patches, with the exception of my TCP Bridge mod (which I should probably update at some point as it is currently sitting on 0.90.3, despite likely working for 0.91.1 anyway), were actually just created so that a dear friend of mine, known as 00asdf, and I could continue extending our gigantic world, containing just under 2 million components, which we have been building ever since we purchased Logic World on Steam.

Generally, what would happen is that we would play, then face some kind of performance roadblock, at which point I would leave the server and investigate and mod around the issue, so that we could continue expanding. The ability to add fixes directly to the game, rather than having to cook up a modified dll or a harmony mod is the main thing that got me interested in helping out with Logic World.

I am very grateful to be part of the dev team, as the collaboration between all of us will hopefully lead to a much much more performant version which enables everyone, including myself, to create ever bigger and more ambitious builds.


I love this freaking team. What an amazing group of humans.


A New Update


We've been cooking up a new game update for you! Logic World v0.91.2 will be dropping next Wednesday, December 20 on Steam and Itch.io. This is a jolly little update containing large performance improvements, some better building mechanics, tons of bug fixes, and a whole bunch of other miscellaneous goodies. It's the first update that all five of us in the new core dev team have worked on.

As usual, the full detailed changelog for v0.91.2 will be posted here on this blog when the update comes out. To make sure you don't miss it, sign up for our fabulous newsletter.


A New Engine


Unity just kind of sucks in general and it keeps getting worse and we all hate working with it and recent events have made it clear that as an organization Unity cannot be counted on to not do terrible awful horrible crap that completely screws us over. We want Logic World to be built on a tech stack that we love and have confidence in; we want the future of our game to be secure and within our control; maybe most importantly, we want our experience of working on our game to be as pleasant as possible, so that we feel joy when we open the project, rather than dread as we are forced to wait for ten minutes for Unity's goddamn progress bar to do god-knows-what.

With all this in mind: update 0.91.2, coming next week, will be the last version of Logic World built on the Unity engine (unless we need to push a hotfix). Once 0.91.2 is out, we'll be devoting ourselves to porting Logic World from Unity to Godot: an open-source, community-driven game engine with a bright and gleaming future.

We evaluated many options for the new engine before settling on this one. There are a lot of reasons I love Godot, and we'll probably do a full development blog dedicated to the upsides of this engine, but in short, Godot is:

  • fun to work with,
  • NOT UNITY, and
  • free and open source software, so once we've moved our game to Godot we will truly own it and have control over it.

The work to port things will not be fast or easy, but it's the best move for our long-term future. I've been looking for years for an opportunity to get away from Unity, and now is finally the right time.



---------------------------------------



I love Logic World so much. I'm excited every single day to wake up and work on it.

We'll see you next week for update 0.91.2. We'll see you in 2024 for many exciting development blogs and huge new game updates on our glorious new game engine.

We are Mouse Hat Games, we are stronger than we've ever been, and we are going to build the greatest circuit simulation video game ever made.

Thanks for reading. It's the privilege of a lifetime to make this thing for you.

Jimmy Cushnie
Creator of Logic World

Logic World v0.91.1 is now available!

What's up gamers,

The minor update v0.91.1 is now available for download! You can get it right here on Steam. This update contains a ton of bugfixes and lots of minor improvements/tweaks/polish. Read on below for the full list of changes.

More big Logic World news is coming soon, so make sure you're subscribed to our newsletter and following Logic World on Steam. Enjoy the update!


(Artwork by Cady | @​pink_3d:matrix​.org)


0.91.1 Changelog


Building

  • Multi-Placement systems have been drastically improved. It should now be much easier to place multiple items where you want them to be, and items should always have the correct starting placement when you begin moving them now.
  • The system for determining the rotation of items being Grabbed or Cloned has been reworked. These items should never change rotation unexpectedly now when you move them to a surface with a different orientation.
  • Added secret setting: `MHG.Placing.Secret.MaxOffsetVariantAttemptsPerItemPerFrame`
  • Fixed a crash to error screen that could occur when grabbing or cloning multiple components (#475)
  • Fixed a crash to error screen when undoing some custom-data-changing operations (#469)
  • Fixed a crash to error screen, and occasionally other weird errors, when undoing a multi-clone operation that placed a cloned object on top of a source object (#466)
  • Fixed not being able to resize components when they're placed in very specific locations (#471)
  • Fixed cloned objects sometimes containing input pegs that remain On without being connected to any outputs
  • Fixed using Offset Hold on a Flipped component resulting in a mirrored X offset value


Components

  • Fixed inputs on Through Pegs and Sockets sometimes erroneously starting Off instead of On after loading a save
  • Fixed Delayers' internal counter state not being saved, and resetting to 0 on save load (#473)


Servers and Multiplayer

  • FOR REAL THIS TIME, fixed the infamous "cuddle bug", where you'd sometimes be shoved around by other players while someone was in the process of joining the server (#474)
  • Fixed visual glitches for a short time after someone joins or leaves the server where other players would appear to move around very far and fast
  • Fixed connected clients sometimes erroneously seeing the default server closing message when the server is closed with a custom message
  • Fixed missing server console message to confirm the world has been saved to disk when the server is closed and `SaveOnClose` is enabled
  • Improved the phrasing of various messages printed to the server console


Music

  • Finding Parcels: tweaked the color of some sounds and fixed some audio artifacts
  • Time and Science: fixed the ending note being cut off abruptly. It now fades out fully to silence.


Localization

  • Translations for WIP languages now include non-approved Google Translate suggestions
  • Updated translations and translator credits for Bulgarian, Chinese (Simplified), Croatian, Czech, Dutch, Estonian, Finnish, French, German, Hebrew, Hungarian, Japanese, Korean, Polish, Portuguese (Brazil), Romanian, Russian, Slovenian, Spanish (Spain), Swedish, Turkish, and Ukrainian 🇺🇦


OBJ Export

  • Fixed OBJ export not working at all lmao
  • Added command: `objexport.currentworld [int textResolution]`
  • OBJ exports should have much less texture duplication compared to 0.90.3. Textures are now reused where possible.
  • Exported .obj and .mtl files are more human-readable compared to 0.90.3 thanks to added whitespace between objects, better organization of the data, and a few other improvements


Authentication

  • `token.dat` is now stored in the game install directory, next to the executable. This means your login is now specific to your installation of the game, instead of being shared by all installations on your machine.
  • `token.dat` is now stored encrypted, with an encryption key and IV stored in a separate location on your machine. This means that in order to impersonate you, an attacker would now need access to two files instead of just one.
  • Fixed the `LogicWorld.Online.Auth.ClearedToken` event never being invoked (#476)
  • Added a smiley face when you log in using the browser


Miscellaneous

  • Fixed incorrect integrated server paths on the Itch.io version, which prevented Itch.io players from loading singleplayer worlds
  • The game handles input much better now if your binding for Multi-Select overlaps with your binding for a Build Action
  • Fixed a crash to error screen when the main menu loads if you have a corrupted save file
  • Added a check on application startup for whether the environment supports compute shaders, which are required to draw component/wire geometry since 0.91. If not, an appropriate error message will be displayed.
  • Removed OpenGL support on MacOS, since OpenGL on MacOS does not support compute shaders
  • Enabled Graphics Jobs and GPU Skinning in the player, which should provide a modest rendering performance boost

Logic World v0.91 is now available!

Greetings, gamers!

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!



[h2]0.91 Changelog[/h2]

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
  • Added secret setting: `MHG.Secret.Building.PlacingGhostsRecieveCircuitStateUpdates`
  • Various improvements to Multi-Edit, especially with regards to colorable components
  • During a Multi-Select pass, components which are a child or parent of the initially-selected component will no longer be added to the selection
  • Added secret setting: `MHG.Secret.Building.MultiSelector.AllowSelectingChildrenOfFirstComponentInPass`
  • Added secret setting: `MHG.Secret.Building.MultiSelector.AllowSelectingParentsOfFirstComponentInPass`
  • 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)
  • Added secret setting: `MHG.Secret.InvertMultiSwitchInteractionModKeyBehavior`
  • The input pegs on XOR Gates, AND Gates, D-Latches, Oracles, and Relays are now slightly longer
  • Fixed some unintuitive Delayer behavior that could, among other anomalies, allow one-tick pulses to go through a two-tick Delayer (#183)
  • Fixed Delayers getting out of sync after being cloned
  • Fixed Chairs sometimes erroneously complaining that they are occupied (#223)
  • Chairs will no longer be outlined if you look at them while they are occupied


Simulation

  • Added Simulation Speed menu. It can be accessed through a new button in the pause menu or with a hotkey, bound by default to `F9`
  • Added a hotkey to pause or resume the simulation, bound by default to `F10`
  • Added a hotkey to step one tick forward through the simulation (when the simulation is paused), bound by default to `Shift+F10`
  • Added secret setting: `MHG.Secret.SimulationSpeedMenu.ShowRemoveFromListButtonsOnHover`
  • Added secret setting: `MHG.Secret.SimulationSpeedMenu.SavedSpeedWiggleData`
  • Added secret setting: `MHG.Secret.SimulationSpeedMenu.AutoResumeSimulationWhenChangingSpeed`
  • Added server config value: `DefaultSimulationTPS`
  • Added server config value: `MaximumSimulationTPS`
  • 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.
  • Added secret setting: `MHG.Secret.UnityMaximumDeltaTime`


Fixy Pointy

  • 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
  • Added secret setting: `MHG.Secret.UI.EditFlagMenu.CloseImmediatelyWhenBigColorClicked`
  • Added secret setting: `MHG.Secret.UI.EditColorableComponentsMenu.CloseImmediatelyWhenBigColorClicked`
  • 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
  • Added command: `ExportThumbnailCache`
  • Added command: `RegenerateThumbnailCache`
  • Added secret setting: `MHG.Secret.Thumbnails.ThumbnailAmbientLighting`
  • Added secret setting: `MHG.Secret.Thumbnails.ThumbnailDirectLighting`
  • Added secret setting: `MHG.Secret.Thumbnails.ThumbnailRenderSizeFactor`
  • Added secret setting: `MHG.Secret.Thumbnails.ThumbnailAntiAliasing`
  • 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
  • Added secret setting: `MHG.Secret.Interactables.StopInteractionIfLookingAtNonInteractable`
  • 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)
  • Added secret setting: `MHG.Secret.ScreenshotFlashColor`
  • 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)
  • Removed intro screen in non-preview versions
  • Added secret setting: `MHG.Secret.PreviewsOnly_SkipIntroScreen`
  • Added Herobrine


Logic World v0.91 coming soon; previews available now

Greetings, gamers!

After many months of very hard work, Logic World's first major update is almost ready. v0.91 has some major performance upgrades, countless bug fixes and stability improvements, a few juicy new features like the Simulation Controls, and many smaller tweaks focused on improving quality-of-life like Chair-only Keys.

We hope you enjoy the update! If you're eager to try it out right away, follow the instructions below to check out the Preview versions. Once we've fixed all the nasty little bugs that the Preview People will surely find, the update will be fully released.

Help us localize the new features


If you speak a non-English language, we'd love your help translating Logic World to that language! All the new translation strings in 0.91 are ready for you to translate. Head over to https://logicworld.net/translate to get started.

Notification of upcoming price increase


Simultaneously with the full release of update 0.91, we're going to raise the price of Logic World from USD$12 to USD$15 (and regional equivalents). It has always been the plan to increase the price throughout Early Access, and this new price point reflects that 0.91 is a more polished and more valuable product. There will be several more price increases before we get to 1.0.

We are currently planning to never have a discount on Logic World, so the current price point is the lowest it will ever be. If you haven't bought Logic World yet, now would be a savvy time to do so :)

Get access to the 0.91 previews


Note: preview versions might be unstable and buggy. Consider waiting for the full release before trying the update.

To get access to the 0.91 previews:

  1. Back up your saves. We're pretty sure there are no giant horrible save-destroying bugs in the previews, but hey we're not omniscient, so be cautious and back up your saves! 0.91 saves are not backwards-compatible with 0.90; upgrading is a one-way process.
  2. In your Steam library, right click Logic World and click "Properties..."
  3. Select the "BETAS" tab, and choose the "public-previews" branch.




Steam will now download the latest preview version. The same instructions work for the dedicated server.

If you find a bug in the previews, please report it on the Logic World Issue Tracker, and specifically mention which preview you discovered it on.

Please leave feedback on the new features and changes in The Big 0.91 Feedback Thread.

Changelog


Here is the full list of changes in the 0.91 previews! This post will be updated every time a new preview is published, and we'll also post a notification in the #news channel of the Logic World Discord server.

[h2]v0.91 Release Candidate 1 (revision 645)[/h2]

  • Slightly improved future-proofing of the save loader & analyzer
  • Fixed the simulation unpausing in singleplayer if you pause the simulation, then open and close the pause menu
  • Edit pass on the 0.91 changelog
  • 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 🇺🇦
  • Removed "preview" designation 🚀


[h2]v0.91 Preview 632[/h2]

  • Music is loaded from disk more reliably; fixed music playback issues on some systems (#422)
  • Added command: `input.ExportSystemKeyNames`
  • Fixed keybindings on MacOS sometimes displaying as empty strings, FOR REAL THIS TIME


[h2]v0.91 Preview 627[/h2]

  • Colliders are now always enabled when the object is visible. This fixes many bugs including #428 and #429.
  • 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.
  • Added secret setting: `MHG.Secret.UnityMaximumDeltaTime`
  • Removed secret setting `MHG.Secret.LimitColliderDistance`
  • Fixed occasional error screen when resizing (#453) which also hopefully fixed the errors when cloning (#451)
  • Fixed the Board Drawing mechanic going goblin mode if you try to draw a board bigger than the maximum board size (#453)
  • Setting the Music Frequency setting to "Never" now prevents music from playing on the main menu, as well as during gameplay (#435)
  • Fixed setting descriptions being cut off in the Settings Menu sidebar if the description is sufficiently long (#342)
  • Added a new setting: "Pause on Defocus". Disabled by default. (#191)
  • Linux: fixed the camera moving when the game window does not have focus and the cursor moves into the game window area (#148)
  • (Hopefully) fixed keybindings on MacOS sometimes displaying as empty strings
  • (Probably) fixed the game randomly crashing on startup sometimes (#458)
  • Parsing errors for SUCC files in mods now provide the path to the file instead of a GUID (#443)
  • Removed a profane debug statement that was accidentally left in (#456)
  • Fixed console error spam if you have the Help menu open and you switch game states on two consecutive frames (#395)


[h2]v0.91 Preview 608[/h2]

  • Fixed the game not working if loopback is the only network interface available (#425)
  • Fixed music not playing on first load of main menu
  • Pretty much fixed the music sometimes stuttering during playback (#422)
  • Fancy pause menu music effects are snappier by default
  • Fixed the loading screen not showing up when connecting to a server with the UI
  • Fixed instanced geometry sometimes being invisible when you're more than 1000m away from the world origin. The limit has been expanded to 50000m, which is well outside the playable game area so it should be fine now ¯\_(ツ)_/¯
  • 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)
  • The Resolution setting is now disabled while the game is running in windowed mode, and in general windowed mode is handled much better
  • The Resolution setting is now properly saved as a Vector2Int instead of a string with extraneous data
  • Fixed UI popups not being properly fitted within the screen area
  • Custom MessagePack formatters now use MessagePack best practices (#259)
  • Miscellaneous minor optimizations


[h2]v0.91 Preview 586[/h2]

  • Fixed not being able to clone an object and place it on itself
  • (Hopefully) fixed objects sometimes being invisible and then crashing the game


[h2]v0.91 Preview 582[/h2]

  • Multi-Clone now supports cloning wires that connect the different selected objects (#73)
  • During Grab, Clone, and Resize operations, the placing ghost will now update its circuit states instead of being frozen
  • Added secret setting: `MHG.Secret.Building.PlacingGhostsRecieveCircuitStateUpdates`
  • During a Multi-Select pass, components which are a child or parent of the initially-selected component will no longer be added to the selection. I would love to hear your feedback on this -- is it a good change?
  • Added secret setting: `MHG.Secret.Building.MultiSelector.AllowSelectingChildrenOfFirstComponentInPass`
  • Added secret setting: `MHG.Secret.Building.MultiSelector.AllowSelectingParentsOfFirstComponentInPass`
  • 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)
  • 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
  • Added secret setting: `MHG.Secret.UI.EditFlagMenu.CloseImmediatelyWhenBigColorClicked`
  • Fixed sometimes not being able to rotate Switches, Buttons and Keys without grabbing them first (#206)
  • Fixed sometimes placing from the wrong point of a large object when you grab it
  • Fixed rotations getting out of sync during Multi-Clone if you try to rotate before the first successful placement (#268)
  • 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 Delayers getting out of sync after being cloned
  • Fixed undoing build actions that deleted wires breaking the undo stack (#399)
  • Fixed error screen if you tried to Redo while the undo history is empty
  • Fixed placing ghosts sometimes being invisible for a few frames after you Grab something
  • Fixed errors in the console when grabbing and resizing Flags
  • Fixed warnings in the console when grabbing multiple Flags
  • Improvements to physics performance
  • Improved performance of Clone operations


[h2]v0.91 Preview 554[/h2]

  • Improved performance of walking the circuit network graph for large clusters. This gives us a significant additional speedup for save loading times and when moving a lot of Sockets. Thank you to GHXX for giving me a tip on how to do this!
  • Multi-Grab and Multi-Clone handle a bunch of edge cases much better, particularly related to circuit boards
  • Various improvements to Multi-Edit, especially with regards to colorable components
  • Added secret setting: `MHG.Secret.UI.EditColorableComponentsMenu.CloseImmediatelyWhenBigColorClicked`
  • Fixed hovered colors in the Quick Color Chooser being persistently applied when the operation is canceled (#71)
  • Fixed not being able to resize short Flags
  • Fixed flip state not always being correctly detected for Grab/Clone operations (#351)
  • Fixed world outlines becoming all fucked up after editing a Chair
  • Fixed selected components not being outlined while in Edit Component menus


[h2]v0.91 Preview 536[/h2]

  • Improved performance and reduced allocations when grabbing or cloning stuff
  • Reduced memory usage in large worlds
  • Improved performance of checking Socket connections
  • Significantly improved the performance of instantiating the circuit network graph when loading a save (#397). This might break things, please check if this breaks things.
  • Upgraded server runtime to .NET 7.0
  • The packet IDs for `DiscoveryRequestPacket` and `DiscoveryResponsePacket` are now hardcoded to the IDs they had in 0.90, so server discovery is now properly backwards-compatible (#424)
  • Fixed sometimes not being able to delete sandboxes using the UI (#101)
  • Fixed the integrated server process not being killed in some cases where it should be (#401)
  • Fixed new player positions not being applied until all overlay UI is closed
  • Added command: `runtimeinfo`


[h2]v0.91 Preview 510[/h2]

  • Linux: fixed crazy issues with SUCC files on that prevented the game from starting up properly (#423)
  • Linux: fixed mouse button presses sometimes registering as phantom scroll wheel events (#146)
  • Linux: fixed Action Wheel segments being invisible on OpenGL (#41)
  • The default graphics API is once again Direct3D 11 on Windows and OpenGL on Linux. Vulkan will be made default on both platforms in a later update when we fix it crashing on some systems. Fixes #436
  • SUCC file auto-reloads are more reliable
  • There are far fewer disk writes related to game settings, especially on startup, which should improve startup performance
  • The game will no longer enforce the Resolution setting when running in windowed mode. If you set a custom resolution for the game window that's different from what the Resolution setting says, that custom resolution should now persist when you re-launch the game.
  • 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
  • Added command: `UI.Debug.LogObjectsUnderCursor`


[h2]v0.91 Preview 485[/h2]

  • Fixed the instancing shader not working on OpenGL
  • Added OpenGL as a fallback graphics API on Windows and MacOS


[h2]v0.91 Preview 483[/h2]

  • Fixed Gridlands customizations not working
  • Fixed in-game changelog menu being broken
  • Fixed jankiness when using the scroll wheel in the debug console
  • OpenGL can now be used again on Linux with the command line argument `-force-glcore`


[h2]v0.91 Preview 477[/h2]

  • Dramatically improved the client-side performance of updating the color of a large number of objects (i.e. when a large circuit is running) using cool ass compute shaders
  • On Linux, the graphics API has been upgraded to Vulkan, which hopefully fixes everything being broken in some Linux environments (#421)
  • On Windows, the graphics API has been upgraded to Vulkan, but (for now) you can still use Direct3D 11 with the command line argument `-force-d3d11`
  • 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.
  • Fixed the server always saving on close even if the server config value `SaveOnClose` is set to `false`
  • Fixed error screen in some situations with multi-wire placing
  • Multi-wire placements with only one peg in the first selection now work properly


[h2]v0.91 Preview 461[/h2]

  • Fixed chunks starting out invisible until you go away and come back
  • Fixed server errors when you modify the number of pegs on a Display (#419)
  • More kinds of errors in the game loop are now caught and trigger an error screen
  • Improved client-side loading performance a bit more
  • The screen now flashes grey instead of white when you take a screenshot
  • Added secret setting: `MHG.Secret.ScreenshotFlashColor`
  • Updated the "Performance Impact" displayed in the settings menu for various graphics settings to be more accurate to the new rendering tech


[h2]v0.91 Preview 451[/h2]

Building

  • Multi-wire placement is now treated as a single action in the undo/redo history, instead of one action per wire placed (#318)
  • Wires can be slightly shorter now
  • 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
  • Fixed undo/redo stack breaking and causing errors sometimes (#396, #281)
  • Fixed log spam with "Look viewing rotation vector is zero" during some edge cases with grabbing
  • Fixed a few issues with multi-edit
  • Fixed some issues with components moving around upon completing a multi-resize (among them #266)
  • Fixed board drawing sometimes not properly snapping to a square size when holding shift (#203)
  • Fixed canceling multi-wire placement not removing the outlines of the selected pegs (#233)


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 to Mod key while flipping a row of switches, they will all be set to the same state as the first switch flipped (#60)
  • Added secret setting: `MHG.Secret.InvertMultiSwitchInteractionModKeyBehavior`
  • The input pegs on XOR Gates, AND Gates, D-Latches, Oracles, and Relays are now slightly longer
  • Fixed some unintuitive Delayer behavior that could, among other anomalies, allow one-tick pulses to go through a two-tick Delayer (#183)
  • Fixed Chairs sometimes erroneously complaining that they are occupied (#223)
  • Chairs will no longer be outlined if you look at them while they are occupied


Simulation Speed

  • Added Simulation Speed menu. It can be accessed through a new button in the pause menu or with a hotkey, bound by default to `F9`
  • Added a hotkey to pause or resume the simulation, bound by default to `F10`
  • Added a hotkey to step one tick forward through the simulation (when the simulation is paused), bound by default to `Shift+F10`
  • Added secret setting: `MHG.Secret.SimulationSpeedMenu.ShowRemoveFromListButtonsOnHover`
  • Added secret setting: `MHG.Secret.SimulationSpeedMenu.SavedSpeedWiggleData`
  • Added secret setting: `MHG.Secret.SimulationSpeedMenu.AutoResumeSimulationWhenChangingSpeed`
  • Added server config value: `DefaultSimulationTPS`
  • Added server config value: `MaximumSimulationTPS`
  • 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 when a new player joins the server even if the players currently on the server have paused it (#347)


Circuitry

  • Outputs that should start on (such as the outputs of newly placed Inverters) now start on in the simulation
  • Fixed component outputs sometimes 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
  • 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.
  • Added secret setting: `MHG.Secret.LimitColliderDistance`


Fixy Pointy

  • 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 the saved blotter format version doesn't match the current blotter format version
  • 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 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
  • The About menu, Languages menu, and Teleport menu can now be accessed from the Pause menu
  • 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`
  • Enabled smooth scrolling for the Settings Menu sidebar
  • 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 the game being unpaused in singleplayer when accessing a sub-menu of the Pause menu
  • 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


Thumbnails

  • Thumbnails are now be anti-aliased
  • Thumbnail lighting is now independent of environment lighting, so thumbnails will now always look consistent
  • Thumbnails for single components where the output is supposed to start on, such as Inverters, now properly appear on in the thumbnail
  • Added command: `ExportThumbnailCache`
  • Added command: `RegenerateThumbnailCache`
  • Added secret setting: `MHG.Secret.Thumbnails.ThumbnailAmbientLighting`
  • Added secret setting: `MHG.Secret.Thumbnails.ThumbnailDirectLighting`
  • Added secret setting: `MHG.Secret.Thumbnails.ThumbnailRenderSizeFactor`
  • Added secret setting: `MHG.Secret.Thumbnails.ThumbnailAntiAliasing`
  • 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 that appeared wherever geometry intersected 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!


Movement

  • 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


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
  • Added secret setting: `MHG.Secret.Interactables.StopInteractionIfLookingAtNonInteractable`
  • 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")
  • Fixed reloading the settings causing music to stop playing (i.e. by switching settings profiles)
  • The fancy music effects in the pause menu are now a bit more subtle by default


Modding

  • Fixed InputPeg.AddPhasicLinkWith throwing a NullReferenceException in many cases


Server

  • Periodic server tasks can 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


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 to 2019.4.40f1
  • Upgraded server runtime from .NET Core 3.1 to .NET 6.0
  • Fixed there being an omega (Ω) in the name of a dll, which prevented the game from working properly in some environments
  • All error messages and APIs are now PG-13
  • The server now explicitly rejects wire requests between two outputs (previously, it would throw an error if sent one)
  • The game now updates `___LastLoadedGameVersion` in `settings_master.succ` with the most recently loaded game version every time the game starts
  • 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.
  • Removed `config_override` files. All server config values are now stored only in `config.succ`
  • Added a system for updating CustomData in saves when the layout for a component's CustomData changes between versions


Miscellaneous

  • Removed startup screen in non-preview versions
  • Added secret setting: `MHG.Secret.PreviewsOnly_SkipIntroScreen`
  • Changed default offline player names from "Citizen [random number]" to "Bobby #[random number]", and reduced the max size of the random numbers
  • 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`
  • When taking a screenshot, the screen now flashes white
  • The FPS counter no longer erroneously reports 60FPS for the first second it is enabled (#350)

Logic World Wednesdays: The Even Clickier Edition

Chair-only Keys - Jimmy


I added a much-requested option to Keys that only allows them to be pressed while sitting in a Chair.

[previewyoutube][/previewyoutube]

Even More Configurable Action Wheel - Jimmy


I added a slider to the Action Wheel to change its size, as well as a button to reset the Action Wheel to its default configuration.

[previewyoutube][/previewyoutube]

I'm planning to add even more customization options to the Action Wheel later, like changing the inner radius of the segments and the opacity.

Even Clickier Switches - Jimmy


I added a nifty little feature that lets you quickly set a whole line of switches to a single state.

[previewyoutube][/previewyoutube]

Web Request Tracing - Felipe


As you know from previous LWWs, the logicworld.net website's backend is made up of many individual services, each responsible of a number of tasks. When you make a request to the website, the main web service calls all of the necessary services, which in turn can call other services. This can make it difficult to know what actually happens when a request is made, since there is no way to know how the service calls are related to one another.

To remedy this, there is a thing known as tracing. When implemented in a system such as ours, tracing adds metadata to each call that associates it with the top level call, allowing us to know why and when a service is called. This also makes it easy to identify performance bottlenecks, since we can know what took the longest time.

I've now implemented tracing for all of logicworld.net's services. This will make the web services easier to debug and to optimize.



0.91 previews coming very soon


We are almost done with 0.91, the first major update for Logic World. It is on track to be fully released later this month. Before that, though, we'll be releasing it "in preview". This means you'll be able to opt-in to downloading the update early, but it isn't guaranteed to be 100% stable. The primary purpose of the preview releases is to get more people and systems hunting for bugs, so that the full release can be as bug-free as possible.

If all continues to go well, public 0.91 previews will begin later this week :)


---------------------------------------------

To make sure you don't miss the next blog post, you can sign up for our newsletter. Be sure also to wishlist Logic World on Steam and join the official Discord.

See you next Wednesday!

View this post on logicworld.net

More Logic World Wednesdays