Skip to content

implementacion de 150 commits al fork con la herramienta del importador de Issues - #31

Merged
Carlos-Rodriguez07 merged 152 commits into
Carlos-Rodriguez07:mainfrom
endlessm:main
May 17, 2026
Merged

implementacion de 150 commits al fork con la herramienta del importador de Issues#31
Carlos-Rodriguez07 merged 152 commits into
Carlos-Rodriguez07:mainfrom
endlessm:main

Conversation

@Carlos-Rodriguez07

Copy link
Copy Markdown
Owner

No description provided.

manuq and others added 30 commits February 24, 2026 10:22
Rename it from "spit" to "spray". And move it to the first-party
directory. Removing the previous license information.

Also adjust the AnimationPlayer node in the enemy scene to delay a bit
playing this sound effect, so it matches the frame-by-frame animation.

The sound was recoded by @PlayMatters as InkDrinker_AirPop_01.wav. So
attribution is Threadbare's Authors.

There are unrelated changes in ink combat rounds 4, 5, 6 because of the
recent projectile changes.
…1950)

Since changing the bait sprites is so avoidable in the combat minigame,
altered it so that the sprites are very difficult to tell apart at
first, and encourages the players to edit the sprite pngs so they can
easily distinguish them.

---------

Co-authored-by: izzykriz <dkriz1662@gmail.com>
Co-authored-by: felixwalberg <fwalberg@uvm.edu>
Changed behavior of the walking on water function to one changed via
exported Node, rather than working directly with the path of the
TileMapLayer.

Also did the same for the blink-related nodes, and reorganized the exports to all be at the top.
---------

Co-authored-by: shade <80239912+shadeydo@users.noreply.github.com>
Minor changes in champ swimming script to flip the sprite based on
velocity and reduced the number of sprite frames in the animation. Small
things based on comments on review in #1806.
Removed delay from champ_long_rock.gd so that the player instantly
entered Mode.DEFEATED when touching the submerged rock. This closes
#1949

There is still a small window of time where the player can interact with
the wrong rock and then sprint back to the land before it respawns them.
To prevent this, we would need to completely disable player movement.
Currently, it looks like player.gd constantly updates the player
velocity, so we cannot manually set it to 0, but we also can't change
mode to DEFEATED, as that will cause the animation to take place. This
doesn't feel particularly "game-breaking", but something that could be
fixed at a later date.
Video settings: Use text property of CheckButton

Previously the "Fullscreen" label for the corresponding toggle was a
separate label. But CheckButton has a built-in text property. Using this
has the advantage that clicking the label toggles the button; and that
the focus rectangle covers the label as well as the button.

Also define the hover_pressed style for CheckButton: without it the
label alignment changes in the case where the button is both enabled,
and being hovered over.
Toggleable: Use @abstract

When this class was written, GDScript did not support abstract classes &
methods. Now it does.

Mark the class, and its set_toggled() method, as @abstract. Update
godot-gdscript-toolkit to a version that supports this syntax.
Add Fabric Rock scene

This is visually & physically identical to the musical_rock scene,
except non-interactive, with a static sprite.

It's not actually used anywhere but it would be nice to do so.
…1983)

StoryQuestProgress: Don't warn if GameState.current_quest is unset

This is expected when you are in Fray's End between quests.
stella: Improve starfish collision shape & let it spin

Previously the starfish projectile sprite was offset slightly from the
centre, and the collision shape was inherited from the generic
projectile.

Zero the positions. Give it a star-shaped collision polygon. Unset
lock_rotation so that it can spin when ricocheting off obstacles.

I made this change while demonstrating to Justin why the new approach of
having separate projectile scenes is worth the trade-off of having more
copies of very similar scenes, then decided it is actually worth
pushing.
I would like to make a townie's dialogue vary based on whether a pathway
has been unlocked. The dialogue could directly access the GameState but
I have a new node with the same API as lever.gd, except rather than
being triggered by an interaction, it is updated by changes to the list
of completed quests. I would prefer to not open-code the "condition
satisfied?" check in two places, so I want to access that node from the
townie's dialogue.

If the townie's TalkBehavior was in a separate scene, this field would
not help: I would need to use editable children (yuck) or add a new
field to the townie's root node, which would make this field unnecessary
because we already pass the TalkBehavior's parent as context so
fields of the townie can be accessed from dialogue. (This is how the
musician queries the state of the sequence puzzle: there is a
SequencePuzzle field on the sequence_puzzle_helper.gd script.)

