[2025/04] Dev Blog: Create a More Detailed Static Testing Dungeon
The Life of a Government Clerk is a single player, turn-based, coffee break Roguelike game made with Godot engine. The game title comes from Chekhov’s short story, The Death of a Government Clerk, while the core mechanics are inspired by Kafka’s novel, The Castle, in which K witnessed two clerks delivering document by cart in a hotel.
The game is under early development. Its current version is 0.1.0, which is not ready for play yet. In the last development blog, I wrote down a TODO list.
- [DONE] Add progress bars to raw file nodes.
- [DONE] Implement the failure condition.
- [DONE] Remove obsoleted service types.
- [????] Add temporary service stations.
- [????] Let Clerks be more demanding.
- [DONE] Add traps.
- [DONE] Grant more abilities to a long line of Carts.
The first three tasks have been completed. Task 1 & 3 can be verified in the demo video. Task 2 is not so obvious, but now PC will lose the game once all Carts are fully loaded. Task 4 is put on hold, because I doubt whether it is necessary to add more service stations. Task 5 is cancelled. I’ve introduced some new challenges to the game, which will be explained in detail below. The last two tasks have also been finished. Task 6 is part of the new challenges. PC with a long line of Carts has a new way to interact with traps, as is required by task 7.
Node Hub & Signal Hub
Before diving into specific game design details, I’d like to share two general changes, which are included in commits 34d947a
and 9b337b8
. As we know, node communications can be achieved by calling a node reference or sending/receiving a signal. I tweaked the code to make it easier to do so.
Now there is a autoload script node_hub.gd
that contains all node references – ref_MyNode: MyNode
, for example. Therefore any node can be called by NodeHub.ref_MyNode
. The reference is set in MainScreen._set_node_hub()
.
func _set_node_hub(node_names: Array) -> void:
var ref_node: String
for i: String in node_names:
ref_node = "ref_" + Array(i.split("/")).pop_back()
NodeHub.set(ref_node, get_node(i))
Note that NodeHub
is autoloaded, so it can be called directly.
Signals used to be sent by various nodes. Now they are all sent by SignalHub
, which is a sub node of Mainscreen
. A signal can be sent by calling NodeHub.ref_SignalHub.my_signal_sent.emit()
instead of MyNode.my_signal_sent.emit()
, which means I don’t need to remember the node name of a sender. A receiver only has to change its function name to _on_SignalHub_my_signal_sent()
.
Challenges
PC will face four types of challenges when delivering Raw Files and Documents. Three of them increase in terms of data (more obstacles, higher reduction, etc.) every turn. The last challenge is triggered by a certain action. Below is a short description for all of them.
Name | Type | Negative Effect
--------|--------------|----------------------------------
Servant | Turn Based | Increase Raw File cooldown
Trash | Turn Based | Increase a Cart's load amount
Leak | Turn Based | Reduce a Clerk's working progress
Phone | Action Based | Reduce income
Unlike the other three types of challenges, Servant is available from the start of the game, and it had been implemented before the last development blog. Here is a brief reminder of Servant’s mechanics. A Servant becomes inactive if he has not been disturbed for too long. An inactive Servant increases the cooldown time of Raw File nodes. An inactive Servant can be pushed by a short Cart line, or be picked up by a long Cart line, and then becomes active again. A Servant also has two positive effects. He can reduce a Cart’s load amount, and can be used to remove Trash.
Trash and Leak are introduced after a certain number of Documents have been delivered. When PC moves over a Trash on the ground, the Trash is removed, and PC is forced to wait a few turns. There is another rule states that if a Cart is outside of an office room, its load amount increases every turn. In a word, Trash is annoying but not so deadly.
Leak, on the other hand, is more troublesome. A Clerk converts Raw Files to a Document after a few turns. However, the conversion progress is reduced when Leak is active. Therefore, PC has to wait more time for a Document. He may even need to deliver another Raw File due to a high enough leakage. To make things worse, there is no way to offset Leak. Once the number of delivered Documents has pass a threshold, Clerks work less efficiently. This is the daily life of a government employee.
One or more new phone calls appears when a Document has been delivered. Old calls disappear at the same time. If there are too many unanswered old calls, PC’s income is reduced. Answering a phone call removes a few load amount for free. This idea comes from Kafka’s The Castle, in which a telephone plays an important role at the beginning of the story. Phone is a long term, medium risk challenge. It is also beneficial (just like Servant) in some way.
All these challenges are triggered by functions in game_progress.gd
. update_world()
handles the first three turn based ones. Phone is handled by update_phone()
.
Create a New Static Testing Map
Lastly, I spent five minutes to draw a more detailed static map. It looks similar to the final product (a random generated map) in my mind. A few minutes’ play testing shows that the game experience fits my imagination, and so I call it a day.
If everything goes smoothly, there will only be three tasks left before the final release.
- Create a random generated dungeon.
- Balance game data.
- Write help document.
I don’t know how long they will take, but the sooner the better.
the-life-of-a-government-clerk
A turn based Roguelike game made with Godot engine. It is inspired by Kafka's The Castle.
Status | Released |
Author | Bozar |
Tags | Godot, Roguelike, Singleplayer, Turn-based |
More posts
- [2024/11] Dev Blog: Rethink Game DesignNov 08, 2024
- [2024/10] Dev Blog: Let PC Interact with a Static DungeonOct 02, 2024
- [2024/09] Dev Blog: The Life of a Government ClerkSep 12, 2024
Leave a comment
Log in with itch.io to leave a comment.