Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New Playable Species: Lamia #479

Closed
wants to merge 64 commits into from
Closed

Conversation

VMSolidus
Copy link
Contributor

@VMSolidus VMSolidus commented Nov 25, 2023

About the PR

This is a draft PR for an upcoming new playable species, the Lamia. Lamia are an older species from the 2022 era of Nyanotrasen, and were previously abandoned code that was dropped from the game on October 13th, 2022. I was able to locate what I believe to be the last remaining branch containing Lamia, from a defunct server repository that ran an October 12th, 2022 build of Nyanotrasen. Thus I began a project to refurbish this code for use on modern SS14.

The Lamia I wish to PR are only recognizable from the original Lamia in that they share the Tail Segment System. That is, they prominently feature a completely unique mechanic whereby their body is composed of multiple entities linked together in a chain. The original version of this code had a great many bugs related to the game's physics system, and it was severely limited by the Robust Toolbox engine at the time. In the year since Lamia's abandonment, Robust Toolbox has gone through many iterations and improvements, and has deprecated large parts of the physics system that old Lamia utilized.

Redesigns from the original 2022 Lamia, AKA Nyanotrasen Lamia. Vs. DeltaV Lamia

The original Nyanotrasen Lamia were made with several limitations in mind. Their size was heavily restricted by the physics engine at the time, we aren't beholden to that same limitation anymore. Thus DeltaV Lamia are vastly larger than the Nyanotrasen Lamia, featuring a tail that is 5 tiles in length, with fully functional physics collisions. They were also not able to wear Hardsuits due to limitations of the SpriteComponent, and thus were instead designed around having a "Barotrauma resistance". On DeltaV code, we can arbitrarily state that species use different optional sprites for items, therefore its possible to have for example a Nukie Hardsuit, with its equipped-outerwear state, equipped-outerwear-lamia, equipped-outerwear-lamiainitialsegment, equipped-outerwear-lamiasegment, and so on. The Lamia Segments can simply state that if they equip a hardsuit, they utilize the -lamiasegment sprite option. Therefore its no longer necessary to create an entire new item solely so that snakes can wear a hardsuit.

Positive Traits

  • Extreme Size. Lamia are 5 tiles long, and weigh as much as a car. They make a mockery of mass contests, and they can push physics objects around simply by slithering into them.
  • Significantly larger health bar. A Lamia is put into critical condition at 200 damage, and dies at 300 damage. This is offset by the Lamia having a certain percentage of damage taken by the tail transferred to the main body.
  • High resistance to forced movement. Space Wind at standard pressure cannot move them.
  • Unusual hybrid damage melee via their Hypo-Fangs. Lamia bite attacks deal 1 point of armor piercing, 2 points of poison, 2 points of asphyxiation, and inject 3u of Space Drugs. Planned traitor items exist that add a fillable chemical reservoir that they can inject into people with their attacks.

Negative Traits

  • Extreme Size. Lamia are literally the size of a, "Broad side of a barn". A blind person could throw a rock, and still hit the Lamia. By extension its essentially impossible for a Lamia to evade attacks. Yea you can take hits, but you're also going to take hits. All of them.
  • Paramedics WORST ENEMY. Since they weigh as much as a car, even Oni struggle to drag them. Even a rollerbed only slightly helps drag a Lamia around.
  • Vulnerability to AOE damage. An explosion that simultaneously strikes a Lamia's entire tail, plus their body, will deal double damage.
  • Cannot wear shoes. Although not being able to wear magboots is also offset to their natural high resistance to space wind.
  • Extreme size also means Lamia are functionally uncloneable. They require 770 units of Biomass, the equivalent of 5.5 Onis, in order to be cloned.

Why / Balance

This PR is part of an ongoing project to add exciting new content to the DeltaV repository, with a focus on keeping the theme of "Monster People" species, per request by admins.

Technical details

The code regarding Tail Segments is actually unfinished, and still needs significant overhauling before this PR can be undrafted. Here's a few concerns:

  • Implement "Marking Parity"
  • Make/Commission/Request new markings for the Lamia and her tail segments
  • Implement "Hardsuit Appearance Parity"
  • ServerLamiaSystem now utilizes new physics engine options.
  • "We need to be able to spawn 80 Lamias without slowing down the server -Debug", this is a hard requirement. Having 32 tail segments is not required. I would prefer that we have 32 tail segments, but if we optimize their code for performance and still find out we aren't meeting the 80 Lamia hard requirement, I am willing to reduce them to as low as 16 to 20 segments.
  • Implement Wizden's upcoming "Shoot Over Corpses unless they're targetted" for Lamia Tails.
  • Reimplement the mechanic for Segments sharing their healthbar with the Lamia.
  • Possibly make it so that Lamia can only wear Jumpskirts? I'd want to outright get rid of the layer mask if possible.