I am not sure either of these approaches are great. I think we probably
want the generic npc.gd script to have the ability to talk (eliminating
talker.gd) if it has a TalkBehavior, and add another exported field to
pass extra stuff to dialogue (eliminating sequence_puzzle_assistant.gd).
I think in practice people always expect to be able to talk to every
NPC. But that is one for another day.
## GameState: Add lights on/off state

A (non persisted) state used to communicate when lights
should be turned on or off between components.

----

## Add TimeAndWeather node
A drop-in node that adds a day-night cycle animation. Using
post-processing and overlay visual effects.

It's possible to continue with the same time-of-day in the next scene.

Nothing is persisted. Instead, the in-game time is derived from the
system time.

If two scenes have TimeAndWeather nodes with "use system time" enabled
and same setting for time scale, they'll be in sync. See the weather
museum scene for an example.

Duck typing is used to call methods in the visual effects:
randomize, fade_in, fade_out.

For now every day is the same cloudy and every night is the same foggy.
Later more weather conditions and randomization can be added.

This is crying for sound effects too!

----

## Add ArtificialLightBehavior

A behavior node that can manage lights and turn them
on/off according to the game state.

----

## Player: Use artificial light

No delay because we want the area around the player to immediately
be illuminated.

----

## Houses and loom: Add artificial light

For houses, add some random delay so there is variation in
stacks of houses.

----

## Add ModulateAsSkyBehavior

To be used in CanvasItem nodes with reflective surfaces.

----

## Add time and weather museum

Two scenes to show how the next scene continues at the same time.

----

## Fray's End: Use TimeAndWeather

Add a TimeAndWeather node with the default settings. And
remove the clouds shadow overlay effect, because the new
node provides it now.

Add a ModulateAsSkyBehavior to the water tilemap layer.

----

Initial prototype: #1913

---------

Co-authored-by: Will Thompson <wjt@endlessaccess.org>
This implements the **Sequential Combo** mechanic for **Level 6**.
Barrels must now be filled in a specific order.

- **Visuals:** Added a glow animation to the barrel to indicate the
currently active target.
- **Barrel Logic:** Barrels can now be locked. When locked (gray state),
they do not receive ink.
- **New Mechanic:** Introduced the `BarrelUnlockSequence` component:
  - Optionally, shuffles the barrel order when the level starts.
  - Keeps all barrels locked except one.
- Automatically unlocks the next barrel when the current one is
completed.

Resolves  #1847
We want to start making aspects of the game world react to which quests
have been completed, but currently the only ways to adjust which quests
are marked as having been completed are:

- Complete a quest (marking it as completed)
- Start a new game (marking all quests as not completed)
- Manually edit the save file

Add a menu to the pause screen which allows these to be toggled.
Passing `true` to `defeat()` causes the player sprite to be scaled
gradually towards 0 during the unravel animation. This is meant to be
used when the player falls into the void. It didn't look right here.
This state is supposed to be transient, per scene. A Light2D dynamically
added to the scene tree could check if the current scene needs the
lights on. So it needs to be resetted to its default when switching
scenes.

Resolve #2005
Add three new tracks by John Wright: Still, Creep, and Bloom.

Roughly speaking, I used Still for the sections in void_runner and
void_grappling when no enemy is chasing you, and Bloom during the chase
sequences. Creep is played throughout the grappling levels, which to me
suits the spirit of discovery in a strange place.

Creep is split into three sections: Intro (first four bars), Outro (last
four bars), and Loop (everything in between). This is because it sounds
weird to me to loop the whole piece.

I created an AudioStreamInteractive with these five clips, and a number
of transitions.

For void_runner and void_grappling: transitions between Still and Bloom
return to the last position in the target clip. This is used when
switching between the two (when you trigger the enemy, and either are
caught or reach the goal) in void_runner. To me, it sounds bad if you
return to the start of each track each time. (The other option would be
to keep playing Bloom once the chase is triggered, even across respawns,
until you reach safety.)

There is a second clip of Bloom, "Bloom 2", which is used in
void_grappling. This is because there is no way to reset the hidden
"previous position" state; but when we get to that third challenge we
would really like to start Bloom from the start again.

For Creep:

- Intro auto-advances to Loop: i.e. if Intro finishes playing
  "naturally", switch to Loop.
- If a transition from Intro to Loop is explicitly requested, wait till
  the end of Intro anyway then start Loop with no fade.
- When a transition from Loop to Outro is requested, wait for Loop to
  finish before starting Outro (with no fade).
- When Outro finishes, switch to Still.
- If we are still in Loop when it comes time to switch to Still, just do
  a quick cross-fade.

