implementacion de 150 commits al fork con la herramienta del importador de Issues - #31
Merged
Merged
Conversation
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.
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.
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.
As delivered by PixelFrog. Resolve #1856
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.
Fixup for commit c17ffac
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.