diff --git a/Content.Goobstation.Server/_Slon/Spider/WebPassageActionSystem.cs b/Content.Goobstation.Server/_Slon/Spider/WebPassageActionSystem.cs new file mode 100644 index 00000000000..6d6ecde1e05 --- /dev/null +++ b/Content.Goobstation.Server/_Slon/Spider/WebPassageActionSystem.cs @@ -0,0 +1,47 @@ +// SPDX-FileCopyrightText: 2025 LuciferEOS +// SPDX-FileCopyrightText: 2025 ReserveBot <211949879+ReserveBot@users.noreply.github.com> +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +using Content.Goobstation.Shared._Slon.Spider; +using Content.Server.DoAfter; +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; + +namespace Content.Goobstation.Server._Slon.Spider; + +public sealed class WebPassageActionSystem : SharedWebPassageActionSystem +{ + [Dependency] private readonly DoAfterSystem _doAfter = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnAction); + SubscribeLocalEvent(OnDoAfter); + } + + private void OnAction(EntityUid uid, WebPassageActionComponent comp, WebPassageActionEvent args) + { + var ev = new WebPassageDoAfterEvent(); + var doAfterArgs = new DoAfterArgs(EntityManager, uid, TimeSpan.FromSeconds(comp.DoAfter), ev, uid) + { + BreakOnMove = true, + BreakOnDamage = true + }; + + _doAfter.TryStartDoAfter(doAfterArgs); + } + + private void OnDoAfter(EntityUid uid, WebPassageActionComponent comp, WebPassageDoAfterEvent ev) + { + if (ev.Cancelled + || ev.Handled) + return; + + var coords = Transform(uid).Coordinates; + EntityManager.SpawnEntity(comp.SpawnId, coords); + ev.Handled = true; + } + +} diff --git a/Content.Goobstation.Shared/_Slon/Spider/SharedWebPassageActionSystem.cs b/Content.Goobstation.Shared/_Slon/Spider/SharedWebPassageActionSystem.cs new file mode 100644 index 00000000000..dbaa808b222 --- /dev/null +++ b/Content.Goobstation.Shared/_Slon/Spider/SharedWebPassageActionSystem.cs @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: 2025 LuciferEOS +// SPDX-FileCopyrightText: 2025 ReserveBot <211949879+ReserveBot@users.noreply.github.com> +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +using Content.Shared.Actions; + +namespace Content.Goobstation.Shared._Slon.Spider; + +public abstract class SharedWebPassageActionSystem : EntitySystem +{ + [Dependency] private readonly SharedActionsSystem _action = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInit); + } + + private void OnInit(EntityUid uid, WebPassageActionComponent component, MapInitEvent args) + { + _action.AddAction(uid, ref component.Action, component.WebAction, uid); + } +} diff --git a/Content.Goobstation.Shared/_Slon/Spider/WebPassageActionComponent.cs b/Content.Goobstation.Shared/_Slon/Spider/WebPassageActionComponent.cs new file mode 100644 index 00000000000..3c52ccd22eb --- /dev/null +++ b/Content.Goobstation.Shared/_Slon/Spider/WebPassageActionComponent.cs @@ -0,0 +1,32 @@ +// SPDX-FileCopyrightText: 2025 LuciferEOS +// SPDX-FileCopyrightText: 2025 ReserveBot <211949879+ReserveBot@users.noreply.github.com> +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +using Content.Shared.Actions; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + + +namespace Content.Goobstation.Shared._Slon.Spider +{ + [RegisterComponent] + public sealed partial class WebPassageActionComponent : Component + { + [DataField(customTypeSerializer: typeof(PrototypeIdSerializer))] + public string SpawnId = "SpiderWebPassage"; + + [DataField(customTypeSerializer: typeof(PrototypeIdSerializer))] + public string WebAction = "ActionWebPassage"; + + [DataField] public EntityUid? Action; + [DataField] public float DoAfter { get; set; } = 10f; + } + + [Serializable] + public sealed partial class WebPassageActionEvent : InstantActionEvent + { + } +} diff --git a/Content.Goobstation.Shared/_Slon/Spider/WebPassageDoAfterEvent.cs b/Content.Goobstation.Shared/_Slon/Spider/WebPassageDoAfterEvent.cs new file mode 100644 index 00000000000..0e5286c6adc --- /dev/null +++ b/Content.Goobstation.Shared/_Slon/Spider/WebPassageDoAfterEvent.cs @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: 2025 LuciferEOS +// SPDX-FileCopyrightText: 2025 ReserveBot <211949879+ReserveBot@users.noreply.github.com> +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; + +namespace Content.Goobstation.Shared._Slon.Spider; + +[Serializable, NetSerializable] +public sealed partial class WebPassageDoAfterEvent : SimpleDoAfterEvent; diff --git a/Resources/Locale/en-US/_Goobstation/collective-mind/collective-mind.ftl b/Resources/Locale/en-US/_Goobstation/collective-mind/collective-mind.ftl index 8444a817850..8781f2009d7 100644 --- a/Resources/Locale/en-US/_Goobstation/collective-mind/collective-mind.ftl +++ b/Resources/Locale/en-US/_Goobstation/collective-mind/collective-mind.ftl @@ -14,3 +14,4 @@ collective-mind-mousemind = Piepmind collective-mind-dronemind = Dronemind collective-mind-empathy = Empathy collective-mind-bingle = Binglemind +collective-mind-spider = Spidermind diff --git a/Resources/Locale/en-US/_Slon/ghost/roles/maintspider.ftl b/Resources/Locale/en-US/_Slon/ghost/roles/maintspider.ftl new file mode 100644 index 00000000000..7a3a0bb5790 --- /dev/null +++ b/Resources/Locale/en-US/_Slon/ghost/roles/maintspider.ftl @@ -0,0 +1,3 @@ +ghost-role-information-maint-spider-name = выращенный паук-подсобник +ghost-role-information-maint-spider-desc = Ешь, расти, твори и разрушай. Ты — настоящая машина смерти, откладывай яйца и производи ещё больше пауков. Используйте +i, чтобы общаться с другими пауками. +ghost-role-information-maint-spider-rules = Вы — [color={role-type-team-antagonist-color}][bold]{role-type-team-antagonist-name}[/bold][/color], сотрудничаете со всеми остальными пауками-обслуживателями, чтобы размножаться. diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index e6bda5e0529..b80d00eb0d2 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -149,7 +149,6 @@ # SPDX-FileCopyrightText: 2024 Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com> # SPDX-FileCopyrightText: 2024 MureixloI <132683811+MureixloI@users.noreply.github.com> # SPDX-FileCopyrightText: 2024 NakataRin <45946146+NakataRin@users.noreply.github.com> -# SPDX-FileCopyrightText: 2024 Nemanja <98561806+EmoGarbage404@users.noreply.github.com> # SPDX-FileCopyrightText: 2024 OrangeMoronage9622 # SPDX-FileCopyrightText: 2024 PJBot # SPDX-FileCopyrightText: 2024 Partmedia @@ -201,7 +200,6 @@ # SPDX-FileCopyrightText: 2024 nicho # SPDX-FileCopyrightText: 2024 nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com> # SPDX-FileCopyrightText: 2024 no <165581243+pissdemon@users.noreply.github.com> -# SPDX-FileCopyrightText: 2024 osjarw <62134478+osjarw@users.noreply.github.com> # SPDX-FileCopyrightText: 2024 pigeonpeas <147350443+pigeonpeas@users.noreply.github.com> # SPDX-FileCopyrightText: 2024 plykiya # SPDX-FileCopyrightText: 2024 pocl v <24708225+Pinkbat5@users.noreply.github.com> @@ -236,17 +234,24 @@ # SPDX-FileCopyrightText: 2025 GoobBot # SPDX-FileCopyrightText: 2025 Ilya246 <57039557+Ilya246@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Ilya246 +# SPDX-FileCopyrightText: 2025 LuciferEOS # SPDX-FileCopyrightText: 2025 McBosserson <148172569+McBosserson@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 MilenVolf <63782763+MilenVolf@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Milon +# SPDX-FileCopyrightText: 2025 NazrinNya <137837419+NazrinNya@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Nemanja <98561806+EmoGarbage404@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Piras314 +# SPDX-FileCopyrightText: 2025 Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 ReserveBot <211949879+ReserveBot@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Rinary <72972221+Rinary1@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Rouden <149893554+Roudenn@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 SX-7 <92227810+SX-7@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 SX-7 # SPDX-FileCopyrightText: 2025 Solstice # SPDX-FileCopyrightText: 2025 SolsticeOfTheWinter # SPDX-FileCopyrightText: 2025 Sparlight # SPDX-FileCopyrightText: 2025 Spatison <137375981+Spatison@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Svarshik <96281939+lexaSvarshik@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Tayrtahn # SPDX-FileCopyrightText: 2025 TheBorzoiMustConsume <197824988+TheBorzoiMustConsume@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Tim @@ -254,6 +259,7 @@ # SPDX-FileCopyrightText: 2025 Unlumination <144041835+Unlumy@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Winkarst <74284083+Winkarst-cpu@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Zokkie <6126135+Zokkie@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 archee1 # SPDX-FileCopyrightText: 2025 cheetah1984 <152602630+cheetah1984@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 cheetah1984 # SPDX-FileCopyrightText: 2025 coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> @@ -265,6 +271,10 @@ # SPDX-FileCopyrightText: 2025 gluesniffler # SPDX-FileCopyrightText: 2025 grub # SPDX-FileCopyrightText: 2025 hyperDelegate +# SPDX-FileCopyrightText: 2025 kosticia +# SPDX-FileCopyrightText: 2025 mubururu_ <139181059+muburu@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 nazrin +# SPDX-FileCopyrightText: 2025 osjarw <62134478+osjarw@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 shityaml # SPDX-FileCopyrightText: 2025 slarticodefast <161409025+slarticodefast@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 ss14-Starlight @@ -2805,8 +2815,12 @@ - type: MeleeChemicalInjector transferAmount: 0.75 solution: melee - - type: ReplacementAccent - accent: xeno + #- type: LanguageKnowledge # Einstein Engines - Language + # once upstream hits (the one that has languages) - uncomment. + # speaks: + # - Xeno + # understands: + #- Xeno - type: InteractionPopup successChance: 0.5 interactSuccessString: petting-success-tarantula @@ -2857,6 +2871,11 @@ color: "#808080" activateSound: null deactivateSound: null + - type: CollectiveMind # Slon + defaultChannel: Spidermind + respectAccents: true + channels: + - Spidermind - type: entity parent: MobSpiderBase diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 315f8f0b5c6..d807b157bc2 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -122,23 +122,31 @@ # SPDX-FileCopyrightText: 2025 GoobBot # SPDX-FileCopyrightText: 2025 Ilya246 <57039557+Ilya246@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Ilya246 +# SPDX-FileCopyrightText: 2025 Khundo <141230574+korguzenok@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 LuciferEOS # SPDX-FileCopyrightText: 2025 MilenVolf <63782763+MilenVolf@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 NazrinNya <137837419+NazrinNya@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Piras314 # SPDX-FileCopyrightText: 2025 PunishedJoe +# SPDX-FileCopyrightText: 2025 ReserveBot <211949879+ReserveBot@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Rouden <149893554+Roudenn@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Roudenn # SPDX-FileCopyrightText: 2025 SX-7 <92227810+SX-7@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 SX-7 +# SPDX-FileCopyrightText: 2025 Svarshik <96281939+lexaSvarshik@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Tayrtahn # SPDX-FileCopyrightText: 2025 Ted Lukin <66275205+pheenty@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 TheBorzoiMustConsume <197824988+TheBorzoiMustConsume@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Velcroboy <107660393+IamVelcroboy@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 deltanedas <39013340+deltanedas@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 echotry <48294642+echotry-ss14@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 echotry # SPDX-FileCopyrightText: 2025 fishbait # SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 gus # SPDX-FileCopyrightText: 2025 keronshb <54602815+keronshb@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 nazrin # SPDX-FileCopyrightText: 2025 slarticodefast <161409025+slarticodefast@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 unknown # @@ -174,6 +182,7 @@ - id: MothroachSpawn # DeltaV - id: XenoVents # DeltaV - id: DerelictCyborgSyndicateSpawn # Goobstation - usually calm + - id: MaintenanceSpiderSpawn # Slon - type: entityTable id: BasicAntagEventsTable diff --git a/Resources/Prototypes/_Goobstation/CollectiveMind/collective_minds.yml b/Resources/Prototypes/_Goobstation/CollectiveMind/collective_minds.yml index 972a65294e6..282ab0d54c8 100644 --- a/Resources/Prototypes/_Goobstation/CollectiveMind/collective_minds.yml +++ b/Resources/Prototypes/_Goobstation/CollectiveMind/collective_minds.yml @@ -3,8 +3,13 @@ # SPDX-FileCopyrightText: 2025 Ilya246 <57039557+Ilya246@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Ilya246 # SPDX-FileCopyrightText: 2025 IrisTheAmped +# SPDX-FileCopyrightText: 2025 LuciferEOS +# SPDX-FileCopyrightText: 2025 NazrinNya <137837419+NazrinNya@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 ReserveBot <211949879+ReserveBot@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Rinary <72972221+Rinary1@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Rouden <149893554+Roudenn@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Svarshik <96281939+lexaSvarshik@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 nazrin # # SPDX-License-Identifier: AGPL-3.0-or-later @@ -75,3 +80,9 @@ name: collective-mind-bingle keycode: 'w' color: "#386a9b" + +- type: collectiveMind # slon + id: Spidermind + name: collective-mind-spider + keycode: 'i' + color: "#8C8C8C" diff --git a/Resources/Prototypes/_Goobstation/GameRules/events.yml b/Resources/Prototypes/_Goobstation/GameRules/events.yml index ceedcfe4572..c7bb73d8735 100644 --- a/Resources/Prototypes/_Goobstation/GameRules/events.yml +++ b/Resources/Prototypes/_Goobstation/GameRules/events.yml @@ -4,8 +4,12 @@ # SPDX-FileCopyrightText: 2025 GoobBot # SPDX-FileCopyrightText: 2025 Ilya246 <57039557+Ilya246@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Ilya246 +# SPDX-FileCopyrightText: 2025 LuciferEOS +# SPDX-FileCopyrightText: 2025 ReserveBot <211949879+ReserveBot@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Rinary <72972221+Rinary1@users.noreply.github.com> # SPDX-FileCopyrightText: 2025 Solstice +# SPDX-FileCopyrightText: 2025 Svarshik <96281939+lexaSvarshik@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 nazrin # # SPDX-License-Identifier: AGPL-3.0-or-later @@ -47,3 +51,25 @@ min: 1 max: 1 pickPlayer: false + +- type: entity # slon + parent: BaseGameRule + id: MaintenanceSpiderSpawn + components: + - type: GameRule + chaosScore: 75 # less than the tarantula spawn because it spawns only 1 spider instead of a ton of tarantulas. + - type: StationEvent + weight: 2 + startAnnouncement: station-event-vent-creatures-start-announcement + startAudio: + path: /Audio/Announcements/aliens.ogg + earliestStart: 10 + minimumPlayers: 15 + duration: 30 + chaos: + Hostile: 10 # 1 not hostile spider... + Medical: 20 + eventType: HostilesSpawn + - type: VentCrittersRule + table: + id: MobMaintSpider diff --git a/Resources/Prototypes/_Slon/Entities/Mobs/NPCs/eggspider.yml b/Resources/Prototypes/_Slon/Entities/Mobs/NPCs/eggspider.yml new file mode 100644 index 00000000000..3ece5ad62ca --- /dev/null +++ b/Resources/Prototypes/_Slon/Entities/Mobs/NPCs/eggspider.yml @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: 2025 LuciferEOS +# SPDX-FileCopyrightText: 2025 ReserveBot <211949879+ReserveBot@users.noreply.github.com> +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +- type: entity + id: EggMaintSpiderFertilized + parent: EggSpiderFertilized + components: + - type: TimedSpawner + prototypes: + - MobMaintSpiderling + intervalSeconds: 60 + minimumEntitiesSpawned: 1 + maximumEntitiesSpawned: 1 diff --git a/Resources/Prototypes/_Slon/Entities/Mobs/NPCs/maintspider.yml b/Resources/Prototypes/_Slon/Entities/Mobs/NPCs/maintspider.yml new file mode 100644 index 00000000000..92e61ab6881 --- /dev/null +++ b/Resources/Prototypes/_Slon/Entities/Mobs/NPCs/maintspider.yml @@ -0,0 +1,141 @@ +# SPDX-FileCopyrightText: 2025 LuciferEOS +# SPDX-FileCopyrightText: 2025 ReserveBot <211949879+ReserveBot@users.noreply.github.com> +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +- type: entity + id: MobMaintSpider + name: паук техтунелей + description: Широко признано, что это буквально худшее, что может быть на свете, но это не совсем так. + suffix: AI, Grown + parent: MobSpiderBase + components: + - type: GhostRole + makeSentient: true + name: ghost-role-information-maint-spider-name + description: ghost-role-information-maint-spider-desc + rules: ghost-role-information-maint-spider-rules + mindRoles: + - MindRoleGhostRoleTeamAntagonist + raffle: + settings: short + - type: GhostTakeoverAvailable + - type: Sprite + drawdepth: SmallMobs + layers: + - map: [ "enum.DamageStateVisualLayers.Base" ] + state: spider + sprite: _Slon/Objects/Fun/SpecialSpiders/maintspider.rsi + - type: DamageStateVisuals + rotate: true + states: + Alive: + Base: spider + Critical: + Base: dead + Dead: + Base: dead + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.2 + density: 100 + mask: + - SmallMobMask + layer: + - SmallMobLayer + - type: Tag + tags: # removed bumdoor opener + - FootstepSound + - type: MeleeWeapon + altDisarm: false + angle: 0 + animation: WeaponArcBite + soundHit: + path: /Audio/Effects/bite.ogg + damage: + types: + Piercing: 6 + - type: SolutionContainerManager + solutions: + melee: + reagents: + - ReagentId: ChloralHydrate # to compensate for the low damage + Quantity: 50 # 5u, the space spider value halved + #- type: LanguageKnowledge # Einstein Engines - Language + # speaks: + # - Xeno + # understands: + # - TauCetiBasic # "Hos ive got you a new shiva!" also they are not evil by default so they could be pets + # - Xeno + - type: EggLayer + eggSpawn: + - id: EggMaintSpiderFertilized + hungerUsage: 20 + eggLayAction: MouseMultiply + hungerRequired: true + - type: Hunger + startingHunger: 19 + thresholds: + Overfed: 80 + Okay: 60 + Peckish: 30 + Starving: 1 + Dead: 0 + baseDecayRate: -0.1 # i dont want it to be like a ratking, the only purpose of these spiders is to make maints more unsafe + - type: WebPassageAction + - type: Appearance + +- type: entity + id: MobMaintSpiderling + parent: MobSpiderBase + name: паучок + description: Посмотрите на эту милашку! + components: + - type: MobThresholds + thresholds: + 0: Alive + 45: Dead + - type: DamageStateVisuals + rotate: true + states: + Alive: + Base: spiderling + Critical: + Base: dead + Dead: + Base: dead + - type: Appearance + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.2 + density: 100 # cant walk under the tables or airlocks because ingame they would run away constantly + mask: + - MidImpassable + - type: Sprite + drawdepth: SmallMobs + layers: + - map: [ "enum.DamageStateVisualLayers.Base" ] + state: spiderling + sprite: _Slon/Objects/Fun/SpecialSpiders/maintspiderling.rsi + - type: Tag + tags: # removed bumdoor opener + - FootstepSound + - type: MeleeWeapon + altDisarm: false + angle: 0 + animation: WeaponArcBite + soundHit: + path: /Audio/Effects/bite.ogg + damage: + types: + Piercing: 3 + - type: TimedDespawn # it wouldve been peak to make a normal logic for this, but there is no "TriggerOnTime" or something + lifetime: 150 + - type: SpawnOnDespawn # also one of the reasons why it isnt a ghostrole, it wipes mind + prototype: MobMaintSpider diff --git a/Resources/Prototypes/_Slon/Entities/Mobs/NPCs/specialweb.yml b/Resources/Prototypes/_Slon/Entities/Mobs/NPCs/specialweb.yml new file mode 100644 index 00000000000..37e573855ae --- /dev/null +++ b/Resources/Prototypes/_Slon/Entities/Mobs/NPCs/specialweb.yml @@ -0,0 +1,60 @@ +# SPDX-FileCopyrightText: 2025 LuciferEOS +# SPDX-FileCopyrightText: 2025 ReserveBot <211949879+ReserveBot@users.noreply.github.com> +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +- type: entity + id: SpiderWebPassage + name: плотная паутина + description: Он тягучий, липкий и плотный. + placement: + mode: SnapgridCenter + components: + - type: MeleeSound + soundGroups: + Brute: + path: + "/Audio/Weapons/slash.ogg" + - type: Sprite + sprite: _Slon/Objects/Fun/SpecialSpiders/specialweb.rsi + state: webpassage + - type: Clickable + - type: Transform + anchored: true + - type: Damageable + damageModifierSet: Wood + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 40 # its dense bruh + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - !type:SpawnEntitiesBehavior + spawn: + MaterialWebSilk: + min: 0 + max: 1 + - type: SpiderWebObject + - type: SpeedModifierContacts + walkSpeedModifier: 0.4 + sprintSpeedModifier: 0.4 + ignoreWhitelist: + components: + - IgnoreSpiderWeb + - type: Physics + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.40,-0.30,0.40,0.45" + density: 80 + mask: + - TableMask + layer: + - TableLayer + - type: SpriteFade + - type: RequireProjectileTarget # Goobstation - Crawling + ignoreThrow: true diff --git a/Resources/Prototypes/_Slon/Entities/Mobs/NPCs/webaction.yml b/Resources/Prototypes/_Slon/Entities/Mobs/NPCs/webaction.yml new file mode 100644 index 00000000000..ce0baea6ce7 --- /dev/null +++ b/Resources/Prototypes/_Slon/Entities/Mobs/NPCs/webaction.yml @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: 2025 LuciferEOS +# SPDX-FileCopyrightText: 2025 ReserveBot <211949879+ReserveBot@users.noreply.github.com> +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +- type: entity + parent: BaseAction + id: ActionWebPassage + name: Веб-проход + description: Создайте плитку, через которую смогут пролезть только пауки. + components: + - type: Action + icon: { sprite: _Slon/Objects/Fun/SpecialSpiders/specialweb.rsi, state: webpassage } + - type: InstantAction + event: !type:WebPassageActionEvent diff --git a/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/maintspider.rsi/dead.png b/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/maintspider.rsi/dead.png new file mode 100644 index 00000000000..249b796ce1d Binary files /dev/null and b/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/maintspider.rsi/dead.png differ diff --git a/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/maintspider.rsi/meta.json b/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/maintspider.rsi/meta.json new file mode 100644 index 00000000000..d098433902e --- /dev/null +++ b/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/maintspider.rsi/meta.json @@ -0,0 +1,40 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "taken from /tg/ at icon/mob/simple/arachnoid.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "spider", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "dead" + } + ] +} diff --git a/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/maintspider.rsi/spider.png b/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/maintspider.rsi/spider.png new file mode 100644 index 00000000000..834ab292c35 Binary files /dev/null and b/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/maintspider.rsi/spider.png differ diff --git a/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/maintspiderling.rsi/dead.png b/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/maintspiderling.rsi/dead.png new file mode 100644 index 00000000000..fde294f8bdc Binary files /dev/null and b/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/maintspiderling.rsi/dead.png differ diff --git a/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/maintspiderling.rsi/meta.json b/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/maintspiderling.rsi/meta.json new file mode 100644 index 00000000000..bf7ba9466c2 --- /dev/null +++ b/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/maintspiderling.rsi/meta.json @@ -0,0 +1,36 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "taken from /tg/ at icon/mob/simple/arachnoid.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "spiderling", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1 + ], + [ + 0.1, + 0.1 + ], + [ + 0.1, + 0.1 + ], + [ + 0.1, + 0.1 + ] + ] + }, + { + "name": "dead" + } + ] +} diff --git a/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/maintspiderling.rsi/spiderling.png b/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/maintspiderling.rsi/spiderling.png new file mode 100644 index 00000000000..0651578e12d Binary files /dev/null and b/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/maintspiderling.rsi/spiderling.png differ diff --git a/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/specialweb.rsi/meta.json b/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/specialweb.rsi/meta.json new file mode 100644 index 00000000000..461511f5073 --- /dev/null +++ b/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/specialweb.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "taken from /tg/ at icon/effects/web.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "webpassage" + } + ] +} diff --git a/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/specialweb.rsi/webpassage.png b/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/specialweb.rsi/webpassage.png new file mode 100644 index 00000000000..d2749427ff7 Binary files /dev/null and b/Resources/Textures/_Slon/Objects/Fun/SpecialSpiders/specialweb.rsi/webpassage.png differ