How the game works, and where you can install it

EN: roadmap post. No excerpt lives here - excerpts 1-3 are in the devlogs above.

This post is not a fragment. Excerpts 1-3 of the build code live in the three devlogs above, and nothing new is hidden here. This one is about how the game is put together and where you will be able to install it.

The idea

Most Serius Game Ever is a quest about launching a game. The game does not want to be started: the loader apologises, the menu hides its own buttons, the exit button runs away, a captcha measures your humeness, and the last screen asks for a build code the game insists it never wrote down. Every screen is a negotiation, and the negotiation is the gameplay.

Two rules held the whole thing together. First, no line of text lives in code: every remark comes out of a shuffled pool, so a second playthrough is a slightly different game. Second, the original language is Ukrainian and English is the translation, not the other way round - which is why some jokes had to be rewritten three times to survive the move.

The pool engine

# gags.gd - a pool spends itself, then reshuffles
func next_key(pool_id: String) -> String:
	if not _orders.has(pool_id):
		push_warning("unknown gag pool: %s" % pool_id)
		return ""
	var order: Array = _orders[pool_id]
	var cursor: int = _cursors[pool_id]
	if cursor >= order.size():
		order.shuffle()
		cursor = 0
	var key: String = order[cursor]
	_cursors[pool_id] = cursor + 1
	return key

A pool never repeats a line until it has spent them all, then it reshuffles. That is the entire replayability system, and it costs a dozen lines.

A quit button with self-respect

# refusing_menu.gd - the EXIT button
func _flee() -> void:
	Audio.play_sfx("flee")
	quit_btn.reset_size()
	var x := randf_range(margin, size.x - quit_btn.size.x - margin)
	var y := randf_range(size.y * 0.2, size.y - quit_btn.size.y - margin)
	quit_btn.position = Vector2(x, y)
	_flees += 1
	if _flees >= _flee_limit:
		_quit_exhausted = true

The button is neither disabled nor invisible, it is simply faster than you. After four to seven attempts it gets tired on its own, and the game keeps a timer before it agrees to run again.

Captcha as a fairness joke

# chapter5.gd - rig the grid, then admit it
for i in range(FORCED_MATCHES):
	_tiles[i][attr] = _rule.get("value")
# Without at least one non-match the check would be "select everything".
_tiles[GRID - 1][attr] = _opposite(attr)

That last line is the whole trick: without at least one tile that does not match, every grid would be solved by clicking everything. The chapter is honest about being rigged, which is exactly the point of it.

The endings, and the one that watches them

# endings.gd - the ending that watches the rest
func unlock(id: String, return_path := "") -> void:
	if id == "" or is_discovered(id):
		return
	Save.data.endings[id] = true
	Save.flush()
	if id != "collector" and discovered_count() >= total_count():
		Save.data.endings["collector"] = true
		Save.flush()
		ending_unlocked.emit("collector", return_path)
		return
	ending_unlocked.emit(id, return_path)

There are 11 endings, plus a true ending that unlocks itself when all of them are found. The gallery renders everything still missing as "???", so nobody gets to see the shape of what they skipped.

The newest screen

# chapter6.gd - the build code field
func _on_submit() -> void:
	var value := code_edit.text.strip_edges()
	if value.to_upper() == _stamp_code.to_upper():
		Eggs.unlock("build_stamp")   # not the prize you think this is
		return
	if value.to_upper() == _code.to_upper():
		_finish()
		return
	_trust_down(TRUST_WRONG)

The first text field in the project. What it expects is the concatenation of the three excerpts above - and that string is printed neither here nor anywhere inside the game.

Where to install it

# export_presets.cfg
[preset.0]
name="Android"
[preset.0.options]
architectures/arm64-v8a=true
version/code=1

[preset.1]
name="Windows Desktop"

Android first: everything is built for one hand, tap targets are thumb-sized, the soft keyboard is wired into that field, and each scene stretches from 1280x720 to whatever your phone decides. The Windows desktop build follows later - same scene tree, same pools, keyboard and mouse instead of thumbs. No date is promised, because the game would only invent one.

Numbers as of this week: 7 chapters, 5 platformer levels, 11 endings and one true ending, 11 easter eggs, 81 gag pools, 2 locales.


p.s. Still reading the page source? The theme carries its own build number in the CSS. It is shorter than the code, and it opens something else entirely.

most serius game ever · devlog · announcement

Comments

Popular posts from this blog

A double jump costs 184 pixels

Eleven endings, and the flag runs away