It’s still got a few bugs (the textures aren’t aligned properly) but not too bad for only a day of work and not having written a single line of python before. The next step is to write an exporter, then I’ll finally be able to work on DCBlap levels again without having to boot up Windows to use Hammer. I also wont have to deal with the bugs and quirks that the old map compiler had, so I’ll be able to make much more complex levels.
Here are some interesting statistics from the DCSquares score database:
- Total users that have submitted a score: 373
- Total games played: 50,097
- Total squares collected: 1,042,625
- Total time spent playing: 34 days (note: scores entered through the website do not record a time, so this is actually higher)
- Average games played per user: 138
- Average number of squares collected per game: 38
- Average score per game: 28,235
- Average combo per game: 45
- Average game time: 58 seconds
Players by platform
- Windows: 50%
- Mac: 48%
- Linux: 2%
- Dreamcast: 0% (only 23 scores ever submitted for Dreamcast)
Hall of fame:
- Highest score: DrunkenAryan scored 645,233 points
- Highest combo: spam collected 333 squares in a row
- Most squares: Harryfronman collected 620 squares
- Longest time: jason survived for 16:47 minutes
Hall of shame:
- Lowest score: csp scored 1,002 points (scores below 1,000 are rejected)
- Shortest time: mozza survived for 2 seconds
12 players only collected 1 square but managed to score more than 1000 points.
99% of players use the in-game score client, only 1% of scores were entered through the web.
I completly rewrote the popup text window API today to be much more C++ey, and with it come a few new widgets that can be placed inside: radio buttons and checkboxes.
The title area at the top now shows tooltips, too, like the original ZZT:
The code to construct the above window is:
TUIWindow w("Options"); w.addWidget(new TUILabel("General")); w.addWidget(new TUIWidget()); TUIRadioGroup *sfx = new TUIRadioGroup("Sound: "); sfx->add("On"); sfx->add("Off"); w.addWidget(sfx); TUIRadioGroup *web = new TUIRadioGroup("Online scores: "); web->add("On"); web->add("Off"); w.addWidget(web); w.addWidget(new TUIWidget()); w.addWidget(new TUILabel("Special Effects")); w.addWidget(new TUIWidget()); w.addWidget(new TUICheckBox("Pan between boards")); w.addWidget(new TUICheckBox("Torch gradient",true)); w.addWidget(new TUICheckBox("Animated water")); w.addWidget(new TUIWidget()); w.addWidget(new TUIHyperLink("save","Save settings")); w.addWidget(new TUIHyperLink("cancel","Cancel"));
Much nicer. Of course, you can still construct a popup window the ZZT way:
w.buildFromString("$woah\r this kind of thing gets hard to maintain\r when it's all stuffed in a giant string\r crazy ZZTers.\r \r !agree;I agree\r");
Though you can’t add radio buttons or checkboxes through that. After I finish up the text-editing widget, I’ll start working on adding a very basic level editor to DreamZZT.
Gregory Janson is way too good with ZZT-OOP. I spent the day trying to get Mission: Enigma running on DreamZZT, and it’s uncovered a LOT of bugs and interesting ZZT quirks. The hardest part, though, has been trying to solve the puzzles. Mission: Enigma is pretty challenging, and very well done!
In the process of picking apart Mission: Enigma, I’ve added two more debug commands:
watch – Lets you select an object to watch the ZZT-OOP of. Now the debug console will only display the ZZT-OOP of objects that you’re currenctly watching, instead of every object on the board. Makes it much easier to follow what’s going on!
inspect – Lets you view an object’s entire ZZT-OOP program in a text window.
flags – displays a list of the currently set flags.
Also, since Mission: Enigma’s title screen is so amuzing, I finally got around to letting you actually watch the title screen and press enter to start the game when you’re ready. You can also actually return the main menu again by pressing ESC.
Finally, after putting them off for six years, I had an epiphany last week on how to implement Centipedes! Got them in this weekend and they seem to work pretty well. The only objects still not implemented in DreamZZT are slime, ricochets, and ninja stars.
DreamZZT’s source code is now available under the terms of the GNU General Public License version 2. The source can be browsed or checked out of my public Subversion repository, and is also available from the DreamZZT homepage. In order to build DreamZZT, you’ll first need to build tiki.
To celebrate, I’ve put together the first binary release of DreamZZT in close to 3 years: 3.0.4-beta1. Downloads are available for Windows, Mac OS X (10.4 universal), and Linux. Due to technical issues, builds for the Dreamcast are not available at this time. So head on over to the DreamZZT homepage and grab a copy!
Known issues with this beta:
- There is no menu when you push ESC, just press S to save or close the window to quit.
- There is no file browser, so saved games will always be ‘saved.sav’ and New Game will always load ‘town.zzt’
- The game doesn’t pause when debug command ‘warp’ is executed, allowing debug messages to overwrite the board selection dialog box.
Please report any other bugs either in the comments here or over at the forums.