Skip to content

Conversation

@felixwalberg
Copy link
Contributor

@felixwalberg felixwalberg commented Oct 6, 2025

Nora and the Nearly Impossible Homework follows a student through their struggles to perform at a high academic level. They deal with self-doubt, shame, and frustration. But, through determination and the support of a thoughtful friend, they are able to persevere and attain what they once thought wasn't possible. Each mini-game correlates with an emotion: first anger, then sadness, then happiness!

All art either created by @felixwalberg, or based on modifying existing artwork in the game.

Engineering:

Game Design:

Production and Management:


felixwalberg and others added 30 commits June 3, 2025 10:44
Merging from Endless Repository into Verso
Remove the style it inherits from button by setting an empty stylebox to
the normal and pressed states. And add a white background with
transparency to the focus and hover states, so when navigating with the
keys the player can see that the option is focused to toggle it.
And provide helper methods to get and set fullscreen.
Add a video section in the settings, with a check button that switch the
display to fullscreen when toggled, and switch to windowed when not
toggled.
This is a workaround for an upstream bug:
godotengine/godot#100626

Connect the label size changed signal to a handler, that calls
reset_size() in the PanelContainer

Also, change the minimum size of the PanelContainer to the current size,
and shrink center both the MarginContainer and the Label nodes. The
offsets in the diff have changed automatically because of this.

Fixes endlessm#608
Add the Aseprite source file and the exported spritesheet animations as
PNG.

There are 3 animations: idle, move and attack.

There are 5 color variations: blue, gray, green, orange and red.

And there is another variation: the character holding a torch, and the
character without a torch.
The previous sprite frames used in the Lore quest was from the Tiny
Swords asset pack, character Goblin with a torch. And the template was
created based on it. The storyvore character is a bit different:

- Has different amount of frames:
  - Attack has 6 frames. Goblin has 3.
  - Idle has 11 frames. Goblin has 7.
Use the ones without torch for the guards that move super fast and have
small detection area (scaled to 0.1). Use the ones with torch for the
ones that move slower and have large detection area (scale 1).

Use a variety of colors for the storyvores.
One was added 2 months ago in 1d47e43 and the other one was added 1
monnth ago in 7f0ceff. Leave the one with better variable name.
Make it consistent with other setters in the project, wait for the node
ready and set it from the _ready method, assuming that the SpriteFrames
variable is not null because it's defined as an @onready. For this, do
not use inline setter.
Unfortunately, the sprite frames for Storyvore and the guard template
have animations of different length:
- Attack: 6 and 5 frames
- Idle: 11 and 8 frames

The only animation with the same length is the walking animation (6
frames). This is because the template was based on a placeholder, not in
the final character.

So, match the frame by frame animations in AnimationPlayer to the longer
animations (the 2 from Storyvore). The template will have the last frame
still for a few frames.

Add each frame to the AnimationPlayer timeline. Changing the animation
and adding 2 frames makes the animation play but not at a consistent
10 FPS.

This fixes a bug where the idle animation wasn't playing, because it was
done by calling play in the SpriteFrames node directly, and at the same
time the AnimationPlayer was calling stop(), which made the character be
still in frame zero of the idle animation.

Also: Remove waiting for 0.4 seconds before playing the attack
animation. Otherwise it looks odd that the player defeated animation
happens before it.
The undo and reset are actions specific of the Sokoban puzzle.
Add an action to the Sokoban HUD to go directly to the next scene
without completing the puzzle. This commit adds it inconditionally, but
the next commit will add the logic to when the action is possible.
The rules engine can be configured to offer skip after the player spent
a certain amount of seconds in the puzzle, defaulting to 2 minutes. Or
after a number of retries, defaulting to 10 attempts.

The Skip in the HUD becomes visible only when the player can skip the
puzzle.
Each puzzle has a RuleEngine node and a SokobanHUD node. Connect the
skip_enabled signal of each RuleEngine node to the display_skip()
function of the SokobanHUD node.
To me A (bottom button, PlayStation X) feels more like the button for a
"normal" action, where my finger rests by default, while skipping is
more exceptional. I think Y (top button, PS triangle) feels better for
this action in some hard-to-explain way.
felixwalberg and others added 11 commits September 19, 2025 11:37
Sync from Endless Threadbare repository
I set up a clone with two remotes:

    $ git remote -v
    VERSO-UVM	git@github.com:VERSO-UVM/threadbare.git (fetch)
    VERSO-UVM	git@github.com:VERSO-UVM/threadbare.git (push)
    upstream	git@github.com:endlessm/threadbare.git (fetch)
    upstream	git@github.com:endlessm/threadbare.git (push)

I looked at the files changed between the two:

    $ git diff --stat  upstream/main...VERSO-UVM/main

I semi-manually pruned the list to only include files that already
existed upstream.