The first round of grappling triggers Creep Intro at level start. Since
this is only four bars long, it's expected that the music will switch to
the Creep Loop before you clear this level. (Another way to achieve this
would be to have the intro & body of the track in one file, and set the
loop_offset field to the timestamp corresponding to bar 5. This would be
simpler, but unfortunately loop_offset is not supported on the web
platform, hence this workaround.)

All subsequent levels trigger Creep Loop if it is not already playing,
until grappling_hook_end, which triggers a transition to Creep Outro.
The loop is about 2 minutes long so it may not finish in time. If it
does, we get a nice 4-bar outro, and then auto-advance to Still, ready
for the start of void_grappling. This last transition doesn't sound
quite perfect but I think it's fine. It would be even better with a
filler clip, perhaps just the downbeat of Creep Outro.

All these files are compressed with Ogg Vorbis -q4, approximately
128kbps.

Add new API to BackgroundMusic to make it simpler to trigger clip
switches within a scene, including a ClipSwitcher child node that can be
connected to an Area2D. Make these triggers one-shot by default. This
avoids a problem where retracing your steps in void_runner back to the
starting island would re-trigger Bloom, even though no chase is
occurring.

Resolves #1974
I called this quest “A Void” not “The Void” as a reference to the
English translation of a novel by Georges Perec (original French title:
« La Disparition »). This novel (which I have never read) is notably
written without using the letter ‘e’: a difficult task considering it is
the most frequently-used letter in both French and English.

My original description for the quest followed the same constraint:

> Our protagonist bolts from a growing blank that rolls across this
> land, stifling and consuming all that it cloaks.

In commit 67fe109 the description was
rewritten to be more legible & less awkward-sounding – a good change!
Change the title to the less-awkward “The Void” to match.

https://en.wikipedia.org/wiki/A_Void
grappling_hook_powerup: Fix shadowing warning

Playing this scene would issue this warning from line 18:

> The local variable "player" is shadowing an already-declared variable
> at line 9 in the current class.

There is a member variable `player` holding a reference to `%Player`, so
there is no need to look up the player again in the "collected"
callback.
And use them in the Void quest `closing_transition.tscn` outro.

----

## Add wildlife assets

Took the ZIP files delivered by PixelFrog, simplified the nesting,
removing MACOS-specifics, and converting the filenames to snake_case.

----

## Create SpriteFrame resources for bunny, capycorn, and sheep idle
animations.

Using the PNGs containing the frame-by-frame spritesheet animations from
`assets/first_party/wildlife/`, create SpriteFrame `.tres` resources for
each
animal color variant.

Steps:
- Read the PNG dimensions to determine frame size (128x128) and frame
count
  (14 for bunny, 11 for capycorn, 29 for sheep)
- Extracted the texture UIDs from the `.import` files
- Generated `.tres` files following the existing storyweaver SpriteFrame
format,
with AtlasTexture sub-resources slicing each spritesheet into individual
frames
- Each resource contains a single "idle" animation, looping at 10 FPS

----

## Void closing transition: Add animals

To both the occluded part and the town. Compose them around the
player and townies, which should be the where the player's eye
should be guided. Add variation by selecting SpriteFrames of
different colors and by randomizing the start frame.

Also extend the reveal animation duration by 4 seconds to give
more time to the player to catch it.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Leave a TalkBehavior with an InteractArea surrounding the first
two townies in case we want this scene to be interactive in the
future (rather than pure cinematic).
A rain effect that can be used in levels. Like the clouds shadow or fog
visual effects, it has a randomize method.

---------

Co-authored-by: Will Thompson <wjt@endlessaccess.org>
Updated the three combat scenes against the "Ink Drinkers" in Quest 003.

resolve: #1907

---------

Co-authored-by: Will Thompson <wjt@endlessaccess.org>
To randomize_effect(). This is because there is a randomize() function
already in the GlobalScope. And due to a bug [1] the Godot Editor
doesn't warn about it.

[1] godotengine/godot#106840
Set The Void Still's BPM to 52.

Previously the transition from Still to Bloom/Bloom 2 was a crossfade
over 2 "beats" of whatever Godot defaults to when a clip's BPM is not
set (seconds, I think); change this to 1 beat for a slightly snappier
sound.

