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
---------------------------------------------
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/
[ 2020-10-15 00:10:19 CET ] [ Original post ]