Then I used `git merge-base` to find the common ancestor commit of
upstream/main and VERSO-UVM/main: this is where they branched from each
other, and used it as input to `git restore` to restore the files as of
that commit:

    $ git restore --source=$(git merge-base upstream/main VERSO-UVM/main) \
        .github/CODEOWNERS \
        .github/workflows/export.yml \
        .pre-commit-config.yaml \
        assets/first_party/logo/threadbare-logo.png.license \
        project.godot \
        scenes/eternal_loom_sokoban/components/hud/sokoban_hud.tscn \
        scenes/game_elements/characters/enemies/guard/components/guard.gd \
        scenes/game_elements/props/fixed_size_label/fixed_size_label.tscn \
        scenes/game_elements/props/sequence_puzzle_hint_sign/sequence_puzzle_hint_sign.tscn \
        scenes/globals/settings/settings.gd \
        scenes/menus/options/components/video_settings.tscn \
        scenes/quests/lore_quests/quest_001/3_stealth_level/stealth_level.tscn \
        scenes/ui_elements/components/theme.tres
@felixwalberg felixwalberg requested a review from a team as a code owner October 6, 2025 22:32
@github-actions
Copy link

github-actions bot commented Oct 7, 2025

Test build no longer available.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can delete this unused file I think.

Copy link
Member

@wjt wjt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was an easy PR to review - thank you for the care you and your colleagues have taken to organise this quest.

I played through the quest - great ideas, I love the adaptations of the main game artwork to suit your story.

I have a few bits of feedback but nothing too large:

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this file is unused and could be deleted.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interesting adaptation of the filling game!

@@ -0,0 +1,39 @@
[gd_resource type="SpriteFrames" load_steps=6 format=3 uid="uid://cw0d60uuy2b8"]

[ext_resource type="Texture2D" uid="uid://do4tec8oedbcx" path="res://scenes/quests/story_quests/template/2_template_combat/template_combat_components/template_target.png" id="1_s8lii"]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This references the image in the template folder directly. I think you should either:

  • Delete verso_target.png (since it is unused); or
  • Update this to refer to verso_target.png

@@ -0,0 +1,18 @@
[gd_resource type="SpriteFrames" load_steps=3 format=3 uid="uid://dqrslr3weg0lt"]

[ext_resource type="Texture2D" uid="uid://cagyo41xspko" path="res://scenes/quests/story_quests/template/2_template_combat/template_combat_components/template_projectile.png" id="1_jg0bk"]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here.

Comment on lines +3 to +6
[ext_resource type="Texture2D" uid="uid://cd2ivq0ll3lt0" path="res://scenes/quests/story_quests/template/2_template_combat/template_combat_components/template_throwing_enemy_attack.png" id="1_whccx"]
[ext_resource type="Texture2D" uid="uid://cb3lim37pj3by" path="res://scenes/quests/story_quests/template/2_template_combat/template_combat_components/template_throwing_enemy_defeated.png" id="2_b3jhe"]
[ext_resource type="Texture2D" uid="uid://dlyqia7fiovw1" path="res://scenes/quests/story_quests/template/2_template_combat/template_combat_components/template_throwing_enemy_idle.png" id="3_mub68"]
[ext_resource type="Texture2D" uid="uid://ddsr4nuoutyif" path="res://scenes/quests/story_quests/template/2_template_combat/template_combat_components/template_throwing_enemy_walk.png" id="4_yujlm"]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ditto

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ditto

@@ -0,0 +1,37 @@
@tool
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
@tool
# SPDX-FileCopyrightText: The Threadbare Authors
# SPDX-License-Identifier: MPL-2.0
@tool

@@ -0,0 +1,37 @@
extends Node
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
extends Node
# SPDX-FileCopyrightText: The Threadbare Authors
# SPDX-License-Identifier: MPL-2.0
extends Node

"texture": SubResource("AtlasTexture_bsni3")
}],
"loop": true,
"name": &"attack_01",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the combat game, the repel action doesn't work. This is a bug in some backwards-compatibility code in the shared player scene - we changed the name of the animation corresponding to repelling a projectile. You can fix it by renaming this animation:

Suggested change
"name": &"attack_01",
"name": &"attack_02",

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I filed #1305 about the bug in the player scene.

@wjt
Copy link
Member

wjt commented Oct 7, 2025

Oh, I also noticed that you have many files named .png.png:

image

It's harmless but you could rename these.

Copy link
Member

@wjt wjt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice work!

@wjt wjt merged commit 5488e5e into endlessm:main Oct 8, 2025
5 checks passed
@wjt
Copy link
Member

wjt commented Oct 8, 2025

I've invited the 3 creators of this StoryQuest to a team in our GitHub organisation; joining it will give you the ability to push branches to this repo. I'll mark that team as co-maintainers of this quest so that you can merge your own PRs targeting this quest. No obligation to accept but we'd love to have you as continuing contributors to this quest or the wider game if you are interested!

@manuq
Copy link
Collaborator

manuq commented Oct 8, 2025

@aureliamarzipan, @felixwalberg, @tovedetered congratulations!

@wjt wjt added the StoryQuest New StoryQuests or updates to existing ones label Oct 8, 2025
@wjt
Copy link
Member

wjt commented Oct 8, 2025

FYI I opened #1315 to fix some issues (mostly one introduced by a parallel change, not in this PR), and filed #1316 and #1317 for some possible future improvements to the quest.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

StoryQuest New StoryQuests or updates to existing ones

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants