DCSquares for Playdate

With the news that Playdate group 4 will finally start shipping soon, I’ve spent the weekend porting DCSquares to the #PlaydateSDK.

DCSquares was originally released as a homebrew game for the SEGA Dreamcast in 2004, and has been ported to various other platforms over the past 20 years.

Here’s a sneak peek of a very early prototype running on the Playdate simulator. The original game relies heavily on colors, so adapting it to a monochrome display was quite a challenge!

Lua 5.0 in DreamZZT

ZZT-OOP is fine for simple scripts, but it’s very dated and not very powerful. Starting with DreamZZT 3.2, another scripting language will be available in addition to ZZT-OOP: Lua 5.0. Lua supports functions, variables, and file access, among other things.

Creating a Lua object using a 3rd party editor is as simple as creating a ZZT-OOP object that executes “#become lua”. DreamZZT will then run everything past that line as a Lua script instead of ZZT-OOP. Of course, if DreamZZT ever gets a text editor, or if someone adds the Lua object type to KevEdit, you’ll be able to create Lua objects directly.

Here’s a simple example of using Lua from within DreamZZT:

@Luatest
#become lua
function main()
wait_for_message("touch")
set_msg("Here, the player, have some health")
zzt.status.give_health(20)
end

And a more advanced example that handles more than one message:

@Luatest
#become lua
function main()
local msg = nil
local them = nil
while true do
while (msg == nil) do
coroutine.yield()
them,msg = pop_message(me)
end
if(msg == "shot") then
set_msg("Ouch! I was shot by a " .. them.name .. "!")
end
if(msg == "touch") then
set_msg("That's my purse! I don't know you!")
end
end
end

Note that you must call coroutine.yield() inside your loop to pass control from your script back to the game engine. The set_msg(), move() and wait_for_message() functions automatically call coroutine.yield() for you. Also note that the Lua implementation is using a message queue, so you don’t have to worry about locking and unlocking your objects like you do with ZZT-OOP.

For a more complex example, I’ve rewritten the DremZZT Tutorial in Lua, which you can view here. You can compare it to the original ZZT-OOP code to get an idea of what the new functions do. You’ll also notice that Lua has full access to the TUIWindow class, so you’ll be able to use text entry fields, check boxes, etc. from inside your games.

The Lua interpreter and updated tutorial are in the svn trunk, however saved games containing Lua objects created on PowerPC Macs are not compatible with other platforms and vice versa, due to how that CPU stores data. This issue will be resolved eventually, but right now just don’t transfer saves between PowerPC Macs and the rest of the world 🙂 For information on checking out and building DreamZZT from svn, see Building DreamZZT from Source.