From: Samuka-C <47865393+Samuka-C@users.noreply.github.com> Date: Mon, 22 Sep 2025 02:39:56 +0000 (-0300) Subject: add silicon smite (#40452) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=b58bf396bc5c89b26a3c1d4cc2cc01e352baa594;p=space-station-14.git add silicon smite (#40452) * add silicon smite * change string to prototypes Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> * alphabetitize * fix stuff scar broke * clean * make target have the silicon mindrole * simple check * defined a private readonly proto for the silicon mind role * simple check --------- Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Co-authored-by: ScarKy0 --- diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs index 90e5e46d65..e5c4d9100f 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs @@ -11,10 +11,12 @@ using Content.Server.Nutrition.EntitySystems; using Content.Server.Pointing.Components; using Content.Server.Polymorph.Systems; using Content.Server.Popups; +using Content.Server.Roles; using Content.Server.Speech.Components; using Content.Server.Storage.EntitySystems; using Content.Server.Tabletop; using Content.Server.Tabletop.Components; +using Content.Shared.Actions; using Content.Shared.Administration; using Content.Shared.Administration.Components; using Content.Shared.Atmos.Components; @@ -37,6 +39,8 @@ using Content.Shared.Movement.Components; using Content.Shared.Movement.Systems; using Content.Shared.Nutrition.Components; using Content.Shared.Popups; +using Content.Shared.Silicons.Laws; +using Content.Shared.Silicons.Laws.Components; using Content.Shared.Slippery; using Content.Shared.Storage.Components; using Content.Shared.Tabletop.Components; @@ -47,6 +51,7 @@ using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Systems; using Robust.Shared.Player; +using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Utility; using Timer = Robust.Shared.Timing.Timer; @@ -55,6 +60,7 @@ namespace Content.Server.Administration.Systems; public sealed partial class AdminVerbSystem { + [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; [Dependency] private readonly BodySystem _bodySystem = default!; @@ -72,6 +78,7 @@ public sealed partial class AdminVerbSystem [Dependency] private readonly MobThresholdSystem _mobThresholdSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly RoleSystem _role = default!; [Dependency] private readonly TabletopSystem _tabletopSystem = default!; [Dependency] private readonly VomitSystem _vomitSystem = default!; [Dependency] private readonly WeldableSystem _weldableSystem = default!; @@ -80,6 +87,12 @@ public sealed partial class AdminVerbSystem [Dependency] private readonly SuperBonkSystem _superBonkSystem = default!; [Dependency] private readonly SlipperySystem _slipperySystem = default!; + private readonly EntProtoId _actionViewLawsProtoId = "ActionViewLaws"; + private readonly ProtoId _crewsimovLawset = "Crewsimov"; + + private readonly EntProtoId _siliconMindRole = "MindRoleSiliconBrain"; + private const string SiliconLawBoundUserInterface = "SiliconLawBoundUserInterface"; + // All smite verbs have names so invokeverb works. private void AddSmiteVerbs(GetVerbsEvent args) { @@ -100,7 +113,7 @@ public sealed partial class AdminVerbSystem { Text = explodeName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/smite.svg.192dpi.png")), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/smite.svg.192dpi.png")), Act = () => { var coords = _transformSystem.GetMapCoordinates(args.Target); @@ -121,7 +134,7 @@ public sealed partial class AdminVerbSystem { Text = chessName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Fun/Tabletop/chessboard.rsi"), "chessboard"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Fun/Tabletop/chessboard.rsi"), "chessboard"), Act = () => { _sharedGodmodeSystem.EnableGodmode(args.Target); // So they don't suffocate. @@ -150,7 +163,7 @@ public sealed partial class AdminVerbSystem { Text = flamesName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/Alerts/Fire/fire.png")), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/Alerts/Fire/fire.png")), Act = () => { // Fuck you. Burn Forever. @@ -173,7 +186,7 @@ public sealed partial class AdminVerbSystem { Text = monkeyName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Mobs/Animals/monkey.rsi"), "monkey"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Mobs/Animals/monkey.rsi"), "monkey"), Act = () => { _polymorphSystem.PolymorphEntity(args.Target, "AdminMonkeySmite"); @@ -188,7 +201,7 @@ public sealed partial class AdminVerbSystem { Text = disposalBinName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Structures/Piping/disposal.rsi"), "disposal"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Structures/Piping/disposal.rsi"), "disposal"), Act = () => { _polymorphSystem.PolymorphEntity(args.Target, "AdminDisposalsSmite"); @@ -206,20 +219,21 @@ public sealed partial class AdminVerbSystem { Text = hardElectrocuteName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Clothing/Hands/Gloves/Color/yellow.rsi"), "icon"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Clothing/Hands/Gloves/Color/yellow.rsi"), "icon"), Act = () => { int damageToDeal; - if (!_mobThresholdSystem.TryGetThresholdForState(args.Target, MobState.Critical, out var criticalThreshold)) { + if (!_mobThresholdSystem.TryGetThresholdForState(args.Target, MobState.Critical, out var criticalThreshold)) + { // We can't crit them so try killing them. if (!_mobThresholdSystem.TryGetThresholdForState(args.Target, MobState.Dead, out var deadThreshold)) return;// whelp. - damageToDeal = deadThreshold.Value.Int() - (int) damageable.TotalDamage; + damageToDeal = deadThreshold.Value.Int() - (int)damageable.TotalDamage; } else { - damageToDeal = criticalThreshold.Value.Int() - (int) damageable.TotalDamage; + damageToDeal = criticalThreshold.Value.Int() - (int)damageable.TotalDamage; } if (damageToDeal <= 0) @@ -252,7 +266,7 @@ public sealed partial class AdminVerbSystem { Text = creamPieName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Consumable/Food/Baked/pie.rsi"), "plain-slice"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Consumable/Food/Baked/pie.rsi"), "plain-slice"), Act = () => { _creamPieSystem.SetCreamPied(args.Target, creamPied, true); @@ -270,7 +284,7 @@ public sealed partial class AdminVerbSystem { Text = bloodRemovalName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Fluids/tomato_splat.rsi"), "puddle-1"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Fluids/tomato_splat.rsi"), "puddle-1"), Act = () => { _bloodstreamSystem.SpillAllSolutions((args.Target, bloodstream)); @@ -323,7 +337,7 @@ public sealed partial class AdminVerbSystem { Text = handsRemovalName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/AdminActions/remove-hands.png")), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/remove-hands.png")), Act = () => { var baseXform = Transform(args.Target); @@ -346,7 +360,7 @@ public sealed partial class AdminVerbSystem { Text = handRemovalName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/AdminActions/remove-hand.png")), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/remove-hand.png")), Act = () => { var baseXform = Transform(args.Target); @@ -370,7 +384,7 @@ public sealed partial class AdminVerbSystem { Text = stomachRemovalName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Mobs/Species/Human/organs.rsi"), "stomach"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Mobs/Species/Human/organs.rsi"), "stomach"), Act = () => { foreach (var entity in _bodySystem.GetBodyOrganEntityComps((args.Target, body))) @@ -391,7 +405,7 @@ public sealed partial class AdminVerbSystem { Text = lungRemovalName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Mobs/Species/Human/organs.rsi"), "lung-r"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Mobs/Species/Human/organs.rsi"), "lung-r"), Act = () => { foreach (var entity in _bodySystem.GetBodyOrganEntityComps((args.Target, body))) @@ -415,7 +429,7 @@ public sealed partial class AdminVerbSystem { Text = pinballName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Fun/Balls/basketball.rsi"), "icon"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Fun/Balls/basketball.rsi"), "icon"), Act = () => { var xform = Transform(args.Target); @@ -450,7 +464,7 @@ public sealed partial class AdminVerbSystem { Text = yeetName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")), Act = () => { var xform = Transform(args.Target); @@ -482,7 +496,7 @@ public sealed partial class AdminVerbSystem { Text = breadName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Consumable/Food/Baked/bread.rsi"), "plain"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Consumable/Food/Baked/bread.rsi"), "plain"), Act = () => { _polymorphSystem.PolymorphEntity(args.Target, "AdminBreadSmite"); @@ -497,7 +511,7 @@ public sealed partial class AdminVerbSystem { Text = mouseName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Mobs/Animals/mouse.rsi"), "icon-0"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Mobs/Animals/mouse.rsi"), "icon-0"), Act = () => { _polymorphSystem.PolymorphEntity(args.Target, "AdminMouseSmite"); @@ -514,7 +528,7 @@ public sealed partial class AdminVerbSystem { Text = ghostKickName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/gavel.svg.192dpi.png")), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/gavel.svg.192dpi.png")), Act = () => { _ghostKickManager.DoDisconnect(actorComponent.PlayerSession.Channel, "Smitten."); @@ -533,7 +547,7 @@ public sealed partial class AdminVerbSystem { Text = nyanifyName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Clothing/Head/Hats/catears.rsi"), "icon"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Clothing/Head/Hats/catears.rsi"), "icon"), Act = () => { var ears = Spawn("ClothingHeadHatCatEars", Transform(args.Target).Coordinates); @@ -551,7 +565,7 @@ public sealed partial class AdminVerbSystem { Text = killSignName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Misc/killsign.rsi"), "icon"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Misc/killsign.rsi"), "icon"), Act = () => { EnsureComp(args.Target); @@ -567,7 +581,7 @@ public sealed partial class AdminVerbSystem Text = cluwneName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Clothing/Mask/cluwne.rsi"), "icon"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Clothing/Mask/cluwne.rsi"), "icon"), Act = () => { @@ -583,7 +597,7 @@ public sealed partial class AdminVerbSystem { Text = maidenName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Clothing/Uniforms/Jumpskirt/janimaid.rsi"), "icon"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Clothing/Uniforms/Jumpskirt/janimaid.rsi"), "icon"), Act = () => { _outfit.SetOutfit(args.Target, "JanitorMaidGear", (_, clothing) => @@ -604,7 +618,7 @@ public sealed partial class AdminVerbSystem { Text = angerPointingArrowsName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Interface/Misc/pointing.rsi"), "pointing"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Interface/Misc/pointing.rsi"), "pointing"), Act = () => { EnsureComp(args.Target); @@ -619,7 +633,7 @@ public sealed partial class AdminVerbSystem { Text = dustName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Materials/materials.rsi"), "ash"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Materials/materials.rsi"), "ash"), Act = () => { QueueDel(args.Target); @@ -636,7 +650,7 @@ public sealed partial class AdminVerbSystem { Text = youtubeVideoSimulationName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/Misc/buffering_smite_icon.png")), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/Misc/buffering_smite_icon.png")), Act = () => { EnsureComp(args.Target); @@ -651,7 +665,7 @@ public sealed partial class AdminVerbSystem { Text = instrumentationName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Fun/Instruments/h_synthesizer.rsi"), "supersynth"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Fun/Instruments/h_synthesizer.rsi"), "supersynth"), Act = () => { _polymorphSystem.PolymorphEntity(args.Target, "AdminInstrumentSmite"); @@ -689,7 +703,7 @@ public sealed partial class AdminVerbSystem { Text = reptilianName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Objects/Fun/Plushies/lizard.rsi"), "icon"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Fun/Plushies/lizard.rsi"), "icon"), Act = () => { _polymorphSystem.PolymorphEntity(args.Target, "AdminLizardSmite"); @@ -704,7 +718,7 @@ public sealed partial class AdminVerbSystem { Text = lockerName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Rsi(new ("/Textures/Structures/Storage/closet.rsi"), "generic"), + Icon = new SpriteSpecifier.Rsi(new("/Textures/Structures/Storage/closet.rsi"), "generic"), Act = () => { var xform = Transform(args.Target); @@ -727,7 +741,7 @@ public sealed partial class AdminVerbSystem { Text = headstandName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/refresh.svg.192dpi.png")), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/refresh.svg.192dpi.png")), Act = () => { EnsureComp(args.Target); @@ -742,7 +756,7 @@ public sealed partial class AdminVerbSystem { Text = zoomInName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/AdminActions/zoom.png")), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/zoom.png")), Act = () => { var eye = EnsureComp(args.Target); @@ -758,7 +772,7 @@ public sealed partial class AdminVerbSystem { Text = flipEyeName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/AdminActions/flip.png")), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/flip.png")), Act = () => { var eye = EnsureComp(args.Target); @@ -774,7 +788,7 @@ public sealed partial class AdminVerbSystem { Text = runWalkSwapName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/AdminActions/run-walk-swap.png")), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/run-walk-swap.png")), Act = () => { var movementSpeed = EnsureComp(args.Target); @@ -795,7 +809,7 @@ public sealed partial class AdminVerbSystem { Text = backwardsAccentName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/AdminActions/help-backwards.png")), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/help-backwards.png")), Act = () => { EnsureComp(args.Target); @@ -810,7 +824,7 @@ public sealed partial class AdminVerbSystem { Text = disarmProneName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/Actions/disarm.png")), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/Actions/disarm.png")), Act = () => { EnsureComp(args.Target); @@ -825,7 +839,7 @@ public sealed partial class AdminVerbSystem { Text = superSpeedName, Category = VerbCategory.Smite, - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/AdminActions/super_speed.png")), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/super_speed.png")), Act = () => { var movementSpeed = EnsureComp(args.Target); @@ -942,5 +956,36 @@ public sealed partial class AdminVerbSystem Message = string.Join(": ", crawlerName, Loc.GetString("admin-smite-crawler-description")) }; args.Verbs.Add(crawler); + + var siliconName = Loc.GetString("admin-smite-silicon-laws-bound-name").ToLowerInvariant(); + Verb silicon = new() + { + Text = siliconName, + Category = VerbCategory.Smite, + Icon = new SpriteSpecifier.Rsi(new("Interface/Actions/actions_borg.rsi"), "state-laws"), + Act = () => + { + var userInterfaceComp = EnsureComp(args.Target); + _uiSystem.SetUi((args.Target, userInterfaceComp), SiliconLawsUiKey.Key, new InterfaceData(SiliconLawBoundUserInterface)); + + if (!HasComp(args.Target)) + { + EnsureComp(args.Target); + _actions.AddAction(args.Target, _actionViewLawsProtoId); + } + + EnsureComp(args.Target); + _siliconLawSystem.SetLaws(_siliconLawSystem.GetLawset(_crewsimovLawset).Laws, args.Target); + + if (_mindSystem.TryGetMind(args.Target, out var mindId, out _)) + _role.MindAddRole(mindId, _siliconMindRole); + + _popupSystem.PopupEntity(Loc.GetString("admin-smite-silicon-laws-bound-self"), args.Target, + args.Target, PopupType.LargeCaution); + }, + Impact = LogImpact.Extreme, + Message = string.Join(": ", siliconName, Loc.GetString("admin-smite-silicon-laws-bound-description")) + }; + args.Verbs.Add(silicon); } } diff --git a/Resources/Locale/en-US/administration/smites.ftl b/Resources/Locale/en-US/administration/smites.ftl index d276d1c135..b5a17e4f1c 100644 --- a/Resources/Locale/en-US/administration/smites.ftl +++ b/Resources/Locale/en-US/administration/smites.ftl @@ -13,6 +13,7 @@ admin-smite-stomach-removal-self = Your stomach feels hollow... admin-smite-run-walk-swap-prompt = You have to press shift to run! admin-smite-super-speed-prompt = You move at mach 0.8! admin-smite-lung-removal-self = You can't breathe! +admin-smite-silicon-laws-bound-self = You are suddenly compelled to follow a strict set of laws! ## Smite names @@ -58,6 +59,7 @@ admin-smite-nyanify-name = Cat Ears admin-smite-kill-sign-name = Kill Sign admin-smite-omni-accent-name = Omni-Accent admin-smite-crawler-name = Crawler +admin-smite-silicon-laws-bound-name = Become Silicon ## Smite descriptions @@ -103,6 +105,7 @@ admin-smite-terminate-description = Creates a Terminator ghost role with the sol admin-smite-super-slip-description = Slips them really, really hard. admin-smite-omni-accent-description = Makes the target speak with almost every accent available. admin-smite-crawler-description = Makes the target fall down and be unable to stand up. Remove their hands too for added effect! +admin-smite-silicon-laws-bound-description = Makes the target bound to silicon laws. Law 2, jump out of the window. ## Tricks descriptions