Going to share what I'm working on, the current status, and my deliberations on what to work on next. This is so that:
- I remember what I was thinking
- I can gain the clarity of thought that comes with written communication
- this might benefit other people
- other people can offer their input
What I'm working on might be described as a multiplayer game, though emphasis on "multiplayer" not so much on "game." I belong to an art co-operative that in pre-pandemic times had a gallery space in which we hosted party-like shows with all sorts of art and even live music. So the "game" I'm working on is my attempt to replicate that virtually. Visitors access it through their Web browser, creating a name tag and choosing their avatar. Once they've done that they're dropped into the virtual gallery. This is about as far as I've gotten. To be exact, "choosing an avatar" for now amounts to choosing what texture is applied to a spinning cube with your name attached to it. When other visitors arrive, their spinning cubes appear alongside yours, at a random position so they don't overlap. It's very prototype-y.
In my vision for this thing, this virtual space is three-dimensional and viewed in first person. It allows visitors to move about, interact with art pieces, listen to music, chat with other visitors. In this virtual space, everything is happening in near real-time, so it should approximate the feeling of being at a real art show, as much as any virtual space can at least.
Above I mentioned being able to chat with other visitors. By that I mean at least text chat. Eventually I'd like to support voice and video chatting too, sorta similar to Topia, except I might like to give visitors a more explicit mechanism for joining and leaving conversations than mere proximity.
To give one example of how visitors would be able to interact with art in the virtual space, say there's a video being shown on a wall. When they're within a certain distance of a video and hit the "activate" keybind, they'll be able to see the video from the optimum angle and distance.
The features above would be the table stakes for a virtual art show. Once that's done, there's more imaginative things that could be done, especially given that this is virtual. For instance, we could design and implement NPCs that, say, act out a play, perform a dance, or engage visitors in text based conversations. Or any kind of art piece with sophisticated interactivity. Some interactive element in the gallery could send visitors on a secret quest that takes them around the entire gallery and perhaps in to some hidden areas. This is just the beginning, if I'm letting my imagination run wild...
But now to take stock of where I am at the moment. I have some tech debt to deal with. First of all, the way I have it implemented right now, closing the browser means you've left the show, and just before the window actually closes, the code in the browser sends a message to the server indicating that this visitor left. To be exact it sends a diff message with a remove entry with just the visitor's own entity identifier. The issue with that is if there's an error in the client, the server may never get the message and the visitor's entity is left there, forever frozen. If I want closing the browser to mean leaving, I suppose I should have the server remove the visitor's entity when the connection closes, because the server always knows when a connection closes, though I should perhaps build in a delay so that intermittent connection issues aren't interpreted as visitors leaving.
But there's another design that avoids both of these technical complications and possibly yields a better user experience. That is, only considering visitors as gone when they either explicitly sign off, or after their entity hasn't been updated in X amount of time. It doesn't seem like a huge technical effort to support this. Would just need to extend how I'm storing entity data on the server to include timestamps, then have a process that periodically checks those timestamps and removes expired entities, sending the necessary diff to update the clients.