At the end of Part 4, I mentioned that the next step was a GUI. I'm working on it! Integrating that code into the demo is a large project and will take me a few days. So I thought I'd talk about my future plans and ask you what the next step should be.
I don't really want a centrally-controlled world where the designer decides everything about the style of play. Also, I can't afford to run a server farm and support a million users. And I don't have the artistic or game design talents to build a world-class game anyway. So my idea is to make the world peer to peer and allow in-world programming and design. Then it can expand and change based on what people want to do there. Think of a peer to peer Lego Universe, with an editor for creating new block types, and a programming language which would allow you to add games or applications to the world.
If you are going to have random programmers adding code to the world, the security has to be really tight. Otherwise someone could pick up a virus just walking by a rock that has evil code attached to it. So every piece of code has to run in its own virtual machine.
It was all very slow compared to a real VM with JIT (just in time) compilation, but surprisingly, it was fast enough to write simple demos in. I gave the VM some 3D graphics primitives and put together a simple world. You can see a video of that in Figure 1.
Remember the point of this is not the crappy graphics. The point is that it's an application written in my own programming language, running in my own Virtual Machine.
My plan at that stage was to write a real VM, finish off the programming language, then build a world and server. Unfortunately, when I showed what I had done to friends, no one was very impressed. They all focused on the crappy graphics and told me there was no way for one person to write a competitive game any more, let alone a multiplayer world like I wanted to do. So I dropped it.
As I mentioned in Part 1, when Minecraft came out and was a huge success, I thought that perhaps there is still room for something that doesn't look like a million dollars. Plus, I'm retired now and can waste my time on hopeless projects if I like!
I've been coming at this from the other direction this time -- implement a simple world, and then add programmability and so on later. After I get the GUI code working though, I have a decision to make about direction.
Direction 1: Imitate Minecraft
I could continue to imitate Minecraft. I'd need faster world rendering, a larger world, a lighting model, some additional bits of graphics for things like creatures and breaking blocks, etc. Then a multiplayer mode.
I have no real interest in doing that. Minecraft does all that, and there's no point in just imitating it. Of course, some programmers would probably like a Minecraft-like shell which could be used to implement other games. That's how I introduced the project to you, and it's worth doing. There's no reason why you couldn't implement block-style adventure games and so on, and this code would make that a lot easier.
Pros: Not too much more work (a couple of months for a really solid implementation). A "Minecraft game engine" would be useful to other programmers.
Cons: Derivative and boring to me. A lot of people will just call it "that Minecraft ripoff" and want nothing to do with it.
Direction 2: A Peer to Peer World
The thing that will make this project interesting, if I can get it to work, is implementing a peer to peer world that can grow without limit. From a development point of view, this strikes me as a good next step. I would have in place the first version of all the modules -- a client which renders the world, a modifiable world, and a peer to peer server. Even if all you can do is pile up blocks and chat, it would be a fun experiment and perhaps get a group of people interested.
Pros: It would be good implementation strategy to work on the hard, interesting problems first. With all the basic modules complete, I know the scope of the project and can prioritize. I'll have something that works, and I can revise all of the pieces to make them better. I can get a feel for whether the project as a whole makes sense.
Cons: There's not much to look at yet, and not much to do in the world. I ran out of steam on this before because I spent too much time on internals and not enough doing something people could use. After six months with no feedback, I was getting burnt out on it, and the first serious criticism killed the project.
Direction 3: A More Interesting World
I chose a simple block world for three reasons. It was easy to implement -- much easier than any other kind of modifiable world. Second, blocks were popular due to Minecraft, and Notch proved that block worlds can look very nice. But most importantly, blocks are not intimidating.
If you look at any other 3D game and think about adding your own buildings or characters, it's overwhelming for a non-artist. The tools are hard to use and hard to understand, and everything a novice does probably looks like crap. But everyone knows how to play with blocks!
Even if someone else builds a nicer fortress or bridge or giant snow globe, you can see exactly how it's done. You could even take a screenshot and go back to your own spot and do something similar. That's just not possible with some mesh-based 3d-modeling tool in the hands of the average user.
So I want to keep that aspect of the world -- easy construction out of small pieces. But I don't want to stick to cubes for all the objects in the world, and I really don't want a cube-based landscape.
In Minecraft, it makes sense for everything to be cubes. You are mining for raw materials and constructing your buildings out of what you mine or craft. It's also part of that cute, low-res retro look the game has. But it has its limits. It's also the signature style of Minecraft, and I know if I stick with it, I'll be that "Minecraft kind of thing" forever.
For my world, I would like a smooth landscape, with plants and trees rendered at least to World of Warcraft quality. Buildings can be made of blocks, but I'd like to add more shapes and allow the user to create new blocks with imported graphics. And I need do something more interesting for avatars (more on that below.)
The world also needs to be lit properly, and I have to work on the graphics performance issues if I want to support a really big world with segments that are paged in and out as you move around.
So Direction 3 is to work on all of that. Get the world looking the way I want it to look before I support multiple users and other features. And give it a unique look so that it's not just "a Minecraft world."
Pros: This is probably more interesting to my current readers, and it's easy to comment on, since it's very visual. I'll probably get more testers for the demo if you can build interesting things with it. Systems programming isn't all that exciting to watch... Plus, if I concentrate on server internals for weeks, I'll lose the attention of my graphics experts.
Cons: I don't know much about 3D graphics, and these rendering issues are endless. I could spend a long time working on a nice looking world, and not get anywhere on the overall project. I have ideas on how to implement the server, but they are more "vague intuitions" rather than designs at this point. If I put that off too long, I might run out of steam before I do the important parts.
Direction 4: An Avatar Editor
Even if I implemented a server and kept the current world, the avatars are embarrassing. I just have these little popsicle green guys. No one is going to want to explore a world where all the people look like that! So I should add an avatar editor. This isn't just a distraction either. I have an idea I want to try.
I am imagining an editor where you can put together a skeleton. Each piece of the skeleton (head, arm, leg, etc.) is a little coordinate space which contains objects. As I understand it, this is standard. Character animation in games is done by moving that skeleton, and the attached graphics, which render the arms, leg, head, etc. are carried along.
What I am thinking is that instead of mesh-based polygons to make up the arms, etc., I just allow more cubes. The object attached to each part of the skeleton would be a scaled down version of the terrain. So you could build your head out of blocks, the arms out of blocks, etc. If I allow you to add any color block you like, you have enough flexibility to do something cute. Later, when the world supports more shapes than just cubes, so would the avatars.
Pros: This would at least be different from Minecraft, and might be a reason for people to try the demo (very few of you are downloading it now.) It's something I want eventually anyway, and it's not a huge project. I have enough graphics infrastructure already to implement this.
Cons: It's not an important part of the project, it doesn't make the world look any more interesting, and it won't hold the attention of any graphics experts.
Direction 5: A Programming Environment
Aside from the peer to peer server, the other novel thing about this project is a good in-world programming environment, running in secure little VM instances. I'd like to have support for cooperative work too, so that multiple people can work together on a game or application. There are lots of UI issues to solve there, on top of the security issues of implementing a secure virtual machine. Programming language design is also interesting.
Pros: This would add another big piece to the project, and reuse all my 2005 code. Since that was a lot of work that's been rotting away on my disk for five years, I'd like to get it back into use. It's also an interesting project and might make the system more unique.
Cons: None of my current readers will care much, and the graphics guys will leave. It would take months to get that all into shape and finished off (especially writing a JIT interpreter), and afterward, the demo will still look like an half-hearted attempt at Minecraft.
My inclination is to do an avatar editor, then a better looking world, then a peer to peer server, and then add programmability at the end. Then lots of revising and improving, for as long as I can manage. I'm not set on this order though, so please comment.
Some people complained that comments didn't work correctly last week. I complained to Disqus, but got no reply. If for some reason comments don't work again, email me at
blog comments powered by Disqus