Skip to content

Overworld abilities remix#2047

Draft
manuq wants to merge 23 commits intomainfrom
overworld-abilities-remix
Draft

Overworld abilities remix#2047
manuq wants to merge 23 commits intomainfrom
overworld-abilities-remix

Conversation

@manuq
Copy link
Collaborator

@manuq manuq commented Mar 11, 2026

This is a remix of 2 other changes: the overworld prototype and the player modes -> simultaneous player abilities refactor.

manuq and others added 22 commits March 11, 2026 00:20
Let them happen all at once without changing the actual modes for now.
Only leave the mode "defeating" to disable player interaction and
abilites (repel, grapple). This prevents refactoring the modes right
now.
This was introduced a while ago and left invisible. It has the shape of
StoryWeaver so it won't work when replacing the SpriteFrames in
StoryQuests.
This could be a const, or the "repel" string can be used directly.

This is only preparation for upcoming animations refactor.

Note: There are references in StoryQuest "After the Tremor" that
this change may break.
Rename the node that provides this ability to PlayerRepel. Adjust the
scripts accordingly.
And the Area2D nodes that had this script. In 2 scenes from Void quest.
Add a signal to the repel ability and use it to play the animation when
the property changes, instead of checking it constantly in _process().

Loop the repel animation in the script by adding a handler to the
animation finished signal, and remove the loop mode from the animation
itself.

Give a class name to PlayerRepel.
For keyboard + mouse: Use right click to repel.

For keyboard only: Use Z to repel and X to grapple. This is on the basis
that the player will use arrow keys for moving in this case.

Interact continues being Space in both setups.
To the right shoulder (RB in XBox). So it doesn't collide with A for interaction. And so it can be used
at the same time as aiming the grappling hook with the right stick.

Co-authored-by: Will Thompson <wjt@endlessaccess.org>
Into a new PlayerHarm node inside the Player scene. There is no actual harm today, but the "got hit" animation and handling of the
projectiles entering the player hitbox are here now, split from the PlayerRepel ability.

Also, connect the signals from the editor, not in the _ready() function.
During dialogue, set the cursor to the arrow. When dialogue ends,
set it to the cross.
When the game is paused set the cursor to the arrow. And when unpaused,
set it to the cross shape.
A boolean property. Default to false. Set it to true in the 3 existing lore quests.
As generic flags that can be interpreted by the game entities. For example, the first one can be "repel".

Add an enum with 3 abilities, each with 3 modifiers (enhanced, reduced, buffed, debuffed, strengthened, damaged). Eg: longer thread to grapple.

The same methods set_ability(), has_ability() can be used from the game, and they will behave differently depending if the player is involved in a StoryQuest or not.
Consider flags ABILITY_A as "repel", ABILITY_B as "grapple", and
ABILITY_B_MODIFIER_1 as "longer hook" modifier for grapple.
- Grant "repel" at the beginning of ink_combat_round_1
- Grant "grapple" at the beginning of grappling_hook_start
- Grant "longer thread" when collecting the powerup in grappling_hook_powerup
- Grant "longer thread" when collecting the powerup in void_grappling_round_2 (although it should be already given at this point)
- Remove hacky way to set longer thread
Previously the current scene was persisted as part of the quest state.
When you return to Fray's End after completing a trio of Sokobans, all
quest state is erased from the saved data, meaning that the current
scene path is lost.

As a result, if you:

- Complete a quest
- Complete all three Sokobans & return to Fray's End
- Exit the game
- Relaunch the game

then you were previously offered the chance to Continue. However this
would try to change scene to empty string, which fails and reloads the
title screen.

Fix this in two ways:

1. Persist the current scene as part of the global state, not as part of
   the quest state.
2. Only offer the chance to continue a saved game if the current scene
   is known.

Add some assertions at relevant points.

Resolves #1946
Introduce a QuestTeleporter that, when entered, starts a quest. Add
staging areas representing the Song Sanctuary and Linenville with
QuestTeleporters to the musician quest and the void quest respectively.

Take the player back to a defined spawn point when they abandon a quest,
rather than to Fray's End. Save progress within each quest so that if a
quest is abandoned then resumed, the player picks up where they left
off.

Add an overworld, a zoomed-out space for fast travel between regions of
the world. Link Fray's End to the Song Sanctuary and Linenville.
Gate access to Linenville (represented by the temple) with a blocking
area of void, removed when you complete the musician quest. Gate access
to a third island by grappling, enabled only when the void quest is
complete. (Imagine that the placeholder quest can be accessed here.)

Remove the LoreQuest Elder's storybook. Have them give you directions to
the next quest.

Resolves #2021
@github-actions
Copy link

github-actions bot commented Mar 11, 2026

Play this branch at https://play.threadbare.game/branches/endlessm/overworld-abilities-remix/.

(This launches the game from the start, not directly at the change(s) in this pull request.)

@manuq
Copy link
Collaborator Author

manuq commented Mar 11, 2026

@JoniCeceri I added a very basic quest separator screen to this remix. Thanks for the idea!

recording.webm

More ideas from @JoniCeceri for additions:

info like, if the quest is completed or not, how many threads the player has found for it, and maybe a "reset progress" button?

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants