In case you haven’t already heard, this week we made the difficult decision to postpone Logic World’s release.
We’re sorry about this, but we’ve got our heads down and we’re 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 they’re 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. It’s cute 🙂
Tracker - Felipe
If you didn’t 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 don’t have a way of marking issues as solved. For this reason I have been working on a ticket system similar to GitHub’s 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 I’ve 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 you’re running the game in low quality.
Here’s 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.
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. They’ll 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 you’ll have a lot more Logic World content to look forward to!
Check out the first CPU in Logic World, built by @Mr_IO:
And check out this awesome synchronous program counter from @TheWildJarvi:
Beta testers are often sharing screenshots and videos on the Logic World Discord, so make sure you’re hanging out there if you’re not already. Furthermore, we’ll 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, let’s get into this week’s 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.
More Displays - Jimmy
For a while, we’ve 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!
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 I’ve had a bad habit of ignoring bugs and thinking “oh, I’ll 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 I’d 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 couldn’t actually play the game; mouse input was frozen and no 3D geometry was rendered, among other issues. This week, I’ve 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 didn’t work and we fixed it a different way), but it’s 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 it’s 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.
I’ve 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 I’ve figured out how to hook these generated sound effects into Unity’s 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 they’re no longer able to teleport sound to your ears from hundreds of meters away.
Music Player
I’ve been working on the code that plays the music from Markku’s 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.
I’ve 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 it’s playing. This way, your music contraptions won’t 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 I’ve 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 it’s 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 server’s 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
I’ve 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 there’s an error on startup or while loading a save. Next is the
disconnection screen
, which lets the player know if they’ve been unexpectedly disconnected from the server.
Mac OS - Jimmy
I’ve been fixing up the Mac OS version of Logic World! There’s still some work left to do, but here’s 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.
We’ve got a big Wednesday for you today, so let’s 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!
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. You’ll be seeing more gorgeous skies in future Wednesdays :)
Fake Internet Clouds - Felipe
This week I’ve 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:
Dependencies are built (LogicAPI projects, as well as Lidgren, our networking library).
The Linux version of Unity is installed, as well as the Windows playback engine
Unity is launched, which runs the build itself for the corresponding platform.
The GameData folder -- which contains the base game data like components, languages, etc -- is copied over to the build result.
The integrated server is also built and copied to be bundled with the game.
The resulting build is compressed and optionally uploaded.
(Note: steps 4 and 5 are not yet implemented)
We’re going to start beta testing very very soon, and during beta testing we’ll be building and deploying the game several times per day. So it’s important that this complex task is automated for us.
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 Felipe’s excellent work on the integrated server (you can read more here), this week I’ve 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, I’ve added loading screens and an error screen -- though neither is particularly pretty right now, so I’ll show those off when they are :)
I’ve also added the ability for you to run commands on an integrated server. Everything is now seamless; we’ve 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!
With these hotkeys, I’m opening the selection menu less than half as much as I used to when I play the game. Once you get used to them, they’re 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.
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.
This week I’ve added a very cool new component, called the Relay!
Huge thanks to @TheWildJarvi for suggesting Relays. I can’t wait to see the builds they are used for.
Store Pages - Felipe
As you may know, we’re going to sell Logic World directly from our website in addition to our third party stores like Steam. This week I’ve 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, I’ve 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.
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.
Welcome back to another Logic World Wednesday! This week, in The Shiny Edition, we’re 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 we’ve 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
Completed Integrated Server - Felipe
This week I’ve 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 couldn’t 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 you’ll 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 I’ve added some options for customizing your Bobby. You can now choose bobby’s colors, and if you so desire, you can enable SHINY BOBBY.
We’ve previously talked about including full custom multiplayer avatars. Unfortunately, there isn’t time to include this for 1.0. That feature will be coming in 1.1. Until then, everybody is Bobby.
Settings Menu - Jimmy
I’ve made a ton of progress on the settings menu this week!
Let’s 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
The menu isn’t quite done yet - I’m still working on getting it to generate from code - but I’m extremely happy with how it’s coming along.
Lighting & Graphics - Jimmy
This week I’ve been polishing the lighting setup for the game. In particular, I’ve done my best to normalize the difference between light and dark; I don’t want fully lit objects to be overwhelmingly bright, and I don’t want objects in shadow to be so dark it’s 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.
Pick Up Component is a new building mechanic I’ve added to Logic World this week. It lets you pick up a full component, including any data you’ve edited on it.
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
I’ve been working on Logic World’s settings menu. I think I’ve got a pretty good design for it.
Let us know in the comments what settings *you’d* 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 didn’t put much thought into it. This has now changed. I’ve rebuilt the system altogether and now it’s much more robust and pretty.
If you’re 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 I’ve been working on a few of the open source libraries we’re developing for Logic World. These are chunks of code that we’re 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 it’s better at figuring out what value to load if it doesn’t 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 world’s config_override.succ.[/size]
Finally, I updated Jimmy’s Unity Utilities with all the goodies we’ve added to it in Logic World’s JUU copy. It now has extended support for color names (used in Logic World’s color picker), tools for saving and loading images to disk (used for saved board thumbnails and for the flags in LW’s languages menu), a precise timing class (used to animate Logic World’s 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 isn’t something that will be used in LW, but I’ve been meaning to make it for a while and I’ll definitely be using it in other future projects.[/size]
BobbyBot - Felipe
This week I’ve 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.
As part of my ongoing efforts to make Logic World’s building mechanics as fluid and easy-to-use as I can, this week I’ve been polishing up the mechanics for building with resizable components. You can now directly start resizing something while you’re placing it, and I’ve added a new Drawing mechanic for building with boards.
I’ve also polished up the look of the resizing UI: there’s 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 couldn’t 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, I’ve 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 I’ve 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.
Welcome back to another Logic World Wednesday! We’re back from the holidays, and the push for release is underway.
Checkerboard World - Jimmy
The world you’ve been seeing in the LWW videos has been sort of a placeholder. The ground was completely static, with no customization whatsoever.
This week I’ve 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, you’ll be able to choose the color or colors used and the grid size. It’s worth noting that Logic World will support several different world types, and mods will have the ability to add world types. But that’s a topic for a future LWW :)
Modding API Consolidation & Documentation - Felipe
Over the holidays I’ve 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 you’re typing. We are also going to upload a generated static site containing all of the documentation over at https://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.
Initially these services were written in C# just like the web application is, however, when migrating to Traefik I realised that every single application we were using in the server was written in Go. Go is a language that’s widely used in reliable and widely used software like Traefik, Caddy and Docker. This sparked an interest in Go inside of me, so I spent a few hours learning this new language and rewriting the logger service. This service is the simplest, all it does is receive messages from all the services and log them to the database, so I thought it would be the perfect opportunity to dip my toes in Go. When I was done writing this I noticed that the service was using just a fraction of the memory that the C# service was while being a lot more CPU efficient. To sum up, 5 out of the 7 services we currently have are written in Go.
Don’t get me wrong, I still love C#, however it’s become clear to me that Go is much more tuned towards web server-side software development.
Refined Building Mechanics - Jimmy
I’ve done a pass of our basic building mechanics to ensure they are consistent, intuitive, and easy to use. Most notably, I’ve 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 Minecraft’s building mechanics, back in 2017. But Logic World has grown up a lot since then.
To help communicate the new objective nature of rotation, I’ve 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.