Friday, October 30, 2009


Cutscenes are now possible:

Cutscenes can be written in scripts, so you can have different ones in each map.

See packages/library/1_2/Cutscenes.js for the code and some examples. This is in /trunk, and will be in the upcoming 1.0.3 release.

Thursday, October 29, 2009

Syntensity Celebrates Ubuntu 9.10

If you read this blog then you probably already know that I am a big fan of open source, and of Linux in particular. I'm also an Ubuntu user, so today the Syntensity lobby world is lighting up with fireworks to celebrate the release of Ubuntu 9.10, Karmic Koala:

Log in to the lobby world to see it in person. (The fireworks effect, btw, like everything else is reusable for your own Syntensity worlds. See packages/base/welcome/KarmicKoala.js in your home directory for example code. Note that that file will only be there after you connect to the lobby world, at which point it will be automatically downloaded.)

I've been using Ubuntu 9.10 for a while now, and it was definitely worth the upgrade for me: It feels significantly faster, and also better supports my hardware. Thank you to the Ubuntu people, and all the open source projects that are included in Ubuntu (the Linux kernel, etc. etc.)!

Btw, speaking of Ubuntu 9.10, the nice people at Playdeb have packaged Syntensity for Ubuntu 9.04 and 9.10, 32- and 64-bit.

Tuesday, October 27, 2009

Easier to Run Your Own Server

Some improvements to server setup have just been committed, which make it much easier to run your own server. The improvements are already available if you are running the latest source code, otherwise, they will be in the 1.0.3 release.

The improvements are:
  • Interactive setup wizard, which you can run by adding --wizard to the commandline when you run the server,

    Linux: ./ --wizard
    Windows: intensity_client.bat --wizard

    The wizard will ask some questions and create a settings.cfg for you.

  • You can now tell the server what activity to run in a much easier way. Simply paste the URL to the activity (which you can find on the activities page) into the settings.cfg file, specifically into [Activities] force_activity_id. The server will then autodiscover the activity and the map asset IDs for you. (You can still use an actual activity ID, for backwards compatibility.)
For more info, see the wiki page on running a local server.

Saturday, October 24, 2009

New Lobby

(click for a bigger version)

The default world is now the new lobby, shown above. It has portals to other games, and also an interactive tutorial.

