14 JUL 2026

Obedience: Devlog 1

Developing a game from start to finish, starting with the fundamentals.

Obedience: Devlog 1


🔞
Adult content is featured in this blog post. If you are under 18, do not continue reading. Reader discretion is advised.

Hi, my name is Fish. Better known online as @nsfw.rocks

on Bluesky, I've been creating games since 2014, and ever since then, I've always had a significant interest in creating and publishing indie games on the internet. My life-long dream is to one day make a career out of game development; with enough discipline and effort, I believe that goal is attainable.

With this short introduction out of the way, please enjoy the development log!

Foundational structures

Starting from nothing, I knew I needed to learn composition and how to effectively use Godot's nodes in order to build out a modular and flexible system with reusable scripts. This ultimately addresses the issue of code clutter, alongside giving me the freedom to edit systems later on in development without having to worry about duplicate code. It is unlikely that a lot of them will change, beyond things like the current %AnimatorComponent and %InputComponent nodes, but great to have nonetheless!

Spritework

As you can also see in the image above, I've started working on the sprites for the game. Right now, it's very temporary but I wanted something somewhat nice to look at for the time being whilst I work on the game's mechanics.

Setting up the system managers

I've started the rudimentary work of actually building out the loading system for the game, with two caveats: it's not asynchronously threaded, and it's not in its own manager node. However, what I do have right now, is the following:

func _ready() -> void:
	_change_current_level()
	_init_player()
	_init_entities()

func _change_current_level(level_id: String = "uid://cdmyiun8e7nvp"):
	if _current_level:
		_current_level.call_deferred("queue_free")
	var _upcoming_level = load(level_id)
	level_root.add_child(_upcoming_level.instantiate())
	_current_level = level_root.get_child(0)

func _init_player() -> void:
	if player_scene == null:
		push_error("Couldn't load player scene: " + str(player_scene))
	player = player_scene.instantiate() as Player
	if not is_instance_valid(player):
		push_error("Couldn't initialize player because loaded scene does not extend Player: " + str(player_scene))
	_player_spawnpoint = _current_level.get_node_or_null("PlayerSpawnpoint")
	if _player_spawnpoint:
		player.position = _player_spawnpoint.position
		entity_root.add_child(player)
	else:
		push_warning("\"PlayerSpawnpoint\" returned null! The player has been positioned to spawn in the center of the screen.")
		player.position = (get_window().content_scale_size / 2.0)
		# TODO: Ensure player is not positioned in a wall
		entity_root.add_child(player)

func _init_entities() -> void:
	for _entity_spawnpoint in _current_level.get_children():
		if _entity_spawnpoint is EntitySpawnpoint:
			var entity = _entity_spawnpoint.ENTITY_SCENE.instantiate() as BaseEnemy
			entity.position = _entity_spawnpoint.position
			entity_root.add_child(entity)

In theory, this is really all that's necessary for the base concept of "loading" the game, though I haven't decided firmly on how the levels will be handled. There's a guarantee that the levels will be procedurally generated, but I'm not sure how I'd like to handle going between rooms. Either they'll all be loaded at once, and the camera pans between them, or I'll have them be loaded as the player moves between each room.

I've managed to add a damage system, a libido system, and there's also areas for each so that the player can be damaged by stepping onto something, along with having a "libido increasing" area for when I want to potentially have "intoxicating" areas that increase the players' libido by 5 every second, giving them about 20 seconds on the lowest libido.

Closing thoughts

The game is coming together pretty good. I'll share more next week as I continue to develop the game. Hopefully by this time next week, I can share more art alongside a bit of gameplay.

If you've enjoyed reading, consider subscribing to the mailing list (or follow me on Bluesky)! If you want more development logs, consider heading to the archive, where you'll find every post I've made regarding game development.

gamegamedevfurrynsfwmatureindieporn

Enjoyed this article?

Join our free newsletter and never miss an update.