Alpacas in Balaclavas

this year i co-hosted a GGJ site in Flensburg again, and it was pretty fun!

during the jam, I worked on a small typing/heist/dating game, where you mask or unmask your true feelings for your lifelong partner in crime <3

before I get into the development, you can play the game over on itch.io!

ideation

to be fair, i'd been thinking about working on a typing game recently. when during ideation to the theme Mask someone pointed out my partner's alpaca shirt, and we started listing funny game titles, Alpacas With Balaclavas veeeery quickly stuck. it's just fun to say!

silly names are for silly games, so we had a few ideas:

the script

one neat consequence of having to type our your answers is a deepened connection to the things your character says. It also meant we could get away with a shorter script length since progressing through the script takes a bit longer than just choosing answers by clicking. what we also found really charming was the possibility of making jokes through the mechanic: it's easy to call a cop a pig, but being sarcastic and having to type 0h 1s Th4t 4 n1C3 pOl1c3 OfF1c3r? makes for good, practical jokes. There were a ton of variations on making answers harder to type which correspond to ways you could talk, so that was a really fun part of the script writing process.

typing gameplay

the neat thing about all of this? implementation took two minutes, i expected input for this to be way harder! check the code below, which already includes handling backspace:

func _unhandled_key_input(event: InputEvent) -> void:
	if event is not InputEventKey:
		return
	if event.is_released():
		return
		
	var keyEvent = event as InputEventKey;
	
	if keyEvent.keycode == KEY_BACKSPACE:
		key_erased.emit();
		return;
	
	var keyTyped : String = PackedByteArray([keyEvent.unicode]).get_string_from_utf8()
	
	if keyTyped.is_empty():
		return;
		
	key_typed.emit(keyTyped)

all that was left was to connect the signals to some entity which would select what text to type, or to select one of the options on screen. that meant we needed to be careful to have each option start with different letters, which is pretty easy but we still managed to sneak in at some point.

the fun part for me was figuring out font styling. i wanted to try my hand at some shader effects for typing. but in the end (and even in the post-jam version) I think it's currently not really possible to differentiate individual letters in a shader. this might be a good opportunity to open up a feature request on the godot repo, as there is still some functionality there. you are able to differentiate characters using INSTANCE_ID in a shader, but this quickly breaks down once you have different rich-text blocks. in our game, typing the words turns the letters bold, so the first letter of the bold segment shares an instance id with the first letter of the regular font. a bummer, but at least I managed to do some animation on the typables!

the text "alpacas in balaclavas" bobbing up and down in a wave pattern
notice how not the letters themselves are bobbing up and down, but their vertices instead

in the future i want to go back to this, and find a good solution for juicy text animations!

reception

learning from developing Detective Bobert and the Hunt for Zweck The Ripper, our team shifted focus from trying to create a complex, mechanics-driven game to simpler, experience-driven stories. and I think that's a great approach for a jam! my favourite part of the jam must have been all of the other participants howling at our jokes during the final presentation. other than that i'm really proud of having build a really stable game while making sure the GGJ site is running smoothly. i'm excited for the next jam!