Non-Technical TODO list

These are all the TODO's that don't necessarily involve C#, and primarily live in the YAML side of things.

  • Implement marking customization for Lamia. They should have marking variations for More/Less humanlike versions. Such as a Snake Head(We can re-use the Lizard snake head), Medusa Head, changing how far up the scales go, and if the Lamia has human skin or full scales. I'd like to have tail pattern variations that can be set in the character customization, but that is also pending the VisualizerSystem for tail segments.
  • Make their hardsuit variants. Not actually difficult, just takes some time.
  • Finely tune their numerical values. Basically nothing on the YAML side of things is final, and is subject to change pending beta feedback and/or testing.

Media

spacenoodle

One of the downsides of having extreme mass.
image

Working Collision physics:
Noodle movement

Changelog

🆑 VMSolidus, @Elijahrane, and @noctyrnal

  • add: Lamia have been added to the game as a new playable species!

@github-actions github-actions bot added Changes: C# Changes any cs files Changes: Sprite Changes any png or json in an rsi Changes: YML Changes any yml files labels Nov 25, 2023
Copy link
Contributor

github-actions bot commented Nov 25, 2023

RSI Diff Bot; head commit a3b4ca5 merging into 6f4f31f
This PR makes changes to 1 or more RSIs. Here is a summary of all changes:

Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertengineer.rsi

State Old New Status
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertjanitor.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertleader.rsi

State Old New Status
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertmedical.rsi

State Old New Status
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/ERTSuits/ertsecurity.rsi

State Old New Status
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/atmospherics.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/brigmedic.rsi

State Old New Status
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/capspace.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/cburn.rsi

State Old New Status
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/clown.rsi

State Old New Status
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/cybersun.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/deathsquad.rsi

State Old New Status
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering-white.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/lingspacesuit.rsi

State Old New Status
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/luxury.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/maxim.rsi

State Old New Status
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/medical.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/mime.rsi

State Old New Status
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/paramed.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/piratecaptain.rsi

State Old New Status
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/pirateeva.rsi

State Old New Status
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/salvage.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/santahardsuit.rsi

State Old New Status
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/security-red.rsi

State Old New Status
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/security-warden.rsi

State Old New Status
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/security.rsi

State Old New Status
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/spatio.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiecommander.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/syndieelite.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiemedic.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Hardsuits/wizard.rsi

State Old New Status
segment Added

Resources/Textures/Clothing/OuterClothing/Suits/ancient_voidsuit.rsi

State Old New Status
segment Added

Resources/Textures/Clothing/OuterClothing/Suits/atmos_firesuit.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Suits/bombsuit.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Suits/eva.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Suits/eva_emergency.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Suits/eva_prisoner.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Suits/eva_syndicate.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Suits/fire.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Suits/rad.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/Clothing/OuterClothing/Suits/spaceninja.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/advanced.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/corpsman.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/hos.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/medical.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/officer.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/riot.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/standard.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/warden.rsi

State Old New Status
equipped-OUTERCLOTHING-lamia Added
segment Added

Resources/Textures/DeltaV/Mobs/Customization/Lamia/lamia_tails.rsi

State Old New Status
body3tone1 Added
body3tone2 Added
body3tone3 Added
bottom3tone1 Added
bottom3tone2 Added
bottom3tone3 Added
tip3tone1 Added
tip3tone2 Added
tip3tone3 Added

Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/brute_damage.rsi

State Old New Status
Chest_Brute_120 Added
Chest_Brute_200 Added
Chest_Brute_60 Added
Head_Brute_120 Added
Head_Brute_200 Added
Head_Brute_60 Added
LArm_Brute_120 Added
LArm_Brute_200 Added
LArm_Brute_60 Added
LLeg_Brute_120 Added
LLeg_Brute_200 Added
LLeg_Brute_60 Added
RArm_Brute_120 Added
RArm_Brute_200 Added
RArm_Brute_60 Added
RLeg_Brute_120 Added
RLeg_Brute_200 Added
RLeg_Brute_60 Added

Resources/Textures/Nyanotrasen/Mobs/Effects/Lamia/burn_damage.rsi

State Old New Status
Chest_Burn_120 Added
Chest_Burn_200 Added
Chest_Burn_60 Added
Head_Burn_120 Added
Head_Burn_200 Added
Head_Burn_60 Added
LArm_Burn_120 Added
LArm_Burn_200 Added
LArm_Burn_60 Added
LLeg_Burn_120 Added
LLeg_Burn_200 Added
LLeg_Burn_60 Added
RArm_Burn_120 Added
RArm_Burn_200 Added
RArm_Burn_60 Added
RLeg_Burn_120 Added
RLeg_Burn_200 Added
RLeg_Burn_60 Added