You will enter the lobby if you do 'connect to selected...' (and you haven't selected another world), or if you do 'connect to lobby...' in the latest build (1.0.2, available on the download page).

Live changes and improvements to the lobby will be happening fairly frequently.

Thursday, October 22, 2009

1.0.2 Release

Revision 1082 is tagged as version 1.0.2. A new build for Windows and a .deb installer for Ubuntu 9.10 are on the download page.

This is a minor, recommended but non-mandatory update (which means you can continue to use the previous version - the network protocol has not changed, nor anything else that would be a problem for you). It includes the following:
  • 'connect to lobby...' option in the main menu, for directly connecting to a lobby world (which has portals to other ones)
  • Interactive tutorial example code (that is, a map which interactively teaches you the controls)
  • Better debug traces from JavaScript
  • Various improvements and additions to library 1.2 (Roles/Classes, WorldNotices, etc.)
  • Support for CherryPy 3.1+
  • Support for gcc 4.4+
  • A few minor bugfixes

Sunday, October 18, 2009

Portals and the Welcome World

Support for jumping between worlds was added just before version 1.0. To make it useful, I wrote a 'Portal' class which is basically a screenshot of a world, that when you move into (that is, when your avatar walks into the portal), you are sent to that world. In the screenshot above you can see two such portals, which lead to map2 and sketchworld.

This will be used in the 'welcome world', the first world people encounter when they log into Syntensity. The welcome world will be a map with portals to the most important/popular maps, and will also have an interactive tutorial for learning the controls. The tutorial isn't written yet, but you can check out the portals by doing a manual connection to in the Syntensity client.

Wednesday, October 14, 2009


Two weeks after 1.0, we are now releasing 1.0.1, which adds several new features:
  • New example content: A new, bigger map, and new gameplay elements including homing missiles, rockets, a shotgun, headshots with the sniper gun, nicer jumppads, etc. (It was kind of our goal to see how much new stuff we could add in a short time, as a test of the API.)
  • Script API support for displaying HUD text and images
  • Various minor bugfixes and polish
You can see some of this in our new video:

or better yet, try it out yourself. Note that this is an engine update, so you need to download the latest build,

As always, if you haven't already signed up for Syntensity, you need to do so, which takes just a few seconds. See the links on the main page.

  • If you are copying the new version into an existing directory with the old version, you will NOT get the new keybindings (see next note). It is simplest to just unpack the new download into a new directory. (Or, you can delete syntensity/client/config.cfg, which will then be created from scratch the next time the client is run, and you will get the new keybindings and so forth.)
  • Change weapons with 1-4, or cycle by pressing the middle mouse button. H shows a little help.
  • The homing missiles can only be shot if you are locked on a target (another player). The lock remains for a short while after your crosshair is no longer over the target (a notification appears at the top of the HUD).
  • This is an early release, we will probably adjust the weapon strengths, ranges, etc., depending on feedback (we can push those updates between releases). So, let us know what you think needs changing.

P.S. I was very impressed by OpenShot, the open source video editor I used to make the video. Kudos to the OpenShot team for making a very useful program.

Sunday, October 11, 2009

New Weapons

The second game is almost finished, and it will include several new weapons, a new map, as well as various other features, many of them in response to the feedback we received so far.

You can see the current state of the new game if you run the latest from the source code repo (do a manual connect to Otherwise, binary builds will be available soon. Meanwhile here is a screenshot of some rocket fire:

Monday, October 5, 2009

Updates and Updating

We have a new Twitter account that we are starting to use for real-time updates, things like
  • New features notifications as they go live
  • Server status reports
Speaking of new features, I might as well take this opportunity to explain a little about how that works in Syntensity (and of course the Intensity Engine): We are able to add new features between releases, without people needing to download a new version of the client, since
  • The master server is a website, so adding things like the new map creation wizard is possible just like updating any website.
  • Game content is downloaded automatically using our asset system, which will get whatever content you need. And as game logic is written in JavaScript, this includes entire games, not just textures, models, etc. (but also those, of course).
Aside from the map creation wizard already mentioned, we have been working on adding new weapons, weapon recoil, and fixing some bugs with animation speeds and other minor things. Note that the default map you enter is still the original version of the gk1 map, so you won't see these things unless you specifically connect to a server running gk1_a.

Saturday, October 3, 2009

Server Requisitioning Issues / Logs

People are already starting to requisition server instances, and sometimes there are problems, like if an asset or a script isn't set up correctly. That will cause the server instance to shut down, and an error log is uploaded to the master server - but we don't yet have a convenient interface for non-admin users to view it. So we are seeing the error logs arrive, but sadly they don't get to you yet.

We are working on improving this. In the meantime, if you requisition a server and don't see it start up, this might be the reason. You can do the following:
  • Ask an admin for your server logs, on IRC (#syntensity on FreeNode).
  • Run a local server instead of requisitioning a remote one. You will be able to see exactly what output it gives, which should help fix any problems with assets or scripts.
We apologize for this inconvenience. That's the nature of the early stages of an open beta - problems are found, and fixed. Bear with us :)

Edit: This issue has now been mostly resolved. You can view the last server log on your account page (you must be logged in), by clicking on "View last error log from requisitioned server." So, if you requisition a server and it doesn't appear in the list of servers, check the server log there for what caused the problem. A comment about this has also been added beside the 'requisition' button. We are evaluating ways to make this even easier.

Friday, October 2, 2009

Launch: Syntensity Open Beta, Intensity Engine 1.0

Today we are officially launching Syntensity's open beta, as well as releasing version 1.0 of the Intensity Engine. This brings to a close an intensive year of development, but is also just the beginning for this project.

Instructions for getting started with Syntensity can be found on the main page.

Syntensity's open beta launches with one complete game (the gk1 map, which is an insta ctf-type game that also has some automatic gun turrets). But Syntensity is really more of a platform for game creation, not one or two games that we created ourselves. This initial game is just to show what the engine can do, and also to be a basis people can work from (by modding gk1). We'll be making some more example games during the beta (to show more of the engine's capabilities - gk1 covers only a small part of that), but our main focus will be to help people use the engine to create the games they want.

Regarding the Intensity Engine (the open source project that comprises Syntensity's code), it is now at 1.0. It's basically feature-complete for our initial goals, and decently stable - enough for people to start using it, both for Syntensity and other projects. There are some bugs we are aware of, and testing will probably uncover more, but overall things are in fairly good shape. In the near future we will focus on fixing bugs and polish, later on, there are a lot of engine features on our roadmap.

Thursday, October 1, 2009

Automatic Testing: Client and Server

(This will be a mostly technical post.)

There is a lot of work planned for the engine after the launch of the open beta (which is, btw, just about here), so automatic testing is crucial to prevent regressions. Basically, every time you commit a change, you want to be able to run a completely automatic battery of tests that checks you didn't break anything. So far in the Intensity Engine only the master server had automatic tests for it, using Django's test client. Those tests are actually very comprehensive, and have already come in handy. There are also some unit tests for the JavaScript API. But for the client and server as a whole, writing automatic tests isn't as easy: They don't have nice test setups like Django, and what's more, the client is a GUI program, using OpenGL (if it were using a GUI like GTK or Qt, there would actually be some tools to help out).

The tests/ directory contains what I did so far towards this goal, over the last few days. The test setup uses pexpect, a very useful Python module that lets you communicate with processes, sending them input and checking their output. This, combined with the server's Python console, lets the server be tested in a nice fashion: Start the server in a separate process, issue it commands - for example, check such and such state variable of such and such logic entity - and validate the output. Using Python's unittest module, in each test the server environment (home directory, with downloaded assets and so forth) is created from scratch. So all of this together gives an appropriate way to test the server.

The client was a little harder. First off, I added an option to run a Python console, just like on the server (which took some refactoring of the console code). Then, I had to write bindings for 'injecting' user events. That is, by issuing commands through the Python console, the test runner can manipulate the client as if it were an actual person: Move the mouse, click, press a key, and so forth. This took some time to get working correctly, due to how SDL events behave and how the engine processes them. But it appears to now be working as it should.

Currently there are 4 tests. Each of them starts up a master, a server, and a client, runs a map ('storming') and then does one of the following:
  • Modify a state variable on the client and see that it propagates to the server
  • Modify a state variable on the server and see that it propagates to the client
  • Modify a state variable, restart the map, and see that it returned to the original value
  • Modify a state variable, upload the map, and see that the new value is used
In other words, these are high-level functional tests, and they already cover most of the basics: Starting up the client and server, loading a map in each, network synchronization, and map uploading. In particular, they cover basically what someone starting out with the Intensity Engine would do (if they follow README-standalone.txt). So these tests are a good start, while of course many more should be added over time.

The tests take about a minute to run, what with creating an entirely new environment for the master, server and client for each test, and starting them all. (Also, for some reason the injected SDL events are slower than I would expect.) But it's actually kind of funny to watch the tests running, with the mouse jumping around, clicking and keypress sounds, and so forth. (Although I imagine I will get tired of it soon enough, and just go do something else while the tests run...)