Hello gamers. It is time for another radical new Logic World update! Version 0.91.3 is out now, and you can get it right here on Steam.
This is a nice juicy update filled with dozens of improvements and bug fixes. As usual, for all the thrilling details, you can read the full changelog below.
But the highlight of this update is the new features for downloading Creations. We've added a new menu to the game for downloading Creations from the Creation Hub, so exploring the community's builds is easier than ever.
And you don't even have to copy-and-paste a link to do this. If you browse the Hub, you'll notice some new "Open in-game" buttons. Pressing one of these buttons will now open Logic World directly to the new menu, and you'll be playing on the world seconds later!
The "Open in-game" links use our new URL protocol, logicworld://. It's supported on all three of our platforms -- Windows, Linux, and MacOS. You just need to register the protocol first: for more information, check out this post.
So have fun browsing and exploring the Hub! There's a ton of really cool builds already on there, and it's now almost completely frictionless to check them out.
And if you've got a cool build that you haven't shared on the Hub yet, please upload it so we can all check out your work. Uploads are just as easy as downloads: while in-game, open the pause menu with the Escape key, and click on "Upload this sandbox".
Enjoy the update. See you soon :)
0.91.3 Changelog
Creation Downloading
- Added an in-game menu for downloading Creations from the Creation Hub. It can be accessed via a new button in the main menu.
- Added a protocol handler: `logicworld://` links now get opened by the game, allowing quick and easy downloading of Creations. For this to work, you first need to click the "Register Protocol" button in the Download Creation Menu.
- Added command: `OpenDownloadCreationMenu [creation ID or URL]`
- Added secret setting: `MHG.Protocol.EnableProtocolListeningOnUDP`
- Added secret setting: `MHG.Protocol.ListeningUdpPort`
- When Grabbing or Cloning on a smooth surface like Grasslands, you can now hold the Mod key (by default left ctrl) to rotate the object freely.
- Pick Component will now try to match the full detail of the component, if possible. For example, if you have both a red and blue circuit board in your hotbar and you use Pick on a red board, the red board in your hotbar will now be selected.
- Fixed several exceptions with Grabbing that could happen if you tried to grab an object before the server finished confirming a previous building operation. In these cases, the Grab operation will fail now (and you can try again a second later).
- Fixed exception when canceling a Resize operation if another player has moved or resized that component while you were resizing it.
- Fixed Resizing still moving child components around in a few edge cases.
- Fixed Resizing an object with wires attached without changing the component size causing wire ghosts to remain.
- If an undo or redo fails, a message will now be printed to the debug console.
- Fixed server exception when undoing the creation of a component that another player deleted.
- Fixed undo history becoming corrupted when server is very busy (frozen) and applying multiple multi-build-request operations in that time.
- Fixed redo crashing the client if an undo operation previously failed.
- Fixed redo silently failing when trying to delete wires that were already deleted as a side effect of a component deletion.
- Fixed missing wires after undoing and then redoing a Clone operation with internal wires.
- Added a "Report a Bug" button on the Main Menu, Pause Menu, and Error Screen. Pressing this button brings up instructions for how to report a bug or issue with the game.
- In the Singleplayer menu, the Details pane for a saved game will now show which mods are in that save's registry.
- Fixed various issues with hotbar item management.
- Fixed the volume sliders in the Edit Singer and Edit Drum menus having an incorrect maximum value.
- Fixed the color chooser in the Edit Label menu not properly showing the correct selected color about 50% of the time.
- Fixed the Help menu flickering for a frame when you start placing an item on the hotbar.
- Added an experimental "Component Action" API. It allows sending custom bytes to a component between server and client.
- Added new manifest property `IncludeModInfoInSave`, which allows mods to control when their info (ID and version) are stored in save files.
- Cache folders will now be automatically deleted when switching/updating to different game version. This triggers a mod recompilation.
- Modders can now create and inject undo history entries.
- Multi-Undo build request sending now allows callbacks. (#398)
- Improved "mod has no mod type" exception messages to mention the issues with inheriting Server/ClientMod class.
- Mod compilation errors are now shown on the error screen, so you don't need to check the logs to see these errors.
- Fixed (new) mod instance creation failure detection hiding some other common exceptions (e.g. "Mod has no mod-type").
- Fixed a game crash in multiplayer when your game has modded components that the server does not have and a component deletion is undone.
- If there is an error with starting up the game, the error screen will now be properly shown with information about that error, instead of an empty black screen.
- Added a "Copy Error" button to the error screen. Please make use of it when reporting issues :)
- The error screen can now show stacktraces and other details in an expandable info box.
- Added secret setting: `MHG.UI.ErrorScreen.OpenErrorDetailsByDefault`
- Everything you see in server or client console will now be added to the log files.
- Log files will now contain stacktraces for exceptions.
- Command executions by player or console or LSF will now be logged in the log files.
- Improved logging throughout the program.
- Added server command-line argument: `--ansi-rgb`. This will make the server use Ansi RGB color codes in the plain text console. If the terminal supports RGB, colors will be accurate.
- Removed server LICC log file (log.txt).
- Unused components will no longer be added to world or subassembly save's component registry.
- Mods which provide components placed in the world will now be automatically included in the save's mod registry.
- When teleporting to another player, you no longer teleport inside them: instead you teleport next to them, looking at them. This is similar to how teleporting to Flags works.
- Fixed the `tp
` command not working.
- Added command-line startup option: `-open-save
` - Added command-line startup option: `-join-server
[-server-password ]` - Added command-line startup option: `-open-url
` - The new command-line startup options take precedence over equivalent startup secret settings.
- Added command: `debug.printcommandlinearguments`
- Added command-line startup option: `-join-server
- Added WIP translations for Pirate Speak.
- Updated translations and translator credits for Czech, Estonian, Finnish, French, German, Hungarian, Japanese, Korean, Polish, Portuguese (Brazil), Russian, Slovenian, Spanish (Spain), and Swedish.
- Enabling or disabling noclip will now only print a message to the debug console if you do it via the `noclip` command. This prevents the console being spammed with messages if you use the secret setting `MHG.Flying.Secret.AutoEnterNoclipOnStartFlying`.
- Fixed copying messages from the client console sometimes copying rich text tags.
- Fixed a server memory leak on game save when no players are online.
- Fixed a rare case where the client and server failed to properly exchange component CustomData, leading to mess and disaster.
- Fixed the "Upload this sandbox" button sometimes not working.
- Fixed typos in several secret settings and server config values: `Nolcip` was fixed to `Noclip`, `Recieve` has been fixed to `Receive`, and `TimeOut` has been fixed to `Timeout`.
- Fixed the Crash of Doom, which made the whole world disappear except some floating disembodied wires.
- We now properly handle several situations where a crash could become even crashier when trying to remove outlines.
Hello! As we discussed last week, were working on a new game update, and it will be out in a few days. In the meantime, heres a little blogging from Ecconia on one of the changes coming soon our new logging system.
You can check out the full blog here on logicworld.net :)
Hey everyone! Weve been hard at work on Logic World, and we thought it was about time we gave you an update on how things are going.
As we announced in a previous post, were working on switching Logic Worlds game engine from Unity to Godot. This process is going to take a while; well discuss it in more detail in future blogs. In the meantime, we decided to do another update in the Unity engine to fix some more things and add some new features.
Logic World v0.91.3 is coming out next week. Were excited to get it out to you!
If you want to know more, Ecconia has written on our blog about some of the changes coming in v0.91.3, particularly those relevant to mods and modders. If you like juicy technical details, click here to check out that blog.
See you soon for the game update!
Salutations, gamers!
Logic World update v0.91.2 is now available for download! You can get it right here on Steam. This update contains numerous large performance improvements, some upgrades to the building mechanics, and a veritable plethora of tweaks, improvements, and bugfixes across many areas of the game. As usual, the full list of changes can be found below.
This is the first Logic World update that contains work from all five of us in the newly expanded core development team: Jimmy, Felipe, Zoey, Ecconia, and GHXX. We're very proud of this update we've made together and we really hope you enjoy it.
If you haven't yet, you may want to read last week's State of the Logic World blog post, which goes into detail about the status of this project. You may also want to join our vibrant Discord community and subscribe to our very cool newsletter.
Thanks for playing. Much more will follow. We'll see you soon :)
0.91.2 Changelog
Performance
- Significantly improved loading times for larger worlds (>100,000 components) by batching collider instantiations.
- Fixed an issue that made hot-loads slower than cold-loads for larger worlds. All worlds now load faster hot than cold.
- Limited the maximum physics delta time to prevent physics death spirals. This should significantly improve framerates in large worlds for most cases.
- Sockets find their connections faster now. This means that initial world loading times are faster in worlds with lots of Sockets, and furthermore, placing or moving a lot of sockets at the same time will create less severe lag spikes.
- Server tick scheduling has been improved to reduce the amount of time the server can spend idle and not simulating the circuitry. Faster simulation speeds can now be accessed before the server starts skipping simulation time.
- The simulation now tries to catch up lost time over multiple server ticks, and only begins skipping simulation time once the simulation tick debt crosses a configurable threshold.
- Removed the server config value `MaxAllowedTimeStepSeconds`, and replaced with with the new server config value `MaxAllowedSimulationTickDebtSeconds`, due to the new simulation catch-up system described above.
- Assorted additional optimizations.
- Improved item movement during Multi-Grab and Multi-Clone operations. Items are much better at finding nearby valid placements, have a far greater tolerance for vertical displacement, and conform more strictly to their target rotations.
- Added secret setting: `MHG.Placing.Secret.MultiPlacementMaxVerticalVariance`
- Added secret setting: `MHG.Placing.Secret.MultiPlacementCastHeightIncrement`
- Edge extensions are now only enabled during fine placement, so it's easier to place circuit boards into tight spaces.
- Fixed false-negatives when detecting valid placements; you should now never be erroneously prevented from placing objects next to each other.
- By default, servers will no longer automatically save the game or make auto-backups while no players are connected. However, these behaviors can be restored by enabling the new server config values `DoAutosaveWhileServerIsEmpty` and `DoAutoBackupsWhileServerIsEmpty`.
- If the server is started with the command-line argument `--help`, it will now print a help text with available command-line arguments, and then shut down.
- If the server is started with invalid command-line arguments, it will now display an error message followed by the `--help` text, and then shut down.
- Disabled terminal prompt prefix `>` when the `--plain-text` server argument is set.
- The server console no longer waits for input before closing if there is an error on startup.
- Fixed exception on server shutdown if `AnnounceOnLocalNetwork` is turned off. (#484)
- New format for save files, Blotter v7, with minor binary formatting tweaks.
- Added save converter from v6 to v7 (Blotter v6 was used from Logic World v0.91.0 to v0.91.1).
- Added save converter from v5 to v7 (Blotter v5 was used from Logic World v0.90.0 to v0.90.3).
- The game will now automatically back up a save before converting it to a new save format version.
- When you create multiple saves with the same title, the on-disk filenames will now use an incrementing counter (i.e. `world`, `world (1)`, `world (2)`) instead of appended dashes (i.e. `world`, `world-`, `world--`).
- Hotbar title text now fades out after a short time with the same slot selected.
- Added secret setting: `MHG.UI.Hotbar.FullTextDuration`
- Added secret setting: `MHG.UI.Hotbar.FadeTextDuration`
- Fixed some glitches and inconsistent behavior with hotbar item management.
- Fixed base building UI rendering behind world geometry when another menu is open.
- Updated translations and translator credits for Bulgarian, Croatian, Czech, Dutch, Estonian, Finnish, French, German, Hebrew, Hungarian, Korean, Polish, Portuguese (Brazil), Romanian, Russian, Spanish (Spain), Swedish, Turkish, and Ukrainian.
- Added preprocessor symbols `LW_SIDE_SERVER` and `LW_SIDE_CLIENT` for compiling a section of mod code only the server or only on the client. (#489)
- Added a hook for post-parse save transformation to `SaveReader`, which mods can use to update their components.
- If a server-side mod fails to compile, the server will now immediately shut down instead of continuing to load the save with a mod missing.
- Client-side mod compilation errors now get printed at INFO log level. (#310)
- When a mod instance fails to load, the error message is now more helpful, and instructs you to try deleting the cache folders.
- Fixed CS1701 warning spam on client compilation error.
- Improved handling of exceptions during application initialization to prevent outrageous error spam.
- Fixed some exceptions being logged twice.
- Fixed the client being spammed with exceptions if another player joins or leaves near a barrier.
- Fixed exceptions when disconnecting from a server.
- Fixed a crash that could occur with a particular easter egg that pops up on Markku's birthday.
- Fixed not being able to join singleplayer games when UsePassword is enabled in `config.succ`. (#400)
- Fixed occasional erroneous floating wires not being removed when the game is reloaded. (#482)
- Fixed client crash to error screen on server rejoin when the server's simulation is struggling if the Simulation Speed Menu was not previously opened.
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:
Zoey
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. [quote]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. [/quote]
Ecconia
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. [quote]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 :) [/quote]
GHXX
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. [quote]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. [/quote] 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.
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
- 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)
- 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
- 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.
- 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
- 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
- `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
- 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
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!
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
- 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)
- 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
- 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
- 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)
- 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`
- 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)
- 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
- 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 theyre supposed to
- Fixed console error spam if you have the Help menu open and you switch game states on two consecutive frames (#395)
- 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
- 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, Nshu, 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!
- 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
- 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
- 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
- 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)
- 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
- 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`
- 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
- 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, youre 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 components 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)
- 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.
- 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
- 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
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: [olist]
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.
Known issues
This is a list of problems with the previews that we're aware of, and which we will fix before the full 0.91 release.
- When moving around large worlds, there are occasional lag spikes. Framerate is stable when standing still.
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.
v0.91 Preview 461
- 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
v0.91 Preview 451
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)
- 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
- 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)
- 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)
- 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`
- 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)
- 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
- 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 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
- 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, Nshu, 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!
- 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
- 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
- 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
- Fixed InputPeg.AddPhasicLinkWith throwing a NullReferenceException in many cases
- 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
- 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
- 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)
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=yxbNUpLbT5Q;full][/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=EbLLz_avcrY;full][/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=KxRh_K174ts;full][/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
Super Sortable Issues - Felipe
I've been working on improvements to the Logic World issue tracker that make it easier to navigate the growing list of tracked issues. You can now input an advanced query that sorts issues based on their status, type, tags, title, and body contents.
The '|' and '&' characters can be used, respectively, as "or" and "and" operators. When querying issue title and body contents, regex is supported. This new querying helps us immensely in finding specific issues, viewing issues in a specific category, and determining what issues to work on next. In the future I plan to add a UI for generating these advanced queries, similar to what Github has for issue sorting.
Status Shenanigans - Felipe
I created a new status page at https://status.logicworld.net/. This page monitors for outages in the Logic World services, and provides a place for us to announce any planned downtime.
There's also a feed in the Logic World discord server that automatically posts status updates using webhooks. As Logic World grows, we will have more services, and more people will rely on them, making it important to have this status page.
Less Forgettable Image Attachments - Felipe
The logicworld.net system for including images in forum posts or tracker issues requires you to first upload an image, then insert that image into the body of the post. However, many users did not immediately understand this flow, and assumed that once they'd uploaded an image, it was already part of the post. The users were confused when they made the post and the image was not included with it. To help users understand the flow better, I've added a little warning when an image has been uploaded but not included in the post.
Beating Up Bugs like they Owe me Money - Jimmy
In preparation for the release of update 0.91 -- which I think I'm going to christen "The Less Buggy Update" -- I've been hammering away on more bugs and stability fixes. This has been made much easier thanks to Felipe's work on improving the issue tracker, thank you Felipe! Notably, this week I fixed some nasty simulation glitches that were plagueing Dynamic Components (components with a variable number of input/output pegs, such as AND gates). #104 and #250 are no more (#104 had a pretty interesting cause, click to read my comment about it). And I also 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, and others). I'm VERY sorry those issues were in the game for so long, I know they've caused a lot of frustration :( We are on track for a 0.91 release in late September, and I expect we'll start public previews of the update next 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
Greetings Gamers, I haven't been able to work on Logic World much this week, but in the time I've been able to carve out for it I've been plugging away at bugfixes and stability improvements. My current task is sorting out the various networking issues with the game. I hate networking. What a mess it all is. Can somebody remind me why I decided to make this game multiplayer? This week I made a decision I'd like to share with you: we'll be reducing the scope of update 0.91 in order to get it out to you faster. I'm aiming to publish 0.91 around the end of September, with a public preview sometime before that. 0.91 will contain performance enhancements, a whole lot of bugfixes & stability improvements, and a few smallish features like the simulation controls. Meanwhile, the new building mechanics I've been planning -- included the much-coveted ability to save and load subassemblies -- will be coming in update 0.92 a few months later. More development updates soon! Not too soon, though -- I'll be on holiday with my family next week, so I won't be around for a LWW. I expect the blog will return on the 31st. Keep on Gamin'
GREETINGS! It's been another fairly unexciting week for me, but I've continued to plug away at miscellaneous maintenance tasks. Although Hofstadter's Law continues to out-Hofstadter's Law me, lots of work is getting done on Logic World and I am super excited about how development is going. Here are some highlights from my work week:
Hot-reloadable SUCC files
If you've poked around in the Logic World game files, you've probably noticed that there's a lot of data stored with my custom SUCC file format. In order to assist with development & debugging, I've made most of these files hot-reloadable: you can edit them on disk, and when you save the file, the game will reload the appropriate data and even update the user interface to reflect it. This includes `settings_master.succ` and its 100+ secret settings -- you no longer need to restart the game to change them. Note that this change applies to SUCC files outside the `GameData` folder. `GameData` files (i.e. mods) already have some SUCC hot-reloading support in 0.90.
.NET 6
I've upgraded the server runtime from .NET Core 3.1 to .NET 6.0. This is a more modern .NET and brings with it gratuitous performance improvements. I haven't really tested to see how it affects LW, but it seems kinda faster!
The Most Important Video Game Feature in the History of Video Game Features, Maybe Ever
I made the inverter output render as "on" in the item thumbnail.
------------------------------- Thanks for reading! More soon. Love, Jimmy
Hello Logicians! I've had a fairly pedestrian week of development, working on miscellaneous maintenance tasks. For example, I polished off last week's work on fixed point positions by updating the save format version: position data is now saved and loaded as fixed-point instead of floating-point, matching the new data structures that are used internally. I also added a save converter to the new format so that you can use all your 0.90 saves in 0.91, and I updated the sandbox list UI to notify the user of which saves are using the old format and need to be converted.
But my biggest task this week by far was to make some major updates to the world objects shader. This all started when I decided to address an issue with how thumbnails (the little isometric component graphics that appear in the Selection Menu and on the hotbar) are rendered. In 0.90, thumbnails look different depending on the scene in which they are generated. This is because the thumbnail renders use exactly the same materials as are used to render objects in the world. World objects are affected by environment lighting, so thumbnails are too.
This is kind of weird, but it's not a big deal in 0.90; I'm not sure if anybody but me has even noticed it. However, for some upcoming features I plan to add for 0.91, thumbnails really ought to be generated consistently and reliably, and look identical no matter where the generation happens.
So, I've upgraded the shader I wrote for GPU instancing. It now has two lighting modes: environment lighting and custom lighting. We use this new "custom" lighting mode for thumbnail renders, and so now it doesn't matter where they're created, they always have consistent lighting. I also added support to the shader for rendering in non-instanced mode, so we can use it for non-instanced decorations like the clicky part of buttons and switches, and these decorations will also have consistent, custom lighting applied to them in thumbnail renders.
Here's the result:
If you look closely, you'll notice a few more differences in the appearance of thumbnails between 0.90 and 0.91:
- Thumbnail renders are now anti-aliased, so the lines are smooth instead of jaggy. I already did this a few months ago, but I remember it was REALLY HARD so please appreciate it anew!
- I fixed some artifacts along the edges of thumbnail renders, most noticeably in components with pegs that go right to the edge like D-Latches and Sockets.
- The lighting is softer, with less contrast between the sides and tops of blocks. For now, the lighting otherwise emulates the 0.90 Grasslands appearance, but I'm still tweaking this. There will be secret settings for all the variables of thumbnail lighting, in case you want to customize it :)
Im back, baby!
Acknowledging the Absence
It's true: I've been away for a while. I feel like I should talk about that. A few months ago, I took a break from Logic World because I was forced to by carpal tunnel syndrome. Because of the break, I started doing all sorts of fun things with my life: I was playing new sports, making new friends, learning new skills, and working on new projects. Without really planning to, my quick break to let my wrists heal turned into an extended sabbatical, in which enjoying my life was my only priority. I hadn't taken a real break from working on this project since I started it in 2017. In hindsight, I think I really needed this one. But I'm back, baby, and I'm so freaking excited to be working on my dream game again! Going forward, I'm gonna strive to have a better work-life balance. One lesson I've learned this year is that I'm actually way more productive if I work a little less and play a little more. I'm also investing in an ergonomic workspace, so I don't injure my wrists again :) Let's take a look at what I've been working on recently!
Poggers Performance
As I've written much about on this blog, a big priority for update 0.91 is to *make game go fast*, especially for larger worlds. I have pretty much completed the optimization work for 0.91, so here's a quick comparison! World: FML-8 by Stenodyon (~70k components, ~78k wires) Settings: 3840x2160, default graphics but with post-processing and shadows disabled Hardware: Ryzen 7 2700X, RX Vega 64
A major improvement indeed! The game isn't quite as fast as I wanted to get it for this update, but I've decided to not let perfect be the enemy of good here, and just move on to other features. Read below for confusing technical info about the few remaining performance issues I wasn't able to solve.
Depth texture slowness
Something about instanced rendering makes the depth textures significantly slower compared to the old combined meshes approach. I'm not entirely sure why -- I'm still very new to hardcore graphics programming -- but I think it has to do with how the game needs to do a depth pass over every single instance, whereas with combined meshes, the engine could automatically cull faces and even entire meshes. The end result of this is that 0.91 is slightly slower in the following situation:
- The world is medium sized (~50k-150k components)
- All post-processing is on
- Shadow cascades are set to 4
Colliders being little bastards
Colliders are the system that allow for collision with components. They prevent the player from walking straight through walls, and they allow us to detect which object the player is looking at. As I've talked about on this blog before, colliders are a big reason for performance problems in Logic World, especially for the slow loading times. I've spent a lot of time trying to implement a "virtual colliders" system, where colliders only exist for objects nearby the player. Unfortunately, I just have to give up on this idea. Logic World sandboxes are too collider-dense, and Unity colliders just have too much overhead; they can't be moved around quickly enough for this application. For now, I've done a lot of research and testing, and I'm dealing with collider setup about as efficiently as it's possible to. Note the loading time improvement in the table above; the gains were mostly due to improved collider efficiency. But still, about 8 seconds of loading time are taken up on JUST colliders, and that number gets ever worse with bigger worlds. Not to mention the appalling RAM usage... In the future, we're going to totally replace the Unity collider system with an all-custom collider system hyper-optimized for Logic World's use case. This system should take approximately zero seconds of loading time, no matter how big your world is. Unfortunately, that is really hard to code, so it'll be a while before it gets implemented.
Glorious Glyphs
I've done a pass on Logic World's text rendering capabilities! Most notably, text can now display mathematics symbols (like ), music notation symbols (like ), and EMOJIS!!!!!!!
I freakin love emojis and I'm so happy that Logic World can now display them. Eventually, I want to display colored emojis with Twemoji. However, I need to wait for TextMeshPro (Unity's advanced text rendering system) to properly support colored glyphs. In the meantime, Google's Noto project has released a full set of uncolored emojis. TMP has no problem rendering them, since they're just regular uncolored glyphs, and in my opinion they look pretty good, so we're now using them in Logic World. In addition:
- 46 new written scripts are supported! These are mostly historical writing systems like Mayan numerals or Old Hungarian.
- Miscellaneous fixes for how the game displays Arabic and Adlam scripts (these and other RTL scripts are still not properly displayed as right-to-left, but will be soon!)
- Added an option to display CJK characters in the Hong Kong style (in addition to the existing options of Traditional Chinese, Simplified Chinese, Japanese, and Korean)
- Updated Font Awesome to 6.1.2, with over 7,000 new icons!
Fixing Bugs by Fixing Points
If you've built a large complex structure in Logic World, you've probably run into this issue: past a certain depth of parent-child component relationships, positions and rotations start to get screwy. Even before things entirely break down into nonsense, the components aren't perfectly lined up, which causes all sorts of issues while building. This issue has plagued many a Logic Worlder, and this week I FIXED IT!!! [previewyoutube=WdTXgrcSnqE;full][/previewyoutube] Here's how I did it. Turns out it actually takes a lot of work to make a video game work in the way you would intuitively expect it to.
Switching to fixed points for positions
The imprecision issues are caused by the inherent imprecision of [floating point numbers], also known as "floats". As you continue to manipulate floats, the tiny imprecisions compound on each other until they've built up to noticeable levels. I've switched component positions to using fixed points, which have a specific and constant level of precision (in this case, one millimeter). You can manipulate fixed point numbers as much as you like, and they will never lose precision -- unless you have to round them...
Smart and consistent rounding for rotations
Positions in 3D space are pretty straightforward, and it was relatively simple to switch them to fixed points. However, rotations in 3D space are really bloody complicated. I am not nearly smart enough to use fixed points in a rotation matrix. Thankfully, it doesn't seem to be necessary here. The game now rounds component rotations (to the nearest 0.1 degrees along each 3D axis) at two points: when assigning a new local rotation relative to the parent component, and after calculating the cumulative rotation from the whole stack. As you can see in the video, this rounding keeps the rotations nicely aligned.
Root reference frames
With the previous two changes implemented, I was still noticing a very very slight imprecision that built over time and nesting depth. However, this only occurred when the root component of a stack was not aligned with the world axes (i.e. placed on a Grasslands ground). The disadvantage of fixed point positions is that you have to round them to their precision level (in this case, one millimeter). You can't have a component at 420.69mm along the X axis; that number must be rounded to 421mm. This usually isn't noticeable, since every component in Logic World has dimensions in a whole number of millimeters, and almost every connection between components is at a right angle, so all components stay precisely aligned with the millimeter-scale grid. However, when components are rotated at non-right angles, they get pushed off of the millimeter grid. Their fixed-point positions, then, needed to be rounded, and these rounding imprecisions very slowly accumulated. I've fixed this issue by making components track their position and rotation not relative to the objective reference frame, but within the reference frame *of their root component*. Since component connections are almost always right angles, a component's position within the root reference frame will stay aligned with the millimeter grid and not accumulate imprecisions due to rounding errors. After calculating its position/rotation within the root reference frame, the rotation of that frame can then be applied to find a position/rotation within the objective reference frame. Shout out to PseudoGoose, who suggested this solution to me when we were discussing the problem some months ago :) --------------------------------------------- Thanks for being here. Thanks for caring about my crazy little video game that I love so much. It's good to be back. I'll see you next Wednesday. More Logic World Wednesdays
Framerate go brrrrr - Jimmy
I've spent the last several weeks working on major performance improvements for Logic World update 0.91. The primary goal of these improvements is to enable much bigger builds by shortening loading times, increasing framerates, and lowering RAM usage for worlds with a very high number of components. I'm finally at the stage where I can demo these performance improvements in-game! Here's a video showing off a test save that contains 1,000,000 inverters and 10,000 wires -- something that would be completely impractical in 0.90. [previewyoutube=MyI9iUZ8O74;full][/previewyoutube] I was almost at this point last week, but I ran into two major roadblocks, the tales of which I will presently regale you with. Annoying roadblock #1: shadows not working properly I spent forever getting my instancing shader to render shadows, as I showed off last time. Imagine my dismay when I integrated the shader with Logic World and the shadows broke. After extensive investigation, the issue turned out to be with using multiple meshes. Instancing a single mesh many times, as I was doing in my demo scene where I developed the shader, would result in correct shadows. However, as soon as you introduced a second instancer with a different mesh, the shadows would break. This made no sense and was extremely confusing. I'm still new to working with shaders & general graphics tech, so trying to fix a bug this outrageous was a daunting task. Nevertheless, I took the plunge; I read up on how shadowmaps work and tried everything I could think of to make them look normal again. After three days of this I had eliminated dozens of potential solutions, but was no closer to understanding the cause of the issue. Then, on a whim, I updated Unity to the latest patch release... and the bug was fixed!!! ALL ALONG IT WAS A UNITY BUG AND NOT A JIMMY BUG. Three days trying to fix it when it was completely out of my hands, and all I had to do was press "update". Well, lesson learned: in the future, when my code doesn't work, I'll be much quicker to blame someone else. Annoying roadblock #2: invisible thumbnail renders Logic World renders thumbnails for the items on your hotbar. This thumbnail-rendering system broke when I made the switch to GPU instancing. The world renders itself using Unity's Graphics.DrawMeshInstancedIndirect function, but this unfortunately is incompatible with Camera.Render, which is what we were using to render the thumbnails. Camera.Render executes in the middle of a frame, but DrawMeshInstancedIndirect only actually instances the meshes at the end of a frame. Therefore, those instances couldn't be seen by Camera.Render, and all the thumbnails were empty images. I did some reading, and I figured out that I should be able to instance the mesh during Camera.Render using something called camera command buffers. I wrote the code to do this, but it didn't work. I did some more reading, and it turns out that camera command buffers are not compatible with Unity's Scriptable Render Pipeline, which Logic World uses. So instead I started mucking around with Scriptable Render Features, which as far as I can tell are the only way of executing command buffers during Camera.Render in SRP. I did get the mesh instancing to work with this, but I couldn't figure out how to make it work with any lighting, so all the thumbnail renders were dark and ugly. Finally I gave up on doing things in a good clean way and implemented a crappy hacky solution. The only way I have of properly rendering the objects is with Graphics.DrawMeshInstancedIndirect, but that doesn't work until the end of the frame. So, we'll simply wait until the end of the frame to render the thumbnail. This unfortunately means that there will be one frame of delay between when we request a thumbnail and when it gets rendered; it also means that we can only render one thumbnail per frame, as otherwise the two items would overlap in the render. However, I believe I can mostly work around these issues by beginning thumbnail renders as soon as the game starts, so that every thumbnail you need is already rendered by the time you load into a world. Overall it took about two days to fix all the issues with thumbnail renders. Bleh. While I was there, though, I took the opportunity to up the quality: thumbnail renders are now anti-aliased. It's a subtle change, but a nice one. You might be able to notice the difference in the above video; the edges are much softer and less jagged. What's next? After I'd finished with the above two issues, it's thankfully been relatively smooth sailing to integrate the new rendering tech with Logic World. I've carefully checked everything, and all the visuals in 0.91 are now identical to the visuals in 0.90, down to every channel of every pixel. Objects look exactly the same, but they're much faster to render in large-world scenarios. I've still got a few more things to finish up with the optimizations, but I'm finally almost done with them. Once they're finished, I'll do a hefty round of bugfixing, and then I finally get to work on new features again! The hardest part of 0.91 is finished, and the update will be in your hands soon. --------------------------------------------- View this post on logicworld.net More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
It's been sixteen wednesdays exactly since the previous LWW, and we're very excited to be back! Logic World update 0.91 development is underway, and we've got lots to talk about this week.
Configurable simulation speed - Jimmy
Logic World launched with the ability to change the simulation speed using console commands, but this was an awkward and unwieldly process. I've been working on a proper user interface for changing the speed, which also allows you to pause the simulation and then advance it step-by-step. [previewyoutube=ubmdTi-srXs;full][/previewyoutube] Shoutout to @LOOPS99 for building the Fibonacci machine shown in the video. You can check out that build here.
Soundtrack publication
In case you missed it: this week, the Logic World Original Soundtrack was published on internet music websites! You can read more about the soundtrack, and find links to all your favorite music places, in this blog post. [previewyoutube=l0fFw0iizOc;full][/previewyoutube] Since the initial soundtrack launch, there have been a few updates. First, the Logic World Theme is now available on Bandcamp and Soundcloud. Second, we've started working to get the soundtrack published as a Steam DLC. Thank you to the folks who've requested that; we hear you, and it is coming! A few words from Logic World composer Markku Wainman on the soundtrack launch: > A big thank you to those who have been listening to the album. The reception has been amazing and I really appreciate all the kind words.
Revamped changelog - Jimmy
You may not know this, but Logic World has an in-game information page to display the changelog. In 0.90.3 this is a simple, single page of text, like the Credits and Roadmap pages.
However, after just three updates, it's clear that this approach scales poorly. First, there's the performance issue: in 0.90.3, when you open the Changelog page, there is a lag spike as Unity converts the 13,000 characters into a single mesh for rendering. Second, there's the usability issue: a single-page giant block of text is not fun to navigate! We make a lot of changes to Logic World, and our changelogs are very detailed, so these problems were only going to get worse with time. Thus I've remade the Changelog page from scratch. Starting in 0.91, the individual changelogs for each version can be expanded and collapsed by clicking on the headers. The giant block of text is no more, which fixes both issues described above. [previewyoutube=oD-TTmHe9Zw;full][/previewyoutube]
Better handling of exceptional SUCC - Jimmy
If you've gone digging around in the Logic World game files, you've probably encountered some files with the extension `.succ`. These files contain data formatted as text that is easy for humans to read and edit. They are generated and read using my custom data serialization library, SUCC. Previously, a significant limitation of SUCC has been its poor error messages. When something went wrong, there were very few clues about what exactly that thing was. Well, this week I've finally added good error handling to SUCC! When something goes wrong, SUCC will now provide:
- A description of the error
- The path of the file in which the error occurred
- The line number on which the error occurred
Optimization work - Jimmy
I've started working on some serious optimizations for Logic World. These will drastically improve loading times for large worlds, and significantly improve framerates while playing in large worlds. This work is in the early stages and I don't have anything to show for it just yet, but things look very promising, and I expect to have more concrete news soon. Stay tuned :) --------------------------------------------- That's all for this week, but we'll be back next Wednesday with another juicy blog post. To make sure you don't miss it, you can sign up for our newsletter. Consider also joining the official Discord. See you next Wednesday! View this post on logicworld.net More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
You've played the game, you've loved the music. You've wished you could keep listening to the music even when you're not playing the game. Well, today that wish comes true: the Logic World Original Soundtrack is now available on all your favorite internet music websites! [previewyoutube=l0fFw0iizOc;full][/previewyoutube]
Where can I get it?
Wherever you get your music, Logic World is there!
- Spotify: https://open.spotify.com/album/7bhGjykTos9uWsdqUSEAZq
- Bandcamp: https://markkuwainman.bandcamp.com/album/logic-world-original-video-game-soundtrack
- Apple Music: https://music.apple.com/album/1604541523
- Tidal: https://store.tidal.com/album/212083784
- Deezer: https://www.deezer.com/album/286891282
- Soundcloud: https://soundcloud.com/markku-wainman-433596264/sets/logic-world-original-video-game-soundtrack
- Youtube: in addition to the "full OST" video embedded above, you can listen to this playlist of the individual songs
Wow that album art is beautiful! Tell me more about it!
The gorgeous artwork you see on the album cover was specially commissioned for this soundtrack. It was created by the insanely talented Michael Yoshimura. You should definitely check out michael's website, and follow him on instagram @yoshimura_mike. And if you need some art made, commission him! You can get the album art in ultra high quality here, and you can get a clean version without the foreground text here.
Wait, I thought you said this would happen next Friday, on the 11th?
That we did, discerning one! But in the immortal words of the great Alanis Morissette, life has a funny way of sneaking up on you. Why did this happen a week early? We don't know! We're just reacting to it. Enjoy the early release!
Ok music is cool and all but when are we getting news about game updates
Our development blog, Logic World Wednesdays, will return next Wednesday, February 9th! --------------------------------------------------- Enjoy the soundtrack! Stream it, add it to your playlists, tell all your friends about it. We're very proud of this music, and we're so happy to be sharing it with you today.
Last week we released version 0.90.2 with lots of updates and fixes. Unfortunately, that version inadvertently introduced some new bugs, so today were releasing version 0.90.3 to squish them.
0.90.3 Changelog
- Fixed ExtraData being reset every time a save was loaded. This caused impersistence of all the systems stored in ExtraData, such as Display configurations, the Flag order, and custom Gridlands settings.
- Fixed volume slider values not being applied on game startup
- Removed the secret settings regarding max audio voices, as making these values configurable is what caused the above bug
- Fixed error screen when changing the number of pegs on a Panel Display when there are wires attached to it
- 1x1 Panel Displays are now limited to a maximum of 3 pegs
- Fixed servers allowing the placement of some invalid component types
- Servers now have additional checks to ensure that components being placed are valid
- Server-side checks now disallow making a component a child of its own children
Logic World released in Early Access four weeks ago today. In those four weeks, more than THREE THOUSAND people have bought and played the game. Thank you all so much, words can't express our gratitude for your enthusiasm and support.
But maybe updates can! We've got a big juicy update for you today, full of improvements and fixes.
0.90.2 Changelog
Building
- Improved performance when grabbing/cloning very large structures by skipping the intersection tests on most frames
- Added secret setting to configure the specifics of the intersection test skipping: MHG.Secret.GrabbingIntersectionTestsSkipConfiguration
- Overhauled the algorithm that determines the default wire rotation. Wires in general should look better now.
- Added setting: "Outline Connected Peg Wires". If enabled, when you look at a peg, all wires connected to that peg will be outlined as well.
- When resizing a component, the colliders are no longer disabled
- When resizing or grabbing causes wires to be deleted, these wire deletions are now properly recorded as part of the same undo action instead of separate undo actions
- Fixed error screen when you multi-delete items that are connected by a wire
- Floating point errors in component position/rotations take significantly longer to accumulate to noticeable levels
- Fixed erroneous red outlines when multi-grabbing items and moving them around quickly
- Removed an erroneously included debug statement that would occasionally spit numbers into the console while placing boards
- The minimum wire length is now slightly shorter
- Changed the minimum Delayer length from 1 tick to 2 ticks. One-tick delayer functionality can be done with Buffers.
- Fixed being unable to adjust the delay length of Delayers in some circumstances where you should be able to
- Fixed text rendering breaking on some Linux systems when toggling a Label's monospace on or off
- Fixed error screen that could occur when moving many Sockets at once
- Fixed not being able to rotate Buffers without grabbing them first
- Fixed errors when changing the peg count of Displays that have wires between their pegs
- Fixed music components making awful clicking noises when they come into our out of the render distance range
- Removed the "applause" sound effect instrument from Singers, as it caused various bizarre issues
- Overhauled LogicScript. There are a lot of changes, for the new documentation see https://github.com/pipe01/LogicScript/wiki
- You can now edit ComponentList files while in-game, and your changes will be hot-reloaded
- Gridlands and Grasslands: changed the angle of the world light source to align with the location of the sun
- Gridlands: fixed boards being fine-placed on the ground sometimes having inverted fine placement point axes
- Test world: fixed not being able to press the big clicky button
- Added setting: "Help Menu Starts Open"
- Moving the mouse on the main menu now twirls the background camera a little
- Added several secret settings related to the main menu background camera; they all start with the prefix MHG.Secret.MainMenuBackgroundCamera
- Edit Display Configuration Menu: The "Set All States" UI is now only shown for configurations with more than one peg
- Create Sandbox Menu: hitting the Enter key when typing in the Title textbox will now create a new sandbox
- The console will now automatically clear when it exceeds 400 messages. This limit is configurable with the secret setting FancyPantsConsole.MessageLimitBeforeAutoClearing. This is just a temporary solution to prevent lag; we'll do a proper overhaul of the console soon.
- Removed crosshair options that look like weapon scopes
- Added command: objexport.world
[int textResolution] - Added command: objexport.allworlds [int textResolution]
- When many components and wires are placed at once (i.e. when a large assembly is cloned), only one sound will now play. Previously you'd get insane sound playage, with one sound effect per component or wire created during the operation. You can revert to the old behavior by turning off the new secret setting MHG.Secret.RestrictCrazyBuildingSounds
- Added support for loading MP3 and AIFF sound files
- Removed the legacy Exclusive Peg sound effects from the game files
- Added an unused sound effect for resizing components
- Added secret setting: MHG.Audio.Secret.MaxVirtualVoices
- Added secret setting: MHG.Audio.Secret.MaxRealVoices
- Tweaked how Barrier sounds propagate in 3D space, and fixed being able to hear them at infinite distance
- Added setting: "Music Frequency"
- Updated the secret settings under MHG.Secret.GameplayMusicTiming for the new Music Frequency system
- All music tracks have been updated to fade in gradually so they don't spook you when they start playing
- All music is now shipped as 320kbps .mp3s in the game files. These are much smaller than the old .wavs, and the smaller file size should fix the game lurching when music starts to play on older hardware.
- Endless Curiosity: added a new instrument to the intro
- Endless Curiosity: tuned some instruments that were out of key
- Endless Curiosity: adjusted frequencies and relative volumes across the piece
- Time and Science: adjusted frequencies in the 6kHz-12kHz range
- Fixed game music not playing until the game was paused/unpaused if a music component was played and "Music Components Stop Game Music" was enabled
- Simplified Chinese now correctly identifies itself as "", instead of ""
- Simplified Chinese now uses correctly localized glyph styles for CJK characters
- Fixed Slovenian localization being mislabeled as Slovak and using Slovak sample text
- Added a scrollbar to the list of translators in the language credits, so the list doesn't get cut off if there are too many translators. Shoutout to the huge and awesome German translation team for being the first language that needed this!
- Fixed not being able to scroll down to view more languages if there were enough languages in the languages list
- Added WIP Romanian translation
- Updated translations & translator credits for Chinese (Simplified), Croatian, Czech, Dutch, French, German, Polish, Portuguese (BR), Russian, Swedish, and Ukrainian
- Fixed the infamous "cuddle bug", where you'd be shoved around by other players while someone was in the process of joining the server
- The server will now reject building requests with component types not installed on the server (i.e. modded components on an unmodded server)
- The server will now reject building requests for dynamic components with peg counts that are outside the server limits. Server limits can be configured from the new componentrestrictions.succ configuration file.
- Fixed servers getting crazy errors if a connected player attempts to run an admin command when there are no admins on the server
- Previously, the server config value for timeout was called PlayerTimeoutMilliseconds and had a default value of 25000. However, this value was actually in *seconds*, so connected players would effectively never timeout. The value has been properly renamed, and the default timeout value is now 60 seconds.
- Fixed the integrated server not starting when there are no network interfaces available
- Fixed real-time reflection settings not working in some circumstances
- Fixed "See Your Own Shadow" being stuck on after turning it off, until you reload the world
- Fixed footstep sounds playing when you toggle "See Your Own Shadow"
- Fixed your footstep sounds getting louder and louder the more you toggle "See Your Own Shadow"
- Changed "Crouch Time" max value from 5.0 to 1.0
- Changed "Max Inverse Coyote Time" max value from 5.0 to 1.0
- Changed "Player Gravity Scale" min value from 0.0 to 0.1
- Fix typo in some graphics setting descriptions (refelctions -> reflections)
- Fixed typo in a setting description (hobar -> hotbar)
- CJK characters will now be displayed in non-CJK languages with Simplified Chinese styling instead of Japanese
- Added secret setting: LogicUI.Secret.CjkDefaultFontStyle, only used for non-CJK languages
- Add secret settings to control clipping planes: MHG.Secret.PlayerCamera.NearClipPlane and MHG.Secret.PlayerCamera.FarClipPlane
- Fixed ExtraData files being created with no value in the Data field
- More information is now logged for some errors
What's Next
Unless any major critical bugs are discovered with 0.90.2, this will be the last 0.90.x version. After the insanity of launch, we badly need a rest. We're going to take a vacation now, but we'll be back in about a month to work on update 0.91, which should be out in January. That update will include many highly-requested features, like the ability to save subassemblies and load them in other worlds. This next year is going to be fantastic for Logic World. Throughout 2022 we'll be releasing several major and awesome updates, a whole lot of Logic World Wednesdays blog posts, and one or two very cool surprises. If you like Logic World today, then Logic World this time next year is going to blow your freakin' mind. Thanks again for playing and for caring about our game. It really means the world to us. Until next time! -Jimmy & Felipe
It's been one week since Logic World came out, and what a week! As of this morning we've sold two thousand copies of Logic World - literally double our optimistic, best-case-scenario prediction for week one. Thank you so much to everybody who's supported us and bought a copy. You are making our dreams come true.
We're going to repay your kindness with many many updates to Logic World, all of them free and all of them awesome. That starts literally right now, as update 0.90.1 is now available for download!
0.90.1 Changelog
Horrible critical issues
- Fixed being unable to load a world when the system language is set to Slovak or Czech (#91)
- Fixed being unable to load a world when the local network does not support IPv6
- Added a little "Are you sure you want to quit the game?" confirmation popup when you press "Quit Game" in the pause menu. Like all confirmation popups in Logic World, this can be skipped by holding shift while you click the button.
- Moved some buttons around on the error screen
- Added a button on the main menu to open the Creation Hub
- Various aesthetic tweaks to the Languages menu
- Color Picker RGB/HSV sliders are now shown by default (previously they were hidden by default and had to be manually expanded)
- Renamed the secret setting MHG.Networking.Secret.InternetProtocol to MHG.Networking.Secret.InternetProtocolOverride. The client will now select an appropriate protocol by default.
- Renamed the server config value InternetProtocol to InternetProtocolOverride. The server will now select an appropriate protocol by default.
- Added server config value: AllowConnectionsFromADifferentGameVersion
- The gameinfo command now prints the commit sha and the date/time at which the commit was made
- Doubled the placing range of Fixed Placement Points (at the top of Mounts and Flags)
- Fully disabled Unity analytics and hardware reporting
- The default bindings for Increase/Decrease Multi-Wire Placing Offset now include options to use Q/E in addition to scroll up/down. You will need to reset these settings to use the new default bindings.
- Renamed Buffer to "Fast Buffer"
- Tweaked Fast Buffer geometry and colors
- Added new "Buffer" component, which is like a Fast Buffer but it has an output peg and has a delay of one tick. Buffers are smaller than Fast Buffers, and can be fine-rotated.
- Fixed the game not loading C# code files
- Added the following interfaces to LogicAPI: ICustomDataManager, ICustomDataManagerFactory
- Added the following interfaces to LogicAPI.Server: IPeg, IInputPeg, IOutputPeg, ILogicManager, IWorldMutationManager
- Bulgarian
- Chinese (simplified)
- Croation
- Czech
- Dutch
- Estonian
- Finnish
- French
- German
- Hebrew
- Hungarian
- Japanese
- Polish
- Portuguese (Brazil)
- Russian
- Slovak
- Swedish
- Ukrainian
- Fixed Relays not propagating the signal in some situations where multiple connected relays opened in the same tick (#111)
- Fixed sometimes failing to start the integrated server because the chosen port was in use. Previously we used an available TCP port; now we correctly use an available UDP port.
- Fixed circuit boards flying away like a butterfly when you try to place them on the bottom of a Mount or Flag
- Fixed Multi-Select still using Z after the initial state entry if Multi-Select was rebound to a different control
- Fixed being able to make Circuit Boards so dark the grid lines disappear
What's Next
We'll be releasing 0.90.2 sometime next week, and then we are finally taking a damn vacation. 0.90.2 will be the last update for a while. Let us know in the comments of this post what fixes and tweaks you'd most like to see in that update. Happy Halloween!
Hey hey hey! Logic World came out today and it is just delightful and wondrous to see you all playing it. Thank you from the bottom of my heart to everybody who has bought the game and talked about it and shared their creations and left a review. It has been a crazy day but I am so lucky to be here right now. As many of you have noticed, the game is not quite flawless. Please go here for a list of commonly encountered issues and ways to deal with them, as well as instructions for reporting any new bugs you discover. We will be releasing a patch update, 0.90.1, to address as many issues as we can. I would love to get this update out to you tonight, but unfortunately theres an issue: I have been working very long hours for the past month or so to prepare for this launch. As a result I gave myself a repetitive strain injury. My wrists are in pretty constant pain, especially while Im typing (editors note: Jimmy is dictating to his mother, currently transcribing his words). At this point I really need to take a few days to let myself heal. Thus, I wont be working on Logic World for a few days. I expect to release 0.90.1 late next week. Im sorry for the delay, but my health must take priority Thanks for a great launch, my friends! Many more updates to follow. -Jimmy
Logic World comes out in two days! TWOOOOOOOO DAAAAAAAAAYYYYYYSSSSSSSSSSSS!!!!!!!!!!!!!
Beautiful Main Menu - Jimmy
First impressions are important, so this week I added some beautiful panoramic backgrounds to Logic World's main menu. The panoramas are loaded from GameData, so mods can add their own backgrounds. I'm gonna show off the new main menu below, and this is also the reveal of the *Logic World Theme*. In mid-2019, I contacted David Housden and asked if he'd be interested in writing a theme for Logic World. To my surprise and delight, he said yes! David is one of my all-time favorite video game composers, and working with him was a dream come true. I really love the Theme, I think it beautifully captures the spirit of Logic World. Please enjoy! [previewyoutube=132OS0VSSPc;full][/previewyoutube]
Help screen - Jimmy
Logic World has a lot of controls. When you play the game, I don't want you struggling to remember those controls; indeed, this concern is one of the main reasons I made the Action Wheel. But the Action Wheel doesn't fully solve the problem, so I also added a little list of available controls on the side of the screen. It can be toggled with F6 once you've learned them :) [previewyoutube=O56fX-HIN1Y;full][/previewyoutube]
Sandbox Uploads - Felipe
For the past couple of weeks I've been working on the Creation Hub, where people will be able to share all of their sandboxes and subassemblies with other users. To upload to the Hub, you will press an in-game upload button, which will open your web browser to a form that's pre-filled with whatever title and description your creation had in-game. After that, you'll just have to press submit and your creation will be published to the Hub.
We're hoping to have the Hub launch at the same time the game does, so you can share your creations online right from the start!
Pagier Pages - Felipe
On logicworld.net if you navigate to, for example, a forum page, you will notice that not all of the posts load at the same time. Only a few load at first, then once your scroll down more posts will be automatically loaded and shown. This is called paging, although in this case you don't actually get to see the pages as by default the site uses infinite scrolling. (You can switch to a traditional paging style in the site settings.) When I implemented paging along with infinite scrolling a while back, I decided to define a page "take X items after item Y". This worked great when sorting by a date such as the creation date, but it also meant that they could not be sorted by any other property. Instead, now pages are defined as the more traditional "skip X and take Y". This approach has the drawback that you may get duplicate items if a new item is created after you fetch one page and before you fetch the next, but this can be worked around with some simple filtering. This means I will now be able to sort posts by other measurements such as comment count and score, although these will be more challenging since they are handled by separate services. As mentioned above, we want logicworld.net to be a centralized place for the community to share and talk about their creations, so I've got lots of updates planned to make the site really really awesome.
Yet more bugfixes - Jimmy
Oh god! So many bugs to fix, so little time! Our lovely beta testers have been breaking the game in every way imaginable, which I suppose I'm grateful for. I've fixed tons of bugs this week, and I'm happy to report that at this point Logic World seems to be mostly bug-free, and there are ZERO remaining critical game-breaking issues (that I'm aware of, at least!!!!!!!!)!!! The most interesting bug was that on some systems, there would be errors loading the instrument data (used for synthesizing music sounds). This bug made me panic a lot, because A) it has to do with sound synthesis which oh god is so complicated and there are *so many different things that can go wrong*; and B) I could not reproduce it on my machine, and there was no clear pattern of when and how the bug was occuring. Both very bad signs. But I worked with the affected testers, and we tracked down the issue!! See, the game loads instrument data from files on disk, which are stored in a human-readable text format. The instrument data has a bunch of numbers in it, and some of those numbers are fractional, using a period as the decimal separator. BUT NOT EVERY REGION USES A PERIOD DECIMAL SEPARATOR!!!! Some crazy places use a comma instead. The cause of the bug was that some of our testers were in these crazy comma-using regions, so the numbers in those files were being parsed incorrectly! This was an easy fix once we'd tracked it down. Just needed to tell the number parser to ignore the local format.
The Big Flag Rework - Jimmy
Last year I added flags to Logic World. The Flag solves several important design problems: [olist]
Localization Organization - Jimmy
I've done a big update to our community translation efforts! Every single string of text that will be in the Early Access release of Logic World is now available for translation there, and I've added translation guides for many strings. Thank you SO MUCH to all our volunteer translators. I see your hard work and I'm delighted by it. I am STOKED AS HELL to bring Logic World to people all around the world in their native languages. If you speak a non-English language and you want to help out with translations, please click this link and start translating! Languages will be added to the game as soon as they are finished, and translators get their name in the in-game credits :) -------------------------
The Future
Well, we've reached the end of the pre-launch Logic World Wednesdays. So what happens next? [olist]
Yes, you read that title correctly. After literally thousands of years in development, Logic World is releasing publicly on the 22nd of this month.
[previewyoutube=OpTZ1geIECU;full][/previewyoutube]
Thanks for sticking with us. We cant wait to get this game into your hands. There is much more to come; Early Access is just the beginning.
And by the way, we have a new FAQ for answers to all your burning questions.
See you on the 22nd!
https://store.steampowered.com/app/1054340/Logic_World/
That's right! Logic World comes out this month and in two days you'll know exactly what day of the month! Get your hype boots on!!!
Media Updates - Jimmy
This week I've updated the store pages on Steam, Itch.io and Gamejolt with new screenshots and fancy words. This was badly needed; the last time any of those pages got a significant update was March 2018, when we first announced Logic World. It was particularly satisfying to select the new screenshots. These new screenshots replace the original promotional screenshots I took in 2018, and the difference in the game's quality is just amazing to look at. Shoutout to our beta testers for building all the amazing creations featured in those screenshots.
I've also been doing some more work on the Early Access Announcement Trailer, which is looking very sexy and cool. That will be my main project for the next two days, and if all goes according to plan it will come out Friday evening with the release date announcement :)
The Hub - Felipe
I've started working this week on the Creation Hub, a section of logicworld.net for sharing the things you make in Logic World! Hopefully, this feature will be available from day zero, when you'll be able to share your sandbox worlds and saved subassemblies. In the future the Hub will also be used to share mods, challenge packs, and more. The Hub looks great so far, but it's not quite ready to show off yet. Next week I'll give a detailed writeup on the technology and show some pretty pictures.
Fixes & Polish - Jimmy
I've been going through the game to fix up all the bugs I can find and really polish up the newer features (like the action wheel and undo/redo). I've fixed dozens of bugs in just the last 24 hours. Yes, I'm very exhausted, thanks for asking. The game is very nearly feature-complete at this point, so bug fixes and polish are the bulk of the remaining work. With the help of our beta testers, we'll be working over the next few weeks to make sure Logic World's launch is as smooth and high-quality as we can. --------------------------------------------- We write a blog like this one every week, keeping you updated on Logic World development. To make sure you don't miss the next one, you can sign up for our newsletter. Be sure also to wishlist Logic World on Steam and join the official Discord. See you on Friday :) View this post on logicworld.net More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Howdy hey hello,
Earlier this year, I stopped publishing our weekly devblog here on the Steam forums. I apologize for that. I was under a lot of stress, and I kind of shrunk away from a lot of my responsibilities. But we haven't stopped working on the game and we haven't stopped doing the blog! You can catch up on any Logic World Wednesdays you missed here on logicworld.net. All future LWWs will be posted here to Steam as well, starting this Wednesday.
Logic World is nearly ready for public release. Contrary to what we previously announced, we've decided to do Early Access, so you can play sooner and so we can gather more feedback during development. The game will launch in EA later this month, and if everything goes according to plan, the full version will come out next year. The specific date of the EA launch will be announced this Friday, accompanied by a sexy new trailer.
In the meantime, please check out the updated Steam store page! I added a bunch of new screenshots and wrote a new description. Most of the screenshots are 4k or 8k, you can view the full resolution by clicking on the image and then on "Download full-size version".
Thank you so much for your interest in Logic World, and thank you for your patience as we work to make it the best game we can. See you Friday :)
-Jimmy
https://store.steampowered.com/app/1054340/Logic_World/
Logicworld.net Rises to Glory - Felipe
This week I finished converting all our web services to Mice, and it was finally time to work on the website frontend! Our goal with logicworld.net is that it be a pleasant and easy-to-use place to hang out, share your builds/mods/ect, and generally discuss Logic World. To that end, I've been working on various aesthetic and usability improvements. ---
Comment button rearrangements
I've moved the "like" and "reply" buttons from their old awkward placing underneath the (still to-be-implemented) profile picture to the bottom right of comment boxes. Before:
After:
On your own comments, the "edit" and "delete" functions are now tucked away in a dropdown accessible from the gear in the top right.
Better markdown styling
I've improved the way the site displays user-submitted text, using github-style markdown rendering. The most noticeable improvement is that headers are much meatier.
Navbar social media links
I've brought back links to the Logic World YouTube, Twitter and Discord to the site navbar. Some folks have told us that these have been hard to find, so hopefully this makes it easier.
Fun spinny loading icon
I've added this lovely custom icon when the site is loading a new page :D [previewyoutube=4dhOf3-Tzr8;full][/previewyoutube] (It usually doesn't take that long lol. Loading times were artificially extended for the sake of demonstration.) You can see it yourself by navigating through pages on the Logic World forums.
Cute error page
I added a lovely graphic in the style of Logic World components to display navigation errors, like 404s. The lights even flicker as the page loads.
You can see it yourself at https://logicworld.net/thisisnotareallinklol --- Let me know what you think of these changes, and what other website enhancements you'd like to see. I love working on the site, and I'm excited to help it become a hub for Logic World discussion, community, and creation sharing.
Undo Improvements - Jimmy
I unfortunately wasn't able to work on Logic World much this week, but I did make an important behavior change to the undo/redo mechanics I showed off a couple of weeks ago. In my first implementation of undo/redo, the undo stack was stored entirely server-side. However, a lot of the checks the game does to test if a placement is valid can only be done client-side. The server has no concept of the 3D geometry of components, so it can't check if (for example) a new component would be inside of an existing component, or if a new wire would have line of sight between its two ends. In singleplayer, this doesn't matter for undo: every individual step along the way is validated by the client, so undoing back to one can't get us into an invalid state. But it causes problems for multiplayer. Picture the following scenario: [olist]
My Color Picker grows Ever Stronger - Jimmy
I unfortunately wasn't working at all last week, and when I got back into Logic World work I wanted to start with something fun. As you may know if you've been following Logic World for a while, I absolutely adore the color picker UI, so I began my work week with some fun color picker stuff :D [previewyoutube=K2U3_MARblU;full][/previewyoutube] (I tried something a little different with this video. It's heavily edited, and instead of just showing off game features, it tells a story of the features' development. Let me know if you like it and would like to see more development videos like this :)) I added the new Circle Picker style shown in the video, and I also made a few more tweaks. First I made the "save this color" button change color to reflect the color that's going to be saved, which adds a nice visual indicator of the button's function. I also changed the style of the pointers, from the old white & black targets to simple circles which display the selected color or hue.
I'm pretty sure I like this new pointer style better, but I'll probably add an option to switch between the two based on preference. Finally, I added a little popup confirmation dialog when resetting a list of saved colors. If you're anything like me, you'll spend a lot of time carefully curating your color lists, and I don't want you to lose all that work accidentally!
After reinvigorating myself with the color picker work, I've returned to working on the new building mechanics & features. Unfortunately I've got nothing to show this week -- I've just done some minor refactors and code cleanup on my previous work here -- but that's my singular focus now, and I'll have cool stuff to share soon :D
Web refactor progress - Felipe
I've been making steady progress on the transition to mice in the web services. All of the services are now migrated and working fine for the most part, and even though there are still some bugs left to solve and code to optimize I think you will read next week's LWW on the new backend if all goes well! --------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter. Be sure also to wishlist Logic World right here on Steam and join the official Discord. See you next Wednesday! View this post on logicworld.net More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Undo and redo - Jimmy
I've implemented one of Logic World's most highly requested features: the ability to undo and redo your changes to the world! [previewyoutube=-3Uuu_Ugnrk;full][/previewyoutube]
General building overhaul progress - Jimmy
This week I've finally finished my big refactor of how Logic World stores and modifies its internal world state! This is all the code to do with storing components and wires, and how updates to components and wires are handled. One player tells the server they want to place a component, the server verifies that this modification is allowed, the server sends information about the modification to all connected clients, and they all handle the update appropriately -- that kind of thing. Before this rewrite, that part of the codebase was one of the oldest, written in late 2018. At the time, I was a generally much less experienced programmer, and I also had a much less complete understanding of how this code needs to work and be worked with. It didn't help that this system is necessarily very complex -- Logic World is a complex game, with complex builds, and it all has to work in real-time multiplayer, plus there's all the complexities introduced by supporting modding. As a result, the original code was a very shaky foundation, and it did *not* age well throughout the years as we extended and modified it. I knew that if I was going to really improve Logic World's building mechanics -- which I am determined to do before we release -- I would need to rewrite this whole module. And now that's done! The new systems I've designed and implemented are robust, extensible, and easy to modify. They use everything I've learned since starting this project about how to write Good Code. You can see the fruits of my labor in the video above -- something as complex as undo and redo would NEVER have been possible with the old systems, but the undo/redo implementation I wrote this week is under 100 lines of code and *stunningly* simple. There's still some cleanup and improvements to do, but I'm honestly thrilled with how well everything is working. It's going to be so *easy* to add all these cool new building features I have planned. --------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter. Be sure also to wishlist Logic World right here on Steam and join the official Discord. See you next Wednesday! View this post on logicworld.net More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Debug Displays - Jimmy
I've added two fancy shmancy debug overlays to the game: one to show your FPS, and another to show your coordinates in the world. [previewyoutube=mtJ7JIl5FPM;full][/previewyoutube]
Local Network Servers - Jimmy
When I showed off the multiplayer menu last week, you may have noticed an unused "local network servers" tab of the server list. Well, this week I made it work: any servers that share a local network with your game will be displayed in a list here!
In a couple of weeks, I'll add some lovely UI that lets you open your singleplayer game to the local network, and opened singleplayer games will show up in this list. Logic World LAN parties will be incredibly easy to set up :D
Very nerdy technical tidbits
You might recognize this feature from Minecraft, and indeed I did steal this idea from Minecraft. Thanks Minecraft. However, Minecraft's "Open to LAN" feature has never worked right for me. The problem is that when Minecraft servers broadcast their existence, they do so only on the first network interface found on the device; similarly, Minecraft's multiplayer menu only listens for multicasts on the first network interface. This might work fine for the normies, because most people's computers only have one network interface: the Wi-Fi or ethernet adapter. But I'm a massive nerd, so my computer has TONS of network interfaces: VPNs, virtual machines, docker instances, ect. So whenever I try to use that Minecraft feature, it inevitably picks the wrong network interface. I can't see other people's LAN games, and other people can't see mine. However, Logic World does this right: it iterates through every network interface on the device, and every interface with broadcast capabilities is used for this menu. Servers announce their existence on all interfaces, and clients listen for servers on all interfaces. It all Just Works without disabling my VPN or anything. Since Logic World's audience is largely composed of massive nerds like myself, I felt it was important that things work properly here. As an aside to the Minecraft people -- yes, I am available for consulting, send me an email and we can discuss rates.
Bugs Fixed This Week
- Fixed not being able to see your own reflection in SHINY BOBBY
- Fixed IPv6 networking not working on Windows
- Fixed being unable to initiate connection to a server from the server list if a discovery response packet hasn't been recieved yet
- Fixed "offline name" setting description using outdated nomenclature
- Fixed all the server config player lists (whitelist, banlist, admin list) not working
- Fixed items in the server list sometimes displaying incorrect data if you spam the refresh button too quickly
- Fixed being able get a Sandbox or Saved Board without a title by editing the title after creating one
- Fixed the "Create Sandbox" and "Save Board" buttons sometimes being hidden when they should be shown
- Fixed many text boxes throughout the game interpreting a "cancel" action (by pressing escape) as a "submit" action (what should only happen when you press enter)
- Fixed pressing tab/shift-tab to switch between textboxes not working properly when Popups are open; tabbing between textboxes is in general much more reliable
- Fixed Labels and Panel Labels having a slightly different color to the other off-white components
- Fixed being able to see the reflections of player nametags in SHINY BOBBY
- Fixed the nametag on the little bobby model in the Avatar settings not properly showing when you mouse over the bobby model
- Fixed the integrated server not shutting down correctly when leaving a singleplayer game
Very Excellent Building Mechanics Coming Soon - Jimmy
The things you can build in Logic World are very geometrically complex. It's not a simple voxel grid like some other 3D circuit simulators; you've got components and wires attached to each other, and everything can be arbitrarily rotated and positioned. So the fundamental problem of designing Logic World's building mechanics is this: how do you make it easy and fast for a player to communicate their complex 3D ideas through the user interface? What is the best, most efficient, most intuitive way to take the structure in a player's brain and get it into the game? It's a hard problem. It's a problem I've been contemplating since the first Logic World prototypes in October 2017, and it's a problem I've been contemplating especially hard over the past month or so; watching gameplay from our newest beta testers, and listening to their feedback, has led me to the realization that the building mechanics need to be much better before release. In my time contemplating the problem, I've had a lot of individually good ideas, and I've even implemented some of them, but they've never come together as a comprehensive whole. Well, a week ago, all that changed. I was lying in bed after publishing last week's blog post, trying to fall asleep, when suddenly... I saw it all. The perfect building mechanics. Like a switch flipping on, this incredibly difficult problem became transparent to me, and I could see straight through it to the perfect solution. I achieved game design nirvana. I leapt out of bed to get my pen and paper, and I hastily scrawled down some of the best ideas I've had in my life. It's honestly one of the wildest psychological phenomena I've ever experienced. I have mostly finished documenting my epiphany, and turning those documents into code is the next work I'll be doing on Logic World. I wanted to finish up a few other things before diving in -- see the rest of this post lol -- but now, building is my singular focus, and I am so excited to get to work on it and make building as smooth and intuitive as I can. --------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter. Be sure also to wishlist Logic World right here on Steam and join the official Discord. See you next Wednesday! View this post on logicworld.net More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Multiplayer Menu and Networking Upgrades - Jimmy
The first big task I tackled when I returned from vacation was to make the Multiplayer Menu! I'm really pleased with how it turned out, under the hood it's one of the most complex menus I've ever made. [previewyoutube=KLNuxDO7Tj0;full][/previewyoutube] The Multiplayer Menu requires a lot of networking functionality, and so while I was working on the menu I took the opportunity to beef up our network code. There were many lovely upgrades, but the two highlights are: [olist]
Seeking your feedback on server authentication modes
As can be seen in the video above, there are presently two authentication modes for Logic World servers: Unverified and Verified. Unverified servers will allow any player to join, with any username, and this identity is not checked at all. Verified servers only allow players to join who are logged into their logicworld.net account, and it is impossible to fake your identity to a verified server. Verified mode is useful when you want to have a whitelist of players who are allowed to connect to your server; only the people who are really on your whitelist will be able to connect. But it's less useful if you want to have a public server and ban players from it. Because creating a logicworld.net account is free, a banned player can simply create a new identity and rejoin your server. With this in mind, we are considering the addition of a third authentication mode to servers, "Super-Verified". In Super-Verified mode, the server would only allow connections from players who are logged into their logicworld.net account, and whose accounts are verified owners of Logic World. This means that to evade a ban, a player would have to buy another copy of the game, which they are a lot less likely to do than simply create a new account for free. However, Super-Verified mode would introduce hassle for players; unless you purchased directly from logicworld.net, you would be required to link your logicworld.net account with the account you purchased the game on (i.e. Steam) before connecting to a Super-Verified server. We've been discussing this and we aren't sure how to proceed or how useful such a feature would be. And so, we ask you -- would you like Logic World to have a Super-Verified mode? If you're interested in hosting a server, would you turn it on? If you're interested in playing on servers, would you prefer to play on servers that have it on? Let us know in the comments, on discord, or in an email :)
Mice are Nice - Felipe
When I returned from my vacation, the first thing I needed to do was to test the services that I had migrated from Nitro to mice. I could have just created a "test" service that was hard-coded to call certain methods on certain services, but that's a very inflexible way of doing it. With that in mind, I started the MiceUI project. This project consists of an Electron application that lets you load protobuf files containing the method definitions of a given service, and then lets you send requests to the service instance and inspect the response.
This tool will let me test each and every one of a service's endpoints, making sure that the service is working as it should. In the future I plan on upgrading MiceUI with some sort of test suites, automating the process of E2E testing and even integrating it into the site's CI pipeline.
In-Game Theme Editor - Jimmy
Many of our beta testers have been playing with the menu themes capability of LogicUI, and many more of you in the community have voiced interest in doing so. Until now, making new themes was very difficult, requiring tedious manual editing of individual RGB values in a config file, and you'd have to restart the game to view the results of your labor. I decided to make this process easier, and added some in-game UI for making a custom menu theme. [previewyoutube=y7CShp9uaYc;full][/previewyoutube]
Even Beta than Ever
We've added several new testers to our internal beta! These lovely folks are helping us track down bugs, giving great feedback about features, and making cool content to showcase the current state of the game. There is a bunch of said cool content in the #beta-content channel of our discord, so join us there if you haven't already and check it out! And if you haven't seen it yet, shortly into the break we held a big multiplayer playsession with a bunch of the beta testers. Jimmy's perspective of that event is up on youtube: [previewyoutube=6KwwzsmLN50;full][/previewyoutube] I mentioned that the testers have been helping us find bugs, and well, holy moly they've helped us find a lot of bugs. An absolute tidal wave of them. Here are just the ones we've fixed...
Bugs Fixed Since Last Time
- Fixed the "Pick Component" feature not properly recognizing the components already on your hotbar in some specific circumstances
- Fixed world rotations being bad and glitchy for components placed on the environment with a non-standard up direction (i.e. on the side of a hill)
- Fixed awkward-axis rotation being incorrect for grabbed boards placed on the environment with a non-standard up direction
- Fixed Edit Title textbox not being properly selected when you create a new sandbox or saved board
- Fixed linux version not starting up properly due to a file system error
- Fixed linux version not loading some important resources from GameData which was causing a myriad cascade of issues
- Fixed scroll wheel input direction being inverted on linux
- Fixed scroll wheel having 1/120th sensitivity on linux
- Fixed Keys going crazy when you try to press them if another player is in their range
- Fixed server giving a Load Board response to every player on the server instead of just the player who requested to load the board
- Fixed decorations on grabbed, cloned and loaded components not being tested for collision
- Fixed missing flag graphics in Choose Language menu
- Fixed double newlines in the beta start screen
- Fixed "Realtime GI is not supported in Universal Pipeline" console spam
- Fixed failure to connect to a server if another player makes changes to the world while you're connecting
- Fixed moving and then deleting a socket causing server errors and sometimes corrupted saves
- Fixed sockets not connecting properly after they've been moved
- Fixed error and disconnection if another player moves/rotates/deletes the chair you're sitting in
- Fixed various cases where the server could crash if a client sent them bogus data
- Fixed component position/rotation imprecision issues within deeply nested stacks of many child components
- Markdown renderer: fixed weird visuals on the first and last line of a list if that line is very long
- Fixed changelog saying "2020" for all the dates in 2021 lol
- Fixed client going to error screen if it tried to connect to an unverified server when the Logic World servers are unreachable
- Fixed servers having a hard cap of 32 maximum players connected even if a higher value was set in the config file
- Fixed servers crashing if a client sends garbage data in the discovery request packet
- Fixed clients connecting to the wrong server sometimes
- Clients now ignore the data instead of going to an error screen if a server sends garbage data in the discovery response packet
- Fixed the volume sliders on music components having the incorrect range (0-10 instead of 1-100)
- Fixed fatal error if you tried to delete a component on the same frame you modified its data (i.e. pressing a button and deleting it on the same frame)
SOCKS
This Christmas might possibly have been the best Christmas ever. Jimmy's mom and brother Andrew teamed up to make two pairs of got dang Logic World socks, giving one pair to Jimmy and sending the other across the ocean to Felipe.
Just look at those things. Absolutely fabulous. --------------------------------------------- Thanks for reading our blog :) lots of fun stuff is coming up, so watch this space. We absolutely cannot wait to get this game done and into your hands. To get updates on Logic World beamed directly into your inbox, you can sign up for our newsletter. Be sure also to wishlist Logic World right here on Steam and join the official Discord. See you next Wednesday! View this post on logicworld.net More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/ More Logic World Wednesdays
Performant Building - Jimmy
This week I've been optimizing Logic World's building mechanics. When you create or destroy a large amount of objects simultaneously, that should be as fast and fluid as possible, and I've made a lot of progress on that front. [previewyoutube=X4QJSaR-SBk;full][/previewyoutube]
Finished server authentication - Felipe
A while ago I shared my plans for a system that would allow game servers to verify the authenticity of the players that connect to it. This week I've implemented the final features of that system. Now, when in online mode, the server will retrieve the player's name from their authentication payload. This prevents a client from logging in as a user and send another user's username, since now the server will ignore the username that the client sent. So, Logic World servers can now officially require online verification! Players will be denied connection to online-mode servers unless they are logged in and verified with logicworld.net. This allows you to have banlists and whitelists that actually work, as players can now prove they are who they say they are. This entire system is optional, you just need to enable offline mode in the server's settings and users will not be verified, which also means that no logicworld.net account and no internet connection would be necessary. It's important that you're in control of your game, and we'll never require that you connect to our servers to play Logic World.
Server discovery - Felipe
Before connecting to a server, you most likely want to know some information about it, like Message of the Day) or how many players there currently are in it. I've implemented a system for requesting and retrieving this information, in preparation for Jimmy's multiplayer menu. You can now request discovery information from a specific server (by its IP), or from all the servers in your local network. This last feature will make it really easy to connect to a server that someone else in your network is hosting, you won't even need to know their IP!
Multiplayer Menu Progress - Jimmy
As Felipe mentioned above, I've been working a little on the server list. There will be three tabs: your list of saved servers, discovered servers and open singleplayer games on your local network, and all games your friends are playing in, so you can easily join them. The server list isn't done, but I have finished the Direct Connect popup. Finally, Logic World has a way to connect to a server using a menu!
Some fun things about the Direct Connect popup:
- It remembers the most recent IP you typed in. (Passwords are currently not remembered, but most servers won't have a password anyways)
- The password box has a button to toggle password visibility
- As soon as you open the popup, the Server IP text box is fully selected, so you can start typing/pasting an IP immediately
- The two text boxes can be switched between with the tab key
- Hitting Enter in either text box will start a connection to the server
Bugs Fixed This Week
- Fixed some simulation bugs that could occur when deleting components with wires attached to them
- Fixed not being able to connect to a server when signed in to your logicworld.net account
- Fixed crazy lag that could sometimes happen when managing your hotbar
- Fixed search box text being cut off if you typed too much in it
- Fixed the "disconnected" screen not displaying the reason for disconnection
- Fixed popups not being removed properly in some circumstances
- Fixed not being able to connect to a server when logged in
Reflections
It's been a big year for everyone. For Mouse Hat Games, 2020 was the year we came into our own as game creators. On January 1st, we sort of knew what we were doing. But today, in the dusk of this year, we quite solidly know what we are doing. For two self-taught kids, that's an amazing and empowering feeling. We could not be more excited to finish Logic World and get it into your hands. Thank you for being on this journey with us. We're going to take a week or two off for the holidays, but we'll see you soon on a Wednesday in 2021 -- the year Logic World finally releases!
Xmas builds are from Brown Falcon TV, and were built today live on stream! Take care, friends, and happy holidays --------------------------------------------- View this post on logicworld.net More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Optimizations - Jimmy
I've been working on various optimizations to speed up Logic World, and this week I've significantly improved the circuit simulation performance. I made a little video to demonstrate gameplay in an insanely demanding world before and after the optimizations. [previewyoutube=ogGwdZnv5X8;full][/previewyoutube]
Moddable Sound Effects - Jimmy
Historically, sound effects in Logic World have been closed, hardcoded things. Mods could play the built-in sound effects, but it was difficult if not impossible for them to add custom sound effects. It was also an annoying amount of work for us to add new hardcoded sounds. Well, this week I redid our sound effect system, and sounds are now loaded from disk at runtime. Adding a new sound effect, for us or for modders, is as easy as dropping a .wav or .ogg into your mod folder and writing a small data file.
Ground Types - Jimmy
Taking advantage of the new easy sound effects, I've added a system for custom ground types. Every point on any object can declare its ground type, and each ground type can declare a specific sound effect for players that walk or jump or land on it. I've also been experimenting with ground types that affect the movement logic of players walking on them. [previewyoutube=li2SrhRwRu4;full][/previewyoutube] Ground types are the latest in my series of tools to help me build epic environments for doing logic in. I'm super excited about these worlds, and I can't wait to show them to you in forthcoming Wednesdays :D
Bugs Fixed This Week
- Fixed non-connected input pegs sharing a circuit state with some random piece of circuitry in worlds that have filled up all the starting circuit state indexes
- Fixed a couple issues preventing you from loading a second save after already doing so once in a given session
- Fixed exclusive pegs not having a deterministic update order relative to components
- Fixed some potential issues with unconnected exclusive pegs
- Fixed music not playing if the path to the music contained a '#' or a '%' or was a UNC path or various other edge cases
Moar Awesome Character Movement - Jimmy
I've been working on character movement logic, to ensure it feels smooth and pleasant in all situations. You're going to be using the character controller pretty much every single second while you're playing Logic World, so it's important that the movement logic is really solid. [previewyoutube=44WGWAgXQ48;full][/previewyoutube]
Terrain Tech - Jimmy
As I spoke about last week, one of my main tasks for this month is to create awesome environments for you to build circuits in. It's time to put the 'world' in Logic World. To that end, I've been working on environment tech and tooling this week. I've got a bunch of really cool stuff in the pipeline, but today I want to show you two particular shader features for rendering ground textures.
Stochastic Texturing
Human brains are finely tuned for pattern recognition. So when a game uses a repeating texture, we can easily spot the repetition. We see the grid lines, and it looks "fake".
There are a number of ways to solve this problem, and I did research into many of them this week. The solution I've chosen is procedural stochastic texturing, a technique invented by Eric Heitz and Fabrice Neyret in 2018. Stochastic texturing is fast, it looks amazing, and it's incredibly easy to set up.
The algorithm works by taking random hexagonal samples of the tiled texture, rotating them randomly, then laying the samples out on a hexagonal grid and blending them together. This, in my opinion, is absolutely bloody genius. There's a great visualization of how it works on page 5 of the research paper. Logic World will use a particular implementation of stochastic texturing developed by Jason Booth for his Microsplat tool. This implementation uses texture heightmaps to blend the samples, to ensure the blends are super high quality with no visible seams.
Triplanar Mapping
A common issue with terrain in video games is that the textures are typically projected onto the terrain from above. This results in very ugly and gross stretching of the textures on steep slopes.
A common and effective solution to this problem is triplanar mapping. This technique uses three projections of the texture, one for each plane in 3D space. The projection used for a particular point on the terrain is determined by the normal to the surface there. At the borders between projections, they are blended together.
I want to build lots of lovely cliffs and mountains. With triplanar mapping, they are sure to look their best
More mice - Felipe
This week I haven't had much time to dedicate to Logic World since I'm preparing for more final exams, but regardless I have made progress on mice, my new microservice library. More specifically, I've been working on migrating all our existing services to this library, which is just tedious work since I have to go one by one.
Bugs Fixed This Week
- Fixed player vertical flying speed not changing proportionally with player scale
- Fixed "Player Gravity Scale" slider being adjusted in increments of 1.0 instead of 0.1
Arbitrary World Gravity - Jimmy
For a long time, I've felt that one of the biggest flaws of Logic World is its uninteresting backgrounds. The circuits themselves are super cool, but we need cooler places to build those circuits. One of my main tasks for December is to add more and beautiful world types to the game. This week I've implemented an awesome tool that will help me to create these worlds: arbitrary world gravity. [previewyoutube=DzCPZydIJRs;full][/previewyoutube] I forgot to mention it in the video, but the gravity system is totally open to modders. When you mod in a world type, you can control exactly how the gravity works; you can use one of the built-in gravity rules, or program your own.
Bugs Fixed This Week
- Fixed visual teleport errors if the teleport exit had a different rotation or scale from the teleport entrance
- Fixed incorrect player capsule rotation in Chairs
- Fixed missing lighting data on Grasslands
- Fixed '\\' not being correctly detected and replaced when validating file names for sandboxes and saved boards
Yet More Chat Upgrades - Jimmy
I've finally finished with the chat, after two previous videos on it! I've added some security features to prevent you from being tricked by a malicious link sent in chat, and the chat window is now used for telling players some game information. [previewyoutube=0PieeHFWtWs;full][/previewyoutube] Shoutout to the many, many people who expressed concerns last week about link security. I was initially going to be lazy and not add the popup, trusting users to take care of their own safety. But that was a bad and irresponsible way of thinking, and y'all called me out on that and held me accountable. Cheers!
Mice: my new microservice framework - Felipe
The Logic World website backend is made up of many different and small services written in Go, each of which takes care of a single "feature", for example comments, ratings, posts, etc. We use Kubernetes in order to manage all of these applications, which takes care of starting them up and scaling them when needed. Each of these services needs some way of communicating with each other, which was being achieved using the Go Micro framework. This framework in turn leveraged gRPC in order to provide inter-service communication, as well as some other features like events and configuration. This worked just fine, however the Micro library underwent some breaking changes, and it was overall a slight pain to work with, so I jumped the gun and started to write my own library, called Mice. Mice is lighter and simpler, and it will help me develop Logic World's web architecture faster, while also removing unnecessary overhead from the services. Mice is still not quite at production level since there's still more testing left to do, as well as some features that our services need, like events. Once all that's done I will begin migrating all services to this new framework, which should hopefully not be too hard since Micro's and Mice's APIs are quite similar.
Text Box Settings - Jimmy
As you may know, I struggle with an addiction to adding settings to Logic World. This week I channeled that into some settings for customizing the caret in text boxes. [previewyoutube=RgW15rx6sbY;full][/previewyoutube]
Bugs Fixed This Week
- Fixed various bugs with the markdown renderer
- Fixed issues with caching links in text, leading to apparent clickable links on regular, non-link text
- Fixed some situations where HoverTags could become stuck open
It's been a bit of a lighter week for us, but regardless we continue to polish up Logic World.
Chat Enhancements - Jimmy
I did a big fat polishing pass on the chat I showed off last week. There are a ton of little new features and enhancements, and I brought my siblings back to help me show them off! [previewyoutube=5cZw9v6jd2g;full][/previewyoutube]
The Merge - Felipe
I have been developing a feature on a separate Git branch in the Logic World repository, and this week I was tasked with merging it with Jimmy's changes. The feature in question is server discovery, which Jimmy needed in order to complete the multiplayer menu he's working on. I took this opportunity to refactor some uglier code that was in the way, as well as unit test some of the areas that would be affected by the merge the most:
I want to keep expanding these tests until most of the server is covered, this will make sure that future changes don't break any existing functionality.
A Glorious Animation
The effervescenct @Red_3D has blessed us with a new Bobby fanimation, showcasing a common fan theory for how Bobbies reproduce. We think it's awesome and that you should check it out. [previewyoutube=-mmiEIOtrKc;full][/previewyoutube]
Bugs Fixed This Week
- Fixed the unicode shortcut being unreliable and buggy in some circumstances
- LogicUI: fixed the ConfigurableMenu OnWidthChanged and OnHeightChanged events not firing when the width/height was changed by resetting the menu settings
- Fixed menu buttons sometimes being the wrong color
- Fixed being able to open the console while typing in an InputField, making it impossible to type "~" or "`"
- Fixed various bugs with the markdown renderer and link clicking utility
Multiplayer Text Chat - Jimmy
Ive added text chat to Logic World! Finally, you can send messages to the folks youre playing with. [previewyoutube=KE2E_pE5XBM;full][/previewyoutube] I had two very excruciating hangups while working on this feature. I will tell them to you now, because sharing my pain with others helps me to process it in a healthy way. When I first made chat messages appear, there was a confusing and very annoying bug: each time a new chat message appeared, all of the chat messages would jump to a different position on the screen for a single frame. Obviously this is unacceptable; you cant have a distracting flicker appear every single time theres a new message. It seemed like the LayoutGroup responsible for setting the positions of the chat messages was taking an extra frame to fully update, so I manually updated it from code on the correct frame. But this did not work. I started digging into my LayoutGroup setup, looking for settings that might have caused the issue. I tried all manner of code-based solutions. Nothing worked -- that horrible jitter just watched me and laughed its evil laugh. I was particularly annoyed because there was no jitter in the development console, and Chat uses pretty much the same systems. In desperation, I dug into Unitys LayoutGroup source code, trying to figure out where the single frame of jitter was coming from. Unitys code here is... well, its not amazing. They do some questionable things which makes the code very hard to understand and follow. It took a lot of patience, but I eventually dug deep enough to find where errant behavior was originating from. A particular function that was returning the incorrect height value for a single frame. But this function is only called when m_ChildScaleHeight is true. Whats m_ChildScaleHeight?, I wondered. It turns out that I had accidentally checked a checkbox called Use Child Scale: Height. I unchecked this checkbox and the jitter went away. Six! And a half! Hours! For one checkbox! I do love programming, but sometimes it makes me want to throw my computer off of a bridge. The other major issue came about when I wanted to do some fancy formatting on the chat message text. Notice that in chat messages which span multiple lines, lines two through infinity are indented slightly compared to the first line. This helps the message to be distinguishable as a single cohesive object.
This is not a formatting function that is natively supported by TextMeshPro, Unitys text rendering library. Itll indent all lines, sure; itll indent just the first line, no problem; but indenting all lines except the first line? Theres no quick and easy way to do that. I love TextMeshPro a lot, but what I dont love is its documentation, or rather its utter lack of documentation for any slightly advanced feature. Figuring out how to achieve this effect involved a lot of digging through Unity forums, a lot of digging through TMP source code, and a lot of trial and error. But, obviously, I eventually got it. This one only ate up two hours of my life, but it nonetheless drove me ever so slightly slightly closer to total madness. These are the sacrifices I make for you people.
SharpVue Shenanigans - Felipe
Logic Worlds modding system is extensive, but to really enable modders to take advantage of it, we need documentation for all that code. That documentation should be hosted online in an easily accessible format.. Because Logic World is written in C#, I thought that DocFX would be a great fit. It generates a website using plain HTML that describes all of the projects types and methods, and also allows you to write additional Markdown documents. However, while the resulting webpage did look and work great, I did not like how the tooling itself worked. The docfx command-line interface was clunky and cumbersome, and its also very slow for some reason. This is why I started writing SharpVue. It is very similar in concept to DocFX, however the generation is much faster and the command is very straightforward to use. Another big difference is that the resulting webpage is an SPA written in no other than Vue, which allows distributing the page as a single .html file. You can check a demo documentation page here, which can be downloaded and viewed offline as a single HTML file. Keep in mind that the project is still pretty young and there are some bugs and missing features, and dont look too closely at the contents since its all subject to change. I had lots of fun working on SharpVue, especially since I got to integrate a Vue project with a C# one which I both really like. It was also really rewarding to see the documentation slowly build up as I implemented more features.
Bugs Fixed This Week
- Fixed being able to make your teleport shells cast shadows if you turned on the see your own shadow setting during a teleport sequence. Now, teleport shells intentionally cast shadows, which looks awesome, and they are properly handled by the see your own shadow setting.
- Fixed fancy pause menu music effects persisting to the main menu music
- New character controller: fixed player movement not being frozen during the first phase of the teleportation sequence
- New character controller: fixed weird collision with the ground while flying
- New character controller: fixed noclip mode not working
- New character controller: fixed inverse coyote time not working
- New character controller: fixed raycasts using the position of the player on the previous frame instead of this frame
Its been a bit of a lighter week for us, with Jimmys second-favorite holiday and some very stressful world events. But regardless, weve continued to plug away at Logic World, and weve got some juicy tidbits to share with you on this fine Wednesday.
Endless Pauseabilities - Jimmy
Over two years after I added it (I checked -- it was October 20, 2018), the pause menu now actually pauses the game! Ive also added some fancy audio effects to the music in the pause menu. [previewyoutube=mIBm4A8CmL8;full][/previewyoutube] The game only actually pauses if youre playing by yourself. If there are other players in the world with you, it wont be paused.
Web split - Felipe
Since I performed the latest web rewrite, the service that served your requests was composed of two parts: the front-end and the back-end. The front-end is written in Vue and is served as static files, whereas the back-end is a single GraphQL endpoint. All of these endpoints were being handled by the same service, which meant that the entire service had to be recreated when I made a change to either part of the service. This is less than ideal, as I want to aim for the lowest possible iteration time, so I set on to split these two ends into two separate services: one is a very simple and fast static file server for the frontend, and the other is the same service that was previously serving the API, only with the static files removed. Although it wasnt the main goal, this change also brought some significant performance improvements when navigating the site, particularly the initial page load. Additionally, if the API service were to be down for any reason (for example very high loads), the static server should still be running and serving the website to the users, which gives us an opportunity of showing them a nice the site is down message instead of just completely breaking.
Notifications: finale - Felipe
Last week I talked about a new notifications system on the front-end of the site, and this week I finished it!
Ive added a new panel that shows you all your notifications, accessible through the bell in the top navbar. From here you can see all of your notifications, optionally showing only the new ones, which can be clicked on to check them out and mark them as read. And by the way, email notifications were fixed lol.
Continued work on new player controller - Jimmy
My biggest task this week has been to finish the work I described last week on the player controller. I completed the integration and modifications of the third party library Im using, Kinematic Character Controller, and I fixed all the glitches that popped up. All the features I described last week are fully implemented, and I just need to fix one last big issue (which has to do with how the controller handles stepping up onto ledges) before its done. In addition to everything mentioned last week, Ive also integrated the character controller with the physics system so it can act like a pseudo physics object. Like moving platforms, physics objects arent currently used in the vanilla game, but they can be added by mods and I really want to add gameplay features with them after LW 1.0. Previously, the player controller would treat physics objects as static immovable objects, but now the player can exert forces on physics objects, and physics objects can exert forces on the player. Heres a quick demo video. Additionally, Ive done a big refactor of how the game handles player positions. Previously, your head position (the center of the bobby sphere) was used. But this was awkward in a number of scenarios; for instance, when you teleported to [0, 0, 0] your face would be inside the ground. Now player position is handled using the position of your feet; when you teleport to [0, 0, 0], you are standing on the ground. This has also allowed me to refine flag teleportation: previously, after teleporting via flag, youd be hovering in mid-air and youd fall a short distance unless you were flying. Now, however, after flag-teleporting your feet will be resting comfortably on the ground. And finally, Ive tweaked the logic of how and when the player controller is simulated to better handle game states. Previously, if you opened a menu (such as a components menu, the Selection Menu, or the debug console) the player controller would stop being simulated. You would instantly freeze; if you were jumping or falling, youd hover in midair. Now, however, the player controller is always simulated: its just the input to the controller which is paused. Opening menus is like holding a tablet in front of your face, instead of switching to an entirely separate plane of existence. As I said before, theres just one remaining issue to sort out before all this can be merged and marked as completed. I know I said thered be an extensive video on the player controller this week, but itll have to wait a little longer. Probably next week. \\_()_/
Bugs Fixed This Week
- Fixed Hue slider being 0-255 instead of 0-360
- Fixed being able to scroll in the InputFields of some InputSliders
- Fixed text links still changing color if you click on a part of the text that is not a link
- Fixed a rare fatal error when trying to press a Key from a specific angle
- Fixed footstep sounds not playing
- Fixed weird scaling issues with the player controller if you spammed the crouch key fast enough
- Fixed physics objects being unstable when resting on the ground in Gridlands and Grasslands
- Fixed the server commands simulation.pause and simulation.resume not working
Smooth Scrollin - Jimmy
Ive added smooth scrolling, and added some options to customize the feel of the scroll to exactly how you like it. [previewyoutube=DwAYjTqaS7A;full][/previewyoutube] Ive wanted to add smooth scrolling FOREVER. Heres a forum thread from June 2019 where I asked about it, and I have development notes that say add smooth scrolling from all the way back in October 2018. It feels SO GOOD to finally have it in the game.
Notifications - Felipe
There are several reasons why logicworld.net might need to send you a notification about something. When somebody replies to your comment, when youre mentioned by username, or when theres a new post in a forum you follow, you want to know about it. In the future we might also have notifications for things like friend requests or private messages. Therefore, we need a robust system for sending notifications to users. This week Ive started working on merging the notifications system with the website itself, allowing you to see and interact with them. This will include real-time communication, making sure you get to see your notifications as soon as they are created. Unfortunately, almost all work Ive done so far has been in the backend, thus I have nothing to show. Be sure to tune in next week though, as I will hopefully have finished the frontend! For each type of notification, youll be able to choose whether or not to get a web UI notification, a browser notification, and an email about the notification.
Player Controller Overhaul - Jimmy
This week Ive been working on an overhaul of the systems for moving your character around in the world. Here are some advantages of the new system over the previous system:
- Much smoother and more reliable collision detection, and better handling of edge cases like sloped hallways
- More customizability to the user: parameters like step up height, max stable slope angle, stick to ground force ect can now be tweaked to preference
- The ability to rotate the character, so world types with custom gravitational geometry -- like a spherical planet -- can finally be added
- Way way way WAY better modding support. It is now crazy ridiculously easy to implement custom character movement logic.
- The ability for players to stand on platforms that are moving and rotating, with momentum handled properly as you jump on or off of them. This is unused in Logic World for the moment -- at least, without mods -- but its needed for some stuff we want to do after 1.0.
Color Picker Refresh - Jimmy
I added dark outlines to all parts of the Color Picker UI, to bring it inline with the new Logic World UI style.
Im really surprised by how much better this looks. I was originally planning to not even mention it in this blog, but it looks so good that I cant help but show it off. I also took the opportunity to finally add anti-aliasing to the Color Picker Triangle, fixing its ugly jagged edges. Nobody has ever pointed them out, and I might be the only one who even noticed; but regardless, its all nice and smooth now :D
Bugs Fixed This Week
- Fixed being able to exceed the maximum CircuitBoard size using the Board Drawing mechanic
- Fixed being able to exceed the maximum CircuitBoard size using the "snap resizing size to square" mechanic
- Fixed intro screen text not changing color with UI palette
- Fixed SUCC newline escapes not working properly
- Fixed various issues with clickable links in setting descriptions and the about menu tabs
- Fixed various typos in the localization files
- Fixed not being able to hold down Buttons and Keys with the mouse while in a Chair
Happy Halloween from Mouse Hat Games!
Happy Halloween, friends! May your haunts be spookish and your candies multitudinous.
Please enjoy this SHINY BOBBY pumpkin, from the incredible mind and workshop of Jimmys Dad.
--------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. View this post on logicworld.net More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Welcome back to Logic World Wednesday! Were hard at work on your game, and this week weve been focused on optimization.
Super Speedy Save Loading - Jimmy
Ive improved the time it takes to load into a saved game by about 50%. [previewyoutube=ki0HPZN5pes;full][/previewyoutube] Theres still more work to be done to improve this further, but Im very happy with the progress so far.
Socket Slowdown Solution - Jimmy
Sockets are a component that lets you plug circuits into other circuits. When a sockets conductive blue part is touching the conductive blue part of another socket, they form a connection, and signals can be transmitted through them. Whenever a socket is placed, moved, or rotated, it needs to check whether its touching any other sockets, to determine if it should form a connection with them. Until this week, this was done by checking against every single socket in the world. This, obviously, is terrible; it means that the complexity of checking for socket connections increases exponentially as more sockets are added to the world. In nerdspeak, the operation was O(n^2). Now, sockets only check against other sockets that are nearby. The world is divided into a 3D grid of cubic cells, and all sockets are indexed by which cell they are in. When checking for connections, a socket checks only against sockets in its own cell and in the 26 surrounding cells that have a point of contact with the base cell. While this system is somewhat slower when youre in a world with just a few sockets, it critically does not get slower as more sockets are added to the world. Theres a hard upper limit to how slow the operation can get; in nerdspeak, the operation is now O(1). When you have a world with several thousand sockets, testing for connections is now massively, massively faster.
Fixing this fixed a lot of the slowdown when loading worlds, as can be seen above.
Even More Web Fun - Felipe
This week Ive been working on a bunch of minor website improvements:
- All timestamps are now updated every 30 seconds to more accurately show the age of recent posts and comments.
- The scroll position will now be properly saved and restored once the page is fully loaded when navigating to and from pages, or reloading.
- Comment permalinks now work properly
- Fixed quote formatting not working
- Fixed comments not being sorted by date.
- You can now edit comments, and the date and time of a comments last edit will now be displayed alongside the original post date.
- Added Related posts column to all posts with a list of the newest posts in the forum that the current post is in.
Cubic Chunks - Jimmy
All objects in Logic World are divided into chunks. A chunk is a single, solid, giant chunk of geometry in the shape of many smaller objects. You stupid, gullible players are tricked into thinking there are thousands of objects in a world, but in reality there are only a few dozen. Chunking is the major reason why were able to have thousands of components and wires in a world without lag; GPUs are much better at rendering a small number of complex objects than a large number of simple objects. Before this week, chunks were assigned along a 2D axis. Picture a checkerboard grid on a plane within the 3D world. Each chunk existed as a column: finite along two axes, but expanding infinitely into space along the Y axis. But this week Ive overhauled the system to work properly in 3D: a 3D system for a 3D world. This is an important step for optimization, and its already sped up performance somewhat by allowing for better frustrum culling in some situations. Its also absolutely necessary to properly support world types that have a non-standard floor shape -- such as a spherical planet, or the inside of a giant cylinder -- which is something I really want to do. Ive also added a debug mode that colors all objects in a chunk with a random color, so you can visualize where the cunk boundaries are. I think it looks quite pretty :)
In the process of adding 3D chunks, I did a particularly satisfying refactor of our WorldRenderer class, which had grown very bloated and nasty in the ~1.5 years since it had been created. WorldRenderer used to be about 600 lines and do several different things; now its been split into four smaller, more focused classes, each 100-200 lines.
Packet Compression - Jimmy
This week Ive implemented LZ4 compression on many of the network packets sent between the Logic World server and the client. LZ4 is an extremely efficient compression library: it makes data way smaller in exchange for a very small performance impact. However, the performance impact is not zero: its around 10% slower to serialize or deserialize a packet when using compression. So compression should only be used in the specific situations where the increased serialization time is outweighed by the decreased packet size. I spent about a day trying to build a system that would automatically detect whether compression should be used for every single packet. However, this ended up being insanely convoluted and not worth the effort at all. Instead, were now using a simple system where some packet types are always compressed, and some packet types are never compressed. My original code for this was kinda trash ngl, but as he often does, Felipe swooped in and made my code way cleaner and better organized. In the process, he also allowed mods to specify that their packet types should be sent compressed. Thanks Felipe! Because of packet compression, it is now about 75% faster to download world updates from the server and to upload your world changes to the server.
Hotbar Customization - Jimmy
Ive started adding some customization options for your hotbar! The hotbar is some of the most used and most important user interface in Logic World, and its important that everyone is able to set it up exactly how they want it.
This is all part of my endeavor to refactor the hotbar code. The hotbar code is some of the oldest and worst code in Logic World, written at a time when I knew a lot less about coding and a lot less about coding user interface. It desperately needs to be cleaned up if Im to add features to it.
Bugs Fixed This Week
- Fixed sometimes not getting your position set by the server properly when you load into a world
- LogicSettings: fixed being unable to save or load settings with a value of null
- The game won't complain anymore if you've added files to the Backups folder that don't conform to its expected folder structure
Weve had a productive week, working on various odds and ends throughout the game.
Multiplayer Menu - Jimmy
Ive been working on one of our last big pieces of user interface, the multiplayer menu!
(WIP!) Ive also been working with Felipe on the code for learning information about a server before connecting to it, such as the MOTD and player count, for displaying in this UI. Unfortunately that stuff is really hard and we werent able to finish it for today. Once thats all done and integrated with the UI, Ill likely do a video showing off some neat features of this menu :)
Web Fun - Felipe
This week Ive been plugging away at our logicworld.net website, fixing bugs and adding features. I started by creating a temporary user page, like this one. Its still very much barebones though, I pretty much added it just to get rid of the 404 error youd get otherwise. I will be improving it over the coming days, allowing you to edit your bio as well as showing your post history. Last week I added comment deletion, however a bug prevented the delete icon from showing. I fixed this bug, and I then added post deletion and editing, with comment editing coming soon as well!
More Robust Save Loading - Jimmy
All components in Logic World have a standard set of data: the position in the world, the rotation in the world, et cetera. But many component types have additional custom data that they must save and load. For example, a Circuit Board must save its width, length, and color. A Switch must save its color and whether it is on or off. For every component with custom data, that data is stored as raw binary, both in memory and in the save file. Every component has a CustomData byte array. This array is null for components without custom data, and full of binary for components that do have custom data. For handling this on the API side, Logic World uses a very clever system: we define an interface type with the custom data that the component has, and at runtime, binary serializers and deserializers are generated for all the properties of that interface.
interface ICircuitBoardData
{
int Height { get; set; }
int Width { get; set; }
Color24 Color { get; set; }
}
class CircuitBoard : ComponentClientCode
{
public void SetDimensions(int width, int height)
{
// These calls to the Width and Height setters automatically
// invoke the binary serializer.
Data.Width = width;
Data.Height = height;
}
public void RageQuitIfBoardIsBlue()
{
// This call to the Color getter automatically invokes the
// binary deserializer.
if (Data.Color == Color24.Blue)
Application.Quit();
}
}
For a long time, theres been a major flaw with the custom data system: the automatic serializers and deserializers had no way to detect bad binary data. If a component tried to deserialize the binary data and ran into a problem, then best case scenario the data would be totally wrong, but most of the time there would just be an extremely unhelpful error and the save would fail to load. This would usually come up when loading an old save after we changed the custom data structure of a component -- for example, it happened to several of our beta testers recently when we added two new properties to the Flag custom data, the flag name and the option to include it in the teleport list.
This week I added some validation code when deserializing a components binary CustomData. Before and after deserialization, the save loader will validate that everything looks okay. If it doesnt, then that component is reset to its default data values.
With this change, game saves are even more robustly protected against corruption and against breaking changes from us and from mods. Its been on my todo list for a long time, and Im very happy to have finally implemented it.
Convertible Boards - Jimmy
A few weeks ago I spoke of a new system for force-loading worlds that have potential issues. Well, this week I ported that system to work with saved boards as well!
This ensures that your saved boards will always work; when our future game updates break them, there is already code and UI in place to convert them.
Persistent Hotbars - Jimmy
In Logic World, before you place an item in the world, you must add it to your hotbar.
Previously, the items on your hotbar would be reset every time you loaded into a game. But this week Ive made hotbars persistent! The data is stored in the save file in a nice human-readable format, alongside other player data such as a players position in the world and the direction theyre looking. Ive also started work on the backend code for saving and loading hotbars, which is a feature I hope to add soon :)
Bugs Fixed This Week
- Fixed "Cannot initialize Cloth: scale is zero!" issues
- Fixed a rare memory leak related to the music player system
- Fixed not being able to auto-delete old backups that were made with suffixes
- Fixed your settings being reset every time you start the game
- Fixed a save-conversion log message not being triggered when it should be
- Fixed worlds being force-loaded always instead of just in appropriate situations
- Fixed disconnecting while placing a loaded board creating permanent "phantom components" that cannot be interacted with but nonetheless lag up the world
Reorderable Lists - Jimmy
Ive added a slick new system for reordering a list of items using click and drag. [previewyoutube=OuwZd50IHII;full][/previewyoutube]
Heavy UI Polish - Jimmy
While implementing the reorderable lists, I noticed many small inconsistencies and annoyances with Logic Worlds menus. Elements that were misaligned by a few pixels; scrollbars that had a tiny amount of slack where they should be fully expanded; state flows that required more mouse movement than I would like; buttons in inconvenient or ugly places. Because Im a crazy perfectionist, I spent about a day going through my list of grievances and fixing many of the issues. Im pretty happy with the improvements. To me, at least -- because I know what to look for -- the UI is noticeably nicer to use.
Im rewriting the website again lol - Felipe
I have decided to rewrite the logicworld.net website completely from scratch one more time. To help you understand how I arrived at this decision -- and how The Vuening will be superior to all the iterations before it -- let me tell you the story of my journey as a web developer...
The History of Logicworld.net
Way back before we even announced Logic World (around October 2018), I started writing the logicworld.net website for the first time. I made it in C# using the ASP.NET Core framework and plain old server-side HTML templating. The server was completely monolithic, meaning there was a single executable that handled everything, from storing data in the database to sending the site to the users. The more I worked on it though, the more I was becoming limited by the technology I was using: the HTML pages were littered with Razor interpolations, and it was very ugly. For this and some other reasons, I decided to rewrite the site, this time using an SPA framework called Vue.js on March 21, 2019. SPA means Single-Page Application, and you can read in-depth about them on Wikipedia. A typical website has many separate pages, each of which must be loaded independently by the browser. SPAs, on the other hand, load a single page and then dynamically update that pages contents based on what the user is doing. The new, SPA-based logicworld.net was much nicer, the code was cleaner and everybody was happy, however the backend was still the same as the original. That code was also getting quite unmaintainable (after all, this was only the second web project Id ever done!), so the need of rewriting that as well was quickly growing.
The Kubening: The Final Form of Logicworld.net
At this point, I scrapped every single line of code I had written for the website and started on a fresh new repository. I knew I wanted to go with a microservice architecture, since I started using it on the previous version (albeit too late) and I quite liked it, so a core part of the new system would be Kubernetes. Kubernetes is sort of a competitor to Docker Swarm, which is the service we were using previously and that took care of managing containers and spreading the workload over multiple machines. Docker Swarm is built-in to Docker, while Kubernetes is a completely separate system, and they both have one thing in common: their job is ultimately to create and destroy Docker containers. This new system, with Kubernetes being very scalable and modular, allowed me to start writing the many services that would make up our cloud infrastructure (which were of course written in Go). When I started to write the main web service, I was faced with a decision: should I use an SPA framework like the old site, or a pure HTML based solution? I started to contemplate the pros and cons of each solution and, as you might already know, ended up choosing the pure HTML way. It was not an easy, straightforward decision, but I chose pure HTML for the following reasons:
- SPA sites are heavier on the first load than HTML sites. Since the main use for the site (at least right now) is to read LWWs you are unlikely to navigate much around the site, so the SPAs benefits of only loading assets once doesnt give it an advantage over plain HTML, and in fact makes it a bit worse.
- Some people have JS disabled on their browsers (usually for privacy reasons), which makes an SPA completely unusable.
- An SPA is a bit overkill for a games website.
- An SPA communicates with the server via an API, which also has to be developed and maintained.
The Vuening: The True Final Form of Logicworld.net
After much consideration, I finally arrived at the following conclusions:
- While it is true that the initial load time of an SPA is slower than a pure HTML site (sending 3-4 times the quantity of data), this advantage disappears once youve navigated to a couple more pages. Our envisioned future for logicworld.net is one where most people are doing a lot of page navigation, browsing forum posts and uploaded creations. When you consider that as the typical use case, the SPA actually wins for total data sent and total time spent loading pages.
- Only a [very small percentage of people](https://deliberatedigital.com/blockmetry/javascript-disabled) have JavaScript disabled, so making such a huge decision to appeal to that small fraction of people does not make sense. While we support folks efforts to retain more privacy online, we ourselves are not actually stealing any data using JS, and the most important thing is that we have a functional website at all:
- An SPA is *much* faster to develop new features for, see the below paragraph. I think that in the future when we introduce workshop features I will be very glad to be using one.
- My worries about maintaining an API were partially extinguished when I decided to use GraphQL, which I will talk more about down below.
Bugs Fixed This Week
- Fixed other players not affecting flag cloth physics
- Fixed not being able to see your own reflection in SHINY BOBBY
- Fixed the loading screen not displaying when connecting to an external server
- Fixed the "Disconnected" screen becoming stuck on if you used the console to connect to a server while on the disconnected screen
- LogicUI: fixed HoverButton still registering ClickBegin events when EnableButton is set to false
- Fixed some color picker menus not playing nice with menu resizing
- Fixed being able to set the size of the Edit Display Configurations menu to so small that the UI would glitch out
Multiplayer Settings - Jimmy
Ive added a bunch of settings to control your appearance in multiplayer! [previewyoutube=t5yYImXanA8;full][/previewyoutube] This also marks the introduction of Formal Bobby. Formal Bobby is a smoother looking Bobby skin that is available as an option alongside the classic Casual Bobby. Let me know what you think of this new look! Its a particularly special moment for me because this is the last tab of the Settings Menu that I needed to make. For months and months, the multiplayer tab has been empty save for giant text that says todo make this page. But now, Logic Worlds settings menu -- the menu that Ive poured so much time and effort and love into -- is feature-complete, with no more placeholders! These settings are the first in a series of several multiplayer-focused features Im working on. Watch out for two or three more next Wednesday :)
The Logic World Original Soundtrack is complete - Markku
Hello everyone. This week I finished producing Logic Worlds OST. It has been an incredible experience to write this score and I cannot wait for you all to hear the finished product in its entirety alongside the game. In the coming weeks, weve decided to post tracks from the OST one-by-one leading up to the games release with blog posts about each piece. Ill be talking about my compositional choices regarding instrumentation and harmony as well as sharing some early versions of the pieces to show how they evolved. The soundtrack will be released on all streaming platforms on the same day as the game, and I hope that listening to it motivates you to revisit Logic World time and time again. Talk soon! Markku
Player Authentication - Felipe
This week Ive been working on a system that allows game servers to verify the authenticity of the users that connect to it. This is important for things like whitelists and banlists; server owners need to know that connecting players are who they say they are. Originally, I was going to use a system similar to what Minecraft (used to) use, however this method involved both client and server talking to our servers. Though it was doable, this would have introduced quite a bit more complexity. The issue that made us reject this system is that the servers would need to be uniquely identified. At first, I thought we could just use the servers IP as this identifier. However, when I thought about it some more, I realised that this wasnt feasible as theres often more than one IP address that you can use to connect to a single server: the address on the local network is different from the external address, and servers can use custom domain names. In the end, weve settled on a system that someone came up with 4 years ago on Reddit. In this system, when the client wants to connect to a server it first requests its challenge, which is a completely random string generated by the server. This code is then sent to our auth server, which generates a payload and signs it with a private key. This payload+signature pair is sent to the server, which verifies the signature with a public key. If the verification is successful, the server then parses the payload which contains the users info, including their username. This allows the server to be completely certain that the information that the user provided is legitimate, since it is signed using our auth servers private key. It also ensures that the server never has access to any information that could be used to impersonate the user, so malicious server owners have nothing to abuse. So, Ive got the system all planned out, and over the next few days Ill finish implementing it. Ill see you on your servers -- and youll know for sure that its actually me ;)
Localization Updates - Jimmy
This week Ive given some love to our translations, which I admit Ive neglected somewhat since community translations began a few months ago. On our community translation page, Ive updated the localization keys from the most current version of the game files. There are over 350 new keys to translate, including new components, new settings, and a whole lot of translations for the controls menu. Also on our community translation page, Ive added the languages Arabic and Belarusian, which were missing previously. Next, Ive updated the display metadata for all of our languages. This includes stuff like the flag texture, the ISO 631-1 code, and the sample text. Finally, Ive added an in-game button that links to the community translation page.
Thank you, so much, to everybody whos helped translate. I and the rest of the team are stoked to be launching Logic World in so many languages. You guys absolutely rock. If youd like to help translate, please click here to begin! Youll get your name in the game credits, and our eternal gratitude :)
Bugs Fixed This Week
- Fixed being able to manually enter values to an InputSlider that are out of its range
- Fixed glitches when setting the min/max of an InputSlider at runtime
- Fixed not being able to place Flags in tight spaces
- Fixed various weird issues caused by Flag cloth trigger colliders
- Fixed Flag cloth being cut off for hotbar renders of flags with a short flagpole or a long cloth
- Fixed not being able to flag-teleport into spaces occupied by wires
- Fixed Chair colliders not lining up well with the visual geometry
- Fixed player looking direction resetting when exiting a Chair
- Fixed Sandbox List menu throwing an error and not generating if there is a sandbox present using an outdated save format version which has a valid save converter
- Fixed missing rocket ship icon in Create Sandbox menu
- Fixed none of the Settings Preview Images working
- Fixed the flippy part of switches not showing up in SHINY BOBBY when realtime reflections are enabled
- Fixed background of Pig Flag being transparent instead of a beautiful sky-blue
- Fixed missing description for the Open Teleport Menu and Open Load Board Menu bindings
- Fixed missing localization for Delayers
- Fixed incorrect hover tag localization key on the "show/hide sliders" button in the Color Picker menu
- Fix embarrassing misspelling in title/description of movement setting (Analogue -> Analog)
- Fixed part of the Edit Bindings menu not being localized
Wednesday is a state of mind.
Fancy new inputs - Jimmy
Ive added two features to the input system that have been on my wishlist for a while: theres now proper support for gamepads or other analog input, and MIDI inputs now Just Work as if they were keyboard keys. [previewyoutube=oiH68X_cVbs;full]{% youtube oiH68X_cVbs %} [/previewyoutube]
Building Enhancements - Jimmy
Ive made a few additions to the building mechanics that help with the mass placement of components and wires. [previewyoutube=saK3ek47CvY;full][/previewyoutube]
Yet Another Flag Video - Jimmy
I really love Flags, and I couldnt resist adding one or two more features to them [previewyoutube=tflCBr0Rcdc;full][/previewyoutube]
Texture Optimization - Jimmy
Last week I mentioned that I was hoping to optimize the loading of Flag textures by converting them to DDS. Well, I decided to go a different route and use dynamic texture loading. Instead of loading all textures on startup, the game now loads textures only when theyre actually needed. The fastest texture is no texture. Tiny thumbnail images are loaded for the menu where you select a flag texture, but the full-size images are now loaded into memory only when you place a flag that uses them. The RAM usage, VRAM usage, and startup time of the game is now almost identical to before I added 400 hi-res flag textures to the game files. In fact, its a little smaller. I am pleased.
Save file error handling - Jimmy
Ive completed the work I started three weeks ago on an overhaul of the save loading code and UI. The game can now detect and deal with errors in save files before theyre loaded. Saves with issues have little notification symbols on them, which you can hover over for more information. Ive also added a UI in to explain when a save cannot be loaded due to an error.
And finally, Ive added UI for when a save can be loaded, but there might be problems with it. Ive furthermore added the code for dealing with those problems when you decide to load the save anyway.
Back That Save Up - Jimmy
You might have noticed in the above image that the button says backup and load. Well, that meant I had to code a proper backups system this week. It works like this:
- Both sandboxes and saved boards are automatically backed up
- Backups are stored in a unique folder for each item that can be backed up
- There is a configurable number of backups to keep per item before old backups of that item start getting deleted -- by default this number is 10
- Backups of deleted items will be kept for a while, then deleted. By default, backups of deleted items will be kept for 50 days.
- Sandboxes are automatically backed up while youre playing in them; by default this happens every 5 minutes
- Saved boards are backed up if they are being overwritten with a new saved board of the same name
- Sandboxes and boards are backed up before they are deleted
- Sandboxes and boards are backed up before they are loaded if there was a potential issue detected before loading
Still alive - Felipe
Hey guys, just checking to let you know Im still here. I started school last week so I havent had as much time or energy for LW lately. Regardless, Ive been working on improving the networking of the game (yet again), and Ive also been thinking about the modding tutorials, which well be starting on soon. Unfortunately I dont have anything to show off to you this week, but Ill be back soon with fun stuff!
Bugs Fixed This Week
- Fixed not being able to place things very close to the top of Flags
- Fixed flag hotbar rendering being based on the wind direction at time of render
- Fix unnecessary lag while grid-placing Chairs
- Fixed incorrect grid placing dimensions on Inverter, XOR Gate, D Latch, Oracle, Relay, 3-way AND Gate, and 4-way AND gate
- Fixed sandbox title input field sometimes being way too small
- Fix sandbox list order not updating when sorting by title and renaming an item
- Fixed build pipeline being broken in several ways
Hello, its me, Jimmy! I forgot to get Felipes section before he went to bed, and it took me the entire #$@& day to make a script for mass-exporting flag SVGs to PNG which left me no time to finish the two other features I wanted to talk about in this blog post. Well be back with a full-sized post next Wednesday, but today we have just the one lil section on Flag improvements. Hope you enjoy!
Flag Fun - Jimmy
This week I polished up Flags and gave them a use beyond decoration: they can now be used as teleport waypoints! [previewyoutube=MYsz6TmUngI;full][/previewyoutube] I was quite surprised by the journey that Flag development took me on. Flags touch on many different areas of the codebase: this includes various UI stuff, component resizing, component initialization (for the random flags on placement), player teleportation, the ExtraData system (described here, used for storing the order of Flags in the teleport list), the code for indexing and searching for items in a menu, and more. When I visited each of these areas, I stopped to make enhancements and fixes and clean up the code. In particular, Flags forced me to have a really close look at the way Logic World loads textures from disk into GPU. Now that there are hundreds of flag textures, I can't get away with the original shoddy code; it's just too slow. So this week I spent a lot of time learning about textures, and at the end of it all I've improved texture RAM usage by about 70%, texture VRAM usage by about 90%, and the time to load textures by about 50%. I think I can get the texture load time down another 75% or so by storing the textures in .dds format, which minimizes the work the GPU has to do when converting the data into a format it can use. I expected Flags to be a quick side-thing, but they ended up being one of my main projects this week. And I'm glad they did -- as a result, the entire codebase is more robust and solid.
Bugs Fixed This Week
- Fixed the back side of Flags rendering without lighting
- Fixed OrganizedList search results not updating when an item was added/deleted/edited
- Fixed custom search tags not working due to outdated localization keys
- Fixed NullReferenceException and glitchy behavior when trying to resize after reloading a save
- Fixed timing issues with setting player rotation during teleport
Super Sexy Sandbox Selector - Jimmy
Ive added a whole bunch of features and improvements to the Sandbox List menu! [previewyoutube=pnsM4MpEQfU;full][/previewyoutube] As I often do with UI design, I sketched the new Sandbox List menu on paper before I started making it in Unity. I thought it might be fun to show the sketch side-by-side with the finished product.
Networking Abstraction - Felipe
This week Ive been working on abstracting the networking layer that the game uses, which is currently Lidgren. This makes the code much easier to maintain and, possibly, replace, since the code that actually uses the networking stuff doesnt need to know whats actually carrying your precious bytes between the server and the client. For instance, the networking could now potentially be replaced with a backend that uses far less bandwidth, at the expense of higher latency and CPU usage. Ive already talked about this in a Previous LWW, .However the route that I took back then involved some code that was making existing code even more complex, so it ended up stalling until I returned to it earlier this week. Now Im using cleaner and better code practices which, combined with last weeks refactor, makes for a great system.
Lightning fast MessagePack packets - Felipe
For some time weve been using our homegrown SECCS library for writing and reading packets to and from their binary representation. This library was based on the use of reader and writer methods like the ones the Lidgren library we are using provides. However, when doing the networking refactor, I found that it was hard to decouple SECCS from Lidgren, and at the same time I realised that my reasons for making SECCS didnt really hold up anymore. After lots of consideration, weve moved away from SECCS, and all network packets are now serialized with MessagePack. This library, as they describe themselves, is "like JSON, but fast and small." That sums it up pretty well, since its purpose is to take an object and spit bytes out that can be used to reconstruct the original object. The difference from SECCS is that, as I mentioned, SECCS made use of Lidgens messages, which made it more efficient (or so I thought at first) but indirectly tied it to Lidgren. I wasn't able to get benchmarks on SECCS vs MessagePack for this week, but I'll try to have them for next Wednesday :)
Bugs Fixed This Week
- Fixed weird behavior on Windows when editing the description of an OrganizedList item
- Fixed OrganizedList categories not being deleted when they're emptied
- Fixed missing hover tag localization on "add new tag" button
- Fixed Flags hanging from the wrong side
Hello Logicians! We are back from our break, and so are our Wednesdays. Were more excited than ever to be making your game, and were hard at work on the remaining features and polish needed to get it into your hands. We dont have anything to announce right now with regards to Logic Worlds release date. Please be patient with us; as soon as we know, you will know as well.
Balance at Last - Markku
Hello, all! Great to be back with some more music for the Logic World OST. This piece of mine is for solo piano and it is called 'Balance at Last'. It is about the mental clarity and fulfillment that we experience after overcoming something difficult. I hope you enjoy, and that you all are doing well. [previewyoutube=g8qXyIuGXiE;full][/previewyoutube]
Better Delayers - Jimmy
Delayers are components that allow you to intentionally insert delay into a circuit, for clocks and for precise timing logic. When Ive previously shown them off, delayers used a peculiar system: the length of a delay was chosen as a multiple of some constant coefficient. There was a delayer that delayed in increments of 10 ticks, a delayer that delayed in increments of 100 ticks, and a delayer that delayed in increments of 1000 ticks.
However, after extensive playtesting by myself and our testers, Ive realized that this system just isnt fun. With every mechanic I add to Logic World, my goal is to enable possibilities. I want to create many different pathways for solving a given problem, each with its advantages and disadvantages. I want to open the door for people to find inventive solutions. When youre playing Logic World, I want each little part of your contraption to be a meaningful and interesting decision. But in the case of the old Delayers, there was no decision-making or problem-solving. There was a single, objectively best way of creating a desired delay: stack up delayers in decreasing magnitude until you had the total length you wanted. This was tedious, uninteresting, and frankly it created some ugly circuitry. Ive been thinking on the problem of delay for a while, and I think Ive settled on a good solution. Ive removed Long Delayers and Very Long Delayers, and regular delayers can now have a delay length of anything between 10 and 100 ticks -- they are no longer locked to multiples of 10.
The tedium of chaining together delayers of different types has now been streamlined, as you can now easily set the precise delay length you want. For short, precision-timing delays of just a few ticks, Short Delayers (1 tick each) are generally the ideal solution. And for the longer delays of many seconds and beyond, youre now incentivized to build some kind of counter circuit. In my playtesting Ive found this to be infinitely nicer than the old system. The time I spend fiddling with delay lengths is minimized, which means I spend more time doing the interesting, fun parts of circuit building.
Server refactoring - Felipe
After coming back from my break, I decided that the servers code was too ugly, so I decided to refactor a lot of it. Since the server is made up of many more-or-less individual parts (for example, a save manager, a simulation manager, a network manager, etc), I set on to use Microsoft.Extensions.Hosting. This library is regularly found on ASP.Net Core, and it is used to manage many of an applications aspects, from startup to shutdown. It also comes with a Dependency Injection utility, which allows us to join the previously mentioned parts of the server together, while keeping them decoupled to allow for easy replacement and testing. Another perk of the new system is that the server can now generate a graph of the inner relationships between services:
(Dashed lines represent that the dependency is lazy in order to prevent cyclic dependencies) Visualizing our architecture helps us to understand where things are messy and need better organization.
Saving Refactoring - Jimmy
When I removed Long Delayers and Very Long Delayers (see above), I was faced with a problem. The game had no support for the removal of existing components. If you tried to load a save that contained component types that were missing from the game files, it would stubbornly refuse, insisting that you must be missing a mod. I had to add an option to load the save anyway, and in doing so delete all components of the offending types. However, as I dug into the code for loading saves, I was faced with an unfortunate reality: that code sucked. It was messy, it was tightly coupled, it was hard to read and hard to extend. There was also a lot of repeated/copied code between the server-side Load Sandbox functions and the client-side Load Board functions. I realized that I could either hack this new feature into the existing messy saving code, creating headaches and probably some bugs, or I could rewrite the whole damn thing. Well, I decided to rewrite the whole damn thing. What was formerly one of the smelliest parts of our codebase is now clean and shiny and easy to use. Among the benefits of this rewrite are:
- Faster save load times, particularly on machines with slower hard drives
- We can now check if a save file is corrupted before loading it
- Without loading the save, we can now extract various metadata, such as the number of components/wires in the save
- Save format converters (discussed [here](https://logicworld.net/view/pst-000f007e/logic-world-wednesdays-selfreflection#save-converters-jimmy)) now also work with saved boards, in addition to worlds
Quick and Easy Multiplayer - Felipe
Last week I talked about a system that lets players play online hassle-free, and this week Ive been working on integrating that system with the existing friends system. Now you can easily join a friends game through a couple clicks in the friends menu. [previewyoutube=j2W0wGAbsDY;full][/previewyoutube]
Flags - Jimmy
Ive added a new decoration component: the Flag! [previewyoutube=U5HeyU4Z-ys;full][/previewyoutube]
Transparent Resizing UI - Jimmy
At the suggestion of our beta testers, Ive made the resizing arrows partially transparent, so you can see whats behind them.
Bugs Fixed This Week
- Fixed not being able to bind Keys to a key that would close its menu (i.e. the Escape key with default bindings)
- Fixed the resizing arrow on Mounts pointing sideways instead of up
- Fixed the Console being unavailable while on loading screens
- Fixed the Console rendering underneath popups
- Fixed closing the console by pressing Escape also closing some menus if they were open under the console
Upcoming Hiatus
Hi, Jimmy here. Theres some changes happening in my life that will have a big effect on Logic Worlds development. I wont be working on this game for the next few weeks, and as such, Logic World Wednesdays will be taking a hiatus. It will hopefully return in late August. Logic Worlds release is also delayed, again. I dont know when to. Im sorry that this is happening, and Im sorry that I cant tell you more right now. I will fill you in and give a full update on Logic Worlds future when things are stable and I know whats happening. Rest assured that all three of us remain very committed to Logic World, and it WILL be released. This weeks edition is, I suppose, a season finale for Logic World Wednesdays. Thank you for all your support and love over the past two and a half years. Ill catch you on the flippity flip. --------------------------------------------- More Logic World Wednesdays
Editable Controls - Jimmy
This week Ive finally finished the user interface for editing your controls! [previewyoutube=hcEsP3EiXHc;full][/previewyoutube] As you can see from the video, the input system and the interface that supports it are incredibly complex. Programming it all was a very fun challenge.
New Website - Felipe
Over on https://logicworld.net/, we now have a brand new site! I've been remaking the website into a bunch of separate services (coded in Go), instead of the single big application that it was before. This has the advantage of being much easier to iterate on, as there is less code that has to be compiled for a single change, as well as being easier to test since each service can be tested independently from each other. Perhaps most importantly though, is the fact that the site now doesnt require JavaScript at all. It does use JS for some stuff but only QoL improvements: the entire site is 100% usable even with all JS disabled. Im still working out the kinks on the new site, re-adding missing features, and improving the visuals, so expect lots of updates to it in the near future. Now that the new site is live, I dont have to worry about maintaining the old site, and I can focus completely on this new version.
Hole-punching - Felipe
This week I've also been working on the system that will allow you to join your friends' games. We intend for this feature to be as easy as possible to use, requiring just a single click from the user's point of view. This is achieved through UDP hole punching, which bypasses the most common NATs and in turn removing the need for you to forward any ports at all. Hole punching consists of 3 parties: a client, a server and a master server. In our case, the client is the user that wants to connect to a game, the server is the user that's already in-game, and the master server is our cloud server. When the client wants to connect to the server, it first sends a request to the master server and asks for information about the server (that has previously been registered). When this happens, the master also sends information about the client to the server, and finally they both are able to connect through the tunnel that has been established. That was a very simplified explanation, if you want more details you can check out this paper that really helped me fully understand it. The proof of concept is done: I have successfully joined another instance of Logic World running on a remote PC -- Bob, to be precise -- without any port-forwarding. The next step is to integrate this logic with the game UI and Friends system.
Bugs Fixed This Week
- Fixed various issues with game input when there is no keyboard or mouse plugged in
- Fixed not being able to bind Keys to buttons on a gamepad or joystick
- Fixed not being able to bind Keys to mouse buttons or to scroll wheel actions
Workshop - Felipe
This week Ive started working on the workshop part of the website. In the workshop youll be able to browse, comment and download the sandboxes, circuit boards and mods that people have uploaded.
Each workitem (thats my term for all the items you can upload to the workshop) can have multiple versions, and each version can optionally have a (markdown powered) changelog. To clarify, Logic World's "Workshop" is not the Steam Workshop, but an independent system that can be used by any platform the game is purchased on.
Lights out - Felipe
Dark mode automatically makes a website ~12x cooler. In an effort to maximize the website's coolness, I've added dark mode, easily accessible by clicking a link in the navbar. For example, this is the same page as in the Workshop screenshot above:
As you can see, it keeps the same overall style of the light mode while being a lot easier on your eyes.
Custom Crosshairs - Jimmy
This week Ive added a whole bunch of settings to customize your crosshair! [previewyoutube=HOmuRXcCKME;full][/previewyoutube] This has been a very long time coming. Custom crosshairs is something that folks have been asking for, and something Ive really wanted to add, for literally years. It feels very good to finally have them in the game.
New Sletter System- Felipe
As part of my overhaul of our web services, Ive been working on a new system for sending out our newsletter. The new system is much simpler, and Ive given the emails themselves a shiny new paint job! Before:
After:
Bugs Fixed This Week
- Fixed various errors with multiplayer and with reconnecting to a server
- Fixed placing a Display crashing the server
- Fixed being unable to load saves with Displays in them
- Fixed "Draw Shadows on Additional Lights" setting being forced to off when "Draw Shadows" is turned off and then on again
- Fixed pressing the "Open Screenshots Folder" hotkey causing an error if it was pressed before taking any screenshots
Keybindings Menu WIP - Jimmy
Ive been working on a menu for editing the controls!
Its still missing the very important feature of being able to actually edit those controls, but its now displaying the controls and thats a start :) It can display all of the fancy features of our input system: multiple buttons that must be pressed concurrently, bindings that reference other bindings, bindings that must be tapped multiple times to trigger, and multiple different bindings as options for a single action.
Being able to display bindings visually is not just important for the Edit Controls menu, but also for things like the in-game tutorials, where players will be told to press a given button to trigger an action.
Fun with Bob - Jimmy and Felipe
After building Bob last week, weve been working on setting up the software to get him building the game. Weve run into several unanticipated issues -- because of course we did, why wouldnt we -- but on the whole its going well and its almost done. Bobs computational performance on builds is very promising; hes faster than our old build server by more than a factor of two.
Lighting Settings - Jimmy
As I was working on adding context and screenshots for translators, I came across a description for a setting that didnt make sense. I did some further reading on that setting ("shadow cascades") and it turned out I had no idea how lighting works in Unity. Well, I did some more reading, and now I have some idea of how lighting works in Unity. Ive used my newfound knowledge to buff out our lighting settings: we now have seven total settings related to shadows, each with a helpful preview image and informative description.
Shadows are both extremely important to the visual fidelity of a game as well as extremely demanding on a players graphics card, so I feel its important to have extensive settings for controlling them. I always get a little peeved when a game just has shadows: on or off -- not to name names -- and Logic World will not be joining that club of shame.
Bugs Fixed This Week
- Fixed being unable to select hotbar slots beyond slot 10 by double tapping or ctrl+tapping a number key
- Fixed client throwing an error if you tried to run an autoexec.lsf
- Fixed being unable to make pegs exclusive if they were part of a dynamic prefab (i.e. on a Panel Display)
The Logic World Community Translation Project
Today, the Logic World Community Translation Project has officially begun!
The enthusiasm of the translators has been absolutely staggering. Its been less than a day since translations began, and already we have thousands of translation suggestions, seven languages with at least one suggestion for each translation, and several dozen individual contributors. Thank you to everyone who has so far helped translate, and thank you in advance to everyone who is going to. We want folks to enjoy Logic World in whichever language they wish, and thanks to you, they will!
Component Resizing: Endgame - Jimmy
At the suggestion of the thoughtful @tokumei, Ive made some awesome changes to the Component Resizing interface! [previewyoutube=We-MVkT-TFA;full][/previewyoutube] This particular UI, I realize now, was a big blind spot of mine. For most of this games history, you couldnt resize things at all, and it was a big missing feature. Because of this, I saw any form of resizing as really good; I didnt realize how poor the interface was in comparison to what it could be. Thats why Im so grateful to this community and all the additional eyes it puts on the project. To Tokumei, and to everyone else who has suggested features for Logic World: thank you!
In-game logins - Felipe
This week Ive been working on making the game connect to our servers, and the first step of that is to let users log in using their logicworld.net account. To do this, all they will have to do is press a login button in the main menu, and their browser will open with the login page. Once you enter your credentials and submit, you will be authenticated in-game! We also considered having the login fields directly in-game. However, the login process is very complicated: it has to support creating a new account, resetting your password if you forgot it, sign-ins with external providers like Google, ect. It would be a lot of work to duplicate all this UI in both the browser and in-game, so were just using the browser login for both.
Friends list - Felipe
Many, many Wednesdays ago, I wrote to you about how I had started work on a Friends system for Logic World. This week Ive picked up on that work, and Ive added an in-game menu for all of your friends!
This menu will show you a list of your friends, including the profile picture they set on logicworld.net, their username and their current status (online or offline). I also want to make this status reflect what theyre currently doing, for example Playing with 5 people or Playing by themselves (this could of course be disabled in the settings). And, probably the best feature, youll also be able to join other peoples games through this menu (if they have enabled it).
Color picker square - Jimmy
I love triangle color pickers. I think they are completely and objectively better than square color pickers in every metric. Thats why, when I added a color picker to Logic World, I made the picker a triangle. To my utter shock and disbelief, this week I had a few people tell me that they prefer the square color picker. These people are, obviously, completely wrong. But nevertheless I have added an option to use a square picker.
And of course, just like the Fun Spinny Triangle, there is an option for a Fun Spinny Square.
Sexy New Server -- Jimmy and Felipe
Weve talked before on this blog about our Cloud Build system: we write some code, we press a button, and a server somewhere automatically builds the game for each operating system and uploads the builds. Until now, weve been using a server that we rented from a company. But this had two problems: [olist]
Bugs Fixed This Week
- Fixed 'Tried to add entity at invalid circuit state index' error, requiring a game restart, if you built a world with more than 10,000 concurrent circuit states
- Fixed errors when you tried to resize a component with wires directly attached to it (Panel Displays)
- Fixed board hitboxes becoming squished when you moved or placed a board on their edge
- Fixed sometimes not being able to resize objects for no reason
- Fixed being able to interact with Interactables that are behind players
- Fixed various crazy visual errors when cancelling Multi-Wire Placing at stage 0
- Fixed in-game changelog not rendering
- Fixed the `MissingLocalizations` command incorrectly stating that present localizations were missing
- Fixed the Configurable Menu scale slider label having an incorrect localization key
- Fixed Resizable Menus always starting in fullscreen when the game is played in Europe
Regular Logic World Streams!
The lovely @Daniel, a beta tester for Logic World, is now doing regular streams of the game! So far on-stream hes built a Nintendo CIC), a binary adder, a tic-tac-toe machine and more; right now hes working on a playable game of Battleship). In our biased opinion, Daniels streams are always tons of fun, and you should check them out! Follow him on Twitch and Twitter to be notified when he goes live.
--------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Grabbing Rotations - Jimmy
You can now easily move objects around, and their rotations are all handled properly. [previewyoutube=fxMjvSb0QtA;full][/previewyoutube] This is part 1 of 2 in my Grand Plan to Make Rotating Boards Less Awful and Difficult. You should be seeing part two next week.
Generalized Packet System - Felipe
To send data between the client and server, we use packets. These are small bits of data that the game uses for communicating things like when a player has placed a component. Previously, these packets were hard-coded, meaning that whenever we wanted to add a new packet type we needed to manually register it. A big issue with this approach is that mods were not able to add their own packet types. For this reason, Ive made this system more expandable: instead of packets having their own hard-coded ID they will be assigned an ID when the game starts. This will be very helpful for mods, as they will be able to send and receive their own data, independent from the rest of the game.
Fancy Circuit Optimizations - Felipe
This week Ive also been working on optimizing the code that does all the circuit simulation, namely the clusters system and the circuit states system. The most interesting one is probably the clusters one, since it involved more thinking rather than coding. Clusters are an internal structure we have within the simulation. A single cluster represents a group of pegs and wires all connected together. Since everything in the group will turn on and off at the same time, they can be treated as one object rather than several.
Previously the clusters that needed to be updated were stored on a simple list, which stored references to all of those clusters. This worked just fine, however it wasnt the most efficient approach. Since we only ever iterate through the clusters one after the other, we do not need the ability to get, for example, the fifth cluster in the list. Instead, we only really need to know which cluster is updating first, and which one is updating after it. This is very similar to the concept of a linked list, since each cluster just has to store a reference to the next cluster. This is much more efficient than using a list, since all the operations we need are O(1) (which basically means it always takes the same amount of time, no matter how many clusters there are) on a linked list. Theres also a distinction between a doubly linked list and a singly linked list: an item in a singly linked list only stores the reference to the next item, while a doubly linked lists item also stores a reference to the previous item. In theory we would need a singly linked list since we only ever go forward when updating, however using one would mean that we wouldnt be able to remove an item thats not the first or the last one (for example when you remove a component and we need to remove it from the list, its very likely its in the middle). For this reason, we need to go with a doubly linked list. We could use C#s generic LinkedList class, however it could introduce more overhead with unnecessary features and end up actually being slower than our old way of doing it. For this reason, clusters will instead build their own linked list of sorts, manually storing the previous and next clusters that are updating. When we want to update all of them we simply get the first one, update it, then check which cluster is next and repeat until weve reached the end. I was going to make a cool graphic diagram to demonstrate the concept, but unfortunately Im far from a graphics designer so if youre interested Ive made a text document detailing what happens when you add or remove a cluster. This should also drastically improve the performance of Relays, as those components work by creating and destroying clusters. However, we haven't been able to get numbers on that yet.
Bugs Fixed This Week
- Fixed vertical flying controls getting "stuck" when Lock Flight Y Axis is off
- Fixed Color Picker often opening by default to a white color
- Fixed Gridlands worlds by default being created as pure white
- Fixed boards flying away like a butterfly if you grabbed them at an angle that didn't immediately provide a reference location
- Fixed crazy errors next time you load a save if you quit to main menu while placing a component
- Fixed Edit Label Menu not doing "select all" when it's opened
- Fixed fatal error when spamming the rotation key on buttons and keys
PLUSHIE BOBBY
The amazing @Marutzo -- whom some of you might know as NITRO -- has made a gosh darn plushie of Bobby, Logic Worlds beloved protagonist and mascot.
Click here for another photo! This is pretty much the best thing ever and it has absolutely made our week! --------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Devilish Details #2 - Jimmy
Its been one of those weeks where Ive combed through the game and added tons of small details and polish. I felt it was time for another video compilation of these :) [previewyoutube=lwhjQLhvCgs;full][/previewyoutube]
Benchmarks - Felipe
This week Ive been working on some performance improvements in the circuit code, but quickly I realised that I had no proper way of testing whether or not my changes actually made a speed difference. For this reason Ive made a simple framework for us and mods to add different benchmark cases. A single case is an interface with a method in it that does a single iteration of work (for example, creating a component), and the framework takes care of running a ton of iterations and measuring how long each one takes, then reporting that to the user. This framework is accessed by the user through two commands: 'benchmark' and 'stress'. The first command will run iterations in about 1 second groups, then average the time each group took and calculate the time each single iteration takes. This is fine for long jobs, but for jobs that are very quick to finish (like changing the state of a wire), the time per iteration is so small that it becomes cumbersome to measure and compare. Thats why theres the second command, which will instead run as many iterations as it can in 5 seconds and report how many iterations per second it achieved. These benchmarking tools will be invaluable in the coming weeks as we get serious about speeding up Logic World.
Jarvi Makes a Mandelbrot, LIVE
Our brilliant and very handsome beta tester @TheWildJarvi has embarked on an epic quest: to build hardware for rendering the Mandelbrot set in Logic World.
Jarvi is livestreaming most of this process. If youd like to see hours and hours of unedited Logic World gameplay from someone who knows a heck of a lot about digital logic, you should check out his streams! The first few are already up on youtube, and you should subscribe to his channel so youre alerted of his future streams.
Bugs Fixed This Week
A member of our community recently suggested that we start including a list of bugs fixed each week in these blog posts. This week has been particularly bug-fix-filled, so it seems like a good time to try out the idea! Bugs with components
- Fixed Oracles generating a new value when their circuit network is updated, i.e. by adding or removing a connection to their input
- Fixed "ghost" display configurations on picked-up Displays with deleted configurations
- Fixed Buttons and Switches making extra sounds when they are placed, rotated, moved, and when the sandbox loads
- Fixed Buttons and Keys getting stuck on if they are rotated or flipped while being pressed
- Fixed held-down Buttons and Keys going up if another player joins the game while they're being pressed
- Fixed being able to press Keys when you couldn't see the actual key part
- Fixed Keys turning on but not moving and not making sound when a different player presses them
- Fixed being able to press Keys when they are visible only via their reflection in SHINY BOBBY
- Resizing components: fixed holding shift to snap to square size not working properly\
- Fixed wire ghosts sometimes having a different rotation from the wires they create
- Fixed multi-wire placing outlines sometimes being the wrong color
- Fixed player jump sounds always coming from the world origin, rather than the position the player jumped from
- Fixed players sticking to the ceiling when they jump into one
- Fixed players falling at an inconsistent, and usually too fast, speed when walking off the edge of a platform
- Fixed players decelerating in the direction they're facing instead of the direction they're moving
- Fixed players accelerating too slowly when the game is lagging
- Fixed hover tags rendering behind popups
- Fixed visual artifact on settings sliders when set to minimum value
- Fixed terrible glitchy behavior when clicking on scroll bars
- Fixed incorrect hover tag text localization key on "Add New Tag" button
- Linux: fixed resizable menu custom cursors being gigantic and taking up half the screen
- Fixed positional sounds not getting quieter with distance
- Fixed client's 'quit' command hard locking the application
- Fixed component registry not properly detecting the error when a mod adds duplicate component IDs
Time and Science - Markku
Hello everyone! I hope you enjoy my piece for the Logic World OST called 'Time and Science'. [previewyoutube=E2vEyGRL-tI;full][/previewyoutube] In addition to writing new music, I've recently been working on polishing some of my previous pieces for this soundtrack. I'm now completely done with 20 minutes of music for Logic World. The full soundtrack will be 40 minutes, so we're officially halfway finished! I'm looking forward to the next half and I hope that you're there with me on Logic World Wednesdays to hear some new tunes!
Loggy Loggy Log Log Log Log thats fun to say out loud - Felipe
This week Ive been working on making the game log the stuff its doing. Right now all the games output is printed directly to the in-game console (or the server console), meaning that if you, for example, wanted to print an error, youd have to explicitly specify the messages color every time you print it. Ive been working on a system that abstracts this, instead it lets you say print an error, and it will automatically print it to the console with the appropriate color, as well as to a file on disk. Mods will get their own dedicated logger, which means that it will be easy to distinguish between mods log messages. This is what the logs in the server look like:
Knowing the messages importance level (trace, debug, information, warning, error or fatal) also lets us write some pretty logs to a file:
Ive added a command that lets you change the log level (which by default is the information level), so that you can see the tracing messages that are hidden by default. Now that we have a proper logging system, it will be much easier to diagnose and fix bugs and crashes. Logs should also be a big help to modders who are trying to fix their mods.
In-game mods menu - Felipe
Ive also been working on a menu that shows all loaded mods. Its not complete yet, currently it shows you some details about the mod like its name, ID, version and priority:
(The artifacts you see in the details panel are just some Unity Editor shenanigans)
Logic Maker progress - Felipe
Ive also been progressing on Logic Maker, the tool you will be able to use when working on your own mods. Ive decided to drop the GUI option (at least for 1.0 release), since I think it wont be necessary as the CLI app is very easy to use. I spent a while looking for a library for parsing command line arguments, but none managed to quite convince me. The closest one was Fluent Command Line Parser, however it still doesnt fully support subcommands (like [code single]git fetch -a, for example). This is the reason I am developing Yaclip (Yet Another Command LIne Parser), a library for parsing arguments with a completely fluent interface. Its also able to automatically generate pretty help messages, this is Logic Makers help message (so far):
Currently, Logic Maker allows you to create new mod projects from templates that you will be able to provide, as well as a default template that allows you to configure what you want and dont want to include in the mod. Youll also be able to add new components to your existing mod, although this will probably be overkill for simple components.
Editable Display Configurations - Jimmy
Building on last weeks work on Global Display Configurations, this week Ive added some fancy menus for editing those configurations! [previewyoutube=7fZ8kq5JGcE;full][/previewyoutube] --------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Logic Worlds Release Delayed again.
[previewyoutube=MiOyHekWejA;full][/previewyoutube] I felt it was appropriate to make a video about this rather than just writing a blog post. This is a major bummer, but its whats necessary for the game.
Amazing New Displays - Jimmy
Ive been working on an overhaul of Displays, to make them faster and easier to use. Its not quite done yet, but I wanted to show it off in a video anyways. [previewyoutube=eXonfiKGxoM;full][/previewyoutube] These new displays use the Extra Data system I described last week, and indeed they are the main reason for that system existing.
Cloud metrics - Felipe
This week Ive been working on adding some metrics to our cloud architecture. Metrics is a generic word for anything that gives us information, which in our case is a set of applications. First we have Traefik, which is the application that you connect to when you go to logicworld.net and that routes your connection to the back-end services. Traefik can produce some metrics, which Prometheus collects. Prometheus can be considered as sort of a metrics database, which stores the data it collects from the various sources and allows you to query it. Finally, we have Grafana, which is the front-end for all of this and allows us to create cool dashboards like these:
Im also working on adding metrics tailored to the site itself, like comment count, post count, etc.
Extensible Menu Settings - Jimmy
Many menus in Logic World have a popup window to edit menu settings; you can see it in this recent video. Previously, all menus only had one setting, the scale slider, and the menu settings system was tightly coupled to the menu resizing system. This week Ive overhauled Menu Settings so that theyre more independent and open to extension. Any menu can add custom settings now. Currently Menu Settings still arent being used for anything besides the Scale sliders, but I have plans for a few custom menu settings. Youll likely see those next week :) --------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
And So We Danced - Markku
Hello everyone, I'm glad to be back for another LWW music update. I hope you enjoy this OST sample and that it finds you in good health. This piece is called 'And So We Danced'. Talk to you all again soon! [previewyoutube=rCpTQbp94SE;full][/previewyoutube]
Sandbox Menus & World Types - Jimmy
Ive finally added a big missing feature: menus to create sandboxes and load your existing sandboxes! Each sandbox has a description box where you can write notes about it, and you can organize your sandboxes by tagging them. Additionally, when you create a sandbox, you now have the ability to choose its world type, and to edit settings about that world type. [previewyoutube=Ecn3CUqHmGw;full][/previewyoutube]
New Epic Website - Felipe
As I mentioned on a previous LWW, Ive been working on redesigning all the cloud infrastructure, including the main site. The current Logic World website is a Single-Page Application or SPA. This means that the site exists only on a single page, and the contents are updated using JavaScript. The new site, however, is being built to use JS as little as possible, and the entire site is guaranteed to work even when disabling JavaScript on your browser. If you do disable JS, you will only lose some QoL features, but the site will still be 100% usable. You can try out the work-in-progress new site at https://logic.world/. Please let me know what you like and dont like about it :)
LogicScript: Ludicrous Speed - Felipe
As I was adding features to LogicScript, its performance kept going down. Previously LogicScript was an interpreted language, meaning that scripts didnt get compiled beforehand and were instead parsed and run. This has a high performance overhead, since we need C# code thats reading the script and executing the instructions. For this reason, this week Ive been working on making LogicScript code compile to CIL, which is the same kind of code C# runs as after being compiled. This means that when you load a script it first gets compiled in-memory, and when it gets run it is much, much faster (about 30 times so!).
Extra Data - Jimmy
This week Ive added a very fancy and versatile system to Logic World, which I call Extra Data. Extra Data is a set of arbitrarily-typed data that is stored with each save file. Currently it is used to store world settings -- see above -- and I'm working on a few more exciting applications for it. Extra Data is easy to use from code, but under the hood its enormously complex. Anybody connected to the server, as well as code running on the server itself, can update the Extra Data. When this happens, it has to be synchronized between all of the connected clients, as well as the servers master copy saved to disk. The primary source of complexity is the fact that the data can be of any type: the system has to work for numbers, text, colors, lists of lists of six-dimensional vectors -- whatever you throw at it, Extra Data can handle it. Extra Data is stored on disk as SUCC, so its all very nicely formatted and easy to edit if youre the kind of person to muck about with save files. Extra Data is fully accessible to mods. This system was far more difficult to program than I anticipated. I initially budgeted six hours, but it ended up taking three very long and stressful days. This is the cause of this weeks record-settingly-late Wednesday. Sorry about that --------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Background Blur - Jimmy
I like my menu backgrounds how I like my coffee: dark, blurry, and with four or five different settings to configure how they look. [previewyoutube=SgKcL3T6FOE;full][/previewyoutube]
More Menu Updates - Jimmy
Ive completed my quest to update all of Logic Worlds user interface! This week I tacked some more complicated menus compared to last weeks updates. You can click on each of these images to view them in 4k.
When I updated the console, I fixed a longstanding and very annoying issue with resizing it. Resizing the console is now very satisfying: [previewyoutube=AmvuJKYUh50;full][/previewyoutube] I am happy to announce that 100% of Logic Worlds UI now meets my standards for quality and usability. In my opinion, these last few weeks have seen the UI go from passable to pretty good. I am pleased. All of the code and assets used to make the games menus are part of a package called LogicUI, which we will release for free sometime after Logic World launches. Weve spent a lot of time and effort developing these systems, and we hope theyll help others make great UI for other games. --------------------------------------------- Bit of a short update this week, but weve got some exciting things cooking for you. Stay tuned for a very awesome next Wednesday! We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Socket Shenanigans - Jimmy
Recently I added Sockets to Logic World. This week Ive improved their logic for connection detection, and Ive started experimenting with bigger socket sizes. [previewyoutube=DhmtM7Z0sj4;full][/previewyoutube] As shown in the video, Sockets can now detect whether two world-space squares, both with arbitrary rotations, are overlapping. This is the hardest math Ive had to use in a while, and Im very happy I got it to work so well :)
Modding Documentation - Felipe
This week Ive worked more on the modding documentation, and its now public at docs.logicworld.net!
The docs arent finished yet, but they do have a Getting started tutorial to give you an idea of how mods will work, as well as all the reference documentation for the LogicAPI assemblies, which mod code will use to interact with the game. Right now the docs only briefly mention C# scripting, and in the coming days I want to write some tutorials and other reference documentation about the different systems that make up Logic World.
UI Themes - Jimmy
A little over a year ago, I showed you a system for switching the palette of colors Logic World uses in its menus. This system exists by necessity; we need an easy way to ensure all of the menu elements use the same color, and that same ability lets us switch those colors whenever we want. This week Ive finally added the in-game option for switching the UI theme! Now, you can customize the menus to look however you want. [previewyoutube=s0OZCcQNzn8;full][/previewyoutube] Themes are stored in simple text files like this, and mods can easily add custom themes.
Menu Redesigns - Jimmy
Ive continued my work from last week in redesigning game menus. Some of these old designs were over a year old, and Ive learned a lot in that time about UI design and programming. It's been very satisfying to apply that knowledge and bring old work up to my new standard. You can click on each of these images to view them in 4k.
--------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
This blog was originally posted last week, but I forgot to post it here on Steam. This week's Logic World Wednesday will be coming tomorrow, on Thursday.
Travelers Peak - Markku
Hello everyone. This week's piece is called 'Traveler's Peak'. It is one of my favourites so far in this soundtrack. I look forward to chatting with you all on Discord, and I hope you enjoy my piece. [previewyoutube=17YJoAuT9_c;full][/previewyoutube]
Sexy sexy menus - Jimmy
Ive spent most of this week working on Logic Worlds UI. Since I started designing it over a year ago, Ive learned a ton about UI programming and design, and Im now going over all the existing UI to apply those lessons. Logic Worlds UI is now better-looking and easier to use. Its also, in general, much smaller. One of my major mistakes early on was designing the UI in a non-fullscreen environment, which meant that once it was expanded to fullscreen, it was much too big. One particularly delightful upgrade is the new Edit Component menus. They can now be moved and resized just like windows in your operating system. [previewyoutube=Z0Abnjcjzr4;full][/previewyoutube]
Web Services Overhaul - Felipe
Ive started rewriting our cloud architecture, getting rid of the main and bulky web service and migrating to a completely microservice oriented architecture using Go, Micro and Kubernetes. Were also using DigitalOceans managed Kubernetes service for this, which abstracts away the concept of individual machines for the most part. This means that our services will be able to automatically scale up and down depending on our needs. Ive decided to do this rewrite because right now we have a single monolithic service (the one that serves the logicworld.net page), which is hard to scale since its got a lot of functionality. The switch to Kubernetes from Docker Swarm also means using a newer technology thats been built from the ground up to support the microservice architecture, and while its a lot harder to learn at first, its also a lot more powerful and flexible.
Modding Updates & Documentation - Felipe
This week Ive been working on making the game files themselves a mod. This helps us ensure that the mechanisms we use for loading mods work properly and have all the required functionality. Ive also been improving the modding documentation, Im in the process of documenting all the SUCC files that mods can have. This includes files to add components, settings, instruments, game translations and more. Well be releasing modding documentation as soon as its ready, but Im not yet sure when that will be.
Beam Me In A Given Arbitrary Direction, Bobby - Jimmy
Last week I added teleports to Logic World. Once our beta testers got to try the feature, they told me they wanted a more fluid and simple way to teleport, one which doesnt require someone to manually type in coordinates. This week Ive added just such a teleport, which takes you to whichever point youre looking at. [previewyoutube=vVkXW42TK0g;full][/previewyoutube] --------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
This week we have made the unfortunate decision to postpone the release of Logic World again. The new, and with any luck final, launch day is June 12. Read more in the official announcement.
Player Positions - Jimmy
This week I finally added a big missing feature to Logic World: when you exit a world and then enter it again, you will now be in the same location you were when you left. This also extends to other player position values like the direction youre looking in, whether youre crouching, and whether youre flying. Each player now has their own file within a world folder where their data is saved. This opens the door to persisting more player values, such as which items you have on your hotbar. I also added save-dependent world spawn points, which is the location a player will be in the first time they join a world. Finally, I added commands for teleporting players to different positions. I couldnt resist the opportunity to do something fun with that... [previewyoutube=zRsy3D2ne3E;full][/previewyoutube] Ive open sourced one of the tools I used to make the teleport effect.
Build pipeline - Felipe
This week Ive been working on finally finishing the build pipeline, it can now successfully build the Unity game and publish it to Steam!
Fun Spinny Triangle - Jimmy
By popular request last week, I added a setting to choose the open state of the Quick Color Chooser. This new setting was all by itself in the Color Choosing settings heading, and I decided it needed a friend. Enter Fun Spinny Triangle, the best setting ever added to Logic World. [previewyoutube=UNcJzYnmPvI;full][/previewyoutube] --------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
The Socket - Jimmy
This week Ive added one of the coolest new components yet: The Socket. Sockets let you build modularly, with data interfaces and plugs. [previewyoutube=x7Exruogc3g;full][/previewyoutube]
LogicScript components with hot reloading - Felipe
This week Ive been working on LogicScript, our custom language for programming component behavior. Ive created a wiki where you can find the syntax reference as well as some code snippets. One of the neatest things about LogicScript is that it can be hot-reloaded while the server is running, and Ive made a video to demonstrate this. [previewyoutube=Vf-ftZUrnzc;full][/previewyoutube]
Popups - Jimmy
Ive spent most of this week working on Logic Worlds UI code, which has been badly in need of attention. There are many small fixes and improvements, but one of the niftiest new features is the Popups system. Popups allow us to take an element of the user interface and pop it into the foreground. Other UI is darkened, to make the popped UI stand out, and clicking outside of the popped UI closes it.
Making the popups system was surprisingly difficult and intricate. Here are just a few of the things I had to worry about while programming it:
- If a popup starts off-screen, it must be moved on-screen
- If a popup is taller or wider than the screen, it must be compressed to a size where it can be viewed in its entirety, and a scrollbar must be added to it
- If a menu closes while it has a popup open, that popup must close as well
- If the screen resolution changes while a popup is open, the popup must resize itself appropriately
Quick Colors - Jimmy
This week Ive had something of a shift in philosophy with regards to how players choose colors. If youve been following Logic World for a while, you know that Ive spent a lot of time and energy making the color picker a powerful tool. Indeed, Ive succeeded in that; Logic Worlds color picker is the most fleshed-out of any video game I know of. But my pride in my color picker has made me lose focus on how people will actually be using it. When you go to change the color of something, you almost never want to bother with a huge complex interface for choosing from 16 million different colors. Usually youll just want to choose between the same 5-10 colors that you use everywhere else -- your builds aren't a hodgepodge rainbow of random colors, they use a specific and limited palette. With this in mind, Ive designed a massively streamlined color picker UI. It lets you choose colors in the way I described above, but it still gives you powerful control over the colors for the occasions when you need it. For the first time since I started working on the color picker, ten months ago I am 100% satisfied with how you change the color of things in Logic World. [previewyoutube=tgFdTIwcF4s;full][/previewyoutube]
New Build Pipeline - Felipe
Ive also been working on remaking our build pipeline. Previously we were using Semaphore for building and uploading the game, but we were running into issues with Unity license activation, since each build was performed on a different machine. This is the main reason we switched to hosting our own build server, since this way we could install and activate Unity with a GUI, making things much easier. The server is currently hosted on DigitalOcean, and its running a Jenkins instance.
The new system should be finished and deploying builds within a day or two. Hopefully, this is the end of our build pipeline woes.
One Year of Logic World
As of last Saturday, its been one year since we announced Logic World. Its been a crazy and amazing year making this game for you. We both feel extremely lucky to be doing this, and to have a community as supportive and passionate as you. Thank you. Heres to many more years of Logic World :) Not coincidentally, it has also been one year since Bobby entered the world and our hearts. @Red_3D finished their amazing animation in celebration. Please enjoy this incredibly high-effort Logic World fan video! [previewyoutube=zxtcLOU4lqA;full][/previewyoutube] --------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
A New Pursuit - Markku
Happy Wednesday everyone! This week I'm glad to share a sample of my piece called 'A New Pursuit'. It is somewhat of a departure from the musical style that I've adhered to over the past few weeks but it still maintains a few key musical elements that unify each piece. I hope you enjoy this piece as much as I did making it. [previewyoutube=dkmG5KKaF1Q;full][/previewyoutube]
Smooth Grids - Jimmy
Last week I made the world grid extend into the horizon. The astute reader will notice that I also changed the world grid from a checkerboard pattern to a solid color. I did this to hide some visual artifacts that were newly noticeable with the extended horizon. The cause of these artifacts is somewhat complex, and has to do with how computer screens are made of a finite number of pixels. When the renderer looks at the grid, it has to decide what color each pixel is. With the colored grid, the color of a pixel can be one of the two grid colors. The problems arise when grid cells are very distant, and so appear small on the screen -- smaller than a pixel. When a pixel encompasses multiple cells of different colors, it only samples the color of one cell; thus, information about how the grid is supposed to look is lost and distorted. The solution is to slowly bleed the colors of the cells into each other over distance. The smaller a cell appears on-screen, the less you render it as its appropriate color; gradually, you transition from two binary colors to a single color which is the average of the two. This week I implemented this solution, and checkerboard worlds now look good from all angles!
Modding System Fun - Felipe
This week Ive been working on an overhaul of Logic Worlds modding system. Up until now, mods contained C# code that had previously been compiled into a DLL file. However, this means that our cloud system would have to compile mods when the user uploaded them, putting quite a bit of strain on our servers. In the new system Im working on, mods will now instead contain the code in .csx files, which are C# script files. When the client/server loads a mod, it will now automatically compile the mods raw source code in-memory and run it, removing the need for any DLL files. All Logic World mods are now distributed as source code; its impossible to hide malicious things in mod code, and its a built-in feature that you can easily modify and learn from the source code of mods you download. Mods will now also be able to contain LogicScript files (.lsx) to use when defining logic components. I talked about this more in last weeks Wednesday.
The Oracle - Jimmy
This week Ive added a highly requested component to Logic World: Oracles, which generate a random value when powered. [previewyoutube=wXyCWFR0gv4;full][/previewyoutube] I struggled for a while with whether to add these or not. It is possible, and very interesting, to build circuits which generate pseudorandom numbers. I worried that adding a component to generate random values would take away the need for that. I worried that fun and interesting gameplay would be eliminated. Ultimately, however, Ive decided that Oracles open more doors than they close. Besides, pseudorandom circuitry isnt 100% obsolete; you still need it if you want your sequence of random values to be deterministic.
Bobbys Birthday is this Friday!
Bobby, Logic Worlds beloved protagonist and mascot, will turn one year old this Friday, April 10th. As we mentioned a few weeks ago, the lovely and talented @Red_3D is working on a celebratory short film to mark the occasion.
So, get excited for that, friends! Join us in the Logic World Discord this Friday to celebrate Bobbys birthday and to watch the premier of the film. --------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
New Horizons - Jimmy
I wrote some fancy code that lets us extend the world super far into the distance. The horizon looks much better now, and it no longer gets closer when you move closer to it. [previewyoutube=8tSXiUXTHhY;full][/previewyoutube]
Logic Scripting - Felipe
Mods in Logic World are mainly made in C#, including the code behind custom components logic. However, it can be a bit overkill having to compile an entire C# library for making a single NAND component, not to mention insecure as C# code can do pretty much anything. This is the reason I came up with LogicScript, a domain-specific language built for programming pure logic components, like logic gates, memory cells, etc. Heres a snippet showing off the languages current features:
when in = 1010
# Set individual output bits
out[0] = 1
out[2] = 0
out[1] = in[2]
# Set all the output bits
out = 1010
out = 14' #The ' denotes that it's a decimal number instead of a binary one
end
# Other example case statements:
# when in = (1, 0, in[1], 1)
# when in = 12'
# when (in[0], in[1]) = 10
# when (in[2], in[1]) = 3'
I also plan on adding binary operators and some kind of memory registers for storing numbers.
The library as-is can execute the above script in 0.0003 ms, thus it can run 3,333,333 times per second. This means that, while it probably wont be as fast as hard-coded C#, its still pretty damn fast. Even then, I still have a lot to do to optimize it, so that number will probably go up.
LogicScript will make it easy and fast to add new logic components, and it will make for more trustworthy mods, as theres no way for LogicScript code to install a virus on your computer. Well still support C# logic components if you need to do something really crazy -- LogicScript isnt a replacement, its an additional option.
AND, AND, and AND- Jimmy
This week I added two new AND gates to Logic World. [previewyoutube=ePVDzZw8Mgc;full][/previewyoutube] Thanks to our beta testers for noticing this gap in logic capabilities. Anti-thanks for the serpentine creatures for interrupting production on that video several times. I also modified the logic code for AND gates to support any number of inputs. This makes it super easy to mod in AND gates with even more inputs. --------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Instrument Sounds - Jimmy
My main project this week has been an overhaul of the code and assets we use to generate music sounds in Logic World. [previewyoutube=TCDRAnZxDuw;full][/previewyoutube] This was exactly what I needed after a month of working almost exclusively on boring stuff. I've had a really fun week, learning about audio synthesis and trying out different instrument sounds. I feel more motivated than ever to work on Logic World and to get it out into your hands. Audio synthesis is a very complex subject, and I had a lot of help working on it this week. A huge thank you to Drogomir Smolken and the awesome SFZ community for maintaining a fantastic open standard and for being super friendly and helpful to noobs like myself. Thank you also to Sam Gossner from Versilian Studios for recording high quality instrument samples and generously releasing them for free. Finally, thanks to my dad, who helped me with some of the more difficult math :)
Settings Profiles - Jimmy
Weve had UI for ages for switching your settings profile. This week, I finally made that UI functional.
Each settings profile is an independent list of settings. When you edit your settings on profile 2, your settings on profile 1 are unaffected.
Unexciting Things - Felipe
This week Ive kept working on some unexciting things, namely optimizing SECCS (it can now serialize and deserialize around 10-20 times faster) and dealing with the cloud builds situation. For the last week or so the cloud builds have been failing due to Unity not correctly activating its license. Weve contacted Unity support and hopefully well have a solution for it soon.
Bobbys Birthday
Bobby, Logic Worlds beloved protagonist and mascot, will turn one year old on April 10th. The lovely and talented @Red_3D is working on a celebratory short film to mark the occasion, and it is looking very very awesome.
Red is posting daily updates on the project to their blog, which you should definitely go read right now!! --------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
The world flounders, but a beacon of stability shines brightly through the fog of panic and pandemic. That beacon is Logic World Wednesdays: ever on time, ever organized, ever punctilious. We are here for you when you need something dependable in your life.
Settings Menu Polish - Jimmy
This week Ive made a number of improvements to the settings menu. [previewyoutube=w-HrTYwndhE;full][/previewyoutube] The machine in that video was built by the lovely @woox2k :)
Tracker Improvements - Felipe
This week Ive been working on improving the tracker website that the beta testers are currently using for reporting bugs and other feedback. Firstly, this week Ive beautified the main page. You can now see each tickets creation date, type, status and ID.
Ive also added another property to tickets: its priority. It ranges from 0 to 5, from least to most important.
Thanks to these changes, its much easier for us to manage a large number of tickets. We can easily see what needs addressing.
More SECCS - Felipe
Last week I told you I was working on a rewrite of SECCS, our library for converterting arbitrary C# data into binary and back. This week Ive continued this work and integrated the new SECCS into Logic World. Its now correctly reading and writing all the packets, while also being much cleaner and easier to maintain! The next step is making it fast, since up to this point Ive been focusing on readability over speed.
Robust Initialization - Jimmy
When Logic World connects to a server, there is a process of initialization wherein the connection is verified and established. Previously this process was very haphazard and error-prone; there were a number of cases where the initialization process would not complete properly and youd get stuck on an infinite loading screen when you tried to connect. This week I worked out and implemented a robust and reliable protocol for initialization. Its a careful back-and-forth with verification at every step. It looks like this: [olist]
Welcome back to another Logic World Wednesday! Its been a busy week for Mouse Hat Games and weve got a lot to talk about. But first! This week the Youtube algorithm blessed us with an auto-generated channel for Logic World. Check it out here, and be sure to subscribe. All future LW videos will be found there -- videos from us, from beta testers, and from anyone after May 1st who makes a LW video.
VLOG - Jimmy and Markku
We met up this weekend to hash out some details about the soundtrack, and we made a vlog! [previewyoutube=UPuEffzhorA;full][/previewyoutube]
A New Wave - Markku
Happy Wednesday everyone! This week I'm happy to share the full version of my piece heard in the vlog above. I hope you enjoy. [previewyoutube=D6wGufLYfE0;full][/previewyoutube]
Player Presence - Jimmy
I was sick of making responsible use of my time, so this week I made it so you can see your reflection in other players when they have SHINY BOBBY enabled.
Now that we were rendering your own player model, I was also able to let you see your own shadow.
But honestly this feels pretty weird. The shadow is a solid and unmoving circle, which we humans are very not used to seeing as our shadow. So I made it an optional setting, which is turned off by default.
Faster load times - Felipe
Some beta testers were reporting some ridiculously long loading times when connecting to a server. We presumed this was a SECCS performance issue. SECCS is my open source library for converting arbitrary C# data into binary and back. We use it for serializing and deserializing all the network packets, so when it was taking a long time to send a packet SECCS was the obvious culprit. So I set on to investigate. Using a profiling tool for .NET I was able to find out the culprit for this, which to my surprise was the System.Array.Resize method. It turns out that Lidgren -- our networking library -- was allocating a buffer smaller than some big packets size, so every time some data was written to it it would have to expand, calling the method I mentioned. This lead to a lot of memory and CPU usage, as the runtime had to create a new array and then copy the contents over from the old one every time it resized. I solved this by introducing a mechanism for approximately calculating an objects size and creating a buffer big enough to fit it, reducing these resizings to 0. As a result, load times for saves have been enormously improved. In some cases this is as high as a factor of 10.
SECCS Rewrite - Felipe
While investigating the performance issue above I realized that the SECCS codebase has become a nightmare of Expressions and unreadable code, so I set out to completely rewrite it, this time with a clear goal of what the library should do and what it should look like. Plus, this time Im focusing on writing tests for everything, so changes shouldnt break anything. This is pretty satisfying to see:
Color Accuracy - Jimmy
Before this week, the lighting of the scene had a BIG effect on the color of objects. You would choose a color, and the object would be a completely different color from the one you chose.
This has been bothering me, and this week I set about fixing it. I did some fancy graphics things and now colors are much more accurate.
Networking Abstractions - Felipe
This week Ive also been working on abstracting the network system we use for communicating between the client and the server. This means that the game wont tightly depend on Lidgren for networking, so mods will be able to plug in their own systems to either expand or completely replace the original system. For example, a mod could create a system on top of the existing one that encrypts the packets, or another system that uses a method for transporting packets which offers less latency at the expense of dropping packets. You could even use carrier pigeons if you wanted to! We will use this abstraction in the integrated server, where we will be communicating between the client and the server using named pipes instead of UDP Lidgren connections. Named pipes are streams of data that two or more processes can attach to, sending and receiving data to and from other processes. This method has less overhead than a full UDP connection, which will allow the game to use less resources.
Analytics - Felipe
In recent weeks weve been getting a LOT of visits to logicworld.net. You can see this for yourself at https://status.logicworld.net/. In order to better understand why this is happening and how we can encourage it, this week Ive been working on some internal analytics tools. I added a service that reads Traefik (our edge proxy)s logs and registers every request to a MongoDB database. MongoDB is a very flexible NoSQL DBMS oriented towards big data that allows us to execute some powerful queries. For example, we can take out the number of requests per referrer domain:
This flexibility will allow us to investigate traffic spikes and correlate them with other events. For transparency, we are now collecting the following data about your visits to logicworld.net:
This data is purely for our own use in helping us grow Logic World. We will never give or sell your data to a third party.
Save Converters - Jimmy
This week we had to make some changes to the file format Logic World uses for saved worlds and boards. Our testers were very understanding towards the prospect of their saves breaking, but I wanted to avoid that, and I knew we were going to have more changes to the format in the future. So I took the time to add support for converters from one save format to another. The update with the new save format shipped with a converter from the old format, and no saves were broken. In the future, it will be extremely easy for us to add a converter for new save format versions.
Server-side component data - Jimmy
This section is long and technical, so if thats not your jam feel free to skip it. TLDR: I made the game faster. Still reading? Okay, buckle up. Many component types in Logic World have custom data associated with them. Displays store their colors, Mounts store their height, Keys store what key theyre bound to, et cetera. For managing this custom data, we have a clever system where we supply a list of custom data types and the game automatically handles all the annoying bits where that data is turned into binary and synchronized between the server and all connected clients. This system is easy to use, but unfortunately it is not terribly speedy. We were running into problems using it with Delayers. Most components only change their custom data rarely, when a player opens the menu to edit them. But Delayers custom data changes every simulation tick, because they are constantly counting how long they have been powered or unpowered for. Because of this, not only were Delayers far more CPU-heavy than necessary, but they were also flooding connected clients with data updates. Clients dont need to know how long a delayer has been powered for; that data is only necessary for computing the state of the simulation, which is all done server-side. So this week I set about making a technical upgrade to our custom data system. Now, server-side logic components can mark some custom data as being used purely for the simulation. For these variables, the component uses a standard C# field to store the data. Then, when the game is saved, the component serializes that field as binary. At no point is the value ever sent to the client. Thanks to these changes, Delayers are more than 10x faster and the game uses massively less bandwidth when delayers are running. This was a lot of work but I am very satisfied with the results. --------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
In case you havent already heard, this week we made the difficult decision to postpone Logic Worlds release. Were sorry about this, but weve got our heads down and were working hard to make sure the game you play on May 1st is the best it can be.
More Bug Squashing - Jimmy
I again spent most of this week squashing bugs to make sure playing Logic World is a stable, smooth experience. There are two fixes that were particularly satisfying which I would like to share with you. Firstly: chairs had been non-functional ever since I redid the player controller code in September. I fixed them up this week and made two important improvements to their functionality:
- Chairs now work properly when theyre placed at odd angles
- Your multiplayer model will now appear in chairs to other people
The next nice fix was to Mount resizing. When I added the checkmark to the resizing UI, it only worked properly for Horizontal Resizing. Mounts use Vertical Resizing, and their checkmark was broken.
I quite like the tiny new checkmark. Its cute
Tracker - Felipe
If you didnt already know, the closed beta for LW has begun. The beta is a period for reporting issues about the game, and so far this has been done in a plain Discord channel, but this has proven to be insufficient; for example, we dont have a way of marking issues as solved. For this reason I have been working on a ticket system similar to GitHubs issue system that allows our beta testers (and you too, in the future!) to report any bugs, feature requests or other feedback, which we can later resolve.
Server Docker Image - Felipe
Docker is a platform for running applications in containers, which are like virtual machines, meaning that each application gets run in its own little fake OS, isolated from the rest of the machine. These applications come in the form of images, from which containers are created. This week Ive been working on making the LW server into an image, allowing users to spin up a server with a single command, provided they have a Docker installation:
Screenshots - Jimmy
This week I made a major upgrade to our screenshot tech. Previously, we were simply capturing what was currently being displayed on the screen and saving it to a file. But I wanted something more powerful than that. Now, the game can render screenshots at any resolution. This is exciting because it means you can take very high-quality screenshots even when youre running the game in low quality. Heres an 8k screenshot I took while playing at 1080p (click for full resolution):
The build in that image is a binary multiplier made by @TheWildJarvi :D I also added 360 panoramic screenshots, which I think is pretty cool. You can see one below; click on it to view an interactable version in Google Photos.
Finally, I added the option to save your screenshots as jpg instead of png. This can massively reduce the size of the images even without sacrificing quality.
--------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
On Monday of this week, we started beta testing! A few select individuals have gotten advance access to Logic World. These folks are helping us perfect the game by finding bugs and giving feedback on features. Theyll also be building contraptions to help us with marketing the game. Beta testers have no restrictions on sharing their experiences, so from this week forward youll have a lot more Logic World content to look forward to! Check out the first CPU in Logic World, built by @Mr_IO: [previewyoutube=ZYqOWHymmT0;full][/previewyoutube] And check out this awesome synchronous program counter from @TheWildJarvi: [previewyoutube=_XH41SKf2sU;full][/previewyoutube] Beta testers are often sharing screenshots and videos on the Logic World Discord, so make sure youre hanging out there if youre not already. Furthermore, well soon be setting up Steam Broadcasting for Logic World, so keep an eye out for that. Edit: Steam Broadcasting is live! Go to the Logic World Steam Page, where our beta testers are streaming their gameplay :) Without further ado, lets get into this weeks Wednesday!
When Time Waits - Markku
Hello everyone, and happy Logic World Wednesday! I'm happy to share one of my pieces called When Time Waits with you today. It's about the ephemeral moments in our lives when time seems to stand still. I hope you enjoy this piece and look forward to hearing what you think. [previewyoutube=EXL-Bj20HB4;full][/previewyoutube]
More Displays - Jimmy
For a while, weve had Panel Displays with up to 8 pegs, but our Standing Displays only went up to 4 pegs. This week I fixed that discrepancy, and added Standing Displays with 6 and 8 pegs.
Dedicated server on Steam - Felipe
Right after we got the Logic World game uploaded to Steam, I started working on also uploading the dedicated server. This will allow you to run a dedicated server on any platform directly from Steam, or also with the SteamCMD utility.
Movement Settings - Jimmy
I added some settings that let you customize how your player moves! [previewyoutube=taJnlpA55qs;full][/previewyoutube]
Literally Hundreds of Bugs - Jimmy
In preparation for beta testing, I spent most of this week fixing bugs -- literally hundreds of them. For a while Ive had a bad habit of ignoring bugs and thinking oh, Ill get to that later. But this week I really sat down to grind out fixes; I wanted our beta testers to have the best possible experience when they played the game for the first time. Of course, when they did play the game, they immediately found hundreds more bugs. So it was back to grinding. Slowly but surely, Logic World is becoming a stable and bug-free product. With the help of our testers, I am confident that Logic World v1.0 will not be a terrible buggy mess :)
Mac OS Finished - Jimmy
Last week, I showed that Id gotten Logic World working on Mac OS. I showed a screenshot of the main menu, but there were still many issues with the game. You couldnt actually play the game; mouse input was frozen and no 3D geometry was rendered, among other issues. This week, Ive fixed them all up, and there are (probably) no longer any Mac-only bugs! Just bugs that exist on Mac and also everywhere else.
Biiiiig shoutout to my friend Keaghan, who happily lent me his macbook for a week longer than he thought he was going to :)
Unity 2019.3 - Jimmy and Felipe
This week we upgraded Logic World from Unity 2019.2 to 2019.3. We did so initially in an attempt to fix a major bug (it didnt work and we fixed it a different way), but its good anyways to be on the latest version. Performance in 2019.3 has been noticeably increased, both in the editor and in compiled games. Logic World itself is faster now, but its also faster for us to work on. There are a few more features of 2019.3 that we want to take advantage of in Logic World. You should be seeing those next week :) --------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Audio Overhaul - Jimmy
Ive worked on a number of things related to audio this week. Logic World sounds better than ever.
Output Groups
Sound effects are now divided into subcategories, and you can adjust the volume of these individually.
Music Component Spatial Audio
Singers and Drums are unlike other sound effects in the game in that the sounds are generated at runtime. Previously, their sounds would always play at full volume no matter where you were in the world relative to the component. But this week Ive figured out how to hook these generated sound effects into Unitys spatial audio system. Music Components will now play at full volume in both speakers until you are 50 meters away from them. From 50 meters until 100 meters, their volume will gradually fade to zero. Within this range, the sound will also become progressively spread; it will play more in your left speaker if the sound is coming from the left, and more from the right speaker if the sound is coming from the right. These changes really make music components feel like part of the world. The full volume range is still large enough that you can build big music contraptions that play at full volume, but theyre no longer able to teleport sound to your ears from hundreds of meters away.
Music Player
Ive been working on the code that plays the music from Markkus beautiful soundtrack. The music is streamed from disk; not only does this give you easy access to the music files if you want to play them outside of the game, but it allows mods to easily add music to the soundtrack. Ive also added an option called Music Components Stop Game Music, which is on by default. With this option on, a Singer or a Drum playing a note will cause the game music to quickly fade out if its playing. This way, your music contraptions wont be blocked out by the game music.
RSS - Felipe
Back in August of last year I was working on the posts backend for logicworld.net I decided to implement an RSS feed endpoint, however I completely forgot about it until a couple days ago, so here it is! You can, for example, get the feed for the Development Updates forum at https://logicworld.net/Forum/1/rss.xml, and this is how it looks like:
You can import this feed into services like `Feeder` to get something like this:
Cloud Build & Deploy Completed - Felipe
This week Ive finished our continuous integration system, which now also builds the server and uploads the whole game to Steam on all 3 platforms! This is how the pipeline looks now:
As you can see, the build times for the Unity project have been significantly improved since last week, thanks to caching generated Unity files that are reused between builds. And yes, the game is officially on Steam, including a separate package for the dedicated server!
Load game directly into save - Jimmy
I added some properties in settings.succ that let you load directly into a save file when the game starts, rather than having to go through the main menu.
This makes our lives easier when testing stuff, but hopefully its also a convenience to you :)
Server Features - Jimmy
This week I added a whole bunch of features to the server, most of them related to security/permissions.
Whitelist
Servers can now have a whitelist of players who are allowed to connect.
Banlist
Servers can now ban players and IP addresses from connecting.
Password Protection
Servers can now require a password to connect. Passwords are only sent over the network after being hashed with SHA-256.
Admins
Servers can now have a list of players who are admins. Admins can run commands on the server, and they will be sent the servers console output, viewable in the client debug console. When you run an integrated server for a singleplayer game, you automatically have admin permissions.
Max players per server
Servers can now have a maximum number of players connected to them. If someone tries to connect to a full server, that connection will be denied.
Pause empty servers
Servers now have an option (enabled by default) to pause the simulation when there are no players connected. Servers will also no longer save the game or make automatic backups when there are no players connected -- nobody is changing the world, so saving or backing up would be redundant.
Information Screens - Jimmy
Ive added some screens that tell the player important information about what happened to their game. First is the
error screen
, which lets the player know if theres an error on startup or while loading a save. Next is the
disconnection screen
, which lets the player know if theyve been unexpectedly disconnected from the server.
Mac OS - Jimmy
Ive been fixing up the Mac OS version of Logic World! Theres still some work left to do, but heres a picture of the game running on mac:
Shoutout to my friend Keaghan for lending me his macbook!
Linux - Felipe
I made it work on linux lol
Next week, I intend to make a bunch of VMs with different Linux distros, so that we can test on as many configurations as possible. --------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Hello and welcome back to Logic World Wednesdays! In case you missed it, this week we announced Logic Worlds release date: March 13, 2020.
Weve got a big Wednesday for you today, so lets get started!
As We Change - Markku
Hello again, everyone! Thank you for your comments on my piece Endless Curiosity. I really appreciate the feedback. Today I'm happy to share another sample from the soundtrack. This one is from As We Change, a piece about the ebb and flow of learning new things. I look forward to sharing more of the soundtrack in future Wednesdays, and I look forward to chatting with you on Discord! [previewyoutube=aBIu0EpK7Fs;full][/previewyoutube]
Actual Clouds - Jimmy
This week I have been giving some love to the skies of Logic World.
This is still very much a work in progress. Youll be seeing more gorgeous skies in future Wednesdays :)
Fake Internet Clouds - Felipe
This week Ive been working on setting up an automated CI service. This service will automatically build (and optionally publish) the game in the cloud, which is super easy and convenient for us. This is a picture of a successful build:
We are using SemaphoreCI as our CI provider. As you can see, we are currently building for Linux and Windows, with MacOS coming soon. This is an overview of the stuff that happens during a build for a single platform: [olist]
Website Error Handling - Felipe
Our website, logicworld.net, has had some issues in the past, like comments being duplicated and posts not working. More often than not the hardest part about solving these problems was identifying what parts of the site were causing the problem, which required digging into the logs to find out the exact message and stack trace. This is the main reason I decided to implement an error logging system, which will gracefully detect and notify the user about any failed requests that have been executed, as well as helping us identify the errored request through the use of a request ID.
Game Flow - Jimmy
Thanks to Felipes excellent work on the integrated server (you can read more here), this week Ive been tightening up the flow of the game between macrostates. We can now connect to an external server, then disconnect, then connect to a local server (singleplayer game). Furthermore, Ive added loading screens and an error screen -- though neither is particularly pretty right now, so Ill show those off when they are :) Ive also added the ability for you to run commands on an integrated server. Everything is now seamless; weve fully merged the client and server software into one smooth and sexy game. Of course, the standalone server software will still be available for those who want to run dedicated servers.
Hotbar Shortcuts - Jimmy
I added some hotkeys for managing your hotbar! [previewyoutube=75ORqV2vvuw;full][/previewyoutube] With these hotkeys, Im opening the selection menu less than half as much as I used to when I play the game. Once you get used to them, theyre a real time saver. --------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
We have a release date! Logic World will be in your hands on Friday, March 13, 2020.
It's been an incredible journey to get to this point, and we are absolutely pumped to polish off this game and get it into your hands. Thank you, so much, for following and supporting us along the way.
For more details, and for information on pricing, see our blog post here: https://logicworld.net/Post/113
https://store.steampowered.com/app/1054340/Logic_World/
Relays - Jimmy
This week Ive added a very cool new component, called the Relay! [previewyoutube=49UUfTuj_qQ;full][/previewyoutube] Huge thanks to @TheWildJarvi for suggesting Relays. I cant wait to see the builds they are used for.
Store Pages - Felipe
As you may know, were going to sell Logic World directly from our website in addition to our third party stores like Steam. This week Ive been working on the store page design.
Settings Menu Generation - Jimmy
Last week and The week before, I was working on the design part of the settings menu. This week, Ive given the menu functionality; the settings you tweak will now affect things in the game, and their values will be saved between sessions. Additionally, the settings menu now dynamically generates from values you set in the code. [previewyoutube=-mDwJKP7ztc;full][/previewyoutube] Getting the menu to dynamically generate, with all the different kinds of settings there are and all the different properties a setting type can have, was extraordinarily difficult. But the system works beautifully, and I am very proud of it. I plan to open source this library - LogicSettings - sometime after Logic World launches. --------------------------------------------- We'll keep releasing these weekly updates right up until the game comes out. To make sure you don't miss them, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Welcome back to another Logic World Wednesday! This week, in The Shiny Edition, were polishing up the game and getting it prepared for release. Before we begin, we have a very special announcement. Logic World is going to have a full original soundtrack, and weve found the perfect person to write it. It is our pleasure to introduce Markku Wainman, composer for Logic World!
Soundtrack - Markku
Hello, everyone! I am happy to have a chance to talk about the music I am writing and producing for Logic World with you today. Myself and the creators wanted the music to compliment the beauty of circuits doing math while helping the player to focus on and engage in the gameplay. We also concluded that the addition of live musical sources would breathe life into the synthesized instruments that are sonically emblematic of computers. I want these carefully selected instruments to help the melodies and musical textures stick with you after playing the game to remind you of Logic World and the beauty that is created in a computer. Working on creating an effective score has been a challenging and rewarding process that I feel very lucky to be a part of. I hope you enjoy my music! Markku [previewyoutube=W7ENg04RxWs;full][/previewyoutube]
Completed Integrated Server - Felipe
This week Ive been working on reimplementing the integrated server. Previously the server was being compiled targeting .NET 4.6 in order to be loaded by the Mono runtime Unity uses. However, this was less than ideal, because the server couldnt benefit from the performance upgrades .NET Core 3 brings. The server is now launched as a separate process from the game, allowing us to use the .NET Core 3.1 build. In order to communicate between the game and the server instance we redirect the stdin and stdout streams, allowing the user to send commands to the server and read its output as if it were a regular server. Doing things this way is more complicated and difficult, but this upgrade ensures that youll always have the best possible performance while playing Logic World.
SHINY BOBBY - Jimmy
SHINY BOBBY SHINY BOBBY SHINY BOBBY SHINY BOBBY
SHINY BOBBY SHINY BOBBY SHINY BOBBY
Character Customization - Jimmy
In all seriousness, this week Ive added some options for customizing your Bobby. You can now choose bobbys colors, and if you so desire, you can enable SHINY BOBBY.
Weve previously talked about including full custom multiplayer avatars. Unfortunately, there isnt time to include this for 1.0. That feature will be coming in 1.1. Until then, everybody is Bobby.
Settings Menu - Jimmy
Ive made a ton of progress on the settings menu this week!
Lets take a look at all the new things:
- When you mouse over a setting, you can see a written description of what the setting does, a visual preview of it, and how performance-intensive the setting is.
- There are now multiple profiles for settings (bottom right). When you edit the settings on one profile, all the other profiles are unaffected.
- I ran into several issues using the built-in Unity dropdowns and toggles, so I programmed my own. Every single thing you see in that screenshot is now running custom code.
- Many parts of the visual design have been tweaked and polished since last week
Lighting & Graphics - Jimmy
This week Ive been polishing the lighting setup for the game. In particular, Ive done my best to normalize the difference between light and dark; I dont want fully lit objects to be overwhelmingly bright, and I dont want objects in shadow to be so dark its hard to see them. Before:
After:
Click here for high-res images to compare: before 1, before 2, after 1, after 2. (Please excuse the wires in the after screenshots that are black when they should be red - it's a bug I forgot to fix before taking them :P) Lighting is really finnicky and difficult, especially in a game where the same lighting has to work for every situation: I don't know what you're going to build, but I need to have a lighting setup that works for the things you build. The results you see took many hours of tweaking and experimenting, but I'm feeling pretty happy with them. --------------------------------------------- We'll be announcing Logic World's release date very soon, so stay tuned. To do so, you can sign up for our newsletter or join the official Discord, and of course you can wishlist and follow the game right here on Steam. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Pick Up Component - Jimmy
Pick Up Component is a new building mechanic Ive added to Logic World this week. It lets you pick up a full component, including any data youve edited on it. [previewyoutube=L9QjLng95UI;full][/previewyoutube] Pick Up Component is the second last building mechanic planned for Logic World 1.0. Just one more to program, and then the building is done!
Settings Menu - Jimmy
Ive been working on Logic Worlds settings menu. I think Ive got a pretty good design for it.
Let us know in the comments what settings *youd* like to see in Logic World.
Sexy Notifications - Felipe
The notifications system on logicworld.net has been very unstable since I put it together, as I didnt put much thought into it. This has now changed. Ive rebuilt the system altogether and now its much more robust and pretty.
If youre logged in, you can check out the new notifications page at https://logicworld.net/Notifications. Make sure to leave lots of replies to each other today so you can properly experience it ;)
Open Source Shenanigans - Jimmy
This week Ive been working on a few of the open source libraries were developing for Logic World. These are chunks of code that were releasing for free, for anybody to study or use or even contribute to. Firstly, I've made a number of improvements to SUCC, the tool Logic World uses to save and load data in configuration files. SUCC can now save and load null - that is, no object - and its better at figuring out what value to load if it doesnt find that data in a file.[/size] Next, I developed an extension for SUCC called InterSUCC. InterSUCC allows you to treat SUCC data files as objects with properties, rather than requiring you to input text to use as data keys. InterSUCC also contains a nifty feature called ConfigWithOverride. ConfigWithOverride allows you to have a master config file, but have some parts of that file overridden by a particular additional file. In Logic World, we use this to give you per-world settings. For instance, the game has a global setting for simulation speed, but you can change the speed for just one world by editing that worlds config_override.succ.[/size] Finally, I updated Jimmys Unity Utilities with all the goodies weve added to it in Logic Worlds JUU copy. It now has extended support for color names (used in Logic Worlds color picker), tools for saving and loading images to disk (used for saved board thumbnails and for the flags in LWs languages menu), a precise timing class (used to animate Logic Worlds intro), a utility for setting the contents of the system clipboard (used in Logic World to copy console messages), and more.[/size] While I was at it, I also made a small library called PersistentData. PersistentData isnt something that will be used in LW, but Ive been meaning to make it for a while and Ill definitely be using it in other future projects.[/size]
BobbyBot - Felipe
This week Ive written a bot for the Logic World Discord Server. His name is Bobby Bot, and he posts updates from logicworld.net to the discord. Right now, he sends a message for each new post in the forum. When Logic World releases, Bobby will send a message for each new WorkItem you upload to logicworld.net: boards, worlds, mods, ect.
Bobby will also help us out by posting our biweekly discussion topics: Philosophy Phridays and Miscellaneous Mondays. Never again will these be late! Look out for our first Bobby-posted topic this Phriday at 18:00 UTC. --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Resizable Components Polish - Jimmy
As part of my ongoing efforts to make Logic Worlds building mechanics as fluid and easy-to-use as I can, this week Ive been polishing up the mechanics for building with resizable components. You can now directly start resizing something while youre placing it, and Ive added a new Drawing mechanic for building with boards. [previewyoutube=JstrNEQ4pFY;full][/previewyoutube] Ive also polished up the look of the resizing UI: theres a snazzy checkmark in the center that you can click to confirm the new size, and all the UI elements now change color when you mouse over them, to communicate that they can be clicked on.
Outline Tech Upgrade - Jimmy
When I was working on the new Resizable Components UI, I ran into a limitation of our outline tech that was preventing the checkmark outline from showing up.
The problem was that all of the outlined objects were being outlined together as one pass. This image explains what that means better than my words did:
Since the checkmark outline was nested inside the outline of the component being resized, it couldnt show up; the checkmark edges were not part of the edges of all the objects. This has been a limitation of our outline system for a long time, and this week I finally set about fixing it. The outline system now supports multiple independent layers of outlines, where each layer can overlap with the others.
With these new outline layers, I can now draw the checkmark outline, and you can see it in action in the video above. I also added one outline layer that has depth culling enabled. This means that only the visible parts of the objects get outlined. The depth culling layer is being used for the outlines of interactable objects, and drastically improves their look.
Finally, I added some options to the outline rendering for folks to tweak to their preference. You can now adjust the outline thickness, the outline fill amount, and the outline intensity.
Spinny Compass - Jimmy
After I showed off the Compass last week, many of you suggested that it should rotate as the player does. After playing around with it some more, Ive come to agree, and so the compass now always points in the direction of rotation. You can see this in action in the video above.
Status - Felipe
This week Ive been working on a status page for all the services that make up logicworld.net. A service is a little piece of software (in our case mostly written in Go) that is responsible for a task, like sending emails to users or building mods. This status page is made using Cachet, which allows us to notify you about maintenance ahead of time and it lets you see the status of every service as well as a real-time graph of visits to logicworld.net.
You can check out the status page at https://status.logicworld.net/. --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Welcome back to another Logic World Wednesday! Were back from the holidays, and the push for release is underway.
Checkerboard World - Jimmy
The world youve been seeing in the LWW videos has been sort of a placeholder. The ground was completely static, with no customization whatsoever. This week Ive begun an overhaul of the world, starting with a lovely ground shader. The shader supports custom colors, as well as dual-color checkerboard patterns.
When you create a world with a grid ground, youll be able to choose the color or colors used and the grid size. Its worth noting that Logic World will support several different world types, and mods will have the ability to add world types. But thats a topic for a future LWW :)
Modding API Consolidation & Documentation - Felipe
Over the holidays Ive been working on documenting the Logic World mod API, known as LogicAPI. This documentation is done with XML comments in C#. When coding mods, Visual Studio will show what each method and class does while youre typing. We are also going to upload a generated static site containing all of the documentation over at docs.logicworld.net. This is a preview of how it will look:
This site is generated by DocFX, and it will contain all the aforementioned code documentation as well as some concrete concepts that may require explaining. We are also going to have a wiki at wiki.logicworld.net, which will contain broader modding guides and tutorials, as well as some other non-modding related info.
Tons of cloud stuff - Felipe
I have also been doing a big revamp of our cloud architecture:
- We have migrated from having a single server to having two: Phobos and Deimos.
- Migrated from a monolithic architecture to a microservices one, which means that we now have a small service for tasks like emailing, logging, storage, etc.
- Migrated from regular Docker to Docker Swarm, allowing us to deploy these services very easily and scale them up by changing a single number in the configuration file. This will let us easily scale up the server to meet the demand if we find the need to do so.
- Migrated from Caddy to Traefik as our edge proxy.
Refined Building Mechanics - Jimmy
Ive done a pass of our basic building mechanics to ensure they are consistent, intuitive, and easy to use. Most notably, Ive removed the Rotation Lock mechanic; the lock is now always on. Rotation Lock was sort of an awkward and unintuitive mechanic. It was sort of a holdover from when I was trying to copy Minecrafts building mechanics, back in 2017. But Logic World has grown up a lot since then. To help communicate the new objective nature of rotation, Ive added a little compass rose to the UI with a pointer for the object placement rotation direction.
Notice the pointer above the hotbar on the left. As the inverter being placed rotates, so does the pointer. --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
(this blog was originally posted 2019-12-18) Welcome back to another Logic World Wednesday! This is our last post before the holidays, and weve got some real goodies for you this week.
Draggable Colors and More - Jimmy
Logic Worlds color picker is something I keep coming back to and tweaking, but this week I think Ive finally settled on its final form. Ive shifted the menu elements around so that the HSV wheel is bigger, and Ive packed the sliders together more closely to save space. Ive also removed the ability to hide blocks of sliders; dynamically resizing the menu was causing some issues, and I literally never used the option anyway. Ive also added a number of new features to the color picker, including the much-requested draggable saved colors. You can see them all in this video: [previewyoutube=9GoQYYBJ8xg;full][/previewyoutube]
Mod Hooking - Felipe
This week Ive been working on the hooks system for mods. Hooks provide a way for mods to listen to game events, like placing a component or a wire, and optionally cancel it or modify it. Right now hooks are implemented through handler classes, which are abstract classes that contain a virtual method for each hook. Mods can then make classes that inherit a specific handler class and then implement any hook methods that they want. This is an example of how a mods handler class may look like:
public class MyHandler : WorldHookHandler
{
private int Counter;
public override void OnPlacingComponent(PlacingComponentEventArgs args)
{
bool cancel = Counter++ % 2 == 0;
if (cancel)
args.Cancel();
LConsole.WriteLine($"A user is placing a component of type {args.ComponentType.TextID}, cancel: {cancel}");
}
}
This hook would stop the player from placing a component every second time they tried to. Handy for annoying your friends.
Player Identification - Felipe
Up until now players in the server were identified only by a username they choose. While this works fine, if someone was to connect with the same username as you they would be able to impersonate you. Now players are instead identified by their logicworld.net user ID, which is unique to your account. You can sign in to the game with your logicworld.net account, and in the Steam version, youll be automatically logged in to logicworld.net with Steam. Servers will also have the option to turn on offline mode, reverting back to the username identification system. This is useful in case logicworld.net goes down, as an offline server doesnt need to verify the players identities.
Yet More Unexciting Code Work - Jimmy
Last week I spoke of two very cool features I was working on, and Ive continued that work this week. Unfortunately, I didnt finish in time for LWW, but most of the architectural groundwork is now laid. --------------------------------------------- Thanks for reading! Were going to take a two week break over the holidays, during which time we intend to start beta testing. Logic World Wednesdays returns January 8.
If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
(this blog was originally posted 2019-12-12)
Better Saved Colors - Jimmy
The old system for saving colors, and managing your saved colors, just wasnt working; it was too complex and too clumsy to use. This week Ive redone it, using the same UI as saving Display configurations. [previewyoutube=Q0mvDkUsR1Y;full][/previewyoutube] Ive also added a button for sorting your saved colors - which is a surprisingly complicated thing - and a button for choosing a random color.
Website Work - Felipe
Ive been working on some minor website QoL adjustments:
- Post embeds on Discord, Reddit, etc are much nicer. before, after
- The Facebook link has been smited from the site. More info
- When logging in you will now be redirected to the page you were previously in
- Comments will now be counted recursively in the comment section
- All notification emails will now contain the reason why you got them
Unfortunately I havent been able to deploy these changes for this LWW (LWT?), but you can expect to see them shortly.
Unexciting Code Work - Jimmy
I spent most of this week laying the architectural groundwork for two very cool features. I was really hoping to show at least one of them off today, but they just didnt get finished in time. These two features are the final building mechanics for Logic World, and theyll complete the set of tools you have to manipulate the world. --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Logic Maker - Felipe
As we discussed in a previous LWW, mods source consist of up to three Visual Studio projects as well as the assets and libraries you want to include. This week Ive been working on a tool that lets you create these projects from a template and upload the source for it to be compiled: Logic Maker.
The UI is a WIP, it currently has no styles at all. Logic Maker is meant to be a tool to aid you in creating and developing mods. While it isnt necessary (you could for example just copy a template project), by using the tool you can create your mod solution with the features you want, and it will automatically output the minimal code to get your mod running. Logic Maker can be used in one of two ways: through the UI or through the CLI. The UI is made with [Avalonia](https://avaloniaui.net/), which means that its completely cross platform and it will look the exact same way on Linux, Windows and MacOS. On the other hand, the CLI will let you perform the same actions as the UI, but with arguments instead of buttons:
In the future Id also like for Logic Maker to let you build the project using the same Docker image that logicworld.net uses. That way you can locally verify your mod before you upload it.
Hover Tags - Jimmy
The menus in Logic World have many small, circular buttons with icons on them. When youre like me and you programmed all those buttons yourself, this isnt a problem, but if not, it can be a little confusing. What does the button with a gear on it do? What does the button with a folder on it do? Back in the Dark Ages of Last Week, there was no way to know. Thats why this week Ive developed a system for displaying more detailed information about a button when you hover over it.
The size of the hover text is configurable, as is the delay between mousing over a button and the hover text appearing. You can also disable hover tags entirely.
Camera Controller Upgrade - Jimmy
When youve saved a board, you can view an interactable in-game preview of the saved board in 3D. This week Ive upgraded the camera controller used in these previews. It is now much more configurable, and it now supports moving the pivot position by holding right click and moving the mouse. This feature was already present in the web previews, which you see when you share a board online - interactive demo of that here. Ive also added a button to reset the camera position, and saved boards now remember where you had the camera when you saved them. Finally, Ive refactored the system for rendering the models so that it can also render a static image of the models. This will allow me to generate thumbnails for saved boards.
Bug Squashing Palooza - Jimmy
Ive spent most of this week going through the game and fixing various bugs that have cropped up. Multiplayer bugs in particular have been getting my attention. The game has been through several major code architecture upgrades in the past few months, so there were a fair number of these. Now, though, Logic World has reached a very stable state. The core gameplay is smooth, incredibly fun, and mostly without issues. It was important that I go through and clean it up this week, because we intend to start beta testing soon.
Website upgrade - Felipe
Previously the website was using the ASP.NET Core 2.1 framework, which runs on .NET Core 2.1. However .NET Core 3 came out not long ago, so Ive been working on upgrading to ASP.NET Core 3.1. This update comes with a ton of performance upgrades, which means that logicworld.net can now handle 5x the amount of concurrent users! --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Oh yeah, its all coming together. Logic World is nearing completion. All the various parts of the game are coming together to form a complete product, and we couldnt be more excited about it.[/size]
Overhauled Display Menu - Jimmy
This week Ive finished the new Display Menu; you can now save and load configurations for displays, making it easy to create multiple displays with the same color scheme.[/size] [previewyoutube=https://www.youtube.com/watch?Qc4qSXO5QkI;full][/previewyoutube] The completion of this menu marks a significant milestone: it is the last new menu for editing a component. Previously Ive made menus for: [/size] Since even before we announced Logic World, make a menu to edit component [x] has always been somewhere on my todo list. And now theyre all done.[/size]
Integrated Server - Felipe
The Logic World game client doesnt have any logic at all, its all handled by the server, which means that the client by itself cant really do much. This server is a standalone .NET Core 3.0 project, which means that it compiles into its own executable. Logic Worlds singleplayer mode is based on an integrated server, like Minecraft, which boots up every time you want to load a world. This week Ive finished the work of integrating the server with the client. The client can now spin up instances of the server and connect to them. This is an important milestone towards shipping the game - now, you can actually play it without starting up a separate server program in the background.
Sandbox Menu - Jimmy
Now that the integrated server is working, Ive been working on menus for using it in singleplayer. The Sandbox Menu uses the same code as the Save Board and Load Board menus, so each world can have a title, a description, and a series of tags for sorting it. The list of saved games can also be searched.
This menu is still a WIP, youll see a video with it next week![/size]
Intro animation - Jimmy
Ive made a fancy animation with our logos that plays when the game starts up.[/size] [previewyoutube=https://www.youtube.com/watch?6bu1QbN0y64;full][/previewyoutube] --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Welcome back to another Logic World Wednesday! Logic World grows closer to completion every day. This week, we've got a preview of the Logic World Theme, a look at the Main Menu and Languages Menu, and a story about the Bug from Hell.
The Logic World Soundtrack
Logic World is going to have a full original soundtrack, and today were excited to announce that the Logic World Theme is complete. The theme is written by the incredible David Housden, whom you might know from his work on titles like Thomas Was Alone, Volume, and Q.U.B.E. Our games theme is a beautiful composition that captures the wonderment and complexity of digital logic. You can hear a preview in the video a little later in this post. Logic World will also have an extensive suite of music that plays in the background during gameplay. These pieces will be written by a different composer. Were not quite ready to talk about these pieces yet, but youll be hearing about them soon.
Main Menu and Languages Menu - Jimmy
This week I finally started work on Logic Worlds main menu! I also added a menu for switching the games language. [previewyoutube=x2qMUX81_pU;full][/previewyoutube] I didnt realize before I made this menu how much the game was missing it. With a main menu in place, Logic World feels much more complete and polished. The game is finally really coming together, and I am so excited to be working on it!!
Felipe Martnez and the Bug from Hell
Programmers squish bugs all the time; it's part of the job. But once or twice in a career, we face a bug so evasive yet hostile, so powerful yet so unknowable, that it threatens the very sanity of the programmer. These are the bugs of nightmares. These are the Bugs from Hell. This week, I faced one such bug. It all started one lazy Sunday morning. I sipped my morning cup of coffee and stretched my fingers, preparing for another long day of work. I was expecting to spend the day working on SECCS and LICC, but as I started to write the first lines of code I noticed something was off. Out of nowhere came some bizarre exceptions, seemingly at random. I could only sit there and watch as the console flooded with red lines of text indicating how bad of a programmer I was. My heart started to pound as I wondered what the silicon slices in my CPU had prepared for me on this damned day. I took a step back. No, this cant be right. My IDE must be messing up, I foolishly thought to myself. I tried restarting the vessel of horror. As soon as it came back up I was once more greeted by the hundreds of errors. I could feel them glaring down at me. I frantically flipped through the pages of code, trying to find the source of these horrors. Where are you hiding, you little bastard? Something, somewhere, was eating chunks of data. As you may already know, Logic World uses SECCS to read and write packets of data to and from the network. SECCS is composed of a number of type formatters that each take care of one or more types, and they operate with raw bytes. Each field of the object that you want to serialize is written one after the other by its corresponding formatter. This bug consisted of a rogue formatter that was writing more bytes than it was reading, which means that the formatters that came after it encountered the wrong data. At this point anything could happen, as the data wasnt correct, so some fields were set to be null when they really werent. It turned out the issue was with how Logic World was using SECCS to read a certain LW class. Specifically, it was the type we use to index a circuit peg within the world. Id accidentally left the code for doing this the same as it was before we switched to using SECCS for networking. It was reading bytes from the stream that it shouldnt have been, which messed up everything that read the stream afterwards. The result of 4 days work:
At last, the bug was conquered. It was a painful and arduous task, but the reward was undeniably worth it. --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. More Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
(this blog was originally posted 2019-11-13)
Display Configurations - Jimmy
Displays allow you to configure which color they are in each possible state of their inputs. This week Ive been working on the ability to save and load these configurations, so you can quickly set up displays that will be the same color when their inputs are in the same state.
On the top are graphics depicting the possible states of the displays inputs - from 0000 to 1111 - and the color the display is in for each state. On the left are various saved configurations for displays with four inputs (and 16 states). This feature isnt quite done yet, so youll see a full video showing it off next week.
Cloud mod compilation - Felipe
As we discussed last week, in order to share a mod on logicworld.net you will need to upload the mods source code, which will then get compiled for you on our servers. This is what Ive been working on this week: Ive been developing a sort of CI system that automatically compiles the mods solution and outputs the mods code as DLLs. The system relies on Docker containers to run the build, which means that they run completely isolated from the rest of builds and with the same starting environment every time. Using Docker also means that we can aggregate multiple cloud server instances and create more as demand for compilation power goes up, allowing us to meet the demands.
SUCC v1.1 - Jimmy
SUCC is an open source library Ive developed for Logic World for saving and loading data as text. We use it for saving user settings, metadata about world saves, localizations, game data like the list of components, and more. Ive spent some time this week making improvements to SUCC, including adding some features we need for Logic Worlds modding system. Theres too much to talk about here, but you can check out the list of changes over on the 1.1 release page. --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. Read previous Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Welcome back to another Logic World Wednesday. After a three week hiatus, we are back! If you havent been keeping up with us on Discord, the break has been because we were reorganizing Logic Worlds 50,000 lines of code. That work is finally done, and your regularly scheduled Wednesdays have returned!
New Menus - Jimmy
Ive added three new menus to Logic World this week! We now have a pause menu, and buttons and keys have gotten menus for editing those components. [previewyoutube=Gn3xmVy8Tcs;full][/previewyoutube]
MIDI Input Support - Jimmy
Thanks to the release of Minis by Keijiro Takahashi, Logic Worlds extensive input system now supports MIDI input! You can now use your pianos to control the game. MIDI bindings can be used for regular game actions like walking and jumping, but I expect theyll mostly be used with Keys to make in-game music machines :D
New Game State System - Jimmy
Logic World uses a complex state machine to govern the flow between game states. For example, youre allowed to transition to the in chair state from the building state, but youre not allowed to transition to the *in chair* state from the multi-wire placing stage 2 state. Previously, we defined the rules of the state machine all in a single file. This week Ive built a new system and transitioned all our game states to it. Under the new system, the rules of the state machine are distributed throughout many files. The rules for one state are now right next to the code for what actually happens when the game is in that state. When were working on a game state, this makes it easy to see that states relationships with other game states. But more importantly, this means that mods can now add their own game states, since theyre not all defined in one master file.
Server architecture & networking refactor - Felipe
This week Ive been working on refactoring the servers codebase, adhering to the Inversion of Control principle. This means that I went through every single class, converted it to non-static, determined the classes that it depends on and injected them on its constructor, while creating an interface for it. This results in highly testable and modular code thats a lot easier to maintain and extend. Ive also been refactoring the networking code: previously each packet type was composed of two methods: one for writing the packet and one for reading it. These methods operated directly on the network stream and they didnt have an explicit structure, as it was determined by the order and type of read/write calls. After the refactor, each packet is its own class, we have SECCS serialize and deserialize it, so we dont have to write any code that manipulates the network stream directly. Another benefit is that packets are clearly defined and, again, easier to maintain and extend.
Modding System Progress - Felipe
Ive also been rethinking the existing modding architecture, and this time Ive decided on a file structure that looks like this (not final):
- assets/
- my_image.png
- my_mesh.obj
- my_unityassets.assetbundle
- data/
- components.succ
- lib/
- MyLibrary.dll
- manifest.json
- server.dll
- client.dll
- shared.dll
An Early Phriday
For the past few weeks, weve been holding biweekly off-topic discussions on the Logic World Discord. This has been a lot of fun and weve had some very interesting talks. Some people have lamented that these discussions are not at a good time for them, so were experimenting with different times. This weeks Philosophy Phriday willl be 2 hours earlier than usual, at 18:00 UTC. --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. Read previous Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Welcome back to another Logic World Wednesday! If you havent already heard, we have made the difficult but necessary decision to delay the release of Logic World. The game will be released in February 2020. More information can be found here.
Adjustable Delay - Jimmy
Sometimes you need to introduce a delay into your circuits, and thats exactly what Delayers are for. Previously, each Delayer type had a set delay length, but this week Ive made it so their delay can be adjusted. https://www.youtube.com/watch?v=rFW34K0lZmc
Resizable Mounts - Jimmy
Mounts are a component to help you fit your circuits into tight spaces. Theyre shaped like little pillars, and you can place any component on top of them. This week Ive made Mounts resizable, so you can adjust their height to whatever you need. This reflects a new feature of the Resizable Components system I showed off last week: the ability to resize stuff on the vertical axis. https://www.youtube.com/watch?v=0SDyFKmKUWQ
Rainbow Keys - Jimmy
You can now change the color of Keys and the label on top of them.
Labeled Buttons - Jimmy
All pressable Buttons can now have text written on them.
Client/Server integration - Felipe
Logic World is composed of a client (the game itself) and a server. In order to play on a world, a client must connect to a server. Previously, the client and server were totally separate applications, which means that you must run a separate server and then connect to it even if you want to play on single-player mode. This week Ive been working on adding an integrated server to the client, which will automatically be spun up when the game starts without you even noticing. Singleplayer in Logic World is actually just multiplayer with the server running on your machine. Because the game works like this, youll have the ability to hop right into your friends singleplayer games. --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. Read previous Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
More Resizables and More Displays - Jimmy
A while ago I was experimenting with making labels resizable. This is a followup to that: Ive implemented a full, proper resizable components system that can allow you to resize almost anything. Of course, this system is open to modders: if you make a mod to add a component, you can very easily make that component resizable. https://www.youtube.com/watch?v=IRgSj1gm6V4 Also shown in the above video are the new displays! Logic World now has displays with 1, 2, 3, 4, 6 and 8-bit color depth. I cant wait to see what you draw with them :)
The Logic World Store - Felipe
Logic World will be sold on Steam and other third-party stores, but well also be selling the game ourselves on logicworld.net. We announced this store on a previous LWW, and this week Ive been continuing to work on it. This is how it looks like right now:
The Logic World Store is being built to sell the game itself, but in the future we may also sell physical merchandise here!
Automated website testing - Felipe
If youve been following us for more than a couple weeks you have probably experienced some issues with the website like the inability to post or delete comments. I try to make every deployment of the website as stable as I can but sometimes I miss something. Therefore, this week I have been adding unit and integration tests that must succeed before deploying, using the Atata framework. Unit tests are pretty boring, but integration tests involve actually performing actions on a browser which makes for a pretty cool show: https://www.youtube.com/watch?v=ocW4Lq2H_Qw (Side note: only the first part of the video is sped up, the actions are performed at that speed!) Integration tests will automatically do all the common actions a user can do (right now only registering and logging in, but the goal is to add actions like commenting, posting, editing comments, etc). --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. Read previous Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
(this blog was originally posted 2019-09-11)
Multiplayer
We thought it was time to show off some multiplayer gameplay! https://www.youtube.com/watch?v=pshtA-Bi6LM This week weve made it so you can see other players. Previously they were ghosts; you could see their effect on the world, but not the players themselves. The smiling orange ball - affectionately dubbed Bobby by our discord - is just a placeholder. The final game will have actual art :P
Logic World Wiki - Felipe
A game like Logic World must have a place where all the knowledge about modding and other details is stored, and thus the Logic World Wiki was born! Its empty right now, but when the game comes out this is where well host modding tutorials and documentation, in both written and video form.
New Player Controller - Jimmy
This week Ive overhauled the players movement code. Here are all the features it has:
- walking
- running
- crouching
- flying
- flying can be with or without a locked Y axis
- optional & adjustable movement smoothing
- optional & adjustable mouse smoothing
Dynamic Components - Jimmy
Each component in Logic World has what we call a prefab, information which defines how the component looks. This includes the number of blocks, the shape of those blocks, the number and positions of its inputs and outputs, and several other things. Previously, component prefabs were static. Each instance of a component would look exactly the same. But this week Ive been overhauling the way the game handles prefabs so that a component can change its appearance. Among other things, this means we can make many more components resizable in the same way boards are. I had really hoped to show this off today, but it was much harder than I expected and the system isnt done yet. Next week you can expect to see Dynamic Components in action - theres a lot of cool stuff I plan to do with them. --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. Read previous Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
Advanced Console Functionality - Felipe
Last week I talked about LICC, a common console framework for the client and server that takes care of registering and running commands defined by mods or by the game itself. This week Ive been extending LICC by adding LSF (LICC Scripting File), a scripting language heavily inspired by Bash. Its got functions, variables and if, for and while statements, as well as most of the usual math and boolean operators (including the ternary operator). Heres a sample file:
LSF is completely integrated into LICC, meaning that youll be able to use the same script file on both the client and the server! You can run any script file at any time with the exec command and in LSF files you can also import other script files, allowing you to reuse code. LICC will also automatically run a script called called autoexec.lsf on startup if it exists, allowing you to modify settings or run maintenance tasks.
Input System Overhaul - Jimmy
I spent most of this week working on a total overhaul of Logic Worlds input system. The input system is what translates your controls in real life, like clicking the mouse or pressing a keyboard key, into actions in the game. Ive focused on customizability with the new system. I want everyone to be able to configure the games controls to how they want them, or - in the case of people with motor disabilities - how they need them. Heres an overview of how the system works:
- each action the game can interpret - walk forwards, jump, place item, etc - has one or more bindings that can trigger it.
- bindings can reference direct input like key presses or other bindings. For example, the jump action is bound to space, and the fly up action is bound to jump.
- bindings can reference multiple direct inputs or other bindings, requiring you to press both of them to trigger the action
- bindings which can be held down have two options: actually hold them down, or tap once to toggle on and tap again to toggle off
- bindings can reference double or triple taps/clicks
- a much greater variety of input devices are supported, and adding new supported input devices is much easier
- the bindings can be edited at runtime
- mods can add and use custom bindings
- the new system is significantly more performant
- binding data is stored in an easily-editable file next to the game executable, rather than in the registry
Welcome back to another Logic World Wednesday! This week Logic World passed 4,000 wishlists on Steam. Thank you to everyone who has wishlisted, that number is just crazy!!!
Chairs and Better Keys - Jimmy
Ive made a number of enhancements to Keys, and added placeable Chair objects to go along with them. https://www.youtube.com/watch?v=E3VGKl7cW30 I think Chairs are a really nice system. You place one down then lay out a bunch of Keys in front of it, and now sitting in the chair is like sitting down in front of a keyboard.
LICC: Console Backend - Felipe
If youve ever played games like Minecraft you probably know that there are commands. Commands are a way of telling the game what to do, for example to quit the game or kick a player. Right now the client uses a different method of registering and handling commands from the server, meaning that sharing commands between them is practically impossible. Thats why we decided to make a library that handles everything for you, from parsing user input to registering and executing commands. Now, with a single method, a mod can register a command that will work on both the client and the server. Heres an example of a command in the code:
[Command]
public static void Say(string what)
{
LConsole.WriteLine("You said: " + what);
}
As you can see, all you have to do to register a command is to add the [Command] attribute to a static method.
You may have noticed that we are using LConsole.WriteLine instead of Console.WriteLine, this is because we need to provide a way of outputting text that works regardless of where the command is running on. On the client it will output to the console window, and on the server itll write to the regular console output.
Because of this, LICC* is split into two parts: the backend and the frontend. The backend is shared and provides the base functionality like command registering and executing, while the frontend takes care of interacting with the user: receiving input and sending output.
This is a little demo of the console frontend:
LICC also supports variables, similar to those in Bash (and less powerful (for now)):
* LICC: Library for Implementing C# Commands
Fancy Pants Console Frontend - Jimmy
Using the wonderful backend code Felipe wrote, Ive made a slick in-game interface for the LICC console. https://www.youtube.com/watch?v=E3VGKl7cW30 The new console will speed up developing and testing, but most importantly it will let power users go wild with hotkeys and scripts.
Search All the Things - Jimmy
A while ago I added searching to the Selection Menu. This week Ive abstracted the code for searching components and reused it in a number of places. You can now search:
- the Selection Menu
- your Saved Boards
- the list of Singer instruments
- the list of Drum instruments
- messages in the new Console (shown above)
Sound Effect Randomization - Jimmy
Ive updated our system for playing sound effects so that there is a slight random variation in pitch and volume each time a sound is played. This helps the sound effects to feel more natural, since its not exactly the same sound every time. https://www.youtube.com/watch?v=iqPydtVdccA
Monospaced Labels - Jimmy
For all the Master Hackers out there, Ive added an option to labels for making their text monospaced.
Miscellaneous Website Tweaks - Felipe
This week Ive made various tweaks to the website, however theyre too small to warrant their own section:
- Comment likes now count towards your profiles total likes
- Timestamps are now updated in real time
- You can now automatically quote comments by selecting some text and pressing reply
- You will now get a notification when someone mentions you in a comment or post (this can be adjusted in your account settings
- Now there are breadcrumbs in all forum pages, for example:
- Collapsed comments are now more collapsed:
Before:
After: - The comments section now has some more space and a comment counter:
Before:
After:
Drums - Jimmy
Singers play sounds that have different pitches. But not all kinds of sound are like that. Drums are a new component, and theyre very similar to Singers except they play sounds (usually drum sounds) that dont have different pitches. https://www.youtube.com/watch?v=_sv7sM1t96g
Keys - Jimmy
Keys are new components that correspond to your physical keyboard. When you press a key in real life, that key is pressed in-game as well. You can use this for really fast and intricate input for your in-game circuits. https://www.youtube.com/watch?v=S96VZSjjdTQ
Post image uploading - Felipe
Some time ago I added the ability to embed images to your post directly from the website, but the UI was very rough. This week Ive been working on polishing the process of uploading and adding images to your post, this is what it looks like now:
When you add an image it will automatically get uploaded to the server and youll have the ability to insert the image embed by clicking on its preview.
Post visual editor - Felipe
In logicworld.net, Markdown is supported pretty much everywhere you can type. Markdown is a text-based language, so if youre used to other WYSIWYG editors like Microsoft Word it can be somewhat uncomfortable to write Markdown. If this is your case, youll be happy to know that there is now a visual editor for posts based on StackEdit:
The revamped image uploading UI and this visual editor both contribute to our goal to make logicworld.net accessible to everyone and easy to use, as well as a great place to share your creations and discuss.
Input Animations - Jimmy
While working on Keys, I gave them sexy animations for going up and down. Rather than snapping between their up position and down position, they move smoothly between the two. Ive added similar animations to the other two input methods, Buttons and Switches. You can see this effect in the Keys video above. Its a small detail, but its nice to look at. --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. Read previous Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
(this blog was originally posted 2019-08-14) Hello everyone! This week Jimmys on vacation, so itll be just me and my web shenanigans.
Comment "soft"-deletion - Felipe
If youre familiar with Reddit, you have probably seen something like this:
There, whenever you delete a comment it doesnt disappear from the post, but rather its text and author get replaced with
[deleted]
, which means that its children will be kept intact. That is exactly what happens in logicworld.net now when you delete a comment with children, like so:
Visits chart - Felipe
I love statistics charts, so I just had to make one for logicworld.nets visits. Its not visible to the public, but this is what it looks like:
Data prefetch - Felipe
Ive implemented data prefetching in the forums, which basically means that the forums will be snappier when navigating. For example, the first post of a forum is prefetched when you visit a forum, that way when you click on that post the data will already be in your browser and itll load pretty much instantly! --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. Read previous Logic World Wednesdays https://store.steampowered.com/app/1054340/Logic_World/
(this blog was originally posted 2018-08-06) Logic World Wednesdays on a Tuesday? What is the world coming to? If you havent already heard, Logic Worlds release has sadly been postponed to October.
Board Sharing - Felipe
As you may remember from last LWW, I have been working on a way to easily share your creations with the world in logicworld.net. This week Ive been working on the board details page, which is the page that people will see when you upload something, like adding the model preview and a picture carousel. Ive also contracted a zombie to record a video showing the whole process in action: https://www.youtube.com/watch?v=7kkl7cVSchg I have also made a little demo demonstrating what the board model in each board page will look like.
Comment rating - Felipe
A bit of a small one, but now youre able to like comments like you can do with posts! This is how it looks like:
In the future expect a way to sort comments by score and date.
Singer Polish - Jimmy
Ive made many improvements to Singers since you saw them last week. Pitch Correction If you have a keen ear, you might have noticed last week that the pitch of Singer notes was off by a little. Pachelbels Canon in D was actually Pachelbels Canon in D Sharp Plus 0.6 Semitones. This was caused by an oversight on my part: I was generating the audio at 44100Hz, but playing it at 48000Hz, meaning it was being played slightly faster than intended. This discrepancy has been fixed and Singers are pitch-perfect now. Wave Instruments In addition to high-level instruments like Violin or Piano, Singers now have access to the following simple mathematical waves:
- Sine
- Sawtooth
- Square
- Triangle
- White Noise
Welcome to another Logic World Wednesday! This week, logicworld.net passed 10,000 unique page views. Woohoo!!!
Singers - Jimmy
Digital logic is great, but its only useful when it can control devices. Before today, the only output we had in Logic World was displays, which change color when you power them. Introducing Singers! https://www.youtube.com/watch?v=H7_rAxlIOEk I may have gotten a little carried away with the demo for these. Thats the main reason this post is so late. I hope you think its as cool as I do :)
Board uploading - Felipe
Once Logic World is released youll be able to upload your boards to logicworld.net and browse everyone elses, and this week Ive been working on the system that will allow you to do this straight from in-game. As you may remember from previous LWWs, the game utilises an RPC connection to logicworld.net in order to do stuff like logging in and interacting with friends, which means that Ive already got a connection to the logicworld.net server through which I can send the board file. The game will split up the board file in 10kB chunks, export the boards model as a .obj file and calculate the hash of the entire file, all of which will get sent to the server as soon as you press Upload on a board. Once the server has received all the data and has checked that the hash matches, youll be directed to logicworld.net/Upload, where youll be able to adjust your boards title and description and upload some good-looking pictures. You may have noticed that when you press the Upload button on the client youre not obligated to follow up and publish the board on the site, in which case the server will keep the board file indefinitely while not being public. This is less than ideal, as over time the disk would be full of forgotten board files that never ended up being published. To overcome this, each board you upload will be assigned an ID as soon as you press the button, which will be stored in the database along with the time at which you started the upload. Every hour we check for uploaded board files that are older than 4 hours, which will be deleted from disk and from the database. My goal with this system was to make it easy and quick to share your boards from inside the game, while being flexible by completing the publication from the website so that I can expand it to allow for the uploading of worlds as well.
UI Refactoring - Jimmy
I spent a lot of time this week going over the code for the various menus in the game. Ive been cleaning it up and abstracting the systems so theyre easy to use in future menus. Ive also made significant performance improvements to a lot of our UI. This stuff isnt super fun to talk about, but its a necessary part of the process of making a game. --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. https://store.steampowered.com/app/1054340/Logic_World/
Welcome back to another Logic World Wednesday! This week, Logic World surpassed 3,000 wishlists on Steam. Thank you to everyone for your support!
Board Models - Jimmy
I added interactable 3D models to the board menu! Now you can see what your saved circuits look like before you load them. https://www.youtube.com/watch?v=igAYHnccKnY Sometime in the future I'd like to let you 3D print these models. I would love to have a little circuit for my desk, that would just be so cool.
Resizable Components - Jimmy
Ive been working on a system for resizing components in the same way you can resize boards. This will eliminate the need for having many different components that are just the same component resized. https://www.youtube.com/watch?v=oYLexydk888 This feature was suggested last week by @ForLoveOfCats. Thanks, Cats! --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. https://store.steampowered.com/app/1054340/Logic_World/
Label UI - Jimmy
Labels are blocks with editable text on them. I added them to Logic World a while ago, but there hasnt been an in-game way of editing them. This week I finally added that menu, as well as the ability to change the labels color! https://www.youtube.com/watch?v=VHx5iKpETR4
Grid Placing - Jimmy
Grid Placing is a new feature that lets you quickly place many components in a grid. https://www.youtube.com/watch?v=-HISkMNYbK4 One of my goals with Logic World is to make the building mechanics fast and easy to use, and Grid Placing is a big part of that!
C# to JS - Felipe
I'm finally back from vacation! Unfortunately I'm going to have less time for LW stuff as I'll be busy with school, however this week I did have time to add something to my vue-aspvalidate library: as you may remember from my last LWW section in order to, say, validate an email there has to be a snippet of C# code that validates it in the back-end and a snippet of JS that validates it on the front end, which meant writing duplicate code for each kind of validation. This is obviously less than ideal as youre writing everything twice, so I set on to find a way to take C# code and translate and send it to the client. I arrived at a solution using the wonderful LINQ Expressions API in C# that lets you pass a method a lambda (i.e.value => value.Length > 10) and then go through it using an ExpressionVisitor, which lets you see the lambda as a regular C# object of a type derived from Expression. For example, the previous example would call the VisitBinary method on your visitor, which in turn lets you visit the left and right sides of the > operator and so on. This means that a single-line validator like value => value[2] == @ && value.StartsWith(lol) || Regex.IsMatch(value, .*?%$) gets translated to the JS code value => value[2] == @ && value.startsWith(lol) || new RegExp(.*?%$).test(value). As you can see, some BCL methods get translated to their JS counterparts, allowing me to write complex validators without worrying about writing any JS code! --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. https://store.steampowered.com/app/1054340/Logic_World/
Sorry for the late post. Programming is hard!
D-Latches - Jimmy
By popular and passionate request, Ive added D-Latches to the game! https://www.youtube.com/watch?v=3yc_-BV-tc0 The D-Latch is the first of many new logic components we will be adding to Logic World. Stay tuned :)
Board Saving Menu - Jimmy
Last week I showed off Board Saving, but it didnt have a menu yet. Ive been working on the user interface for that feature. https://www.youtube.com/watch?v=_1xZnSnmKTo This is the most complicated user interface Ive ever programmed. It was definitely worth my effort, though: I expect many people will have hundreds of saved boards, and they need to have a good way of organizing them.
Form validation - Felipe
If theres something thats annoying to both users and web developers, its form validation. Most if not all user input needs to be checked, for example to make sure a users email is a valid email address. Every form in our website corresponds to a class in the server, for example the login page gets transformed into an object with two fields:
string Username
and string Password
(this will be relevant later). In this case theres not much to verify, other than that neither fields are empty, but in more complex forms like the register form you may have to verify the email format, the username length, the password complexity, etc. These requirements have to be verified with the same criteria on the front end (for a smooth and instant response), and on the back end (in case the client fails to verify the data).
As you may or may not already know, the website is made of different technologies for the front and back side, each with their respective languages (C# and Typescript in this case). This means that validation criteria have to be defined on both the back and the front end and in ways appropriate to each language.
ASP.NET Core (the technology used in the back-end) has support for decorating the members of the aforementioned data class with attributes, which makes for a smooth and clear indication of the requirements of the forms inputs. For example, this is how a register form could look like:
The problem is that in order to enforce these same rules on the client, youd have to manually check the usernames length, use a regex for the email, etc. Ideally these same rules would be transferred to the client and automatically applied, so that youd only have to specify the requirements once. This is exactly what my new library vue-aspvalidate does! It allows you to validate inputs on the client and the server while only writing the requirements a single time on the server class. This will save you a lot of time since you wont be writing duplicate code, while also making it less buggy and, perhaps most importantly, making sure that the server and client agree on their requirements. Its also very extensible, letting you define your own rules with client and server logic.
Board Save Format - Jimmy
Last week when I showed off Board Saving, saved boards and saved worlds used a different file format. This week Ive unified the systems so that boards and worlds are saved with the same logic. This means less code, which is always a good thing! There is also now a debug option to save boards as text data instead of binary data, in case you need to edit the files manually. --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. https://store.steampowered.com/app/1054340/Logic_World/
The logicworld.net Store - Felipe
Weve decided we want to sell Logic World on our own store in addition to third party stores like Itch. When you buy through logicworld.net, youll be able to download the game completely DRM-free and straight from our website. Additionally, 100% of your money will go to us. We are planning to support payments through PayPal, Stripe, and PaySafeCard. In the future we might also sell physical merchandise on our store. Weve updated our Terms of Service and Privacy Policy to reflect this new way of purchasing Logic World.
Saving Boards - Jimmy
Ive been working on a system to save circuit boards youve built stuff on. Often in Logic World you need to use a circuit many different times, so now you can save your circuits and load them again whenever you need them. https://www.youtube.com/watch?v=Hw8QMKr0C9k In the future youll be able to upload and share your saved boards on logicworld.net. --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. https://store.steampowered.com/app/1054340/Logic_World/
Website Update - Felipe
This week Ive improved a few details on the website. First of all, I fixed the annoying newline formatting, now you can insert more newlines after a paragraph using
tags. Also, now you can see each posts score when browsing a forum, along with the existing comment count. Ive also fixed a couple of issues involving comment deletion, as well as added the possibility to edit comments!
Heres a picture showing the forum details:
Configurable Displays - Jimmy
The main output component in Logic World is the Display. Displays change color based on the state of their inputs. Previously, these colors were predefined, but this week Ive added the ability to change them. https://www.youtube.com/watch?v=jqNI9Nek8AA This feature was suggested by @TheWildJarvi. Thanks, Jarvi!
Details
Every week were adding small details and polish to Logic World. Individually, these are too small to get mentioned on Wednesdays, but from now on well be doing compilation videos that show them off. https://www.youtube.com/watch?v=u5TI6OQoU8Q The difference between a game thats pretty good and a game thats fantastic is the attention to detail. We want every single part of Logic World to be a smooth and polished experience. --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. https://store.steampowered.com/app/1054340/Logic_World/
Color Picker v2 - Jimmy
Last week I showed you an early version of the Color Picker menu. Ive spent a lot of time this week polishing and improving the color picker and its now my favourite piece of UI in the game. https://www.youtube.com/watch?v=WpFBcw5cb3A The color picker now has:
- an HSV wheel
- a hex code input
- sliders for red-green-blue and hue-saturation-value
- these can be toggled on and off individually
- the slider colors update to reflect what changes they would cause
- each slider has a field to manually enter a value
- a list of saved colors
- keyboard shortcuts
Profile Pages - Felipe
Ive done quite a bit of work this week on the logicworld.net user profile pages, which were quite lackluster before. The first thing I did was to add a badge system, which are shown in the bottom part of the sidebar in your profile page. Right now the only earnable badge is the Verified email one, which you can of course earn by verifying your email address (if you signed up using a Google account you wont need to), so go ahead and try it! In the future we will be adding more badges that youll be able to earn by for example purchasing the game in stores, winning contests or participating in events. I have also added a customizable bio to your profile, which is a short paragraph of text in which you can talk a little about yourself or link to your social media (remember, Markdown is supported!) Heres a picture showing these two features:
You may also have noticed that theres a number indicating the total amount of likes your posts have gotten. In the future you'll be able to like comments as well, and those likes will contribute to your total. In the right side of the page youll now also see a feed of the users activity, i.e. posts and comments, which you can filter and sort!
Configurable Menus - Jimmy
Ive been working on a system that lets you adjust menus to your liking. https://www.youtube.com/watch?v=m2T1fEJ_8aM All Configurable Menus allow you to adjust their size, shape, and position on the screen. In the future, some menus will have additional control panel options that are specific to them. I want Logic Worlds interface to be as customizable as possible, so everyone can have the menus set up how they want or need. --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. https://store.steampowered.com/app/1054340/Logic_World/
Welcome back to another Logic World Wednesday! Before we begin, wed like to share that this week Logic World surpassed 2,000 wishlists on Steam. Thanks everybody!
Colors! - Jimmy
This week Ive been working on a menu that lets you choose colors! It will be a sub-menu in many different higher-level menus. Currently you can use it to change the color of circuit boards, buttons, and switches. Check it out: https://www.youtube.com/watch?v=aYP0pURAjFs
Graphics Improvements - Jimmy
This week Ive been making improvements to Logic Worlds graphics. The game now not only looks better, but it runs faster as well. Lightweight Render Pipeline Logic World is a 3D game, but its 3D world is displayed on your 2D screen. A Render Pipeline is a library of code which takes that 3D data about the world and converts it to a 2D image to be displayed on your screen. Previously, Logic World was using Unitys built-in render pipeline, but this week Ive ported it to a new pipeline called the Lightweight Render Pipeline or LWRP. I did this for two reasons:
- Performance. LWRP is built to be as fast as possible. Its missing some advanced features - such as realtime global illumination and detail maps - but Logic World is not a realistic looking game so we dont need realistic rendering.
- Modernity. Unity is moving away from its old built-in render pipeline and will eventually deprecate it entirely. By using one of the modern render pipelines, we ensure that well always have access to the newest and fanciest rendering tech.
Not only do the new outlines look better, but they can also be any color now. The previous system was limited to only three colors. Now that that restriction has been lifted, we have much more freedom, and can communicate the meaning of an outline with more flexibility. Video Ive made a short video that shows off our new rendering setup and what each layer of the rendering stack adds. https://www.youtube.com/watch?v=Z2qQ596gM7s
Web notifications - Felipe
Now theres a bell in the top right side of the navbar in logicworld.net. It will light up whenever you get a notification! Youll also be able to see the details of each notification if you click on it! This bell will only be visible when youre logged in. Currently you only get notifications when someone replies to your post or comment, but in the future youll get a notification when someone @mentions you in a comment or post, and youll be able to subscribe to a thread and get a notification when a new comment is posted!
Better notification settings - Felipe
Previously, youd get an email whenever someone replied to your post or comment. This is great except for the fact that you cant choose whether or not to receive them, thats why now theres another column in the Account Settings page that allows you to enable and disable web and email notifications for each type of notification (currently only replies).
Big Component Rotation - Jimmy
Ive made rotating big components more fluid and intuitive. Previously they would always be rotated around their corners, but now they are rotated around whichever point youre looking at. This is kind of hard to describe with words, so heres a video: https://www.youtube.com/watch?v=D1MocWQzV4s
Friends List- Felipe
Ive finally added a friends list to the game, which will show you the name of every one of your friends, as well as their profile picture and their current status! Heres what it looks like currently:
Keep in mind this is really WIP as of now (as can be seen by the white profile picture). This menu will be used for various things related to multiplayer games, like inviting people to your singleplayer game and playing challenge packs with friends. --------------------------------------------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net. https://store.steampowered.com/app/1054340/Logic_World/
Friends/RPC system - Felipe
One problem of releasing Logic World on multiple platforms is not having a way to easily connect with your friends that have bought the game on a different shop. Thus, I set on to build a friends system, akin to that of steam (although much more barebones). This means that youll be able to chat with your friends and join their games, no matter where they got their copy of the game from, be it Steam, Itch.io or Gamejolt! The system is powered by a gRPC server running on the cloud, to which clients will connect to in order to send and receive messages in real time. This whole system is completely opt-in, meaning that we wont bother you at all if you choose not to create an account.
Game ownership verification - Felipe
To access the friends system, we must verify that youve successfully bought the game, which you can prove through your linked Steam account or by authenticating on itch.io. You only have to do this once, and youll be able to add your friends!
Component Flipping - Jimmy
A number of components in Logic World have parts on both sides of circuit boards. This week Ive added a building mechanic that lets you flip these components upside down, either before or after you place them. https://www.youtube.com/watch?v=KnnBNeEzD5I
Remote World Downloads - Jimmy
In Logic World, the client and the server use the same code to store their internal physical models of the world, and this model is synchronized between the server and all the clients that are connected to it. Previously, only the server had access to the code that generates save files from this model of the world. Ive modified the save code to work without the server, only that shared physical model of the world. This means that when youre connected to a server, you now have the ability to download that servers world.
Save Options - Jimmy
Logic World has two methods of saving your progress. First, it will save your game to the current save file. Second, it will automatically backup your save file, just in case. This week Ive been working on making these two systems more configurable, and you now have the following options:
- automatically save when the game is closed (true/false)
- enable/disable autosave
- time interval between autosaves
- enable/disable auto-backups
- time interval between auto-backups
- an option to make a backup every time the game is saved (this would be in addition to auto-backups if you have them enabled)
- the location on disk which backups are saved to
- the maximum number of backups to keep per-save before the oldest one is deleted
Image Embeds - Felipe
Currently, if you want to upload an image to a post on the forum youd have to previously upload it to an image uploading site (we were using Imgur), and then insert the image using Markdown notation. However, now you can directly upload images to logicworld.net and insert them into your post by writing {{!N}}, where N is the index of the image youre referencing. Heres how the UI looks like at the moment:
I do want to make it prettier but this works for now, even if its not the best UI.
Search Shortcuts - Jimmy
Last week @woox2k left a comment suggesting a keyboard shortcut for the search function in the selection menu, and this week Ive added it. When you run a search, you can now press enter to add the first search result to the end of your hotbar. It also selects the entire search box so you can immediately begin searching for another item without having to use backspace. There are a few more advanced shortcuts as well:
- alt+enter will add the item to the beginning of the hotbar instead of the end
- shift+enter will replace the currently selected hotbar slot with the item
- ctrl+enter will insert the item into your hotbar right after the currently selected hotbar slot
Welcome to another Logic World Wednesday! This week, Jimmy works on the UI system for the game, and Felipe continues to add features to logicworld.net. Were trying out a new format this week: rather than giving each developer their own section, the post is divided into sub-topics, each with a developers name attached.
UI Refactoring - Jimmy
I spent this week going over all our UI code, adding features, fixing bugs, and reworking everything to be more flexible/modular. The goal is to establish a set of tools that help us build functional and beautiful menus very quickly. This isnt quite done, but its close.
Localization Improvements - Jimmy
Logic World will be localized into several different languages. This week Ive made some improvements to the system that allows the game to switch languages.
Firstly, mods can now use the localization system. Mods can now add translations for any text they add. Mods can even add entire new languages! Next, I added a language fallback system. This allows localized text to revert to a different language if a translation is not found in the preferred language. For example, say youre a native Spanish speaker but you know some English. You have the game language set to Spanish. However, youve installed a mod which only has translations for English and Portuguese. Without language fallback, all the text from that mod would say missing localization - but if you assign English as a fallback, that mod will be in English even while the rest of the game is in Spanish. If youre fluent in a non-English language and youd like to help translate Logic World, please send us an email at hello@mousehatgames.com. Translators will get their name in the game credits!
Post likes - Felipe (aka pipe01)
Last week I was crunching numbers and I discovered that more people are visiting Facebook than logicworld.net. While investigating, I found that we were missing a like button! This shall be no longer; there is a button with a heart in it at the end of this post on logicworld.net, make sure you try it out!
Nested comments fix - Felipe (aka pipe01)
As you may have noticed on the last LWW, comments werent working properly. Specifically, you werent able to reply to 1-level deep comments. I havent yet found the change that introduced this bug, but I suspect its related to a merge in posts and work items (more on work items later ). Whatever the cause, Im sorry for breaking conversations in the last LWW. To make up for this, make sure you give us your thoughts this week!
Comment notifications - Felipe (aka pipe01)
Some people were affected by a bug where you wouldnt get an email notification when someone replied to one of your comments. This was caused by a user preference that I added in the back-end but ended up not adding to the settings page itself. Thus, the default value was to not get any notifications! This has now been changed to always receive notifications, but expect an option in your account settings in the future.
Delete comments - Felipe (aka pipe01)
Not much to say here, now you can delete any comment you have posted. This will be accompanied by comment editing in the near future, so look forward to that.
Comment permalinking - Felipe
Its useful to be able to refer someone to a specific comment, which is why this week I added comment permalinks that look like https://logicworld.net/Forum/Comment/18. You can get this link for any comment either through the comments date text or the dropdown options menu.
Menu Palettes - Jimmy
All the menus in Logic World uses a consistent selection of colors. This week Ive been working on a system that lets you easily modify that selection.
Now, when I add something to a menu, I dont choose a color for it, I choose a part of the palette for it. That menu element (a block of color, a scrollbar, some text, ect) is then assigned a color based on the current palette. Originally I was doing this to save myself time; if I want to slightly change the shade of one of the colors, I now only need to do it in one place rather than adjusting the shade in every individual UI element that uses that color. But then I realized that this system could be used to support multiple different UI themes, and so thats exactly what were doing. Logic World will ship with a few different menu palettes, and mods can add additional palettes. Youll be able to personalize Logic Worlds menu colors to look exactly how you want them to!
Thumbnail fetching - Felipe
If youve ever shared a link on Discord or Reddit you may have noticed that they have an image attached to it. This image didnt show up on any logicworld.net links as I had overlooked it, but now theres a pretty logo! I plan on customizing the image for each page, for example showing the first image found if the link belongs to a post. Before:
After:
Search Lock - Jimmy
Last week I showed the search system in the selection menu. By default, when you close and re-open the selection menu, the search box is cleared. This is convenient because it lets you search for something, grab it, close the menu, and have everything back to normal when you open the menu again. However, you might not always want this to happen. For example, maybe youre using search to narrow down the displayed components to a particular subset which you want to return to later. Ive added a Lock toggle to the search box. While Lock is on, the search box isnt cleared each time the menu opens.
Database backups - Felipe (aka pipe01)
Perhaps most importantly of all, we now have a database backup system that runs periodically. Right now this includes all user data, as well as posts and comments. In the future though, you will be able to share worlds, boards and mods, which will also be included in the automatic backups. All websites come to an end eventually, and ours will probably be no different. When that happens, we pledge to release all of this data as a torrent for all of you to download and preserve this bit of history! ----------------------------------------------------------------- Thank you to the following people for translating the selection menu for this post:
- Polish: @Qik
- Estonian: @woox2k
- German: @JuliaEllie
- French: @Nano
Jimmy
UI work This week I did the first serious work on menu design for Logic World. I overhauled the Selection Menu, which you use to select the components that appear on your hotbar. Before:
After:
Im pretty happy with the overall design elements: rounded rectangles, mostly in neutral tones with some splashes of color for highlights. Im using the selection menu as a study to figure out what I want the rest of the games menus to look like. On the subject of the selection menu, I added the ability to search it. This can be really useful if youve got a lot of mods installed. https://www.youtube.com/watch?v=YPIohAjnDFM Pick Component I added a new shortcut for managing your hotbar called Pick Component. Middle clicking on a component in the world will add that component to your hotbar if its not already there and select it. https://www.youtube.com/watch?v=Y1BEQJxTx5s Not shown in the video is two more advanced features of Pick Component. If you hold ctrl when you press the button, the picked component will replace the component in your currently selected hotbar slot, rather than adding a new one. Conversely, if you hold shift, the picked component will be inserted at the position of the currently selected hotbar slot, rather than being inserted at the end of the hotbar. Rounding In Logic World, the position and rotation of objects in the world are stored as floating point numbers. This makes them very performant, but floating point numbers have a disadvantage: they are subject to rounding. If youre a programmer and youve worked with floats before youve probably seen them have a value of 0.99999823 when they should just have a value of 1. This tiny amount of rounding is usually no big deal, but in logic world the errors were accumulating over time. Particularly in worlds where you have deeply nested chains of boards placed on other boards, the position of objects could sometimes be off by a noticeable amount.
Notice how the inverter in this picture is slightly offset from the grid. To fix this, Im now rounding the position and rotation of every object in the game: positions are rounded to the nearest millimeter (along all 3 axes) and rotations are rounded to the nearest tenth of a degree (again along all 3 axes). This extra rounding is too small to be seen in-game unless youre looking closely, but its big enough that it cancels out any errors we get from floating point shenanigans. Everything in Logic World is now exactly where it should be. Numeric Component Types Each component in Logic World has a type. There are Inverters, Delayers, and XOR gates, to name a few. Before this week, component types were stored internally as pieces of text. That meant that, depending on the length of the type name, component types could take up 15 or even 20 bytes! Now, however, Ive refactored the system so that component types are all stored as two-byte numbers. Each save file has a unique relationship between component types and the numbers. For example, the number 18 might represent an XOR gate on one save file, but it might represent an inverter on another save file. This means that mod authors dont have to make sure theyre not using the same number as another mod when they add a component type; the game will automatically give them a number that is not already in use by the save file. As a result of this, save file size - and by extension, the time it takes to save and load the game - has been reduced by about 20%. The amount of bandwidth used when playing online has been similarly reduced. Board Resizing Bug Fixes If you watched the previous two videos on Board Resizing, you probably noticed that there was an annoying visual flicker whenever the board was resized. Ive fixed that and board resizing is nice and smooth now. Previously, if you resized a board that had components attached to it, the position of those components would get screwed up. This is because behind the scenes, resized boards are changing their position, and the attached components were not properly taking this into account. Ive fixed the math and it all works nicely now.
Felipe (aka pipe01)
This week I wanted to polish out some things that I had left out on the website, those being emojis not rendering correctly and user pages not working. Whenever you inserted an emoji into a comment or a post itd show a
?
instead, which made me think that there was some encoding issues. I began investigating the database and found that they were being stored as question marks there, so the problem was in the database. I set the collation for all tables to utf8mb4_general_ci
and tried again, and emojis were working properly now! I also fixed user pages requiring you to be logged in in order to see them, it was an easy fix.
On the game side, Ive implemented synchronous RPC calls. Before this, whenever a mod called an RPC method it would be a fire-and-forget situation, where the mod had no way to know whether or not the server had received and processed the call. This is probably enough for most things, but there may be some cases where this is undesirable. Synchronous means that the mod code will now wait for the server to send back an acknowledgement before continuing execution, which allows for more complex synchronization between clients and server!
On the topic of waiting, Ive added a loading screen for mods. Mods were being loaded in the main thread, which meant that the screen wouldnt update until all mods were loaded. This worked fine, but it didnt allow for any graphics in the meantime. Now, mods are loaded in a separate thread, allowing the game to monitor the loading and inform the user!
---------
If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to wishlist Logic World on Steam, join the official Discord and follow @LogicWorldGame on twitter.
See you next Wednesday!
View this post on logicworld.net.
https://store.steampowered.com/app/1054340/Logic_World/
Welcome back to Logic World Wednesdays! Before we begin, wed like to share an exciting milestone with you: a few days ago, Logic World passed 1,000 wishlists on Steam. Thank you - all 1,000+ of you - so much for your support!
Jimmy
I started off this week by polishing the Board Resizing mechanic I showed off last week. If youre not familiar, the main construction element you use in Logic World is circuit boards. Board Resizing allows you to edit the size and shape of boards that have already been placed in the world, which makes building stuff a much smoother experience. Here are the improvements I made this week:
- added diagonal arrows
- holding shift while resizing diagonally snaps the shape to a square
- added checks to prevent resizing the board into an invalid position
- board arrows will be disabled if you cannot resize at all in that direction
- redesigned arrow appearance
- you can now see and interact with the arrows if theyre occluded by something
- you can now click any part of the arrow and it works correctly
- some arrows now smoothly animate into position rather than snapping
I want that to never happen with Logic World, so Ive started a project called EveryGlyph which aims to render, well, every glyph.
EveryGlyph uses Google's Noto project for glyph geometry. Noto is a set of fonts for every language that are all consistently styled with each other. Its a really cool project and Im quite grateful that Google lets everyone use it for free. To actually render those fonts, EG uses Signed Distance Field - or SDF - Text Rendering. This is a technique developed at Valve for Team Fortress 2. SDF makes the glyphs look smooth no matter what size they are.
EveryGlyph will be used in Logic World to render text on labels, in the games menus, and in the game chat, which will let you send messages to other players on the same server. No matter what language you speak - or what unconventional emoticons you like to use - all your characters will display properly. Next week Im going to add emoji support to EveryGlyph. An inside source told me that kids these days like emojis, and this is my plan to make Logic World appealing to them.
Felipe (aka pipe01)
As you may remember from the first LWW, mods are divided in client and server side parts. This means that some code is running on the server while some other code runs on the client. RPC (Remote Procedure Call) is a form of Inter-Process Communication that allows the server to call a method on the client, and vice versa. This is accomplished in LW by using my ClassImpl library, allowing the component on the client to not even know what RPC is and still be able to communicate with the component on the server. This week Ive been working on greatly optimising the performance of the creating of RPC client/server instances. Ive managed to improve times by a factor of 10! This is really important because every component which contains custom data uses an RPC instance. By drastically improving the performance of creating those instances, I've also drastically improved the loading times for large worlds. -------- If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter. See you next Wednesday! View this post on logicworld.net.
Hello and welcome back to Logic World Wednesdays!
Jimmy
Due to some personal life events I took a break from working on Logic World. This is why there wasnt a blog post last week and why todays post is a day late. I am back at it now, though, and Im excited to keep improving this game. Ive been working on a feature that Ive wanted to work on for a very long time: Board Resizing. All the structure in Logic World is made up of circuit boards. They are the base upon which you build circuitry. And now you can change their size after youve placed them, using lovely world-space UI. https://www.youtube.com/watch?v=OqeBxbnxRto Ive also spent a good deal of time tracking down a particularly elusive and annoying bug. I still do not know the bugs cause and solution, but hopefully next week I will have figured it out and I can give you a detailed writeup about it.
Felipe (aka pipe01)
This week Id like to talk about the logicworld.net website itself. Im afraid Im going to use technical jargon this time, but I enjoy when I get to know how things work deep down so Id like to give you that sort of experience. The website was at first written using ASP.NET Core for the backend and jQuery for the frontend, however this stack was quickly running short of space to expand (mostly due to jQuery) so I decided to make the switch to using the same backend tech but with Vue (and TypeScript and Webpack and all of that) for the frontend. This allowed much quicker iterations (although ironically the Webpack build times took much longer) and, most importantly, more reusability and modularity through the use of Vue single-file components. This meant that new features could be added to the site without giving much thought to how it affected the rest of the pages. In order to connect the backend and frontend though, Im using a Visual Studio 2017 extension called TypeWriter. This extension allows you to write TypeScript templates in .tst files that transform C# classes into TypeScript files. This is absolutely amazing since now I only need to write C# code, which will get transformed into the TS code I need in order to use it from the client-side. Currently, ASP.NET Core API controllers are being transformed into TS files that use the axios library in order to send a request to the server. This is an example of a generated endpoint:
import http from "axios"
export async function postPost(model: Logic_World.Models.ViewModels.NewPostViewModel, id: number) : Promise { return (await http({ method: 'post', url: "/api/forum/{id}/post".replace("{id}", String(id)), data: model, params: null })).data;
}
This has been generated from the following controller method:
[HttpPost("/api/forum/{id}/post")]
[Model(typeof(Post))] //This indicates what type of object the endpoint returns on success
public IActionResult PostPost([FromBody]NewPostViewModel model, [FromRoute]long id)
{
...
}
Im also using this technique in order to create simple TS models from C# classes, as you can see with the Post and NewPostViewModel types.
All of this means I no longer have to worry about writing bridge code between the back and the front end, and instead its all generated for me as soon as I hit Control+S.
Although, this has one big drawback: you must use Visual Studio 2017. It would probably be a much better experience if it was integrated into the .NET build process, but alas its a VS2017 extension which means that you must have it open in order to apply any changes youve made. I would still 100% recommend this extension if youre working on anything related to this; it doesnt even have to be web-related.
So, I hope you were able to follow through. I promise next week it will be more interesting and less tech-loaded.
If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter.
See you next Wednesday!
View this post on logicworld.net.Welcome to the very first Logic World Wednesday! Each week, we will be sharing our progress on Logic World. This blog is going to be a mix of technical and non-technical discussion.
Jimmy
This week I added a feature I call multi-wire placing. In Logic World you create wires by clicking on two pegs to connect them. Often, however, you need to create many wires going in the same direction; think data busses. This can become tedious very easily. One of our goals with Logic World is to make building as non-tedious as possible. Thats where multi-wire placing comes in. With MWP, you select two groups of pegs, and connections are created between the groups in the order you selected them. This is kind of difficult to explain with text, so heres a video showcasing the mechanic: https://www.youtube.com/watch?v=6P6E4Sj5qMs I also added Exclusive Inputs. Normally, inputs in Logic World can both receive and propagate signal. But this can be undesirable; if you have several wires feeding into an input, you might not want signal to travel between them. Every input in Logic World can now be toggled between exclusive and non-exclusive mode. In exclusive mode, inputs can only receive signal - they cannot propagate it. This allows you to make complex circuits very space-efficient, since you no longer need to build special gates where you only want the signal to go one way. https://www.youtube.com/watch?v=03dJFo5qYQw If youve been following Logic World for a long time, you might remember me talking about Multi-Wire Placing and Exclusive Inputs in the past. I had both of these features working in October of last year. In November, however, we scrapped almost all of the code wed already written for LW. The game was rebuilt from the ground up in a completely different way which is much more performant and which allows for multiplayer. So this week I re-implemented multi-wires and exclusive inputs under the new system. Finally, Ive been working on a longer form video that shows off the performance of the game. Its called Counting to a Billion in Binary - look out for that later this week.
Felipe (aka pipe01)
Id like to introduce you into some concepts of the modding system. For the first ever edition of LWW, Ill give you a quick overview of how the modding system works and how it doesnt. First of all, mods can contain both code (component logic, like what a component should do when one of its inputs gets turned on) and other assets (how a component looks like, etc). Inside the code part of the mod there is another separation: server and client code. Server code handles the aforementioned component logic, while client code controls how the component looks to the camera (Should it change color? Should it grow legs?). These two parts can also share some simple data structures, for example to store how many legs it has. On a more technical remark for those of you that do the code, this data is represented as a POCO (Plain Old CLR Object) in both the client and the server, which means that the synchronization of this data between both sides is completely transparent to the modder, making it extremely easy to add custom states to components. Components declare their data through a C# interface, which gets implemented at runtime using a handy library I wrote specifically for this called ClassImpl. Separate from the code and inside of the previously mentioned mod assets are the component definitions, contained in a SUCC file in the mod package. This format is the exact same one we use for the stock game components (like the inverter), so you can be sure that youll be able to do everything the existing components already do, and even more! Here youll define the shape of a component and the code behind them, as well as how many inputs and outputs it has and where they are positioned. This gives you flexibility to create cool and odd-looking components with as many inputs and outputs as you want and that behave exactly the way you want them to. For example, heres the SUCC section for a regular inverter:
Tung.Inverter:
column: "Logic"
prefab:
blocks:
- Standard
inputs:
-
position: (0, 1, 0)
outputs:
-
position: (0, 0.5, 0.5)
rotation: (90, 0, 0)
startOn: true
logicCode: Tung.LogicCode.Inverter
placingRules:
GridPlacingDimensions: (1, 2)
Thats all for this week. If youd like to receive an email each time we post one of these blogs, you can sign up for our newsletter. Be sure also to join the official Discord and follow @LogicWorldGame on twitter.
See you next Wednesday!
View this post on logicworld.net.Logic World
Mouse Hat Games
Mouse Hat Games
2021-10-22
Simulation Singleplayer Multiplayer Coop
Game News Posts 106
🎹🖱️Keyboard + Mouse
Very Positive
(269 reviews)
https://logicworld.net/
https://store.steampowered.com/app/1054340 
Logic World - Linux [1.75 G]
Key Features
- Digital Logic - Build circuits that work the same way real world computer chips do.
- Challenges - Solve puzzles from simple logic gates to complex machines like calculators and data storage.
- Multiplayer - Logic World is built from the ground up for collaborative multiplayer. Take on Challenges with your friends or build together freely in Sandbox mode.
- Performance - Build massive circuits and simulate them at thousands of updates per second - all without lag.
- Modding - Logic World features powerful modding tools - the same tools the developers are using to make the game.
- Online Hub - Players can upload their builds, mods, and custom challenges and share them with other players.
- OS: Ubuntu 14.04
- Processor: 2.4GHz Quad CoreMemory: 8 GB RAM
- Memory: 8 GB RAM
- Graphics: Intel HD Graphics 4000 or AMD Radeon R5 series
- Storage: 2 GB available spaceAdditional Notes: system requirements might be adjusted before release
[ 5951 ]
[ 3198 ]