Previously the transition from Still to Creep Intro was immediate at
whatever point in Still was playing. Change this to transition at the
next bar of Still. Start Creep Intro immediately and fade out Still for
1 beat.
Use "Infinity Composition" as the title of the section. Link to John's
Instagram profile (as we do for Pixel Frog's itch.io page).
Add a boolean property to stop the character when the target is reached,
and set it to enabled by default.

Previously the behavior was that the controlled character stays walking
around the target. This is still possible by setting the new property to
false.
The wildlife assets came with this. Move it to the corresponding
directory and create a tileset for the fence. With a wall collision
layer and a terrain to draw it.
wjt and others added 29 commits May 6, 2026 13:55
I think it looks better at 1× scale; and, I generally think it's better
practice to have the assets be the size we want rather than drawing them
at one size and scaling them to another.
Previously we had a mixture of outline and filled icons; and of colour
and monochrome icons for Xbox and PlayStation.

Refactor the way that these icons are assigned so that they are stored
in the same JoypadButtonTextures resource as directional inputs. This
means that the textures for a device type can be configured all in one
place.

Consistently use outline icons, which are more legible and obscure less
of the world.

Consistently use monochrome icons for Xbox. It is true
that official Xbox controllers do have colours on the A/B/X/Y buttons
but looking at some photos in an image search, the colours are either
used for the text (not the surrounding button), or are printed as a
little directional key in between the four buttons. I own two Xbox-style
controllers made by 8BitDo; they use the XBox RB/RT labels for shoulder
buttons rather than R1/R2 so the use of xbox textures for generic
controllers seems appropriate, but they do not use colours.

Similarly, use monochrome icons for PlayStation. Some PlayStation
controllers have coloured buttons, but many more do not, and I don't
think the colours are the strongest association.

Some of the Switch button textures were inconsistent with the input map;
fix these in the process. Unfortunately I was unable to pair my Switch 2
JoyCons with my laptop so I can't actually test these. (If we wanted to
support Switch controllers "properly", IMO we should swap the mappings
so that the Switch "A" button is interact, but that's one for another
lifetime.)

For champ_stealth, rather than adding these champ_specific actions to
the global input map, make interact_input.gd skip the per-device mapping
if it is not provided, which improves on the previous behaviour of
showing blank icons when using a controller.

For Sueños Nocturnos, which has a custom "Saltar cinemática." hint, use
the "interact" button (matching the previous hardcoded button textures),
and adjust the action it looks for to match so that joypad buttons
actually work.
Name the asset in a generic way, because the character may be
repurposed.

Remove the custom script for flipping the sprite while being interacted.

Helps #1752
Add butterfly scene

This is just a decoration. I only defined SpriteFrames for the
butterflies that sit on the ground. The ones that fly will need more
thought.

(cherry picked from commit df903223a6b0a0ab4998d4221a7e77e30d9c229f)
As delivered by PixelFrog, and composed the 3 of them in a row with
GIMP. And change the amount of rows to 3, the new amount of particle
variations.

## Void enemy: Add outline to all particles

To do it, because the GPUParticle2D needs a CanvasItemMaterial for the 3
variations, add a CanvasGroup and apply the outline shader to it.

Also, change the particles to:
- Animate the scale animation now starting at zero and ending at zero
too.
- Do not animate the alpha of particles anymore.
- Emit from the sphere surface (not from sphere).

Resolve #1857
This is currently only used in frays end west, but will be used in the
tutorial quest.
This primarily dresses the scenes with props and decorations,
but also includes some minor tweaks to the routes the player should
follow.

Co-authored-by: Stephen Reid <stephen@endlessaccess.org>

Co-authored-by: Stephen Reid <stephen@endlessaccess.org>
player: Hide PointLight2D node

This node is 1024×768px. And although it is not visible in the editor in
scenes which instance the player scene, it is clickable, so trying to
click on other nodes that happen to be within the invisible 1024×768 box
around the player causes the player to be selected instead (if the
player is further down the scene tree). Very confusing until I figured
out why.

The ArtificialLightBehavior._ready() function updates the visibility of
the PointLight2D so hiding it in the player scene doesn't have any
impact on gameplay.
Unlike abandoning a quest, when we skip the tutorial we must grant the
player the abilities that they would have gained by completing the
tutorial.

This is a bit overengineered but it felt better to list the abilities in
the tutorial's quest.tres rather than to hardcode them in the pause
menu.

Resolves #2160
Also adjust the Playstation L1/R1 hints to the "alternative" version,
which looks a little truer to life.