Resources/Textures/Nyanotrasen/Mobs/Species/lamia.rsi

State Old New Status
bottom Added
placeholder Added
tip Added
torso_f Added
torso_m Added
underscales Added
verbiconfangs Added

Edit: diff updated after a3b4ca5

@Elijahrane
Copy link

Elijahrane commented Nov 25, 2023

ClientLamiaSystem is responsible for handling sprites, yet for reasons currently unknown to me, is not correctly receiving the OnSegmentSpawnedEvent from the server. I'm not an experienced enough coder to fix this on my own.

Already provided some tips re: event networking in Discord DMs.

I ultimately need to give an InventoryComponent, HumanoidAppearanceComponent, and SpeciesComponent to the Lamia Segments, this is its own can of worms, but is necessary for me to get their intended features working.

Can you post the problem you are trying to solve with this? I think there's probably a better solution.

Lamia Segments need to equip a duplicate hardsuit when their parent Lamia equips a hardsuit, and then delete said hardsuit when their parent Lamia unequips a hardsuit.
Lamia Segments need to equip a duplicate PDA/ID when their parent equips a PDA/ID, this will stop the problem of doors that aren't public access slamming on lamia tails, and getting the poor creatures stuck.

You don't want to do this via spawning extra entities. The hardsuits can be probably be visual, just adding a layer like clothes do, and the second one can just be done via AccessComponent.

@VMSolidus
Copy link
Contributor Author

VMSolidus commented Nov 25, 2023

I ultimately need to give an InventoryComponent, HumanoidAppearanceComponent, and SpeciesComponent to the Lamia Segments, this is its own can of worms, but is necessary for me to get their intended features working.

Can you post the problem you are trying to solve with this? I think there's probably a better solution.

I am slightly mistaken in that I don't need a SpeciesComponent or HumanoidAppearance. The relevant component InventoryComponent is the one I want to use so that I can make use of sprite variations. It's currently only used in our code by Vulpkanin
image

Basically, if I give LamiaSegments the InventoryComponent with a speciesId: LamiaSegment, then if the lamia segment at any point equips an article of clothing that has a -LamiaSegment state, then it'll use the -LamiaSegment state instead of its normal state. The same can be done with InitialLamiaSegment and LamiaSegmentTip, as well as -Lamia for the lamia herself. This prevents me from needing to create new items for lamia-only hardsuits, I can instead solely create sprites for the lamia variations, and the InventoryComponents will handle the rest of the work for me.

This solution is also necessary because I wish for Lamia segments to share damage resistances with whatever armor the Lamia herself wears.

Also, thanks for the tip about AccessComponent.

@DebugOk
Copy link
Contributor

DebugOk commented Nov 25, 2023

then if the lamia segment at any point equips an article of clothing that has a -LamiaSegment state

So even more entities that aren't needed. They shouldn't be spawning any new entities for putting on stuff, and only referencing the main lamia entity

@VMSolidus
Copy link
Contributor Author

So even more entities that aren't needed. They shouldn't be spawning any new entities for putting on stuff, and only referencing the main lamia entity

Well you're not wrong, although I'm still having trouble getting the Client and Server to actually talk. I tried changing Client to use SubscribeNetworkEvent and Server to use RaiseNetworkEvent. I just end up with this.
image

Do you have any assistance you can give here? I can't even begin trying to put sprite layers on the segments if I can't change the sprites for the segments in the first place. So we won't do so via entities, but I still need to be able to change sprite layers.

@VMSolidus
Copy link
Contributor Author

Well the code no longer works again. I should say the server works fine, but the client now crashes to desktop on startup. I started work on changing out the sprite fuckery for a Visualizer, which will apparently make things easier for me. A lot easier actually.

@VMSolidus
Copy link
Contributor Author

I've gone ahead and updated the TODO list to reflect new feedback and assistance regarding the development process. This should now accurately state all the tasks that need to be completed for Lamia to be merged.

@VMSolidus
Copy link
Contributor Author

Marking Parity here!

image

@DebugOk DebugOk added the S: Derelict Has not been active for a while label Feb 12, 2024
@VMSolidus
Copy link
Contributor Author

VMSolidus commented Feb 14, 2024

