Changeling devour and transform (#34002)

* Initial:

Create Devour componentry, preliminary identity storage and the systems
for Devouring

* I have genuinely no idea what i'm doing

- added the radial menu, it has nothing in it.

- trying to get it to populate. the event under the event is broken,
i don't know why, but apparently it's not typed right

- Added a placeholder transform

- oh also fixed up some devour stuff and moved some things around.

* Holey moley, Transform, better devour, oh my!

- Move DnaComponent into Shared because we need it for the DNA cloning

- Make Transform MOSTLY work on the LAST identity devoured.

- Fix some issues on devour that involved prediction, canceling and
Damage exeucting (Thanks Plykiya for pointing out AttemptFrequency!)

* Proper tail stealing and Damage modifier attempt

Add check to add a wagging component on the Changeling if the victim's
species Prototype had one.

attempt to add the Damage mitigation check

* MAJOR CLEANUP AND FIXES AUGH 3 DAYS!!!

- Nullspaced a clone of a victim

- fix audio using server virtualized Pvs (i hate this)

- fix the mispredicted doafters

- Clean up a wholelotta code

- utilize clone systems to clone appearances

- Move CloneAppearance from server to shared So we can actually access
it

* Examine stuff, more cleanup, Jumpsuit ripping

- make rotting prevent the action

- Add ripping of clothing (guh why is it also server)

- add some System stuff for pushing husked corpse inspection

- clean up more badcode

* Doing things properly, UI sorta kinda works.

- Utilize Relayed events for Devour checking

- Get a UI that partially works, Says the name of identities, doesn't
show their looks

- Make use of the New Dynamic BUI assignment

- commit the sin of no client prediction cause nullspace entities aren't
networked

* Got an entity for the Frontend transform

Issue with the looks

* Stick a camera into a fake mobs forehead

- Get the UI to see the net entity in pause space by using a
ViewSubscriber to get the Pvs from the initially stored identity entity

- Remove all the other parts used to try to get this to work before hand

* Raaaaadiallllllls also fix protection coefficents

- Change FancyWindow to Radial

- Fix Issue where coeffeient checking was the wrong way round

* absolutely massive cleanup, no more camera in mobs

- cleaned up event variables that are not needed

- Removed the use of a Pause space and go back to Nullspace usage

- use a PvsOverride rather than ViewSharing

- Remove old commented out code and Lots of unused code

* Fix "Ui elements" dying  on the screen

- some minor cleanup

- don't start the entities that get cloned

* ftl, cleanup, and fixing missing transform details

- add replace functionality to TypingIndicatorSystem and
BodyEmotesSystem

- add placeholder sounds and functions to TransformBodyEmotes

- add extra Pvs handling for later use

- attributions for the funny straw sound

- Sound collections for all of the sounds

- various cleanups

* Some extra cleanup

* Fix some false assumptions about TypingIndicator

- Bubbles now transfer on spawned humans rather than used humans

- Clean up YET MORE CODE

- make it so you can't eat yourself

* Oooprs, forgot to add a Husked Corpse Loc

* Missing period in the husked corpse loc

* bad devour windup placeholder

* Husking and WIP Lungs

- Husking now will be prevented from Revival fully and will change
the appearance of players

* Add finalized Sprites for actions and final meta

- add devour on and off sprites

- add transform action sprite

- Add Armblade sprite for future use

- Credit obscenelytinyshark for the sprites <3

* Remove ling lungs, Entity<> everything

- Remove the ling lungs stuff for now... body system is overly
complicated, makes my head hurt

- Switch every method to use Entity<> from Uid, Comp format

* cleanup, admin logging, WIP Roles

* Admin verb, Roundstart, gamerule stuff

- add a Admin verb to make Changelingification easy!

- Add game rule stuff for admin verb and to tell the hapless
goober how to be a changeling... sorta

- clean up parts to make VV easy... USE THE VERB!!

* Armor Coefficent Check

- Remove bespoke changeling armor check and replace it
with a generic armor coefficient query.

* move to UnrevivableComponent instead of husked

- Move UnrevivableComponent to shared

- add Analyzable and ReasonMessage to UnrevivableComponent
to give granular control of the message and whether or not it shows up
in the analyzer

- remove the check for HuskedComponent in DefibrillatorSystem

* aaaaaaa CopyComp

- Some cleanup

- make Vocal system shared

- make VocalSystem Not make more Actions than it needs

- Use some code from ChameleonProjector so we can copy components

- partially ungod method the Transform system

* Cleanup, Moving more things to CopyComp

- TransformBodyEmotes now uses CopyComp (it's a server component so i
need to tell the server to deal with it

- TypingIndicatorComponent also now uses CopyComp

- cleaned up old, now unused "replace" methods in favor of CopyComp

- BodyEmotesSystem now has a publically accessable LoadSounds to deal
with the same problem Screaming had

* WIP

* Devour Windup noise, ForensicsSystem cleanup

* Revert VocalSystem Changes

- Reverted Moving VocalSystem to shared, copy comp acomplishes it

- added component.ScreamActionEntity = null; for copy comp

* cleanup unneeded comments

* revert an accidental line removal

* Remove duplicate SharedHumanoidAppearanceSystem

* Cleanup Typo's and import Forensics components for Dna

* Some more forensics calls

* cleanup use CopyComp for now until CopyComps

* CR cleanup

* Undo some SharedHumanoidAppearanceSystem changes

* Confound these spaces

* Some Copycomp stuff and fixing some PVS override

* use the proper TryCopyComps that are merged

* Change TransformMenu with RadialWithSector

* All sounds done, Fix lack of typing indicator issue

* Updated attributions to include used sound authors

* some ftl typos and mind_role text issue

* DNA, Screaming, appearance, grammar, wagging

- reduced all of the above using ApplyComponentChanges

- Issue still remains with bodyEmotes sticking around in the UI

* Fix UI stuff, partials, entprotoid, good practices

- bunch of partials added

- UI now has a predicted message

- EntProtoID in the admin verb

- RipClothing now uses Entity<ButcherableComponent>

- husking is now optional (off by default) for testing/till we have
hivemind/when we figure out what were doing with devour

- remove TransformGrammarSet

* More CR stuff and documentation

- Make TargetIsProtected less of a meme, with a prototype
set of DamageTypes to check

- Documenation everywhere

- Move DevourEvents into its own file

* Predicted sounds and fix the comp clone list

- Made all start and stop sounds shared

- Split out the rest of the events and UI stuff into subfiles

- Fixed some Clone comp list issues where comments had -'s causing them
to be read incorrectly

* Damage cap check, Identity Shutdown cleanup, cleanup

* Sound stuff (but actually this time)

* Missed documentation

* Missed Documentation and a EntProtoId

* Remove unused dependency

* Remove a nullcheck

* Some dummy minplayers

* CR - Husked now uses a rem/ensure

* Update Actions in the Prototype

* Fixup mindswap handover

- cleanup and handover PVS on mindswap

* Fixup Missing meta from accidental "Take-theirs"

* Add the Armblade to the roundstart-role

* Cleanup, CR (everything but the UI and renames)

* missed a spot

* missed some more whitespace

* Renames

* Primary constructor and a space in these trying times

* User interface stuff for Slime transformation

* popup prediction

* Ling devour no longer makes duplicate identities

- added a key to identities to the original victim

- Add some extra clone settings

* add guard statements to OnClones

* SentOnlyToOwner additions

* fix for sound stoppage error

* Move Organ deleter into soon to be atomized husk

* clone event inventory

* mono sounds

* lower sound volume

* Fix networked sound warning

* Clone comps thing

* review

* attributions

* Fix clobbered changes

* I'm gonna weh out

- whole bunch of CR changes

* fix some very buggy git

* okay its fixed

* address most review points

* fix inventory

* we hate entityuids

* fix test and more cleanup

* move this

* fix more stuff

* fix validation and rootable

* Remove Quickswitch due to some UI quirks

* oops left out some better explanation

* remove dangling LastConsumed component fields

* fix test fail

* try this

* cleanup cloning subscriptions, add movement speed modifier

* fix slime storage

* fix cloning setting inheritance

* Add session information to transform admin logs

* slay the integration test hydra

* dwarf size

* more volume tweaks

* comments

* improve comments and unpredict deletion due to errors when shutting down the server

* fix displancement cloning

---------

Co-authored-by: ScarKy0 <scarky0@onet.eu>
Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
This commit is contained in:
poklj
2025-08-06 16:55:49 -03:00
committed by GitHub
parent 534553dddf
commit f76e3b63b7
52 changed files with 1583 additions and 93 deletions

View File

@@ -0,0 +1,35 @@
- type: entity
parent: MobHuman
id: MobLing
name: Urist McLing
suffix: Non-Antag
components:
- type: ChangelingDevour
- type: ChangelingIdentity
- type: ChangelingTransform
- type: ActionGrant
actions:
- ActionRetractableItemArmBlade # Temporary addition, will inevitably be a purchasable in the bio-store
- type: entity
id: ActionChangelingDevour
name: "[color=red]Devour[/color]"
description: Consume the essence of your victims and subsume their identity and mind into your own.
components:
- type: Action
icon: { sprite : Interface/Actions/changeling.rsi, state: "devour" }
iconOn: { sprite : Interface/Actions/changeling.rsi, state: "devour_on" }
priority: 1
- type: TargetAction
- type: EntityTargetAction
event: !type:ChangelingDevourActionEvent
- type: entity
id: ActionChangelingTransform
name: "[color=red]Transform[/color]"
description: Transform and assume the identities of those you have devoured.
components:
- type: Action
icon: { sprite : Interface/Actions/changeling.rsi, state: "transform" }
- type: InstantAction
event: !type:ChangelingTransformActionEvent

View File

@@ -1,13 +1,12 @@
# Settings for cloning bodies
# If you add a new trait, job specific component or a component doing visual/examination changes for humanoids
# then add it here to the correct prototype.
# The datafields of the components are only shallow copied using CopyComp.
# The datafields of the components copied using CopyComp.
# Subscribe to CloningEvent instead if that is not enough.
# for basic traits etc.
# used by the random clone spawner
# for basic physical traits
- type: cloningSettings
id: BaseClone
id: Body
components:
# general
- DetailExaminable
@@ -15,8 +14,9 @@
- Fingerprint
- NpcFactionMember
# traits
# - LegsParalyzed (you get healed)
- BlackAndWhiteOverlay
- Clumsy
# - LegsParalyzed (you get healed)
- LightweightDrunk
- Muted
- Narcolepsy
@@ -26,14 +26,6 @@
- PermanentBlindness
- Snoring
- Unrevivable
# job specific
- BibleUser
- CommandStaff
- Clumsy
- MindShield
- MimePowers
- SpaceNinja
- Thieving
# accents
- Accentless
- BackwardsAccent
@@ -62,6 +54,30 @@
- SouthernAccent
- SpanishAccent
- StutteringAccent
# for job-specific traits etc.
- type: cloningSettings
id: Special
components:
- BibleUser
- CommandStaff
- MindShield
- MimePowers
- SpaceNinja
- Thieving
# antag roles
- type: cloningSettings
id: Antag
components:
- HeadRevolutionary
- Revolutionary
- NukeOperative
# a full clone with all traits and items, but no antag roles
- type: cloningSettings
id: BaseClone
parent: [Body, Special]
blacklist:
components:
- AttachedClothing # helmets, which are part of the suit
@@ -69,26 +85,47 @@
- Implanter # they will spawn full again, but you already get the implant. And we can't do item slot copying yet
- VirtualItem
# all antagonist roles
- type: cloningSettings
id: Antag
parent: BaseClone
components:
- HeadRevolutionary
- Revolutionary
- NukeOperative
# for cloning pods
- type: cloningSettings
id: CloningPod
parent: Antag
parent: [BaseClone, Antag]
forceCloning: false
copyEquipment: null
copyInternalStorage: false
copyImplants: false
# spawner
# for paradox clones
- type: cloningSettings
id: ParadoxCloningSettings
parent: [BaseClone, Antag]
# changeling identity copying
- type: cloningSettings
id: ChangelingCloningSettings
parent: Body
components:
# These are already part of the base species prototype that is spawned for the clone,
# that means we only need to copy them over when switching between species.
# So these don't need to be part of the Body settings, unless someone makes a trait that adjusts these components.
- BodyEmotes
- Fixtures
- Speech
- TypingIndicator
- ScaleVisuals # for dwarf height
eventComponents:
# these need special treatment in the event subscription
- Inventory # arachnid pockets and diona feet
- Wagging # lizard tails
- Vocal # voice sounds
- Storage # slime storage
- Rootable # diona
- Sericulture # arachnids
- MovementSpeedModifier # moths when weightless
copyEquipment: null
copyInternalStorage: false
copyImplants: false
# spawner
- type: entity
id: RandomCloneSpawner
name: Random Clone

View File

@@ -225,6 +225,30 @@
mindRoles:
- MindRoleTraitorReinforcement
- type: entity
id: Changeling
parent: BaseGameRule
components:
- type: GameRule
minPlayers: 25
- type: AntagSelection
definitions:
- prefRoles: [ Changeling ]
max: 3
playerRatio: 15
briefing:
text: changeling-role-greeting
color: Red
components:
- type: ChangelingDevour
- type: ChangelingIdentity
- type: ChangelingTransform
- type: ActionGrant
actions:
- ActionRetractableItemArmBlade # Temporary addition, will inevitably be a purchasable in the bio-store
mindRoles:
- MindRoleChangeling
- type: entity
id: Revolutionary
parent: BaseGameRule

View File

@@ -0,0 +1,6 @@
- type: antag
id: Changeling
name: roles-antag-changeling-name
antagonist: true
setPreference: false # TODO: set this to true once Changeling exits WIP status
objective: roles-antag-changeling-objective

View File

@@ -307,3 +307,16 @@
exclusiveAntag: true
subtype: role-subtype-zombie
- type: ZombieRole
# Changeling
- type: entity
parent: BaseMindRoleAntag
id: MindRoleChangeling
name: Changeling Role
components:
- type: MindRole
antagPrototype: Changeling
exclusiveAntag: true
roleType: SoloAntagonist
subtype: role-subtype-changeling
- type: ChangelingRole

View File

@@ -0,0 +1,14 @@
- type: soundCollection
id: ChangelingDevourConsume
files:
- /Audio/Effects/Changeling/devour_consume.ogg
- type: soundCollection
id: ChangelingDevourWindup
files:
- /Audio/Effects/Changeling/devour_windup.ogg
- type: soundCollection
id: ChangelingTransformAttempt
files:
- /Audio/Effects/Changeling/changeling_transform.ogg