The one downside of showing the left-stick rather than dpad is that the
stick works poorly in Sokoban
(#1186) but that is just a
bug to fix.
Like the sheep scene, these are just props with no physics.

Update the Void quest closing cutscene to use these and the sheep. There
should be no visible change.
The custom sheep in this StoryQuest has physics. In the one scene where
it matters, manually add a StaticBody2D to it. We might later add
physics to the shared sheep.

Doing this means there is only one "sheep.tscn" in the project.
Talking with Justin, we thought this would be a suitable place to drop
in an example of using StaticBody2D + AreaFiller to make a forest.
The tutorial quest includes an improved version of this simple first
round. In particular, you can't win the tutorial one by standing behind
a pot: you have to use repel, and an NPC is standing there to tell you.

Relink the music puzzle to ink_combat_round_2. Move the Musician's
introductory dialogue there, and tweak the wording a little to highlight
the word “Repel”.

Helps #2161
The player is now given the grapple ability in the tutorial. Remove the
powerup from grappling_hook_start. Adjust the dialogue a bit, including
fixing the name of the collectible thread. Moss now explains why you
can't reach that thread and tells you what to look for. Use the verb
“throw” as a reminder of what to do (matching the HUD) and mark the way
with yellow buttons. Remove those yellow buttons when the player returns
to this scene at the end of this challenge.

Resolves #2161
Add an Aseprite file for the trees, using the existing PNG files. Crop
the
treetop from the trunk in separate layers, leaving a single trunk. Then
add
layers for void-affected trunks, as delivered by PixelFrog. Also split
the
shadow in it's own layer, since the 2 trunks delivered didn't have one.

Create a new scene, duplicating the existing tree scene. This one has 2
AnimatedSprite2D nodes: one for the tree trunk and one for the treetop.
They
also share the same material with the wind shader.

Note that the treetop spritesheets have empty frames, because the trunk
animation is larger (14 frames) than the treetop one (6 frames). Pick
only the
first 6 frames in the SpriteFrames resources for the treetop.

## grappling_hook_needles.tscn: Use trees with void

Replace all yellow trees with affected-by-void trees, also yellow for
the
treetop, and vary the trunk with the two existing variations.

Resolve #2165
Use the same offset and color than the text label shadow.

## Mouse and keyboard atlas: Remove rectangle of solid pixels

Which actually don't contain any icons. Because when cropping slices of
this
atlas right below this area, the drop shadow shader does drop a shadow
for the
pixels above.
Annoyingly this needed changes to the version-generator plugin, because
exporting generated this warning:

    WARNING: Invalid version number "v0.1.11-72-g29be516f2". The version
    number can only contain numeric characters (0-9) and non-consecutive
    periods (.).

I changed it so that "application/config/version" is "0.1.12" for the
tag "v0.1.12", and "0.1.11.72" for a build 72 commits ahead of v0.1.11.
The full `git describe --tags` output is now in
"application/config/full_version".

Explicitly qualify the export name with "x86_64". It is possible we will
one day add an arm64 export. Update the Linux export accordingly. Ensure
the target directory exists for both builds

Resolves #2155
Previously it was a single-row 18×1 sprite sheet, 13824x768, which did
not display correctly on mobile devices where textures must be at most
4096×4096.

Reëxport it with three rows of 6 frames. Update the SpriteFrames
resource.

Resolves #2195
Previously 12804 x 80, now 1584 x 720 which is less than 4096 x 4096.

Helps #2029
Currently all three elders always have quests, but I am experimenting
with stripping out parts of the game to make the project smaller for a
game jam.

Make the elders check whether they actually have any quests for the
player, and say so if they don't.
This is for a goblin from Tiny Swords, before we had our Storyvore
assets.
This was replaced with the tutorial quest.
Mostly visual changes - adding shadows, tweaking transitions – but also
a slight layout change to the sequence puzzle to address feedback that
the NPC is too close to the objects.
The enemy runs when it is more than a certain distance from the player,
and walks when it is close. This makes it possible to outrun the enemy
without sprinting, and gives a sense of urgency while also giving you a
bit of grace if you need to pause and grapple.

Tweak both values slightly to make it a bit easier:

- Walk when the player is within 256 px (4 horizontal tiles), not 192 px
  (3 horizontal tiles);
- Reduce the walk speed, which was already a little lower than the
  player's.

This should make the initial void runner sequences much less
challenging, and the last void_grappling sequence a bit fairer.
Since v8.0.0, major version tags like v8 are no longer created.
Dependabot will not propose an upgrade from a vX tag to a vX.Y.Z tag so
this one-time manual change is needed.
@Carlos-Rodriguez07
Carlos-Rodriguez07 merged commit 2d9d8fa into Carlos-Rodriguez07:main May 17, 2026
3 checks passed
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.

10 participants