Aroma - The Native Client game engine powered by Lua
leafo.net
leafo.net
It's cool to see Lua in the browser, yes, but it's been there for a while already.
I also am skeptical about LÖVE (what Aroma's based on) being ready for commercial games. I've asked LÖVE supporters what commercial games were built on that platform, and they came up completely empty. Bringing a game to release quality tends to find all of the corners of a library that are not production-ready.
Moai has a number of serious users, though, including Double Fine.
Having used Moai myself I wouldn't really call it commercial quality. The documentation is poor, the code is cryptic, and it tends to crash or do strange things instead of report errors. It also fails to abstract out hardware limitations or notify you of them (for example, it'll let you use 4Kx4K textures and then when you run on a machine with a 2Kx2K limit, Moai just falls over instead of providing clear error feedback or scaling-down the texture.)
Add Wolf Toss, and the WIP Shadowrun Returns. Both DFA [Doublefine Adventure] and Shadowrun should be done by the end of the year.
Regarding the bugs, I'm sure tat they'd be happy to discuss them, but it's night time in Seattle now. You can drop a line at their forums (http://getmoai.com/forums) or the Github bug tracker (https://github.com/moai/moai-dev/issues).
For the documentation, it is constantly improving. The API docs still have weak points, but the high level overview and the (now partly annotated) examples go a long way. You may want to check these pages:
Overview of the runtime: http://getmoai.com/wiki/index.php?title=The_Moai_Runtime
More details: http://getmoai.com/wiki/index.php?title=Moai_SDK_Basics_Part... http://getmoai.com/wiki/index.php?title=Moai_SDK_Basics_Part...
Annotations of the examples: http://getmoai.com/wiki/index.php?title=Moai_SDK_Samples_Gui...
By the time Moai was released, I had already created my own Moai-equivalent C/C++/Lua framework. I've written a game on it already, and one other developer (a company I used to work with who asked for access) is using it, but I haven't released it to the public.
When I discovered Moai I was a bit skeptical about it; they've written all their Lua bindings by hand, which isn't terrible, but they're bound to Lua 5.0...meaning that you can't drop in LuaJIT and have scripts run 3x-100x faster. Since I had my own library already, I decided not to switch.
And their model seems to be (like löve) that you have a monolithic build that just runs Lua code, whereas I prefer keeping the C++ build process around so I can drop into C or C++ easily, adding or removing modules as I need them. For instance it appears they have TWO 2d physics engines as part of the build, along with lots of other libraries that I may or may not need, resulting in 6+ megabytes of binary, while mine comes in comfortably under 2Mb.
Auto-generating Lua bindings makes this easier as well -- if I need to add another library, I just drop it in and run my binding generation script; other than adding any new source files to the various projects, that's it.
But strictly considering löve vs. Moai, I still have to advise people to lean toward Moai.
It made HN a while ago, link to discussion: https://news.ycombinator.com/item?id=3665859
The problem is, while a high-quality freeware game like mari0 does mean that LÖVE does meet the minimum feature set you'd need for a game, it doesn't mean it has the tools or widgets or features you'd need in a commercial game.
For example, does the game render and perform well on all target platforms? For a freeware game, if it doesn't work on some video card, so what. For a commercial game, it means support headaches, lost revenues, and bad reviews and/or user comments.
For more examples, see this thread:
http://www.reddit.com/r/love2d/comments/q0oc1/where_has_love...
Apart from lua, they have nothing in common, different target, different goal. Both can be successful in their own niche.
I use löve for teaching, there is no way I would have considered moai for a first application of my algorithmic course! And frankly, I do not care about "serious users".
If you don't care about serious users, then you're free to choose appropriately. A lot of people do use löve; they must all have their reasons. I don't see how Moai is not relevant to this discussion, though.
People clicking on the comments may be considering writing a serious game; if not, they can play with löve and have fun, but if they are, I wanted to warn them about what I'd found.
Do you have any sources explaining Mozilla's decision on this? I'm curious as to why they would reject it...
I think that they have some private issues regarding a plugin controlled solely by their browser competitor who wants NaCl apps to be purchased through the Chrome Webstore.
PNaCl makes things a little better by using LLVM IR instead of machine code, but one of the LLVM developers has publicly stated that "LLVM IR is a poor system for building a Platform" (http://lists.cs.uiuc.edu/pipermail/llvmdev/2011-October/0437...).
I don't agree with this. From what I've read NaCl isn't even getting auto-run by default. It is not trying to replace JS just sit alongside it as an application language. It lets developers target CPU architectures instead of Operating Systems which makes a lot of sense to me.
Also it's C/C++, any popular app would be easily ported to mobile devices.
Look how far JS has come in 5 years, imagine how for NaCl could have come.
On your PNaCl point, it may not be optimal but I love the idea. "Compile to javascript" is an awful concept, "compile to IR" is better for a number of reasons that I won't go into right now.
Even if it's not trying to replace JS, if it works well enough, a lot of sites will use it to replace JS, whether because they want to add functionality that's not as easy to implement in JS, because they don't want to expose their source, or just because their programmers don't know/like JS. We have already been through this with ActiveX, which was a similar idea, but poorly executed.
> Also it's C/C++, any popular app would be easily ported to mobile devices.
Only if the developers care. There's a chicken-and-egg problem here. If your mobile platform can't interact properly with a large proportion of the web, no one is going to buy it, and so no one will bother to port their site to it.
> "Compile to javascript" is an awful concept, "compile to IR" is better for a number of reasons that I won't go into right now.
Possibly. If you absolutely have to run C/C++ app on the client side, I agree that something like PNaCl (but actually architecture-independent) is a better solution than something like emscripten. But I think it would be even better to 1) run it server side or 2) write it in JavaScript.
tldr: Nacl cannot be standardized, and the relevant API's are too strongly tied to chrome/webkit details to provide a first-class port to Mozilla.
Besides IE, Opera, etc all rejected it as well.
The fact that this time it is from Google doesn't make it better.
We slowly rid ourselves from stuff like Flash and Java on web pages and now we want to make the same mistakes again?
I know, it isn't bad in first place (Flash, Java, Active X weren't either), but I'm pretty sure we'll see better approaches.
NaCl is a platform independent secure code execution environment. It is NOT a way to talk to the underlying OS like ActiveX. Is is NOT a way to write plugins like ActiveX.
It's effectively just another way to write code in a browser like JavaScript. Is has no more or less permissions than JavaScript. It is no more or less access to APIs then JavaScript. It just has 5 to 100x more speed than JavaScript depending on what you are trying to achieve.
The language itself is very simple to learn too.
A few examples:
Strings in Lua are interned, which makes it possible to efficiently use string keys in all sorts of places instead of numeric enumerations.
Lua's garbage collector has support for running incrementally with a configurable pause time, so you can run it in the background every frame to avoid those nasty GC pauses you still get in most modern browser games from stop-the-world collections.
Debugging is built into the language with a user-accessible API that lets you write your own debugger or diagnostic tool, in addition to using third-party ones, instead of having to rely on the vendor to provide one.
Lua uses a single container type for storing data, with an efficient representation (densely packed elements are stored in an actual array; sparsely packed elements and elements with non-integral keys are stored in a hashmap). As a result, operations on sequences/containers only ever have to think about one data type, and you still get the near-optimal performance you would in JS if you manually used Array/Object where most appropriate.
Interning is an implementation detail. I don't know how they are implemented off the top of my head, but string keys are pretty damn fast in most JS JITs, since they're used to get e.g. methods of objects.
> Lua's garbage collector has support for running incrementally with a configurable pause time, so you can run it in the background every frame to avoid those nasty GC pauses you still get in most modern browser games from stop-the-world collections.
Again, this is an implementation detail. Firefox is about to get incremental GC. While the pause time isn't configurable, it doesn't really matter as long as it's short by default.
> Debugging is built into the language with a user-accessible API that lets you write your own debugger or diagnostic tool, in addition to using third-party ones, instead of having to rely on the vendor to provide one.
Gecko and WebKit both have debugging APIs. I will concede that it's a PITA that they're different.
> Lua uses a single container type for storing data, with an efficient representation (densely packed elements are stored in an actual array; sparsely packed elements and elements with non-integral keys are stored in a hashmap). As a result, operations on sequences/containers only ever have to think about one data type, and you still get the near-optimal performance you would in JS if you manually used Array/Object where most appropriate.
Again, this is an implementation detail. In JS, Array is a subclass of Object and in most JITs I think it's implemented the same way. The only difference is how they serialize to JSON and that Array has a length property. Lua has an advantage in that it gives arrays both sparse and dense slots, but this isn't necessarily impossible to do in JS either (https://bugzilla.mozilla.org/show_bug.cgi?id=586842)
Javascript has only been coming to age recently.
Language evolution has been implementation driven more so than say Javascript. As such its been able to reshape itself continually.
Mike's LuaJit is an incredible piece of work.
Its easily extended.