packbat: A headshot of an anthro bat-eared fox - large ears, tan fur, brown dreadlocks - with a shiny textured face visor curving down from zir forehead to a rounded snout. The visor is mostly black, but has large orange-brown ovals on its surface representing zir eyes. (batfox visor)
packbat ([personal profile] packbat) wrote2022-04-14 10:15 am

[a circle made of arrows] devlog

We made a game for the Black and White Jam #8 game jam! Click through if you want to play it!

[a circle made of arrows] logo: the title on top of, quite literally, a circle made of arrows. In parentheses below: by Packbats.

It's fun! Very abstract-strategy spatial-thinking planning-ahead-y - it goes well until it doesn't, in our experience. Content warning for blinking - it can be kinda disorienting.

Anyway, we're gonna talk about it a bit.


So, like, we had other plans before the jam started, but for reasons we had to start over with a new idea on the second day ... and we remembered a thought we had related to the theme, "Loop": a board on which you placed arrows, trying to complete circuits for points.

So we drew some initial sprites -

a bunch of arrows - single-headed, double-headed, and bent

- and got to thinking.

...this was a very new game dev process for us, I feel - or it felt new. Less weighty, less stressful, more casual. We would do some work, leave, let thoughts bubble up in our head for a while, then follow our best plan based on those thoughts the next time we sat down to work. We didn't do any programming that first (second) day, we just went to bed, and the next day we got to work -

--scratch code

const_w,const_h=9,9
const_cursi=(const_w+1)\2
const_cursj=(const_h+1)\2

const_side=9
const_sidem2=const_side-2
const_dxy_side=(const_side-8)\2
[...]

- and made the initial code to draw a board and put tiles on it. (Hidden for animation.)

The program draws a grid, speckled with dots, that has a bunch of arrows on it, and also draws a cursor moving around and placing a couple more.

Predictably, very little of this "scratch code" was discarded - we would replace the comment five days later, but there was only really one place where we threw away a chunk of work to start over, and it had to do with the loop code.

Our initial, purportedly simple plan was to make a table for each loop and trace it around the board from there. When you placed an arrow, a loop would start forming from that arrow, tracing through each arrow it pointed to until it reached a square already in the loop - and then that loop would clear.

...the problem with that was: you could just send multiple lines into the same loop and score the same loop over and over and over again. And that's just not fun. It doesn't make sense it our head, and it doesn't look right on the board.

And actually, thinking about how it looked on the board is how we got around it: instead of tracing loops as they build, we would simply record board state and detect loops when they complete.

Which, well. "Simply" is generous when it comes to any of this loop stuff.

(on Discord:) us, drawing two-headed arrows: ha ha, this is great! / us, writing code that works with them: aw, crap / (our tracing-loops algorithm is, whoof, gonna be a little tricky)
(on fedi:) writing this game has been an absolute ping-pong between: - pleased surprise at how much we're getting done for how lackadaisically we feel like we're working / - idly thinking about bits of the project while doing other things / - pride at the good job we're doing / - impostor syndrome about the good job we're doing / - experiencing one (1) hiccup and trying to weather the bouts of stressing out until it's resolved // this is that last one, absolutely
(again on Discord:) ...our program crashes if a loop is created including a double-headed arrow where the negative end points at nothing / but we're close

...well, we got there.

It kind of ended up being a weird hybrid of both approaches, really: the game operated purely on the board state until a growing line reached an already-activated square, at which point calculating the list of looped squares began. And we did manage to make the double-headed arrows work, and also make spinners work (which is what the bent arrows are).

We even finished our four planned BGM tracks. And made a title screen and a game-over screen.

The board is full and a box on top of it says "Game over! x/o Return to title". The top shows this is level 59 and we have scored 17960 points.

It was a lot of work, our wrists hurt after, and there's a lot about it we're dissatisfied with ... but damn, we made a game! We made a jam game! And it's fun!

Like, really, this is something we'd already figured out: our best shot at making something is to make something we'd want to play, and that's what this is: a game where you can turn the music off (it's in the pause menu, hit Enter or Esc) and occupy your eyes and fingers while a podcast happens.

And we'll go back to it, eventually, and add a tutorial and a music volume control and suchlike. But for now we're proud.


Post a comment in response:

If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org