image
After a long hiatus due to a pressing need to actually finish Harpies(Hooray, they're finally done after so long since their initial release!), I now return to coding Lamia. This time I've finished coding their damage splitting mechanic.
-Each tail segment has its own healthbar
-When a tail segment is damaged(Or healed! Healing is just negative number damage), it divides the incoming damage by the total number of tail segments, then divides it by 5.
-The final damage total is then applied to the parent Lamia. This follows my originally stated math formula that, "If a wide swing connects with all of a lamia's tail segments at once, plus the Lamia herself, the lamia will have taken 20% bonus damage."

@github-actions github-actions bot added the S: Merge Conflict Fix your PR! label Feb 14, 2024
Copy link
Contributor

This pull request has conflicts, please resolve those before we can evaluate the pull request.

@github-actions github-actions bot removed the S: Merge Conflict Fix your PR! label Feb 14, 2024
@VMSolidus
Copy link
Contributor Author

I have just checked off FOUR of the requirements in the past 4 hours.

  • Lamia now have Hardsuit Texture Parity. It is now possible for Lamia tails to have custom hardsuit sprites
  • Lamia can now only wear skirts, and cannot obtain pants in character creation
  • Lamia tails now transfer damage to the Lamia herself
  • Lamia cannot accidentally hit her own tail
  • Guns will now shoot over lamia tails, unless intentionally targeted(Guns hitting the Lamia main body instead of tail helps balance them out by making guns a very effective weapon against them. Since hitting her main body deals full damage)
  • The Anytaur mask has been 1984'd, it is now no longer required. Goodbye terrible layering, welcome to the new age of nonhumanoid body shapes.

Visuals for hardsuits are still not final, and require sprites to be made. However they DO WORK.
https://github.com/DeltaV-Station/Delta-v/assets/16548818/0783af37-75d8-46c9-b014-2122152b4ac7

@VMSolidus
Copy link
Contributor Author

@VMSolidus
Copy link
Contributor Author

image
New update, including sprites for a majority of the coregame hardsuits. There is still more todo on the coding side of things. I need to refactor the code, and also address a gamebreaking bug I've found concerning portals. Noctis is still at work making lamia hardsuits for the remaining suits that exist ingame.

Bad.portals.mp4

@VMSolidus
Copy link
Contributor Author

I'm ditching the requirement for access-code inheritance since that will require changing an unholy amount of upstream code, which I am unwilling to do for the sake of a species. Lamia greyshirts will simply need to learn to deal with making sure they can get through a door without having it slam on their tail while trying to tailgate their way into security.

That is going to leave finishing up the last of their necessary sprites, and some code touchups. Lamia are now 95% complete.

@VMSolidus
Copy link
Contributor Author

In order to address the need for fine tuning, I instead made an enormous math equation to derive their damage modifiers from their tail length(which is itself a variable that can be set for the sake of server performance).

@VMSolidus
Copy link
Contributor Author

VMSolidus commented Feb 17, 2024

portal.bug.fixed.mp4

The portal bug is now fixed. Lamia are now able to use portals.

@VMSolidus VMSolidus marked this pull request as ready for review February 20, 2024 02:11
@VMSolidus VMSolidus requested a review from DebugOk as a code owner February 20, 2024 02:11
@VMSolidus
Copy link
Contributor Author

Lamiablending
I have made some improvements to the initial starting marking for Lamia. And now every hardsuit in the game except for Admeme suits has been added for Lamia to wear(I was forced to make a placeholder suit for ERT Janitor because the content integration tests demanded so)

@DebugOk DebugOk removed the S: Derelict Has not been active for a while label Feb 21, 2024
@VMSolidus
Copy link
Contributor Author

VMSolidus commented Feb 21, 2024

Known Issues:

  • Lamia cannot wideswing(I have a pending fix for this)
  • Lamia cannot use firearms(Depends on an upstream PR that isn't merged yet)
  • Performance issues with 30 segment tails. Needs to be about 24 for Periapsis, 12-16 for Apoapsis
  • Needs a better solution for resetting the tail that doesn't involve deleting the entire tail
  • Container bug applies to dragon nomming too.
  • Probably need to replace the container behavior with the aforementioned "Nullspace the tail until it leaves the container".
  • Invisibility only makes the main body invisible
  • Some space suits that have custom lamia sprites lack the necessary tag, double check that all space suits have the LamiaHardsuit tag

@DebugOk
Copy link
Contributor

DebugOk commented Feb 21, 2024

Maybe find some people interested in helping break Lamia by the time you're ready to test them again

Copy link
Contributor

This pull request has conflicts, please resolve those before we can evaluate the pull request.

@github-actions github-actions bot added S: Merge Conflict Fix your PR! Changes: Map and removed Changes: YML Changes any yml files labels Mar 17, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Changes: C# Changes any cs files Changes: Map Changes: Sprite Changes any png or json in an rsi S: Merge Conflict Fix your PR! S: Needs Review
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants