feat(slender): tear his own screen as the pages go - #252
Merged
Conversation
The slender is the only player without a page counter, so how far the round has got never reaches him until it ends. SlenderStaticService turns it into sound: a carpet whose gap shrinks from slenderStaticQuietInterval down to slenderStaticFranticInterval as the pages disappear, plus a burst of its own on every single find. Only he hears it, played on his own entity, so neither side can place the other by it. PageProvider now raises PageFoundEvent on every find with the running count. PageDiscoveryCompletedEvent only ever covered the last page, which is one moment in a round that spends the rest of its time getting worse. The configured key is sent as named instead of being resolved against the vanilla registry: a VHS noise shipped in the resource pack is the sound this wants, and SoundEvent.fromKey would drop it. Defaults to weather.rain until that key exists.
Contributor
Test results 360 files 360 suites 2m 8s ⏱️ Results for commit da367c6. ♻️ This comment has been updated with latest results. |
cygnus:vhs_static now exists: three 2.2 second takes of tape hiss, high-passed at 520 Hz so the pitch drop to 0.7 this effect applies leaves it hissing instead of humming (OneLiteFeatherNET/cygnus-pack#34). weather.rain was only ever a stand-in for it and reads as weather, not as a tape. A server without the pack now hears nothing here, which is the right way round for a horror cue.
7 tasks
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.
Proposed changes
The slender is the only player in a round without a page counter. The survivors watch theirs climb; he only learns the score when it ends. This gives him that counter as a picture coming apart — the same worn-tape look the survivors get from seeing him, turned back on him and driven by the round rather than by a line of sight.
PageGlitchService(game/.../glitch/) drives two things, both only on his screen:SlenderGaze.LEVELSwhen the last one goes. Until the first page is found there isNONE, not the weakest level: an untouched round has nothing to say yet.pageGlitchPulseSecondsbefore falling back.Three things in here are worth a look in review:
GazeSink.attach(player, worldTint)splits the two halves of the signal. The veil says how far the round has got; theDARKEN_SCREENbit takes the world's lighting with it. That is right for a survivor looking at the slender and wrong for the slender himself — darkening his world takes the sight he hunts with. He gets the veil alone.The signal instance is shared with
SlenderGazeServiceinstead of a second one being built. A player has one carrier, and two boss bars would each expand to a full-screen quad and stack — the diagnostic note about exactly that failure is already inBossBarGazeSignal. Slender and survivors are disjoint, so the two services never address the same player, except across a hand-over, which the service watches for.A bug fix that fell out of the hand-over case.
PlayerQuitListenerpromotes a living survivor to slender when the old one quits, so neither the death nor the disconnect listener inSlenderGazeServicecovered him. Left tracked,levelFormeasured him against himself: distance zero, which reads as the worst level, for the rest of the round. He is dropped onSlenderReviveEventnow.Nothing is needed in the resource pack. The channel, the font and the shader are already there; the four
cygnus:gui/glitch/level_Ntextures removed in cygnus-pack#28 stay removed, they belong to the camera-overlay route this does not use.Types of changes
Checklist
10 tests in
PageGlitchServiceTestcover the clean start, both ends of the baseline, the pulse and how long it holds, the hand-over to a new slender, the missing world tint, the round's end, the off switch and a missing slender.BossBarGazeSignalTestgains the tint-less attach,SlenderGazeServiceTestthe promoted survivor,GameConfigReaderTestthe two settings. Both are documented inconfig.properties.example.Further comments
An earlier revision of this branch played a sound instead of drawing anything, and pointed at a VHS noise built for it in cygnus-pack#34. That was a misreading of the request; the sound is gone from here. Whether the pack keeps that asset is a separate call — nothing in Cygnus references it any more.
The pulse is one level above the baseline, so at the last page it has nowhere left to go. That is deliberate: at that point the round is over within seconds anyway. The baseline curve is linear across
SlenderGaze.LEVELS; if it should stay clean longer and then fall apart late, that is one line inlevel().