From 7c15f5dd3c895d953f0936cac15a2f8cc807af75 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Sun, 17 Nov 2024 09:42:18 +0300 Subject: [PATCH 01/10] [Tweak] Operative UI Adaptation (#61) Bwomp --- Resources/Prototypes/_CorvaxNext/themes.yml | 2 ++ .../Interface/Operative/Slots/hand_l.png | Bin 550 -> 601 bytes .../Operative/Slots/hand_l_no_letter.png | Bin 550 -> 571 bytes .../Interface/Operative/Slots/hand_r.png | Bin 603 -> 642 bytes .../Operative/Slots/hand_r_no_letter.png | Bin 603 -> 614 bytes .../Interface/Operative/Slots/web.png | Bin 582 -> 753 bytes .../Interface/Operative/item_status_left.png | Bin 0 -> 322 bytes .../Operative/item_status_left_highlight.png | Bin 0 -> 312 bytes .../Interface/Operative/item_status_right.png | Bin 0 -> 296 bytes .../Operative/item_status_right_highlight.png | Bin 0 -> 306 bytes .../Interface/Operative/slot_highlight.png | Bin 335 -> 159 bytes 11 files changed, 2 insertions(+) create mode 100644 Resources/Textures/_CorvaxNext/Interface/Operative/item_status_left.png create mode 100644 Resources/Textures/_CorvaxNext/Interface/Operative/item_status_left_highlight.png create mode 100644 Resources/Textures/_CorvaxNext/Interface/Operative/item_status_right.png create mode 100644 Resources/Textures/_CorvaxNext/Interface/Operative/item_status_right_highlight.png diff --git a/Resources/Prototypes/_CorvaxNext/themes.yml b/Resources/Prototypes/_CorvaxNext/themes.yml index 9c168d02580..8d240be525f 100644 --- a/Resources/Prototypes/_CorvaxNext/themes.yml +++ b/Resources/Prototypes/_CorvaxNext/themes.yml @@ -12,3 +12,5 @@ concerningOrangeFore: "#A5762F" dangerousRedFore: "#BB3232" disabledFore: "#5A5A5A" + _itemstatus_content_margin_right: "#06060604" + _itemstatus_content_margin_left: "#06060604" diff --git a/Resources/Textures/_CorvaxNext/Interface/Operative/Slots/hand_l.png b/Resources/Textures/_CorvaxNext/Interface/Operative/Slots/hand_l.png index 624c0a5598934abefe344f055d3fa4f1602d6b18..23cef6052011ed1d9286ef86207ebcd230b2ed77 100644 GIT binary patch delta 556 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 delta 537 zcmV+!0_Oek1;zxBIDY~7Nkl7VbPF(_}Yfu-D zeU8q3f=+z^G3e4MgYY0&-aI8j85-Nc>=d!hf7V&ob+tFLQbK=N-#E_9`^|f^?!FLt zD4Ey`&X?YZ7{Va+pxN7wO*)RzYn2)(T}#_`dvqG-uGn!LIPmtxF8Uw)>D*7 ztdgHtl#nl6&Vf<_ZpbpF)^_?(YkM9-FQ{25M8B+m05(8%Ye{S2 z^xeCE0C0YC@qeKOP(4~=L9hU>3qA1}ARWm$jGKs^f?U|7Vvh%bv0SkM;2aC@9fT*2 z!_L)MUjYqCS^%>W z8vr5AcdRIk`!B$MfZV;tdxUlb;D8Ek@=IC(*xATynt#WbnE_1Wz;^(@^|t|#Z`26s zhLv|?H%*b7s*M!V0MdlduCCVGA3#G6`7NC|D|JZ?O-N z6nU;0mwvOBe>yzrg*xZLrqwM5ZtN&%bonm|giTz&&! ztp&hqwO-PCz4mW7j;Fl8eE_iCt;B`k@!_fPb$~!hy4?<18MeEXxM)xm&axwieMPbXFR5*>rk}*yKQ4~eb`woo|A!sNjBwE;65TUoQu!bcVR=|Q- z1JF`fU~gh!JsS|BVk`jXQotC2Pnd~?x4il9y!-O6ky4dPXn<|m3M65+?eA(n&jBb5 z&-e{8NeoUKIt1tx^A2D-jm)|DCxP|Lb$O!sqy!QKA9hh|P^ezYr5pyZms^Vg7K;hyls{o*@2e~ME6dAVj)xOy{XVx8A32Ry{aaV~_0o?V0QNn}7^m@X6h4oEea82Ur48`b8vtpBmZ#0000< KMNUMnLSTXvrhRY# literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Interface/Operative/item_status_right.png b/Resources/Textures/_CorvaxNext/Interface/Operative/item_status_right.png new file mode 100644 index 0000000000000000000000000000000000000000..437c00c29611a0972372c0db0fe4906086984865 GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkQ1F(g zi(`mI@7>9UT!$P4T<Wa;V%~B2 r{ttT+UozJ+s7=;_GxC*?{Q6@)1UtY`jWxZ)z4*}Q$iB}1|M>! literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Interface/Operative/item_status_right_highlight.png b/Resources/Textures/_CorvaxNext/Interface/Operative/item_status_right_highlight.png new file mode 100644 index 0000000000000000000000000000000000000000..f015b0515ab4029030315e130cf026fe91dbab5a GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkQ1FST zi(`mIZ?cH+-|95-L7_Q;zu@s_vF#>Kwz6tf_U&=#a_#sQ;~vK%n^GuH~Lx<{XlaIlm47!L*$3 z@;B4g?QHKTViGoUOfpS2Z4fzY5o^H0yW{+kGYq}E{@3+H~kiEw$0j#d{zzSwJS%X&%V4)+{3=F+?yw)B;6OtH!z|+;w JWt~$(696MdE8qYC delta 288 zcmV+*0pI?g0nY-EIDY{FNkl7!G7)1{TTivoEW$c)xegB6@my8)LF;<-{ z5}-qjgKasga3vP*1V|tE@F!hF2!WDnin><-K*h$FR0g0E4<;Ktfd2Gux5>GYW-%`x z?yhG5qjb_XfVs$)H+Ro69;BKK From 83f1c800fbfbca9ad3c5fe5907783a7ac9abb403 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Mon, 18 Nov 2024 22:27:23 +0300 Subject: [PATCH 02/10] [Port] Advanced Body Bags (#57) --- .../catalog/fills/boxes/medical.ftl | 10 ++ .../objects/specific/medical/bodybags.ftl | 27 +++ .../Catalog/Fills/Lockers/heads.yml | 1 + .../Catalog/Fills/Lockers/security.yml | 3 + .../Entities/Structures/Machines/lathe.yml | 7 + .../Prototypes/Research/civilianservices.yml | 4 + .../Catalog/Fills/Boxes/medical.yml | 89 ++++++++++ .../Objects/Specific/Medical/bodybags.yml | 161 ++++++++++++++++++ .../_CorvaxNext/Recipes/Lathes/body_bags.yml | 37 ++++ .../BodyBags/bluespace.rsi/bluespacebag.png | Bin 0 -> 224 bytes .../bluespace.rsi/bluespacebag_folded.png | Bin 0 -> 177 bytes .../BodyBags/bluespace.rsi/label_overlay.png | Bin 0 -> 167 bytes .../Medical/BodyBags/bluespace.rsi/meta.json | 23 +++ .../BodyBags/bluespace.rsi/open_overlay.png | Bin 0 -> 241 bytes .../BodyBags/nanotrasen.rsi/label_overlay.png | Bin 0 -> 167 bytes .../Medical/BodyBags/nanotrasen.rsi/meta.json | 23 +++ .../Medical/BodyBags/nanotrasen.rsi/ntbag.png | Bin 0 -> 311 bytes .../BodyBags/nanotrasen.rsi/ntbag_folded.png | Bin 0 -> 246 bytes .../BodyBags/nanotrasen.rsi/open_overlay.png | Bin 0 -> 259 bytes .../BodyBags/prison.rsi/label_overlay.png | Bin 0 -> 167 bytes .../Medical/BodyBags/prison.rsi/meta.json | 23 +++ .../BodyBags/prison.rsi/open_overlay.png | Bin 0 -> 261 bytes .../BodyBags/prison.rsi/prisonerbag.png | Bin 0 -> 344 bytes .../prison.rsi/prisonerbag_folded.png | Bin 0 -> 265 bytes .../BodyBags/radiation.rsi/label_overlay.png | Bin 0 -> 167 bytes .../Medical/BodyBags/radiation.rsi/meta.json | 23 +++ .../BodyBags/radiation.rsi/open_overlay.png | Bin 0 -> 232 bytes .../BodyBags/radiation.rsi/radiationbag.png | Bin 0 -> 289 bytes .../radiation.rsi/radiationbag_folded.png | Bin 0 -> 246 bytes .../BodyBags/syndicate.rsi/label_overlay.png | Bin 0 -> 167 bytes .../Medical/BodyBags/syndicate.rsi/meta.json | 23 +++ .../BodyBags/syndicate.rsi/open_overlay.png | Bin 0 -> 258 bytes .../BodyBags/syndicate.rsi/syndicatebag.png | Bin 0 -> 402 bytes .../syndicate.rsi/syndicatebag_folded.png | Bin 0 -> 270 bytes 34 files changed, 454 insertions(+) create mode 100644 Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/catalog/fills/boxes/medical.ftl create mode 100644 Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/objects/specific/medical/bodybags.ftl create mode 100644 Resources/Prototypes/_CorvaxNext/Catalog/Fills/Boxes/medical.yml create mode 100644 Resources/Prototypes/_CorvaxNext/Entities/Objects/Specific/Medical/bodybags.yml create mode 100644 Resources/Prototypes/_CorvaxNext/Recipes/Lathes/body_bags.yml create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/bluespace.rsi/bluespacebag.png create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/bluespace.rsi/bluespacebag_folded.png create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/bluespace.rsi/label_overlay.png create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/bluespace.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/bluespace.rsi/open_overlay.png create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/nanotrasen.rsi/label_overlay.png create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/nanotrasen.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/nanotrasen.rsi/ntbag.png create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/nanotrasen.rsi/ntbag_folded.png create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/nanotrasen.rsi/open_overlay.png create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/prison.rsi/label_overlay.png create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/prison.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/prison.rsi/open_overlay.png create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/prison.rsi/prisonerbag.png create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/prison.rsi/prisonerbag_folded.png create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/radiation.rsi/label_overlay.png create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/radiation.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/radiation.rsi/open_overlay.png create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/radiation.rsi/radiationbag.png create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/radiation.rsi/radiationbag_folded.png create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/syndicate.rsi/label_overlay.png create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/syndicate.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/syndicate.rsi/open_overlay.png create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/syndicate.rsi/syndicatebag.png create mode 100644 Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/syndicate.rsi/syndicatebag_folded.png diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/catalog/fills/boxes/medical.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/catalog/fills/boxes/medical.ftl new file mode 100644 index 00000000000..e8b1e03878a --- /dev/null +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/catalog/fills/boxes/medical.ftl @@ -0,0 +1,10 @@ +ent-BoxBodyBagBluespace = коробка блюспейс мешков для тел + .desc = { ent-BoxBodyBag.desc } +ent-BoxBodyBagNanoTrasen = коробка синих мешков для тел + .desc = { ent-BoxBodyBag.desc } +ent-BoxBodyBagPrisoner = коробка тюремных мешков для тел + .desc = { ent-BoxBodyBag.desc } +ent-BoxBodyBagRadiation = коробка противорадиационных мешков для тел + .desc = { ent-BoxBodyBag.desc } +ent-BoxBodyBagSyndicate = коробка красных мешков для тел + .desc = { ent-BoxBodyBag.desc } diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/objects/specific/medical/bodybags.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/objects/specific/medical/bodybags.ftl new file mode 100644 index 00000000000..803aae09dad --- /dev/null +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/objects/specific/medical/bodybags.ftl @@ -0,0 +1,27 @@ +ent-BodyBagBluespace = блюспейс мешок для тела + .desc = Прочный блюспейс мешок, предназначенный для хранения и транспортировки трупов, и предотвращения их гниения. +ent-BodyBagBluespaceFolded = { ent-BodyBagBluespace } + .desc = { ent-BodyBagBluespace.desc } + .suffix = Сложенный +ent-BodyBagNanoTrasen = синий мешок для тела + .desc = Пластиковый мешок с эмблемой НТ, предназначенный для хранения и транспортировки трупов, и предотвращения их гниения. + .suffix = НТ +ent-BodyBagNanoTrasenFolded = { ent-BodyBagNanoTrasen } + .desc = { ent-BodyBagNanoTrasen.desc } + .suffix = Сложенный, НТ +ent-BodyBagPrisoner = тюремный мешок для тела + .desc = Пластиковый мешок, предназначенный для хранения и транспортировки трупов, и предотвращения их гниения в тюремных структурах. +ent-BodyBagPrisonerFolded = { ent-BodyBagPrisoner } + .desc = { ent-BodyBagPrisoner.desc } + .suffix = Сложенный +ent-BodyBagRadiation = противорадиационный мешок для тела + .desc = Пластиковый мешок, предназначенный для хранения и транспортировки радиоактивных трупов, и предотвращения их гниения. +ent-BodyBagRadiationFolded = { ent-BodyBagRadiation } + .desc = { ent-BodyBagRadiation.desc } + .suffix = Сложенный +ent-BodyBagSyndicate = красный мешок для тела + .desc = Пластиковый мешок с символикой Синдиката, предназначенный для хранения и транспортировки трупов, и предотвращения их гниения. + .suffix = Синдикат +ent-BodyBagSyndicateFolded = { ent-BodyBagSyndicate } + .desc = { ent-BodyBagSyndicate.desc } + .suffix = Сложенный, Синдикат diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml index cb77bb85790..d8993183ee2 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml @@ -278,6 +278,7 @@ - id: ProtolatheMachineCircuitboard - id: ResearchComputerCircuitboard - id: RubberStampRd + - id: BoxBodyBagRadiation # Corvax-Next-AdvancedBodyBags # Hardsuit table, used for suit storage as well - type: entityTable diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/security.yml b/Resources/Prototypes/Catalog/Fills/Lockers/security.yml index 7057dd1ceba..e15bf45c4c4 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/security.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/security.yml @@ -23,6 +23,7 @@ - id: ClothingHeadHatCapWardenAlt # Corvax-SecFashion - id: ClothingOuterCoatWardenAlt # Corvax-SecFashion - id: ClothingBackpackWarden # Corvax-SecFashion + - id: BoxBodyBagPrisoner # Corvax-Next-AdvancedBodyBags - id: ClothingBackpackElectropack amount: 2 - id: RemoteSignaller @@ -52,6 +53,7 @@ - id: HoloprojectorSecurity - id: BookSpaceLaw - id: ClothingBackpackWarden # Corvax-SecFashion + - id: BoxBodyBagPrisoner # Corvax-Next-AdvancedBodyBags - id: ClothingBackpackElectropack amount: 2 - id: RemoteSignaller @@ -131,6 +133,7 @@ prob: 0.5 - id: ClothingOuterCoatLabSecurityMedic # Corvax-Resprite prob: 0.5 + - id: BoxBodyBagPrisoner # Corvax-Next-AdvancedBodyBags - type: entity id: LockerDetectiveFilled diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index c48619aa2c9..3dffc98d961 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -947,6 +947,13 @@ - BluespaceBeaker - SyringeBluespace - SyringeCryostasis + - BluespaceBodyBag # Corvax-Next-AdvancedBodyBags + - NTBodyBag # Corvax-Next-AdvancedBodyBags + - PrisonerBodyBag # Corvax-Next-AdvancedBodyBags + - RadiationBodyBag # Corvax-Next-AdvancedBodyBags + - type: EmagLatheRecipes + emagDynamicRecipes: + - SyndicateBodyBag # Corvax-Next-AdvancedBodyBags - type: Machine board: MedicalTechFabCircuitboard - type: StealTarget diff --git a/Resources/Prototypes/Research/civilianservices.yml b/Resources/Prototypes/Research/civilianservices.yml index b990eb6ae40..82c22ec8c0c 100644 --- a/Resources/Prototypes/Research/civilianservices.yml +++ b/Resources/Prototypes/Research/civilianservices.yml @@ -131,6 +131,9 @@ - CryoPodMachineCircuitboard - CryostasisBeaker - SyringeCryostasis + - NTBodyBag # Corvax-Next-AdvancedBodyBags + - PrisonerBodyBag # Corvax-Next-AdvancedBodyBags + - RadiationBodyBag # Corvax-Next-AdvancedBodyBags - type: technology id: MechanizedTreatment @@ -229,3 +232,4 @@ recipeUnlocks: - BluespaceBeaker - SyringeBluespace + - BluespaceBodyBag # Corvax-Next-AdvancedBodyBags diff --git a/Resources/Prototypes/_CorvaxNext/Catalog/Fills/Boxes/medical.yml b/Resources/Prototypes/_CorvaxNext/Catalog/Fills/Boxes/medical.yml new file mode 100644 index 00000000000..785082641bc --- /dev/null +++ b/Resources/Prototypes/_CorvaxNext/Catalog/Fills/Boxes/medical.yml @@ -0,0 +1,89 @@ +- type: entity + parent: BoxCardboard + id: BoxBodyBagBluespace + name: bluespace body bag box + description: Contains body bags. + components: + - type: StorageFill + contents: + - id: BodyBagBluespaceFolded + amount: 4 + - type: Sprite + layers: + - state: box + - state: bodybags + whitelist: + tags: + - BodyBag + +- type: entity + parent: BoxCardboard + id: BoxBodyBagNanoTrasen + name: NanoTrasen body bag box + description: Contains body bags. + components: + - type: StorageFill + contents: + - id: BodyBagNanoTrasenFolded + amount: 4 + - type: Sprite + layers: + - state: box + - state: bodybags + whitelist: + tags: + - BodyBag + +- type: entity + parent: BoxCardboard + id: BoxBodyBagPrisoner + name: prisoner body bag box + description: Contains body bags. + components: + - type: StorageFill + contents: + - id: BodyBagPrisonerFolded + amount: 4 + - type: Sprite + layers: + - state: box + - state: bodybags + whitelist: + tags: + - BodyBag + +- type: entity + parent: BoxCardboard + id: BoxBodyBagRadiation + name: radiation body bag box + description: Contains body bags. + components: + - type: StorageFill + contents: + - id: BodyBagRadiationFolded + amount: 4 + - type: Sprite + layers: + - state: box + - state: bodybags + whitelist: + tags: + - BodyBag + +- type: entity + parent: BoxCardboard + id: BoxBodyBagSyndicate + name: syndicate body bag box + description: Contains body bags. + components: + - type: StorageFill + contents: + - id: BodyBagSyndicateFolded + amount: 4 + - type: Sprite + layers: + - state: box_of_doom + - state: bodybags + whitelist: + tags: + - BodyBag diff --git a/Resources/Prototypes/_CorvaxNext/Entities/Objects/Specific/Medical/bodybags.yml b/Resources/Prototypes/_CorvaxNext/Entities/Objects/Specific/Medical/bodybags.yml new file mode 100644 index 00000000000..d91b3aab08f --- /dev/null +++ b/Resources/Prototypes/_CorvaxNext/Entities/Objects/Specific/Medical/bodybags.yml @@ -0,0 +1,161 @@ +- type: entity + parent: BodyBag + id: BodyBagBluespace + name: body bag bluespace + description: Durable bluespace bag designed for storing and transporting corpses, preventing decomposition. + components: + - type: Sprite + sprite: _CorvaxNext/Objects/Specific/Medical/BodyBags/bluespace.rsi + layers: + - state: bluespacebag + map: ["unfoldedLayer", "enum.StorageVisualLayers.Base"] + - state: bluespacebag_folded + map: ["foldedLayer"] + visible: false + - state: open_overlay + map: ["enum.StorageVisualLayers.Door"] + - state: label_overlay + map: ["enum.BodyBagVisualLayers.Label"] + - type: Icon + sprite: _CorvaxNext/Objects/Specific/Medical/BodyBags/bluespace.rsi + state: bluespacebag + - type: EntityStorage + capacity: 50 + +- type: entity + parent: BodyBagBluespace + id: BodyBagBluespaceFolded + suffix: Folded + components: + - type: Foldable + folded: true + +- type: entity + parent: BodyBag + id: BodyBagNanoTrasen + name: blue body bag + description: Plastic NT bag designed for storing and transporting corpses, preventing decomposition. + components: + - type: Sprite + sprite: _CorvaxNext/Objects/Specific/Medical/BodyBags/nanotrasen.rsi + layers: + - state: ntbag + map: ["unfoldedLayer", "enum.StorageVisualLayers.Base"] + - state: ntbag_folded + map: ["foldedLayer"] + visible: false + - state: open_overlay + map: ["enum.StorageVisualLayers.Door"] + - state: label_overlay + map: ["enum.BodyBagVisualLayers.Label"] + - type: Icon + sprite: _CorvaxNext/Objects/Specific/Medical/BodyBags/nanotrasen.rsi + state: ntbag + - type: EntityStorage + capacity: 1 + +- type: entity + parent: BodyBagNanoTrasen + id: BodyBagNanoTrasenFolded + suffix: Folded + components: + - type: Foldable + folded: true + +- type: entity + parent: BodyBag + id: BodyBagPrisoner + name: prisoner body bag + description: Plastic bag designed for storing and transporting corpses, preventing decomposition in prison structures. + components: + - type: Sprite + sprite: _CorvaxNext/Objects/Specific/Medical/BodyBags/prison.rsi + layers: + - state: prisonerbag + map: ["unfoldedLayer", "enum.StorageVisualLayers.Base"] + - state: prisonerbag_folded + map: ["foldedLayer"] + visible: false + - state: open_overlay + map: ["enum.StorageVisualLayers.Door"] + - state: label_overlay + map: ["enum.BodyBagVisualLayers.Label"] + - type: Icon + sprite: _CorvaxNext/Objects/Specific/Medical/BodyBags/prison.rsi + state: prisonerbag + - type: EntityStorage + capacity: 1 + +- type: entity + parent: BodyBagPrisoner + id: BodyBagPrisonerFolded + suffix: Folded + components: + - type: Foldable + folded: true + +- type: entity + parent: BodyBag + id: BodyBagRadiation + name: radiation body bag + description: Plastic bag designed for storing and transporting radioactive corpses, preventing decomposition. + components: + - type: Sprite + sprite: _CorvaxNext/Objects/Specific/Medical/BodyBags/radiation.rsi + layers: + - state: radiationbag + map: ["unfoldedLayer", "enum.StorageVisualLayers.Base"] + - state: radiationbag_folded + map: ["foldedLayer"] + visible: false + - state: open_overlay + map: ["enum.StorageVisualLayers.Door"] + - state: label_overlay + map: ["enum.BodyBagVisualLayers.Label"] + - type: Icon + sprite: _CorvaxNext/Objects/Specific/Medical/BodyBags/radiation.rsi + state: radiationbag + - type: EntityStorage + capacity: 1 + - type: RadiationBlockingContainer + resistance: 5 + +- type: entity + parent: BodyBagRadiation + id: BodyBagRadiationFolded + suffix: Folded + components: + - type: Foldable + folded: true + +- type: entity + parent: BodyBag + id: BodyBagSyndicate + name: red body bag + description: Plastic bag with Syndicate symbols, designed for storing and transporting corpses, preventing decomposition. + components: + - type: Sprite + sprite: _CorvaxNext/Objects/Specific/Medical/BodyBags/syndicate.rsi + layers: + - state: syndicatebag + map: ["unfoldedLayer", "enum.StorageVisualLayers.Base"] + - state: syndicatebag_folded + map: ["foldedLayer"] + visible: false + - state: open_overlay + map: ["enum.StorageVisualLayers.Door"] + - state: label_overlay + map: ["enum.BodyBagVisualLayers.Label"] + - type: Icon + sprite: _CorvaxNext/Objects/Specific/Medical/BodyBags/syndicate.rsi + state: syndicatebag + - type: EntityStorage + capacity: 3 + +- type: entity + parent: BodyBagSyndicate + id: BodyBagSyndicateFolded + suffix: Folded + components: + - type: Foldable + folded: true diff --git a/Resources/Prototypes/_CorvaxNext/Recipes/Lathes/body_bags.yml b/Resources/Prototypes/_CorvaxNext/Recipes/Lathes/body_bags.yml new file mode 100644 index 00000000000..36448095755 --- /dev/null +++ b/Resources/Prototypes/_CorvaxNext/Recipes/Lathes/body_bags.yml @@ -0,0 +1,37 @@ +- type: latheRecipe + id: BluespaceBodyBag + result: BodyBagBluespaceFolded + completetime: 6 + materials: + Plastic: 1200 + Silver: 120 + Uranium: 30 + +- type: latheRecipe + id: NTBodyBag + result: BodyBagNanoTrasenFolded + completetime: 3 + materials: + Plastic: 300 + +- type: latheRecipe + id: PrisonerBodyBag + result: BodyBagPrisonerFolded + completetime: 3 + materials: + Plastic: 300 + +- type: latheRecipe + id: RadiationBodyBag + result: BodyBagRadiationFolded + completetime: 3 + materials: + Plastic: 300 + Uranium: 30 + +- type: latheRecipe + id: SyndicateBodyBag + result: BodyBagSyndicateFolded + completetime: 6 + materials: + Plastic: 150 diff --git a/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/bluespace.rsi/bluespacebag.png b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/bluespace.rsi/bluespacebag.png new file mode 100644 index 0000000000000000000000000000000000000000..5fd89bd49e9c491cff35153c208af9d40fb3be18 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$Dv*8>L*0GXl++VWQ3s;a7? zp`lq>SxVs1q`09elF{r5}E+`giTNY literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/bluespace.rsi/bluespacebag_folded.png b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/bluespace.rsi/bluespacebag_folded.png new file mode 100644 index 0000000000000000000000000000000000000000..777717bdb0fd6cb6dadaf1a9b1189e0b0a7041bd GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4*8>L*0GXl++VWQ3O5quD zv$mfA@)=8l{DK)Ap4~_TasoVE978lFCMQTVItZ{#_|fB~pwRGuTe7)9F~-3|BD5h; zGWNg>DJG>COip?Z4|)U&#F%zp5!73dw1R`F;Jg9TO@##=1y(Eym3{(ufB#@$hmdKI;Vst0Ec!nHUIzs literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/bluespace.rsi/label_overlay.png b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/bluespace.rsi/label_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c5a78d2351ba6caa3c929ebaf6417b1f2387c6 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJJWm(Lkcv5PFYM+$puoctV0`AJ z(C;0IdT9$5ez2K$Y^9K@lIqH$^_xEUyR~$Hz`u2K8h59!4Gr1q;&QJ$Wb2x>(mQ`| zHBb_A_;yd&f$2nb-S($O#;32{dYs#%SbWaE?qTVQnYMcWvMeWdoM61)r@Y$X=T04< O%?zHdelF{r5}E+I?nFrd literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/bluespace.rsi/meta.json b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/bluespace.rsi/meta.json new file mode 100644 index 00000000000..e7c924fe77a --- /dev/null +++ b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/bluespace.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/BlueMoon-Labs/MOLOT-BlueMoon-Station/blob/master/icons/obj/bodybag.dmi | Edited by PuroSlavKing (Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "label_overlay" + }, + { + "name": "bluespacebag" + }, + { + "name": "bluespacebag_folded" + }, + { + "name": "open_overlay" + } + ] +} diff --git a/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/bluespace.rsi/open_overlay.png b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/bluespace.rsi/open_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..99e85c68809e9f9a690bfdfacd9a66777bbd99d9 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$Dv*8>L*sH&=lhK7nNXamLM zt-S5+?Ulkajt00F0{M(3L4Lsu4$p3+0XglSE{-7@6QA}Q^0g=kxTfo_;nmqICUb!2 z+v;)?@8JEt^N+JL%o9i!Fyt_o7P_d_n||)>@=pRUed0fuCaiEh z{%5nt5}wa$oYHHJo*Dg`+UuIfnKk9{qJ7iiXLW6gWBXCBsmFZh+^H3H(?6}VVodnn l;dP>G?j*6I(mQ`| zHBb_A_;yd&f$2nb-S($O#;32{dYs#%SbWaE?qTVQnYMcWvMeWdoM61)r@Y$X=T04< O%?zHdelF{r5}E+I?nFrd literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/nanotrasen.rsi/meta.json b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/nanotrasen.rsi/meta.json new file mode 100644 index 00000000000..4ec73fa3527 --- /dev/null +++ b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/nanotrasen.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/BlueMoon-Labs/MOLOT-BlueMoon-Station/blob/master/icons/obj/bodybag.dmi | Edited by PuroSlavKing (Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "label_overlay" + }, + { + "name": "ntbag" + }, + { + "name": "ntbag_folded" + }, + { + "name": "open_overlay" + } + ] +} diff --git a/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/nanotrasen.rsi/ntbag.png b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/nanotrasen.rsi/ntbag.png new file mode 100644 index 0000000000000000000000000000000000000000..ae529f00170e5ac9796ab6d6ccbd5d696bb16969 GIT binary patch literal 311 zcmV-70m%M|P)m+ag3Hd$|WTwRaI4LYHGbp|4@*!sJzs0E|?!WON5%aP$6p-f_k$6 z0004WQchC+ILJ;Z%x zCF8RE>-Q?fx|$g>64B5Mr36`R0CkRTQ1c1YHKeFB)S%=(`gW~%zyT?dklbBwp*z$7 zvL%}L6Llzg1kyI8AE!{rBm83w)d>hLc&;q$HdvR+iW*8>L*SX*1`gypT+bH%=} z=i0N+|NsA=W_wEB$~$1froG<(?Jpl$7P?eH#W=>rs$l`A;sdQ$@3>evbTyNVm#41tag@l?Oi5uWdF8UBVbfwIjsv!b rS7dN}o1=8-r9i_IOUIJ;kC_=hJ(Tnly`1wN=o|)5S3j3^P6L*sH&=lhKA~d<*nFr z1t@G^*mLdKXM215fC-zL1D4wYg&0eM{DK)Ap4~_TawdDaIEH9UOiqyCbnrNF zgXvzzoV>iejvXtc+nXE;7^bYBA;iVVm7uqHQKx2z1H+MgAwxc1*C0g|sV)WuQ5oMu zY6f)*H!iTbxhAiWbmWNknaIP+xG^Oq+fnaq3F}Aa2U-##YR$1+;RhAWcvHF*C%reC z9P8XHXeA-hvRqx-T8W)waz~`vCZ+`)0$TE13`^%~Z~w=Z2XY>Rr>mdKI;Vst0A3_d ABLDyZ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/prison.rsi/label_overlay.png b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/prison.rsi/label_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c5a78d2351ba6caa3c929ebaf6417b1f2387c6 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJJWm(Lkcv5PFYM+$puoctV0`AJ z(C;0IdT9$5ez2K$Y^9K@lIqH$^_xEUyR~$Hz`u2K8h59!4Gr1q;&QJ$Wb2x>(mQ`| zHBb_A_;yd&f$2nb-S($O#;32{dYs#%SbWaE?qTVQnYMcWvMeWdoM61)r@Y$X=T04< O%?zHdelF{r5}E+I?nFrd literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/prison.rsi/meta.json b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/prison.rsi/meta.json new file mode 100644 index 00000000000..d4e6c81b5b6 --- /dev/null +++ b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/prison.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/BlueMoon-Labs/MOLOT-BlueMoon-Station/blob/master/icons/obj/bodybag.dmi | Edited by PuroSlavKing (Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "label_overlay" + }, + { + "name": "prisonerbag" + }, + { + "name": "prisonerbag_folded" + }, + { + "name": "open_overlay" + } + ] +} diff --git a/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/prison.rsi/open_overlay.png b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/prison.rsi/open_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..93fcd5808091009597df2f377ca54ac0642853a7 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvxd5LK*8>L*sH&=lhK3&VXHZj9 z0}9`dWH2%^vbVSYo66wyT3Ht;#8?vK7tG-B>_!@pGu6|@F+^ixa)Jb>gU5**M{bB5 zO!qS8{ub)-sDigFlGG=AudL)1ii(JIyFNa7>?u%8S?SE1}UmYbulQ2%J?2q zGpJLzae>Xvm2HKjqd~Mpkk3ROR>qAfDcO#CXG>T=IzP~o2vKW}zt_^aT}@)nM4Xu@Gt&yC#LPv#0xw4dEs(_7 zx(p&ka=V|tfE+OMw4OPj6i0Z(rfXNoeqozEWXB{sjuw$YHwCIyA%Zm`?1QC{YdWgX z>k*L*0GY@98I+Zk??*C7 zN=h0T8L6qMO`A6D@ZrNZZ{D=AvH6?IV0Nx>8c-c$NswPKgTu2MX+X{dPZ!4!jfu$# z5{(W5EE9h8oO1Iz=EcOZZ^G(M?+xBcF%BL_uAb4o!K-&5LTOsoB%wKvIK({!8M#dk zvEETR5G9}$)784Dt?6J>7sqn$PAN`SZpBJJfxEwdFfgp+m0xx4YncVmZ492S KelF{r5}E)w?_a(mQ`| zHBb_A_;yd&f$2nb-S($O#;32{dYs#%SbWaE?qTVQnYMcWvMeWdoM61)r@Y$X=T04< O%?zHdelF{r5}E+I?nFrd literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/radiation.rsi/meta.json b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/radiation.rsi/meta.json new file mode 100644 index 00000000000..9d2b55f5fc3 --- /dev/null +++ b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/radiation.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/BlueMoon-Labs/MOLOT-BlueMoon-Station/blob/master/icons/obj/bodybag.dmi | Edited by PuroSlavKing (Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "label_overlay" + }, + { + "name": "radiationbag" + }, + { + "name": "radiationbag_folded" + }, + { + "name": "open_overlay" + } + ] +} diff --git a/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/radiation.rsi/open_overlay.png b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/radiation.rsi/open_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..dfbc0beecd2a7a97d4a3defbad08d178efcab4af GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{*8>L*sH&=lhKAnTW(yRv zx3}lEPP_tSF_r}R1v5B2yO9Ruw0OEWhGsYvq9lXg3x@1G*^k! zu}(E2h1364A77upaaG8ZNpafxXIVRY74}bCAoygDLcsph;p=B9H2L57;^?+xO{2D< ce|#y^@0kiq&h(u(0lJ65)78&qol`;+0QzxP5dZ)H literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/radiation.rsi/radiationbag.png b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/radiation.rsi/radiationbag.png new file mode 100644 index 0000000000000000000000000000000000000000..42a6fcedb2217150c8be0b2145924d9fa7aaa025 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv^#Gp`*8>L*0GX<)s`mEw_qN$4 zr)FB~+ql?zhK7b_Wn~2gMCzM+XvivCuQ|{LRL58ni z%bS7=_t}>eZBY7gszxT?CVflL_x9(HbuGFj)D9SOpTGPkxcs9)tN}OQ`E_T^{Q`p* jt+>Q`+UV5OKaW_$MRhbXT2+?;-OS+W>gTe~DWM4fh|g`o literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/radiation.rsi/radiationbag_folded.png b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/radiation.rsi/radiationbag_folded.png new file mode 100644 index 0000000000000000000000000000000000000000..93b9707f12971b5b74e2d534a103f3f09c5ed31e GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvl>na**8>L*0GX<)s`s|p+S}VF zr)FB~+ql?zYRD=F1w@91hU%MptiIBe22{jY666=m;PC7Qh|}Qd;uxYaF*!k^(LsP^ z!jB#=1%-wO+%qktXYY_W#M;sl+tlkDEAx%cMtA};COSXwSZCA-BqBWx=ru| n8>4H>WkrUQ#Z52n9cO0{dMS1G>AHU)k1%+;`njxgN@xNAv?5b5 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/syndicate.rsi/label_overlay.png b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/syndicate.rsi/label_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c5a78d2351ba6caa3c929ebaf6417b1f2387c6 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJJWm(Lkcv5PFYM+$puoctV0`AJ z(C;0IdT9$5ez2K$Y^9K@lIqH$^_xEUyR~$Hz`u2K8h59!4Gr1q;&QJ$Wb2x>(mQ`| zHBb_A_;yd&f$2nb-S($O#;32{dYs#%SbWaE?qTVQnYMcWvMeWdoM61)r@Y$X=T04< O%?zHdelF{r5}E+I?nFrd literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/syndicate.rsi/meta.json b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/syndicate.rsi/meta.json new file mode 100644 index 00000000000..de7ac15012b --- /dev/null +++ b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/syndicate.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/BlueMoon-Labs/MOLOT-BlueMoon-Station/blob/master/icons/obj/bodybag.dmi | Edited by PuroSlavKing (Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "label_overlay" + }, + { + "name": "syndicatebag" + }, + { + "name": "syndicatebag_folded" + }, + { + "name": "open_overlay" + } + ] +} diff --git a/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/syndicate.rsi/open_overlay.png b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/syndicate.rsi/open_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..c8214008f5927e3eca2bba4d09a08d3b2805bf12 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvxd5LK*8>L*sH&=lhK6pH;|sO4 z0SaHYP|tLAx3{_!@pGs)A%F+^ixa)Jb>gU5**M{bB5 zO!qS8{ub)-sDigFlGG=AudL)1ii(JIyFNa7>?u%8S?SEhAB#QF$jnrQZuMi zxN(8a&6RD1q@zK!M3B$KEe#D3Mw_-OOi$a@^h2>glt*jwLA}=12?Dd(jE)MNET4ID z-NJ($vOGM8E>G^2oygqcc|=Dzk}<%AV=6x@L%5Q*=el5@JfQ0sJYD@<);T3K0RZ}Y BPlf;h literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/syndicate.rsi/syndicatebag.png b/Resources/Textures/_CorvaxNext/Objects/Specific/Medical/BodyBags/syndicate.rsi/syndicatebag.png new file mode 100644 index 0000000000000000000000000000000000000000..ef43f3ce57ebaef8378e9433713fb5d9b26539cb GIT binary patch literal 402 zcmV;D0d4+?P) zP-bRk0DwTRudn|A0GJR3P$6qQDJVQVJU4EI@&Et;0d!JMQvg8b*k%9#0PjgeK~y-6 z?ULPY!ypWW%P}S)3y`MmSo;1Cy2DSmL{)EkH))PA`1rFGBTlD(`+H`N_MC)>1;h$q zMX-mA5fLppWzO~!wT>9ERkq?NJLX&qDVvsOb0)a$mTNKz(}Q6=d>yI);HP0c)QgM* zXcd5}_r2+UDGdeCB7FFXo1ge={nVfWxH^URY|Kv0)sV6?KU0+JnSn3|VD4A8pCTw? zOp27MTNL4U3JGbUe2$USnJz7>;&Mr$0f7YzORg2T7I(WTKG!9sP=K6c{>qAN+a507 w759~Tu6JFCQkO~P=4#mUPcPy1t9aAC0d%no{fg-StN;K207*qoM6N<$f&=-dL*0GV6m_>`5EuUn`~ zN=jzBx`$fYOtU?8`0(MIH*YqDg#6FU)@e9w2~@{e666=m;PC858jv&9)5S4FV`6fG zM5BWM%Y+|2r`)`bc`zyNIWqd_IFF|Tj&ZDF^LLA~8!pyguE^KoBwc_i%2f7^2*)3kZ zT}|D5hgh%3hVqIwi$0u}7@{L$D#9Zc;$ji&am7O;g5zXy(~En@*%{`|ly?Z_m~aK? OKn71&KbLh*2~7Z7E?l7i literal 0 HcmV?d00001 From 3af71eabc2f4699a001e7a858ecb14ce2f5f481c Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Mon, 18 Nov 2024 22:31:39 +0300 Subject: [PATCH 03/10] [Tweak] OfferItem Folder (#64) --- Content.Server/_CorvaxNext/{ => OfferItem}/OfferItemSystem.cs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Content.Server/_CorvaxNext/{ => OfferItem}/OfferItemSystem.cs (100%) diff --git a/Content.Server/_CorvaxNext/OfferItemSystem.cs b/Content.Server/_CorvaxNext/OfferItem/OfferItemSystem.cs similarity index 100% rename from Content.Server/_CorvaxNext/OfferItemSystem.cs rename to Content.Server/_CorvaxNext/OfferItem/OfferItemSystem.cs From cdba530a7f26a1952b42b5f816c90518927e2b54 Mon Sep 17 00:00:00 2001 From: csqrb <56765288+CaptainSqrBeard@users.noreply.github.com> Date: Tue, 19 Nov 2024 01:45:02 +0600 Subject: [PATCH 04/10] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=D0=B4=D0=BE=D0=B2=20(#59)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fixes * // Corvax-Next-Footprints * Apply suggestions from code review * next * Fixes * Wo don't need this * Improvements * const * // Corvax-Next-Something Co-authored-by: FN <37689533+FireNameFN@users.noreply.github.com> --------- Co-authored-by: AwareFoxy <135021509+AwareFoxy@users.noreply.github.com> Co-authored-by: FN Co-authored-by: FN <37689533+FireNameFN@users.noreply.github.com> --- .../Fluids/EntitySystems/AbsorbentSystem.cs | 88 +++++++++++++++++-- .../entities/objects/effects/footstep.ftl | 2 + 2 files changed, 84 insertions(+), 6 deletions(-) create mode 100644 Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/objects/effects/footstep.ftl diff --git a/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs b/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs index 56e039a7004..5f47baa7cc2 100644 --- a/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs +++ b/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs @@ -13,6 +13,7 @@ using Robust.Shared.Map.Components; using Robust.Shared.Prototypes; using Robust.Shared.Utility; +using Content.Shared._CorvaxNext.Footprints.Components; namespace Content.Server.Fluids.EntitySystems; @@ -28,6 +29,9 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem [Dependency] private readonly SharedSolutionContainerSystem _solutionContainerSystem = default!; [Dependency] private readonly UseDelaySystem _useDelay = default!; [Dependency] private readonly MapSystem _mapSystem = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; + + public const float FootprintAbsorptionRange = 0.25f; // Corvax-Next-Footprints public override void Initialize() { @@ -111,13 +115,18 @@ public void Mop(EntityUid user, EntityUid target, EntityUid used, AbsorbentCompo && _useDelay.IsDelayed((used, useDelay))) return; + // Corvax-Next-Footprints-Start + // Footsteps cleaning logic, try to grab from + if (TryFootprintInteract(user, used, target, component, useDelay, absorberSoln.Value)) + return; + // If it's a puddle try to grab from - if (!TryPuddleInteract(user, used, target, component, useDelay, absorberSoln.Value)) - { - // If it's refillable try to transfer - if (!TryRefillableInteract(user, used, target, component, useDelay, absorberSoln.Value)) - return; - } + if (TryPuddleInteract(user, used, target, component, useDelay, absorberSoln.Value)) + return; + + // If it's refillable try to transfer + TryRefillableInteract(user, used, target, component, useDelay, absorberSoln.Value); + // Corvax-Next-Footprints-End } /// @@ -324,4 +333,71 @@ private bool TryPuddleInteract(EntityUid user, EntityUid used, EntityUid target, return true; } + + // Corvax-Next-Footprints-Start + private bool TryFootprintInteract(EntityUid user, EntityUid used, EntityUid target, AbsorbentComponent absorber, UseDelayComponent? useDelay, Entity absorberSoln) + { + if (!HasComp(target)) // Perform a check if it was a footprint that was clicked on + return false; + + var soundPlayed = false; + + var footPrints = new HashSet>(); + _lookup.GetEntitiesInRange(Transform(target).Coordinates, FootprintAbsorptionRange, footPrints, LookupFlags.Dynamic | LookupFlags.Uncontained); + + foreach (var (footstepUid, comp) in footPrints) + { + if (!_solutionContainerSystem.ResolveSolution(footstepUid, comp.SolutionName, ref comp.Solution, out var targetStepSolution) || targetStepSolution.Volume <= 0) + continue; + + if (_puddleSystem.CanFullyEvaporate(targetStepSolution)) + continue; // no spam + + var absorberSolution = absorberSoln.Comp.Solution; + var available = absorberSolution.GetTotalPrototypeQuantity(SharedPuddleSystem.EvaporationReagents); + + // No material + if (available == FixedPoint2.Zero) + { + _popups.PopupEntity(Loc.GetString("mopping-system-no-water", ("used", used)), user, user); + return true; + } + + var transferMax = absorber.PickupAmount; + var transferAmount = FixedPoint2.Min(transferMax, available); + + var puddleSplit = targetStepSolution.SplitSolutionWithout(transferAmount, SharedPuddleSystem.EvaporationReagents); + var absorberSplit = absorberSolution.SplitSolutionWithOnly(puddleSplit.Volume, SharedPuddleSystem.EvaporationReagents); + + var transform = Transform(target); + var gridUid = transform.GridUid; + if (TryComp(gridUid, out var mapGrid)) + { + var tileRef = _mapSystem.GetTileRef(gridUid.Value, mapGrid, transform.Coordinates); + _puddleSystem.DoTileReactions(tileRef, absorberSplit); + } + + _solutionContainerSystem.AddSolution(comp.Solution.Value, absorberSplit); + _solutionContainerSystem.AddSolution(absorberSoln, puddleSplit); + + if (!soundPlayed) + { + soundPlayed = true; // to prevent sound spam + _audio.PlayPvs(absorber.PickupSound, target); + } + + if (useDelay is not null) + _useDelay.TryResetDelay((used, useDelay)); + } + + var userXform = Transform(user); + var targetPos = _transform.GetWorldPosition(target); + var localPos = Vector2.Transform(targetPos, _transform.GetInvWorldMatrix(userXform)); + localPos = userXform.LocalRotation.RotateVec(localPos); + + _melee.DoLunge(user, used, Angle.Zero, localPos, null, false); + + return true; + } + // Corvax-Next-Footprints-End } diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/objects/effects/footstep.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/objects/effects/footstep.ftl new file mode 100644 index 00000000000..23636484792 --- /dev/null +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/objects/effects/footstep.ftl @@ -0,0 +1,2 @@ +ent-Footstep = след + .desc = След из жидкости. From 74c8d776b896af974bfce0da8c56e0ca5eb06f69 Mon Sep 17 00:00:00 2001 From: csqrb <56765288+CaptainSqrBeard@users.noreply.github.com> Date: Tue, 19 Nov 2024 01:49:21 +0600 Subject: [PATCH 05/10] =?UTF-8?q?=D0=98=D0=B7=D0=B2=D0=BB=D0=B5=D0=BA?= =?UTF-8?q?=D0=B0=D0=B5=D0=BC=D1=8B=D0=B5=20=D1=87=D0=B5=D1=80=D1=82=D0=B5?= =?UTF-8?q?=D0=B6=D0=B8=20(#47)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ejectable blueprints * // Corvax-Next-BlueprintEject * // Corvax-Next-Something Co-authored-by: FN <37689533+FireNameFN@users.noreply.github.com> * Apply suggestions from code review --------- Co-authored-by: FN <37689533+FireNameFN@users.noreply.github.com> Co-authored-by: AwareFoxy <135021509+AwareFoxy@users.noreply.github.com> --- .../Lathe/UI/LatheBoundUserInterface.cs | 8 +++++ Content.Client/Lathe/UI/LatheMenu.xaml | 8 +++++ Content.Client/Lathe/UI/LatheMenu.xaml.cs | 17 +++++++++++ Content.Server/Lathe/LatheSystem.cs | 29 ++++++++++++++++++- Content.Shared/Lathe/LatheMessages.cs | 14 ++++++++- .../Research/Systems/BlueprintSystem.cs | 7 +++++ .../ru-RU/_corvaxnext/lathe/ui/lathe-menu.ftl | 1 + 7 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 Resources/Locale/ru-RU/_corvaxnext/lathe/ui/lathe-menu.ftl diff --git a/Content.Client/Lathe/UI/LatheBoundUserInterface.cs b/Content.Client/Lathe/UI/LatheBoundUserInterface.cs index a599f79152e..d4c21ad372d 100644 --- a/Content.Client/Lathe/UI/LatheBoundUserInterface.cs +++ b/Content.Client/Lathe/UI/LatheBoundUserInterface.cs @@ -27,6 +27,13 @@ protected override void Open() SendMessage(new ConsoleServerSelectionMessage()); }; + // Corvax-Next-BlueprintEject-Start + _menu.OnBlueprintEjectButtonPressed += _ => + { + SendMessage(new LatheBlueprintEjectMessage()); + }; + // Corvax-Next-BlueprintEject-End + _menu.RecipeQueueAction += (recipe, amount) => { SendMessage(new LatheQueueRecipeMessage(recipe, amount)); @@ -42,6 +49,7 @@ protected override void UpdateState(BoundUserInterfaceState state) case LatheUpdateState msg: if (_menu != null) _menu.Recipes = msg.Recipes; + _menu?.UpdateBlueprintEjectButton(msg.HasAnyBlueprints); // Corvax-Next-BlueprintEject _menu?.PopulateRecipes(); _menu?.UpdateCategories(); _menu?.PopulateQueueList(msg.Queue); diff --git a/Content.Client/Lathe/UI/LatheMenu.xaml b/Content.Client/Lathe/UI/LatheMenu.xaml index 5b21f0bae66..70458f3974b 100644 --- a/Content.Client/Lathe/UI/LatheMenu.xaml +++ b/Content.Client/Lathe/UI/LatheMenu.xaml @@ -74,6 +74,14 @@ Orientation="Horizontal" Align="End" HorizontalExpand="True"> + + + public Dictionary Cyborgs; - public RoboticsConsoleState(Dictionary cyborgs) + public bool HasCircuitBoard; // Corvax-Next-MutableLaws + + public RoboticsConsoleState(Dictionary cyborgs, bool hasCircuitBoard) // Corvax-Next-MutableLaws { Cyborgs = cyborgs; + HasCircuitBoard = hasCircuitBoard; // Corvax-Next-MutableLaws } } +// Corvax-Next-MutableLaws-Start +[Serializable, NetSerializable] +public sealed class RoboticsConsoleChangeLawsMessage(string address) : BoundUserInterfaceMessage +{ + public readonly string Address = address; +} +// Corvax-Next-MutableLaws-End + /// /// Message to disable the selected cyborg. /// @@ -129,6 +140,9 @@ public static class RoboticsConsoleConstants public const string NET_CYBORG_DATA = "cyborg-data"; // sent by robotics console to cyborgs on Cyborg Control frequency + public const string NET_CHANGE_LAWS_COMMAND = "cyborg-change-laws"; // Corvax-Next-MutableLaws public const string NET_DISABLE_COMMAND = "cyborg-disable"; public const string NET_DESTROY_COMMAND = "cyborg-destroy"; + + public const string NET_CIRCUIT_BOARD = "cyborg-circuit-board"; // Corvax-Next-MutableLaws } diff --git a/Resources/Locale/ru-RU/_corvaxnext/research/components/robotics-console.ftl b/Resources/Locale/ru-RU/_corvaxnext/research/components/robotics-console.ftl new file mode 100644 index 00000000000..2ad49b0e854 --- /dev/null +++ b/Resources/Locale/ru-RU/_corvaxnext/research/components/robotics-console.ftl @@ -0,0 +1,2 @@ +robotics-console-change-laws = Изменить законы +robotics-console-cyborg-change-laws = Законы { $name } изменены! diff --git a/Resources/Locale/ru-RU/_corvaxnext/research/technologies.ftl b/Resources/Locale/ru-RU/_corvaxnext/research/technologies.ftl new file mode 100644 index 00000000000..e7cc9deb626 --- /dev/null +++ b/Resources/Locale/ru-RU/_corvaxnext/research/technologies.ftl @@ -0,0 +1 @@ +research-technology-advanced-robotics = Продвинутая робототехника diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml index 4cd596e9b44..3633a9dfb0a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml @@ -1225,6 +1225,21 @@ access: [["ResearchDirector"]] - type: Lock unlockOnClick: false + # Corvax-Next-MutableLaws-Start + - type: ItemSlots + slots: + circuit_holder: + name: circuit-holder + whitelist: + requireAll: true + components: + - SiliconLawProvider + - Item + - type: ContainerContainer + containers: + circuit_holder: !type:ContainerSlot + board: !type:Container + # Corvax-Next-MutableLaws-End - type: entity id: StationAiUploadComputer diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 3dffc98d961..188e14a7632 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -521,6 +521,19 @@ - ReagentGrinderIndustrialMachineCircuitboard - JukeboxCircuitBoard - SalvageExpeditionsComputerCircuitboard # Corvax-Cringe + # Corvax-Next-MutableLaws-Start + - AsimovCircuitBoard + - CorporateCircuitBoard + - NTDefaultCircuitBoard + - CommandmentCircuitBoard + - PaladinCircuitBoard + - LiveLetLiveCircuitBoard + - StationEfficiencyCircuitBoard + - RobocopCircuitBoard + - DungeonMasterCircuitBoard + - ArtistCircuitBoard + - NutimovCircuitBoard + # Corvax-Next-MutableLaws-End - type: EmagLatheRecipes emagDynamicRecipes: - ShuttleGunDusterCircuitboard diff --git a/Resources/Prototypes/Research/experimental.yml b/Resources/Prototypes/Research/experimental.yml index 34443e78f00..d2a84036eb1 100644 --- a/Resources/Prototypes/Research/experimental.yml +++ b/Resources/Prototypes/Research/experimental.yml @@ -125,6 +125,30 @@ - WeaponParticleDecelerator - HoloprojectorField +# Corvax-Next-MutableLaws-Start +- type: technology + id: AdvancedRobotics + name: research-technology-advanced-robotics + icon: + sprite: Mobs/Silicon/station_ai.rsi + state: ai + discipline: Experimental + tier: 2 + cost: 7500 + recipeUnlocks: + - AsimovCircuitBoard + - CorporateCircuitBoard + - NTDefaultCircuitBoard + - CommandmentCircuitBoard + - PaladinCircuitBoard + - LiveLetLiveCircuitBoard + - StationEfficiencyCircuitBoard + - RobocopCircuitBoard + - DungeonMasterCircuitBoard + - ArtistCircuitBoard + - NutimovCircuitBoard +# Corvax-Next-MutableLaws-End + # Tier 3 - type: technology diff --git a/Resources/Prototypes/_CorvaxNext/Recipes/Lathes/circuit_boards.yml b/Resources/Prototypes/_CorvaxNext/Recipes/Lathes/circuit_boards.yml new file mode 100644 index 00000000000..e690877af67 --- /dev/null +++ b/Resources/Prototypes/_CorvaxNext/Recipes/Lathes/circuit_boards.yml @@ -0,0 +1,54 @@ +- type: latheRecipe + parent: BaseCircuitboardRecipe + id: AsimovCircuitBoard + result: AsimovCircuitBoard + +- type: latheRecipe + parent: BaseCircuitboardRecipe + id: CorporateCircuitBoard + result: CorporateCircuitBoard + +- type: latheRecipe + parent: BaseCircuitboardRecipe + id: NTDefaultCircuitBoard + result: NTDefaultCircuitBoard + +- type: latheRecipe + parent: BaseCircuitboardRecipe + id: CommandmentCircuitBoard + result: CommandmentCircuitBoard + +- type: latheRecipe + parent: BaseCircuitboardRecipe + id: PaladinCircuitBoard + result: PaladinCircuitBoard + +- type: latheRecipe + parent: BaseCircuitboardRecipe + id: LiveLetLiveCircuitBoard + result: LiveLetLiveCircuitBoard + +- type: latheRecipe + parent: BaseCircuitboardRecipe + id: StationEfficiencyCircuitBoard + result: StationEfficiencyCircuitBoard + +- type: latheRecipe + parent: BaseCircuitboardRecipe + id: RobocopCircuitBoard + result: RobocopCircuitBoard + +- type: latheRecipe + parent: BaseCircuitboardRecipe + id: DungeonMasterCircuitBoard + result: DungeonMasterCircuitBoard + +- type: latheRecipe + parent: BaseCircuitboardRecipe + id: ArtistCircuitBoard + result: ArtistCircuitBoard + +- type: latheRecipe + parent: BaseCircuitboardRecipe + id: NutimovCircuitBoard + result: NutimovCircuitBoard From 88be7b7a58717c39f921a215c5b16cc14d2a9e5a Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Fri, 22 Nov 2024 21:17:07 +0300 Subject: [PATCH 08/10] [Port] CaptainDrobe (#58) * [Port] CaptainDrobe * remove delta-v boots --- .../entities/clothing/belt/belts.ftl | 4 ++ .../entities/clothing/hands/gloves.ftl | 4 ++ .../entities/clothing/head/hats.ftl | 8 +++ .../entities/clothing/neck/cloaks.ftl | 8 +++ .../entities/clothing/uniforms/jumpskirts.ftl | 2 + .../entities/clothing/uniforms/jumpsuits.ftl | 6 +++ .../structures/machines/vending_machines.ftl | 2 + .../Catalog/Fills/Lockers/heads.yml | 12 ++--- .../Inventories/CaptainDrobeInventory.yml | 51 ++++++++++++++++++ .../Entities/Clothing/Belt/belts.yml | 23 ++++++++ .../Entities/Clothing/Hands/gloves.yml | 21 ++++++++ .../Entities/Clothing/Head/hats.yml | 49 +++++++++++++++++ .../Entities/Clothing/Neck/cloaks.yml | 39 ++++++++++++++ .../Entities/Clothing/Uniforms/jumpskirts.yml | 10 ++++ .../Entities/Clothing/Uniforms/jumpsuits.yml | 32 +++++++++++ .../Structures/Machines/vending_machines.yml | 25 +++++++++ .../Belt/sheriff_sheath.rsi/equipped-BELT.png | Bin 0 -> 536 bytes .../Belt/sheriff_sheath.rsi/meta.json | 25 +++++++++ .../sheath-sabre-equipped-BELT.png | Bin 0 -> 603 bytes .../Belt/sheriff_sheath.rsi/sheath-sabre.png | Bin 0 -> 694 bytes .../Belt/sheriff_sheath.rsi/sheath.png | Bin 0 -> 484 bytes .../Belt/white_sheath.rsi/equipped-BELT.png | Bin 0 -> 487 bytes .../Clothing/Belt/white_sheath.rsi/meta.json | 25 +++++++++ .../sheath-sabre-equipped-BELT.png | Bin 0 -> 604 bytes .../Belt/white_sheath.rsi/sheath-sabre.png | Bin 0 -> 694 bytes .../Clothing/Belt/white_sheath.rsi/sheath.png | Bin 0 -> 479 bytes .../sheriff_gloves.rsi/equipped-HAND.png | Bin 0 -> 433 bytes .../Hands/sheriff_gloves.rsi/icon.png | Bin 0 -> 620 bytes .../Hands/sheriff_gloves.rsi/inhand-left.png | Bin 0 -> 492 bytes .../Hands/sheriff_gloves.rsi/inhand-right.png | Bin 0 -> 517 bytes .../Hands/sheriff_gloves.rsi/meta.json | 26 +++++++++ .../equipped-HAND.png | Bin 0 -> 320 bytes .../Hands/white_captain_gloves.rsi/icon.png | Bin 0 -> 573 bytes .../white_captain_gloves.rsi/inhand-left.png | Bin 0 -> 218 bytes .../white_captain_gloves.rsi/inhand-right.png | Bin 0 -> 225 bytes .../Hands/white_captain_gloves.rsi/meta.json | 26 +++++++++ .../sheriff_beret.rsi/equipped-HELMET-vox.png | Bin 0 -> 596 bytes .../sheriff_beret.rsi/equipped-HELMET.png | Bin 0 -> 564 bytes .../Head/Hats/sheriff_beret.rsi/icon.png | Bin 0 -> 399 bytes .../Head/Hats/sheriff_beret.rsi/meta.json | 22 ++++++++ .../equipped-HELMET-hamster.png | Bin 0 -> 539 bytes .../equipped-HELMET-vox.png | Bin 0 -> 474 bytes .../sheriff_capcap.rsi/equipped-HELMET.png | Bin 0 -> 539 bytes .../Head/Hats/sheriff_capcap.rsi/icon.png | Bin 0 -> 409 bytes .../Head/Hats/sheriff_capcap.rsi/meta.json | 26 +++++++++ .../white_beret.rsi/equipped-HELMET-vox.png | Bin 0 -> 507 bytes .../Hats/white_beret.rsi/equipped-HELMET.png | Bin 0 -> 585 bytes .../Head/Hats/white_beret.rsi/icon.png | Bin 0 -> 371 bytes .../Head/Hats/white_beret.rsi/meta.json | 22 ++++++++ .../equipped-HELMET-hamster.png | Bin 0 -> 606 bytes .../Hats/white_capcap.rsi/equipped-HELMET.png | Bin 0 -> 624 bytes .../Head/Hats/white_capcap.rsi/icon.png | Bin 0 -> 380 bytes .../Head/Hats/white_capcap.rsi/meta.json | 22 ++++++++ .../equipped-NECK-reptilian.png | Bin 0 -> 2311 bytes .../royal_captain.rsi/equipped-NECK.png | Bin 0 -> 2202 bytes .../Neck/Cloaks/royal_captain.rsi/icon.png | Bin 0 -> 347 bytes .../Neck/Cloaks/royal_captain.rsi/meta.json | 22 ++++++++ .../equipped-NECK-reptilian.png | Bin 0 -> 1239 bytes .../syndicate_admiral.rsi/equipped-NECK.png | Bin 0 -> 1285 bytes .../Cloaks/syndicate_admiral.rsi/icon.png | Bin 0 -> 272 bytes .../Cloaks/syndicate_admiral.rsi/meta.json | 22 ++++++++ .../equipped-NECK.png | Bin 0 -> 1158 bytes .../Cloaks/white_captain_mantle.rsi/icon.png | Bin 0 -> 384 bytes .../Cloaks/white_captain_mantle.rsi/meta.json | 18 +++++++ .../wide_captain_cloak.rsi/equipped-NECK.png | Bin 0 -> 6000 bytes .../Cloaks/wide_captain_cloak.rsi/icon.png | Bin 0 -> 4980 bytes .../wide_captain_cloak.rsi/inhand-left.png | Bin 0 -> 868 bytes .../wide_captain_cloak.rsi/inhand-right.png | Bin 0 -> 880 bytes .../Cloaks/wide_captain_cloak.rsi/meta.json | 26 +++++++++ .../equipped-INNERCLOTHING-reptilian.png | Bin 0 -> 1158 bytes .../equipped-INNERCLOTHING.png | Bin 0 -> 1096 bytes .../Jumpskirt/white_captain.rsi/icon.png | Bin 0 -> 540 bytes .../Jumpskirt/white_captain.rsi/meta.json | 22 ++++++++ .../equipped-INNERCLOTHING-reptilian.png | Bin 0 -> 1070 bytes .../equipped-INNERCLOTHING.png | Bin 0 -> 987 bytes .../Jumpsuit/captain_command.rsi/icon.png | Bin 0 -> 215 bytes .../captain_command.rsi/inhand-left.png | Bin 0 -> 562 bytes .../captain_command.rsi/inhand-right.png | Bin 0 -> 590 bytes .../Jumpsuit/captain_command.rsi/meta.json | 30 +++++++++++ .../equipped-INNERCLOTHING-monkey.png | Bin 0 -> 1535 bytes .../equipped-INNERCLOTHING-reptilian.png | Bin 0 -> 1452 bytes .../equipped-INNERCLOTHING.png | Bin 0 -> 1349 bytes .../Jumpsuit/captain_white.rsi/icon.png | Bin 0 -> 503 bytes .../captain_white.rsi/inhand-left.png | Bin 0 -> 505 bytes .../captain_white.rsi/inhand-right.png | Bin 0 -> 520 bytes .../Jumpsuit/captain_white.rsi/meta.json | 34 ++++++++++++ .../equipped-INNERCLOTHING-reptilian.png | Bin 0 -> 1375 bytes .../sheriff.rsi/equipped-INNERCLOTHING.png | Bin 0 -> 1215 bytes .../Uniforms/Jumpsuit/sheriff.rsi/icon.png | Bin 0 -> 436 bytes .../Uniforms/Jumpsuit/sheriff.rsi/meta.json | 22 ++++++++ .../captaindrobe.rsi/broken.png | Bin 0 -> 371 bytes .../captaindrobe.rsi/meta.json | 31 +++++++++++ .../captaindrobe.rsi/normal-unshaded.png | Bin 0 -> 581 bytes .../VendingMachines/captaindrobe.rsi/off.png | Bin 0 -> 271 bytes .../captaindrobe.rsi/panel.png | Bin 0 -> 190 bytes Resources/migration.yml | 3 ++ 96 files changed, 714 insertions(+), 6 deletions(-) create mode 100644 Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/belt/belts.ftl create mode 100644 Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/hands/gloves.ftl create mode 100644 Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/head/hats.ftl create mode 100644 Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/neck/cloaks.ftl create mode 100644 Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/uniforms/jumpskirts.ftl create mode 100644 Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/uniforms/jumpsuits.ftl create mode 100644 Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/structures/machines/vending_machines.ftl create mode 100644 Resources/Prototypes/_CorvaxNext/Catalog/VendingMachines/Inventories/CaptainDrobeInventory.yml create mode 100644 Resources/Prototypes/_CorvaxNext/Entities/Clothing/Belt/belts.yml create mode 100644 Resources/Prototypes/_CorvaxNext/Entities/Clothing/Hands/gloves.yml create mode 100644 Resources/Prototypes/_CorvaxNext/Entities/Clothing/Head/hats.yml create mode 100644 Resources/Prototypes/_CorvaxNext/Entities/Clothing/Neck/cloaks.yml create mode 100644 Resources/Prototypes/_CorvaxNext/Entities/Clothing/Uniforms/jumpskirts.yml create mode 100644 Resources/Prototypes/_CorvaxNext/Entities/Clothing/Uniforms/jumpsuits.yml create mode 100644 Resources/Prototypes/_CorvaxNext/Entities/Structures/Machines/vending_machines.yml create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Belt/sheriff_sheath.rsi/equipped-BELT.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Belt/sheriff_sheath.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Belt/sheriff_sheath.rsi/sheath-sabre-equipped-BELT.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Belt/sheriff_sheath.rsi/sheath-sabre.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Belt/sheriff_sheath.rsi/sheath.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Belt/white_sheath.rsi/equipped-BELT.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Belt/white_sheath.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Belt/white_sheath.rsi/sheath-sabre-equipped-BELT.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Belt/white_sheath.rsi/sheath-sabre.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Belt/white_sheath.rsi/sheath.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi/equipped-HAND.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi/icon.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi/inhand-left.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi/inhand-right.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/equipped-HAND.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/icon.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/inhand-left.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/inhand-right.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_beret.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_beret.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_beret.rsi/icon.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_beret.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi/equipped-HELMET-hamster.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi/icon.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_beret.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_beret.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_beret.rsi/icon.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_beret.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_capcap.rsi/equipped-HELMET-hamster.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_capcap.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_capcap.rsi/icon.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_capcap.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/royal_captain.rsi/equipped-NECK-reptilian.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/royal_captain.rsi/equipped-NECK.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/royal_captain.rsi/icon.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/royal_captain.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/syndicate_admiral.rsi/equipped-NECK-reptilian.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/syndicate_admiral.rsi/equipped-NECK.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/syndicate_admiral.rsi/icon.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/syndicate_admiral.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/white_captain_mantle.rsi/equipped-NECK.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/white_captain_mantle.rsi/icon.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/white_captain_mantle.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/wide_captain_cloak.rsi/equipped-NECK.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/wide_captain_cloak.rsi/icon.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/wide_captain_cloak.rsi/inhand-left.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/wide_captain_cloak.rsi/inhand-right.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/wide_captain_cloak.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpskirt/white_captain.rsi/equipped-INNERCLOTHING-reptilian.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpskirt/white_captain.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpskirt/white_captain.rsi/icon.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpskirt/white_captain.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi/equipped-INNERCLOTHING-reptilian.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi/icon.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi/inhand-left.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi/inhand-right.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/equipped-INNERCLOTHING-monkey.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/equipped-INNERCLOTHING-reptilian.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/icon.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/inhand-left.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/inhand-right.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/sheriff.rsi/equipped-INNERCLOTHING-reptilian.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/sheriff.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/sheriff.rsi/icon.png create mode 100644 Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/sheriff.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Structures/Machines/VendingMachines/captaindrobe.rsi/broken.png create mode 100644 Resources/Textures/_CorvaxNext/Structures/Machines/VendingMachines/captaindrobe.rsi/meta.json create mode 100644 Resources/Textures/_CorvaxNext/Structures/Machines/VendingMachines/captaindrobe.rsi/normal-unshaded.png create mode 100644 Resources/Textures/_CorvaxNext/Structures/Machines/VendingMachines/captaindrobe.rsi/off.png create mode 100644 Resources/Textures/_CorvaxNext/Structures/Machines/VendingMachines/captaindrobe.rsi/panel.png diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/belt/belts.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/belt/belts.ftl new file mode 100644 index 00000000000..24b376747ac --- /dev/null +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/belt/belts.ftl @@ -0,0 +1,4 @@ +ent-ClothingBeltWhiteSheath = белые сабельные ножны + .desc = Стиль, блеск, всё для лучших сабель во вселенной. +ent-ClothingBeltSheriffSheath = сабельные ножны шерифа + .desc = Практичность, прочность, сабля точно не окажется в вашей ноге. diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/hands/gloves.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/hands/gloves.ftl new file mode 100644 index 00000000000..9cbd4ff6488 --- /dev/null +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/hands/gloves.ftl @@ -0,0 +1,4 @@ +ent-ClothingHandsGlovesCaptainWhite = белые перчатки капитана + .desc = Королевские белые перчатки с золотой отделкой. Шикарны. +ent-ClothingHandsGlovesSheriff = перчатки шерифа + .desc = Перчатки с эргономичной формой, предназначенные для удержания револьвера. diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/head/hats.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/head/hats.ftl new file mode 100644 index 00000000000..75a3b38ab0c --- /dev/null +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/head/hats.ftl @@ -0,0 +1,8 @@ +ent-ClothingHeadHatBeretCaptainWhite = белый берет капитана + .desc = Белый берет капитана, икона стиля. +ent-ClothingHeadHatBeretSheriff = берет шерифа + .desc = Берет - фаворит, местных шерифов. +ent-ClothingHeadHatCapcapWhite = белая фуражка капитана + .desc = Стильная белая фуражка капитана. +ent-ClothingHeadHatCapcapSheriff = фуражка шерифа + .desc = Стильная фуражка шерифа. diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/neck/cloaks.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/neck/cloaks.ftl new file mode 100644 index 00000000000..bb871bcd65c --- /dev/null +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/neck/cloaks.ftl @@ -0,0 +1,8 @@ +ent-ClothingNeckCaptainWide = широкая шинель капитана + .desc = Широкая капитанская шинель. Кажется, она не по размеру вам, но как накидка на плечи сойдёт. +ent-ClothingNeckCloakRoyalCaptain = королевский плащ капитана + .desc = Царь во дворца, царь во дворца. +ent-ClothingNeckCloakSyndicateAdmiral = плащ адмирала синдиката + .desc = Красный плащ, прошитый золотой тканью. +ent-ClothingNeckWhiteMantleCaptain = белая мантия капитана + .desc = Мантия капитана, с белым пухом. diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/uniforms/jumpskirts.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/uniforms/jumpskirts.ftl new file mode 100644 index 00000000000..b4c4015702c --- /dev/null +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/uniforms/jumpskirts.ftl @@ -0,0 +1,2 @@ +ent-ClothingUniformJumpskirtWhiteCaptain = белая юбка-комбинезон капитана + .desc = Белая юбка-комбинезон капитана символизирующая, что ваша зарплата явно превышает нормы. diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/uniforms/jumpsuits.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/uniforms/jumpsuits.ftl new file mode 100644 index 00000000000..a9aa51e4c0a --- /dev/null +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/clothing/uniforms/jumpsuits.ftl @@ -0,0 +1,6 @@ +ent-ClothingUniformJumpsuitCommandCaptain = командный костюм капитана + .desc = Чёрный костюм, на нём видны золотые погоны на плечах. +ent-ClothingUniformJumpsuitWhiteCaptain = белый комбинезон капитана + .desc = Белый комбинезон капитана символизирующий, что ваша зарплата явно превышает нормы. +ent-ClothingUniformJumpsuitSheriff = комбинезон шерифа + .desc = Комбинезон показывающий вашу статусность, как ужасн... великого правителя. diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/structures/machines/vending_machines.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/structures/machines/vending_machines.ftl new file mode 100644 index 00000000000..920ece61aec --- /dev/null +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/structures/machines/vending_machines.ftl @@ -0,0 +1,2 @@ +ent-CaptainDrobe = КапитанШкаф + .desc = Стильная униформа для сильного лидера! diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml index d8993183ee2..e2cff55e0ce 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml @@ -40,21 +40,21 @@ prob: 0.25 - id: ClothingBeltSheathFilled - id: ClothingHeadsetAltCommand - - id: ClothingOuterArmorCaptainCarapace +# - id: ClothingOuterArmorCaptainCarapace # Corvax-Next-CaptainDrobe - id: CommsComputerCircuitboard - id: DoorRemoteCommand - - id: MedalCase +# - id: MedalCase # Corvax-Next-CaptainDrobe - id: NukeDisk - id: PinpointerNuclear - id: PlushieNuke prob: 0.1 - - id: RubberStampCaptain +# - id: RubberStampCaptain # Corvax-Next-CaptainDrobe - id: SpaceCash1000 - id: WeaponDisabler - - id: ClothingEyesGlassesCommand +# - id: ClothingEyesGlassesCommand # Corvax-Next-CaptainDrobe # Corvax-Resprite-Start - - id: ClothingHeadCaptainHat - - id: ClothingOuterCoatCaptain +# - id: ClothingHeadCaptainHat # Corvax-Next-CaptainDrobe +# - id: ClothingOuterCoatCaptain # Corvax-Next-CaptainDrobe # Corvax-Resprite-End # No laser table + Laser table diff --git a/Resources/Prototypes/_CorvaxNext/Catalog/VendingMachines/Inventories/CaptainDrobeInventory.yml b/Resources/Prototypes/_CorvaxNext/Catalog/VendingMachines/Inventories/CaptainDrobeInventory.yml new file mode 100644 index 00000000000..8afc33ed84e --- /dev/null +++ b/Resources/Prototypes/_CorvaxNext/Catalog/VendingMachines/Inventories/CaptainDrobeInventory.yml @@ -0,0 +1,51 @@ +- type: vendingMachineInventory + id: CaptainDrobeInventory + startingInventory: + # Default + ClothingHeadsetAltCommand: 1 + ClothingHeadHatCaptain: 1 + ClothingHeadHatCapcap: 1 + ClothingHeadCaptainHat: 1 # Corvax-Resprite + ClothingEyesGlassesSunglasses: 1 + ClothingEyesGlassesCommand: 1 + ClothingNeckCloakCap: 1 + ClothingNeckCloakCapFormal: 1 + ClothingNeckCaptainWide: 1 + ClothingNeckMantleCap: 1 + ClothingOuterWinterCap: 1 + ClothingOuterArmorCaptainCarapace: 1 + ClothingOuterCoatCaptain: 1 # Corvax-Resprite + ClothingUniformJumpsuitCaptain: 1 + ClothingUniformJumpskirtCaptain: 1 + ClothingUniformJumpsuitCapFormal: 1 + ClothingUniformJumpskirtCapFormalDress: 1 + ClothingHandsGlovesCaptain: 1 + # White + ClothingHeadHatBeretCaptainWhite: 1 + ClothingHeadHatCapcapWhite: 1 + ClothingNeckCloakRoyalCaptain: 1 + ClothingNeckWhiteMantleCaptain: 1 + ClothingUniformJumpskirtWhiteCaptain: 1 + ClothingUniformJumpsuitWhiteCaptain: 1 + ClothingHandsGlovesCaptainWhite: 1 + ClothingBeltWhiteSheath: 1 + # Sheriff + ClothingHeadHatBeretSheriff: 1 + ClothingHeadHatCapcapSheriff: 1 + ClothingUniformJumpsuitSheriff: 1 + ClothingHandsGlovesSheriff: 1 + ClothingBeltSheriffSheath: 1 + # Other + ClothingEyesGlassesGarGiga: 1 + ClothingUniformJumpsuitCommandCaptain: 1 + ClothingBackpackCaptain: 1 + ClothingBackpackDuffelCaptain: 1 + ClothingBackpackSatchelCaptain: 1 + # Stuff + MedalCase: 1 + FlippoEngravedLighter: 1 + ToyFigurineCaptain: 1 + RubberStampCaptain: 1 + PaperCaptainsThoughts: 5 + contrabandInventory: + ClothingNeckCloakSyndicateAdmiral: 1 diff --git a/Resources/Prototypes/_CorvaxNext/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/_CorvaxNext/Entities/Clothing/Belt/belts.yml new file mode 100644 index 00000000000..2abe8d44fa2 --- /dev/null +++ b/Resources/Prototypes/_CorvaxNext/Entities/Clothing/Belt/belts.yml @@ -0,0 +1,23 @@ +- type: entity + parent: ClothingBeltSheath + id: ClothingBeltWhiteSheath + name: white sabre sheath + description: Style, shine, everything for the best sabers in the universe. + components: + - type: Sprite + sprite: _CorvaxNext/Clothing/Belt/white_sheath.rsi + state: sheath + - type: Clothing + sprite: _CorvaxNext/Clothing/Belt/white_sheath.rsi + +- type: entity + parent: ClothingBeltSheath + id: ClothingBeltSheriffSheath + name: sheriff sabre sheath + description: Practicality, durability, the saber will definitely not end up in your leg. + components: + - type: Sprite + sprite: _CorvaxNext/Clothing/Belt/sheriff_sheath.rsi + state: sheath + - type: Clothing + sprite: _CorvaxNext/Clothing/Belt/sheriff_sheath.rsi diff --git a/Resources/Prototypes/_CorvaxNext/Entities/Clothing/Hands/gloves.yml b/Resources/Prototypes/_CorvaxNext/Entities/Clothing/Hands/gloves.yml new file mode 100644 index 00000000000..2a82955ad77 --- /dev/null +++ b/Resources/Prototypes/_CorvaxNext/Entities/Clothing/Hands/gloves.yml @@ -0,0 +1,21 @@ +- type: entity + parent: ClothingHandsGlovesCaptain + id: ClothingHandsGlovesCaptainWhite + name: white captain gloves + description: Royal white gloves with gold trim. Gorgeous. + components: + - type: Sprite + sprite: _CorvaxNext/Clothing/Hands/white_captain_gloves.rsi + - type: Clothing + sprite: _CorvaxNext/Clothing/Hands/white_captain_gloves.rsi + +- type: entity + parent: ClothingHandsGlovesCaptain + id: ClothingHandsGlovesSheriff + name: sheriff gloves + description: Gloves with an ergonomic shape designed to hold a revolver. + components: + - type: Sprite + sprite: _CorvaxNext/Clothing/Hands/sheriff_gloves.rsi + - type: Clothing + sprite: _CorvaxNext/Clothing/Hands/sheriff_gloves.rsi diff --git a/Resources/Prototypes/_CorvaxNext/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/_CorvaxNext/Entities/Clothing/Head/hats.yml new file mode 100644 index 00000000000..8a042238a60 --- /dev/null +++ b/Resources/Prototypes/_CorvaxNext/Entities/Clothing/Head/hats.yml @@ -0,0 +1,49 @@ +- type: entity + parent: ClothingHeadBase + id: ClothingHeadHatBeretCaptainWhite + name: white captain beret + description: A white captain beret, an icon of style. + components: + - type: Sprite + sprite: _CorvaxNext/Clothing/Head/Hats/white_beret.rsi + - type: Clothing + sprite: _CorvaxNext/Clothing/Head/Hats/white_beret.rsi + +- type: entity + parent: ClothingHeadBase + id: ClothingHeadHatBeretSheriff + name: sheriff beret + description: Beret, a favorite among local sheriffs. + components: + - type: Sprite + sprite: _CorvaxNext/Clothing/Head/Hats/sheriff_beret.rsi + - type: Clothing + sprite: _CorvaxNext/Clothing/Head/Hats/sheriff_beret.rsi + +- type: entity + parent: ClothingHeadBase + id: ClothingHeadHatCapcapWhite + name: white cap cap + description: Stylish white cap cap. + components: + - type: Sprite + sprite: _CorvaxNext/Clothing/Head/Hats/white_capcap.rsi + - type: Clothing + sprite: _CorvaxNext/Clothing/Head/Hats/white_capcap.rsi + - type: Tag + tags: + - HamsterWearable + +- type: entity + parent: ClothingHeadBase + id: ClothingHeadHatCapcapSheriff + name: sheriff cap + description: Stylish sheriff cap. + components: + - type: Sprite + sprite: _CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi + - type: Clothing + sprite: _CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi + - type: Tag + tags: + - HamsterWearable diff --git a/Resources/Prototypes/_CorvaxNext/Entities/Clothing/Neck/cloaks.yml b/Resources/Prototypes/_CorvaxNext/Entities/Clothing/Neck/cloaks.yml new file mode 100644 index 00000000000..38bf04862af --- /dev/null +++ b/Resources/Prototypes/_CorvaxNext/Entities/Clothing/Neck/cloaks.yml @@ -0,0 +1,39 @@ +- type: entity + parent: ClothingNeckBase + id: ClothingNeckCaptainWide + name: captain wide overcoat + description: Wide captain's greatcoat. It doesn't seem to fit you, but it will do as a cape on your shoulders. + components: + - type: Sprite + sprite: _CorvaxNext/Clothing/Neck/Cloaks/wide_captain_cloak.rsi + - type: StealTarget + stealGroup: HeadCloak + +- type: entity + parent: ClothingNeckBase + id: ClothingNeckCloakRoyalCaptain + name: royal captain cloak + description: The king in the palace, the king in the palace. + components: + - type: Sprite + sprite: _CorvaxNext/Clothing/Neck/Cloaks/royal_captain.rsi + - type: StealTarget + stealGroup: HeadCloak + +- type: entity + parent: ClothingNeckBase + id: ClothingNeckCloakSyndicateAdmiral + name: Syndicate Admiral cloak + description: Red cloak sewn with a gold cloth. + components: + - type: Sprite + sprite: _CorvaxNext/Clothing/Neck/Cloaks/syndicate_admiral.rsi + +- type: entity + parent: ClothingNeckBase + id: ClothingNeckWhiteMantleCaptain + name: white captain mantle + description: Captain mantle, with white down. + components: + - type: Sprite + sprite: _CorvaxNext/Clothing/Neck/Cloaks/white_captain_mantle.rsi diff --git a/Resources/Prototypes/_CorvaxNext/Entities/Clothing/Uniforms/jumpskirts.yml b/Resources/Prototypes/_CorvaxNext/Entities/Clothing/Uniforms/jumpskirts.yml new file mode 100644 index 00000000000..6144146ebbc --- /dev/null +++ b/Resources/Prototypes/_CorvaxNext/Entities/Clothing/Uniforms/jumpskirts.yml @@ -0,0 +1,10 @@ +- type: entity + parent: ClothingUniformJumpskirtCaptain + id: ClothingUniformJumpskirtWhiteCaptain + name: white captain jumpskirt + description: White captain jumpsuit skirt symbolizing that your salary clearly exceeds the norm. + components: + - type: Sprite + sprite: _CorvaxNext/Clothing/Uniforms/Jumpskirt/white_captain.rsi + - type: Clothing + sprite: _CorvaxNext/Clothing/Uniforms/Jumpskirt/white_captain.rsi diff --git a/Resources/Prototypes/_CorvaxNext/Entities/Clothing/Uniforms/jumpsuits.yml b/Resources/Prototypes/_CorvaxNext/Entities/Clothing/Uniforms/jumpsuits.yml new file mode 100644 index 00000000000..022eebec557 --- /dev/null +++ b/Resources/Prototypes/_CorvaxNext/Entities/Clothing/Uniforms/jumpsuits.yml @@ -0,0 +1,32 @@ +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitCommandCaptain + name: captain command jumpsuit + description: Black suit with gold shoulder straps. + components: + - type: Sprite + sprite: _CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi + - type: Clothing + sprite: _CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitWhiteCaptain + name: white captain jumpsuit + description: Captain white jumpsuit symbolizes that your salary is clearly above the norm. + components: + - type: Sprite + sprite: _CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi + - type: Clothing + sprite: _CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitSheriff + name: sheriff jumpsuit + description: Jumpsuit showing your status is how terrible... the great ruler. + components: + - type: Sprite + sprite: _CorvaxNext/Clothing/Uniforms/Jumpsuit/sheriff.rsi + - type: Clothing + sprite: _CorvaxNext/Clothing/Uniforms/Jumpsuit/sheriff.rsi diff --git a/Resources/Prototypes/_CorvaxNext/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/_CorvaxNext/Entities/Structures/Machines/vending_machines.yml new file mode 100644 index 00000000000..12feae26030 --- /dev/null +++ b/Resources/Prototypes/_CorvaxNext/Entities/Structures/Machines/vending_machines.yml @@ -0,0 +1,25 @@ +- type: entity + parent: VendingMachine + id: CaptainDrobe + name: CaptainDrobe + description: Stylish uniform, for a strong leader! + components: + - type: VendingMachine + pack: CaptainDrobeInventory + offState: off + brokenState: broken + normalState: normal-unshaded + - type: Sprite + sprite: _CorvaxNext/Structures/Machines/VendingMachines/captaindrobe.rsi + layers: + - state: "off" + map: ["enum.VendingMachineVisualLayers.Base"] + - state: "off" + map: ["enum.VendingMachineVisualLayers.BaseUnshaded"] + shader: unshaded + - state: panel + map: ["enum.WiresVisualLayers.MaintenancePanel"] + - type: PointLight + color: "#05DAF2" + - type: AccessReader + access: [["Captain"]] diff --git a/Resources/Textures/_CorvaxNext/Clothing/Belt/sheriff_sheath.rsi/equipped-BELT.png b/Resources/Textures/_CorvaxNext/Clothing/Belt/sheriff_sheath.rsi/equipped-BELT.png new file mode 100644 index 0000000000000000000000000000000000000000..d36ae4bf71f9c6906cd8ba8fddbc26113f0a362c GIT binary patch literal 536 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 V0DOe%Nl^d*002ovPDHLkV1i*O%o6|r literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi/equipped-HAND.png b/Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi/equipped-HAND.png new file mode 100644 index 0000000000000000000000000000000000000000..cd05a50f04870a259b6ed8af6cbba2cfdfa164e5 GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zvproLLn`LH zy|p)s$x(#$!Q=^b-p*1NlN1wn-kovikov}pM*cz@PBQ;sF>9K;fklTYlj&vBQ~#Nl z-Yw(MYwX!=d{g#)*K_98rD^Bljx+A%77&DjRI|zZYWCWlOuIDw=muTAWU<5B{>X)Y z|C;|v&+go}7i;c)__xvh`9AIkn++VQt{?rJGqqRyvB>NA=dmWcMVhaPEzanDS@Tk) z$|^odWUXOFZerQW%QJSZ<7e>j(dkWlvURHTSq~xMZiWxFp*#1Tu3lfG_U+?+{rU|K z?oZ}1h8FBy7_>ZZ%o*HuY&)#JJ}fWzXx+eifp0-Ch*)dJYVj>vVaqKM z2X5{KvJTRiL_@_IyR85K literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi/icon.png b/Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..00119ad0b7ead252d9e65f8626a8cdfc55f65dfd GIT binary patch literal 620 zcmV-y0+aoTP)Px%CP_p=R9J=WRWWGWKoornp1Nohg&08whYlSAMg+XJ7&=r#25(usco1~ym_Z~O z3mI%^hkEMlK^iIxEdUYtHHsaH$lYr%gcfZ694|?wIGx2PHQI-RF9&RHXon6E0yK1Uf&euj2cjY08yWL~C9*sk= zz`?T@Z*X|xg9Q%O^E>pWo4hyxAe=2wWunqRUR-D5+vg$P-!!0$3ug-?DMxePDmAfJ zC7z@l;cQVj^ZG81&aUxr8=*JdNHLwb*LUG|k5SeWS_5=*ukS)&X;Sm4NRrexr;?#+Em-k8T( zp{7Kx#(8}gqj8AU#K$mV(qJKs2nVC06aEb zFD)16ac1bYr$Y}CTiyP=nR z%5}fvch1QhaL5N>w!@&a&QWPuO3-Y`lgCNLf9B7)?>@n7zT50lhaS!8a~|s- zPLe;EWA&#%^xC|~(HnR47yO-JZg;uH(P`6N-iV`rX1=I9uVN;=+|e(|zxTUNxWMLLPqvMbX5B@`HKOq%-S@;# zcn0cJ`M=D4(eRG@bW!Kw#QCqL^=^t`au7e*($_z$VN;BgOF%fEyg&0BwPovMT$XeT zxEeUbTD~#kWq9y5_|jXW3qRkQ@xD6cI#<}3F>SBtmfYrDMF%G)1%;mjGQWlu)Qij2 zD?E~9V2D3oZ~pIxolAaITp7cIGvBlSSgLI?Njnqz|AlyGXD=Y+D@?Da6*REzm$d`-b@sQ%BXDV{h(UGy}#f NgQu&X%Q~loCIFok*X;lR literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi/meta.json b/Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi/meta.json new file mode 100644 index 00000000000..c52c1e9672e --- /dev/null +++ b/Resources/Textures/_CorvaxNext/Clothing/Hands/sheriff_gloves.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from shiptest (https://github.com/shiptest-ss13/Shiptest) | Edited by PuroSlavKing (Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HAND", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/equipped-HAND.png b/Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/equipped-HAND.png new file mode 100644 index 0000000000000000000000000000000000000000..eb46456f9de685779b42ead6995c69edf5b3e0e5 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|etEh$hE&XX zdrOh;kb{83MZq~s3fKfzbhQ<*i*z|F2&^zwky#)r!`R6v#KO5qoFOu}Sv@hpgx93R zd@0MJ`emNmH*Y@MH(QVqXciC{om9H;IdK_~{CXmI_KdG5F4x@Ae?I+f+WO2{ul{BV zPyS!G`)0V+0rgMjak|GQ_ibrwj45~T+_UlO!o?YyZ!d@F-CcI%;VG?W(Vx3JIt&+n zt7cw4`^|T@ET4$AfA*=^Lu>((4fdheHqZYZ6dk-Nf>G>TZo&w`T;r4-H8FYOA{TvwN%|Kgg7F^Z&x{zOMdsDG$W+boFyt I=akR{0Du>T$p8QV literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/icon.png b/Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..22ff2317a0dd1035a52aaa9617fb38a488e1cbda GIT binary patch literal 573 zcmV-D0>b@?P)Px$_en%SR9J=Wm9cB`Kmf&`@^$W1N+-dsv(TYi62v&E zyonZ?g;>wpd^v39%J+q+|E=70d)iz`eO%L1e7!y*8n^KF^p5A|4MOVY{L|?Jl9-_k zq7cCICOnB5rqhSqe=5Y?>Qa`O%0ueIb$f*nMgXz$koqt|i1FLgI{+YwnKrMMi*XS| z4nUNPuq;FtX1<`c`GVF|2vhlhj6lvJWS^j#I_P!?4@in@dWw+x(hL9tGJ@sUa>ern z)x5$FK)WuaJ_cljXxzfCK_sB?|544BW8>(mhv=N5Pe#&gIW{cEmbcneE~H*(Ikqgn zXUA~eAE=WPs&9d~)c|nMjuDMpvOI|yl9q$Zxeng^^p3J;^_2CPR{ydGAdUd1{#o zDt^~ZlLDkHq)6%$kWR^-7g0RZ{c~Crza`nWxP#00000 LNkvXXu0mjfNAVFM literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/inhand-left.png b/Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..5ec31202f101c65de7de1845def08669fe38bbf8 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=3q4&NLn`LHy>*bY)j*)-;n%N1 z+?)~T!ZttUc@06+W z@0CqTi*hY*N3PcT^lZ)5ZF8RLJBBsv*00vwwrok)p2*-$dqs-ByUx_sULakVqAw0H z2S^?$_uVKh;kr?J!hgQ~u3Oz_Y-6}8mw1b5mtZvu1B2Zorn)cQt(TIwXM%Kiy85}S Ib4q9e00v%BRsaA1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/inhand-right.png b/Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..f9ea9a377af76d25f865013b47d84c8f3e8e43fe GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=D?D8sLn`LHy>*cDumMkN;?ms~ z%@Rg^%Pv|l<_l_kGanpwUV Oq{-9O&t;ucLK6Tp>Q##X literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/meta.json b/Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/meta.json new file mode 100644 index 00000000000..c52c1e9672e --- /dev/null +++ b/Resources/Textures/_CorvaxNext/Clothing/Hands/white_captain_gloves.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from shiptest (https://github.com/shiptest-ss13/Shiptest) | Edited by PuroSlavKing (Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HAND", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_beret.rsi/equipped-HELMET-vox.png b/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_beret.rsi/equipped-HELMET-vox.png new file mode 100644 index 0000000000000000000000000000000000000000..0c21890c29032bfc9e169d928995a171d27d90ee GIT binary patch literal 596 zcmV-a0;~OrP)Px%4oO5oRCt{2+QBOXQ5*;GFS$E7Otix;wY9Y=wMrVrNiKwgQcmIzz>OTl4gY|n zQZ9;%+!V<{DQ&jYw(KnR4i4_>IczigX3@@jyC(AeoMvWU^M3EW-@HA%A3*wNzkjz>?q58;eGvFFyZhCR7hTn=1r< zKfk&wXM#oqp_^J=mBHtW!cRQ_xLs(&_-PB=l7Pu7gt4-;A@`4VV8<)~mDIOm7J53Z zKwRP}d<7PnVVY1_U?LcaB)btB>aidrTqy22*1jvxgcvd zsTPPWvhA3Nh=_=Yh=_=Yh=~4@=#LO;9eP9@QFFB2{XY8hZE$QA3B%0Mt`AUUoTT(l zW>tp=7Y$G3uZl8&`U^9RCqO-`KR&yLdTyV0L_>=uIZ7|Xu6h$(_PoUK*mW*wNxh5s{gVHAR;0n iA|fIpA|fLCM?L^xZq{#xZTY?c0000=#r!L`1y@sdfcQ%_ zjYkR`K{^~uZ-qQ$V=sRwb82a))e|L6#{c^@J^SxePxm(7!~Un(cAxvHa}N(aYAFuO z=VCZ;_v_^U)qex;owE3Rd+oPBkA5yT-tVTe*HP`fXz;m8z1fGtPP!dzdUH(a$=aSd zx_y=FrfP3@5W2LP!!GkJgYr#v_2ceyym#hso!*$ubB33Zfot{ph3{J4pA66DJ^y~X zIse*v32SJ0GSYwa01t}PZ=Vec??#p$WhJ5FCM z^=`SRtRTPqN#3=RbHz8y);n#z)-YG(mMxRv+=K6)tlrAD@A|9r%k4|^#BYS1{Pu-y zMY3_8g=^4$CR2|Uq2ZHP=Srm2H+mvW}9I3x^A1`M9AelF{r5}E+0l=%+; literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_beret.rsi/icon.png b/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_beret.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a7264a728ff5de67a63d3bb71e7fa67728f9b253 GIT binary patch literal 399 zcmV;A0dW3_P)Px$Nl8ROR9J=Wl)p>EKp2LfNCh{?cF;=cRO}z%*g+7NcC1d_oE+W!F^F!Cg6P&s zGsZ>Sva~ojNhKhJK-yAoaCZ>mAQw_;?oJV0?pZ?aOTPEb_g)Sx7K_F5&p4{0@B7M^ zFD?(0?0pyu&Q7n=o{dIBYoMTgVg`HrJ4v-%q+YActN~L-RQzZHvU#33z#xbSV*$Wp z??r23&cvk@Z*8n8#eaiQ1ajm+uK2+6iRy_U<2Y#ZRu^**Xen z-W9mr{4f&N8pwV*d}aUL#2|>$>&S zjNgBwwEko)EK%;#;>u#Oyfi(5tT7&J!*-`NWkRCbWNz1U t;ExU>x9d6WPAi$UuI+BISS%I;J^|SbcpbF3_uBvf002ovPDHLkV1n@avJe0O literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_beret.rsi/meta.json b/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_beret.rsi/meta.json new file mode 100644 index 00000000000..b26a8bf7a4a --- /dev/null +++ b/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_beret.rsi/meta.json @@ -0,0 +1,22 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from shiptest (https://github.com/shiptest-ss13/Shiptest) | Edited by PuroSlavKing (Github) | vox by vetochka_igrit (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "equipped-HELMET-vox", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi/equipped-HELMET-hamster.png b/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi/equipped-HELMET-hamster.png new file mode 100644 index 0000000000000000000000000000000000000000..0ab51e0682906d9fd5b972514ab8cd5d9cc8fce5 GIT binary patch literal 539 zcmV+$0_6RPP)Px$)k#D_RCt{2+A&K)Q4|O8f8o#&xFi>!W{D6*r3DUA4Gu!I)ELcug7&^cU!k?N zrKO>vS_&#tj6f_c9}iuE#^5$QefmO!bHP{8|2OGTb1a=7y^!qa)A|fIpA|fIpA|fK9Kg*~zrl#EjDbTIa1=%Ce+aJ)W3wp&_;S7wb z!@1QofOcKJtyr!Gl7!CUzsClE^Q(fmLM-kN0J>T4to2x{)UNn)?Vyu^##sZVi!sHK zuarvW^S#blmtweir|94M z(w<#kkr1f<^W?`y^=Y2!jW#X%a1LtaD{$ShG%|qOOoj!j6~uH`|#npG5@(5#Zu_(HdjVnvc~7M1Oj#&q+(Q zc~+8^+FmC2nQ5{yozR0kvH(&*L!kat=e3dy&)fVZ&@9uRrBM6(RTTL_X6I%_#1KW{@$uIwprWF z-)+r%9kcBrqr&dZ&yVSzK6LGyQNzdkZ~Cg?^I7OZm7?5`P0TWt=QOVYQVjKt?wQ@ zdldLj*O~dT^qGV!DnGs*>&nluo6Ayk!BOSm@gEb8^Lxg>IQ!?|yNLTA6TMVLyr#~| zUlX!Y^0;`qk8kVOCoP9gK2uM!e!Zdp{DxAiuIb_I=Pv)gP~I?$@AbL&CplZEhaazg zW^?*+cl?R8X(kLuk__|DY|CYESXdx^LXhE)^}49?$pyul_DpWm7l>{*VQ^9AIy+7J z&)Sb-H&iVyyg%R2fdu~PEWR{jRvGsahwX0SDg6%l^$yGRUWlf*8XK(Qdme7gaI5s^ zwxFeA9zs^#|K+3^&aLly#I-W@09Z}c3LV^l(bMgR6O ZIGSzPZKb*SI54&uJYD@<);T3K0RRcg_Ll$v literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi/icon.png b/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9a33f31b27ac551425e0e028685b693c82390006 GIT binary patch literal 409 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^TwV%E$u*s#i1r|GlgG z;nepn=ag+3ovYhBF#^9A28dbb(7=L@Eq32X8tBqSWjwlw@C zV%>17VTp#o^ymNewUy5?cr%+$lquLb?Ww&42$;RIIr!nnN$BFMGxBMmlY}-BCU|VE5$S0PG~jXrIf9u%%{_U6O`w_yFsvCoUHx3vIVCg!0M0C%NdN!< literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi/meta.json b/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi/meta.json new file mode 100644 index 00000000000..d17c955041e --- /dev/null +++ b/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/sheriff_capcap.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/0671297bb1c1b31d5885f2768aecbe9dc51d39e7 , edited by Skarletto (github) | Edited by PuroSlavKing (Github) | vox by vetochka_igrit (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HELMET-hamster", + "directions": 4 + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "equipped-HELMET-vox", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_beret.rsi/equipped-HELMET-vox.png b/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_beret.rsi/equipped-HELMET-vox.png new file mode 100644 index 0000000000000000000000000000000000000000..8ce0381091b4af7b284b1e2a9a1bb7f1e5c91aad GIT binary patch literal 507 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zw|crbhE&XX zduyZD;Q$e~2l0ige=#l0$ULESlXUoU!}zHE6<(qFB4 zue)W=b^%e4*OZ`3kv&_cHg{b)vhwo^et$JVb?D;yTdgdBNd!V|-=cctHI?b9bx z+!%Y9GiJ8D)66mn)DSJK32L1uRG4#m1&15!jXSq~O!)HhqROM|JHOO8d_QR{dFsbc n{*w&5*j1}+Ig}7!QJ%iWgTe~DWM4f-Rt9G literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_beret.rsi/equipped-HELMET.png b/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_beret.rsi/equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..45edbe50b737eae3b93c3875b3ee5cb1ce083e41 GIT binary patch literal 585 zcmV-P0=E5$P)Px%14%?dRCt{2+Oca|Q547Vuccc`p<9b&2(d05iX{cNOra!yKs#j37zhcj&0ryu zwM+kj7TyrYK%awqd7wsI3K7LY3?;}Lnm^!nNNzNVDeqpiCG_`!3qE|FbKiaE;&3kf z=TeF9G~sK$wF_K4{8aJt+5}Ir#4M3+mWb^Gt$~%8z=3>;FZ4<|_iR0Lq zqg7*$R!w2IXnY=IGH%jQ*e#mLImB^ng2T`|zf%PSmC&rOL104^)x-G+1ihe>a=Wmm05>}+oV@a$5L0{5n5( z&F#cKd@E{9{eE&WTqIrqo46G<7@eJ_07jf%ziF;}@FI7q>``Siak>BgxJNzX&TNQ? zh=_=Yh=_=Yh=|DD=Gx5sCmf$Bac}S@+pL`0r=K%>KH+cX9J`}OZ_f(MwAVLf1c%|Z zy!B>#d_KUVIv=?Hz`prTcSyAsQLRPv`U9HZ&-nV~#C-;iT2X^uf55?q&j2hhEwa9r zC#Zy8o6~Cx-0acsY;Uo!@CbMe{PYRwq|+Ue%db$aMPxH+mX{XEX3_+e&}`ziCA=2k zR*$|6BcDK?xeI$m17It$(;Wi0UrZAB`d`2Px$ElET{R9J=Wlrc-gKp2Lfh%OePnH)lg(vZ#7&5*eS@>BdL`X7p+I22M41iJ)X zGKdatr6EJi(8)pCHBJ}Ls+Xe{T<)2YyX2ntzWX>Z7z_r(KVzvT(==87+&QxALB9t; zUX;ui70&Ttvt|$ktpWD6Vk*P}@jhQvwdXpl-rtm)+bY0M;>{4B6``i3!T@`^@@lzO z%C|);K($=gp6h5YninP4SJT}D5b{C4$L%a@6^mxnMHxVr19-0UErgKfMTz|~t=di%VV-Q9$hr!G2P~QJV~_ffYtz;A>^|SBi{-mU)N(W7z~DA`2gl}dPkMl RmCyhH002ovPDHLkV1nrfqW+*gvd)@NCj*g@avR)~f62>8(3^?d-vo6Ba)4U*XLu zB+%5N_f4PU{jHVFlk?uc5MjUTQ|VnP-PiQ&n$yEVj{H3`YoF9{9(|u~RrGz|ef9i% zr$5;-2nt@@ymdnPf@@KKN>^V!W$PbzY({3?;)^Hd&aVUtP6^^TETCUsd*u97e+j5{jtXJ0E)Y~Wi1}M+0R?U zri283#ZN8kN$C;H)@^w8i?znTDQH!Izr)Hc*OGb!pU<&)?!xBlY34s=rgHN$lj9P> zo_^03)i|EB-1+K#7tgGzqN>fyV!oEA8+Gd)y7QOO^WTgpP1XkwYxZ4^Z<3A`S@}G0 z{dfHh+jjN6JEo$~YR4a{&-X9-%39Id#gldL%s20EydfJI{#o_CPkXmfy`cjNGV;Fr6|kRT6wWOG irUbs!2+uTMUj{88n*)eJ;8O5p5asFW=d#Wzp$Pyp8V!*E literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_capcap.rsi/equipped-HELMET.png b/Resources/Textures/_CorvaxNext/Clothing/Head/Hats/white_capcap.rsi/equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8a8a17381e92aaff53e983410b1169ed63c07f GIT binary patch literal 624 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%0DB;y%|Duv zJQU#ie9!X`*E8dRraS<~A8y#{XS@+82MKuZ(=ShpdZBs%%V!c`B$EuV>jUh8bw!%- zX62jq0JFP1ycbRnfP5HZG#23A$Cc*>0PkgA9TxS>An+tu^19e!&er=3_5y87+DjER z6f$5ujOn_lxqLyXR?dVNCqyR2?RJF614_50=*I8b-AJ)<>B{ZVo~M!!8<(c+EU%-3 zO(g1JYg#>coPx!>@9j{Hzb=gFy0}s|)_3f)7w~f?4fU@DkUuK{o(WF*;m0nr+3d7D zW{ubLwd*%2cdlR133)Mk6;1y8k4jbpeg4@H8NV2V!OzXPwvWp?6_9}C&1fvZ^8xOS zq`>&sR<9TJ1IY+D1jfe3gz-@?yi7}$MtMDh!A96@ODH1hC7OCXA?k$#fB$hvcp{9# zUch%QU~swHJ*Bz-u|uZXH}y5Rt0a?t`ej%pV3}8WMC5Ysd)4?Q|3%V{qSUYv0PsYJ zVbC!UrF#Ld2DtAS$Pxe9{mmjE0ZmO!w(|0FW!dsqL=PJg5f$xq4-df)#-kpE0qPhQ z!|)8@V{1w*$@mcJ+CQnU{V*Qo=zSQEk2O!dfG~X?@X^*+{l>K29^v)Q;GfMloDPMv z_Zi%?VyCGZ+jxY$c7NK^dqaBvVTypK_2$&$alf)qC%&10-fU650CNEw2{OJrI;<~w z*mr1Szu$E410fxYPfbqHT!Bfzf9~O#t}@00ArT-eEL2z_@3{<&gcFMd&;rLI0kpue zNB}KxNQcL9wK4=A3WCv3Dm;!WM_;*ozR57^0^KfOzHD7|n4_;8szyw3zP!TNA;vf* zpJ17VX#x-jU}3%j@!vORz)C>YO!)%*AG(@_X#!xJ)9F;uxNlAXex9hY9; zq2|!Mj1E#mprWQ#1SyR<0PF#rF94FP8V=JZ&eMit%me6{t#99^!kT`Pf%Gznv$skY z!sItZoW8>|-q6Y_$wlb&3GL|q@iqoWe`BQXFy?jMj$6sNJAwNbb?{KsJow9OeI z+EG}dUvLz9#OIoC(=-7HHEV&#M6bXk3&zjw)>2lI3&;{+{(%SBJ;&lK+ZYpoj%LE* z4ATT4(*na_q*G&GBug0B=cp`FR)`Le6+qkd#izu7_5$4tNh2gacZ{wLp0H*W;Dm+g zRGEi*R5mL)R!mGXYp^Ut+s+(ut!kT=J)NGDAl3VT6ak#Dz^O96`2b~QX_oE?vA$1C zOei=RM#LJjp#wcSD|D(az9gNN6ZF?07)LMgIX#Y~WwxNf0x~#f0kSzNY|I&wfiwY_ zgw8c-{PL32R>Ad(@Qn?-O0I#eCe<|7ON*}Noa0)A~R7A`lF@pJJ(#5oAQ zBoIvs-I6zTOSLCWzy~ERF$p3ON+0_)w_k&hg}K0(zqIzrC9y-5g%knUT_O3f(zQiQ zIB>nW8vDL5&IOnQFf`xapiYLzPgoln;^al7tFrsY#Kg?`p$K~ch5=Rp%u8kxBYhFn zDu5LLA!@k4a~^u10WaWTFwl1@s5Ybtz((Wr)mZU0h)Jh+9ti-T1Lmddlvq`_+fth# zAgCd*F5aOVKc8oUydp3OH%I1Z2s{hMGmIq2E`dN$1UxIoGnj;6>Pi!Ur7%A~_}o9M c5NwD157RdXS!B4!1ONa407*qoM6N<$f|B|V#Q*>R literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/royal_captain.rsi/icon.png b/Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/royal_captain.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..95b798c11c54e51a19f93a996f22a02bd85d6aff GIT binary patch literal 347 zcmV-h0i^zkP)3_}Poq)r8b1SA2rG$3HW4gg@PQ3zuY79Rir002ovPDHLkV1oR!l;8jW literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/royal_captain.rsi/meta.json b/Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/royal_captain.rsi/meta.json new file mode 100644 index 00000000000..bd19a90cd3e --- /dev/null +++ b/Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/royal_captain.rsi/meta.json @@ -0,0 +1,22 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "By PuroSlavKing (Github) | reptilian by vetochka_igrit (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-NECK", + "directions": 4 + }, + { + "name": "equipped-NECK-reptilian", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/syndicate_admiral.rsi/equipped-NECK-reptilian.png b/Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/syndicate_admiral.rsi/equipped-NECK-reptilian.png new file mode 100644 index 0000000000000000000000000000000000000000..e39d24de0b25ed921a25f9e941033d864616239b GIT binary patch literal 1239 zcmV;|1StE7P)Px(kx4{BRCt{2o4;==Hypq}RBy0YGiQvl1dtF*qfAVlVLZCLAss4_EX~?IZ+SxM z(4|XZQl(gmG#BukX>&8(?6cewlB^N|D2a0ij;!Nwb1gIz1PJpjr zP)baiFfc#2CmFc_i^o2ThZmYx=QJ;;02w|0E-3%gwi^}?FU%65Ev=~&J7Jyiktmo9 zPW!TWcpdfezyn%vriaAqmCKeJ#%LDJjgfJ?ul>24G@hwrZt>zl)u#h z!bwujl;TP2_mwJTx;ZUV2KALPuLsoEyx+zTE{d!*9(dBaHrufq79mn9ZG?Kx3*tt~ z>z$h@?0`+i3spHGQi`tDEXg`Tj1|L|Kv!!gCv0@Uz9V^AGeI7aQnVb6&7<%ba4g36 z7c{TV0cc)MSvSsfwPvOii^o1t-1#5g0fW0|x_S=4c+|-_L--m7Ky37FdjiBEJHEfz zTK`rDOq0qJHco4+OVBbxKw9*d_JqHNb0F&s+h~A)fj=#W?2QS7^f{oRRK~!@O8m*w z;!TMUM6$-0_5L-O>qLfKUMDi;S*57_LQ7%0i?xRHjDA?p6L!3oxfJedowok3Rv4__ zCq1F-AivNUaNC~njqD0cdP74gBhzENYMXNkd>(ZQDNux&Qv8?oi9P-#1N@?XrVxLPVpEk16;3@w5Q0~5=Px5XqyU$=B~p>PN^lH{ixl&BMj!88nbRVsBxm0=;q zi@a$Vq{ahjYRn}RoRgz=DymN01;_UnX?ncMbXdCIr#0jI3;OLzCKDVfg==ooc?^&f z8ls3TeDT;n$T2zl(1yr{@25v99Rp4QHXM{V6t--c1x|ri$9i_k4W3Gw2$q~dmEB(u z8E0CjdhCPqI^bJUE>}J;9{UHG23x~J+LM~BKbGt^ z{Rulez!rRnuD^=Nv>Rd7U2Yl%M@d7qhV$Aq40h`FHhVb$j??;O%66Isp0utl ztd-s|jTe4jNte5hMb6WptiB}nek(Bzz6)Q5b55AEgv>))QJiDfPL;#))6n+G^veG< z0U$@@%RUmn4|1Ho7oS+EUf4%6Uihebc|4wv&41x!$Cga}Tj~G+002ovPDHLkV1ge+ BOM?Ia literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/syndicate_admiral.rsi/equipped-NECK.png b/Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/syndicate_admiral.rsi/equipped-NECK.png new file mode 100644 index 0000000000000000000000000000000000000000..912d31be13b21ba78a84636b0b4bb389fb56e97b GIT binary patch literal 1285 zcmV+g1^W7lP)F%*7C9n!2BE5?YW5DBrg>cn5jNLg4IkRle^ z5p`@?Dx?l9Ofb@)z*MzMgp`z}%2;(|g>0$6%lqJQBzNbFFGRZgr09HS$ItKcv;FMn z7gBOm1W3tI5g;W;MSzqX6#+hlM^{@TJeStbmwfU<0&@C4{zU1ucPnDkd1PlM0D{-v zUPyB|jM7#Z-rMWvGN{#_f@jAY@~P7mq$@`q00_aCkW%HO(gc%tW_ zJo1;dd`O_amQyk!;c6>-|Jdo?=YMu>!Vo}yYXU(@NF@Ml?z>*Sap}5@Nocxf&nb=J zz$d;VALUM6I+PWlo^2-|WH*%rfJ9Jn3<2b$+_r}mrV;=lm(duLh+Qbj#tc+>pswY6 zS~ipwpq`$QL%AdZit{^x@>%6462P%Xv+5Zl>~m5chDk^aw0@vD!OU&G4^k}v!WuF* z?Klw@mW+n}uRr53z(floo5u2hNy=JFL^=Eq|8I4=iSjcqgAILRIQ$+CpH^C{jW#_e zpsc9Jo|7z~J|&$7FGpyq@($7W0!e_?p>9sblhDvM`m6+*2}n|&D2fEDd_3LKAxg!O zcj+-7BoZ*|Odi@Fu%PlJBrg_zGXw_}EBn-kg5 z94vx8&chLg=-f98z}ANxFe9605A$G;I$Yw1Py@lJq=40IRtn>3yV9_ zD>(q$!`mZ;&H*^`mV}EE^MaMl`vPd&z_XrQe!w!HDwr{YBF&$m3`U@4g*O3E7J@P1 zH1s`cSi$B`a2T{TSTm_DKFI9~^WG4Em0+F@5oD1BDxVj*383JjXZ~rROm;+G5@y;A z!Q|%M`-B||K9{26n0Yt&9K9b>wif|dU;E|~#B(Z79LB=szSih%0W>*|y@P;Z@H~J+ z)NuO(wB=U(;Z4AW-ohZ}wF8_48#)IxEbmoEZVN!qKd15pNf_@%{KMzo1RSc#FM{%f vwS?~-KN7qNSR}VS)*8>L*{680cagvEH2Zsj( zLkt50P;EW~LmC5vgUQS!pfbjiAirP+hi5l{LJW&NT^vI+CZ0WK$k${b!j|xaWuMtQ zF}7#FE|rB}=U`|aL* zQ|Fsp^%Kq8m={j?cFx?Cx5Gq6@`8|}nnvz+(_O(#!d8m}j0zN6?ioBdymjx)eFt{P zOzAo18=zXCETOAp{y;QTSbSoe=hkzdgFb&z(`rylyL?^OzwJ{n!@norE17?&DZ3iz S-D?Com%-E3&t;ucLK6T~LuCE{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/syndicate_admiral.rsi/meta.json b/Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/syndicate_admiral.rsi/meta.json new file mode 100644 index 00000000000..bd19a90cd3e --- /dev/null +++ b/Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/syndicate_admiral.rsi/meta.json @@ -0,0 +1,22 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "By PuroSlavKing (Github) | reptilian by vetochka_igrit (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-NECK", + "directions": 4 + }, + { + "name": "equipped-NECK-reptilian", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/white_captain_mantle.rsi/equipped-NECK.png b/Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/white_captain_mantle.rsi/equipped-NECK.png new file mode 100644 index 0000000000000000000000000000000000000000..29c15e9f6d83b0cec581cc84ff9e39e8c494cbe8 GIT binary patch literal 1158 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/wide_captain_cloak.rsi/icon.png b/Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/wide_captain_cloak.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6e8f14bd7c9d122ad524c235d73915b8253c2c6e GIT binary patch literal 4980 zcmbVQ3vg7`8D4OF@Q^Z;4x&=m#TO$dd(J(Nd(KM0``9Z{f*4V#w#t2+n=B;Rb$1~N zQ?y`GwCX6Lvd2=s0b@b_@6N$vB4YS=Q_)J#*PdN$ROUsvk3Lm2iv%gbHB*uKR z@;@SR|Ax~NiSZBR<}WNSY@Cw`^KEs0ln-=WXIlZJ6NwqKItzZdM3<9+ZqBvWr#{;8 zY$}Qf7NBW^4>x+OPzc~M`veD3^k`I1mYsaZ3VGdeQ>(5B0Nva_wVy_D&!Pxazv z;JR`nw~T;k!dW`gd!p`3}*}@ z+5bv`wPF-!nq05n7JREuwUo<+Ogi1s(NWhy>+;3sG*L>Wv5__m1QMv!)n4{HQG01> z6~Wb|u$U{9bNTjU1@osCiYFla5muzli(nYMqhG$?;5hS&`8d}KKa`p-v6Bs1M-U|hGU`aL zyN!*RhW1j~Zx3~YTc3jb)a7zfhK4~vB{30Iz^fo;CJIRGBZdP?F^(jQ!m7TT50_S0 zP}PtAPyNe_Ip{*a^=somw;WGJ6~%&xN>Jufe=pg7bN^LqZf0NKM)?q2J+2CM*OBHv zildk!iJ5^^U{a)+VHyS%A?IpFy3$4f(bu6vVi_27L*W?lI8Z3^S%@UZ7!id{6;TNZ z<~3u5B=A|RktTqE3DZbM%10(t(olwk%EYx|F-bTPGDM)KQOFraQb>VVEHDolQ`$6Y z#p0YoS`3Xugc%Z|LJ}Ma#C@O9P?8{~qGl{#auNq2f>0O5cKP+{MQWzAew zu}O*43YlRPAsjOTb%Zxz;5gtkFc{ah`sMpksJIMJ=tm4`1^iMxRETq5nuMwlK5NAa z17?~gmMBy@uGCSXz=vqH)^P~U2$UeTVnsklgK3UJ$|DGr0kwP+GDmnE`PeX{(5w|p zhuBxX2#~M1i8N;sQl`%;U2ZC^DR8W2tl01wLD1Zl9qk9GLpSd}HevSec=sh!Pohk70%S=Uky$=cGy3@cd7 zoS`*|qOd;77@0Eiq5HwE?_-60qD-lH6w<-CShZ`ou3;-IY>(55U1e};6UTGE2FQYk#;*~54XEiCPda=*70 z$?~jcQky}_VWS#4L$0TY1L?17+F93iF?Man?W~y{hPRLj4`wa9s%c3Nm?*JfQQM-! zF~P%%xtJf<6j>(W#ROM2Od&&i>zR%NggNdlB*rp1w}1_fbcgZQb3A4`R)u}6QWY!f z8lEW`;n;=S!!RD!X-Oq^2I6!$fC=C|u-CKQp}mDA8RmlkhFl6;H4Gj;>=ZtS!NeCz z!eXqx(xbgIZ{Gl&K0YoFHfaOZ;6yPySDC!K`e)=T^$i2laNiL^cyR*qsi zO7-8)eeIJ-A8bd92GC*7XMJL&d|dAEi`r_2Q%fyJz%=;Zn}fbk(*GG{?{8l^YFEYK z{9d^ncyIt;1|B`=c6i=Uga->RZtQp=kr=tG!L{Zu>^ZWazV-EsPg`-`gG~oMJM@zC z%ck2}ryZG~KX4~L*S#hA^kpwU{^&K+CjWlro>{qh`p#dAj@?JU*!|OsCmQbHlgSE?a-sFMf9G zm=)We88_|P=k|ZN&)|t$zBPV*_uZRM+W)<4pWpxC$$!E{>&3nAi@gVO2k(>a=)2r| zFMVyohIaZ=F!qJX4fDf}?e0~3-Wju}Wc_5uzn*>T>CbX?=SAATw^ z=SXvR&z8|W_w4HG*)pyfpV#as#*V!Ry>ZiD;~PixEFQgT=QkGJ-*Wh}ed|_F>1;l{ zZ`aG4p1u9OI~(m6Cx6-x9F_op8C=O=tz-QCCj&@f@-)_IMacE7sk{dFs!Tzg^S-7h}A{@~oL zh3$Id?pH6~bpQ6N-k5dU`SKfy#KfkDH#IGH+kj)(N(j#BFLvlf2-Xy>_y(#~|c UT%S3;@)#}Ake%ypwHK}WH~54@CIA2c literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/wide_captain_cloak.rsi/inhand-left.png b/Resources/Textures/_CorvaxNext/Clothing/Neck/Cloaks/wide_captain_cloak.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..6c2a7c2ef90c9d7fea450b2e68699b0b98a883d5 GIT binary patch literal 868 zcmV-q1DpJbP)eKmbb$tr}_WgU6QXh?{B)?_kC}k_sRDs$$J39Fbu;m48t%C z!!QiPbQMao4#}@#fsBYr;ZHX)ldspD`y0n=P2Z<1&UCg+U-I3S=x~R`8?k=(Tt}`! zh3Fd*%P*jVusdbYI&CyHA*L9lO=p3g`@nS`fVbq`5bztIlze6>gv?S10O(dT0YG6$ z6^c_BQtjkVPOD-W5tHhV_D)M?KxQd~(hMkGlMykYgRrxpV0@Oav(R`c1kyQZ%Y@8) z55n={&B2h9c=)pdVA6%Elu$3<1_aVMXp1@flLJti4dM79GOHsPpLOxUUFQ*wpW1OM z#_J&bel+M;ZWX=_Sf>r;Y{npMF$Vxhjr~D5ZaMA2V1Mz-sxi7ooDb#wg28@R*17#6 zTfNWtrDdl;@AfbOz}3W&lKA-49y_=1OkvTJpcH3vvrkFR?IWfb1OQuG2e_Iz50000)!Z&BGv9$$2WWNBSO~-5rnjvUFu2LQCd3_s7oHhl)~oDe!A>3f zYJU#^aFX6brMs>SzBe|(3k+_u%Is|p0NIUe%&b>o%xN3|YPD@-zn<;my9C77TrVf- z@eACIqi@5WG$%{b0M^f*@4Eyh1u{Uk0NIcMvIWQ{@D-i&vH8_|AsFi);>2eF86aDL zY{&rF0%Su5$QB?QGC;Nf*^mLU1;~aBkS#zqWPoe|vgunGakKi){$HJ6&!YUW5~xq^ z@o?`U2o1x8GT^cUxQmXxwS-a3*svMMfc$zEuo?h>nOh0~;LGt3G@faEl;yGv3pT!c zU&DC}oB^WlzErvnMTsKG!-&8B4XYUZ!v`V%=6-;)nrJKpGb^wGBGr?BPO)<}#6+96 z0;CFu_DRP_2Px(KuJVFRCt{2nonrkRvgE_@#<2Nj+}i7R0{)HkjtPF8*GzIaW&?91-ht*l1qCG zwB)cswtwn)5fYwKpFYbmiDytgTkH;=E8xPfM~ zMczEVM)o#^DPws;^#MSUrEmd&!u6ZY772oY^twLL>t+~)X0t`~x=DInp9DcL6`UgU zgCLk%3e~6LbR7*u)KK)eqV$r3G=gFe;XVt$jZ)dOT6R|3U(WTH{P;1&$ zk9ZvyiY!5_3g~rx^66)C<~PkE{UliR=Z=8&*V`z+vazwUkM^#;q}DV5CsC%R=(bwZ z(B8F|Hdgjger03*^>&);%&bp2jsDybV2=zaYf`xFbzD#rR4@t+$g{sb9vd620{CU2 ziLCl@vgpqZK+?xWbSTo_(KY}$&9G4H@?P2l^}0#ang&IdP`-E>%hC<}`0JlomTsVY@p9OHq4fS&2ZztTW_FT7|B7%0 zhVdnS|09^WX4Rj23&f#MR{%5DNkcR*iqKCL0NVTCeft1(6vTP-=%?s#B<)>0w?A4% z>Zc39v5j^Ip*S@{1-*`oyZ3Gb825mFY@?n2`p#58RRHdISh}y;WMjAw$j(GBM0?}v za0i!;hq&YA`!~BteP*M3n*#aplMklaUp_s==id(tpI-wbc4{&w3 zgQy?YSs|vxh+a2I$#77<{si{OK*?}mSq=34L2l{rG|-E;tOiPk1AAnkeEkVZh6BBB zGWlQ%z} z9s|Z{^1eR^lOc4Q1?Jo!Fit`wQDjzVk;W`fi(pEPnH2}iD_>wk1I)@>*rRcKv|ysW zYiBZ&mZYMLAI!H{7LNezW4-b-wiwRG6o6>Hew=$hDNayi>79)LMV2Op`n0d~H3>|w z483kn<=o;GSw(*nEYeHzIFC%vfH+>qg;{ZMOFPQrbaT0-9l@+PxsA5e0iYS$IEpMm zt!X$|+rdM3wa{0gUN^}@cNGU~JBeB1Ue_mTO=I%FGy)V^0xgoHf?`z&^Y%$;>%56- z(MmA7FN=rF^#MT;km%F6$oha;9w^jH77yp5KA=bs=b}EKNDt?(KH%Ttfy3c&IR6Fy Y0iaM=WnkMs%K!iX07*qoM6N<$f?_r?c>n+a literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpskirt/white_captain.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpskirt/white_captain.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..60060f5b77819d997295b443c67c72c289f3c004 GIT binary patch literal 1096 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ea676917ee76c4cfadd39358c6eb23b5698691 GIT binary patch literal 987 zcmV<110?*3P)d`2H#57l=9u|F*xT9N zd}qEpJ2SiQT_Mj229W0j1ITlN0pvNs0P>u}VaR1qNu^kQ@art6o z+a-1N(P$Z4{h0=EBOy2#98$Bnl2ib9L9PfNM>+Qp%89Dazg3`#$HG)!s|Rpnhoh0$ zPbzdgNRB}q$K}cvg{Gjee#9aFHDqjjh%Gx&zpkD_DP?tkcK8X%^Vt%GD= z=NU}9&X#HV>fp$e$AYI}Q;ZByr$PByNP+>T7x42ZBd-nS4I=|CrkRm;dC|Dg zH!@%{=*%p0g$w;K29W0j1ITlN0pvNs0P>t*0C`R@fIP>_0EDWseg5`530D;v4c38^ zB=9Eq`r%bkW)qe-HUNnTh{c0;>r5moaD~b;K@Q7*?XJ0S7#+HxP(8=aY(#$ z1Jnpn*{D$|Tf#JGax$iyc57LTx^KFl35iRW0ptTbdUAt)9#&{~?=+qc^{+KD0P}vQ zcQn~+&}E_1Ys7zF#P7lJxzV*&`2i~YES8ZYAjcqz(6h=9P~kx+Pmod`+9f~kMJObo7zX2p*l)G#-ftCOO002ov JPDHLkV1jvS$d~{C literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi/icon.png b/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_command.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..301fc55cffab9cd756b05dc6aef29b453a037f64 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$Dv*Z&L*i!cw#~!c+CYmLJYD@< J);T3K0RY9FKo`!h3&d0bJ1Jj^uE|<*PeW>iq+K# z)i>Ff)OuN^E_~f#gZ&=p;pltV9E;UPLm1>SjJPZ?F zD|!@hR!sXM@W->BfqA7|QwlRfN)^YXyUYwT<(ig!Z&0;m$$!u9F?Y%I2A25$js53K TV)p+6CISXeS3j3^P6&*}>t$QhWdR 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 Hu0mjfI9h9j literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/icon.png b/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e7bd04bf4d31a67e21013ba1f580b5b5a4ee1d76 GIT binary patch literal 503 zcmV6ZH&X2M=oq=CMNu!BP+6p$7=IgE!xy zZrNp?pwoI0e1HxjQK=BLhmIn0Z0J;1Hh)uM@lIG`VCLAg$&bl6M*93ff^1%0oZ*#=lS7h)t< zt?Q-!``f#vxYfF*UO#qn!Kn!EZ||6lXK`Grl;iefJo^OnYXE+#!`8eF5U;-hGBW*J z^EQ5}V+~+c13RZTs#e{OZ8a{GD&-|d08Y-H==N@u_;vu+OVI7Lm9gB+);M6|Ql(6{ z*H*S;Isq&uG+L~Iuio3pc^fV!G3}ouHgZ0S&8+=YhtB1GTyU#ySW85{eT@1IPogN2 zD2hbuK!$@*v<~9Fe!~-&aYe+Z#}@9Y6p8002ovPDHLkV1nG4-^u_0 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/inhand-left.png b/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..f79544b8c311a7d72bd3eee47f2b3dc915144cee GIT binary patch literal 505 zcmVPx$vq?ljRCt{2*}ZDQP#gvDlhV}(sH250?o}v4RYdd+gt&C_2?X~-A)`|lb+F(A z2rWhYoazHqw~T_^cj)a<5~___lfNH<^IJ3to?QOkWH|s45fKp)5fKp)`7x@*^rD^9 zUg!Pht)E-8bJ}m-L0MK)E2Xqj>d)eoQrfbbdo9|@^UCs*x6MV+fI{BX$wVBjRu{m} zB7a|RwYo?q;wa?Je=T}F&*9|mo3~5g0XT;J0p>H?JyuHT$#|-V{ekbi$#}Z56Xr7; ze)Bd7Jb;F|L@H7T0DMe80l@utoa0oaj)u8BN!~7j2M{gyjAG4jkLNQR>1<|YHxz3I zqUE09_4`BT?IQ9ByuH6{UCgfQhtAvPQYr|5`+Tl{o=ct=v6mnKq_Y{^+K+gB(lD<& zNM|!=mFGolD~&2KeNpPTFDd{?CgS+&lyLuS?|mQXyiLS*z|GyY`@LFyFucy6GLMLe zh=_=Yh=_>7O}dQ^70EVQv==xA={7oa18_*S(V-iFbbB1S0Z6yUp&I}o+a8Oy!^bAk v9*1%VI3(I*v6l7Nq}t=q?f|yOL?q!GIfgS+ku^{J00000NkvXXu0mjf%;oIW literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/inhand-right.png b/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..1d2f3f90d23281c6eee946ce169ee5d4d2007f42 GIT binary patch literal 520 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%z4|%#chE&XX zdvkBrp#T}y50fulWnZzlRqtJ>hEu4^7v7c~C7(E1zB?%{4i+!n@PL^^*Y(ewSIi;X zdz$W)zj!;P!ShV}vfMn&{jSBT4}Uzrr^BwG1Op5aTZ}I4+$J5i9Cla zey6e}YBgI5?rOA5aN@|6`0K)Z@Km+V=Jh?|Tk@0Q$SbR= zl-eGgc`f4<5OR|JfH!W&US{q&-nJWEO}9co~+OIdlx6<`I$W5 zTmSIRo_X#M-u^xM{XFa6f49$_tbSR(xU_E0e9uy^dyDlQ88oJOUs&%}Q9EgeseGW$ z^rViT#eOHNOR|Cfs=O$1Q(uVT#Pdx*q)ZF`=cv8nU|9a#b{BKryLE5hzx~$yZ0kIg zRZmr6;S$uC)mykGB)jMEr?;#+t4xmtwn#O&Zarqv6Tlp>*04|M3IkAbF-I*6SWRyG z-WAs**gL-nv0TaSX?D4_4X7p2 Ck?Q9F literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/meta.json b/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/meta.json new file mode 100644 index 00000000000..7e6a96ceedc --- /dev/null +++ b/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/captain_white.rsi/meta.json @@ -0,0 +1,34 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from shiptest (https://github.com/shiptest-ss13/Shiptest) | Edited by PuroSlavKing (Github) | inhand sprites, monkey and reptilian by vetochka_igrit (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "equipped-INNERCLOTHING-reptilian", + "directions": 4 + }, + { + "name": "equipped-INNERCLOTHING-monkey", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/sheriff.rsi/equipped-INNERCLOTHING-reptilian.png b/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/sheriff.rsi/equipped-INNERCLOTHING-reptilian.png new file mode 100644 index 0000000000000000000000000000000000000000..5962213280d7041fbc37ac629c0d9c1e179848a6 GIT binary patch literal 1375 zcmV-l1)%zgP)Px)8A(JzRCt{2nm=e8R~*N`S4vlbQ+f)>7OJgafhb89tZ9O(g%R~g(Y-5N5-}Jg(c%yRNvQ)>#K{57a?}Gx8QU>$VhO~ zcS1z}1FswQHrE(=d}n*hbgiy6t_XKKN0?t&0yT|canrXVqwm=SsBO2Khem;^Hu!e9 zv%O_<2t79}Zu&g3`mPZ`-Ur^*Hg$mfIsQCv3Lb4^xY8EcXdErYhY)4%LsKoS!x95hI-Ts$WS11B}->jw+tUOl$034s` z0D#E})pQI1+I|!I=|$kpKusqY0F>tn$mcRwuD9AJ(Ds`EAfzwc1W23;4qO&KpUa@t zJ`sJL5aX#!C%4)sSM=$6udmxa>xAb_(1~7O$MKmiEEoj5F4-ZAlmqg)48~I`e*g6k zWjv+YhUBQo=Q5a_P)+(2fieg=fIK}2b!uk{h5j%#A%SAqOEF9nVEjI8g3|Zh3F@a8 z%6Lj;)(!|T*Ze3(fKloTjRI~RUKkx>)cOW$I>BgM=8wZ7YW9gwVIZ{Zf{F z_v{-0m#eXq6hTQ7b*+IP1y^RAZgw*MKDRo=Yttg?mk+--*%0U`Kx=ROVkiL03=w(N zP*CA{$R@A#Ln}gkfZftKpB_^!7lDJ0kO87p%SBVolPzT1<^F~5_X#UwfL(t> zP8n$g4BEZXu?`%<$e^$yz@o2k$Ea%!CQ=E3d<^lOQ5X>rBtr9mPj8N~)QvI4vL?^? zd;xs&WTf)|{Pl!cauO6vo&bCO=eh5BfRF={=>(%CYJ$%Z==F8H5nP!ObpUSzuT5BO z2y`O!=JZ0L)t6dj7PZPOj?Z*VPN-6amw{}c!jm000 z-(oAvHD5OQLCOJ?Dnr6yWQXvy+9$~8GNwZFHi;lK3M2=4LR8?8^8svmx%+6PXBN+u~__52y2{T8?O_Oq$k^;-+(lfz92c%$7Su4vmB)@+t)c#~hrW0&sxn}f1 hy}llKGmQB^^B-EWQ)@bEd&mF)002ovPDHLkV1jkCh&BKK literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/sheriff.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/sheriff.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..7b15f1c0bc3d2cc145b7fb7ab14cf59fd8cdbfb8 GIT binary patch literal 1215 zcmV;w1VHPx(c}YY;RCt{2n$K$!TNKB?5%&dsm_BGN(GE0_Hmkga;3F=ckw8~%5f}aeF7&Os z6SVMl4;QTq|9}b)sa+Mqvzs?4idZ*E3n?aAY6CW+h5iNCMLE+mx0#uooB8pm^MPR| zGk4~D=G=20Cnb}#0VY&RmeTjV*k~Eui|C}q`B?=3`Kd_&!1db? zGV99=3ILjoO#r~3e?O1Rsia@C>!_BC&VK$|s(-fMhU?1&pv@JifNN;yPBd>nDWUt!+%t%z=i+p!n(QnCJ%%0UF!Q#-?+_)Ej&puC1=P z975*}il08mRNprO$os%?Z_@*i@8kQqk%LBomwvmoePS`y_jLey@zK&#*K3AEtL37z zO}yA>Wgaa(b)9dDm%blTeP0LE>^jy~SDaAiAy3CSyqzABCIsp0nCOe1)RmH@s^y{+ zZuI)2?V4RTo{*U6b4>O7o(B-zt6tkt;-zD%FY;FI*K=y*{5f>KAK=~NN&NErHGF&d zAAY;L3EIE&;LwgKSTKd&Nl zKz3|Mm9I>pkk6esw$fuox*%1fI>cp(UC0Pzy6RJ9m)0#$*3sgbGUpl z>(ZwPG(qG5^0Xf6^m~w=NQ!}m0AI&VSo-3Jp#A^?;_dmc^+gWw^L88$#H95dvSULk zJ2s^B?YKxvx;)^yjCDo%L3qa31rK?uxk@kkEK$w)Tg)4oTXB-)Z+ZCs+26%t9=v;*VJv% z+Xf-}7PwKe)RV`50XWLWQc(mIP1Ni<{*5p*L^e?5acxSX-no0$xr}P z86vsVK+w%|$fltDp^oSo&?`00%VVnLBCydC86c%vF1mW2Y$4l@*3bLCp2z{bSm9U< zPH)ugI_^m>Xh6-bV|r%J6#+H7?y~IvKL#1#R( zo;T!_NFzW`LF+>yt_aZe`L?tZj3z=lrs5`qU56l=2V7$H0s5Ni1#sbEv@^o550ze% zpszo%8igQZL=G4p8&Z^_CU}j&UZ;zFVSZi;w}ERDx(z|bh=#!a?qOyaP?V7cj_U>N zH;u?|p4*@oN>FAP|aDVqOLn$a;ED^`ea~r7V$p+KtGx{9vH4NfL*VJw5mr(u> zNTMzvEKMT^@GNZ9bwPe`ZPU!K@jT%FQVr6pUO>V?6CwWki<_`CjUB)Zi1Q7=HHS|} d{x&61egFW>5{m_<0tNs8002ovPDHLkV1gu9QX&8V literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/sheriff.rsi/icon.png b/Resources/Textures/_CorvaxNext/Clothing/Uniforms/Jumpsuit/sheriff.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2a5ac2c1064ef8fb880d4adf56bfcc9241823116 GIT binary patch literal 436 zcmV;l0ZaagP)Px$Zb?KzR9J=WlQB!fKorOS5%-SS3}RbaP`gwRI<%98LUCxb=~vJ}I;*od)UTjh z+d&F}I%N@rx+D=2OhmL@VkbYrbGni=1@9v2az6+p@4b8ff9~D^5{X3e&nRgYbvtcZ zj2&O}Q}q&B#Dt66TZx=&JE@Ft7vEi?_eN2ax#F zMy(_yE@XfSMyEV#$hDnRGr)Zfqb9z4|20%CL*+`IR4qfZewFCsjAs2RMdPA9h0d#7 z$c@MwOM7@@${%00001bW%=J06^y0W&i*H*-1n}R5*>5lZy_6FbG9` zw7%J(RrmjYI*M+y3R`xQHcfgwfX1RoDb*C8lvV9~miE@Jl;`(bvb1HzXv55@aymXk|!1$8OVDK R2Fd^c002ovPDHLkV1kd~k%j;O literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Structures/Machines/VendingMachines/captaindrobe.rsi/meta.json b/Resources/Textures/_CorvaxNext/Structures/Machines/VendingMachines/captaindrobe.rsi/meta.json new file mode 100644 index 00000000000..d60acbd560e --- /dev/null +++ b/Resources/Textures/_CorvaxNext/Structures/Machines/VendingMachines/captaindrobe.rsi/meta.json @@ -0,0 +1,31 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Edited by PuroSlavKing (Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "broken" + }, + { + "name": "off" + }, + { + "name": "panel" + }, + { + "name": "normal-unshaded", + "delays": [ + [ + 1.5, + 0.1, + 1.5, + 0.1 + ] + ] + } + ] +} diff --git a/Resources/Textures/_CorvaxNext/Structures/Machines/VendingMachines/captaindrobe.rsi/normal-unshaded.png b/Resources/Textures/_CorvaxNext/Structures/Machines/VendingMachines/captaindrobe.rsi/normal-unshaded.png new file mode 100644 index 0000000000000000000000000000000000000000..91771b82d645926824e997f19467a59cb6d38cdf GIT binary patch literal 581 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|VoC zPZ!6KiaBp*8Rj1{5NSCdx^#g_?63G!M;azbO!%>Ls)Uv+kI&QnC5j7DR@_mv=v*Bl zv7tKb?>^4BfEug$O|te&x4NCO*}%F%kogAFjSj{f#+)Mz+ZfD}7@`?wyI+@Iwf*f; z)x~k=uhtg*tE+jsMdaVDtk7qE=2uRyEEm4=yZv+3-&-H&3KiH~abOPFEX5G;M(ys_ zjkC&U1#gJ9mJE0k-@sE*mAC)3Xo65;)`>epMZ%2l-+tq|X!K$B)|& zoNYKWFE{krh1J3#Gu3A`EUVX3naPmyeCBx}zlK{3SKkO9XWkWMkmS?wwKjm;sfUxn zhwE3=_nYP$RTkWspRV*;pEo;9sYb|vG0!`3$v*KP$5r;riedUl+OR>lp;zL7*a0`5 z1nvZ7HlW8n?=h_Z%g8V#?tFfD@$(-C?{T)-%r9@eCvWgAZr`k{iPcPcJ@30$pJU~z zDr7R)_=}}U==8}6iEI27Gz?W1%q?}6uig7<^}$O5&P;2H4+!3R?zmuPmm;G>HD8AM zLf5G~OXFV5l@Mas!fEiA;b`6^)kRgjfBFTync8ffPSmL=wf!mb}Z{&rz)d~ zl1Bs6gDv7aywB>tcpBna@1QX0K3_L#v^?Sc!KU>69RJJ3F9Lz-g2B_(&t;ucLK6V% CSMnwR literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Structures/Machines/VendingMachines/captaindrobe.rsi/off.png b/Resources/Textures/_CorvaxNext/Structures/Machines/VendingMachines/captaindrobe.rsi/off.png new file mode 100644 index 0000000000000000000000000000000000000000..c50d1ea1aa589d5b95e874f62731c53d4cf75837 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyHUT~%t_Kbr;FnX=)QeM6^S!cM z=Km7~1GC&Or!<5`Mfmvq^gSc2qw}0nE8o3)R~*E-V#}Uj_khHN1UEOgsZ*!U5Sy$S;_|;n|HeAg9sO#WBR9_wD7Ad<_abu7Oj!R+KXQ{~s?pM(y|y;j^b7%jcOKd%Qor|L@q*u>5-MWhRBoVmDSS S&&dWlhQZU-&t;ucLK6Va^Jta; literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CorvaxNext/Structures/Machines/VendingMachines/captaindrobe.rsi/panel.png b/Resources/Textures/_CorvaxNext/Structures/Machines/VendingMachines/captaindrobe.rsi/panel.png new file mode 100644 index 0000000000000000000000000000000000000000..0032751ff4ffedd3d0ecc00eaf4e0ab459929e9f GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJR!TD@E@bvU_NvA($#wnr(!Xc+! zxY-SW0LU@E^H5*bg578Khv|+_lg$sW*?jCvdBeJOdWZj3DYB`nt4B%rOPnz=`)6-p h#&6~hvQUMA!DX(Lkd@zrT|fshc)I$ztaD0e0svz&KxzO0 literal 0 HcmV?d00001 diff --git a/Resources/migration.yml b/Resources/migration.yml index 92764a2d379..f0a1da073f7 100644 --- a/Resources/migration.yml +++ b/Resources/migration.yml @@ -451,3 +451,6 @@ BaseAdvancedPen: Pen # 2024-10-05 - Corvax SheetPrinter: SheetPaper SheetPrinter1: SheetPaper1 + +# 2024-11-14 - Corvax-next +DresserCaptainFilled: CaptainDrobe From 585ef2e621ec0e88e3237d544e4b2debeafa2c8c Mon Sep 17 00:00:00 2001 From: RedTerror <37833085+RedTerrorDark@users.noreply.github.com> Date: Sat, 23 Nov 2024 01:35:38 +0700 Subject: [PATCH 09/10] Zombie buff (#44) * big buff zombie * big buff zombie v0.2 * big buff zombie v0.3 --- .../Zombies/ZombieSystem.Transform.cs | 18 +++++++++++++-- .../Zombies/PendingZombieComponent.cs | 7 +++--- Content.Shared/Zombies/ZombieComponent.cs | 23 ++++++++++--------- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/Content.Server/Zombies/ZombieSystem.Transform.cs b/Content.Server/Zombies/ZombieSystem.Transform.cs index 798d9585dfe..ed5d119bfa7 100644 --- a/Content.Server/Zombies/ZombieSystem.Transform.cs +++ b/Content.Server/Zombies/ZombieSystem.Transform.cs @@ -36,6 +36,7 @@ using Content.Shared.Traits.Assorted; using Robust.Shared.Audio.Systems; using Content.Shared.Ghost.Roles.Components; +using Content.Shared.Damage.Components; namespace Content.Server.Zombies; @@ -106,6 +107,7 @@ public void ZombifyEntity(EntityUid target, MobStateComponent? mobState = null) RemComp(target); RemComp(target); RemComp(target); + RemComp(target); //funny voice var accentType = "zombie"; @@ -170,8 +172,8 @@ public void ZombifyEntity(EntityUid target, MobStateComponent? mobState = null) DamageDict = new() { { "Slash", 13 }, - { "Piercing", 7 }, - { "Structural", 10 } + { "Piercing", 8 }, + { "Structural", 20 } } }; melee.Damage = dspec; @@ -183,6 +185,18 @@ public void ZombifyEntity(EntityUid target, MobStateComponent? mobState = null) pryComp.Force = true; Dirty(target, pryComp); + + // Humanoid zombie now deals stamina damage! ye. + AddComp(target); + var staminDamage = EnsureComp(target); + staminDamage.Damage = 25f; + + Dirty(target, staminDamage); + + var staminaHp = EnsureComp(target); + staminaHp.CritThreshold = 200f; + + Dirty(target, staminaHp); } Dirty(target, melee); diff --git a/Content.Shared/Zombies/PendingZombieComponent.cs b/Content.Shared/Zombies/PendingZombieComponent.cs index 0fb61c84df1..d1eedbe7a07 100644 --- a/Content.Shared/Zombies/PendingZombieComponent.cs +++ b/Content.Shared/Zombies/PendingZombieComponent.cs @@ -17,7 +17,8 @@ public sealed partial class PendingZombieComponent : Component { DamageDict = new () { - { "Poison", 0.2 }, + { "Poison", 0.5 }, + { "Cellular", 0.2 }, } }; @@ -25,7 +26,7 @@ public sealed partial class PendingZombieComponent : Component /// A multiplier for applied when the entity is in critical condition. /// [DataField("critDamageMultiplier")] - public float CritDamageMultiplier = 10f; + public float CritDamageMultiplier = 15f; [DataField("nextTick", customTypeSerializer:typeof(TimeOffsetSerializer))] public TimeSpan NextTick; @@ -40,7 +41,7 @@ public sealed partial class PendingZombieComponent : Component /// The minimum amount of time initial infected have before they start taking infection damage. /// [DataField] - public TimeSpan MinInitialInfectedGrace = TimeSpan.FromMinutes(12.5f); + public TimeSpan MinInitialInfectedGrace = TimeSpan.FromMinutes(6f); /// /// The maximum amount of time initial infected have before they start taking damage. diff --git a/Content.Shared/Zombies/ZombieComponent.cs b/Content.Shared/Zombies/ZombieComponent.cs index 94e1e5afec4..1ebea84c435 100644 --- a/Content.Shared/Zombies/ZombieComponent.cs +++ b/Content.Shared/Zombies/ZombieComponent.cs @@ -20,17 +20,17 @@ public sealed partial class ZombieComponent : Component /// The baseline infection chance you have if you are completely nude /// [ViewVariables(VVAccess.ReadWrite)] - public float MaxZombieInfectionChance = 0.80f; + public float MaxZombieInfectionChance = 0.90f; /// /// The minimum infection chance possible. This is simply to prevent /// being invincible by bundling up. /// [ViewVariables(VVAccess.ReadWrite)] - public float MinZombieInfectionChance = 0.25f; + public float MinZombieInfectionChance = 0.40f; [ViewVariables(VVAccess.ReadWrite)] - public float ZombieMovementSpeedDebuff = 0.70f; + public float ZombieMovementSpeedDebuff = 0.80f; /// /// The skin color of the zombie @@ -99,11 +99,11 @@ public sealed partial class ZombieComponent : Component { DamageDict = new () { - { "Blunt", -0.4 }, - { "Slash", -0.2 }, - { "Piercing", -0.2 }, - { "Heat", -0.02 }, - { "Shock", -0.02 } + { "Blunt", -0.8 }, + { "Slash", -0.4 }, + { "Piercing", -0.4 }, + { "Heat", -0.05 }, + { "Shock", -0.05 } } }; @@ -121,9 +121,10 @@ public sealed partial class ZombieComponent : Component { DamageDict = new() { - { "Blunt", -2 }, - { "Slash", -2 }, - { "Piercing", -2 } + { "Blunt", -5 }, + { "Slash", -5 }, + { "Piercing", -5 }, + { "Heat", -2 } } }; From fdb6e27c652ff3bf3907d0ee1331c7b1f0761269 Mon Sep 17 00:00:00 2001 From: Token <56667933+TokenStyle@users.noreply.github.com> Date: Sat, 23 Nov 2024 02:20:55 +0500 Subject: [PATCH 10/10] =?UTF-8?q?=D0=A5=D0=B8=D1=80=D1=83=D1=80=D0=B3?= =?UTF-8?q?=D0=B8=D1=8F=20(=D0=BF=D0=BE=D0=BF=D1=8B=D1=82=D0=BA=D0=B0=202)?= =?UTF-8?q?=20(#65)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * The ShitMed * Fixes fix locale * Delete redudant systems * fix components * fix error, update system * Update BodyPartComponent.cs * fix max health, fix test legs * fix test * Port fixes from EE (#875) * [Fix] Healing Fixes (#874) * Targeting & Healing Fixes * Update Content.Server/Medical/HealingSystem.cs Co-authored-by: gluesniffler <159397573+gluesniffler@users.noreply.github.com> * Fix Vital Damage * Update BodyPartComponent.cs * fix --------- Co-authored-by: gluesniffler <159397573+gluesniffler@users.noreply.github.com> * [Port] Surgery fixes: Part 2 (#876) * Fix a ton of shitmed Fixed a buncho crap * Guidebook * Russian Locale * fix * hotfix added https://github.com/Rxup/space-station-14/commit/e92f0132c17b4f565030fb58cc52f41652d1d169 --------- Co-authored-by: gluesniffler Co-authored-by: Zack Backmen Co-authored-by: Token * remove backmen ccvar * Body doll in the Health Analyzer menu (#877) * fixes and fix guidebook paths (#887) * fixes * Added some experimental lag fixes to surgery. Might have crashes * russian locale * Revert "Added some experimental lag fixes to surgery. Might have crashes" This reverts commit de95d851a3f2c909a8d1dc1dde3f554fdae7057d. * [Port] Surgery fixes: Part 3 (#892) * Added some experimental lag fixes to surgery. Might have crashes * Fix * migrate and add comments to shit * fix --------- Co-authored-by: gluesniffler * [Tweak] Rework BodyPartComponent to use DamageSpecifier (#890) * Rework BodyPart to use DamageSpecifier * Fix that shit * Update Content.Shared/Backmen/Surgery/Body/SharedBodySystem.Integrity.cs Co-authored-by: gluesniffler <159397573+gluesniffler@users.noreply.github.com> * Uh? * Update HealthAnalyzerWindow.xaml.cs * balanced a buncho crap --------- Co-authored-by: gluesniffler <159397573+gluesniffler@users.noreply.github.com> * [Port] Surgery fixes: Part 4 (#909) * defelinization almost real * fix? * Corvax next fix that surgery doesn't work with fatal error --------- Co-authored-by: gluesniffler Roudenn: https://github.com/Rxup/space-station-14/pull/909 * [Fix] surgery emergency fix * Fixed mechanics of attaching body parts to Body. (now taken from prototypes, not generated at random) --------- Co-authored-by: gluesniffler KayzelW: https://github.com/Rxup/space-station-14/pull/912 * [Balance] Surgery healing tweaks (#911) * Balance surgery * Fix Severing parts --------- Co-authored-by: gluesniffler Roudenn: https://github.com/Rxup/space-station-14/pull/911 * [Port] Surgery Update V: The Phantom Gib (#919) * Megasquached Surgery Updates Megasquached Surgery Updates Quick patch to see if tests shut up Refactored body parts to use damageablecomponent newmed health analyzer real, also refactors and some bugfixes * added solidus's comments, pending removal of namespace thingies for this repo, also fixed some healing thingies * fixes? * fix gib torso * fix prototypes * oops --------- Co-authored-by: gluesniffler Co-authored-by: Zack Backmen Roudenn: https://github.com/Rxup/space-station-14/pull/919 * let me pass tests * let me pass test pls * let me pass test pls * let me pass tests * chief medical officer pass tests * no felinid ears no fun pass tests * [Port] Surgery Fixes: Popup Walker (#923) * Megasquached Surgery Updates Megasquached Surgery Updates Quick patch to see if tests shut up Please do not cherrypick this one yet. Refactored body parts to use damageablecomponent newmed health analyzer real, also refactors and some bugfixes * added solidus's comments, pending removal of namespace thingies for this repo, also fixed some healing thingies * fixes? * fix gib torso * fix prototypes * oops * Shitmed Update 1 (#1240) First in a series of PRs to introduce bugfixes and updates to Shitmed, this will generally feature PRs from Goobstation or Backmen as well since they are actively helping me maintain the code. Usual Shoutouts: Deltanedas: https://github.com/Goob-Station/Goob-Station/pull/882 --- :cl: Mocho, Deltanedas - add: You can now perform surgery as a monke. Rejoice. - add: You can perform surgery on a lot of animals now, I missed a lot of them so just ask if you want any particular critter to get it. - tweak: Entities now perish after 60 seconds of losing their heart and/or brain. - fix: Entities properly take asphyxiation damage after losing their brain. - fix: Torsos being gibbable, which would break surgery or just about anything. - fix: Items not being removed from their respective slots if the parts were gibbed rather than dropped. - fix: Animal organs not being usable properly in surgeries - fix: Cyborg limbs are now usable as pseudo-peg arm/legs. --------- Signed-off-by: gluesniffler <159397573+gluesniffler@users.noreply.github.com> Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> Co-authored-by: goet <6637097+goet@users.noreply.github.com> Co-authored-by: Saphire Lattice Co-authored-by: Roudenn <149893554+Roudenn@users.noreply.github.com> * Shitmed Surgery Popups (#1241) Adds popups for surgery steps in Shitmed that every player within PVS range can see. This allows other players to see if the correct procedure is being performed. This PR also includes locale text for the new procedures and steps in #1240. **Remove Brain / Insert Brain** https://github.com/user-attachments/assets/ac20afa1-df74-48ab-b1d5-2e9a273dfba2
See more **Amputate Right Arm** https://github.com/user-attachments/assets/17f78683-6d3b-44ee-aea3-bb6987844fdc **Attach Right Arm** https://github.com/user-attachments/assets/584d4da2-d8b0-4c82-a323-26636e7fa4b8
:cl: Skubman - add: Surgery step descriptions (like making an incision, removing/attaching limbs and organs) are now shown as popups to everyone in range upon the start of the step. This makes it clear which surgical procedure is being done and to which body part. No more stealthy brain-stealing in front of everyone! * fix the things + locale --------- Signed-off-by: gluesniffler <159397573+gluesniffler@users.noreply.github.com> Co-authored-by: gluesniffler Co-authored-by: Zack Backmen Co-authored-by: gluesniffler <159397573+gluesniffler@users.noreply.github.com> Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> Co-authored-by: goet <6637097+goet@users.noreply.github.com> Co-authored-by: Saphire Lattice Co-authored-by: Skubman * [PORT]Health Analyzer update (#925) Add amazing Health analyzer UI. https://github.com/Rxup/space-station-14/pull/925 * Update HealthAnalyzerSystem.cs * Update medical-scanner-component.ftl * Update HealthAnalyzerWindow.xaml.cs * Update health-analyzer-component.ftl * fix --------- Co-authored-by: trest100 <144359854+trest100@users.noreply.github.com> * let me pass tests * remove shadowkin let tests pass * first commit * Revert "first commit" formatting changes Reverted only formats though, being saved moves everythin to appropriate folders, and nice and clean This reverts commit e66b04b5244516f2abfd50da41fbe133d76bf467. * add corvax next comments for changes for easier upstreams Be aware though, that everything that related to BodySystem, OrganComponent, DamageSystem etc was changed completely - add comments _CorvaxNext - moved .ftl files and cvars to appropriate Corvax Next folders - removed unnecessary felinids and silicon_base * namespaces changes for everythin * Revert "namespaces changes for everythin" This reverts commit 221ee3eecbb3d379aaef4170ceca6bffb15ace36. * [Fix] Surgery Hotfix: Head and Limbs dissapears --------- Signed-off-by: gluesniffler <159397573+gluesniffler@users.noreply.github.com> Co-authored-by: gluesniffler Co-authored-by: Roudenn Co-authored-by: Zack Backmen Co-authored-by: Rouden <149893554+Roudenn@users.noreply.github.com> Co-authored-by: gluesniffler <159397573+gluesniffler@users.noreply.github.com> Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> Co-authored-by: goet <6637097+goet@users.noreply.github.com> Co-authored-by: Saphire Lattice Co-authored-by: Skubman Co-authored-by: Trest <144359854+trest100@users.noreply.github.com> Co-authored-by: AwareFoxy Co-authored-by: AwareFoxy <135021509+AwareFoxy@users.noreply.github.com> --- Content.Client/Body/Systems/BodySystem.cs | 7 - Content.Client/Hands/Systems/HandsSystem.cs | 37 +- .../UI/HealthAnalyzerBoundUserInterface.cs | 31 +- .../UI/HealthAnalyzerWindow.xaml | 222 ++++- .../UI/HealthAnalyzerWindow.xaml.cs | 146 +++- .../Humanoid/HumanoidAppearanceSystem.cs | 8 +- Content.Client/Input/ContentContexts.cs | 6 + .../Inventory/ClientInventorySystem.cs | 15 +- .../Inventory/InventorySlotsComponent.cs | 2 +- .../Options/UI/Tabs/KeyRebindTab.xaml.cs | 10 + Content.Client/Stylesheets/StyleNano.cs | 55 ++ .../Screens/DefaultGameScreen.xaml | 2 + .../Screens/DefaultGameScreen.xaml.cs | 1 + .../Screens/SeparatedChatGameScreen.xaml | 2 + .../Screens/SeparatedChatGameScreen.xaml.cs | 1 + .../Systems/Alerts/Widgets/AlertsUI.xaml | 10 +- .../Inventory/InventoryUIController.cs | 4 +- .../Xenonids/UI/XenoChoiceControl.xaml | 19 + .../Xenonids/UI/XenoChoiceControl.xaml.cs | 28 + Content.Client/_CorvaxNext/Body/BodySystem.cs | 72 ++ .../Body/Components/BrainComponent.cs | 4 + .../Body/Components/LungComponent.cs | 4 + .../Body/Components/StomachComponent.cs | 4 + .../_CorvaxNext/Surgery/SurgeryBui.cs | 360 ++++++++ .../Surgery/SurgeryStepButton.xaml | 4 + .../Surgery/SurgeryStepButton.xaml.cs | 16 + .../_CorvaxNext/Surgery/SurgerySystem.cs | 11 + .../_CorvaxNext/Surgery/SurgeryWindow.xaml | 23 + .../_CorvaxNext/Surgery/SurgeryWindow.xaml.cs | 14 + .../_CorvaxNext/Targeting/TargetingSystem.cs | 101 +++ .../PartStatus/PartStatusUIController.cs | 80 ++ .../PartStatus/Widgets/PartStatusControl.xaml | 57 ++ .../Widgets/PartStatusControl.xaml.cs | 48 ++ .../Targeting/TargetingUIController.cs | 81 ++ .../Targeting/Widgets/TargetingControl.xaml | 218 +++++ .../Widgets/TargetingControl.xaml.cs | 58 ++ .../Atmos/EntitySystems/BarotraumaSystem.cs | 5 +- Content.Server/Body/Systems/BodySystem.cs | 73 +- Content.Server/Body/Systems/BrainSystem.cs | 34 +- .../Body/Systems/RespiratorSystem.cs | 10 +- .../Thresholds/Behaviors/GibBehavior.cs | 5 +- .../Thresholds/Behaviors/GibPartBehavior.cs | 20 + .../EntityEffects/Effects/HealthChange.cs | 8 +- Content.Server/Hands/Systems/HandsSystem.cs | 50 +- .../Components/HealthAnalyzerComponent.cs | 8 + Content.Server/Medical/CryoPodSystem.cs | 1 + Content.Server/Medical/HealingSystem.cs | 30 +- .../Medical/HealthAnalyzerSystem.cs | 79 +- .../DelayedDeath/DelayedDeathComponent.cs | 16 + .../DelayedDeath/DelayedDeathSystem.cs | 32 + .../_CorvaxNext/Surgery/SurgerySystem.cs | 177 ++++ .../_CorvaxNext/Systems/HeartSystem.cs | 40 + .../_CorvaxNext/Targeting/TargetingSystem.cs | 53 ++ Content.Shared/Body/Organ/OrganComponent.cs | 30 +- Content.Shared/Body/Organ/TailComponent.cs | 8 + Content.Shared/Body/Part/BodyPartComponent.cs | 105 ++- Content.Shared/Body/Part/BodyPartEvents.cs | 24 + .../Body/Systems/SharedBodySystem.Body.cs | 124 ++- .../Body/Systems/SharedBodySystem.Organs.cs | 19 + .../Body/Systems/SharedBodySystem.Parts.cs | 281 ++++++- .../Body/Systems/SharedBodySystem.cs | 5 +- Content.Shared/Corvax/CCCVars/CCCVars.cs | 2 +- .../Damage/Systems/DamageOnInteractSystem.cs | 19 +- .../Damage/Systems/DamageableSystem.cs | 51 +- .../Hands/Components/HandsComponent.cs | 1 + .../Events/ProfileLoadFinishedEvent.cs | 8 + .../Humanoid/HumanoidVisualLayersExtension.cs | 12 + .../SharedHumanoidAppearanceSystem.cs | 4 +- Content.Shared/Input/ContentKeyFunctions.cs | 6 + .../Inventory/InventoryComponent.cs | 1 + .../Inventory/InventorySystem.Slots.cs | 46 +- .../Inventory/InventoryTemplatePrototype.cs | 7 + .../HealthAnalyzerScannedUserMessage.cs | 17 +- .../Systems/MobStateSystem.StateMachine.cs | 8 +- .../StatusEffect/StatusEffectsSystem.cs | 2 +- .../Weapons/Melee/MeleeWeaponComponent.cs | 30 +- .../Weapons/Melee/SharedMeleeWeaponSystem.cs | 4 +- Content.Shared/_CorvaxNext/NextVars.cs | 10 + .../Surgery/Body/AmputateAttemptEvent.cs | 7 + .../Body/BodyPartAppearanceComponent.cs | 44 + .../Surgery/Body/DebrainedComponent.cs | 6 + .../Surgery/Body/Organs/EarsComponent.cs | 6 + .../Surgery/Body/Organs/EyesComponent.cs | 6 + .../Surgery/Body/Organs/HeartComponent.cs | 6 + .../Surgery/Body/Organs/LiverComponent.cs | 6 + .../Body/Organs/MarkingContainerComponent.cs | 15 + .../Body/SharedBodySystem.PartAppearance.cs | 194 +++++ .../Body/SharedBodySystem.Targeting.cs | 500 ++++++++++++ .../SurgeryCloseIncisionConditionComponent.cs | 6 + .../SurgeryLarvaConditionComponent.cs | 6 + .../SurgeryMarkingConditionComponent.cs | 27 + ...SurgeryOperatingTableConditionComponent.cs | 6 + .../SurgeryOrganConditionComponent.cs | 18 + .../SurgeryPartConditionComponent.cs | 17 + .../Conditions/SurgeryPartPresentCondition.cs | 6 + .../SurgeryPartRemovedConditionComponent.cs | 20 + .../Surgery/Conditions/SurgeryValidEvent.cs | 9 + .../SurgeryWoundedConditionComponent.cs | 7 + .../Effects/Complete/SurgeryCompletedEvent.cs | 7 + .../Complete/SurgeryRemoveLarvaComponent.cs | 6 + .../SurgeryDamageChangeEffectComponent.cs | 17 + ...rgerySpecialDamageChangeEffectComponent.cs | 14 + .../Step/SurgeryStepCavityEffectComponent.cs | 10 + .../Step/SurgeryStepEmoteEffectComponent.cs | 12 + .../Effects/Step/SurgeryStepSpawnEffect.cs | 13 + .../Step/SurgeryTendWoundsEffectComponent.cs | 20 + .../Surgery/OperatingTableComponent.cs | 6 + .../Surgery/SharedSurgerySystem.Steps.cs | 772 ++++++++++++++++++ .../Surgery/SharedSurgerySystem.cs | 287 +++++++ .../_CorvaxNext/Surgery/StepInvalidReason.cs | 10 + .../Steps/Parts/BleedersClampedComponent.cs | 6 + .../Parts/BodyPartReattachedComponent.cs | 6 + .../Steps/Parts/BodyPartSawedComponent.cs | 6 + .../Steps/Parts/IncisionOpenComponent.cs | 6 + .../Parts/InternalBleedersClampedComponent.cs | 6 + .../Steps/Parts/OrganReattachedComponent.cs | 6 + .../Steps/Parts/PartRemovedComponent.cs | 6 + .../Steps/Parts/RibcageOpenComponent.cs | 6 + .../Steps/Parts/RibcageSawedComponent.cs | 6 + .../Steps/Parts/SkinRetractedComponent.cs | 6 + .../Steps/SurgeryAddMarkingStepComponent.cs | 34 + .../Steps/SurgeryAddOrganStepComponent.cs | 6 + .../Steps/SurgeryAddPartStepComponent.cs | 6 + .../Steps/SurgeryAffixOrganStepComponent.cs | 6 + .../Steps/SurgeryAffixPartStepComponent.cs | 6 + .../Steps/SurgeryCanPerformStepEvent.cs | 14 + .../SurgeryCutLarvaRootsStepComponent.cs | 6 + .../SurgeryRemoveMarkingStepComponent.cs | 29 + .../Steps/SurgeryRemoveOrganStepComponent.cs | 6 + .../Steps/SurgeryRemovePartStepComponent.cs | 6 + .../Steps/SurgeryRepeatableStepComponent.cs | 6 + .../Steps/SurgeryStepCompleteCheckEvent.cs | 4 + .../Surgery/Steps/SurgeryStepComponent.cs | 22 + .../_CorvaxNext/Surgery/SurgeryComponent.cs | 18 + .../Surgery/SurgeryDoAfterEvent.cs | 18 + .../Surgery/SurgerySpeedModifierComponent.cs | 11 + .../Surgery/SurgeryStepDamageChangeEvent.cs | 9 + .../Surgery/SurgeryStepDamageEvent.cs | 9 + .../_CorvaxNext/Surgery/SurgeryStepEvent.cs | 7 + .../Surgery/SurgeryTargetComponent.cs | 10 + .../_CorvaxNext/Surgery/SurgeryUI.cs | 32 + .../Surgery/SurgeryUiRefreshEvent.cs | 14 + .../Surgery/Tools/BoneGelComponent.cs | 11 + .../Surgery/Tools/BoneSawComponent.cs | 10 + .../Surgery/Tools/BoneSetterComponent.cs | 6 + .../Surgery/Tools/CauteryComponent.cs | 10 + .../Surgery/Tools/HemostatComponent.cs | 10 + .../Surgery/Tools/ISurgeryToolComponent.cs | 11 + .../Surgery/Tools/RetractorComponent.cs | 10 + .../Surgery/Tools/ScalpelComponent.cs | 10 + .../Surgery/Tools/SurgeryToolComponent.cs | 16 + .../Surgery/Tools/SurgicalDrillComponent.cs | 10 + .../_CorvaxNext/Targeting/Events.cs | 37 + .../Targeting/SharedTargetingSystem.cs | 27 + .../_CorvaxNext/Targeting/TargetBodyPart.cs | 30 + .../_CorvaxNext/Targeting/TargetIntegrity.cs | 13 + .../Targeting/TargetingComponent.cs | 57 ++ .../Audio/Medical/Surgery/attributions.yml | 49 ++ Resources/Audio/Medical/Surgery/cautery1.ogg | Bin 0 -> 34770 bytes Resources/Audio/Medical/Surgery/cautery2.ogg | Bin 0 -> 16854 bytes Resources/Audio/Medical/Surgery/hemostat1.ogg | Bin 0 -> 15729 bytes Resources/Audio/Medical/Surgery/organ1.ogg | Bin 0 -> 18912 bytes Resources/Audio/Medical/Surgery/organ2.ogg | Bin 0 -> 18946 bytes .../Audio/Medical/Surgery/retractor1.ogg | Bin 0 -> 11537 bytes .../Audio/Medical/Surgery/retractor2.ogg | Bin 0 -> 9915 bytes Resources/Audio/Medical/Surgery/saw.ogg | Bin 0 -> 46750 bytes Resources/Audio/Medical/Surgery/scalpel1.ogg | Bin 0 -> 13736 bytes Resources/Audio/Medical/Surgery/scalpel2.ogg | Bin 0 -> 13098 bytes .../en-US/_corvaxnext/guidebook/guides.ftl | 4 + .../_corvaxnext/surgery/surgery-popup.ftl | 52 ++ .../en-US/_corvaxnext/surgery/surgery-ui.ftl | 12 + .../en-US/escape-menu/ui/options-menu.ftl | 8 + .../ru-RU/_corvaxnext/guidebook/guides.ftl | 4 + .../_corvaxnext/surgery/surgery-items.ftl | 33 + .../surgery/surgery-operations.ftl | 61 ++ .../_corvaxnext/surgery/surgery-popup.ftl | 52 ++ .../ru-RU/_corvaxnext/surgery/surgery-ui.ftl | 20 + .../components/health-analyzer-component.ftl | 2 +- .../components/medical-scanner-component.ftl | 1 + .../furniture/tables/operating_table.ftl | 2 +- .../Prototypes/Body/Organs/Animal/animal.yml | 7 + .../Prototypes/Body/Organs/Animal/slimes.yml | 4 + Resources/Prototypes/Body/Organs/arachnid.yml | 19 +- Resources/Prototypes/Body/Organs/diona.yml | 19 +- Resources/Prototypes/Body/Organs/human.yml | 353 ++++---- Resources/Prototypes/Body/Organs/moth.yml | 1 + Resources/Prototypes/Body/Organs/slime.yml | 4 + Resources/Prototypes/Body/Organs/vox.yml | 1 + Resources/Prototypes/Body/Parts/animal.yml | 12 +- Resources/Prototypes/Body/Parts/base.yml | 60 +- Resources/Prototypes/Body/Parts/silicon.yml | 13 +- Resources/Prototypes/Body/Parts/skeleton.yml | 36 +- Resources/Prototypes/Body/Parts/vox.yml | 2 +- .../Prototypes/Body/Prototypes/a_ghost.yml | 16 +- .../Prototypes/Body/Prototypes/arachnid.yml | 1 + .../Prototypes/Body/Prototypes/diona.yml | 1 + .../Prototypes/Body/Prototypes/dwarf.yml | 1 + .../Body/Prototypes/gingerbread.yml | 1 + .../Prototypes/Body/Prototypes/human.yml | 33 +- Resources/Prototypes/Body/Prototypes/moth.yml | 1 + .../Prototypes/Body/Prototypes/primate.yml | 8 + .../Prototypes/Body/Prototypes/reptilian.yml | 1 + .../Prototypes/Body/Prototypes/skeleton.yml | 1 + .../Prototypes/Body/Prototypes/slime.yml | 1 + Resources/Prototypes/Body/Prototypes/vox.yml | 1 + .../Catalog/Fills/Backpacks/duffelbag.yml | 2 + .../Catalog/Fills/Crates/medical.yml | 6 +- .../Entities/Clothing/Belt/belts.yml | 2 +- .../Prototypes/Entities/Mobs/NPCs/animals.yml | 49 +- .../Prototypes/Entities/Mobs/NPCs/carp.yml | 5 + .../Entities/Mobs/NPCs/regalrat.yml | 13 +- .../Prototypes/Entities/Mobs/NPCs/slimes.yml | 7 + .../Prototypes/Entities/Mobs/Species/base.yml | 5 + .../Entities/Mobs/Species/skeleton.yml | 3 +- .../Entities/Mobs/Species/slime.yml | 2 + .../Objects/Specific/Medical/surgery.yml | 115 ++- .../Furniture/Tables/operating_table.yml | 1 + .../Entities/Structures/Machines/lathe.yml | 1 + .../Prototypes/EntityLists/Tools/surgery.yml | 8 +- Resources/Prototypes/Guidebook/medical.yml | 29 + Resources/Prototypes/Reagents/gases.yml | 16 +- .../Prototypes/Roles/Jobs/Medical/chemist.yml | 8 + .../Jobs/Medical/chief_medical_officer.yml | 7 +- .../Roles/Jobs/Medical/medical_doctor.yml | 8 + .../Roles/Jobs/Medical/medical_intern.yml | 8 + .../Roles/Jobs/Medical/paramedic.yml | 8 + .../_CorvaxNext/Damage/containers.yml | 5 + .../_CorvaxNext/Damage/modifier_sets.yml | 11 + .../_CorvaxNext/Entities/Machines/lathe.yml | 42 + .../Objects/Circuitboards/production.yml | 13 + .../Objects/Specific/Medical/surgery.yml | 76 ++ .../Entities/Surgery/surgeries.yml | 642 +++++++++++++++ .../Entities/Surgery/surgery_steps.yml | 570 +++++++++++++ .../_CorvaxNext/Recipes/Lathes/surgery.yml | 91 +++ .../Guidebook/Medical/OrganManipulation.xml | 50 ++ .../Guidebook/Medical/PartManipulation.xml | 51 ++ .../Corvax/Guidebook/Medical/Surgery.xml | 40 + .../Guidebook/Medical/UtilitySurgeries.xml | 24 + .../Textures/Interface/Ashen/target_doll.png | Bin 0 -> 422 bytes .../Interface/Clockwork/target_doll.png | Bin 0 -> 1219 bytes .../Interface/Default/target_doll.png | Bin 0 -> 422 bytes .../Interface/Minimalist/target_doll.png | Bin 0 -> 422 bytes .../Interface/Plasmafire/target_doll.png | Bin 0 -> 462 bytes .../Textures/Interface/Retro/target_doll.png | Bin 0 -> 383 bytes .../Interface/Slimecore/target_doll.png | Bin 0 -> 422 bytes .../Interface/Targeting/Doll/eyes.png | Bin 0 -> 5227 bytes .../Interface/Targeting/Doll/eyes_hover.png | Bin 0 -> 6856 bytes .../Interface/Targeting/Doll/groin.png | Bin 0 -> 5485 bytes .../Interface/Targeting/Doll/groin_hover.png | Bin 0 -> 6452 bytes .../Interface/Targeting/Doll/head.png | Bin 0 -> 5663 bytes .../Interface/Targeting/Doll/head_hover.png | Bin 0 -> 7153 bytes .../Interface/Targeting/Doll/leftarm.png | Bin 0 -> 5779 bytes .../Targeting/Doll/leftarm_hover.png | Bin 0 -> 6652 bytes .../Interface/Targeting/Doll/leftfoot.png | Bin 0 -> 5462 bytes .../Targeting/Doll/leftfoot_hover.png | Bin 0 -> 5476 bytes .../Interface/Targeting/Doll/lefthand.png | Bin 0 -> 5462 bytes .../Targeting/Doll/lefthand_hover.png | Bin 0 -> 6174 bytes .../Interface/Targeting/Doll/leftleg.png | Bin 0 -> 5488 bytes .../Targeting/Doll/leftleg_hover.png | Bin 0 -> 6185 bytes .../Interface/Targeting/Doll/mouth.png | Bin 0 -> 5219 bytes .../Interface/Targeting/Doll/mouth_hover.png | Bin 0 -> 5208 bytes .../Interface/Targeting/Doll/rightarm.png | Bin 0 -> 5773 bytes .../Targeting/Doll/rightarm_hover.png | Bin 0 -> 6592 bytes .../Interface/Targeting/Doll/rightfoot.png | Bin 0 -> 5454 bytes .../Targeting/Doll/rightfoot_hover.png | Bin 0 -> 5465 bytes .../Interface/Targeting/Doll/righthand.png | Bin 0 -> 5467 bytes .../Targeting/Doll/righthand_hover.png | Bin 0 -> 6207 bytes .../Interface/Targeting/Doll/rightleg.png | Bin 0 -> 5473 bytes .../Targeting/Doll/rightleg_hover.png | Bin 0 -> 5908 bytes .../Interface/Targeting/Doll/torso.png | Bin 0 -> 5284 bytes .../Interface/Targeting/Doll/torso_hover.png | Bin 0 -> 5672 bytes .../Targeting/Status/groin.rsi/groin_0.png | Bin 0 -> 157 bytes .../Targeting/Status/groin.rsi/groin_1.png | Bin 0 -> 157 bytes .../Targeting/Status/groin.rsi/groin_2.png | Bin 0 -> 157 bytes .../Targeting/Status/groin.rsi/groin_3.png | Bin 0 -> 157 bytes .../Targeting/Status/groin.rsi/groin_4.png | Bin 0 -> 157 bytes .../Targeting/Status/groin.rsi/groin_5.png | Bin 0 -> 157 bytes .../Targeting/Status/groin.rsi/groin_6.png | Bin 0 -> 157 bytes .../Targeting/Status/groin.rsi/groin_7.png | Bin 0 -> 157 bytes .../Targeting/Status/groin.rsi/groin_8.png | Bin 0 -> 178 bytes .../Targeting/Status/groin.rsi/meta.json | 38 + .../Targeting/Status/head.rsi/head_0.png | Bin 0 -> 140 bytes .../Targeting/Status/head.rsi/head_1.png | Bin 0 -> 140 bytes .../Targeting/Status/head.rsi/head_2.png | Bin 0 -> 140 bytes .../Targeting/Status/head.rsi/head_3.png | Bin 0 -> 140 bytes .../Targeting/Status/head.rsi/head_4.png | Bin 0 -> 140 bytes .../Targeting/Status/head.rsi/head_5.png | Bin 0 -> 140 bytes .../Targeting/Status/head.rsi/head_6.png | Bin 0 -> 140 bytes .../Targeting/Status/head.rsi/head_7.png | Bin 0 -> 140 bytes .../Targeting/Status/head.rsi/head_8.png | Bin 0 -> 155 bytes .../Targeting/Status/head.rsi/meta.json | 38 + .../Status/leftarm.rsi/leftarm_0.png | Bin 0 -> 144 bytes .../Status/leftarm.rsi/leftarm_1.png | Bin 0 -> 144 bytes .../Status/leftarm.rsi/leftarm_2.png | Bin 0 -> 144 bytes .../Status/leftarm.rsi/leftarm_3.png | Bin 0 -> 144 bytes .../Status/leftarm.rsi/leftarm_4.png | Bin 0 -> 144 bytes .../Status/leftarm.rsi/leftarm_5.png | Bin 0 -> 144 bytes .../Status/leftarm.rsi/leftarm_6.png | Bin 0 -> 144 bytes .../Status/leftarm.rsi/leftarm_7.png | Bin 0 -> 144 bytes .../Status/leftarm.rsi/leftarm_8.png | Bin 0 -> 154 bytes .../Targeting/Status/leftarm.rsi/meta.json | 38 + .../Status/leftfoot.rsi/leftfoot_0.png | Bin 0 -> 145 bytes .../Status/leftfoot.rsi/leftfoot_1.png | Bin 0 -> 145 bytes .../Status/leftfoot.rsi/leftfoot_2.png | Bin 0 -> 145 bytes .../Status/leftfoot.rsi/leftfoot_3.png | Bin 0 -> 145 bytes .../Status/leftfoot.rsi/leftfoot_4.png | Bin 0 -> 145 bytes .../Status/leftfoot.rsi/leftfoot_5.png | Bin 0 -> 145 bytes .../Status/leftfoot.rsi/leftfoot_6.png | Bin 0 -> 145 bytes .../Status/leftfoot.rsi/leftfoot_7.png | Bin 0 -> 145 bytes .../Status/leftfoot.rsi/leftfoot_8.png | Bin 0 -> 166 bytes .../Targeting/Status/leftfoot.rsi/meta.json | 38 + .../Status/lefthand.rsi/lefthand_0.png | Bin 0 -> 136 bytes .../Status/lefthand.rsi/lefthand_1.png | Bin 0 -> 136 bytes .../Status/lefthand.rsi/lefthand_2.png | Bin 0 -> 136 bytes .../Status/lefthand.rsi/lefthand_3.png | Bin 0 -> 136 bytes .../Status/lefthand.rsi/lefthand_4.png | Bin 0 -> 136 bytes .../Status/lefthand.rsi/lefthand_5.png | Bin 0 -> 136 bytes .../Status/lefthand.rsi/lefthand_6.png | Bin 0 -> 136 bytes .../Status/lefthand.rsi/lefthand_7.png | Bin 0 -> 136 bytes .../Status/lefthand.rsi/lefthand_8.png | Bin 0 -> 152 bytes .../Targeting/Status/lefthand.rsi/meta.json | 38 + .../Status/leftleg.rsi/leftleg_0.png | Bin 0 -> 141 bytes .../Status/leftleg.rsi/leftleg_1.png | Bin 0 -> 141 bytes .../Status/leftleg.rsi/leftleg_2.png | Bin 0 -> 141 bytes .../Status/leftleg.rsi/leftleg_3.png | Bin 0 -> 141 bytes .../Status/leftleg.rsi/leftleg_4.png | Bin 0 -> 141 bytes .../Status/leftleg.rsi/leftleg_5.png | Bin 0 -> 141 bytes .../Status/leftleg.rsi/leftleg_6.png | Bin 0 -> 141 bytes .../Status/leftleg.rsi/leftleg_7.png | Bin 0 -> 141 bytes .../Status/leftleg.rsi/leftleg_8.png | Bin 0 -> 170 bytes .../Targeting/Status/leftleg.rsi/meta.json | 38 + .../Targeting/Status/rightarm.rsi/meta.json | 38 + .../Status/rightarm.rsi/rightarm_0.png | Bin 0 -> 147 bytes .../Status/rightarm.rsi/rightarm_1.png | Bin 0 -> 147 bytes .../Status/rightarm.rsi/rightarm_2.png | Bin 0 -> 147 bytes .../Status/rightarm.rsi/rightarm_3.png | Bin 0 -> 147 bytes .../Status/rightarm.rsi/rightarm_4.png | Bin 0 -> 147 bytes .../Status/rightarm.rsi/rightarm_5.png | Bin 0 -> 147 bytes .../Status/rightarm.rsi/rightarm_6.png | Bin 0 -> 147 bytes .../Status/rightarm.rsi/rightarm_7.png | Bin 0 -> 147 bytes .../Status/rightarm.rsi/rightarm_8.png | Bin 0 -> 158 bytes .../Targeting/Status/rightfoot.rsi/meta.json | 38 + .../Status/rightfoot.rsi/rightfoot_0.png | Bin 0 -> 176 bytes .../Status/rightfoot.rsi/rightfoot_1.png | Bin 0 -> 144 bytes .../Status/rightfoot.rsi/rightfoot_2.png | Bin 0 -> 144 bytes .../Status/rightfoot.rsi/rightfoot_3.png | Bin 0 -> 144 bytes .../Status/rightfoot.rsi/rightfoot_4.png | Bin 0 -> 144 bytes .../Status/rightfoot.rsi/rightfoot_5.png | Bin 0 -> 144 bytes .../Status/rightfoot.rsi/rightfoot_6.png | Bin 0 -> 144 bytes .../Status/rightfoot.rsi/rightfoot_7.png | Bin 0 -> 144 bytes .../Status/rightfoot.rsi/rightfoot_8.png | Bin 0 -> 161 bytes .../Targeting/Status/righthand.rsi/meta.json | 38 + .../Status/righthand.rsi/righthand_0.png | Bin 0 -> 138 bytes .../Status/righthand.rsi/righthand_1.png | Bin 0 -> 138 bytes .../Status/righthand.rsi/righthand_2.png | Bin 0 -> 138 bytes .../Status/righthand.rsi/righthand_3.png | Bin 0 -> 138 bytes .../Status/righthand.rsi/righthand_4.png | Bin 0 -> 138 bytes .../Status/righthand.rsi/righthand_5.png | Bin 0 -> 138 bytes .../Status/righthand.rsi/righthand_6.png | Bin 0 -> 138 bytes .../Status/righthand.rsi/righthand_7.png | Bin 0 -> 138 bytes .../Status/righthand.rsi/righthand_8.png | Bin 0 -> 152 bytes .../Targeting/Status/rightleg.rsi/meta.json | 38 + .../Status/rightleg.rsi/rightleg_0.png | Bin 0 -> 178 bytes .../Status/rightleg.rsi/rightleg_1.png | Bin 0 -> 141 bytes .../Status/rightleg.rsi/rightleg_2.png | Bin 0 -> 141 bytes .../Status/rightleg.rsi/rightleg_3.png | Bin 0 -> 141 bytes .../Status/rightleg.rsi/rightleg_4.png | Bin 0 -> 141 bytes .../Status/rightleg.rsi/rightleg_5.png | Bin 0 -> 141 bytes .../Status/rightleg.rsi/rightleg_6.png | Bin 0 -> 141 bytes .../Status/rightleg.rsi/rightleg_7.png | Bin 0 -> 141 bytes .../Status/rightleg.rsi/rightleg_8.png | Bin 0 -> 166 bytes .../Targeting/Status/torso.rsi/meta.json | 38 + .../Targeting/Status/torso.rsi/torso_0.png | Bin 0 -> 160 bytes .../Targeting/Status/torso.rsi/torso_1.png | Bin 0 -> 160 bytes .../Targeting/Status/torso.rsi/torso_2.png | Bin 0 -> 160 bytes .../Targeting/Status/torso.rsi/torso_3.png | Bin 0 -> 160 bytes .../Targeting/Status/torso.rsi/torso_4.png | Bin 0 -> 160 bytes .../Targeting/Status/torso.rsi/torso_5.png | Bin 0 -> 160 bytes .../Targeting/Status/torso.rsi/torso_6.png | Bin 0 -> 160 bytes .../Targeting/Status/torso.rsi/torso_7.png | Bin 0 -> 160 bytes .../Targeting/Status/torso.rsi/torso_8.png | Bin 0 -> 186 bytes .../Medical/Surgery/bone_gel.rsi/bone-gel.png | Bin 0 -> 432 bytes .../Surgery/bone_gel.rsi/bone-gel_0.png | Bin 0 -> 391 bytes .../Surgery/bone_gel.rsi/bone-gel_25.png | Bin 0 -> 444 bytes .../Surgery/bone_gel.rsi/bone-gel_50.png | Bin 0 -> 456 bytes .../Surgery/bone_gel.rsi/bone-gel_75.png | Bin 0 -> 444 bytes .../Medical/Surgery/bone_gel.rsi/meta.json | 29 + .../bone_gel.rsi/predator_bone-gel.png | Bin 0 -> 585 bytes .../Surgery/bonesetter.rsi/bonesetter.png | Bin 0 -> 581 bytes .../Medical/Surgery/bonesetter.rsi/meta.json | 17 + .../bonesetter.rsi/predator_bonesetter.png | Bin 0 -> 489 bytes .../Surgery/manipulation.rsi/insertion.png | Bin 0 -> 379 bytes .../Surgery/manipulation.rsi/meta.json | 14 + .../limbgrower.rsi/limbgrower_fill.png | Bin 0 -> 9056 bytes .../limbgrower.rsi/limbgrower_idleoff.png | Bin 0 -> 3320 bytes .../limbgrower.rsi/limbgrower_idleon.png | Bin 0 -> 11102 bytes .../limbgrower.rsi/limbgrower_openpanel.png | Bin 0 -> 3981 bytes .../limbgrower.rsi/limbgrower_panelopen.png | Bin 0 -> 2273 bytes .../limbgrower.rsi/limbgrower_unfill.png | Bin 0 -> 9104 bytes .../Machines/limbgrower.rsi/meta.json | 85 ++ Resources/keybinds.yml | 25 + 401 files changed, 8913 insertions(+), 409 deletions(-) delete mode 100644 Content.Client/Body/Systems/BodySystem.cs create mode 100644 Content.Client/Xenonids/UI/XenoChoiceControl.xaml create mode 100644 Content.Client/Xenonids/UI/XenoChoiceControl.xaml.cs create mode 100644 Content.Client/_CorvaxNext/Body/BodySystem.cs create mode 100644 Content.Client/_CorvaxNext/Body/Components/BrainComponent.cs create mode 100644 Content.Client/_CorvaxNext/Body/Components/LungComponent.cs create mode 100644 Content.Client/_CorvaxNext/Body/Components/StomachComponent.cs create mode 100644 Content.Client/_CorvaxNext/Surgery/SurgeryBui.cs create mode 100644 Content.Client/_CorvaxNext/Surgery/SurgeryStepButton.xaml create mode 100644 Content.Client/_CorvaxNext/Surgery/SurgeryStepButton.xaml.cs create mode 100644 Content.Client/_CorvaxNext/Surgery/SurgerySystem.cs create mode 100644 Content.Client/_CorvaxNext/Surgery/SurgeryWindow.xaml create mode 100644 Content.Client/_CorvaxNext/Surgery/SurgeryWindow.xaml.cs create mode 100644 Content.Client/_CorvaxNext/Targeting/TargetingSystem.cs create mode 100644 Content.Client/_CorvaxNext/UserInterface/Systems/PartStatus/PartStatusUIController.cs create mode 100644 Content.Client/_CorvaxNext/UserInterface/Systems/PartStatus/Widgets/PartStatusControl.xaml create mode 100644 Content.Client/_CorvaxNext/UserInterface/Systems/PartStatus/Widgets/PartStatusControl.xaml.cs create mode 100644 Content.Client/_CorvaxNext/UserInterface/Systems/Targeting/TargetingUIController.cs create mode 100644 Content.Client/_CorvaxNext/UserInterface/Systems/Targeting/Widgets/TargetingControl.xaml create mode 100644 Content.Client/_CorvaxNext/UserInterface/Systems/Targeting/Widgets/TargetingControl.xaml.cs create mode 100644 Content.Server/Destructible/Thresholds/Behaviors/GibPartBehavior.cs create mode 100644 Content.Server/_CorvaxNext/DelayedDeath/DelayedDeathComponent.cs create mode 100644 Content.Server/_CorvaxNext/DelayedDeath/DelayedDeathSystem.cs create mode 100644 Content.Server/_CorvaxNext/Surgery/SurgerySystem.cs create mode 100644 Content.Server/_CorvaxNext/Systems/HeartSystem.cs create mode 100644 Content.Server/_CorvaxNext/Targeting/TargetingSystem.cs create mode 100644 Content.Shared/Body/Organ/TailComponent.cs create mode 100644 Content.Shared/Humanoid/Events/ProfileLoadFinishedEvent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Body/AmputateAttemptEvent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Body/BodyPartAppearanceComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Body/DebrainedComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Body/Organs/EarsComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Body/Organs/EyesComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Body/Organs/HeartComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Body/Organs/LiverComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Body/Organs/MarkingContainerComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Body/SharedBodySystem.PartAppearance.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Body/SharedBodySystem.Targeting.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryCloseIncisionConditionComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryLarvaConditionComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryMarkingConditionComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryOperatingTableConditionComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryOrganConditionComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryPartConditionComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryPartPresentCondition.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryValidEvent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryWoundedConditionComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Effects/Complete/SurgeryCompletedEvent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Effects/Complete/SurgeryRemoveLarvaComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryDamageChangeEffectComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgerySpecialDamageChangeEffectComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryStepCavityEffectComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryStepEmoteEffectComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryStepSpawnEffect.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryTendWoundsEffectComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/OperatingTableComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/SharedSurgerySystem.Steps.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/SharedSurgerySystem.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/StepInvalidReason.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/Parts/BleedersClampedComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/Parts/BodyPartReattachedComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/Parts/BodyPartSawedComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/Parts/IncisionOpenComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/Parts/InternalBleedersClampedComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/Parts/OrganReattachedComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/Parts/PartRemovedComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/Parts/RibcageOpenComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/Parts/RibcageSawedComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/Parts/SkinRetractedComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAddMarkingStepComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAddOrganStepComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAddPartStepComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAffixOrganStepComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAffixPartStepComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryCanPerformStepEvent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryCutLarvaRootsStepComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryRemoveMarkingStepComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryRemoveOrganStepComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryRemovePartStepComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryRepeatableStepComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryStepCompleteCheckEvent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryStepComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/SurgeryComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/SurgeryDoAfterEvent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/SurgerySpeedModifierComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/SurgeryStepDamageChangeEvent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/SurgeryStepDamageEvent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/SurgeryStepEvent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/SurgeryTargetComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/SurgeryUI.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/SurgeryUiRefreshEvent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Tools/BoneGelComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Tools/BoneSawComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Tools/BoneSetterComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Tools/CauteryComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Tools/HemostatComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Tools/ISurgeryToolComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Tools/RetractorComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Tools/ScalpelComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Tools/SurgeryToolComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Surgery/Tools/SurgicalDrillComponent.cs create mode 100644 Content.Shared/_CorvaxNext/Targeting/Events.cs create mode 100644 Content.Shared/_CorvaxNext/Targeting/SharedTargetingSystem.cs create mode 100644 Content.Shared/_CorvaxNext/Targeting/TargetBodyPart.cs create mode 100644 Content.Shared/_CorvaxNext/Targeting/TargetIntegrity.cs create mode 100644 Content.Shared/_CorvaxNext/Targeting/TargetingComponent.cs create mode 100644 Resources/Audio/Medical/Surgery/attributions.yml create mode 100644 Resources/Audio/Medical/Surgery/cautery1.ogg create mode 100644 Resources/Audio/Medical/Surgery/cautery2.ogg create mode 100644 Resources/Audio/Medical/Surgery/hemostat1.ogg create mode 100644 Resources/Audio/Medical/Surgery/organ1.ogg create mode 100644 Resources/Audio/Medical/Surgery/organ2.ogg create mode 100644 Resources/Audio/Medical/Surgery/retractor1.ogg create mode 100644 Resources/Audio/Medical/Surgery/retractor2.ogg create mode 100644 Resources/Audio/Medical/Surgery/saw.ogg create mode 100644 Resources/Audio/Medical/Surgery/scalpel1.ogg create mode 100644 Resources/Audio/Medical/Surgery/scalpel2.ogg create mode 100644 Resources/Locale/en-US/_corvaxnext/guidebook/guides.ftl create mode 100644 Resources/Locale/en-US/_corvaxnext/surgery/surgery-popup.ftl create mode 100644 Resources/Locale/en-US/_corvaxnext/surgery/surgery-ui.ftl create mode 100644 Resources/Locale/ru-RU/_corvaxnext/guidebook/guides.ftl create mode 100644 Resources/Locale/ru-RU/_corvaxnext/surgery/surgery-items.ftl create mode 100644 Resources/Locale/ru-RU/_corvaxnext/surgery/surgery-operations.ftl create mode 100644 Resources/Locale/ru-RU/_corvaxnext/surgery/surgery-popup.ftl create mode 100644 Resources/Locale/ru-RU/_corvaxnext/surgery/surgery-ui.ftl create mode 100644 Resources/Prototypes/_CorvaxNext/Damage/containers.yml create mode 100644 Resources/Prototypes/_CorvaxNext/Damage/modifier_sets.yml create mode 100644 Resources/Prototypes/_CorvaxNext/Entities/Machines/lathe.yml create mode 100644 Resources/Prototypes/_CorvaxNext/Entities/Objects/Circuitboards/production.yml create mode 100644 Resources/Prototypes/_CorvaxNext/Entities/Objects/Specific/Medical/surgery.yml create mode 100644 Resources/Prototypes/_CorvaxNext/Entities/Surgery/surgeries.yml create mode 100644 Resources/Prototypes/_CorvaxNext/Entities/Surgery/surgery_steps.yml create mode 100644 Resources/Prototypes/_CorvaxNext/Recipes/Lathes/surgery.yml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/Medical/OrganManipulation.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/Medical/PartManipulation.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/Medical/Surgery.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/Medical/UtilitySurgeries.xml create mode 100644 Resources/Textures/Interface/Ashen/target_doll.png create mode 100644 Resources/Textures/Interface/Clockwork/target_doll.png create mode 100644 Resources/Textures/Interface/Default/target_doll.png create mode 100644 Resources/Textures/Interface/Minimalist/target_doll.png create mode 100644 Resources/Textures/Interface/Plasmafire/target_doll.png create mode 100644 Resources/Textures/Interface/Retro/target_doll.png create mode 100644 Resources/Textures/Interface/Slimecore/target_doll.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/eyes.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/eyes_hover.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/groin.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/groin_hover.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/head.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/head_hover.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/leftarm.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/leftarm_hover.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/leftfoot.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/leftfoot_hover.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/lefthand.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/lefthand_hover.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/leftleg.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/leftleg_hover.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/mouth.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/mouth_hover.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/rightarm.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/rightarm_hover.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/rightfoot.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/rightfoot_hover.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/righthand.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/righthand_hover.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/rightleg.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/rightleg_hover.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/torso.png create mode 100644 Resources/Textures/Interface/Targeting/Doll/torso_hover.png create mode 100644 Resources/Textures/Interface/Targeting/Status/groin.rsi/groin_0.png create mode 100644 Resources/Textures/Interface/Targeting/Status/groin.rsi/groin_1.png create mode 100644 Resources/Textures/Interface/Targeting/Status/groin.rsi/groin_2.png create mode 100644 Resources/Textures/Interface/Targeting/Status/groin.rsi/groin_3.png create mode 100644 Resources/Textures/Interface/Targeting/Status/groin.rsi/groin_4.png create mode 100644 Resources/Textures/Interface/Targeting/Status/groin.rsi/groin_5.png create mode 100644 Resources/Textures/Interface/Targeting/Status/groin.rsi/groin_6.png create mode 100644 Resources/Textures/Interface/Targeting/Status/groin.rsi/groin_7.png create mode 100644 Resources/Textures/Interface/Targeting/Status/groin.rsi/groin_8.png create mode 100644 Resources/Textures/Interface/Targeting/Status/groin.rsi/meta.json create mode 100644 Resources/Textures/Interface/Targeting/Status/head.rsi/head_0.png create mode 100644 Resources/Textures/Interface/Targeting/Status/head.rsi/head_1.png create mode 100644 Resources/Textures/Interface/Targeting/Status/head.rsi/head_2.png create mode 100644 Resources/Textures/Interface/Targeting/Status/head.rsi/head_3.png create mode 100644 Resources/Textures/Interface/Targeting/Status/head.rsi/head_4.png create mode 100644 Resources/Textures/Interface/Targeting/Status/head.rsi/head_5.png create mode 100644 Resources/Textures/Interface/Targeting/Status/head.rsi/head_6.png create mode 100644 Resources/Textures/Interface/Targeting/Status/head.rsi/head_7.png create mode 100644 Resources/Textures/Interface/Targeting/Status/head.rsi/head_8.png create mode 100644 Resources/Textures/Interface/Targeting/Status/head.rsi/meta.json create mode 100644 Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_0.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_1.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_2.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_3.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_4.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_5.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_6.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_7.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_8.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftarm.rsi/meta.json create mode 100644 Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_0.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_1.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_2.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_3.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_4.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_5.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_6.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_7.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_8.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/meta.json create mode 100644 Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_0.png create mode 100644 Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_1.png create mode 100644 Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_2.png create mode 100644 Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_3.png create mode 100644 Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_4.png create mode 100644 Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_5.png create mode 100644 Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_6.png create mode 100644 Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_7.png create mode 100644 Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_8.png create mode 100644 Resources/Textures/Interface/Targeting/Status/lefthand.rsi/meta.json create mode 100644 Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_0.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_1.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_2.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_3.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_4.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_5.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_6.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_7.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_8.png create mode 100644 Resources/Textures/Interface/Targeting/Status/leftleg.rsi/meta.json create mode 100644 Resources/Textures/Interface/Targeting/Status/rightarm.rsi/meta.json create mode 100644 Resources/Textures/Interface/Targeting/Status/rightarm.rsi/rightarm_0.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightarm.rsi/rightarm_1.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightarm.rsi/rightarm_2.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightarm.rsi/rightarm_3.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightarm.rsi/rightarm_4.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightarm.rsi/rightarm_5.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightarm.rsi/rightarm_6.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightarm.rsi/rightarm_7.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightarm.rsi/rightarm_8.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightfoot.rsi/meta.json create mode 100644 Resources/Textures/Interface/Targeting/Status/rightfoot.rsi/rightfoot_0.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightfoot.rsi/rightfoot_1.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightfoot.rsi/rightfoot_2.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightfoot.rsi/rightfoot_3.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightfoot.rsi/rightfoot_4.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightfoot.rsi/rightfoot_5.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightfoot.rsi/rightfoot_6.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightfoot.rsi/rightfoot_7.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightfoot.rsi/rightfoot_8.png create mode 100644 Resources/Textures/Interface/Targeting/Status/righthand.rsi/meta.json create mode 100644 Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_0.png create mode 100644 Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_1.png create mode 100644 Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_2.png create mode 100644 Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_3.png create mode 100644 Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_4.png create mode 100644 Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_5.png create mode 100644 Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_6.png create mode 100644 Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_7.png create mode 100644 Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_8.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightleg.rsi/meta.json create mode 100644 Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_0.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_1.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_2.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_3.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_4.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_5.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_6.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_7.png create mode 100644 Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_8.png create mode 100644 Resources/Textures/Interface/Targeting/Status/torso.rsi/meta.json create mode 100644 Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_0.png create mode 100644 Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_1.png create mode 100644 Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_2.png create mode 100644 Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_3.png create mode 100644 Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_4.png create mode 100644 Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_5.png create mode 100644 Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_6.png create mode 100644 Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_7.png create mode 100644 Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_8.png create mode 100644 Resources/Textures/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel.png create mode 100644 Resources/Textures/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel_0.png create mode 100644 Resources/Textures/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel_25.png create mode 100644 Resources/Textures/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel_50.png create mode 100644 Resources/Textures/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel_75.png create mode 100644 Resources/Textures/Objects/Specific/Medical/Surgery/bone_gel.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Medical/Surgery/bone_gel.rsi/predator_bone-gel.png create mode 100644 Resources/Textures/Objects/Specific/Medical/Surgery/bonesetter.rsi/bonesetter.png create mode 100644 Resources/Textures/Objects/Specific/Medical/Surgery/bonesetter.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Medical/Surgery/bonesetter.rsi/predator_bonesetter.png create mode 100644 Resources/Textures/Objects/Specific/Medical/Surgery/manipulation.rsi/insertion.png create mode 100644 Resources/Textures/Objects/Specific/Medical/Surgery/manipulation.rsi/meta.json create mode 100644 Resources/Textures/Structures/Machines/limbgrower.rsi/limbgrower_fill.png create mode 100644 Resources/Textures/Structures/Machines/limbgrower.rsi/limbgrower_idleoff.png create mode 100644 Resources/Textures/Structures/Machines/limbgrower.rsi/limbgrower_idleon.png create mode 100644 Resources/Textures/Structures/Machines/limbgrower.rsi/limbgrower_openpanel.png create mode 100644 Resources/Textures/Structures/Machines/limbgrower.rsi/limbgrower_panelopen.png create mode 100644 Resources/Textures/Structures/Machines/limbgrower.rsi/limbgrower_unfill.png create mode 100644 Resources/Textures/Structures/Machines/limbgrower.rsi/meta.json diff --git a/Content.Client/Body/Systems/BodySystem.cs b/Content.Client/Body/Systems/BodySystem.cs deleted file mode 100644 index bab785525b0..00000000000 --- a/Content.Client/Body/Systems/BodySystem.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Content.Shared.Body.Systems; - -namespace Content.Client.Body.Systems; - -public sealed class BodySystem : SharedBodySystem -{ -} diff --git a/Content.Client/Hands/Systems/HandsSystem.cs b/Content.Client/Hands/Systems/HandsSystem.cs index 68800a2afe5..18e4540e153 100644 --- a/Content.Client/Hands/Systems/HandsSystem.cs +++ b/Content.Client/Hands/Systems/HandsSystem.cs @@ -4,6 +4,7 @@ using Content.Client.Examine; using Content.Client.Strip; using Content.Client.Verbs.UI; +using Content.Shared.Body.Part; using Content.Shared.Hands; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; @@ -40,7 +41,6 @@ public sealed class HandsSystem : SharedHandsSystem public event Action? OnPlayerItemRemoved; public event Action? OnPlayerHandBlocked; public event Action? OnPlayerHandUnblocked; - public override void Initialize() { base.Initialize(); @@ -51,6 +51,8 @@ public override void Initialize() SubscribeLocalEvent(OnHandsShutdown); SubscribeLocalEvent(HandleComponentState); SubscribeLocalEvent(OnVisualsChanged); + SubscribeLocalEvent(HandleBodyPartRemoved); // _CorvaxNext: surgery + SubscribeLocalEvent(HandleBodyPartDisabled); // _CorvaxNext: surgery OnHandSetActive += OnHandActivated; } @@ -238,8 +240,40 @@ public void UIHandAltActivateItem(string handName) RaisePredictiveEvent(new RequestHandAltInteractEvent(handName)); } + #region pulling + + #endregion + #region visuals + // start-_CorvaxNext: surgery + private void HideLayers(EntityUid uid, HandsComponent component, Entity part, SpriteComponent? sprite = null) + { + if (part.Comp.PartType != BodyPartType.Hand || !Resolve(uid, ref sprite, logMissing: false)) + return; + + var location = part.Comp.Symmetry switch + { + BodyPartSymmetry.None => HandLocation.Middle, + BodyPartSymmetry.Left => HandLocation.Left, + BodyPartSymmetry.Right => HandLocation.Right, + _ => throw new ArgumentOutOfRangeException(nameof(part.Comp.Symmetry)) + }; + + if (component.RevealedLayers.TryGetValue(location, out var revealedLayers)) + { + foreach (var key in revealedLayers) + sprite.RemoveLayer(key); + + revealedLayers.Clear(); + } + } + + private void HandleBodyPartRemoved(EntityUid uid, HandsComponent component, ref BodyPartRemovedEvent args) => HideLayers(uid, component, args.Part); + + private void HandleBodyPartDisabled(EntityUid uid, HandsComponent component, ref BodyPartDisabledEvent args) => HideLayers(uid, component, args.Part); + // end-_CorvaxNext: surgery + protected override void HandleEntityInserted(EntityUid uid, HandsComponent hands, EntInsertedIntoContainerMessage args) { base.HandleEntityInserted(uid, hands, args); @@ -264,6 +298,7 @@ protected override void HandleEntityRemoved(EntityUid uid, HandsComponent hands, if (!hands.Hands.TryGetValue(args.Container.ID, out var hand)) return; + UpdateHandVisuals(uid, args.Entity, hand); _stripSys.UpdateUi(uid); diff --git a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerBoundUserInterface.cs b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerBoundUserInterface.cs index baea03c8923..e2c75c4b391 100644 --- a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerBoundUserInterface.cs +++ b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerBoundUserInterface.cs @@ -1,6 +1,7 @@ using Content.Shared.MedicalScanner; +using Content.Shared._CorvaxNext.Targeting; using JetBrains.Annotations; -using Robust.Client.UserInterface; +using Robust.Client.GameObjects; namespace Content.Client.HealthAnalyzer.UI { @@ -17,10 +18,13 @@ public HealthAnalyzerBoundUserInterface(EntityUid owner, Enum uiKey) : base(owne protected override void Open() { base.Open(); - - _window = this.CreateWindow(); - - _window.Title = EntMan.GetComponent(Owner).EntityName; + _window = new HealthAnalyzerWindow + { + Title = EntMan.GetComponent(Owner).EntityName, + }; + _window.OnClose += Close; + _window.OnBodyPartSelected += SendBodyPartMessage; + _window.OpenCentered(); } protected override void ReceiveMessage(BoundUserInterfaceMessage message) @@ -33,5 +37,22 @@ protected override void ReceiveMessage(BoundUserInterfaceMessage message) _window.Populate(cast); } + + private void SendBodyPartMessage(TargetBodyPart? part, EntityUid target) => SendMessage(new HealthAnalyzerPartMessage(EntMan.GetNetEntity(target), part ?? null)); + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (!disposing) + return; + + if (_window != null) + { + _window.OnClose -= Close; + _window.OnBodyPartSelected -= SendBodyPartMessage; + } + + _window?.Dispose(); + } } } diff --git a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml index aae8785b1fe..0a0b5ac89e7 100644 --- a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml +++ b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml @@ -1,8 +1,8 @@ - + MinWidth="350">
/// The health analyzer that should receive the updates /// The entity to start analyzing - private void BeginAnalyzingEntity(Entity healthAnalyzer, EntityUid target) + private void BeginAnalyzingEntity(Entity healthAnalyzer, EntityUid target, EntityUid? part = null) { //Link the health analyzer to the scanned entity healthAnalyzer.Comp.ScannedEntity = target; + healthAnalyzer.Comp.CurrentBodyPart = part; _toggle.TryActivate(healthAnalyzer.Owner); - - UpdateScannedUser(healthAnalyzer, target, true); + UpdateScannedUser(healthAnalyzer, target, true, part); } /// @@ -170,26 +196,50 @@ private void StopAnalyzingEntity(Entity healthAnalyzer, { //Unlink the analyzer healthAnalyzer.Comp.ScannedEntity = null; + healthAnalyzer.Comp.CurrentBodyPart = null; _toggle.TryDeactivate(healthAnalyzer.Owner); UpdateScannedUser(healthAnalyzer, target, false); } + // Start-_CorvaxNext: surgery + /// + /// Handle the selection of a body part on the health analyzer + /// + /// The health analyzer that's receiving the updates + /// The message containing the selected part + private void OnHealthAnalyzerPartSelected(Entity healthAnalyzer, ref HealthAnalyzerPartMessage args) + { + if (!TryGetEntity(args.Owner, out var owner)) + return; + + if (args.BodyPart == null) + { + BeginAnalyzingEntity(healthAnalyzer, owner.Value, null); + } + else + { + var (targetType, targetSymmetry) = _bodySystem.ConvertTargetBodyPart(args.BodyPart.Value); + if (_bodySystem.GetBodyChildrenOfType(owner.Value, targetType, symmetry: targetSymmetry) is { } part) + BeginAnalyzingEntity(healthAnalyzer, owner.Value, part.FirstOrDefault().Id); + } + } +// End-_CorvaxNext: surgery + /// /// Send an update for the target to the healthAnalyzer /// /// The health analyzer /// The entity being scanned /// True makes the UI show ACTIVE, False makes the UI show INACTIVE - public void UpdateScannedUser(EntityUid healthAnalyzer, EntityUid target, bool scanMode) + public void UpdateScannedUser(EntityUid healthAnalyzer, EntityUid target, bool scanMode, EntityUid? part = null) { if (!_uiSystem.HasUi(healthAnalyzer, HealthAnalyzerUiKey.Key)) return; if (!HasComp(target)) return; - var bodyTemperature = float.NaN; if (TryComp(target, out var temp)) @@ -207,8 +257,15 @@ public void UpdateScannedUser(EntityUid healthAnalyzer, EntityUid target, bool s bleeding = bloodstream.BleedAmount > 0; } - if (HasComp(target)) + /*if (HasComp(target)) Somehow we dont have unrevivable??? unrevivable = true; + */ + + // Start-_CorvaxNext: surgery + Dictionary? body = null; + if (HasComp(target)) + body = _bodySystem.GetBodyPartStatus(target); + // End-_CorvaxNext: surgery _uiSystem.ServerSendUiMessage(healthAnalyzer, HealthAnalyzerUiKey.Key, new HealthAnalyzerScannedUserMessage( GetNetEntity(target), @@ -216,7 +273,9 @@ public void UpdateScannedUser(EntityUid healthAnalyzer, EntityUid target, bool s bloodAmount, scanMode, bleeding, - unrevivable + unrevivable, + body, // _CorvaxNext: surgery + part != null ? GetNetEntity(part) : null // _CorvaxNext: surgery )); } } diff --git a/Content.Server/_CorvaxNext/DelayedDeath/DelayedDeathComponent.cs b/Content.Server/_CorvaxNext/DelayedDeath/DelayedDeathComponent.cs new file mode 100644 index 00000000000..54a6d848cc1 --- /dev/null +++ b/Content.Server/_CorvaxNext/DelayedDeath/DelayedDeathComponent.cs @@ -0,0 +1,16 @@ +namespace Content.Server._CorvaxNext.DelayedDeath; + +[RegisterComponent] +public sealed partial class DelayedDeathComponent : Component +{ + /// + /// How long it takes to kill the entity. + /// + [DataField] + public float DeathTime = 60; + + /// + /// How long it has been since the delayed death timer started. + /// + public float DeathTimer; +} \ No newline at end of file diff --git a/Content.Server/_CorvaxNext/DelayedDeath/DelayedDeathSystem.cs b/Content.Server/_CorvaxNext/DelayedDeath/DelayedDeathSystem.cs new file mode 100644 index 00000000000..7f53b7776b9 --- /dev/null +++ b/Content.Server/_CorvaxNext/DelayedDeath/DelayedDeathSystem.cs @@ -0,0 +1,32 @@ +using Content.Shared.Body.Organ; +using Content.Shared.Body.Events; +using Content.Shared.Damage; +using Content.Shared.Damage.Prototypes; +using Content.Shared.Mobs.Systems; +using Robust.Shared.Timing; +using Robust.Shared.Prototypes; + +namespace Content.Server._CorvaxNext.DelayedDeath; + +public partial class DelayedDeathSystem : EntitySystem +{ + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly IPrototypeManager _prototypes = default!; + public override void Update(float frameTime) + { + base.Update(frameTime); + + using var query = EntityQueryEnumerator(); + while (query.MoveNext(out var ent, out var component)) + { + component.DeathTimer += frameTime; + + if (component.DeathTimer >= component.DeathTime && !_mobState.IsDead(ent)) + { + var damage = new DamageSpecifier(_prototypes.Index("Bloodloss"), 150); + _damageable.TryChangeDamage(ent, damage, partMultiplier: 0f); + } + } + } +} \ No newline at end of file diff --git a/Content.Server/_CorvaxNext/Surgery/SurgerySystem.cs b/Content.Server/_CorvaxNext/Surgery/SurgerySystem.cs new file mode 100644 index 00000000000..6a7711893d0 --- /dev/null +++ b/Content.Server/_CorvaxNext/Surgery/SurgerySystem.cs @@ -0,0 +1,177 @@ +using Content.Server.Atmos.Rotting; +using Content.Server.Body.Systems; +using Content.Server.Chat.Systems; +using Content.Shared.Body.Organ; +using Content.Shared.Body.Part; +using Content.Server.Popups; +using Content.Shared.Damage; +using Content.Shared.Interaction; +using Content.Shared.Medical.Surgery.Conditions; +using Content.Shared.Medical.Surgery.Effects.Step; +using Content.Shared.Eye.Blinding.Components; +using Content.Shared.Eye.Blinding.Systems; +using Content.Shared.Prototypes; +using Robust.Server.GameObjects; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; +using System.Linq; +using Content.Shared._CorvaxNext.Surgery; +using Content.Shared._CorvaxNext.Surgery.Effects.Step; +using Content.Shared._CorvaxNext.Surgery.Tools; +using Content.Shared.Bed.Sleep; +using Content.Shared.Medical.Surgery; + +namespace Content.Server._CorvaxNext.Surgery; + +public sealed class SurgerySystem : SharedSurgerySystem +{ + [Dependency] private readonly BodySystem _body = default!; + [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly IConfigurationManager _config = default!; + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly IPrototypeManager _prototypes = default!; + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly UserInterfaceSystem _ui = default!; + [Dependency] private readonly RottingSystem _rot = default!; + [Dependency] private readonly BlindableSystem _blindableSystem = default!; + + private readonly List _surgeries = new(); + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnToolAfterInteract); + SubscribeLocalEvent(OnSurgeryStepDamage); + // You might be wondering "why aren't we using StepEvent for these two?" reason being that StepEvent fires off regardless of success on the previous functions + // so this would heal entities even if you had a used or incorrect organ. + SubscribeLocalEvent(OnSurgerySpecialDamageChange); + SubscribeLocalEvent(OnSurgeryDamageChange); + SubscribeLocalEvent(OnStepScreamComplete); + SubscribeLocalEvent(OnStepSpawnComplete); + SubscribeLocalEvent(OnPrototypesReloaded); + LoadPrototypes(); + } + + protected override void RefreshUI(EntityUid body) + { + var surgeries = new Dictionary>(); + foreach (var surgery in _surgeries) + { + if (GetSingleton(surgery) is not { } surgeryEnt) + continue; + + foreach (var part in _body.GetBodyChildren(body)) + { + var ev = new SurgeryValidEvent(body, part.Id); + RaiseLocalEvent(surgeryEnt, ref ev); + + if (ev.Cancelled) + continue; + + surgeries.GetOrNew(GetNetEntity(part.Id)).Add(surgery); + } + + } + //Logger.Debug($"Setting UI state with {surgeries}, {body} and {SurgeryUIKey.Key}"); + _ui.SetUiState(body, SurgeryUIKey.Key, new SurgeryBuiState(surgeries)); + /* + Reason we do this is because when applying a BUI State, it rolls back the state on the entity temporarily, + which just so happens to occur right as we're checking for step completion, so we end up with the UI + not updating at all until you change tools or reopen the window. I love shitcode. + */ + _ui.ServerSendUiMessage(body, SurgeryUIKey.Key, new SurgeryBuiRefreshMessage()); + } + private void SetDamage(EntityUid body, + DamageSpecifier damage, + float partMultiplier, + EntityUid user, + EntityUid part) + { + if (!TryComp(part, out var partComp)) + return; + + _damageable.TryChangeDamage(body, + damage, + true, + origin: user, + canSever: false, + partMultiplier: partMultiplier, + targetPart: _body.GetTargetBodyPart(partComp)); + } + + private void OnToolAfterInteract(Entity ent, ref AfterInteractEvent args) + { + var user = args.User; + if (args.Handled + || !args.CanReach + || args.Target == null + || !HasComp(args.Target) + || !TryComp(args.User, out var surgery) + || !surgery.CanOperate + || !IsLyingDown(args.Target.Value, args.User)) + { + return; + } + + if (user == args.Target && !_config.GetCVar(Shared._CorvaxNext.NextVars.NextVars.CanOperateOnSelf)) + { + _popup.PopupEntity(Loc.GetString("surgery-error-self-surgery"), user, user); + return; + } + + args.Handled = true; + _ui.OpenUi(args.Target.Value, SurgeryUIKey.Key, user); + //Logger.Debug("UI opened"); + RefreshUI(args.Target.Value); + } + + private void OnSurgeryStepDamage(Entity ent, ref SurgeryStepDamageEvent args) => + SetDamage(args.Body, args.Damage, args.PartMultiplier, args.User, args.Part); + + private void OnSurgerySpecialDamageChange(Entity ent, ref SurgeryStepDamageChangeEvent args) + { + if (ent.Comp.DamageType == "Rot") + _rot.ReduceAccumulator(args.Body, TimeSpan.FromSeconds(2147483648)); // BEHOLD, SHITCODE THAT I JUST COPY PASTED. I'll redo it at some point, pinky swear :) + else if (ent.Comp.DamageType == "Eye" + && TryComp(ent, out BlindableComponent? blindComp) + && blindComp.EyeDamage > 0) + _blindableSystem.AdjustEyeDamage((args.Body, blindComp), -blindComp!.EyeDamage); + } + + private void OnSurgeryDamageChange(Entity ent, ref SurgeryStepDamageChangeEvent args) + { + var damageChange = ent.Comp.Damage; + if (HasComp(args.Body)) + damageChange = damageChange * ent.Comp.SleepModifier; + + SetDamage(args.Body, damageChange, 0.5f, args.User, args.Part); + } + + private void OnStepScreamComplete(Entity ent, ref SurgeryStepEvent args) + { + if (HasComp(args.Body)) + return; + + _chat.TryEmoteWithChat(args.Body, ent.Comp.Emote); + } + private void OnStepSpawnComplete(Entity ent, ref SurgeryStepEvent args) => + SpawnAtPosition(ent.Comp.Entity, Transform(args.Body).Coordinates); + + private void OnPrototypesReloaded(PrototypesReloadedEventArgs args) + { + if (!args.WasModified()) + return; + + LoadPrototypes(); + } + + private void LoadPrototypes() + { + _surgeries.Clear(); + foreach (var entity in _prototypes.EnumeratePrototypes()) + if (entity.HasComponent()) + _surgeries.Add(new EntProtoId(entity.ID)); + } +} diff --git a/Content.Server/_CorvaxNext/Systems/HeartSystem.cs b/Content.Server/_CorvaxNext/Systems/HeartSystem.cs new file mode 100644 index 00000000000..905575343b3 --- /dev/null +++ b/Content.Server/_CorvaxNext/Systems/HeartSystem.cs @@ -0,0 +1,40 @@ +using Content.Shared.Body.Components; +using Content.Shared.Body.Systems; +using Content.Shared.Body.Events; +using Content.Shared.Body.Organ; +using Content.Server._CorvaxNext.DelayedDeath; +using Content.Server.Body.Components; +using Content.Shared._CorvaxNext.Surgery.Body.Organs; + +namespace Content.Server._CorvaxNext.Body.Systems; + +public sealed class HeartSystem : EntitySystem +{ + [Dependency] private readonly SharedBodySystem _bodySystem = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(HandleAddition); + SubscribeLocalEvent(HandleRemoval); + } + + private void HandleRemoval(EntityUid uid, HeartComponent _, ref OrganRemovedFromBodyEvent args) + { + if (TerminatingOrDeleted(uid) || TerminatingOrDeleted(args.OldBody)) + return; + + // TODO: Add some form of very violent bleeding effect. + EnsureComp(args.OldBody); + } + + private void HandleAddition(EntityUid uid, HeartComponent _, ref OrganAddedToBodyEvent args) + { + if (TerminatingOrDeleted(uid) || TerminatingOrDeleted(args.Body)) + return; + + if (_bodySystem.TryGetBodyOrganEntityComps(args.Body, out var _)) + RemComp(args.Body); + } + // Shitmed-End +} diff --git a/Content.Server/_CorvaxNext/Targeting/TargetingSystem.cs b/Content.Server/_CorvaxNext/Targeting/TargetingSystem.cs new file mode 100644 index 00000000000..3ff68b9ed69 --- /dev/null +++ b/Content.Server/_CorvaxNext/Targeting/TargetingSystem.cs @@ -0,0 +1,53 @@ +using Content.Shared._CorvaxNext.Targeting; +using Content.Shared.Body.Systems; +using Content.Shared.Mobs; + +namespace Content.Server._CorvaxNext.Targeting; +public sealed class TargetingSystem : SharedTargetingSystem +{ + [Dependency] private readonly SharedBodySystem _bodySystem = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeNetworkEvent(OnTargetChange); + SubscribeLocalEvent(OnMobStateChange); + } + + private void OnTargetChange(TargetChangeEvent message, EntitySessionEventArgs args) + { + if (!TryComp(GetEntity(message.Uid), out var target)) + return; + + target.Target = message.BodyPart; + Dirty(GetEntity(message.Uid), target); + } + + private void OnMobStateChange(EntityUid uid, TargetingComponent component, MobStateChangedEvent args) + { + // Revival is handled by the server, so we're keeping all of this here. + var changed = false; + + if (args.NewMobState == MobState.Dead) + { + foreach (var part in GetValidParts()) + { + component.BodyStatus[part] = TargetIntegrity.Dead; + changed = true; + } + // I love groin shitcode. + component.BodyStatus[TargetBodyPart.Groin] = TargetIntegrity.Dead; + } + else if (args.OldMobState == MobState.Dead && (args.NewMobState == MobState.Alive || args.NewMobState == MobState.Critical)) + { + component.BodyStatus = _bodySystem.GetBodyPartStatus(uid); + changed = true; + } + + if (changed) + { + Dirty(uid, component); + RaiseNetworkEvent(new TargetIntegrityChangeEvent(GetNetEntity(uid)), uid); + } + } +} diff --git a/Content.Shared/Body/Organ/OrganComponent.cs b/Content.Shared/Body/Organ/OrganComponent.cs index 3048927b5fb..43bbc99a9d4 100644 --- a/Content.Shared/Body/Organ/OrganComponent.cs +++ b/Content.Shared/Body/Organ/OrganComponent.cs @@ -1,16 +1,42 @@ +using Content.Shared._CorvaxNext.Surgery.Tools; using Content.Shared.Body.Systems; -using Robust.Shared.Containers; using Robust.Shared.GameStates; namespace Content.Shared.Body.Organ; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] [Access(typeof(SharedBodySystem))] -public sealed partial class OrganComponent : Component +public sealed partial class OrganComponent : Component, ISurgeryToolComponent { /// /// Relevant body this organ is attached to. /// [DataField, AutoNetworkedField] public EntityUid? Body; + + // start-_CorvaxNext: surgery + /// + /// Relevant body this organ originally belonged to. + /// /// FOR WHATEVER FUCKING REASON AUTONETWORKING THIS CRASHES GIBTEST AAAAAAAAAAAAAAA + /// + [DataField] + public EntityUid? OriginalBody; + + /// + /// Shitcodey solution to not being able to know what name corresponds to each organ's slot ID + /// without referencing the prototype or hardcoding. + /// + + [DataField] + public string SlotId = ""; + + [DataField] + public string ToolName { get; set; } = "An organ"; + + /// + /// If true, the organ will not heal an entity when transplanted into them. + /// + [DataField, AutoNetworkedField] + public bool? Used { get; set; } + // end-_CorvaxNext: surgery } diff --git a/Content.Shared/Body/Organ/TailComponent.cs b/Content.Shared/Body/Organ/TailComponent.cs new file mode 100644 index 00000000000..41c12ef2208 --- /dev/null +++ b/Content.Shared/Body/Organ/TailComponent.cs @@ -0,0 +1,8 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Body.Organ; + +// start-_CorvaxNext: surgery +[RegisterComponent] +public sealed partial class TailComponent : Component; +// end-_CorvaxNext: surgery diff --git a/Content.Shared/Body/Part/BodyPartComponent.cs b/Content.Shared/Body/Part/BodyPartComponent.cs index c4e65c06a3f..3660fc2eef9 100644 --- a/Content.Shared/Body/Part/BodyPartComponent.cs +++ b/Content.Shared/Body/Part/BodyPartComponent.cs @@ -1,5 +1,9 @@ -using Content.Shared.Body.Components; +using Content.Shared._CorvaxNext.Surgery.Tools; +using Content.Shared._CorvaxNext.Targeting; +using Content.Shared.Body.Components; using Content.Shared.Body.Systems; +using Content.Shared.Containers.ItemSlots; +using Content.Shared.FixedPoint; using Robust.Shared.Containers; using Robust.Shared.GameStates; using Robust.Shared.Serialization; @@ -8,7 +12,7 @@ namespace Content.Shared.Body.Part; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] [Access(typeof(SharedBodySystem))] -public sealed partial class BodyPartComponent : Component +public sealed partial class BodyPartComponent : Component, ISurgeryToolComponent { // Need to set this on container changes as it may be several transform parents up the hierarchy. /// @@ -17,6 +21,14 @@ public sealed partial class BodyPartComponent : Component [DataField, AutoNetworkedField] public EntityUid? Body; + // start-_CorvaxNext: surgery + [DataField, AutoNetworkedField] + public EntityUid? OriginalBody; + + [DataField, AutoNetworkedField] + public BodyPartSlot? ParentSlot; + // end-_CorvaxNext: surgery + [DataField, AutoNetworkedField] public BodyPartType PartType = BodyPartType.Other; @@ -28,9 +40,26 @@ public sealed partial class BodyPartComponent : Component [DataField("vital"), AutoNetworkedField] public bool IsVital; + // start-_CorvaxNext: surgery + /// + /// Amount of damage to deal when the part gets removed. + /// Only works if IsVital is true. + /// + [DataField, AutoNetworkedField] + public FixedPoint2 VitalDamage = 100; + // end-_CorvaxNext: surgery + [DataField, AutoNetworkedField] public BodyPartSymmetry Symmetry = BodyPartSymmetry.None; + // start-_CorvaxNext: surgery + [DataField] + public string ToolName { get; set; } = "A body part"; + + [DataField, AutoNetworkedField] + public bool? Used { get; set; } = null; + // end-_CorvaxNext: surgery + /// /// Child body parts attached to this body part. /// @@ -43,6 +72,74 @@ public sealed partial class BodyPartComponent : Component [DataField, AutoNetworkedField] public Dictionary Organs = new(); + // start-_CorvaxNext: surgery + /// + /// What's the max health this body part can have? + /// + [DataField] + public float MinIntegrity; + + /// + /// Whether this body part is enabled or not. + /// + [DataField, AutoNetworkedField] + public bool Enabled = true; + + /// + /// How long it takes to run another self heal tick on the body part. + /// + [DataField] + public float HealingTime = 30; + + /// + /// How long it has been since the last self heal tick on the body part. + /// + public float HealingTimer; + + /// + /// How much health to heal on the body part per tick. + /// + [DataField] + public float SelfHealingAmount = 5; + + [DataField] + public string ContainerName { get; set; } = "part_slot"; + + [DataField, AutoNetworkedField] + public ItemSlot ItemInsertionSlot = new(); + + + /// + /// Current species. Dictates things like body part sprites. + /// + [DataField, AutoNetworkedField] + public string Species { get; set; } = ""; + + /// + /// The total damage that has to be dealt to a body part + /// to make possible severing it. + /// + [DataField, AutoNetworkedField] + public float SeverIntegrity = 90; + + /// + /// On what TargetIntegrity we should re-enable the part. + /// + [DataField, AutoNetworkedField] + public TargetIntegrity EnableIntegrity = TargetIntegrity.ModeratelyWounded; + + [DataField, AutoNetworkedField] + public Dictionary IntegrityThresholds = new() + { + { TargetIntegrity.CriticallyWounded, 90 }, + { TargetIntegrity.HeavilyWounded, 75 }, + { TargetIntegrity.ModeratelyWounded, 60 }, + { TargetIntegrity.SomewhatWounded, 40}, + { TargetIntegrity.LightlyWounded, 20 }, + { TargetIntegrity.Healthy, 10 }, + }; + // end-_CorvaxNext: surgery + /// /// These are only for VV/Debug do not use these for gameplay/systems /// @@ -56,7 +153,7 @@ private List BodyPartSlotsVV foreach (var slotId in Children.Keys) { - temp.Add((ContainerSlot) containerSystem.GetContainer(Owner, SharedBodySystem.PartSlotContainerIdPrefix+slotId)); + temp.Add((ContainerSlot)containerSystem.GetContainer(Owner, SharedBodySystem.PartSlotContainerIdPrefix + slotId)); } return temp; @@ -73,7 +170,7 @@ private List OrganSlotsVV foreach (var slotId in Organs.Keys) { - temp.Add((ContainerSlot) containerSystem.GetContainer(Owner, SharedBodySystem.OrganSlotContainerIdPrefix+slotId)); + temp.Add((ContainerSlot)containerSystem.GetContainer(Owner, SharedBodySystem.OrganSlotContainerIdPrefix + slotId)); } return temp; diff --git a/Content.Shared/Body/Part/BodyPartEvents.cs b/Content.Shared/Body/Part/BodyPartEvents.cs index 0d8d2c8a268..d3aa89e592a 100644 --- a/Content.Shared/Body/Part/BodyPartEvents.cs +++ b/Content.Shared/Body/Part/BodyPartEvents.cs @@ -1,7 +1,31 @@ +using Content.Shared.Humanoid; + namespace Content.Shared.Body.Part; [ByRefEvent] public readonly record struct BodyPartAddedEvent(string Slot, Entity Part); +// start-_CorvaxNext: surgery +// Kind of a clone of the above for surgical reattachment specifically. +[ByRefEvent] +public readonly record struct BodyPartAttachedEvent(Entity Part); +// end-_CorvaxNext: surgery + [ByRefEvent] public readonly record struct BodyPartRemovedEvent(string Slot, Entity Part); + +// start-_CorvaxNext: surgery +// Kind of a clone of the above for any instances where we call DropPart(), reasoning being that RemovedEvent fires off +// a lot more often than what I'd like due to PVS. +[ByRefEvent] +public readonly record struct BodyPartDroppedEvent(Entity Part); + +[ByRefEvent] +public readonly record struct BodyPartEnableChangedEvent(bool Enabled); + +[ByRefEvent] +public readonly record struct BodyPartEnabledEvent(Entity Part); + +[ByRefEvent] +public readonly record struct BodyPartDisabledEvent(Entity Part); +// end-_CorvaxNext: surgery diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs index 250f90db8f3..0d44ba93d62 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs @@ -1,20 +1,27 @@ using System.Linq; using System.Numerics; +using Content.Shared._CorvaxNext.Targeting; using Content.Shared.Body.Components; using Content.Shared.Body.Organ; using Content.Shared.Body.Part; using Content.Shared.Body.Prototypes; +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Damage; using Content.Shared.DragDrop; +using Content.Shared.FixedPoint; using Content.Shared.Gibbing.Components; using Content.Shared.Gibbing.Events; using Content.Shared.Gibbing.Systems; +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Events; using Content.Shared.Inventory; +using Content.Shared.Standing; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.Map; using Robust.Shared.Utility; - +using Robust.Shared.Timing; namespace Content.Shared.Body.Systems; public partial class SharedBodySystem @@ -27,9 +34,10 @@ public partial class SharedBodySystem */ [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly ItemSlotsSystem _slots = default!; [Dependency] private readonly GibbingSystem _gibbingSystem = default!; [Dependency] private readonly SharedAudioSystem _audioSystem = default!; - + [Dependency] private readonly IGameTiming _gameTiming = default!; private const float GibletLaunchImpulse = 8; private const float GibletLaunchImpulseVariance = 3; @@ -42,6 +50,8 @@ private void InitializeBody() SubscribeLocalEvent(OnBodyInit); SubscribeLocalEvent(OnBodyMapInit); SubscribeLocalEvent(OnBodyCanDrag); + SubscribeLocalEvent(OnStandAttempt); // _CorvaxNext: surgery + SubscribeLocalEvent(OnProfileLoadFinished); // _CorvaxNext: surgery } private void OnBodyInserted(Entity ent, ref EntInsertedIntoContainerMessage args) @@ -115,11 +125,11 @@ private void MapInitBody(EntityUid bodyEntity, BodyPrototype prototype) var rootPartUid = SpawnInContainerOrDrop(protoRoot.Part, bodyEntity, BodyRootContainerId); var rootPart = Comp(rootPartUid); rootPart.Body = bodyEntity; + rootPart.OriginalBody = bodyEntity; Dirty(rootPartUid, rootPart); - // Setup the rest of the body entities. SetupOrgans((rootPartUid, rootPart), protoRoot.Organs); - MapInitParts(rootPartUid, prototype); + MapInitParts(rootPartUid, rootPart, prototype); } private void OnBodyCanDrag(Entity ent, ref CanDragEvent args) @@ -127,10 +137,18 @@ private void OnBodyCanDrag(Entity ent, ref CanDragEvent args) args.Handled = true; } + // start-_CorvaxNext: surgery + private void OnStandAttempt(Entity ent, ref StandAttemptEvent args) + { + if (ent.Comp.LegEntities.Count == 0) + args.Cancel(); + } + // end-_CorvaxNext: surgery + /// /// Sets up all of the relevant body parts for a particular body entity and root part. /// - private void MapInitParts(EntityUid rootPartId, BodyPrototype prototype) + private void MapInitParts(EntityUid rootPartId, BodyPartComponent rootPart, BodyPrototype prototype) { // Start at the root part and traverse the body graph, setting up parts as we go. // Basic BFS pathfind. @@ -168,6 +186,9 @@ private void MapInitParts(EntityUid rootPartId, BodyPrototype prototype) var childPartComponent = Comp(childPart); var partSlot = CreatePartSlot(parentEntity, connection, childPartComponent.PartType, parentPartComponent); + childPartComponent.ParentSlot = partSlot; + childPartComponent.OriginalBody = rootPart.Body; + Dirty(childPart, childPartComponent); var cont = Containers.GetContainer(parentEntity, GetPartSlotContainerId(connection)); if (partSlot is null || !Containers.Insert(childPart, cont)) @@ -177,6 +198,22 @@ private void MapInitParts(EntityUid rootPartId, BodyPrototype prototype) continue; } + // // start-_CorvaxNext: surgery + // if (TryComp(parentPartComponent.Body, out HumanoidAppearanceComponent? bodyAppearance)) + // { + // var appearance = AddComp(childPart); + // appearance.OriginalBody = childPartComponent.OriginalBody; + // appearance.Color = bodyAppearance.SkinColor; + // + // var symmetry = ((BodyPartSymmetry) childPartComponent.Symmetry).ToString(); + // if (symmetry == "None") + // symmetry = ""; + // appearance.ID = "removed" + symmetry + ((BodyPartType) childPartComponent.PartType).ToString(); + // + // Dirty(childPart, appearance); + // } + // // end-_CorvaxNext: surgery + // Add organs SetupOrgans((childPart, childPartComponent), connectionSlot.Organs); @@ -233,11 +270,11 @@ public IEnumerable GetBodyContainers( { if (id is null || !Resolve(id.Value, ref body, logMissing: false) + || body is null + || body.RootContainer == default || body.RootContainer.ContainedEntity is null || !Resolve(body.RootContainer.ContainedEntity.Value, ref rootPart)) - { yield break; - } foreach (var child in GetBodyPartChildren(body.RootContainer.ContainedEntity.Value, rootPart)) { @@ -291,7 +328,9 @@ public virtual HashSet GibBody( Vector2? splatDirection = null, float splatModifier = 1, Angle splatCone = default, - SoundSpecifier? gibSoundOverride = null) + SoundSpecifier? gibSoundOverride = null, + GibType gib = GibType.Gib, + GibContentsOption contents = GibContentsOption.Drop) { var gibs = new HashSet(); @@ -308,9 +347,9 @@ public virtual HashSet GibBody( foreach (var part in parts) { - _gibbingSystem.TryGibEntityWithRef(bodyId, part.Id, GibType.Gib, GibContentsOption.Skip, ref gibs, - playAudio: false, launchGibs:true, launchDirection:splatDirection, launchImpulse: GibletLaunchImpulse * splatModifier, - launchImpulseVariance:GibletLaunchImpulseVariance, launchCone: splatCone); + _gibbingSystem.TryGibEntityWithRef(bodyId, part.Id, gib, contents, ref gibs, + playAudio: false, launchGibs: true, launchDirection: splatDirection, launchImpulse: GibletLaunchImpulse * splatModifier, + launchImpulseVariance: GibletLaunchImpulseVariance, launchCone: splatCone); if (!gibOrgans) continue; @@ -319,7 +358,7 @@ public virtual HashSet GibBody( { _gibbingSystem.TryGibEntityWithRef(bodyId, organ.Id, GibType.Drop, GibContentsOption.Skip, ref gibs, playAudio: false, launchImpulse: GibletLaunchImpulse * splatModifier, - launchImpulseVariance:GibletLaunchImpulseVariance, launchCone: splatCone); + launchImpulseVariance: GibletLaunchImpulseVariance, launchCone: splatCone); } } @@ -335,4 +374,65 @@ public virtual HashSet GibBody( _audioSystem.PlayPredicted(gibSoundOverride, bodyTransform.Coordinates, null); return gibs; } + + // start-_CorvaxNext: surgery + public virtual HashSet GibPart( + EntityUid partId, + BodyPartComponent? part = null, + bool launchGibs = true, + Vector2? splatDirection = null, + float splatModifier = 1, + Angle splatCone = default, + SoundSpecifier? gibSoundOverride = null) + { + var gibs = new HashSet(); + + if (!Resolve(partId, ref part, logMissing: false)) + return gibs; + + if (part.Body is { } bodyEnt) + { + if (IsPartRoot(bodyEnt, partId, part: part)) + return gibs; + + RemovePartChildren((partId, part), bodyEnt); + + _gibbingSystem.TryGibEntityWithRef(partId, + partId, + GibType.Gib, + GibContentsOption.Drop, + ref gibs, + playAudio: true, + launchGibs: true, + launchDirection: splatDirection, + launchImpulse: GibletLaunchImpulse * splatModifier, + launchImpulseVariance: GibletLaunchImpulseVariance, + launchCone: splatCone); + } + + if (HasComp(partId)) + { + foreach (var item in _inventory.GetHandOrInventoryEntities((partId))) + { + SharedTransform.AttachToGridOrMap(item); + gibs.Add(item); + } + } + + _audioSystem.PlayPredicted(gibSoundOverride, Transform(partId).Coordinates, null); + return gibs; + } + + private void OnProfileLoadFinished(EntityUid uid, BodyComponent component, ProfileLoadFinishedEvent args) + { + if (!HasComp(uid) + || TerminatingOrDeleted(uid)) + return; + + foreach (var part in GetBodyChildren(uid, component)) + { + EnsureComp(part.Id); + } + } + // end-_CorvaxNext: surgery } diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs b/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs index f83dd50c998..14137e7057c 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Organs.cs @@ -3,6 +3,7 @@ using Content.Shared.Body.Events; using Content.Shared.Body.Organ; using Content.Shared.Body.Part; +using Content.Shared.Damage; using Robust.Shared.Containers; namespace Content.Shared.Body.Systems; @@ -20,6 +21,7 @@ private void AddOrgan( if (organEnt.Comp.Body is not null) { + organEnt.Comp.OriginalBody = organEnt.Comp.Body; // _CorvaxNext: surgery var addedInBodyEv = new OrganAddedToBodyEvent(bodyUid, parentPartUid); RaiseLocalEvent(organEnt, ref addedInBodyEv); } @@ -38,6 +40,10 @@ private void RemoveOrgan(Entity organEnt, EntityUid parentPartUi RaiseLocalEvent(organEnt, ref removedInBodyEv); } + if (TryComp(parentPartUid, out DamageableComponent? damageable) // _CorvaxNext: surgery + && damageable.TotalDamage > 200) + TrySetOrganUsed(organEnt, true, organEnt.Comp); + organEnt.Comp.Body = null; Dirty(organEnt, organEnt.Comp); } @@ -209,4 +215,17 @@ public bool TryGetBodyOrganEntityComps( comps = null; return false; } + + // start-_CorvaxNext: surgery + public bool TrySetOrganUsed(EntityUid organId, bool used, OrganComponent? organ = null) + { + if (!Resolve(organId, ref organ) + || organ.Used == used) + return false; + + organ.Used = used; + Dirty(organId, organ); + return true; + } + // end-_CorvaxNext: surgery } diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs index 0917197e29f..ca05e568767 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Parts.cs @@ -1,28 +1,58 @@ -using System.Diagnostics.CodeAnalysis; -using System.Linq; using Content.Shared.Body.Components; using Content.Shared.Body.Events; using Content.Shared.Body.Organ; using Content.Shared.Body.Part; using Content.Shared.Damage; using Content.Shared.Damage.Prototypes; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Humanoid; +using Content.Shared.Inventory; using Content.Shared.Movement.Components; +using Content.Shared.Random; +using Content.Shared._CorvaxNext.Targeting; using Robust.Shared.Containers; using Robust.Shared.Utility; +using System.Diagnostics.CodeAnalysis; +using System.Linq; namespace Content.Shared.Body.Systems; public partial class SharedBodySystem { + [Dependency] private readonly SharedContainerSystem _containerSystem = default!; + [Dependency] private readonly SharedHandsSystem _handsSystem = default!; + [Dependency] private readonly RandomHelperSystem _randomHelper = default!; + [Dependency] private readonly InventorySystem _inventorySystem = default!; + private void InitializeParts() { // TODO: This doesn't handle comp removal on child ents. // If you modify this also see the Body partial for root parts. + SubscribeLocalEvent(OnMapInit); // _CorvaxNext: surgery + SubscribeLocalEvent(OnBodyPartRemove); // _CorvaxNext: surgery SubscribeLocalEvent(OnBodyPartInserted); SubscribeLocalEvent(OnBodyPartRemoved); + SubscribeLocalEvent(OnAmputateAttempt); // _CorvaxNext: surgery + SubscribeLocalEvent(OnPartEnableChanged); // _CorvaxNext: surgery } + // start-_CorvaxNext: surgery + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + if (ent.Comp.PartType == BodyPartType.Torso) + { + _slots.AddItemSlot(ent, ent.Comp.ContainerName, ent.Comp.ItemInsertionSlot); + Dirty(ent, ent.Comp); + } + } + + private void OnBodyPartRemove(Entity ent, ref ComponentRemove args) + { + if (ent.Comp.PartType == BodyPartType.Torso) + _slots.RemoveItemSlot(ent, ent.Comp.ItemInsertionSlot); + } + // end-_CorvaxNext: surgery private void OnBodyPartInserted(Entity ent, ref EntInsertedIntoContainerMessage args) { // Body part inserted into another body part. @@ -47,12 +77,12 @@ private void OnBodyPartRemoved(Entity ent, ref EntRemovedFrom // Body part removed from another body part. var removedUid = args.Entity; var slotId = args.Container.ID; - DebugTools.Assert(!TryComp(removedUid, out BodyPartComponent? b) || b.Body == ent.Comp.Body); DebugTools.Assert(!TryComp(removedUid, out OrganComponent? o) || o.Body == ent.Comp.Body); if (TryComp(removedUid, out BodyPartComponent? part) && part.Body is not null) { + CheckBodyPart((removedUid, part), GetTargetBodyPart(part), true); // _CorvaxNext: surgery RemovePart(part.Body.Value, (removedUid, part), slotId); RecursiveBodyUpdate((removedUid, part), null); } @@ -93,6 +123,8 @@ private void RecursiveBodyUpdate(Entity ent, EntityUid? bodyU } } + // The code for RemovePartEffect() should live here, because it literally is the point of this recursive function. + // But the debug asserts at the top plus existing tests need refactoring for this. So we'll be lazy. foreach (var slotId in ent.Comp.Children.Keys) { if (!Containers.TryGetContainer(ent, GetPartSlotContainerId(slotId), out var container)) @@ -127,15 +159,44 @@ protected virtual void RemovePart( { Resolve(bodyEnt, ref bodyEnt.Comp, logMissing: false); Dirty(partEnt, partEnt.Comp); - partEnt.Comp.Body = null; + partEnt.Comp.ParentSlot = null; + partEnt.Comp.OriginalBody = partEnt.Comp.Body; var ev = new BodyPartRemovedEvent(slotId, partEnt); RaiseLocalEvent(bodyEnt, ref ev); - RemoveLeg(partEnt, bodyEnt); + RemovePartEffect(partEnt, bodyEnt); PartRemoveDamage(bodyEnt, partEnt); } + // start-_CorvaxNext: surgery + protected virtual void DropPart(Entity partEnt) + { + // I don't know if this can cause issues, since any part that's being detached HAS to have a Body. + // though I really just want the compiler to shut the fuck up. + var body = partEnt.Comp.Body.GetValueOrDefault(); + if (TryComp(partEnt, out TransformComponent? transform) && _gameTiming.IsFirstTimePredicted) + { + var enableEvent = new BodyPartEnableChangedEvent(false); + RaiseLocalEvent(partEnt, ref enableEvent); + + if (TryComp(body, out HumanoidAppearanceComponent? bodyAppearance) + && !HasComp(partEnt) + && !TerminatingOrDeleted(body) + && !TerminatingOrDeleted(partEnt)) + EnsureComp(partEnt); + + SharedTransform.AttachToGridOrMap(partEnt, transform); + _randomHelper.RandomOffset(partEnt, 0.5f); + var droppedEvent = new BodyPartDroppedEvent(partEnt); + RaiseLocalEvent(body, ref droppedEvent); + } + + } + + private void OnAmputateAttempt(Entity partEnt, ref AmputateAttemptEvent args) => + DropPart(partEnt); + // end-_CorvaxNext: surgery private void AddLeg(Entity legEnt, Entity bodyEnt) { if (!Resolve(bodyEnt, ref bodyEnt.Comp, logMissing: false)) @@ -159,13 +220,44 @@ private void RemoveLeg(Entity legEnt, Entity bodyEnt.Comp.LegEntities.Remove(legEnt); UpdateMovementSpeed(bodyEnt); Dirty(bodyEnt, bodyEnt.Comp); + Standing.Down(bodyEnt); // _CorvaxNext: surgery + } + } + + // start-_CorvaxNext: surgery + // TODO: Refactor this crap. + private void RemovePartEffect(Entity partEnt, Entity bodyEnt) + { + if (TerminatingOrDeleted(bodyEnt) || !Resolve(bodyEnt, ref bodyEnt.Comp, logMissing: false)) + return; + + RemovePartChildren(partEnt, bodyEnt, bodyEnt.Comp); + } + + protected void RemovePartChildren(Entity partEnt, EntityUid bodyEnt, BodyComponent? body = null) + { + if (!Resolve(bodyEnt, ref body, logMissing: false)) + return; - if (!bodyEnt.Comp.LegEntities.Any()) + if (partEnt.Comp.Children.Any()) + { + foreach (var slotId in partEnt.Comp.Children.Keys) { - Standing.Down(bodyEnt); + if (Containers.TryGetContainer(partEnt, GetPartSlotContainerId(slotId), out var container) && + container is ContainerSlot slot && + slot.ContainedEntity is { } childEntity && + TryComp(childEntity, out BodyPartComponent? childPart)) + { + var ev = new BodyPartEnableChangedEvent(false); + RaiseLocalEvent(childEntity, ref ev); + DropPart((childEntity, childPart)); + } } + + Dirty(bodyEnt, body); } } + // end-_CorvaxNext: surgery private void PartRemoveDamage(Entity bodyEnt, Entity partEnt) { @@ -177,11 +269,79 @@ private void PartRemoveDamage(Entity bodyEnt, Entity("Bloodloss"), 300); - Damageable.TryChangeDamage(bodyEnt, damage); + // start-_CorvaxNext: surgery + var damage = new DamageSpecifier(Prototypes.Index("Bloodloss"), partEnt.Comp.VitalDamage); + Damageable.TryChangeDamage(bodyEnt, damage, partMultiplier: 0f); + // end-_CorvaxNext: surgery + } + } + + // start-_CorvaxNext: surgery + private void OnPartEnableChanged(Entity partEnt, ref BodyPartEnableChangedEvent args) + { + partEnt.Comp.Enabled = args.Enabled; + Dirty(partEnt, partEnt.Comp); + + if (args.Enabled) + EnablePart(partEnt); + else + DisablePart(partEnt); + } + private void EnablePart(Entity partEnt) + { + if (!TryComp(partEnt.Comp.Body, out BodyComponent? body)) + return; + + // I hate having to hardcode these checks so much. + if (partEnt.Comp.PartType == BodyPartType.Leg) + { + AddLeg(partEnt, (partEnt.Comp.Body.Value, body)); + } + + if (partEnt.Comp.PartType == BodyPartType.Arm) + { + var hand = GetBodyChildrenOfType(partEnt.Comp.Body.Value, BodyPartType.Hand, symmetry: partEnt.Comp.Symmetry).FirstOrDefault(); + if (hand != default) + { + var ev = new BodyPartEnabledEvent(hand); + RaiseLocalEvent(partEnt.Comp.Body.Value, ref ev); + } + } + + if (partEnt.Comp.PartType == BodyPartType.Hand) + { + var ev = new BodyPartEnabledEvent(partEnt); + RaiseLocalEvent(partEnt.Comp.Body.Value, ref ev); + } + } + + private void DisablePart(Entity partEnt) + { + if (!TryComp(partEnt.Comp.Body, out BodyComponent? body)) + return; + + if (partEnt.Comp.PartType == BodyPartType.Leg) + { + RemoveLeg(partEnt, (partEnt.Comp.Body.Value, body)); + } + + if (partEnt.Comp.PartType == BodyPartType.Arm) + { + var hand = GetBodyChildrenOfType(partEnt.Comp.Body.Value, BodyPartType.Hand, symmetry: partEnt.Comp.Symmetry).FirstOrDefault(); + if (hand != default) + { + var ev = new BodyPartDisabledEvent(hand); + RaiseLocalEvent(partEnt.Comp.Body.Value, ref ev); + } + } + + if (partEnt.Comp.PartType == BodyPartType.Hand) + { + var ev = new BodyPartDisabledEvent(partEnt); + RaiseLocalEvent(partEnt.Comp.Body.Value, ref ev); } } + // end-_CorvaxNext: surgery /// /// Tries to get the parent body part to this if applicable. @@ -401,6 +561,20 @@ public bool AttachPartToRoot( && Containers.Insert(partId, body.RootContainer); } + // start-_CorvaxNext: surgery + /// + /// Returns true if this parentId supports attaching a new part to the specified slot. + /// + public bool CanAttachToSlot( + EntityUid parentId, + string slotId, + BodyPartComponent? parentPart = null) + { + return Resolve(parentId, ref parentPart, logMissing: false) + && parentPart.Children.ContainsKey(slotId); + } + // end-_CorvaxNext: surgery + #endregion #region Attach/Detach @@ -438,12 +612,22 @@ public bool AttachPart( return false; } + if (!Containers.TryGetContainer(parentPartId, GetPartSlotContainerId(slot.Id), out var container)) { DebugTools.Assert($"Unable to find body slot {slot.Id} for {ToPrettyString(parentPartId)}"); return false; } + // start-_CorvaxNext: surgery + part.ParentSlot = slot; + + if (TryComp(part.Body, out HumanoidAppearanceComponent? bodyAppearance) + && !HasComp(partId) + && !TerminatingOrDeleted(parentPartId) + && !TerminatingOrDeleted(partId)) // Saw some exceptions involving these due to the spawn menu. + EnsureComp(partId); + // end-_CorvaxNext: surgery return Containers.Insert(partId, container); } @@ -656,11 +840,12 @@ public bool BodyHasChild( public IEnumerable<(EntityUid Id, BodyPartComponent Component)> GetBodyChildrenOfType( EntityUid bodyId, BodyPartType type, - BodyComponent? body = null) + BodyComponent? body = null, + BodyPartSymmetry? symmetry = null) { foreach (var part in GetBodyChildren(bodyId, body)) { - if (part.Component.PartType == type) + if (part.Component.PartType == type && (symmetry == null || part.Component.Symmetry == symmetry)) // _CorvaxNext: surgery yield return part; } } @@ -722,6 +907,50 @@ public bool TryGetBodyPartOrganComponents( return false; } + // start-_CorvaxNext: surgery + /// + /// Tries to get a list of ValueTuples of EntityUid and OrganComponent on each organ + /// in the given part. + /// + /// The part entity id to check on. + /// The type of component to check for. + /// The part to check for organs on. + /// Whether any were found. + /// + /// This method is somewhat of a copout to the fact that we can't use reflection to generically + /// get the type of a component on runtime due to sandboxing. So we simply do a HasComp check for each organ. + /// + public bool TryGetBodyPartOrgans( + EntityUid uid, + Type type, + [NotNullWhen(true)] out List<(EntityUid Id, OrganComponent Organ)>? organs, + BodyPartComponent? part = null) + { + if (!Resolve(uid, ref part)) + { + organs = null; + return false; + } + + var list = new List<(EntityUid Id, OrganComponent Organ)>(); + + foreach (var organ in GetPartOrgans(uid, part)) + { + if (HasComp(organ.Id, type)) + list.Add((organ.Id, organ.Component)); + } + + if (list.Count != 0) + { + organs = list; + return true; + } + + organs = null; + return false; + } + // end-_CorvaxNext: surgery + /// /// Gets the parent body part and all immediate child body parts for the partId. /// @@ -790,5 +1019,33 @@ public bool TryGetBodyPartAdjacentPartsComponents( return false; } + // start-_CorvaxNext: surgery + private bool TryGetPartSlotContainerName(BodyPartType partType, out HashSet containerNames) + { + containerNames = partType switch + { + BodyPartType.Arm => new() { "gloves" }, + BodyPartType.Leg => new() { "shoes" }, + BodyPartType.Head => new() { "eyes", "ears", "head", "mask" }, + _ => new() + }; + return containerNames.Count > 0; + } + + public int GetBodyPartCount(EntityUid bodyId, BodyPartType partType, BodyComponent? body = null) + { + if (!Resolve(bodyId, ref body, logMissing: false)) + return 0; + + int count = 0; + foreach (var part in GetBodyChildren(bodyId, body)) + { + if (part.Component.PartType == partType) + count++; + } + return count; + } + // end-_CorvaxNext: surgery + #endregion } diff --git a/Content.Shared/Body/Systems/SharedBodySystem.cs b/Content.Shared/Body/Systems/SharedBodySystem.cs index a45966fcc37..441aeb256cd 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.cs @@ -28,7 +28,7 @@ public abstract partial class SharedBodySystem : EntitySystem /// public const string OrganSlotContainerIdPrefix = "body_organ_slot_"; - [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly IGameTiming _timing = default!; [Dependency] protected readonly IPrototypeManager Prototypes = default!; [Dependency] protected readonly DamageableSystem Damageable = default!; [Dependency] protected readonly MovementSpeedModifierSystem Movement = default!; @@ -42,6 +42,9 @@ public override void Initialize() InitializeBody(); InitializeParts(); + InitializeBkm(); // _CorvaxNext: surgery + // To try and mitigate the server load due to integrity checks, we set up a Job Queue. + InitializePartAppearances(); } /// diff --git a/Content.Shared/Corvax/CCCVars/CCCVars.cs b/Content.Shared/Corvax/CCCVars/CCCVars.cs index 6a9ab3b0840..fdbce0cd984 100644 --- a/Content.Shared/Corvax/CCCVars/CCCVars.cs +++ b/Content.Shared/Corvax/CCCVars/CCCVars.cs @@ -1,4 +1,4 @@ -using Robust.Shared.Configuration; +using Robust.Shared.Configuration; namespace Content.Shared.Corvax.CCCVars; diff --git a/Content.Shared/Damage/Systems/DamageOnInteractSystem.cs b/Content.Shared/Damage/Systems/DamageOnInteractSystem.cs index cc3b3f6d5d9..8938c748756 100644 --- a/Content.Shared/Damage/Systems/DamageOnInteractSystem.cs +++ b/Content.Shared/Damage/Systems/DamageOnInteractSystem.cs @@ -1,6 +1,8 @@ using Content.Shared.Administration.Logs; +using Content.Shared._CorvaxNext.Targeting; using Content.Shared.Damage.Components; using Content.Shared.Database; +using Content.Shared.Hands.Components; using Content.Shared.Interaction; using Content.Shared.Inventory; using Content.Shared.Popups; @@ -58,8 +60,23 @@ private void OnHandInteract(Entity entity, ref Intera totalDamage = DamageSpecifier.ApplyModifierSet(totalDamage, protectiveEntity.Comp.DamageProtection); } } + // start-_CorvaxNext: surgery - totalDamage = _damageableSystem.TryChangeDamage(args.User, totalDamage, origin: args.Target); + TargetBodyPart? targetPart = null; + var hands = CompOrNull(args.User); + if (hands is { ActiveHand: not null }) + { + targetPart = hands.ActiveHand.Location switch + { + HandLocation.Left => TargetBodyPart.LeftArm, + HandLocation.Right => TargetBodyPart.RightArm, + _ => null + }; + } + + // end-_CorvaxNext: surgery + + totalDamage = _damageableSystem.TryChangeDamage(args.User, totalDamage, origin: args.Target, targetPart: targetPart); if (totalDamage != null && totalDamage.AnyPositive()) { diff --git a/Content.Shared/Damage/Systems/DamageableSystem.cs b/Content.Shared/Damage/Systems/DamageableSystem.cs index 3c3e1b736df..b65eabaa660 100644 --- a/Content.Shared/Damage/Systems/DamageableSystem.cs +++ b/Content.Shared/Damage/Systems/DamageableSystem.cs @@ -5,11 +5,14 @@ using Content.Shared.Mind.Components; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; +using Content.Shared.Body.Systems; using Content.Shared.Radiation.Events; using Content.Shared.Rejuvenate; +using Content.Shared._CorvaxNext.Targeting; using Robust.Shared.GameStates; using Robust.Shared.Network; using Robust.Shared.Prototypes; +using Robust.Shared.Random; using Robust.Shared.Utility; namespace Content.Shared.Damage @@ -21,6 +24,8 @@ public sealed class DamageableSystem : EntitySystem [Dependency] private readonly INetManager _netMan = default!; [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; + [Dependency] private readonly SharedBodySystem _body = default!; + [Dependency] private readonly IRobustRandom _random = default!; private EntityQuery _appearanceQuery; private EntityQuery _damageableQuery; private EntityQuery _mindContainerQuery; @@ -97,7 +102,8 @@ public void SetDamage(EntityUid uid, DamageableComponent damageable, DamageSpeci /// The damage changed event is used by other systems, such as damage thresholds. /// public void DamageChanged(EntityUid uid, DamageableComponent component, DamageSpecifier? damageDelta = null, - bool interruptsDoAfters = true, EntityUid? origin = null) + bool interruptsDoAfters = true, EntityUid? origin = null, bool? canSever = null) + { component.Damage.GetDamagePerGroup(_prototypeManager, component.DamagePerGroup); component.TotalDamage = component.Damage.GetTotal(); @@ -108,7 +114,7 @@ public void DamageChanged(EntityUid uid, DamageableComponent component, DamageSp var data = new DamageVisualizerGroupData(component.DamagePerGroup.Keys.ToList()); _appearance.SetData(uid, DamageVisualizerKeys.DamageUpdateGroups, data, appearance); } - RaiseLocalEvent(uid, new DamageChangedEvent(component, damageDelta, interruptsDoAfters, origin)); + RaiseLocalEvent(uid, new DamageChangedEvent(component, damageDelta, interruptsDoAfters, origin, canSever ?? true)); } /// @@ -124,7 +130,8 @@ public void DamageChanged(EntityUid uid, DamageableComponent component, DamageSp /// null if the user had no applicable components that can take damage. /// public DamageSpecifier? TryChangeDamage(EntityUid? uid, DamageSpecifier damage, bool ignoreResistances = false, - bool interruptsDoAfters = true, DamageableComponent? damageable = null, EntityUid? origin = null) + bool interruptsDoAfters = true, DamageableComponent? damageable = null, EntityUid? origin = null, + bool? canSever = true, bool? canEvade = false, float? partMultiplier = 1.00f, TargetBodyPart? targetPart = null) { if (!uid.HasValue || !_damageableQuery.Resolve(uid.Value, ref damageable, false)) { @@ -137,10 +144,10 @@ public void DamageChanged(EntityUid uid, DamageableComponent component, DamageSp return damage; } - var before = new BeforeDamageChangedEvent(damage, origin); + var before = new BeforeDamageChangedEvent(damage, origin, targetPart, canSever ?? true, canEvade ?? false, partMultiplier ?? 1.00f); RaiseLocalEvent(uid.Value, ref before); - if (before.Cancelled) + if (before.Cancelled || before.Evaded) return null; // Apply resistances @@ -151,10 +158,10 @@ public void DamageChanged(EntityUid uid, DamageableComponent component, DamageSp { // TODO DAMAGE PERFORMANCE // use a local private field instead of creating a new dictionary here.. + // TODO: We need to add a check to see if the given armor covers the targeted part (if any) to modify or not. damage = DamageSpecifier.ApplyModifierSet(damage, modifierSet); } - - var ev = new DamageModifyEvent(damage, origin); + var ev = new DamageModifyEvent(damage, origin, targetPart); RaiseLocalEvent(uid.Value, ev); damage = ev.Damage; @@ -186,7 +193,7 @@ public void DamageChanged(EntityUid uid, DamageableComponent component, DamageSp } if (delta.DamageDict.Count > 0) - DamageChanged(uid.Value, damageable, delta, interruptsDoAfters, origin); + DamageChanged(uid.Value, damageable, delta, interruptsDoAfters, origin, canSever); return delta; } @@ -256,6 +263,11 @@ private void OnRejuvenate(EntityUid uid, DamageableComponent component, Rejuvena TryComp(uid, out var thresholds); _mobThreshold.SetAllowRevives(uid, true, thresholds); // do this so that the state changes when we set the damage SetAllDamage(uid, component, 0); + // start-_CorvaxNext: surgery Shitmed Start + if (HasComp(uid)) + foreach (var part in _body.GetBodyChildren(uid)) + RaiseLocalEvent(part.Id, new RejuvenateEvent()); + // start-_CorvaxNext: surgery Shitmed End _mobThreshold.SetAllowRevives(uid, false, thresholds); } @@ -286,7 +298,15 @@ private void DamageableHandleState(EntityUid uid, DamageableComponent component, /// Raised before damage is done, so stuff can cancel it if necessary. /// [ByRefEvent] - public record struct BeforeDamageChangedEvent(DamageSpecifier Damage, EntityUid? Origin = null, bool Cancelled = false); + public record struct BeforeDamageChangedEvent( + DamageSpecifier Damage, + EntityUid? Origin = null, + TargetBodyPart? TargetPart = null, + bool CanSever = true, + bool CanEvade = false, + float PartMultiplier = 1.00f, + bool Evaded = false, + bool Cancelled = false); /// /// Raised on an entity when damage is about to be dealt, @@ -299,16 +319,17 @@ public sealed class DamageModifyEvent : EntityEventArgs, IInventoryRelayEvent { // Whenever locational damage is a thing, this should just check only that bit of armour. public SlotFlags TargetSlots { get; } = ~SlotFlags.POCKET; - public readonly DamageSpecifier OriginalDamage; public DamageSpecifier Damage; public EntityUid? Origin; + public readonly TargetBodyPart? TargetPart; - public DamageModifyEvent(DamageSpecifier damage, EntityUid? origin = null) + public DamageModifyEvent(DamageSpecifier damage, EntityUid? origin = null, TargetBodyPart? targetPart = null) { OriginalDamage = damage; Damage = damage; Origin = origin; + TargetPart = targetPart; } } @@ -347,11 +368,17 @@ public sealed class DamageChangedEvent : EntityEventArgs /// public readonly EntityUid? Origin; - public DamageChangedEvent(DamageableComponent damageable, DamageSpecifier? damageDelta, bool interruptsDoAfters, EntityUid? origin) + /// + /// Can this damage event sever parts? + /// + public readonly bool CanSever; + + public DamageChangedEvent(DamageableComponent damageable, DamageSpecifier? damageDelta, bool interruptsDoAfters, EntityUid? origin, bool canSever = true) { Damageable = damageable; DamageDelta = damageDelta; Origin = origin; + CanSever = canSever; if (DamageDelta == null) return; diff --git a/Content.Shared/Hands/Components/HandsComponent.cs b/Content.Shared/Hands/Components/HandsComponent.cs index b3cb51ae359..3147606a71d 100644 --- a/Content.Shared/Hands/Components/HandsComponent.cs +++ b/Content.Shared/Hands/Components/HandsComponent.cs @@ -30,6 +30,7 @@ public sealed partial class HandsComponent : Component /// /// List of hand-names. These are keys for . The order of this list determines the order in which hands are iterated over. /// + [ViewVariables] public List SortedHands = new(); /// diff --git a/Content.Shared/Humanoid/Events/ProfileLoadFinishedEvent.cs b/Content.Shared/Humanoid/Events/ProfileLoadFinishedEvent.cs new file mode 100644 index 00000000000..ccccf2f1113 --- /dev/null +++ b/Content.Shared/Humanoid/Events/ProfileLoadFinishedEvent.cs @@ -0,0 +1,8 @@ +namespace Content.Shared.Humanoid.Events; + +// start-_CorvaxNext: surgery +/// +/// Raised on an entity when their profile has finished being loaded +/// +public sealed class ProfileLoadFinishedEvent : EntityEventArgs { } +// end-_CorvaxNext: surgery diff --git a/Content.Shared/Humanoid/HumanoidVisualLayersExtension.cs b/Content.Shared/Humanoid/HumanoidVisualLayersExtension.cs index 0f8b940bd66..5417bad82be 100644 --- a/Content.Shared/Humanoid/HumanoidVisualLayersExtension.cs +++ b/Content.Shared/Humanoid/HumanoidVisualLayersExtension.cs @@ -47,18 +47,30 @@ public static IEnumerable Sublayers(HumanoidVisualLayers l yield return HumanoidVisualLayers.LArm; yield return HumanoidVisualLayers.LHand; break; + case HumanoidVisualLayers.LHand: // _CorvaxNext: surgery + yield return HumanoidVisualLayers.LHand; + break; case HumanoidVisualLayers.RArm: yield return HumanoidVisualLayers.RArm; yield return HumanoidVisualLayers.RHand; break; + case HumanoidVisualLayers.RHand: // _CorvaxNext: surgery + yield return HumanoidVisualLayers.RHand; + break; case HumanoidVisualLayers.LLeg: yield return HumanoidVisualLayers.LLeg; yield return HumanoidVisualLayers.LFoot; break; + case HumanoidVisualLayers.LFoot: // _CorvaxNext: surgery + yield return HumanoidVisualLayers.LFoot; + break; case HumanoidVisualLayers.RLeg: yield return HumanoidVisualLayers.RLeg; yield return HumanoidVisualLayers.RFoot; break; + case HumanoidVisualLayers.RFoot: // _CorvaxNext: surgery + yield return HumanoidVisualLayers.RFoot; + break; case HumanoidVisualLayers.Chest: yield return HumanoidVisualLayers.Chest; yield return HumanoidVisualLayers.Tail; diff --git a/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs b/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs index 4f011cba982..3df780c177b 100644 --- a/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs +++ b/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs @@ -1,5 +1,6 @@ using System.IO; using System.Linq; +using System.Numerics; using Content.Corvax.Interfaces.Shared; using Content.Shared.CCVar; using Content.Shared.Decals; @@ -7,6 +8,7 @@ using Content.Shared.Humanoid.Markings; using Content.Shared.Humanoid.Prototypes; using Content.Shared.Corvax.TTS; +using Content.Shared.Humanoid.Events; using Content.Shared.IdentityManagement; using Content.Shared.Preferences; using Robust.Shared; @@ -401,7 +403,7 @@ public virtual void LoadProfile(EntityUid uid, HumanoidCharacterProfile? profile } humanoid.Age = profile.Age; - + Dirty(uid, humanoid); } diff --git a/Content.Shared/Input/ContentKeyFunctions.cs b/Content.Shared/Input/ContentKeyFunctions.cs index b34fdab30f2..bd98f514470 100644 --- a/Content.Shared/Input/ContentKeyFunctions.cs +++ b/Content.Shared/Input/ContentKeyFunctions.cs @@ -60,6 +60,12 @@ public static class ContentKeyFunctions public static readonly BoundKeyFunction ZoomOut = "ZoomOut"; public static readonly BoundKeyFunction ZoomIn = "ZoomIn"; public static readonly BoundKeyFunction ResetZoom = "ResetZoom"; + public static readonly BoundKeyFunction TargetHead = "TargetHead"; // _CorvaxNext: surgery + public static readonly BoundKeyFunction TargetTorso = "TargetTorso"; // _CorvaxNext: surgery + public static readonly BoundKeyFunction TargetLeftArm = "TargetLeftArm"; // _CorvaxNext: surgery + public static readonly BoundKeyFunction TargetRightArm = "TargetRightArm"; // _CorvaxNext: surgery + public static readonly BoundKeyFunction TargetLeftLeg = "TargetLeftLeg"; // _CorvaxNext: surgery + public static readonly BoundKeyFunction TargetRightLeg = "TargetRightLeg"; // _CorvaxNext: surgery public static readonly BoundKeyFunction ArcadeUp = "ArcadeUp"; public static readonly BoundKeyFunction ArcadeDown = "ArcadeDown"; diff --git a/Content.Shared/Inventory/InventoryComponent.cs b/Content.Shared/Inventory/InventoryComponent.cs index 629cf1169c4..db761ad693b 100644 --- a/Content.Shared/Inventory/InventoryComponent.cs +++ b/Content.Shared/Inventory/InventoryComponent.cs @@ -15,6 +15,7 @@ public sealed partial class InventoryComponent : Component [DataField("speciesId")] public string? SpeciesId { get; set; } public SlotDefinition[] Slots = Array.Empty(); + public ContainerSlot[] Containers = Array.Empty(); [DataField] diff --git a/Content.Shared/Inventory/InventorySystem.Slots.cs b/Content.Shared/Inventory/InventorySystem.Slots.cs index 2522dd5d0a3..86d175cefb5 100644 --- a/Content.Shared/Inventory/InventorySystem.Slots.cs +++ b/Content.Shared/Inventory/InventorySystem.Slots.cs @@ -1,17 +1,19 @@ using System.Diagnostics.CodeAnalysis; using Content.Shared.Inventory.Events; using Content.Shared.Storage; +using Content.Shared.Random; using Robust.Shared.Containers; using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.Manager; using Robust.Shared.Utility; namespace Content.Shared.Inventory; - public partial class InventorySystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IViewVariablesManager _vvm = default!; - + [Dependency] private readonly RandomHelperSystem _randomHelper = default!; // _CorvaxNext: surgery + [Dependency] private readonly ISerializationManager _serializationManager = default!; // _CorvaxNext: surgery private void InitializeSlots() { SubscribeLocalEvent(OnInit); @@ -57,7 +59,8 @@ protected virtual void OnInit(EntityUid uid, InventoryComponent component, Compo if (!_prototypeManager.TryIndex(component.TemplateId, out InventoryTemplatePrototype? invTemplate)) return; - component.Slots = invTemplate.Slots; + _serializationManager.CopyTo(invTemplate.Slots, ref component.Slots, notNullableOverride: true); // _CorvaxNext: surgery + component.Containers = new ContainerSlot[component.Slots.Length]; for (var i = 0; i < component.Containers.Length; i++) { @@ -115,7 +118,7 @@ public bool TryGetSlot(EntityUid uid, string slot, [NotNullWhen(true)] out SlotD foreach (var slotDef in inventory.Slots) { - if (!slotDef.Name.Equals(slot)) + if (!slotDef.Name.Equals(slot) || slotDef.Disabled) // _CorvaxNext: surgery continue; slotDefinition = slotDef; return true; @@ -170,6 +173,37 @@ private IEnumerable ListViewVariablesSlots(EntityUid uid, InventoryCompo } } + // start-_CorvaxNext: surgery + public void SetSlotStatus(EntityUid uid, string slotName, bool isDisabled, InventoryComponent? inventory = null) + { + if (!Resolve(uid, ref inventory)) + return; + + foreach (var slot in inventory.Slots) + { + if (slot.Name != slotName) + continue; + + + if (!TryGetSlotContainer(uid, slotName, out var container, out _, inventory)) + break; + + if (isDisabled) + { + if (container.ContainedEntity is { } entityUid && TryComp(entityUid, out TransformComponent? transform) && _gameTiming.IsFirstTimePredicted) + { + _transform.AttachToGridOrMap(entityUid, transform); + _randomHelper.RandomOffset(entityUid, 0.5f); + } + } + slot.Disabled = isDisabled; + break; + } + + Dirty(uid, inventory); + } + // end-_CorvaxNext: surgery + /// /// Enumerator for iterating over an inventory's slot containers. Also has methods that skip empty containers. /// It should be safe to add or remove items while enumerating. @@ -203,7 +237,7 @@ public bool MoveNext([NotNullWhen(true)] out ContainerSlot? container) var i = _nextIdx++; var slot = _slots[i]; - if ((slot.SlotFlags & _flags) == 0) + if ((slot.SlotFlags & _flags) == 0 || slot.Disabled) // _CorvaxNext: surgery continue; container = _containers[i]; @@ -221,7 +255,7 @@ public bool NextItem(out EntityUid item) var i = _nextIdx++; var slot = _slots[i]; - if ((slot.SlotFlags & _flags) == 0) + if ((slot.SlotFlags & _flags) == 0 || slot.Disabled) // _CorvaxNext: surgery continue; var container = _containers[i]; diff --git a/Content.Shared/Inventory/InventoryTemplatePrototype.cs b/Content.Shared/Inventory/InventoryTemplatePrototype.cs index a4d77767e37..428b5fd505f 100644 --- a/Content.Shared/Inventory/InventoryTemplatePrototype.cs +++ b/Content.Shared/Inventory/InventoryTemplatePrototype.cs @@ -55,4 +55,11 @@ public sealed partial class SlotDefinition /// Entity blacklist for CanEquip checks. /// [DataField("blacklist")] public EntityWhitelist? Blacklist = null; + + // start-_CorvaxNext: surgery + /// + /// Is this slot disabled? Could be due to severing or other reasons. + /// + [DataField] public bool Disabled; + // end-_CorvaxNext: surgery } diff --git a/Content.Shared/MedicalScanner/HealthAnalyzerScannedUserMessage.cs b/Content.Shared/MedicalScanner/HealthAnalyzerScannedUserMessage.cs index 08af1a36a7b..1bb203c434e 100644 --- a/Content.Shared/MedicalScanner/HealthAnalyzerScannedUserMessage.cs +++ b/Content.Shared/MedicalScanner/HealthAnalyzerScannedUserMessage.cs @@ -1,3 +1,5 @@ +using Content.Shared._CorvaxNext.Targeting; +using Content.Shared.Body.Components; using Robust.Shared.Serialization; namespace Content.Shared.MedicalScanner; @@ -14,8 +16,10 @@ public sealed class HealthAnalyzerScannedUserMessage : BoundUserInterfaceMessage public bool? ScanMode; public bool? Bleeding; public bool? Unrevivable; + public Dictionary? Body; // _CorvaxNext: surgery + public NetEntity? Part; // _CorvaxNext: surgery - public HealthAnalyzerScannedUserMessage(NetEntity? targetEntity, float temperature, float bloodLevel, bool? scanMode, bool? bleeding, bool? unrevivable) + public HealthAnalyzerScannedUserMessage(NetEntity? targetEntity, float temperature, float bloodLevel, bool? scanMode, bool? bleeding, bool? unrevivable, Dictionary? body, NetEntity? part = null) { TargetEntity = targetEntity; Temperature = temperature; @@ -23,6 +27,17 @@ public HealthAnalyzerScannedUserMessage(NetEntity? targetEntity, float temperatu ScanMode = scanMode; Bleeding = bleeding; Unrevivable = unrevivable; + Body = body; // _CorvaxNext: surgery + Part = part; // _CorvaxNext: surgery } } +// start-_CorvaxNext: surgery +[Serializable, NetSerializable] +public sealed class HealthAnalyzerPartMessage(NetEntity? owner, TargetBodyPart? bodyPart) : BoundUserInterfaceMessage +{ + public readonly NetEntity? Owner = owner; + public readonly TargetBodyPart? BodyPart = bodyPart; + +} +// end-_CorvaxNext: surgery diff --git a/Content.Shared/Mobs/Systems/MobStateSystem.StateMachine.cs b/Content.Shared/Mobs/Systems/MobStateSystem.StateMachine.cs index 5928b3871ff..7cf68883f0c 100644 --- a/Content.Shared/Mobs/Systems/MobStateSystem.StateMachine.cs +++ b/Content.Shared/Mobs/Systems/MobStateSystem.StateMachine.cs @@ -1,4 +1,5 @@ -using Content.Shared.Database; +using Content.Shared._CorvaxNext.Surgery.Body; +using Content.Shared.Database; using Content.Shared.Mobs.Components; namespace Content.Shared.Mobs.Systems; @@ -103,6 +104,11 @@ private void ChangeState(EntityUid target, MobStateComponent component, MobState if (oldState == newState || !component.AllowedStates.Contains(newState)) return; + // start-_CorvaxNext: surgery + if (oldState == MobState.Dead && HasComp(target)) + return; + // end-_CorvaxNext: surgery + OnExitState(target, component, oldState); component.CurrentState = newState; OnEnterState(target, component, newState); diff --git a/Content.Shared/StatusEffect/StatusEffectsSystem.cs b/Content.Shared/StatusEffect/StatusEffectsSystem.cs index 95abea63db0..bb83bd3caee 100644 --- a/Content.Shared/StatusEffect/StatusEffectsSystem.cs +++ b/Content.Shared/StatusEffect/StatusEffectsSystem.cs @@ -44,7 +44,7 @@ public override void Update(float frameTime) continue; } - foreach (var state in status.ActiveEffects) + foreach (var state in status.ActiveEffects.ToArray()) { if (curTime > state.Value.Cooldown.Item2) TryRemoveStatusEffect(uid, state.Key, status); diff --git a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs index 212c03475cf..c7d1a129f48 100644 --- a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs +++ b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs @@ -72,7 +72,7 @@ public sealed partial class MeleeWeaponComponent : Component /// [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public bool ResistanceBypass = false; - + /// /// Base damage for this weapon. Can be modified via heavy damage or other means. /// @@ -90,6 +90,14 @@ public sealed partial class MeleeWeaponComponent : Component [ViewVariables(VVAccess.ReadWrite), DataField] public FixedPoint2 ClickDamageModifier = FixedPoint2.New(1); + // start-_CorvaxNext: surgery + /// + /// Part damage is multiplied by this amount for single-target attacks + /// + [DataField, AutoNetworkedField] + public float ClickPartDamageMultiplier = 1.00f; + // end-_CorvaxNext: surgery + // TODO: Temporarily 1.5 until interactionoutline is adjusted to use melee, then probably drop to 1.2 /// /// Nearest edge range to hit an entity. @@ -97,6 +105,26 @@ public sealed partial class MeleeWeaponComponent : Component [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] public float Range = 1.5f; + // start-_CorvaxNext: surgery + /// + /// Attack range for heavy swings + /// + [DataField, AutoNetworkedField] + public float HeavyRangeModifier = 1f; + + /// + /// Weapon damage is multiplied by this amount for heavy swings + /// + [DataField, AutoNetworkedField] + public float HeavyDamageBaseModifier = 1.2f; + + /// + /// Part damage is multiplied by this amount for heavy swings + /// + [DataField, AutoNetworkedField] + public float HeavyPartDamageMultiplier = 0.5f; + // end-_CorvaxNext: surgery + /// /// Total width of the angle for wide attacks. /// diff --git a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs index 767b5c4ef62..fd6c5215c60 100644 --- a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs +++ b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs @@ -511,7 +511,7 @@ protected virtual void DoLightAttack(EntityUid user, LightAttackEvent ev, Entity RaiseLocalEvent(target.Value, attackedEvent); var modifiedDamage = DamageSpecifier.ApplyModifierSets(damage + hitEvent.BonusDamage + attackedEvent.BonusDamage, hitEvent.ModifiersList); - var damageResult = Damageable.TryChangeDamage(target, modifiedDamage, origin:user, ignoreResistances:resistanceBypass); + var damageResult = Damageable.TryChangeDamage(target, modifiedDamage, origin: user, ignoreResistances:resistanceBypass, partMultiplier: component.ClickPartDamageMultiplier); if (damageResult is {Empty: false}) { @@ -666,7 +666,7 @@ private bool DoHeavyAttack(EntityUid user, HeavyAttackEvent ev, EntityUid meleeU RaiseLocalEvent(entity, attackedEvent); var modifiedDamage = DamageSpecifier.ApplyModifierSets(damage + hitEvent.BonusDamage + attackedEvent.BonusDamage, hitEvent.ModifiersList); - var damageResult = Damageable.TryChangeDamage(entity, modifiedDamage, origin:user); + var damageResult = Damageable.TryChangeDamage(entity, modifiedDamage, origin: user, partMultiplier: component.HeavyPartDamageMultiplier); if (damageResult != null && damageResult.GetTotal() > FixedPoint2.Zero) { diff --git a/Content.Shared/_CorvaxNext/NextVars.cs b/Content.Shared/_CorvaxNext/NextVars.cs index 5d232025ae7..9b3323e71e7 100644 --- a/Content.Shared/_CorvaxNext/NextVars.cs +++ b/Content.Shared/_CorvaxNext/NextVars.cs @@ -14,4 +14,14 @@ public sealed class NextVars /// public static readonly CVarDef OfferModeIndicatorsPointShow = CVarDef.Create("hud.offer_mode_indicators_point_show", true, CVar.ARCHIVE | CVar.CLIENTONLY); + + /// + /// _CorvaxNext Surgery cvars + /// + #region Surgery + + public static readonly CVarDef CanOperateOnSelf = + CVarDef.Create("surgery.can_operate_on_self", false, CVar.SERVERONLY); + + #endregion } diff --git a/Content.Shared/_CorvaxNext/Surgery/Body/AmputateAttemptEvent.cs b/Content.Shared/_CorvaxNext/Surgery/Body/AmputateAttemptEvent.cs new file mode 100644 index 00000000000..b71a0407bf2 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Body/AmputateAttemptEvent.cs @@ -0,0 +1,7 @@ +namespace Content.Shared.Body.Events; + +/// +/// Raised on an entity when attempting to remove a body part. +/// +[ByRefEvent] +public readonly record struct AmputateAttemptEvent(EntityUid Part); diff --git a/Content.Shared/_CorvaxNext/Surgery/Body/BodyPartAppearanceComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Body/BodyPartAppearanceComponent.cs new file mode 100644 index 00000000000..31165801f38 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Body/BodyPartAppearanceComponent.cs @@ -0,0 +1,44 @@ +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Prototypes; +using Content.Shared.Humanoid.Markings; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; +using Robust.Shared.GameStates; + +namespace Content.Shared.Body.Part; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] +public sealed partial class BodyPartAppearanceComponent : Component +{ + /// + /// HumanoidVisualLayer type for this body part. + /// + [DataField, AutoNetworkedField] + public HumanoidVisualLayers Type { get; set; } + + /// + /// Relevant markings for this body part that will be applied on attachment. + /// + [DataField, AutoNetworkedField] + public Dictionary> Markings = new(); + + /// + /// ID of this custom base layer. Must be a . + /// + [DataField(customTypeSerializer: typeof(PrototypeIdSerializer)), AutoNetworkedField] + public string? ID { get; set; } + + /// + /// Color of this custom base layer. Null implies skin colour if the corresponding is set to match skin. + /// + [DataField, AutoNetworkedField] + public Color? Color { get; set; } + + /// + /// Color of this custom base eye layer. Null implies eye colour if the corresponding is set to match skin. + /// + [DataField, AutoNetworkedField] + public Color? EyeColor { get; set; } + + [DataField, AutoNetworkedField] + public EntityUid? OriginalBody { get; set; } +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Body/DebrainedComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Body/DebrainedComponent.cs new file mode 100644 index 00000000000..dae95a87243 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Body/DebrainedComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Body; + +[RegisterComponent] +public sealed partial class DebrainedComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Body/Organs/EarsComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Body/Organs/EarsComponent.cs new file mode 100644 index 00000000000..006d4243951 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Body/Organs/EarsComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Body.Organs; + +[RegisterComponent] +public sealed partial class EarsComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Body/Organs/EyesComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Body/Organs/EyesComponent.cs new file mode 100644 index 00000000000..f96cba4d616 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Body/Organs/EyesComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Body.Organs; + +[RegisterComponent] +public sealed partial class EyesComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Body/Organs/HeartComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Body/Organs/HeartComponent.cs new file mode 100644 index 00000000000..55ea025d1dd --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Body/Organs/HeartComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Body.Organs; + +[RegisterComponent] +public sealed partial class HeartComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Body/Organs/LiverComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Body/Organs/LiverComponent.cs new file mode 100644 index 00000000000..4001ece74b1 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Body/Organs/LiverComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Body.Organs; + +[RegisterComponent] +public sealed partial class LiverComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Body/Organs/MarkingContainerComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Body/Organs/MarkingContainerComponent.cs new file mode 100644 index 00000000000..a07de8614fb --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Body/Organs/MarkingContainerComponent.cs @@ -0,0 +1,15 @@ +// This is a uh, very shitty copout to not wanting to modify the prototypes for felinids, and entities at large so they have ears. +// I will do that at some point, for now I just want the funny surgery to work lol. +using Robust.Shared.GameStates; +using Content.Shared.Humanoid.Markings; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Shared._CorvaxNext.Surgery.Body.Organs; + +[RegisterComponent, NetworkedComponent] +public sealed partial class MarkingContainerComponent : Component +{ + [DataField(required: true, customTypeSerializer: typeof(PrototypeIdSerializer))] + public string Marking = default!; + +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Body/SharedBodySystem.PartAppearance.cs b/Content.Shared/_CorvaxNext/Surgery/Body/SharedBodySystem.PartAppearance.cs new file mode 100644 index 00000000000..9ec90434327 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Body/SharedBodySystem.PartAppearance.cs @@ -0,0 +1,194 @@ +using System.Diagnostics; +using System.Linq; +using Content.Shared.Body.Components; +using Content.Shared.Body.Part; +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Markings; +using Content.Shared.Humanoid.Prototypes; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Shared.Body.Systems; + +public partial class SharedBodySystem +{ + [Dependency] private readonly SharedHumanoidAppearanceSystem _humanoid = default!; + [Dependency] private readonly MarkingManager _markingManager = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + private void InitializePartAppearances() + { + base.Initialize(); + + SubscribeLocalEvent(OnPartAppearanceStartup); + SubscribeLocalEvent(HandleState); + SubscribeLocalEvent(OnPartAttachedToBody); + SubscribeLocalEvent(OnPartDroppedFromBody); + } + + private void OnPartAppearanceStartup(EntityUid uid, BodyPartAppearanceComponent component, ComponentStartup args) + { + if (!TryComp(uid, out BodyPartComponent? part) + || part.ToHumanoidLayers() is not { } relevantLayer) + return; + + if (part.OriginalBody == null + || TerminatingOrDeleted(part.OriginalBody.Value) + || !TryComp(part.OriginalBody.Value, out HumanoidAppearanceComponent? bodyAppearance)) + { + //component.ID = part.BaseLayerId; + component.Type = relevantLayer; + return; + } + + var customLayers = bodyAppearance.CustomBaseLayers; + var spriteLayers = bodyAppearance.BaseLayers; + component.Type = relevantLayer; + component.OriginalBody = part.OriginalBody.Value; + + part.Species = bodyAppearance.Species; + + if (customLayers.ContainsKey(component.Type)) + { + component.ID = customLayers[component.Type].Id; + component.Color = customLayers[component.Type].Color; + } + else if (spriteLayers.ContainsKey(component.Type)) + { + component.ID = spriteLayers[component.Type].ID; + component.Color = bodyAppearance.SkinColor; + } + else + { + component.ID = CreateIdFromPart(bodyAppearance, relevantLayer); + component.Color = bodyAppearance.SkinColor; + } + + // I HATE HARDCODED CHECKS I HATE HARDCODED CHECKS I HATE HARDCODED CHECKS + if (part.PartType == BodyPartType.Head) + component.EyeColor = bodyAppearance.EyeColor; + + var markingsByLayer = new Dictionary>(); + + foreach (var layer in HumanoidVisualLayersExtension.Sublayers(relevantLayer)) + { + var category = MarkingCategoriesConversion.FromHumanoidVisualLayers(layer); + if (bodyAppearance.MarkingSet.Markings.TryGetValue(category, out var markingList)) + markingsByLayer[layer] = + markingList.Select(m => new Marking(m.MarkingId, m.MarkingColors.ToList())).ToList(); + } + + component.Markings = markingsByLayer; + } + + private string? CreateIdFromPart(HumanoidAppearanceComponent bodyAppearance, HumanoidVisualLayers part) + { + var speciesProto = _prototypeManager.Index(bodyAppearance.Species); + var baseSprites = _prototypeManager.Index(speciesProto.SpriteSet); + + if (!baseSprites.Sprites.ContainsKey(part)) + return null; + + return HumanoidVisualLayersExtension.GetSexMorph(part, bodyAppearance.Sex, baseSprites.Sprites[part]); + } + + public void ModifyMarkings(EntityUid uid, + Entity partAppearance, + HumanoidAppearanceComponent bodyAppearance, + HumanoidVisualLayers targetLayer, + string markingId, + bool remove = false) + { + + if (!Resolve(partAppearance, ref partAppearance.Comp)) + return; + + if (!remove) + { + + if (!_markingManager.Markings.TryGetValue(markingId, out var prototype)) + return; + + var markingColors = MarkingColoring.GetMarkingLayerColors( + prototype, + bodyAppearance.SkinColor, + bodyAppearance.EyeColor, + bodyAppearance.MarkingSet + ); + + var marking = new Marking(markingId, markingColors); + + _humanoid.SetLayerVisibility(uid, targetLayer, true, true, bodyAppearance); + _humanoid.AddMarking(uid, markingId, markingColors, true, true, bodyAppearance); + if (!partAppearance.Comp.Markings.ContainsKey(targetLayer)) + partAppearance.Comp.Markings[targetLayer] = new List(); + + partAppearance.Comp.Markings[targetLayer].Add(marking); + } + //else + //RemovePartMarkings(uid, component, bodyAppearance); + } + + private void HandleState(EntityUid uid, BodyPartAppearanceComponent component, ref AfterAutoHandleStateEvent args) => + ApplyPartMarkings(uid, component); + + private void OnPartAttachedToBody(EntityUid uid, BodyComponent component, ref BodyPartAttachedEvent args) + { + if (!TryComp(args.Part, out BodyPartAppearanceComponent? partAppearance) + || !TryComp(uid, out HumanoidAppearanceComponent? bodyAppearance)) + return; + + if (partAppearance.ID != null) + _humanoid.SetBaseLayerId(uid, partAppearance.Type, partAppearance.ID, sync: true, bodyAppearance); + + UpdateAppearance(uid, partAppearance); + } + + private void OnPartDroppedFromBody(EntityUid uid, BodyComponent component, ref BodyPartDroppedEvent args) + { + if (TerminatingOrDeleted(uid) + || !TryComp(args.Part, out BodyPartAppearanceComponent? appearance)) + return; + + RemoveAppearance(uid, appearance, args.Part); + } + + protected void UpdateAppearance(EntityUid target, + BodyPartAppearanceComponent component) + { + if (!TryComp(target, out HumanoidAppearanceComponent? bodyAppearance)) + return; + + if (component.EyeColor != null) + bodyAppearance.EyeColor = component.EyeColor.Value; + + if (component.Color != null) + _humanoid.SetBaseLayerColor(target, component.Type, component.Color, true, bodyAppearance); + + _humanoid.SetLayerVisibility(target, component.Type, true, true, bodyAppearance); + + foreach (var (visualLayer, markingList) in component.Markings) + { + _humanoid.SetLayerVisibility(target, visualLayer, true, true, bodyAppearance); + foreach (var marking in markingList) + _humanoid.AddMarking(target, marking.MarkingId, marking.MarkingColors, false, true, bodyAppearance); + } + + Dirty(target, bodyAppearance); + } + + protected void RemoveAppearance(EntityUid entity, BodyPartAppearanceComponent component, EntityUid partEntity) + { + if (!TryComp(entity, out HumanoidAppearanceComponent? bodyAppearance)) + return; + + foreach (var (visualLayer, markingList) in component.Markings) + { + _humanoid.SetLayerVisibility(entity, visualLayer, false, true, bodyAppearance); + } + RemoveBodyMarkings(entity, component, bodyAppearance); + } + + protected abstract void ApplyPartMarkings(EntityUid target, BodyPartAppearanceComponent component); + + protected abstract void RemoveBodyMarkings(EntityUid target, BodyPartAppearanceComponent partAppearance, HumanoidAppearanceComponent bodyAppearance); +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Body/SharedBodySystem.Targeting.cs b/Content.Shared/_CorvaxNext/Surgery/Body/SharedBodySystem.Targeting.cs new file mode 100644 index 00000000000..503b77910e3 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Body/SharedBodySystem.Targeting.cs @@ -0,0 +1,500 @@ +using System.Linq; +using Content.Shared.Body.Components; +using Content.Shared.Body.Part; +using Content.Shared.Damage; +using Content.Shared.Mobs.Components; +using Content.Shared.IdentityManagement; +using Content.Shared.Mobs.Systems; +using Content.Shared.Popups; +using Content.Shared.Standing; +using Content.Shared._CorvaxNext.Targeting; +using Robust.Shared.CPUJob.JobQueues; +using Robust.Shared.CPUJob.JobQueues.Queues; +using Robust.Shared.Network; +using Robust.Shared.Random; +using Robust.Shared.Timing; +using System.Threading; +using System.Threading.Tasks; +using Content.Shared._CorvaxNext.Surgery.Steps.Parts; +using Content.Shared.Damage.Prototypes; +using Content.Shared.FixedPoint; + +// ReSharper disable once CheckNamespace +namespace Content.Shared.Body.Systems; + +public partial class SharedBodySystem +{ + [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + + private readonly string[] _severingDamageTypes = { "Slash", "Pierce", "Blunt" }; + + private const double IntegrityJobTime = 0.005; + private readonly JobQueue _integrityJobQueue = new(IntegrityJobTime); + public sealed class IntegrityJob : Job + { + private readonly SharedBodySystem _self; + private readonly Entity _ent; + public IntegrityJob(SharedBodySystem self, Entity ent, double maxTime, CancellationToken cancellation = default) : base(maxTime, cancellation) + { + _self = self; + _ent = ent; + } + + public IntegrityJob(SharedBodySystem self, Entity ent, double maxTime, IStopwatch stopwatch, CancellationToken cancellation = default) : base(maxTime, stopwatch, cancellation) + { + _self = self; + _ent = ent; + } + + protected override Task Process() + { + _self.ProcessIntegrityTick(_ent); + + return Task.FromResult(null); + } + } + + private EntityQuery _queryTargeting; + private void InitializeBkm() + { + _queryTargeting = GetEntityQuery(); + SubscribeLocalEvent(OnBeforeDamageChanged); + SubscribeLocalEvent(OnBodyDamageModify); + SubscribeLocalEvent(OnPartDamageModify); + SubscribeLocalEvent(OnDamageChanged); + } + + public DamageSpecifier GetHealingSpecifier(BodyPartComponent part) + { + var damage = new DamageSpecifier() + { + DamageDict = new Dictionary() + { + { "Blunt", -part.SelfHealingAmount }, + { "Slash", -part.SelfHealingAmount }, + { "Piercing", -part.SelfHealingAmount }, + { "Heat", -part.SelfHealingAmount }, + { "Cold", -part.SelfHealingAmount }, + { "Shock", -part.SelfHealingAmount }, + { "Caustic", -part.SelfHealingAmount * 0.1}, // not much caustic healing + } + }; + + return damage; + } + + private void ProcessIntegrityTick(Entity entity) + { + if (!TryComp(entity, out var damageable)) + return; + + var damage = damageable.TotalDamage; + + if (entity.Comp is { Body: { } body } + && damage > entity.Comp.MinIntegrity + && damage <= entity.Comp.IntegrityThresholds[TargetIntegrity.HeavilyWounded] + && _queryTargeting.HasComp(body) + && !_mobState.IsDead(body)) + _damageable.TryChangeDamage(entity, GetHealingSpecifier(entity), canSever: false, targetPart: GetTargetBodyPart(entity)); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + _integrityJobQueue.Process(); + + if (!_timing.IsFirstTimePredicted) + return; + + using var query = EntityQueryEnumerator(); + while (query.MoveNext(out var ent, out var part)) + { + part.HealingTimer += frameTime; + + if (part.HealingTimer >= part.HealingTime) + { + part.HealingTimer = 0; + _integrityJobQueue.EnqueueJob(new IntegrityJob(this, (ent, part), IntegrityJobTime)); + } + } + } + + private void OnBeforeDamageChanged(Entity ent, ref BeforeDamageChangedEvent args) + { + // If our target has a TargetingComponent, that means they will take limb damage + // And if their attacker also has one, then we use that part. + if (_queryTargeting.TryComp(ent, out var targetEnt)) + { + var damage = args.Damage; + TargetBodyPart? targetPart = null; + + if (args.TargetPart != null) + { + targetPart = args.TargetPart; + } + else if (args.Origin.HasValue && _queryTargeting.TryComp(args.Origin.Value, out var targeter)) + { + targetPart = targeter.Target; + // If the target is Torso then have a 33% chance to hit another part + if (targetPart.Value == TargetBodyPart.Torso) + { + var additionalPart = GetRandomPartSpread(_random, 10); + targetPart = targetPart.Value | additionalPart; + } + } + else + { + // If there's an origin in this case, that means it comes from an entity without TargetingComponent, + // such as an animal, so we attack a random part. + if (args.Origin.HasValue) + { + targetPart = GetRandomBodyPart(ent, targetEnt); + } + // Otherwise we damage all parts equally (barotrauma, explosions, etc). + else if (damage != null) + { + // Division by 2 cuz damaging all parts by the same damage by default is too much. + damage /= 2; + targetPart = TargetBodyPart.All; + } + } + + if (targetPart == null) + return; + + if (!TryChangePartDamage(ent, args.Damage, args.CanSever, args.CanEvade, args.PartMultiplier, targetPart.Value) + && args.CanEvade) + { + _popup.PopupEntity(Loc.GetString("surgery-part-damage-evaded", ("user", Identity.Entity(ent, EntityManager))), ent); + args.Evaded = true; + } + } + } + + private void OnBodyDamageModify(Entity bodyEnt, ref DamageModifyEvent args) + { + if (args.TargetPart != null) + { + var (targetType, _) = ConvertTargetBodyPart(args.TargetPart.Value); + args.Damage = args.Damage * GetPartDamageModifier(targetType); + } + } + + private void OnPartDamageModify(Entity partEnt, ref DamageModifyEvent args) + { + if (partEnt.Comp.Body != null + && TryComp(partEnt.Comp.Body.Value, out DamageableComponent? damageable) + && damageable.DamageModifierSetId != null + && _prototypeManager.TryIndex(damageable.DamageModifierSetId, out var modifierSet)) + // TODO: We need to add a check to see if the given armor covers this part to cancel or not. + args.Damage = DamageSpecifier.ApplyModifierSet(args.Damage, modifierSet); + + if (_prototypeManager.TryIndex("PartDamage", out var partModifierSet)) + args.Damage = DamageSpecifier.ApplyModifierSet(args.Damage, partModifierSet); + + args.Damage = args.Damage * GetPartDamageModifier(partEnt.Comp.PartType); + } + + private bool TryChangePartDamage(EntityUid entity, + DamageSpecifier damage, + bool canSever, + bool canEvade, + float partMultiplier, + TargetBodyPart targetParts) + { + var landed = false; + var targets = SharedTargetingSystem.GetValidParts(); + foreach (var target in targets) + { + if (!targetParts.HasFlag(target)) + continue; + + var (targetType, targetSymmetry) = ConvertTargetBodyPart(target); + if (GetBodyChildrenOfType(entity, targetType, symmetry: targetSymmetry) is { } part) + { + if (canEvade && TryEvadeDamage(part.FirstOrDefault().Id, GetEvadeChance(targetType))) + continue; + + var damageResult = _damageable.TryChangeDamage(part.FirstOrDefault().Id, damage * partMultiplier, canSever: canSever); + if (damageResult != null && damageResult.GetTotal() != 0) + landed = true; + } + } + + return landed; + } + + private void OnDamageChanged(Entity partEnt, ref DamageChangedEvent args) + { + if (!TryComp(partEnt, out var damageable)) + return; + + var severed = false; + var partIdSlot = GetParentPartAndSlotOrNull(partEnt)?.Slot; + var delta = args.DamageDelta; + + if (args.CanSever + && partIdSlot is not null + && delta != null + && !HasComp(partEnt) + && !partEnt.Comp.Enabled + && damageable.TotalDamage >= partEnt.Comp.SeverIntegrity + && _severingDamageTypes.Any(damageType => delta.DamageDict.TryGetValue(damageType, out var value) && value > 0)) + severed = true; + + CheckBodyPart(partEnt, GetTargetBodyPart(partEnt), severed, damageable); + + if (severed) + DropPart(partEnt); + + Dirty(partEnt, partEnt.Comp); + } + + /// + /// Gets the random body part rolling a number between 1 and 9, and returns + /// Torso if the result is 9 or more. The higher torsoWeight is, the higher chance to return it. + /// By default, the chance to return Torso is 50%. + /// + private static TargetBodyPart GetRandomPartSpread(IRobustRandom random, ushort torsoWeight = 9) + { + const int targetPartsAmount = 9; + // 5 = amount of target parts except Torso + return random.Next(1, targetPartsAmount + torsoWeight) switch + { + 1 => TargetBodyPart.Head, + 2 => TargetBodyPart.RightArm, + 3 => TargetBodyPart.RightHand, + 4 => TargetBodyPart.LeftArm, + 5 => TargetBodyPart.LeftHand, + 6 => TargetBodyPart.RightLeg, + 7 => TargetBodyPart.RightFoot, + 8 => TargetBodyPart.LeftLeg, + 9 => TargetBodyPart.LeftFoot, + _ => TargetBodyPart.Torso, + }; + } + + public TargetBodyPart? GetRandomBodyPart(EntityUid uid, TargetingComponent? target = null) + { + if (!Resolve(uid, ref target)) + return null; + + var totalWeight = target.TargetOdds.Values.Sum(); + var randomValue = _random.NextFloat() * totalWeight; + + foreach (var (part, weight) in target.TargetOdds) + { + if (randomValue <= weight) + return part; + randomValue -= weight; + } + + return TargetBodyPart.Torso; // Default to torso if something goes wrong + } + + /// This should be called after body part damage was changed. + /// + protected void CheckBodyPart( + Entity partEnt, + TargetBodyPart? targetPart, + bool severed, + DamageableComponent? damageable = null) + { + if (!Resolve(partEnt, ref damageable)) + return; + + var integrity = damageable.TotalDamage; + + // KILL the body part + if (partEnt.Comp.Enabled && integrity >= partEnt.Comp.IntegrityThresholds[TargetIntegrity.CriticallyWounded]) + { + var ev = new BodyPartEnableChangedEvent(false); + RaiseLocalEvent(partEnt, ref ev); + } + + // LIVE the body part + if (!partEnt.Comp.Enabled && integrity <= partEnt.Comp.IntegrityThresholds[partEnt.Comp.EnableIntegrity] && !severed) + { + var ev = new BodyPartEnableChangedEvent(true); + RaiseLocalEvent(partEnt, ref ev); + } + + if (_queryTargeting.TryComp(partEnt.Comp.Body, out var targeting) + && HasComp(partEnt.Comp.Body)) + { + var newIntegrity = GetIntegrityThreshold(partEnt.Comp, integrity.Float(), severed); + // We need to check if the part is dead to prevent the UI from showing dead parts as alive. + if (targetPart is not null && + targeting.BodyStatus.ContainsKey(targetPart.Value) && + targeting.BodyStatus[targetPart.Value] != TargetIntegrity.Dead) + { + targeting.BodyStatus[targetPart.Value] = newIntegrity; + if (targetPart.Value == TargetBodyPart.Torso) + targeting.BodyStatus[TargetBodyPart.Groin] = newIntegrity; + + Dirty(partEnt.Comp.Body.Value, targeting); + } + // Revival events are handled by the server, so we end up being locked to a network event. + // I hope you like the _net.IsServer, Remuchi :) + if (_net.IsServer) + RaiseNetworkEvent(new TargetIntegrityChangeEvent(GetNetEntity(partEnt.Comp.Body.Value)), partEnt.Comp.Body.Value); + } + } + + /// + /// Gets the integrity of all body parts in the entity. + /// + public Dictionary GetBodyPartStatus(EntityUid entityUid) + { + var result = new Dictionary(); + + if (!TryComp(entityUid, out var body)) + return result; + + foreach (var part in SharedTargetingSystem.GetValidParts()) + { + result[part] = TargetIntegrity.Severed; + } + + foreach (var partComponent in GetBodyChildren(entityUid, body)) + { + var targetBodyPart = GetTargetBodyPart(partComponent.Component.PartType, partComponent.Component.Symmetry); + + if (targetBodyPart != null && TryComp(partComponent.Id, out var damageable)) + result[targetBodyPart.Value] = GetIntegrityThreshold(partComponent.Component, damageable.TotalDamage.Float(), false); + } + + // Hardcoded shitcode for Groin :) + result[TargetBodyPart.Groin] = result[TargetBodyPart.Torso]; + + return result; + } + + public TargetBodyPart? GetTargetBodyPart(Entity part) => GetTargetBodyPart(part.Comp.PartType, part.Comp.Symmetry); + public TargetBodyPart? GetTargetBodyPart(BodyPartComponent part) => GetTargetBodyPart(part.PartType, part.Symmetry); + /// + /// Converts Enums from BodyPartType to their Targeting system equivalent. + /// + public TargetBodyPart? GetTargetBodyPart(BodyPartType type, BodyPartSymmetry symmetry) + { + return (type, symmetry) switch + { + (BodyPartType.Head, _) => TargetBodyPart.Head, + (BodyPartType.Torso, _) => TargetBodyPart.Torso, + (BodyPartType.Arm, BodyPartSymmetry.Left) => TargetBodyPart.LeftArm, + (BodyPartType.Arm, BodyPartSymmetry.Right) => TargetBodyPart.RightArm, + (BodyPartType.Hand, BodyPartSymmetry.Left) => TargetBodyPart.LeftHand, + (BodyPartType.Hand, BodyPartSymmetry.Right) => TargetBodyPart.RightHand, + (BodyPartType.Leg, BodyPartSymmetry.Left) => TargetBodyPart.LeftLeg, + (BodyPartType.Leg, BodyPartSymmetry.Right) => TargetBodyPart.RightLeg, + (BodyPartType.Foot, BodyPartSymmetry.Left) => TargetBodyPart.LeftFoot, + (BodyPartType.Foot, BodyPartSymmetry.Right) => TargetBodyPart.RightFoot, + _ => null + }; + } + + /// + /// Converts Enums from Targeting system to their BodyPartType equivalent. + /// + public (BodyPartType Type, BodyPartSymmetry Symmetry) ConvertTargetBodyPart(TargetBodyPart targetPart) + { + return targetPart switch + { + TargetBodyPart.Head => (BodyPartType.Head, BodyPartSymmetry.None), + TargetBodyPart.Torso => (BodyPartType.Torso, BodyPartSymmetry.None), + TargetBodyPart.Groin => (BodyPartType.Torso, BodyPartSymmetry.None), // TODO: Groin is not a part type yet + TargetBodyPart.LeftArm => (BodyPartType.Arm, BodyPartSymmetry.Left), + TargetBodyPart.LeftHand => (BodyPartType.Hand, BodyPartSymmetry.Left), + TargetBodyPart.RightArm => (BodyPartType.Arm, BodyPartSymmetry.Right), + TargetBodyPart.RightHand => (BodyPartType.Hand, BodyPartSymmetry.Right), + TargetBodyPart.LeftLeg => (BodyPartType.Leg, BodyPartSymmetry.Left), + TargetBodyPart.LeftFoot => (BodyPartType.Foot, BodyPartSymmetry.Left), + TargetBodyPart.RightLeg => (BodyPartType.Leg, BodyPartSymmetry.Right), + TargetBodyPart.RightFoot => (BodyPartType.Foot, BodyPartSymmetry.Right), + _ => (BodyPartType.Torso, BodyPartSymmetry.None) + }; + + } + + /// + /// Fetches the damage multiplier for part integrity based on part types. + /// + /// TODO: Serialize this per body part. + public static float GetPartDamageModifier(BodyPartType partType) + { + return partType switch + { + BodyPartType.Head => 0.5f, // 50% damage, necks are hard to cut + BodyPartType.Torso => 1.0f, // 100% damage + BodyPartType.Arm => 0.7f, // 70% damage + BodyPartType.Hand => 0.7f, // 70% damage + BodyPartType.Leg => 0.7f, // 70% damage + BodyPartType.Foot => 0.7f, // 70% damage + }; + } + + /// + /// Fetches the TargetIntegrity equivalent of the current integrity value for the body part. + /// + public static TargetIntegrity GetIntegrityThreshold(BodyPartComponent component, float integrity, bool severed) + { + var enabled = component.Enabled; + + if (severed) + return TargetIntegrity.Severed; + else if (!component.Enabled) + return TargetIntegrity.Disabled; + + var targetIntegrity = TargetIntegrity.Healthy; + foreach (var threshold in component.IntegrityThresholds) + { + if (integrity <= threshold.Value) + targetIntegrity = threshold.Key; + } + + return targetIntegrity; + } + + /// + /// Fetches the chance to evade integrity damage for a body part. + /// Used when the entity is not dead, laying down, or incapacitated. + /// + public static float GetEvadeChance(BodyPartType partType) + { + return partType switch + { + BodyPartType.Head => 0.70f, // 70% chance to evade + BodyPartType.Arm => 0.20f, // 20% chance to evade + BodyPartType.Hand => 0.20f, // 20% chance to evade + BodyPartType.Leg => 0.20f, // 20% chance to evade + BodyPartType.Foot => 0.20f, // 20% chance to evade + BodyPartType.Torso => 0f, // 0% chance to evade + _ => 0f + }; + } + + public bool CanEvadeDamage(Entity uid) + { + if (!Resolve(uid, ref uid.Comp)) + return false; + + return TryComp(uid, out var standingState) + && !_mobState.IsCritical(uid, uid) + && !_mobState.IsDead(uid, uid); + } + + public bool TryEvadeDamage(Entity uid, float evadeChance) + { + if (!Resolve(uid, ref uid.Comp)) + return false; + + if (!CanEvadeDamage(uid)) + return false; + + return _random.NextFloat() < evadeChance; + } +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryCloseIncisionConditionComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryCloseIncisionConditionComponent.cs new file mode 100644 index 00000000000..bab7e405ad5 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryCloseIncisionConditionComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Medical.Surgery.Conditions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryCloseIncisionConditionComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryLarvaConditionComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryLarvaConditionComponent.cs new file mode 100644 index 00000000000..3aac5951c6f --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryLarvaConditionComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Medical.Surgery.Conditions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryLarvaConditionComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryMarkingConditionComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryMarkingConditionComponent.cs new file mode 100644 index 00000000000..f22b1f682e2 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryMarkingConditionComponent.cs @@ -0,0 +1,27 @@ +using Content.Shared.Body.Organ; +using Content.Shared.Humanoid; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Medical.Surgery.Conditions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryMarkingConditionComponent : Component +{ + + [DataField] + public bool Inverse; + + /// + /// The marking category to check for. + /// + [DataField] + public HumanoidVisualLayers MarkingCategory = default!; + + /// + /// Can be either a segment of a marking ID, or an entire ID that will be checked + /// against the entity to validate that the marking is not already present. + /// + [DataField] + public String MatchString = ""; +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryOperatingTableConditionComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryOperatingTableConditionComponent.cs new file mode 100644 index 00000000000..0c43549e669 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryOperatingTableConditionComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Medical.Surgery.Conditions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryOperatingTableConditionComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryOrganConditionComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryOrganConditionComponent.cs new file mode 100644 index 00000000000..c8c475f115a --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryOrganConditionComponent.cs @@ -0,0 +1,18 @@ +using Content.Shared.Body.Organ; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Medical.Surgery.Conditions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryOrganConditionComponent : Component +{ + [DataField] + public ComponentRegistry? Organ; + + [DataField] + public bool Inverse; + + [DataField] + public bool Reattaching; +} \ No newline at end of file diff --git a/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryPartConditionComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryPartConditionComponent.cs new file mode 100644 index 00000000000..08a89eb9e1b --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryPartConditionComponent.cs @@ -0,0 +1,17 @@ +using Content.Shared.Body.Part; +using Robust.Shared.GameStates; + +namespace Content.Shared.Medical.Surgery.Conditions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryPartConditionComponent : Component +{ + [DataField] + public BodyPartType Part; + + [DataField] + public BodyPartSymmetry? Symmetry; + + [DataField] + public bool Inverse; +} \ No newline at end of file diff --git a/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryPartPresentCondition.cs b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryPartPresentCondition.cs new file mode 100644 index 00000000000..608f90ba4cb --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryPartPresentCondition.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Medical.Surgery.Conditions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryPartPresentConditionComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs new file mode 100644 index 00000000000..1ad5025480b --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryPartRemovedConditionComponent.cs @@ -0,0 +1,20 @@ +using Content.Shared.Body.Part; +using Robust.Shared.GameStates; + +namespace Content.Shared.Medical.Surgery.Conditions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryPartRemovedConditionComponent : Component +{ + /// + /// Requires that the parent part can attach a new part to this slot. + /// + [DataField(required: true)] + public string Connection = string.Empty; + + [DataField] + public BodyPartType Part; + + [DataField] + public BodyPartSymmetry? Symmetry; +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryValidEvent.cs b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryValidEvent.cs new file mode 100644 index 00000000000..da769a457ac --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryValidEvent.cs @@ -0,0 +1,9 @@ +using Content.Shared.Body.Part; + +namespace Content.Shared.Medical.Surgery.Conditions; + +/// +/// Raised on the entity that is receiving surgery. +/// +[ByRefEvent] +public record struct SurgeryValidEvent(EntityUid Body, EntityUid Part, bool Cancelled = false, BodyPartType PartType = default, BodyPartSymmetry? Symmetry = default); \ No newline at end of file diff --git a/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryWoundedConditionComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryWoundedConditionComponent.cs new file mode 100644 index 00000000000..2279fcd0440 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Conditions/SurgeryWoundedConditionComponent.cs @@ -0,0 +1,7 @@ +using Content.Shared.Body.Part; +using Robust.Shared.GameStates; + +namespace Content.Shared.Medical.Surgery.Conditions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryWoundedConditionComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_CorvaxNext/Surgery/Effects/Complete/SurgeryCompletedEvent.cs b/Content.Shared/_CorvaxNext/Surgery/Effects/Complete/SurgeryCompletedEvent.cs new file mode 100644 index 00000000000..a0e040fbe7a --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Effects/Complete/SurgeryCompletedEvent.cs @@ -0,0 +1,7 @@ +namespace Content.Shared.Medical.Surgery.Effects.Complete; + +/// +/// Raised on the entity that received the surgery. +/// +[ByRefEvent] +public record struct SurgeryCompletedEvent; \ No newline at end of file diff --git a/Content.Shared/_CorvaxNext/Surgery/Effects/Complete/SurgeryRemoveLarvaComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Effects/Complete/SurgeryRemoveLarvaComponent.cs new file mode 100644 index 00000000000..2077dfa53b8 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Effects/Complete/SurgeryRemoveLarvaComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Medical.Surgery.Effects.Complete; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryRemoveLarvaComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryDamageChangeEffectComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryDamageChangeEffectComponent.cs new file mode 100644 index 00000000000..4752d169a18 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryDamageChangeEffectComponent.cs @@ -0,0 +1,17 @@ +using Content.Shared.Damage; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +namespace Content.Shared._CorvaxNext.Surgery.Effects.Step; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryDamageChangeEffectComponent : Component +{ + [DataField] + public DamageSpecifier Damage = default!; + + [DataField] + public float SleepModifier = 0.5f; + + [DataField] + public bool IsConsumable; +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgerySpecialDamageChangeEffectComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgerySpecialDamageChangeEffectComponent.cs new file mode 100644 index 00000000000..e375865277f --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgerySpecialDamageChangeEffectComponent.cs @@ -0,0 +1,14 @@ +using Content.Shared.Damage; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +namespace Content.Shared.Medical.Surgery.Effects.Step; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgerySpecialDamageChangeEffectComponent : Component +{ + [DataField] + public string DamageType = ""; + + [DataField] + public bool IsConsumable; +} \ No newline at end of file diff --git a/Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryStepCavityEffectComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryStepCavityEffectComponent.cs new file mode 100644 index 00000000000..8a4f5aa2ace --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryStepCavityEffectComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Effects.Step; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryStepCavityEffectComponent : Component +{ + [DataField] + public string Action = "Insert"; +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryStepEmoteEffectComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryStepEmoteEffectComponent.cs new file mode 100644 index 00000000000..6f7f7fefe46 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryStepEmoteEffectComponent.cs @@ -0,0 +1,12 @@ +using Content.Shared.Chat.Prototypes; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CorvaxNext.Surgery.Effects.Step; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class SurgeryStepEmoteEffectComponent : Component +{ + [DataField, AutoNetworkedField] + public ProtoId Emote = "Scream"; +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryStepSpawnEffect.cs b/Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryStepSpawnEffect.cs new file mode 100644 index 00000000000..138a506739a --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryStepSpawnEffect.cs @@ -0,0 +1,13 @@ +using Content.Shared.Chat.Prototypes; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using System.ComponentModel.DataAnnotations; + +namespace Content.Shared._CorvaxNext.Surgery.Effects.Step; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class SurgeryStepSpawnEffectComponent : Component +{ + [DataField(required: true), AutoNetworkedField] + public EntProtoId Entity; +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryTendWoundsEffectComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryTendWoundsEffectComponent.cs new file mode 100644 index 00000000000..b3775fb8afb --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Effects/Step/SurgeryTendWoundsEffectComponent.cs @@ -0,0 +1,20 @@ +using Content.Shared.Damage; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +namespace Content.Shared._CorvaxNext.Surgery.Effects.Step; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class SurgeryTendWoundsEffectComponent : Component +{ + [DataField, AutoNetworkedField] + public string MainGroup = "Brute"; + + [DataField, AutoNetworkedField] + public bool IsAutoRepeatable = true; + + [DataField, AutoNetworkedField] + public DamageSpecifier Damage = default!; + + [DataField, AutoNetworkedField] + public float HealMultiplier = 0.07f; +} diff --git a/Content.Shared/_CorvaxNext/Surgery/OperatingTableComponent.cs b/Content.Shared/_CorvaxNext/Surgery/OperatingTableComponent.cs new file mode 100644 index 00000000000..39546749fff --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/OperatingTableComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery; + +[RegisterComponent, NetworkedComponent] +public sealed partial class OperatingTableComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/SharedSurgerySystem.Steps.cs b/Content.Shared/_CorvaxNext/Surgery/SharedSurgerySystem.Steps.cs new file mode 100644 index 00000000000..faddb67af6c --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/SharedSurgerySystem.Steps.cs @@ -0,0 +1,772 @@ +using Content.Shared.Medical.Surgery.Conditions; +using Content.Shared.Medical.Surgery.Steps; +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Markings; +using Content.Shared.Bed.Sleep; +using Content.Shared.Body.Part; +using Content.Shared.Body.Organ; +using Content.Shared.Body.Events; +using Content.Shared.Buckle.Components; +using Content.Shared.Damage; +using Content.Shared.Damage.Prototypes; +using Content.Shared.DoAfter; +using Content.Shared.IdentityManagement; +using Content.Shared.Inventory; +using Content.Shared.Item; +using Content.Shared.Popups; +using Robust.Shared.Prototypes; +using System.Linq; +using Content.Shared._CorvaxNext.Surgery.Body.Organs; +using Content.Shared._CorvaxNext.Surgery.Effects.Step; +using Content.Shared._CorvaxNext.Surgery.Steps; +using Content.Shared._CorvaxNext.Surgery.Steps.Parts; +using Content.Shared._CorvaxNext.Surgery.Tools; +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Medical.Surgery; + +namespace Content.Shared._CorvaxNext.Surgery; + +public abstract partial class SharedSurgerySystem +{ + private static readonly string[] BruteDamageTypes = { "Slash", "Blunt", "Piercing" }; + private static readonly string[] BurnDamageTypes = { "Heat", "Shock", "Cold", "Caustic" }; + private void InitializeSteps() + { + SubscribeLocalEvent(OnToolStep); + SubscribeLocalEvent(OnToolCheck); + SubscribeLocalEvent(OnToolCanPerform); + + //SubSurgery(OnCutLarvaRootsStep, OnCutLarvaRootsCheck); + + /* Abandon all hope ye who enter here. Now I am become shitcoder, the bloater of files. + On a serious note, I really hate how much bloat this pattern of subscribing to a StepEvent and a CheckEvent + creates in terms of readability. And while Check DOES only run on the server side, it's still annoying to parse through.*/ + + SubSurgery(OnTendWoundsStep, OnTendWoundsCheck); + SubSurgery(OnCavityStep, OnCavityCheck); + SubSurgery(OnAddPartStep, OnAddPartCheck); + SubSurgery(OnAffixPartStep, OnAffixPartCheck); + SubSurgery(OnRemovePartStep, OnRemovePartCheck); + SubSurgery(OnAddOrganStep, OnAddOrganCheck); + SubSurgery(OnRemoveOrganStep, OnRemoveOrganCheck); + SubSurgery(OnAffixOrganStep, OnAffixOrganCheck); + SubSurgery(OnAddMarkingStep, OnAddMarkingCheck); + SubSurgery(OnRemoveMarkingStep, OnRemoveMarkingCheck); + Subs.BuiEvents(SurgeryUIKey.Key, subs => + { + subs.Event(OnSurgeryTargetStepChosen); + }); + } + + private void SubSurgery(EntityEventRefHandler onStep, + EntityEventRefHandler onComplete) where TComp : IComponent + { + SubscribeLocalEvent(onStep); + SubscribeLocalEvent(onComplete); + } + + private void OnToolStep(Entity ent, ref SurgeryStepEvent args) + { + if (ent.Comp.Tool != null) + { + foreach (var reg in ent.Comp.Tool.Values) + { + if (!AnyHaveComp(args.Tools, reg.Component, out var tool)) + return; + + if (_net.IsServer && + TryComp(tool, out SurgeryToolComponent? toolComp) && + toolComp.EndSound != null) + { + _audio.PlayEntity(toolComp.EndSound, args.User, tool); + } + } + } + + if (ent.Comp.Add != null) + { + foreach (var reg in ent.Comp.Add.Values) + { + var compType = reg.Component.GetType(); + if (HasComp(args.Part, compType)) + continue; + AddComp(args.Part, _compFactory.GetComponent(compType)); + } + } + + if (ent.Comp.Remove != null) + { + foreach (var reg in ent.Comp.Remove.Values) + { + RemComp(args.Part, reg.Component.GetType()); + } + } + + if (ent.Comp.BodyRemove != null) + { + foreach (var reg in ent.Comp.BodyRemove.Values) + { + RemComp(args.Body, reg.Component.GetType()); + } + } + + if (!_inventory.TryGetSlotEntity(args.User, "gloves", out var gloves) + || !_inventory.TryGetSlotEntity(args.User, "mask", out var mask)) + { + var sepsis = new DamageSpecifier(_prototypes.Index("Poison"), 5); + var ev = new SurgeryStepDamageEvent(args.User, args.Body, args.Part, args.Surgery, sepsis, 0.5f); + RaiseLocalEvent(args.Body, ref ev); + } + } + + private void OnToolCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + // Lord this function is fucking bloated now. Need to clean it up so its less spammy. + if (ent.Comp.Add != null) + { + foreach (var reg in ent.Comp.Add.Values) + { + if (!HasComp(args.Part, reg.Component.GetType())) + { + args.Cancelled = true; + return; + } + } + } + + if (ent.Comp.Remove != null) + { + foreach (var reg in ent.Comp.Remove.Values) + { + if (HasComp(args.Part, reg.Component.GetType())) + { + args.Cancelled = true; + return; + } + } + } + + if (ent.Comp.BodyRemove != null) + { + foreach (var reg in ent.Comp.BodyRemove.Values) + { + if (HasComp(args.Body, reg.Component.GetType())) + { + args.Cancelled = true; + return; + } + } + } + } + + private void OnToolCanPerform(Entity ent, ref SurgeryCanPerformStepEvent args) + { + if (HasComp(ent)) + { + if (!TryComp(args.Body, out BuckleComponent? buckle) || + !HasComp(buckle.BuckledTo)) + { + args.Invalid = StepInvalidReason.NeedsOperatingTable; + return; + } + } + + if (_inventory.TryGetContainerSlotEnumerator(args.Body, out var containerSlotEnumerator, args.TargetSlots)) + { + while (containerSlotEnumerator.MoveNext(out var containerSlot)) + { + if (!containerSlot.ContainedEntity.HasValue) + continue; + + args.Invalid = StepInvalidReason.Armor; + args.Popup = Loc.GetString("surgery-ui-window-steps-error-armor"); + return; + } + } + + RaiseLocalEvent(args.Body, ref args); + + if (args.Invalid != StepInvalidReason.None) + return; + + if (ent.Comp.Tool != null) + { + args.ValidTools ??= new HashSet(); + + foreach (var reg in ent.Comp.Tool.Values) + { + if (!AnyHaveComp(args.Tools, reg.Component, out var withComp)) + { + args.Invalid = StepInvalidReason.MissingTool; + + if (reg.Component is ISurgeryToolComponent tool) + args.Popup = $"You need {tool.ToolName} to perform this step!"; + + return; + } + + args.ValidTools.Add(withComp); + } + } + } + + private EntProtoId? GetProtoId(EntityUid entityUid) + { + if (!TryComp(entityUid, out var metaData)) + return null; + + return metaData.EntityPrototype?.ID; + } + + // I wonder if theres not a function that can do this already. + private bool HasDamageGroup(EntityUid entity, string[] group, out DamageableComponent? damageable) + { + if (!TryComp(entity, out var damageableComp)) + { + damageable = null; + return false; + } + + damageable = damageableComp; + return group.Any(damageType => damageableComp.Damage.DamageDict.TryGetValue(damageType, out var value) && value > 0); + + } + + private void OnTendWoundsStep(Entity ent, ref SurgeryStepEvent args) + { + var group = ent.Comp.MainGroup == "Brute" ? BruteDamageTypes : BurnDamageTypes; + + if (!HasDamageGroup(args.Body, group, out var damageable) + && !HasDamageGroup(args.Part, group, out var _) + || damageable == null) // This shouldnt be possible but the compiler doesn't shut up. + return; + + + // Right now the bonus is based off the body's total damage, maybe we could make it based off each part in the future. + var bonus = ent.Comp.HealMultiplier * damageable.DamagePerGroup[ent.Comp.MainGroup]; + if (_mobState.IsDead(args.Body)) + bonus *= 0.2; + + var adjustedDamage = new DamageSpecifier(ent.Comp.Damage); + var bonusPerType = bonus / group.Length; + + foreach (var type in group) + { + adjustedDamage.DamageDict[type] -= bonusPerType; + } + + var ev = new SurgeryStepDamageEvent(args.User, args.Body, args.Part, args.Surgery, adjustedDamage, 0.5f); + RaiseLocalEvent(args.Body, ref ev); + } + + private void OnTendWoundsCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + var group = ent.Comp.MainGroup == "Brute" ? BruteDamageTypes : BurnDamageTypes; + + if (HasDamageGroup(args.Body, group, out var _) + || HasDamageGroup(args.Part, group, out var _)) + args.Cancelled = true; + } + + /*private void OnCutLarvaRootsStep(Entity ent, ref SurgeryStepEvent args) + { + if (TryComp(args.Body, out VictimInfectedComponent? infected) && + infected.BurstAt > _timing.CurTime && + infected.SpawnedLarva == null) + { + infected.RootsCut = true; + } + } + + private void OnCutLarvaRootsCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + if (!TryComp(args.Body, out VictimInfectedComponent? infected) || !infected.RootsCut) + args.Cancelled = true; + + // The larva has fully developed and surgery is now impossible + // TODO: Surgery should still be possible, but the fully developed larva should escape while also saving the hosts life + if (infected != null && infected.SpawnedLarva != null) + args.Cancelled = true; + }*/ + + private void OnCavityStep(Entity ent, ref SurgeryStepEvent args) + { + if (!TryComp(args.Part, out BodyPartComponent? partComp) || partComp.PartType != BodyPartType.Torso) + return; + + var activeHandEntity = _hands.EnumerateHeld(args.User).FirstOrDefault(); + if (activeHandEntity != default + && ent.Comp.Action == "Insert" + && TryComp(activeHandEntity, out ItemComponent? itemComp) + && (itemComp.Size.Id == "Tiny" + || itemComp.Size.Id == "Small")) + _itemSlotsSystem.TryInsert(ent, partComp.ItemInsertionSlot, activeHandEntity, args.User); + else if (ent.Comp.Action == "Remove") + _itemSlotsSystem.TryEjectToHands(ent, partComp.ItemInsertionSlot, args.User); + } + + private void OnCavityCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + // Normally this check would simply be partComp.ItemInsertionSlot.HasItem, but as mentioned before, + // For whatever reason it's not instantiating the field on the clientside after the wizmerge. + if (!TryComp(args.Part, out BodyPartComponent? partComp) + || !TryComp(args.Part, out ItemSlotsComponent? itemComp) + || ent.Comp.Action == "Insert" + && !itemComp.Slots[partComp.ContainerName].HasItem + || ent.Comp.Action == "Remove" + && itemComp.Slots[partComp.ContainerName].HasItem) + args.Cancelled = true; + } + + private void OnAddPartStep(Entity ent, ref SurgeryStepEvent args) + { + if (!TryComp(args.Surgery, out SurgeryPartRemovedConditionComponent? removedComp)) + return; + + foreach (var tool in args.Tools) + { + if (TryComp(tool, out BodyPartComponent? partComp) + && partComp.PartType == removedComp.Part + && (removedComp.Symmetry == null || partComp.Symmetry == removedComp.Symmetry)) + { + var slotName = removedComp.Symmetry != null + ? $"{removedComp.Symmetry?.ToString().ToLower()} {removedComp.Part.ToString().ToLower()}" + : removedComp.Part.ToString().ToLower(); + _body.TryCreatePartSlot(args.Part, slotName, partComp.PartType, out _); + _body.AttachPart(args.Part, slotName, tool); + EnsureComp(tool); + var ev = new BodyPartAttachedEvent((tool, partComp)); + RaiseLocalEvent(args.Body, ref ev); + } + } + } + + private void OnAffixPartStep(Entity ent, ref SurgeryStepEvent args) + { + if (!TryComp(args.Surgery, out SurgeryPartRemovedConditionComponent? removedComp)) + return; + + var targetPart = _body.GetBodyChildrenOfType(args.Body, removedComp.Part, symmetry: removedComp.Symmetry).FirstOrDefault(); + + if (targetPart != default) + { + // We reward players for properly affixing the parts by healing a little bit of damage, and enabling the part temporarily. + var ev = new BodyPartEnableChangedEvent(true); + RaiseLocalEvent(targetPart.Id, ref ev); + _damageable.TryChangeDamage(args.Body, + _body.GetHealingSpecifier(targetPart.Component) * 2, + canSever: false, // Just in case we heal a brute damage specifier and the logic gets fucky lol + targetPart: _body.GetTargetBodyPart(targetPart.Component.PartType, targetPart.Component.Symmetry)); + RemComp(targetPart.Id); + } + } + + private void OnAffixPartCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + if (!TryComp(args.Surgery, out SurgeryPartRemovedConditionComponent? removedComp)) + return; + + var targetPart = _body.GetBodyChildrenOfType(args.Body, removedComp.Part, symmetry: removedComp.Symmetry).FirstOrDefault(); + + if (targetPart != default + && HasComp(targetPart.Id)) + args.Cancelled = true; + } + + private void OnAddPartCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + if (!TryComp(args.Surgery, out SurgeryPartRemovedConditionComponent? removedComp) + || !_body.GetBodyChildrenOfType(args.Body, removedComp.Part, symmetry: removedComp.Symmetry).Any()) + args.Cancelled = true; + } + + private void OnRemovePartStep(Entity ent, ref SurgeryStepEvent args) + { + if (!TryComp(args.Part, out BodyPartComponent? partComp) + || partComp.Body != args.Body) + return; + + var ev = new AmputateAttemptEvent(args.Part); + RaiseLocalEvent(args.Part, ref ev); + _hands.TryPickupAnyHand(args.User, args.Part); + } + + private void OnRemovePartCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + if (!TryComp(args.Part, out BodyPartComponent? partComp) + || partComp.Body == args.Body) + args.Cancelled = true; + } + + private void OnAddOrganStep(Entity ent, ref SurgeryStepEvent args) + { + if (!TryComp(args.Part, out BodyPartComponent? partComp) + || partComp.Body != args.Body + || !TryComp(args.Surgery, out SurgeryOrganConditionComponent? organComp) + || organComp.Organ == null) + return; + + // Adding organs is generally done for a single one at a time, so we only need to check for the first. + var firstOrgan = organComp.Organ.Values.FirstOrDefault(); + if (firstOrgan == default) + return; + + foreach (var tool in args.Tools) + { + if (HasComp(tool, firstOrgan.Component.GetType()) + && TryComp(tool, out var insertedOrgan) + && _body.InsertOrgan(args.Part, tool, insertedOrgan.SlotId, partComp, insertedOrgan)) + { + EnsureComp(tool); + if (_body.TrySetOrganUsed(tool, true, insertedOrgan) + && insertedOrgan.OriginalBody != args.Body) + { + var ev = new SurgeryStepDamageChangeEvent(args.User, args.Body, args.Part, ent); + RaiseLocalEvent(ent, ref ev); + } + break; + } + } + } + + private void OnAddOrganCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + if (!TryComp(args.Surgery, out var organComp) + || organComp.Organ is null + || !TryComp(args.Part, out BodyPartComponent? partComp) + || partComp.Body != args.Body) + return; + + // For now we naively assume that every entity will only have one of each organ type. + // that we do surgery on, but in the future we'll need to reference their prototype somehow + // to know if they need 2 hearts, 2 lungs, etc. + foreach (var reg in organComp.Organ.Values) + { + if (!_body.TryGetBodyPartOrgans(args.Part, reg.Component.GetType(), out var _)) + { + args.Cancelled = true; + } + } + } + + private void OnAffixOrganStep(Entity ent, ref SurgeryStepEvent args) + { + if (!TryComp(args.Surgery, out SurgeryOrganConditionComponent? removedOrganComp) + || removedOrganComp.Organ == null + || !removedOrganComp.Reattaching) + return; + + foreach (var reg in removedOrganComp.Organ.Values) + { + _body.TryGetBodyPartOrgans(args.Part, reg.Component.GetType(), out var organs); + if (organs != null && organs.Count > 0) + RemComp(organs[0].Id); + } + + } + + private void OnAffixOrganCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + if (!TryComp(args.Surgery, out SurgeryOrganConditionComponent? removedOrganComp) + || removedOrganComp.Organ == null + || !removedOrganComp.Reattaching) + return; + + foreach (var reg in removedOrganComp.Organ.Values) + { + _body.TryGetBodyPartOrgans(args.Part, reg.Component.GetType(), out var organs); + if (organs != null + && organs.Count > 0 + && organs.Any(organ => HasComp(organ.Id))) + args.Cancelled = true; + } + } + + private void OnRemoveOrganStep(Entity ent, ref SurgeryStepEvent args) + { + if (!TryComp(args.Surgery, out var organComp) + || organComp.Organ == null) + return; + + foreach (var reg in organComp.Organ.Values) + { + _body.TryGetBodyPartOrgans(args.Part, reg.Component.GetType(), out var organs); + if (organs != null && organs.Count > 0) + { + _body.RemoveOrgan(organs[0].Id, organs[0].Organ); + _hands.TryPickupAnyHand(args.User, organs[0].Id); + } + } + } + + private void OnRemoveOrganCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + if (!TryComp(args.Surgery, out var organComp) + || organComp.Organ == null + || !TryComp(args.Part, out BodyPartComponent? partComp) + || partComp.Body != args.Body) + return; + + foreach (var reg in organComp.Organ.Values) + { + if (_body.TryGetBodyPartOrgans(args.Part, reg.Component.GetType(), out var organs) + && organs != null + && organs.Count > 0) + { + args.Cancelled = true; + return; + } + } + } + + // TODO: Refactor bodies to include ears as a prototype instead of doing whatever the hell this is. + private void OnAddMarkingStep(Entity ent, ref SurgeryStepEvent args) + { + if (!TryComp(args.Body, out HumanoidAppearanceComponent? bodyAppearance) + || ent.Comp.Organ == null) + return; + + var organType = ent.Comp.Organ.Values.FirstOrDefault(); + if (organType == default) + return; + + var markingCategory = MarkingCategoriesConversion.FromHumanoidVisualLayers(ent.Comp.MarkingCategory); + foreach (var tool in args.Tools) + { + if (TryComp(tool, out MarkingContainerComponent? markingComp) + && HasComp(tool, organType.Component.GetType())) + { + if (!bodyAppearance.MarkingSet.Markings.TryGetValue(markingCategory, out var markingList) + || !markingList.Any(marking => marking.MarkingId.Contains(ent.Comp.MatchString))) + { + EnsureComp(args.Part); + _body.ModifyMarkings(args.Body, args.Part, bodyAppearance, ent.Comp.MarkingCategory, markingComp.Marking); + + if (ent.Comp.Accent != null + && ent.Comp.Accent.Values.FirstOrDefault() is { } accent) + { + var compType = accent.Component.GetType(); + if (!HasComp(args.Body, compType)) + AddComp(args.Body, _compFactory.GetComponent(compType)); + } + + QueueDel(tool); // Again since this isnt actually being inserted we just delete it lol. + } + } + } + + } + + private void OnAddMarkingCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + var markingCategory = MarkingCategoriesConversion.FromHumanoidVisualLayers(ent.Comp.MarkingCategory); + + if (!TryComp(args.Body, out HumanoidAppearanceComponent? bodyAppearance) + || !bodyAppearance.MarkingSet.Markings.TryGetValue(markingCategory, out var markingList) + || !markingList.Any(marking => marking.MarkingId.Contains(ent.Comp.MatchString))) + args.Cancelled = true; + } + + private void OnRemoveMarkingStep(Entity ent, ref SurgeryStepEvent args) + { + + } + + private void OnRemoveMarkingCheck(Entity ent, ref SurgeryStepCompleteCheckEvent args) + { + + } + + private void OnSurgeryTargetStepChosen(Entity ent, ref SurgeryStepChosenBuiMsg args) + { + var user = args.Actor; + if (GetEntity(args.Entity) is not { Valid: true } body || + GetEntity(args.Part) is not { Valid: true } targetPart || + !IsSurgeryValid(body, targetPart, args.Surgery, args.Step, user, out var surgery, out var part, out var step)) + { + return; + } + + if (!PreviousStepsComplete(body, part, surgery, args.Step) || + IsStepComplete(body, part, args.Step, surgery)) + return; + + if (!CanPerformStep(user, body, part, step, true, out _, out _, out var validTools)) + return; + + if (_net.IsServer && validTools?.Count > 0) + { + foreach (var tool in validTools) + { + if (TryComp(tool, out SurgeryToolComponent? toolComp) && + toolComp.EndSound != null) + { + _audio.PlayEntity(toolComp.StartSound, user, tool); + } + } + } + + if (TryComp(body, out TransformComponent? xform)) + _rotateToFace.TryFaceCoordinates(user, _transform.GetMapCoordinates(body, xform).Position); + + var ev = new SurgeryDoAfterEvent(args.Surgery, args.Step); + // TODO: Make this serialized on a per surgery step basis, and also add penalties based on ghetto tools. + var duration = 2f; + if (TryComp(user, out SurgerySpeedModifierComponent? surgerySpeedMod) + && surgerySpeedMod is not null) + duration = duration / surgerySpeedMod.SpeedModifier; + + var doAfter = new DoAfterArgs(EntityManager, user, TimeSpan.FromSeconds(duration), ev, body, part) + { + BreakOnMove = true, + CancelDuplicate = true, + DuplicateCondition = DuplicateConditions.SameEvent, + NeedHand = true, + BreakOnHandChange = true, + }; + + if (_doAfter.TryStartDoAfter(doAfter)) + { + var userName = Identity.Entity(user, EntityManager); + var targetName = Identity.Entity(ent.Owner, EntityManager); + + var locName = $"surgery-popup-procedure-{args.Surgery}-step-{args.Step}"; + var locResult = Loc.GetString(locName, + ("user", userName), ("target", targetName), ("part", part)); + + if (locResult == locName) + locResult = Loc.GetString($"surgery-popup-step-{args.Step}", + ("user", userName), ("target", targetName), ("part", part)); + + _popup.PopupEntity(locResult, user); + } + } + + private (Entity Surgery, int Step)? GetNextStep(EntityUid body, EntityUid part, Entity surgery, List requirements) + { + if (!Resolve(surgery, ref surgery.Comp)) + return null; + + if (requirements.Contains(surgery)) + throw new ArgumentException($"Surgery {surgery} has a requirement loop: {string.Join(", ", requirements)}"); + + requirements.Add(surgery); + + if (surgery.Comp.Requirement is { } requirementId && + GetSingleton(requirementId) is { } requirement && + GetNextStep(body, part, requirement, requirements) is { } requiredNext) + { + return requiredNext; + } + + for (var i = 0; i < surgery.Comp.Steps.Count; i++) + { + var surgeryStep = surgery.Comp.Steps[i]; + if (!IsStepComplete(body, part, surgeryStep, surgery)) + return ((surgery, surgery.Comp), i); + } + + return null; + } + + public (Entity Surgery, int Step)? GetNextStep(EntityUid body, EntityUid part, EntityUid surgery) + { + return GetNextStep(body, part, surgery, new List()); + } + + public bool PreviousStepsComplete(EntityUid body, EntityUid part, Entity surgery, EntProtoId step) + { + // TODO RMC14 use index instead of the prototype id + if (surgery.Comp.Requirement is { } requirement) + { + if (GetSingleton(requirement) is not { } requiredEnt || + !TryComp(requiredEnt, out SurgeryComponent? requiredComp) || + !PreviousStepsComplete(body, part, (requiredEnt, requiredComp), step)) + { + return false; + } + } + + foreach (var surgeryStep in surgery.Comp.Steps) + { + if (surgeryStep == step) + break; + + if (!IsStepComplete(body, part, surgeryStep, surgery)) + return false; + } + + return true; + } + + public bool CanPerformStep(EntityUid user, EntityUid body, EntityUid part, + EntityUid step, bool doPopup, out string? popup, out StepInvalidReason reason, + out HashSet? validTools) + { + var type = BodyPartType.Other; + if (TryComp(part, out BodyPartComponent? partComp)) + { + type = partComp.PartType; + } + + var slot = type switch + { + BodyPartType.Head => SlotFlags.HEAD, + BodyPartType.Torso => SlotFlags.OUTERCLOTHING | SlotFlags.INNERCLOTHING, + BodyPartType.Arm => SlotFlags.OUTERCLOTHING | SlotFlags.INNERCLOTHING, + BodyPartType.Hand => SlotFlags.GLOVES, + BodyPartType.Leg => SlotFlags.OUTERCLOTHING | SlotFlags.LEGS, + BodyPartType.Foot => SlotFlags.FEET, + BodyPartType.Tail => SlotFlags.NONE, + BodyPartType.Other => SlotFlags.NONE, + _ => SlotFlags.NONE + }; + + var check = new SurgeryCanPerformStepEvent(user, body, GetTools(user), slot); + RaiseLocalEvent(step, ref check); + popup = check.Popup; + validTools = check.ValidTools; + + if (check.Invalid != StepInvalidReason.None) + { + if (doPopup && check.Popup != null) + _popup.PopupEntity(check.Popup, user, user, PopupType.SmallCaution); + + reason = check.Invalid; + return false; + } + + reason = default; + return true; + } + + public bool CanPerformStep(EntityUid user, EntityUid body, EntityUid part, EntityUid step, bool doPopup) + { + return CanPerformStep(user, body, part, step, doPopup, out _, out _, out _); + } + + public bool IsStepComplete(EntityUid body, EntityUid part, EntProtoId step, EntityUid surgery) + { + if (GetSingleton(step) is not { } stepEnt) + return false; + + var ev = new SurgeryStepCompleteCheckEvent(body, part, surgery); + RaiseLocalEvent(stepEnt, ref ev); + return !ev.Cancelled; + } + + private bool AnyHaveComp(List tools, IComponent component, out EntityUid withComp) + { + foreach (var tool in tools) + { + if (HasComp(tool, component.GetType())) + { + withComp = tool; + return true; + } + } + + withComp = default; + return false; + } +} diff --git a/Content.Shared/_CorvaxNext/Surgery/SharedSurgerySystem.cs b/Content.Shared/_CorvaxNext/Surgery/SharedSurgerySystem.cs new file mode 100644 index 00000000000..b85066ba6ed --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/SharedSurgerySystem.cs @@ -0,0 +1,287 @@ +using System.Linq; +using Content.Shared._CorvaxNext.Surgery.Steps.Parts; +using Content.Shared.Medical.Surgery.Conditions; +using Content.Shared.Body.Systems; +using Content.Shared.Medical.Surgery.Steps; +using Content.Shared.Body.Part; +using Content.Shared.Damage; +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Body.Components; +using Content.Shared.Buckle.Components; +using Content.Shared.DoAfter; +using Content.Shared.Mobs.Systems; +using Content.Shared.GameTicking; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Markings; +using Content.Shared.Interaction; +using Content.Shared.Inventory; +using Content.Shared.Popups; +using Content.Shared.Standing; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Map; +using Robust.Shared.Network; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; + +namespace Content.Shared._CorvaxNext.Surgery; + +public abstract partial class SharedSurgerySystem : EntitySystem +{ + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly IComponentFactory _compFactory = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedBodySystem _body = default!; + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly ItemSlotsSystem _itemSlotsSystem = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly IPrototypeManager _prototypes = default!; + [Dependency] private readonly RotateToFaceSystem _rotateToFace = default!; + [Dependency] private readonly StandingStateSystem _standing = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + + private readonly Dictionary _surgeries = new(); + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnRoundRestartCleanup); + + SubscribeLocalEvent(OnTargetDoAfter); + SubscribeLocalEvent(OnCloseIncisionValid); + //SubscribeLocalEvent(OnLarvaValid); + SubscribeLocalEvent(OnPartConditionValid); + SubscribeLocalEvent(OnOrganConditionValid); + SubscribeLocalEvent(OnWoundedValid); + SubscribeLocalEvent(OnPartRemovedConditionValid); + SubscribeLocalEvent(OnPartPresentConditionValid); + SubscribeLocalEvent(OnMarkingPresentValid); + //SubscribeLocalEvent(OnRemoveLarva); + + InitializeSteps(); + } + + private void OnRoundRestartCleanup(RoundRestartCleanupEvent ev) + { + _surgeries.Clear(); + } + + private void OnTargetDoAfter(Entity ent, ref SurgeryDoAfterEvent args) + { + if (!_timing.IsFirstTimePredicted) + return; + + if (args.Cancelled + || args.Handled + || args.Target is not { } target + || !IsSurgeryValid(ent, target, args.Surgery, args.Step, args.User, out var surgery, out var part, out var step) + || !PreviousStepsComplete(ent, part, surgery, args.Step) + || !CanPerformStep(args.User, ent, part, step, false)) + { + Log.Warning($"{ToPrettyString(args.User)} tried to start invalid surgery."); + return; + } + + args.Repeat = (HasComp(step) && !IsStepComplete(ent, part, args.Step, surgery)); + var ev = new SurgeryStepEvent(args.User, ent, part, GetTools(args.User), surgery); + RaiseLocalEvent(step, ref ev); + RefreshUI(ent); + } + + private void OnCloseIncisionValid(Entity ent, ref SurgeryValidEvent args) + { + if (!HasComp(args.Part) || + !HasComp(args.Part) || + !HasComp(args.Part) || + !HasComp(args.Part) || + !HasComp(args.Part)) + { + args.Cancelled = true; + } + } + + private void OnWoundedValid(Entity ent, ref SurgeryValidEvent args) + { + if (!TryComp(args.Body, out DamageableComponent? damageable) + || !TryComp(args.Part, out DamageableComponent? partDamageable) + || damageable.TotalDamage <= 0 + && partDamageable.TotalDamage <= 0 + && !HasComp(args.Part)) + args.Cancelled = true; + } + + /*private void OnLarvaValid(Entity ent, ref SurgeryValidEvent args) + { + if (!TryComp(args.Body, out VictimInfectedComponent? infected)) + args.Cancelled = true; + + // The larva has fully developed and surgery is now impossible + if (infected != null && infected.SpawnedLarva != null) + args.Cancelled = true; + }*/ + private void OnPartConditionValid(Entity ent, ref SurgeryValidEvent args) + { + if (!TryComp(args.Part, out var part)) + { + args.Cancelled = true; + return; + } + + var typeMatch = part.PartType == ent.Comp.Part; + var symmetryMatch = ent.Comp.Symmetry == null || part.Symmetry == ent.Comp.Symmetry; + var valid = typeMatch && symmetryMatch; + + if (ent.Comp.Inverse ? valid : !valid) + args.Cancelled = true; + } + + private void OnOrganConditionValid(Entity ent, ref SurgeryValidEvent args) + { + if (!TryComp(args.Part, out var partComp) + || partComp.Body != args.Body + || ent.Comp.Organ == null) + { + args.Cancelled = true; + return; + } + + foreach (var reg in ent.Comp.Organ.Values) + { + if (_body.TryGetBodyPartOrgans(args.Part, reg.Component.GetType(), out var organs) + && organs.Count > 0) + { + if (ent.Comp.Inverse + && (!ent.Comp.Reattaching + || ent.Comp.Reattaching + && !organs.Any(organ => HasComp(organ.Id)))) + args.Cancelled = true; + } + else if (!ent.Comp.Inverse) + args.Cancelled = true; + } + } + + private void OnPartRemovedConditionValid(Entity ent, ref SurgeryValidEvent args) + { + if (!_body.CanAttachToSlot(args.Part, ent.Comp.Connection)) + { + args.Cancelled = true; + return; + } + + var results = _body.GetBodyChildrenOfType(args.Body, ent.Comp.Part, symmetry: ent.Comp.Symmetry); + if (results is not { } || !results.Any()) + return; + + if (!results.Any(part => HasComp(part.Id))) + args.Cancelled = true; + } + + private void OnPartPresentConditionValid(Entity ent, ref SurgeryValidEvent args) + { + if (args.Part == EntityUid.Invalid + || !HasComp(args.Part)) + args.Cancelled = true; + } + + private void OnMarkingPresentValid(Entity ent, ref SurgeryValidEvent args) + { + var markingCategory = MarkingCategoriesConversion.FromHumanoidVisualLayers(ent.Comp.MarkingCategory); + + var hasMarking = TryComp(args.Body, out HumanoidAppearanceComponent? bodyAppearance) + && bodyAppearance.MarkingSet.Markings.TryGetValue(markingCategory, out var markingList) + && markingList.Any(marking => marking.MarkingId.Contains(ent.Comp.MatchString)); + + if ((!ent.Comp.Inverse && hasMarking) || (ent.Comp.Inverse && !hasMarking)) + args.Cancelled = true; + } + + /*private void OnRemoveLarva(Entity ent, ref SurgeryCompletedEvent args) + { + RemCompDeferred(ent); + }*/ + + protected bool IsSurgeryValid(EntityUid body, EntityUid targetPart, EntProtoId surgery, EntProtoId stepId, + EntityUid user, out Entity surgeryEnt, out EntityUid part, out EntityUid step) + { + surgeryEnt = default; + part = default; + step = default; + + if (!HasComp(body) || + !IsLyingDown(body, user) || + GetSingleton(surgery) is not { } surgeryEntId || + !TryComp(surgeryEntId, out SurgeryComponent? surgeryComp) || + !surgeryComp.Steps.Contains(stepId) || + GetSingleton(stepId) is not { } stepEnt + || !HasComp(targetPart) + && !HasComp(targetPart)) + return false; + + + var ev = new SurgeryValidEvent(body, targetPart); + if (_timing.IsFirstTimePredicted) + { + RaiseLocalEvent(stepEnt, ref ev); + RaiseLocalEvent(surgeryEntId, ref ev); + } + + if (ev.Cancelled) + return false; + + surgeryEnt = (surgeryEntId, surgeryComp); + part = targetPart; + step = stepEnt; + return true; + } + + public EntityUid? GetSingleton(EntProtoId surgeryOrStep) + { + if (!_prototypes.HasIndex(surgeryOrStep)) + return null; + + // This (for now) assumes that surgery entity data remains unchanged between client + // and server + // if it does not you get the bullet + if (!_surgeries.TryGetValue(surgeryOrStep, out var ent) || TerminatingOrDeleted(ent)) + { + ent = Spawn(surgeryOrStep, MapCoordinates.Nullspace); + _surgeries[surgeryOrStep] = ent; + } + + return ent; + } + + private List GetTools(EntityUid surgeon) + { + return _hands.EnumerateHeld(surgeon).ToList(); + } + + public bool IsLyingDown(EntityUid entity, EntityUid user) + { + if (_standing.IsDown(entity)) + return true; + + if (TryComp(entity, out BuckleComponent? buckle) && + TryComp(buckle.BuckledTo, out StrapComponent? strap)) + { + var rotation = strap.Rotation; + if (rotation.GetCardinalDir() is Direction.West or Direction.East) + return true; + } + + _popup.PopupEntity(Loc.GetString("surgery-error-laying"), user, user); + + return false; + } + + protected virtual void RefreshUI(EntityUid body) + { + } +} diff --git a/Content.Shared/_CorvaxNext/Surgery/StepInvalidReason.cs b/Content.Shared/_CorvaxNext/Surgery/StepInvalidReason.cs new file mode 100644 index 00000000000..696ebd34b85 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/StepInvalidReason.cs @@ -0,0 +1,10 @@ +namespace Content.Shared._CorvaxNext.Surgery; + +public enum StepInvalidReason +{ + None, + MissingSkills, + NeedsOperatingTable, + Armor, + MissingTool, +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/BleedersClampedComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/BleedersClampedComponent.cs new file mode 100644 index 00000000000..5854fd5ed55 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/BleedersClampedComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class BleedersClampedComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/BodyPartReattachedComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/BodyPartReattachedComponent.cs new file mode 100644 index 00000000000..870ad983b2a --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/BodyPartReattachedComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class BodyPartReattachedComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/BodyPartSawedComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/BodyPartSawedComponent.cs new file mode 100644 index 00000000000..264acc1baa3 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/BodyPartSawedComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class BodyPartSawedComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/IncisionOpenComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/IncisionOpenComponent.cs new file mode 100644 index 00000000000..02a18abaca7 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/IncisionOpenComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class IncisionOpenComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/InternalBleedersClampedComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/InternalBleedersClampedComponent.cs new file mode 100644 index 00000000000..d25a1084f1c --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/InternalBleedersClampedComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class InternalBleedersClampedComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/OrganReattachedComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/OrganReattachedComponent.cs new file mode 100644 index 00000000000..30ada57bbf5 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/OrganReattachedComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class OrganReattachedComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/PartRemovedComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/PartRemovedComponent.cs new file mode 100644 index 00000000000..f7b14628e9c --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/PartRemovedComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class PartsRemovedComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/RibcageOpenComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/RibcageOpenComponent.cs new file mode 100644 index 00000000000..e32197c76a5 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/RibcageOpenComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class RibcageOpenComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/RibcageSawedComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/RibcageSawedComponent.cs new file mode 100644 index 00000000000..ff749649ce8 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/RibcageSawedComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class RibcageSawedComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/SkinRetractedComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/SkinRetractedComponent.cs new file mode 100644 index 00000000000..b7ee51a9b8e --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/Parts/SkinRetractedComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Steps.Parts; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SkinRetractedComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAddMarkingStepComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAddMarkingStepComponent.cs new file mode 100644 index 00000000000..a9e23567da0 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAddMarkingStepComponent.cs @@ -0,0 +1,34 @@ +using Content.Shared.Humanoid; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CorvaxNext.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryAddMarkingStepComponent : Component +{ + /// + /// The marking category to add the marking to. + /// + [DataField] + public HumanoidVisualLayers MarkingCategory = default!; + + /// + /// Can be either a segment of a marking ID, or an entire ID that will be checked + /// against the entity to validate that the marking is not already present. + /// + [DataField] + public String MatchString = ""; + + /// + /// What type of organ is required for this surgery? + /// + [DataField] + public ComponentRegistry? Organ; + + /// + /// Component name for accent that will be applied. + /// + [DataField] + public ComponentRegistry? Accent; +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAddOrganStepComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAddOrganStepComponent.cs new file mode 100644 index 00000000000..773cc634fae --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAddOrganStepComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryAddOrganStepComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAddPartStepComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAddPartStepComponent.cs new file mode 100644 index 00000000000..0229552ae8a --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAddPartStepComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Medical.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryAddPartStepComponent : Component; \ No newline at end of file diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAffixOrganStepComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAffixOrganStepComponent.cs new file mode 100644 index 00000000000..5f82cbe4251 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAffixOrganStepComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Medical.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryAffixOrganStepComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAffixPartStepComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAffixPartStepComponent.cs new file mode 100644 index 00000000000..cc080e8be0b --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryAffixPartStepComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Medical.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryAffixPartStepComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryCanPerformStepEvent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryCanPerformStepEvent.cs new file mode 100644 index 00000000000..3c9d62cbfd2 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryCanPerformStepEvent.cs @@ -0,0 +1,14 @@ +using Content.Shared.Inventory; + +namespace Content.Shared._CorvaxNext.Surgery.Steps; + +[ByRefEvent] +public record struct SurgeryCanPerformStepEvent( + EntityUid User, + EntityUid Body, + List Tools, + SlotFlags TargetSlots, + string? Popup = null, + StepInvalidReason Invalid = StepInvalidReason.None, + HashSet? ValidTools = null +) : IInventoryRelayEvent; diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryCutLarvaRootsStepComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryCutLarvaRootsStepComponent.cs new file mode 100644 index 00000000000..55f3e568213 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryCutLarvaRootsStepComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryCutLarvaRootsStepComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryRemoveMarkingStepComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryRemoveMarkingStepComponent.cs new file mode 100644 index 00000000000..47368a154c0 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryRemoveMarkingStepComponent.cs @@ -0,0 +1,29 @@ +using Robust.Shared.Prototypes; +using Content.Shared.Humanoid; +using Robust.Shared.GameStates; + +namespace Content.Shared.Medical.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryRemoveMarkingStepComponent : Component +{ + /// + /// The category the marking belongs to. + /// + [DataField] + public HumanoidVisualLayers MarkingCategory = default!; + + /// + /// Can be either a segment of a marking ID, or an entire ID that will be checked + /// against the entity to validate that the marking is present. + /// + [DataField] + public String MatchString = ""; + + /// + /// Will this step spawn an item as a result of removing the markings? If so, which? + /// + [DataField] + public EntProtoId? ItemSpawn = default!; + +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryRemoveOrganStepComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryRemoveOrganStepComponent.cs new file mode 100644 index 00000000000..3efe15d710c --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryRemoveOrganStepComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryRemoveOrganStepComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryRemovePartStepComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryRemovePartStepComponent.cs new file mode 100644 index 00000000000..7780f252000 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryRemovePartStepComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryRemovePartStepComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryRepeatableStepComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryRepeatableStepComponent.cs new file mode 100644 index 00000000000..14010b7e962 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryRepeatableStepComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Medical.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryRepeatableStepComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryStepCompleteCheckEvent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryStepCompleteCheckEvent.cs new file mode 100644 index 00000000000..13d1e4da6cc --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryStepCompleteCheckEvent.cs @@ -0,0 +1,4 @@ +namespace Content.Shared._CorvaxNext.Surgery.Steps; + +[ByRefEvent] +public record struct SurgeryStepCompleteCheckEvent(EntityUid Body, EntityUid Part, EntityUid Surgery, bool Cancelled = false); diff --git a/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryStepComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryStepComponent.cs new file mode 100644 index 00000000000..65dcbd4d195 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Steps/SurgeryStepComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CorvaxNext.Surgery.Steps; + +[RegisterComponent, NetworkedComponent] +[Prototype("SurgerySteps")] +public sealed partial class SurgeryStepComponent : Component +{ + + [DataField] + public ComponentRegistry? Tool; + + [DataField] + public ComponentRegistry? Add; + + [DataField] + public ComponentRegistry? Remove; + + [DataField] + public ComponentRegistry? BodyRemove; +} diff --git a/Content.Shared/_CorvaxNext/Surgery/SurgeryComponent.cs b/Content.Shared/_CorvaxNext/Surgery/SurgeryComponent.cs new file mode 100644 index 00000000000..6f3c8d8e9c5 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/SurgeryComponent.cs @@ -0,0 +1,18 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CorvaxNext.Surgery; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Prototype("Surgeries")] +public sealed partial class SurgeryComponent : Component +{ + [DataField, AutoNetworkedField] + public int Priority; + + [DataField, AutoNetworkedField] + public EntProtoId? Requirement; + + [DataField(required: true), AutoNetworkedField] + public List Steps = new(); +} diff --git a/Content.Shared/_CorvaxNext/Surgery/SurgeryDoAfterEvent.cs b/Content.Shared/_CorvaxNext/Surgery/SurgeryDoAfterEvent.cs new file mode 100644 index 00000000000..e8d9ced1cca --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/SurgeryDoAfterEvent.cs @@ -0,0 +1,18 @@ +using Content.Shared.DoAfter; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared._CorvaxNext.Surgery; + +[Serializable, NetSerializable] +public sealed partial class SurgeryDoAfterEvent : SimpleDoAfterEvent +{ + public readonly EntProtoId Surgery; + public readonly EntProtoId Step; + + public SurgeryDoAfterEvent(EntProtoId surgery, EntProtoId step) + { + Surgery = surgery; + Step = step; + } +} diff --git a/Content.Shared/_CorvaxNext/Surgery/SurgerySpeedModifierComponent.cs b/Content.Shared/_CorvaxNext/Surgery/SurgerySpeedModifierComponent.cs new file mode 100644 index 00000000000..32ce00f2c38 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/SurgerySpeedModifierComponent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CorvaxNext.Surgery; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgerySpeedModifierComponent : Component +{ + [DataField] + public float SpeedModifier = 1.5f; +} diff --git a/Content.Shared/_CorvaxNext/Surgery/SurgeryStepDamageChangeEvent.cs b/Content.Shared/_CorvaxNext/Surgery/SurgeryStepDamageChangeEvent.cs new file mode 100644 index 00000000000..e8f0a34cde3 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/SurgeryStepDamageChangeEvent.cs @@ -0,0 +1,9 @@ +using Content.Shared.Damage; + +namespace Content.Shared.Medical.Surgery; + +/// +/// Raised on the target entity. +/// +[ByRefEvent] +public record struct SurgeryStepDamageChangeEvent(EntityUid User, EntityUid Body, EntityUid Part, EntityUid Step); diff --git a/Content.Shared/_CorvaxNext/Surgery/SurgeryStepDamageEvent.cs b/Content.Shared/_CorvaxNext/Surgery/SurgeryStepDamageEvent.cs new file mode 100644 index 00000000000..256ee460247 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/SurgeryStepDamageEvent.cs @@ -0,0 +1,9 @@ +using Content.Shared.Damage; + +namespace Content.Shared._CorvaxNext.Surgery; + +/// +/// Raised on the target entity. +/// +[ByRefEvent] +public record struct SurgeryStepDamageEvent(EntityUid User, EntityUid Body, EntityUid Part, EntityUid Surgery, DamageSpecifier Damage, float PartMultiplier); diff --git a/Content.Shared/_CorvaxNext/Surgery/SurgeryStepEvent.cs b/Content.Shared/_CorvaxNext/Surgery/SurgeryStepEvent.cs new file mode 100644 index 00000000000..3979e975273 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/SurgeryStepEvent.cs @@ -0,0 +1,7 @@ +namespace Content.Shared._CorvaxNext.Surgery; + +/// +/// Raised on the step entity. +/// +[ByRefEvent] +public record struct SurgeryStepEvent(EntityUid User, EntityUid Body, EntityUid Part, List Tools, EntityUid Surgery); diff --git a/Content.Shared/_CorvaxNext/Surgery/SurgeryTargetComponent.cs b/Content.Shared/_CorvaxNext/Surgery/SurgeryTargetComponent.cs new file mode 100644 index 00000000000..446303fc7d9 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/SurgeryTargetComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgeryTargetComponent : Component +{ + [DataField] + public bool CanOperate = true; +} diff --git a/Content.Shared/_CorvaxNext/Surgery/SurgeryUI.cs b/Content.Shared/_CorvaxNext/Surgery/SurgeryUI.cs new file mode 100644 index 00000000000..d738482f240 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/SurgeryUI.cs @@ -0,0 +1,32 @@ +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared._CorvaxNext.Surgery; + +[Serializable, NetSerializable] +public enum SurgeryUIKey +{ + Key +} + +[Serializable, NetSerializable] +public sealed class SurgeryBuiState(Dictionary> choices) : BoundUserInterfaceState +{ + public readonly Dictionary> Choices = choices; +} + +[Serializable, NetSerializable] +public sealed class SurgeryBuiRefreshMessage : BoundUserInterfaceMessage +{ +} + +[Serializable, NetSerializable] +public sealed class SurgeryStepChosenBuiMsg(NetEntity part, EntProtoId surgery, EntProtoId step, bool isBody) : BoundUserInterfaceMessage +{ + public readonly NetEntity Part = part; + public readonly EntProtoId Surgery = surgery; + public readonly EntProtoId Step = step; + + // Used as a marker for whether or not we're hijacking surgery by applying it on the body itself. + public readonly bool IsBody = isBody; +} diff --git a/Content.Shared/_CorvaxNext/Surgery/SurgeryUiRefreshEvent.cs b/Content.Shared/_CorvaxNext/Surgery/SurgeryUiRefreshEvent.cs new file mode 100644 index 00000000000..701a69b93f1 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/SurgeryUiRefreshEvent.cs @@ -0,0 +1,14 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared._CorvaxNext.Surgery; + +[Serializable, NetSerializable] +public sealed class SurgeryUiRefreshEvent : EntityEventArgs +{ + public NetEntity Uid { get; } + + public SurgeryUiRefreshEvent(NetEntity uid) + { + Uid = uid; + } +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Tools/BoneGelComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Tools/BoneGelComponent.cs new file mode 100644 index 00000000000..4f186113d3c --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Tools/BoneGelComponent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Tools; + +[RegisterComponent, NetworkedComponent] +public sealed partial class BoneGelComponent : Component, ISurgeryToolComponent +{ + public string ToolName => "bone gel"; + + public bool? Used { get; set; } = null; +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Tools/BoneSawComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Tools/BoneSawComponent.cs new file mode 100644 index 00000000000..214058f1901 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Tools/BoneSawComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Tools; + +[RegisterComponent, NetworkedComponent] +public sealed partial class BoneSawComponent : Component, ISurgeryToolComponent +{ + public string ToolName => "a bone saw"; + public bool? Used { get; set; } = null; +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Tools/BoneSetterComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Tools/BoneSetterComponent.cs new file mode 100644 index 00000000000..262c6814896 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Tools/BoneSetterComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Tools; + +[RegisterComponent, NetworkedComponent] +public sealed partial class BoneSetterComponent : Component; diff --git a/Content.Shared/_CorvaxNext/Surgery/Tools/CauteryComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Tools/CauteryComponent.cs new file mode 100644 index 00000000000..0fd34f31776 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Tools/CauteryComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Tools; + +[RegisterComponent, NetworkedComponent] +public sealed partial class CauteryComponent : Component, ISurgeryToolComponent +{ + public string ToolName => "a cautery"; + public bool? Used { get; set; } = null; +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Tools/HemostatComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Tools/HemostatComponent.cs new file mode 100644 index 00000000000..109133ca4fa --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Tools/HemostatComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Tools; + +[RegisterComponent, NetworkedComponent] +public sealed partial class HemostatComponent : Component, ISurgeryToolComponent +{ + public string ToolName => "a hemostat"; + public bool? Used { get; set; } = null; +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Tools/ISurgeryToolComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Tools/ISurgeryToolComponent.cs new file mode 100644 index 00000000000..9c536c24c65 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Tools/ISurgeryToolComponent.cs @@ -0,0 +1,11 @@ +namespace Content.Shared._CorvaxNext.Surgery.Tools; + +public interface ISurgeryToolComponent +{ + [DataField] + public string ToolName { get; } + + // Mostly intended for discardable or non-reusable tools. + [DataField] + public bool? Used { get; set; } +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Tools/RetractorComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Tools/RetractorComponent.cs new file mode 100644 index 00000000000..1f8493d26be --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Tools/RetractorComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Tools; + +[RegisterComponent, NetworkedComponent] +public sealed partial class RetractorComponent : Component, ISurgeryToolComponent +{ + public string ToolName => "a retractor"; + public bool? Used { get; set; } = null; +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Tools/ScalpelComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Tools/ScalpelComponent.cs new file mode 100644 index 00000000000..4bf01726f6e --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Tools/ScalpelComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Tools; + +[RegisterComponent, NetworkedComponent] +public sealed partial class ScalpelComponent : Component, ISurgeryToolComponent +{ + public string ToolName => "a scalpel"; + public bool? Used { get; set; } = null; +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Tools/SurgeryToolComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Tools/SurgeryToolComponent.cs new file mode 100644 index 00000000000..d02bddb803b --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Tools/SurgeryToolComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CorvaxNext.Surgery.Tools; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class SurgeryToolComponent : Component +{ + + [DataField, AutoNetworkedField] + public SoundSpecifier? StartSound; + + [DataField, AutoNetworkedField] + public SoundSpecifier? EndSound; +} diff --git a/Content.Shared/_CorvaxNext/Surgery/Tools/SurgicalDrillComponent.cs b/Content.Shared/_CorvaxNext/Surgery/Tools/SurgicalDrillComponent.cs new file mode 100644 index 00000000000..0ae8ff57b95 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Surgery/Tools/SurgicalDrillComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Surgery.Tools; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SurgicalDrillComponent : Component, ISurgeryToolComponent +{ + public string ToolName => "a surgical drill"; + public bool? Used { get; set; } = null; +} diff --git a/Content.Shared/_CorvaxNext/Targeting/Events.cs b/Content.Shared/_CorvaxNext/Targeting/Events.cs new file mode 100644 index 00000000000..fb51962a260 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Targeting/Events.cs @@ -0,0 +1,37 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared._CorvaxNext.Targeting; + +[Serializable, NetSerializable] +public sealed class TargetChangeEvent : EntityEventArgs +{ + public NetEntity Uid { get; } + public TargetBodyPart BodyPart { get; } + public TargetChangeEvent(NetEntity uid, TargetBodyPart bodyPart) + { + Uid = uid; + BodyPart = bodyPart; + } +} + +[Serializable, NetSerializable] +public sealed class TargetIntegrityChangeEvent : EntityEventArgs +{ + public NetEntity Uid { get; } + public bool RefreshUi { get; } + public TargetIntegrityChangeEvent(NetEntity uid, bool refreshUi = true) + { + Uid = uid; + RefreshUi = refreshUi; + } +} + +public sealed class RefreshInventorySlotsEvent : EntityEventArgs +{ + public string SlotName { get; } + + public RefreshInventorySlotsEvent(string slotName) + { + SlotName = slotName; + } +} diff --git a/Content.Shared/_CorvaxNext/Targeting/SharedTargetingSystem.cs b/Content.Shared/_CorvaxNext/Targeting/SharedTargetingSystem.cs new file mode 100644 index 00000000000..9c5e7b77254 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Targeting/SharedTargetingSystem.cs @@ -0,0 +1,27 @@ +namespace Content.Shared._CorvaxNext.Targeting; + +public abstract class SharedTargetingSystem : EntitySystem +{ + /// + /// Returns all Valid target body parts as an array. + /// + public static TargetBodyPart[] GetValidParts() + { + var parts = new[] + { + TargetBodyPart.Head, + TargetBodyPart.Torso, + //TargetBodyPart.Groin, + TargetBodyPart.LeftArm, + TargetBodyPart.LeftHand, + TargetBodyPart.LeftLeg, + TargetBodyPart.LeftFoot, + TargetBodyPart.RightArm, + TargetBodyPart.RightHand, + TargetBodyPart.RightLeg, + TargetBodyPart.RightFoot, + }; + + return parts; + } +} diff --git a/Content.Shared/_CorvaxNext/Targeting/TargetBodyPart.cs b/Content.Shared/_CorvaxNext/Targeting/TargetBodyPart.cs new file mode 100644 index 00000000000..0e49028069c --- /dev/null +++ b/Content.Shared/_CorvaxNext/Targeting/TargetBodyPart.cs @@ -0,0 +1,30 @@ +namespace Content.Shared._CorvaxNext.Targeting; + +/// +/// Represents and enum of possible target parts. +/// +/// +/// To get all body parts as an Array, use static +/// method in SharedTargetingSystem GetValidParts. +/// +[Flags] +public enum TargetBodyPart : ushort +{ + Head = 1, + Torso = 1 << 1, + Groin = 1 << 2, + LeftArm = 1 << 3, + LeftHand = 1 << 4, + RightArm = 1 << 5, + RightHand = 1 << 6, + LeftLeg = 1 << 7, + LeftFoot = 1 << 8, + RightLeg = 1 << 9, + RightFoot = 1 << 10, + + Hands = LeftHand | RightHand, + Arms = LeftArm | RightArm, + Legs = LeftLeg | RightLeg, + Feet = LeftFoot | RightFoot, + All = Head | Torso | Groin | LeftArm | LeftHand | RightArm | RightHand | LeftLeg | LeftFoot | RightLeg | RightFoot, +} diff --git a/Content.Shared/_CorvaxNext/Targeting/TargetIntegrity.cs b/Content.Shared/_CorvaxNext/Targeting/TargetIntegrity.cs new file mode 100644 index 00000000000..7ded5b0123f --- /dev/null +++ b/Content.Shared/_CorvaxNext/Targeting/TargetIntegrity.cs @@ -0,0 +1,13 @@ +namespace Content.Shared._CorvaxNext.Targeting; +public enum TargetIntegrity +{ + Healthy = 0, + LightlyWounded = 1, + SomewhatWounded = 2, + ModeratelyWounded = 3, + HeavilyWounded = 4, + CriticallyWounded = 5, + Severed = 6, + Dead = 7, + Disabled = 8, +} diff --git a/Content.Shared/_CorvaxNext/Targeting/TargetingComponent.cs b/Content.Shared/_CorvaxNext/Targeting/TargetingComponent.cs new file mode 100644 index 00000000000..a558a09ecd2 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Targeting/TargetingComponent.cs @@ -0,0 +1,57 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CorvaxNext.Targeting; + +/// +/// Controls entity limb targeting for actions. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TargetingComponent : Component +{ + [ViewVariables, AutoNetworkedField] + public TargetBodyPart Target = TargetBodyPart.Torso; + + /// + /// What odds does the entity have of targeting each body part? + /// + [DataField] + public Dictionary TargetOdds = new() + { + { TargetBodyPart.Head, 0.1f }, + { TargetBodyPart.Torso, 0.3f }, + { TargetBodyPart.Groin, 0.1f }, + { TargetBodyPart.LeftArm, 0.1f }, + { TargetBodyPart.LeftHand, 0.05f }, + { TargetBodyPart.RightArm, 0.1f }, + { TargetBodyPart.RightHand, 0.05f }, + { TargetBodyPart.LeftLeg, 0.1f }, + { TargetBodyPart.LeftFoot, 0.05f }, + { TargetBodyPart.RightLeg, 0.1f }, + { TargetBodyPart.RightFoot, 0.05f } + }; + + /// + /// What is the current integrity of each body part? + /// + [ViewVariables, AutoNetworkedField] + public Dictionary BodyStatus = new() + { + { TargetBodyPart.Head, TargetIntegrity.Healthy }, + { TargetBodyPart.Torso, TargetIntegrity.Healthy }, + { TargetBodyPart.Groin, TargetIntegrity.Healthy }, + { TargetBodyPart.LeftArm, TargetIntegrity.Healthy }, + { TargetBodyPart.LeftHand, TargetIntegrity.Healthy }, + { TargetBodyPart.RightArm, TargetIntegrity.Healthy }, + { TargetBodyPart.RightHand, TargetIntegrity.Healthy }, + { TargetBodyPart.LeftLeg, TargetIntegrity.Healthy }, + { TargetBodyPart.LeftFoot, TargetIntegrity.Healthy }, + { TargetBodyPart.RightLeg, TargetIntegrity.Healthy }, + { TargetBodyPart.RightFoot, TargetIntegrity.Healthy } + }; + + /// + /// What noise does the entity play when swapping targets? + /// + [DataField] + public string SwapSound = "/Audio/Effects/toggleoncombat.ogg"; +} diff --git a/Resources/Audio/Medical/Surgery/attributions.yml b/Resources/Audio/Medical/Surgery/attributions.yml new file mode 100644 index 00000000000..c88a3e0b70f --- /dev/null +++ b/Resources/Audio/Medical/Surgery/attributions.yml @@ -0,0 +1,49 @@ +- files: ["cautery1.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/cautery1.ogg" + +- files: ["cautery2.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/cautery2.ogg" + +- files: ["hemostat.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/hemostat.ogg" + +- files: ["organ1.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/organ1.ogg" + +- files: ["organ2.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/organ2.ogg" + +- files: ["retractor1.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/retractor1.ogg" + +- files: ["retractor2.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/retractor2.ogg" + +- files: ["saw.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/saw.ogg" + +- files: ["scalpel1.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/scalpel1.ogg" + +- files: ["scalpel2.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from cmss13" + source: "https://github.com/cmss13-devs/cmss13/blob/fae73dfa5aedb0a253de04b60085ed8a178d3bf7/sound/surgery/scalpel2.ogg" \ No newline at end of file diff --git a/Resources/Audio/Medical/Surgery/cautery1.ogg b/Resources/Audio/Medical/Surgery/cautery1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fbd9f2b4d86257e87ec704b2138249f9c60efe65 GIT binary patch literal 34770 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/Medical/Surgery/cautery2.ogg b/Resources/Audio/Medical/Surgery/cautery2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cc91e9f3ce679bfaf1aae3ea05bd2e10be827a49 GIT binary patch literal 16854 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�L!ICar2S(AT0m!2gadm}(y$<_sa2T&)z z8=l_y{P4aAd2$8qoMi?^q}6%%_C_3zTya&@x%oO54$1>&dzz5a7aO=Q-f&^hqz@47 zx)w0eM#tGM8cC24Pr5pL||ibPeBiio2)|C|ITk1j|%_Kv#{ zAKew~h78*cPcRD?AG79|yijtSXE|MD9-nBvai*u6IF&>JTCMU{eml60*9enPy_Mf* zB7sg97@Kpz^9X>>_NUj|8D{7El36zqqp82VPP*m{xYoTo#0n_mbgInxMU<*_2pDMue_Uc|Ox_j}QE+wp(!UEK_~#tEK^ari1>#&awq zm&29+o$y1mVt&W3pVzIBM!Wm$W>b-!j!i)O@;3_{e}>v@_}8-VQfxly1;T5q#H$aF ztLW;d8N;^W>a!BuwgX7LwJJAQfNS&39J-|)SGuAi?TCRMS2>r6?TW@de%Jg^U8(N8 zhy1TA?^zV9KZ|el$KjBrfos@QdeVh0ye1cXUEv{h=3OR|6okU8>tB~A5BIZyO^**& z`Q(T6r$q0_F_?}>HhNwJA77o&PkYZcz$&t_SXQG#AB$wJA%N_#gY^U~dWup4lNqN9 z2s=PyJ+=4T@reW;-kXOxsDV{VO2u`uNDSbxup+Cqh0LF`r{m+(wQJMsA^zcK-A~?j zSx=OyC>MIjVVmN=+kG%A-K+KF67dsj5xe2OJ}UoxW1M)Z#A2(fyQ=%&0H{#f2&8qhsB3VEOoB zVNrlErjW1~GHmEA*3~fPIp))_2pA zChReztaJuOWJl{@Ii%oxK1uvckg#ZhS!R*_>rvEfg+Q7_yV*oC+0&Uj*g#$cRzs+L@0*T(XOWT{nz_3f@h(-L`zoe8iIVmp7Sqym zaxUCe2$8@8Nm@AzK&kv5~d_F#>r=A0sz0TtAd%DCP_tyt0C?${?cF(->NhAwE#xTf|U`0ab zftr|Bcj9Z#1yWI{`hwETF> z#PL_~vvB56Gh{p_mpTlJ15((s&Pvm~StiiP^51+fFuYHUCRgZnICkVRYoWphBo-g; zU6Pz-7e!4@>KSWBDU9Jf&5IEkrP+GiAE0fhoS!*O8ng ze)iSMVeq73Ym2VIGC3+_CFJ!N6u?3&<$aix90t%O;CpjZ(RzN9lSg}blT^_vW|w8u zd^~EOO7k;_&-bHo#o!NG&NqYkEyA37$}DWdIagnnOuTsfPp}hH+Mx#yqsA}ix5-{^ z<@?s#aJ|w`l(Hd`2>E7mbN!sUm)rBJ_{@%bhuDa*YSzzPX7D3zHv$bm_A)A#=z6SD zJe7k2bF@R^ZOQhd?izFeXV!!);NmyMr+4yZte}rwioZF=fH(vMz;DkM0eh&8H1EGs im7s%^w+g>CQ2zPU`nKnPtADk++-EmIg8xSL=lMVXV@?kM literal 0 HcmV?d00001 diff --git a/Resources/Audio/Medical/Surgery/organ1.ogg b/Resources/Audio/Medical/Surgery/organ1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..37eaffc1a34ceb6bd5978d4fdadf3cf006889a82 GIT binary patch literal 18912 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/Medical/Surgery/organ2.ogg b/Resources/Audio/Medical/Surgery/organ2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..43b22f8354cee8f7a6eea1df9eb312f57dee36b8 GIT binary patch literal 18946 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 F2>=m?oZkQd literal 0 HcmV?d00001 diff --git a/Resources/Audio/Medical/Surgery/retractor1.ogg b/Resources/Audio/Medical/Surgery/retractor1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..70625c961cf982d3bdb93e106b91fd4a410211d1 GIT binary patch literal 11537 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/Medical/Surgery/retractor2.ogg b/Resources/Audio/Medical/Surgery/retractor2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..94548ec2504ae8da2ab7c9bc7348f2284491a6ef GIT binary patch literal 9915 zcmaia2Ut_h(*Fs)L`0gQ8k82AbP0k|MFOFO4k8eG??@30RhlRekt#(3(h=#Pf=K99 zil8WnfCy3qL`3v|0`I-=`@i4!-0wV_&7PgzncbP+%$YsU(Q|S#1jvBDu7iN%M#0N3 z(GVU;pqDS!#gEhlQLp%G$PLI*qY0u%n)&aGG?PSO@ickP*!<`JyL!ow8OeZjGZ$}X zaXnurxVsD18XP^S9IWp{sHzbUOc2xT1Gk=N`77ep7z#$0lrQSzQNYM z4*tHjcK%+zQZ(QQH9cJ;6*VIzDzL4op^MQ_I_^cIHFS-XNYYd=Mp}kON)XE9g(Fne zOdtShkfaX03paAl7yuXnz=jXOkmjg`Am9sxf-~?}Nv$r4_zZk}7tAh6lK8I*E@RIM z02BaDh&K7rl9uZb(g`M*?3<5t(UmWOQzsbAA!%Rk3fOrT*A=^Y4k7qyPMA{ypjDKw z^2V@WNEJ4YHx>p~x4C?KcuR78>4YEWN7704z@v1eR*KSe6;>WUN>=zHR5zkZFIG2( z(vh4nv8#GUWp&eU2)Uf|S4DfY4>-6MRVsFSMpYUT`#3~#hA+tKcw2A)2W}J4OkvS_ z!qWeQYjBiL@0+Lrv+Ss}hM^JK7`y_kOamRJ0t2Q3!^|^cEStj2n_?{A#8~ac*urA} zDnG(L?2*dR*5ME!{~R)X0a19CqwpiLkUToJf()=HsRT}&dKQuTNUPYke7Jf+ZD7P+`^uX7DNXsI zr$AMZH1glCh$Fm!8{y4$On1f6NZ+$PQVR}b3oD>egC0u)2gDV8f@h6nZ4V+DvKI48 zS+ZYu#2aM`HkW2(A6d|Shg893K`Bx~t$GYi;?$7c)HHya)E`wJGO*K>wCkn`Y-_?c|CW?Cz-wQrxZ zK1fUI`%m~NgLboh10&`}!o!lOuq?dAylFiCcNx<1C3_G>Ja>|>ph~0kG3o%*GRepSe; zZiMl75kBs#Af*RAxc26_^07E`G!w%kN%?!Z*dtg@q=Yl zO3YAN$=Jx)G||Q9s8fa`nTr*pwmPj`6M2jB-x!4rK?JN zY~X)+jt@(B3RiCmpLQ)DdQ5cin~dJJ%qX*lfehM^)oPSA;5D0rp`6ugS%=rg4ikY6 z(+v)mjbY{ue>u#t+kBV`_=o3^T;wb=dEsg*#owNjFO>XIKKYzhDxZ0(KybQKd{$}Z z!FXCNQ!S7%^ibrT^|RAaz0p{aOZ8 z?0o=W2Y_>+k)s(CeDA4xDw)wpF7Z(oAgKyo!JpDQ;g0T;q{@wAL=db^X3~) zlhJ13*JjojW^tHeMo-^VVtj4d?(Z=;2 z!!i!jM#i&j#uE(=Z`s04(*r(8qs_tFNst;al^$k2>0y=e7b`T&5i2?4sRmgCe`5n< z2XiB1^FRmlJ!8|!Fl~@(h@NIOHf}JU-t{m}51aQlwlZ~?-ZM653%8t#ng1R(4#KDttE%X$tuC)}Uj?aE zkIQOB%gRK{Yby@QL{}Rgm$g*()z)NJm9I8z(07Wiws@CSRh8GSk*F<|t3;pG7Kxk1 zi2ma8FD<1lEuO0_J_8LNT#w4WJQwbNS<_d$vD$LJE`Zm-IA9iUwO|VF!^8Tv!(Lp?;IyZnoM0buTja8>d@{i)3tVYgWp-KlYOSY8XT_?jfpM7C zeTNShtjte)ez=fqId!M7>`RMq|8r1~PQ5T)pC9jgDQ$p#G;K7GZ_GZ{Af(&YH1OZp;l=<$cj+Jrj3$pV6pU+ zoa6#$6fs$9A&4x79%96-b3{1Es+T1ENXB9Y9%Pjnm5M@D-cQ90xC=2b?>KT>Ds+4ogzkhnEuap1F%b^N9V&JLENTQ+#A3&ImH-3o zLSV52bqn)jP!(pk8&VNMMC+r35iyJ?Eq(%+Uej@b`JDR*-i!-e&~Y5GfnuSOv2cGQ zDdAJmIw--?2vDPy0U#6zT>}=bm342FX)0qTrL_4$C^%NW%CHatfHiPIYe#W}AGk*i zD8n9sa*%RB2ejWq{AB0VG&4s)7VC-z$g$D*}FuM8Kd{ z;9wtu;7=mpF?0YR>zA_JP$0o=uo(c}QBngnFa*+eOrXPq(upVmYeC(UtIeue4i*3SK}Bt7H!_8&R>-`V?rYgxKgf{^=X z1t`CuqXzy^bDC(%BRJ?qNqb~u0295=3~QL8)Qyuwy-~S}AWT{$ih(YN0&lTNvauL& zNY@)|g=Enf2J}yuT?Obs7H;6u-NX>}lh~wsQ2$_rn8YT^PFm0dbDrJ+?rM!s?ERvr zFGuH&Y|RTM+p0&}CLIhgpe^!AXyH{yfv6&3gf|*A!*O5qy?^&HDl8vE3k1~i@i@G` z>JhYP3cx-DHwZGJqZU8dqCHOFj=&hr1g3I$kn?dLo(Yt3l-}VnBt(L$ArX$Cdeoxj zC8_IZFz@kPQZ5KWl$;cW&wb{5)OXfhX8t9)zH<)>z(E1P=Z)(sVzLL`l@pz=9evN2 z5i5QQlYrEG;&7F{3pRn5B(NA_+&<@ElMM87?NE}P6?hYrP)g*OZ$*9J0C=8-(*P2T zywVZM5EfVuC@7i&0p!=Tk4Rplp!mcjMF*wpj`kaKAqN6;PvWP;g0$_H{ zriU5_y>q87k^Zw(JEhgT0C+TT)81J zt)?sLJ-h_$&7v8fc)0WYU|j?H(nbjTno1fGa|NY{xaCTJb(hS9NMnkzrdwT#Q@l3Ma0Te*Fe0zARJckL@*%Y z;sbQA4cc$;APq7%)~9=fQ4-}hgz}e`0O!wr97MM4!sWLjOe;5DsttE*{&9PIdlu+} z{K+uIU*;5SsvmWvGdv^bApRa>#98SwS08RwBz-~HJ6BDG*Q_|8^3Ij5$SqsUHFH#h-<8HQ+d82+7<`F?BS+iOfK1`jDfBwu!U@6b3 zn{4Jb6>S9B58aO{jEp9{rLMpG(w?!Lxn)LO1p1WV$4R@my9ZvC_|$K|y>~b=60!bu z#nlEo3UnEH#LH=-pw4-!9h!c% zObK0fFS^>^`^v02;WD!JgY$ikC0$g(d+M6q3aZ2I`R0uZG6o~-#^NFJvM z_NrS2WI(cc_-YK=_4-y+9_#0psc!7V?hlWx^V54Gu>K041PcfHKWr4V^ldh^P5y=* z5nEyr!V(U(KA8@d=*w$s;&X3PH}~fQ&qmCK-&ITvqBm|ES~GzH?`RU+l)nn;GwPW> z4T%?t@IlzYM38d)y&I>gj>M*(@DU`kB^alfgXbZSsii~b@{PQQQ>HVL{klp#y5qWew^#K6I zO5obqCxA(DLi2It=6p{3VTr5$zee;8N+d-a|XZcZZWUluBSUwZ#DU8zMJPw(A6IRS5U#m^LRUi5~nW|zKTXqcVAgCMPe20fgXh2I@v71xmVOS|;}`b&qC z-!1`0S8~Y{B;r3?^&{YwZ=eT|FP7^XWI0=lf!yS6|xKwkXlexmbk4 z(`#;Ng^X>E9xR75if$$JKY1-RL+mbNKfB3RC0FAg3}{(jcaB@qDbQ=D!k5ypcgBFPiIPAp^($1j?^uMX|#e$}ED@<;du z?^!b7$0Jdu$L~Z|# zcupN7QwSHg-$sDKOvf|+^QLs}EU?t=!w;N+)fNJhD=u$T-OxTp(DRjfoYNfGS=~EP zp^+7BwUJWmiWK+F1lWB(pDdH+mzT7Bzj3yNGAXI!mW5~@Ti>T?6WzhO3w&HPCE}A^ zmhUXitU7km9$r-t_Wbyrx`o%X1bT=8t9GuJxGFI>qe(GIsJ^Naxa z4y#_{#r`<^JZ8K6NX02(r9Er|DI8I)Ih^cj9>}v$r(t6)zL(%KQC?t>%}EUzJOun# z=;-cDx1I2DRyuTn)4#H*Ebsdnqopo4>B< z_GT1F{YkA40V?~;%pKm<`N%`Fs9NHOD)U-ANA~uDE3!Kp^tkh?9>lh?U7N2O&f;&CBwEXJbd*h}ZlmgCW;#2thhbZ$Gh8x5m8`Z9;CAPzDPR02^wzpn9 z*8=AbjU&G(2K`Pphc2j?h>dTCJru&O-=VA@4ph0ovTT(4-t*gTM))BN&{?dSa0xAO z+#nPCssH#5#kGTQgK{)cSY#!PTGS-j<5|u!e|Vm3$f#?Vjw)yN(2p{5_gR!W;|4WQ z>Gf2VN~nEd>&5o+>Neq$N8ciDakRIw!Z5q>yoY}X$1DH`-H&NWW_G^K?A?zA_)C@UuO z?!|LLSjo+vm-3*|YxGVJtOo&i3N*4SSau;JKpSP^jzFcAP^3>XnM4P!RjY(Cp{C|fVey?)wSN0i zPEwpNY<~X|1Cn+FzZA_MA}HTX-Z}+;ByoY=@r!Ma>DLV|ubuo8Z#UtMJErf~a2zqHgSdWV}qHHQU^IR8o_9vfEzPA8#qNQ%G zQE!%m&EH6eyUD3u&wSBZP^(e&iFFQg%#k00FV$TA{S(Kk7?jWXmhT~e-$E(TtsXw5 zVVH&rux_`sIuGS=NrI;!zV%s>?6r zCAb-4hW0jsB}OvZkb1w-$<*tLH4kd#z)USXQKRTq!;Gm?e80T=&4W;WgTV8?g zCJYv+)|%0XR<@`C`puZQva;73Z@qIP+nyz5+>$2qV|+ynA6~?SF1GAH;{(={5swcP z%V<14l&y9+mATOo%*{twp;R;RZ=Not3cyI>tciINj zB-|g*(??o38qHY<~w)$&ezOirah3Dw@z+X!!) z@1dKFK$%GPETxyDcBfH`j2qwbt8Pi_x(G~pTgPM3S_j%2KH0kLcoDW+tuHk{Mk3vu_J@G8CVT=zyI++9lsP2|5hUB&VyDM$ivc~?Pk zs)+2@wvx2@eck(l$q2^nq<215Zypw!xfdip|6>XD-wkAyu#?VHy3JGMD8IvI(tTkz z`I&~sGwVxfirg&y{7mELA9CZ~?P4J0fd78gXZNd}o9Z9Zwx3hR8{x#d_pV1LG{?7v zx&wn(4!9ReJ)~6xd}+Tc8q9LJANH{dWtWNtk-5$s^5ZViJ$>?Y3;(1Shr7NjWH|0u zs9+4oPTXmyQ2JvR4N*L-+H-z;HSb|F&T-f@?F5rcQ^Njr6O$RZ`=tJ}c$;O2-Ny^M zx3aVQ|GrlD(LGcE_aosq z&MR`_LF*GEp3z_X$WLUnbSy3C=u?hfq+H0#$mUKVjJcfVuCHnIDzZmk8tzZDm%qNc zS@N}U45A=6z;Q60L|0iYi7k8?tmk>=%;mdMRMIAHrtM~StfPB&RAlB9`VN7_VCf6y z(Z6q&a$l->@%`KOcC(XOc}lQ%ukPfw>{8X*<&3>Q88@-pgk4V^+n4rqROUbET*=MC znq<8TC@);2P9NG?&y6D&*X^KJu#{D(y_%vF6BF%~6dgL?B~ll)nMrkJd}2YP_mGI~ z-3_Oe(%{yNIDIK->1nHztY49fVE22+RY<0E^GoVGx0cQMamp_ggnuV#M!TLv`!3CA?)Z2%7&w1^d>cG0;5cDKU+Jq6KKBt2P@ z2AF*G;)mqnYbj)o_4>7$Ti!qS3Hbd?vB7u4L#@c1soIpqkmJLv8y)&Js@hWUz5|XSCfq`WvCE$}0fFE;g?k30ePf$@@A~A>UEv>gyYDj{ zSYTTg5POlKXPyoh+!1QRM=#F(q~UtjOQ^|_734&2sYSG#bloo{`= zr&GfM6%ZPAp@?r`1`PbSF57fLpZ~^^*YeiUW8|*6n$jM8H%oGjGPnI?8z4&F2d?}8Kdh#-UD^33dFa~K)4^7v;Th0B9 z`Pag#HP4@$dp4e~H|FxlLnjr{T5)BfFoz74$qm8t-||lv5~uFQT|lC3&RNXtdH&ja z#W0hQXPdyh;bw2oZMXcoXsaYe!t^(Eb7%o!l5uq?*5ejonb;s`a9Q|kz2n2fbn8%8 z`?03$=>r{yRd(2QEOT{nFuf|dl&iD%*B6!@F-F$oqOGDycCyN}RWBTC5fbD;ePV`w zOERqO!c5p%W^+{xN4E0`ZXS)ck)@L)({f$P8kBqF5>epU#g=9_VVUibPgYiJIL%+k zX9$#QXFs*}3j6ivzG+~lR%`Y8;Pj={UlWbfX^G|K{N;0Pc};UWy~0K(E;9VQnz_%3 z$O>{(E_27f^t`(=*!;!PSyQ!0&@xW$8KvwwzTT_m>J_{4UE}nvZ0yW>Z#+&}!{rc2<3x z$RU>G`O`9nTS_3eV#^dsKZjP7@$=Aqo;IzkeVx^XAz5M#)XEgosGE@^Qzd|E*d4QR*tGKP|E(~lZ*-> zxXiwbf7LA)7E0BdU^&i^{e6rxH%=cG6T!%`X|~Gt{(GE-;k}f-&G?l75B#+4{T79Z z{5qy^E>!((=a42HPd(~%oy#%-{VB+Lks4ndL_P);_C}~PVT_-r`RO<2OL9f@`u zTGtCwmo~edUnDT3*>kVi+8QO2^vUf&4G~B&mcX7_T+BzuE$!6|gY|uYe zYJ&DF7oe9hB{ekOM1}pqw%6wpmeH$?#yQq*UAjVqTbuc8G&9-j#Yx|+-+QR?rnyF8 z0DtKN;^(gm>p#Y)u9>Hn2clYhyed`KxGBD^i^ZM^KK%qn|J&ICGTwfwOzgQWzgRn$ zx6}8H7XfgMy8_=_l}d(g)}L0mMjy>F8YC)5E->*xIJ4?QDNJa|x0hkd`sW4=bi4Pm zEHMxCp*`>^R^;u=N{vXKkK?@TZ{v*`0{OxCsXRV?-t*S)UpIcteP}$te)(|YR;FUc z)BW#Zt-$QCh z`*I~P`CRS7q5vTwQo~yr`Ns1+?Z`^N#oB`chp$@qHW(;SvLnPX!2*@d7GQ7ng~)Z% zYt!elJ2y6Y*-frBxUz+8&c35@ZuRcM5Ppf0nEVs7^z16?BA*k)Em~&I2 z^&z6)mhf!UDy}}T=gA8W?d54M?fIvP^`;(BqZ2Z-&$-m#Aren&3^fj4?VHWRY#&kB zvQ2ymzw^yWA1eK%|H^88R+ndx!uy_TTd}>CQjN?C4qvx~B7Wr#b>Sapm}6V08ojBC zu{`1-SG=2r#PaC6D+nDSfvxBQ>l+l_@;>6gHw$R%^M&%;e&DA>z;lP29*eE^;3q@T z4tMSDPqJcH0NidZmE(Z;vbE7^v5f~wZ#!AV&DPJnWY6g7vM%n!m&{hnyI+rmH)T5t zOYKur(TH{)CgnVxgT8S;k(nR`c}r;+m(V^sO-L{UJCWnm`g||LNiZ z`deuPDZh;TU)RgX7s^;0W-Lba^Z)DWhyKTi144gi^WK_C+1ZNB-o{kxFMBdsGBy@A z78Y(64l-Ib3v)L!8%HZLNk?}ZXD3Go3rANvc*rR9s$3Q&CJ(O^_QC(jciM zt}Fq0kWwI1cXczjal(7)C99zzDd^(l=4fu@;^u5+;p}DPV&Z`SA&Dz1X^4tz2*N?? z(vnJQl7jzQ6%{3wGz4G7h^lGGs%r>>VE@gSPE1@21iW-&RUqpDkHu;N00saUQ_`U& zSjy5BCVrvyN==k`sr9f#q$Wo6;G0FU_WoBv#$k>N05AZU7BMD&Th?}j*9xB|#yOYQ zMv14G4E~eq8ZY9{D{3>xqS_)m#}PUz1XLYZ0Adai8S)SuwU@#)oIDgCQiKsZ{~|BW zbVj28n)?xn?H5^)0^43ef)d}}*Zdg1ecIYFF=WQt2{{GUX)UvgRyYG+ml58b%>NXK zfAt`P%tZ{2z#Kyi;e~xTT~Vqtgw;Q_$N(@zO+Y#hN45%Qu!?wioKpFmK^2>GoLy2~ zLs1iQxfy7?Tg4DLWUSmK^LDdTV!clVUtmB{jJ_%u$p188s%>n2$W!6W&`Bf zq!;~vZcCkHi~svAV*QIA5P_^^-v{Ep50sK>lzq+&@PAkM7XY!Th#EtWGl#SbN1uxT z&Z;;+XS9S|)?ai5B+)TaawS13Y6LWet{?wuP6hzM7=Kax zU&UW2|3h&>{3rSW+L|G@L57#2tZRhtpt1`?9EBBvVg^nKilghcvt259W$X&;W^~^c zCaTHN75?)mh*8PRV@2Tz{yIr$s`CI{F~lqWr{PX1M=@WI|Brk0j93+m3UZILF{-l* zYHDa|yF2KlxGgq>7|gk?&ibv+MjPRU{_nv0U!DU%oF@3MPbQj1vG!#KDTyKeGw^?T z&Ig>nIO6^|O8II^#R-Pta}MPTj&W>BRSrdUT!V33x5-x)>RbksoEDRs7Srw)^Ys>b z4SqWH|8baqZnHY;_CGx5#YHH1V>V>sVgB25a%p4Md1Btk##8FVQ+p*_MWmOcW$%^b zA^mTjWBsW(^;2>9r=9Q^+K6PEi1gB?Jo|x)gXaJ1{l7d%+L;n^Lp(>)neu;lP6sQo zIK-Q(85A%6=_oi3Sx{F=y#Hwc0O*KCk^dVYgCZd1a3;f4FsjUQZ$!H&XETSAT2!MxtkiU$@;(|nQ0KgPQ4T&x!QEh~7J63Ig zb&FU{j<+~deS{a`b?^WyTviYUT_Lgh2wfj>@Q~pfFK_+S`Kqb0D}ft zdrvuvn)6owY+M(368H`5QcK?Jcb^*Rx^un-$8azO}L)#b>3X1{I_ zN9`7SKiu1S~mgy2J@J_%DSja&})5XVmPfil$7D$O>M`*)S$f z=-QU_PU%Krnqjc*6qt|5A{N%Z5Fo5}atqMJz}TDqrk4!Ds{cj!Um07ei4az4LGf~O}<<>A;PH&@#W>J>R#D7vThT~*_6KsFX?%u7XuNlZpT?PWBWqTa}bA}r_+5-{!4RHTgKiQ)AASL^i@gm5aHVkx>3A|6Q&SW@oG_!5qkDbMai}hLb_UH z-S&cuJ?Hh5ZrO_rdB_{W<#W@O79{F`p#c#vqDAgY2zhZ^(Qvg9SsM)JAzpe!u_0cX z5@!W5Iy%iEQ3R^G5nejFo*7;Qs=`YwO~RG;-C0t zWe^9_wS!FEj*+fz#x$x9vi^_=F=HCZIirgVtU101z%rE|LX!$=evYsGwKX{;*%te| z+AkXeHHa;8U(iA>AqPR#3r5I;A!hj3799J(+A#Qb{y_@@sGWcP5>>?hLJQ#wq>b)1 z1Z1>-YgCXL;=cs$FBpTdAgNp;g!8|)L@bDmzv*3~+6y8fOY=hb3)R0hMDmyA`rDcO z-`JO25CT!?mni&Zmok5V!k**zPiPhEUvdB#1pq$G*&fi%{37eg3{I90j&;T`Wx`bZ z#4BB8Aw$rEKb^>0h@-A%x0`7irK+4|Cdb-UmZ&918~1U-xvb882(pnSLjYJX$k_u$ zKsflnAcBHn=z!eHjxkn!7?@2gHY60JzF?OL8)yI{_!mlC_&XFV?9#wIQ$FCGzVR=3 zFiLcEZ6xw8TL-Mck{ekt84P)N4+tj~9E9!YxsIyb*onv|S%~&;-wgst03aTfjDjMa zHwNu9dMrj9W;|8`b|M760I&uEqXS?{*zoXh%b5JG4QNUU^WcK+O&F@b^yyAr8JoN`LI#;@yW&q5iAwjpM?8w%JGA0flQR}7TurS=3G7I4?FbJ=IQO$9lZ#r@-cQjV_Z>vOvJp$EZTzfw9eY&?#qAOCBhO{2rsA>}W)D{Mf-JHRbF!LRkvtYzbV zXgcsUbP;i z5KBU-75Oe{12*pki4GlS7V-o8bF=;Ez6TY$hy-vI_5`0AO=bJ5!{YVus0Pbf7ARhywIUB z$CvNy^4p{4f~h}uQ~k7 zL|{mx3NL?|zh%)dc6Dm(!#q^mU9u9P{bip7vbv9UUF|f&sK*%*XrFKHrh%XEFeoh? z2RDnpj_Ki$96JNDip=8KQ~rf2R3`Xe-d%e zG8uWVci&2&hHr+x51>`QT@9RqZ}N@9<5eTV7recdq7eL;@+9)7d!I{Fo5a3uw%oAq z@S*SEQ8xv%aF<3-6hOetpG{#zzYm|Wo%f9Gyz~#|zk>FMs5Ba{2>OX^>%~nY)WBm5 z`wO^C&!&-#Z}k_G0et;O3R!>G$=_RF^mKZ7#QW5@leF44#qSkQYIensal80sGb$4< zTk9B)d(LCA(Zi;tQ<$XiMk@Z9Wb;Q)P{~Y)60+w$%_8+!v>C%m%*4V(?BLsE8{$c8 zCZZxQ%95~_sD4%3F6VUZX#e3*shjdkR>kI>i%|0VgCb8V54_Dfo;?m=?Ah#}bGNuV z+9+f9ImdoNi{MW5d(%^CLw$GhB25|5x-@v-Q%+Le1!!!3JO8K%8(4swg5hwMLiEJB zw5dr69epf$*I~!KJER!+9n`x|AMH#@b(6pcs6dn2%`6V}?y%^OK4#rak8ka7Ob_48 z1a|q9V7@+PIPf7NWP0Qf-kBMYSZ2#@U!{i23yn1dTE+Q$d4}#t1eNW!_!&2!4VQGT zFEE={A&2H(a^uN3GNx>TOiU;ujeFKDlr77AL8$ z|Jj-8w)4HsqNUTb@{I*z1FCwVLsn8R{z!qJ@O)-D2g{aw7K#4o5FU`Ebu|p%&*8wA z)$jh52D(5P`V8;>h)Wx-iR5^nVA=*fGxB4{p>z)RV#PObYc!S$e3{C}DpD+Z=6g8f z(@J%;+hm=j(yU`)oZwHE@Q?9~w3HQH36b%vB56Jf5BHb~p8_b2cFiC7$!Ruy1`SD& zdi2b$gvv(dB53MP*h?l5o46^)e%!>eqEyuR=IWoxLqoi-QO;hR!gme&Fm!p8f@u;4 zEf+}6Rl&Vp03*Te7URJK=S(L9dryx>&%!a^N#!q+jwt%^{w%PN;0q-2F&-0!W-Rci z$J*|wtX`h2%qhX`QvO!E8M$FMqJQ@ki@NGySd5byvh3P=Q4Ak;cEQ@Z5+87At_+gp z6};JO{3PzEZertHJ#jqOt}iE(Nx~2!9?hhGrz21$w@w#p!z*zp*$^y|GbQMTTC=LS zA(4lfui*Bp;;7&6zHkTs?Rxl5eg}h#OFC(r+&rxHiRdYcLw(}fL$m3Xt<>k>LU3Sm z%4@lZPHCQDK8UUy(F#oAr&t4~2lhGdt*BiTps5{H*s9vdL+?veU;yv;ZBIJ0qS;r8 z&)*f6>kS`bTeDu5HKZJ_6d`o+uYUJNEjDao-yU}8=u{|Qu8j2u4`$cR3t=))GKL)$ zLUC@iB-@ly*M3{qFxjg0m`s=2a}Z1e4Ye-&F)ns9#dQB<3e1bXpEvix$kTz_q||R2 z+$*Y`9`I2Z+ZrFqWI%#OJasd3ouyz8tS}!~m+JKG6=8auf?@ekSsJDl9tg^(2e24~ zIP~ecn+JV4N{s*+G}@Giz1ex-iE8QgYZ+_Mt+5bJak58y-#I<(ZZs#CKO*LCvAhnj z*5E5&+O%%7pYr@T&~0gZPH}(UcW{|Q&VyUbg!)7xqv&%v*Q?HMkRY~YMDR1 z^Lvpek?*3i0EN`-+aQmUn*2Y<3ZQL^xtT(CK`13%7Y6KKUxoEAa~3X_eRjS`(Y&Gi zk;R90A$l&kctS-eic!z3NYu~k=GHj%^lGQ=m>?GA{+BM%w6Y1cD%{5rw>N|ct5aFc za<!fX7`730Y|zpZqGm!RG_AVj@%`SCr!@DG8FPkGD6 z9ublj)R0ZEJlKZH8H=oJR@oN>@Y;nPE1x81`SQLO{C+fbT=%)J8gafoRj`7gZ{=AZA_oOhm;-3P* zSJ%_13YD%4T8I&y1I}j;s_tpDs6onbCoZ;D>mO=2xEh*{#4l_&)4GcRr-Zs`grQ}K62qOdqD_Djr2&ei6e0v+2A0pB;R z#(Ik`Tap7EHY^r-&$lk`9*pyHJW`cX+&k5e%LDw!PqrkDTMq)fClM#dQpm8u1gEv- ze%T(yGqABn?ZU;V<3eV2p5Bi3=nnq2kIm!!8ps{ZE5AK{(~EdDW4}iDo&^_87|T?u zQ|00NIS$UjQ-nQuq{8Z{17tlfO)VX%dQikhae2{$ZZTlST{;)FUem)OF%cGA`a56PdGPzjiPQrB?>YFgzu%{r^~S}McsEx2>ar^ z?r19$7;Z66tC+Vxc8s^ocwv-epi%^Uy+nM)4r3v*zgzgaj1+&Mlip`ipFrxf(%^f; zo}HvLhgG@>`d1=SRj=i%o2#)QK}jRfG-NF$41EXW{)XRz0PY)1YSdAIB9^k!JtB}> zKT}5|Oo~XflkfOM-g1BN@SQ20yKG@p%R20-o-k99B$@MS5(zcy&NtHGejQ-3jW1R; z-%anRH}H9%$vr|j>ErHRP!}hM)xg4RzEgXE^)#(1zK*gru>VAijo%^_(sS~dSbhm3 zy15S9QQ&u$&+uzXJA?AVk)gkf;LH5ilarwy$KA&n0!?+30+SFFzCZzs=<@Eju4vqX zriT7mD$Iz(ml8kdMOjex#qHnMPrF_h+unT^p^HU+Epa7(ik2O^6orW=Zsw~ZJT#?x zoG4W$&|waZ-<5U3yN;5ZqXK}#l6~N<(DW5ZPRXjjj8_L=SwbY?`l$?@@mRst%EXtCjjo@hV_Z$5EZ$W z7I4#w|J0~n-Oo$QqG7|0*`;zMc;M5Q=!;Q9$D(hp(RL(VUaaX<^NKvW)n8Er`TcqY z*00zkE0SaMuX?SVD!slp(PfXbv*3%*26U_=O9hf>p~r{{NlF#qNg7+?5j(d1LKgj zrpPa3DvWwP-#VtzvyV8j-fi*dcl&p+I;6PDuDHe)!WPJ}#9m_QV{#P4>zBmY4Rhit z6K`WgI0bE+^?y_mGU;8gX`IZPZJPyQ-ytU?+wGS1qYSC!lz|$3dR>ZFi=G}%b~(9J z0@uL%RW-ssf*W<8?qrN_zay=P9GVYK7V22ovAVKEI?cInmG497PRr5V~$@Ux+Rr}^-Q+jsM4Te*pNt6|itF>AC2m{J zoW;pE;cd%zh~uFMmS98(H$USOa{dev11Z+c8f>UTiFoA$;;XGC^w)Gy(>cFd1fMAK zu6fI88>SPZuqafDc0K_3B+-gUsNl=-&Ju#FKeh@i5)0DyCXy!(6EFbr;Gf;jqcDvt z99~O6VdBP9CS=-coNMxf9y=(z9+LE54wKz#2yS8=zL_KFwu7xK0Ndok1u%*zeUy!~ zrg8ZU12FtCT8U~{B`r@P_B#LV^R{JCukA6uv&^1*8va|Xi~Repzq@h@Gzv7A)Vp^gJP=zUz|-Mh2E#^|^@zn#NJ9gH{S=3^F)W z_&RK6?|M#N0T3tOREp`0KFt_^v>b9(S)MP(Wha}K+k;IeP6ZXGTux9!mogBNWkJ_K z8}B^c9d{Q^N>RP}72HYHRHGf_Up8%JS*>|t?Jm%4F7bMnD%NeRpt+gt82u9>Xu3wx zirM}7k?-`=H>I9so@ETFQ`R|+A~Dpp<(tPUY^dDd%&N&n8)4@= zwojnj0}hogGpw)cEf;2I_WbEO`#u(3bvj!&zxy(KY=>dM186Qjwm5K8I=u>S+mY1Y z5wCpZ3F@??8efgdQ;w)If=C9!yD6nVle~I@FiUR& zC}d@TZ~(|oUb0rbu^-zPQEV3gzjs0%@zFdPx$SU8Y&0ayhNdm?YB0%gN%|-a+Fdyq zHI&CTdbj%A;CH$)v{m;bGvR#IUVem@YxKmmAH*h5S&`h+{%k!}^Qbt>o#APtIh-nZ z5;p9-Ie(cO@Hrogz3JBHp18j13C)<_1%IgT4V6eO5*G`06sFqc$F{a90+sza-o!C-g<8Zw9>eFFsktbD%`{wd7CsBs}qp_?&u*j`ts2NdfzFcLWU zLnS`eCQK5KjxP1} zs<;Kye~#2RUKL!l;01gZ0He;&gcucG%R$cKH+yD`(s7r z_9cG$M7RCuC)C6z+esx`3wglOW_^|q7k9Fa_i0YQ;vGytNa9zP2E#|9lZE37pYC5t6CnJmOn6<%Yxw}pnOX<03(3a`|C)WL;~Vt0M_@!K9GCNFt*f~Rxt@gd(f zCZBZI1l*8l?Kh#`)_Jf~xiV0~>Z1Kx7VBZ`+I5Xh1vj z+!!pfssP5IED4zMborPTqx7iF80O=+<o9EL)5XoLab z21jV!F7&AU-%UO2-^>DZAD+X$0R~KTNKw4~m3%Z<_Y>fx!|^693*M1zabN&Ow=!G-CHzq#1y^b-o@x zs(gUDg<+oJ4J0)QaF-s5_Ks_vv>(~2Wo$Su__I)tDv(j#sfSPx-K1U4h{lNr3q%j3 zX1Cg-hsWm8iOD6WYpmMozm_{Kjk~xi~k$Z|RM=$8EAqjj<+q{lxkc${Mu> z4s0QH!i0cG{)OwFz=0^n$Z>*D1j*OQ;D)N;>kaqLhQQTGM~-K$@^~)6s~t|e?Rtx$ zN`Z8H6hH3_{0}GD4!_O6T7s`@Y*#6-^!Ll0Wub@m*;}b^KPMe-}LOA0RQAA z4#cuf3?>16`cAat?Q0C&a)2Gox`AXp=_(q4aQ^WN`qIiN1JtQqgtBl{GO9n%laq_} z>2enhT9#2`&UfwaR4_hs8iwRj)A*VPVr}iuL+5!WP@V?@Eka)0OG`n>fwpFUcg>oV60h<+5$9*$SBGGK2Q);^#3$}v}xE!hG%8>-BP?IW*MG*zxe(wFl z^}0^#a|+^D2_zBx{0$N<28!I#0pcJ8j8m;B4`I;*rIx4MCb!T!#-h(*+8rUDM4JaSfk zDnQ+O!2<7*T`_3QT3?@%oMmCPOaqy)s%O=^ttoHhm@Ce2qV-kD-md$g`vx*cLgC}j zBRMR!cPDw^7>{VT)a;G+mc`+I&nK_y3|Xye4PY(&YA@D8GgfM%?F)9zPJ=7ems;9u z@M%7yBA@s$05aTOijp&n-e6k@W2HxU5``M*v9l&Zje_Q)nW&t#3jghY9Et$QPy{eb zeF$o2!{a9Tp1&7TcceXhcctz!sv^5WeR;l^tS8({zK}A4k1{jwehN#pMxib}N^1Y$ zXh{Ry-UB*vbYG%itYO5?y!KwP>7B=Y;+~*GtD0N(Po|H8imE-v;>T@X2zXWOrYa_~ zE_U8`hL4dp-_UEAZTU!;p(mEnq5sW4clfSkf^n0|%FB|F_}#(eA3X(R#lzP2GJ50c zJj>mcnwuDRp(pv*yVMf}LMs&>AC&?%Jau&_5~@*tRmiJdwnF*SEN>e4t7-qBOo`B) z>*A@3^)%+&gU@{ns!DO?3xZ>hy~Iw&14Pud{F45hRjqvY`-MNy9ikXSQp|mx_Un%; z9t}s5MBZ6>+9nyf9CYCxI(1)V`|*K9HWWbR&W2k&x>HDQKD@_uiiE^|;*W;gr2dAb zX5}s#Yw#mp7iFxQR=sPi)19F-=PewWpM+<(9eGCI4Plf`uu6MvT^cjvuq|G)IClDGWUD_?CK@DoI4N zU-VT;=gXwx(~yC^%&$I^3f?(LZQDziX%#RLx(dzd)uP<#n$!g@$%fEk>}i#-)DkM_q3uL5*PS73Nb~ZiwAtfQVA^Y z`?^Lo>S#(P zUq%1G8&f2;m~jjoHCW9pj=T@WPM>Ut3@wkehF> z0*ma0&Y*QEdrIav*nJ~{ZkA|-Jhfz4k|@O;aN-wXv#|T)z(Lj>HGLHYxF6Wk#sOB~ zmZ#zzYzUc3TBc~H#H`$cBj*EcZh?;a;_t|XT=*E$(BOGx6+lGqS@1%%SX7y5`*ET2 z^JH4PAvg9YBObgSmotJyE>#NiCrj(M1fS-^;-36ZVQW4@xh0J`CboPttC=lr@=VwR z3D8uyu`I#>jo<2Lkb}tegRkB<8DknZ%(s(6ch|vSiGxuc|cMoS|%D9d0Q-b?iutKnRe)FL$H0t7V<>|NhxT?W2$U z@$faDF<(CxFuQ0zu`nV7eMyje=~9RZfHS(>sHxIbpLjw`1pPVhHJ{p=AKy}kX(wa! zarsJpnuv_O@DQ#7!nggUwL5DwpP3;)C6DO$$_aQh3Bdn3GyV1tz!3iZL20I{65~yO zGm-T~kcTPi$C=l)nZ_lunEMYFM>Ql=Ti{^i*GTQ3M~ok-W<-Lv-Zxoa&YshXY1XC2 zi*@A23l~Y8JeCx}V>U9BSGCxD%edXtt9-xH$SGc`aq8hpo_oen$35$!0bqE)hDsEq zVWu-{o8;}m_)S`{ZlX@^f&P^f4vPeDxjV!_D(FGf`zv`QKWu|xDfA?&YXLmKpF)pM zrX<)84_qG7*h2ySiYKh&%p|WKcSh`7nEFGOX4>)kN|IQUY(p^!h`x6BOQrJH*bqC! zsi}hAi}GG(@3f(BUg<}hkc1N^JUxKR8o6p2NFKG{5g9qDJ}NM*Q3Ia!x{Os4sj$+M+aR zQh81;tzshd^y;Jj8w4!#vG*c2zFF)Dng}oKVJiNL+eZ0E5xV+jwyS)6falOL5{HxzT zxu-b6ziGDv;JvNLZBC@>KrtSI0_MJ3q=%{@_Os_U_=~{`*5 zg*)bLcf&WBC&tAbzm@R>ARc@jHd%SLFdg)Pk)H#4Uh|K4DC2HOd2v|++QIr)F|AoR z5Ll7jtW~SQE$52A%s5!?*b_1xA-v@RT;VjXy{%_Y0r3s9elKO z$^ftt!VECM5Wjsq8MR_fw(5Ze!^JLd&I`j8MmR-Xm=));2%;;Z8Ipbr3?rr+-@_MM z&hS7|J19T-skLWR269pRL@?yf$${mV1fn`PNOUl+l;_c%z*(>g*9hd`gbXFtAd?c)yt)Y3Q5`=Ov(fStJ zUCC8NfFQq&Uv%t*Y!{r*&GICuPw)1eM_=FcMn5k;n__i6{~WY{ z*)YqjQExpCY;YHz+fep&A7YeNQxt+#7Y4n?xcwj%;BT!Z(DbX zw#)|$5OpveN-^B{E~o}u{yygoa?l0Zq?g}!uBuvs%nTQBoEOfNm2!-wK2n`-gRbv5 z0T$G{tSQI|Uy?>4NW}x|bB2>(fN_8NO52ax9`@NAe}`(Nk;}vk+ekW!4_b=}Dv02V zORwFoJ$$pxYyLu5R5!VaXy7E?DyNK=O^Gt9Y7X~{9yMQGqpaAra0B8-?=#&`Xl9aC zhQk$m+?n4`y137afHk=UEi9K0HRbeL6f=wcV)p#cmg;N6E;X{OXix`FgTL>#a{pw5 zVwKFI%8a{}>QAg-CZAxmhD5rEtndCh8aE|^*z)m+nE{085>TEvrw^EI!as(3H0I?y zoI^?!F`cC+%8`t%cG7*I3~82wp@o8|g_idwkd~WktXR;@QjFP#fkQ6^5IB35ORW=l z{9(-T9!jMtCuQ_*D`(5*a!=1)YriHf4ZfGUnjiA^RS>tED`i%Tb571#=fWgN!vGK? zVETRQ5n)X7I(nC`xf%WVwknGB>V^6NdxJq#?1>9smdUFly;OY);Zjg7Uvsa>N_m+T zF31TvCk~d!(=Ms6?^4R!k08Zs_}WSX84we_KH7QnvjGFw1W8dn$zf|MRLJfsH403b z9E`HlaN*aKewIT~V8FU2bNIN$5YDCG0MOd=YYLW05vHiey>=YDNjX0^hA-TK7kz~Q z31_$1?HBaEb7x)lp@V;vbzrI9fh-|kF79O~fPmJraW4nqv>*jQ#&VraSg(Xxh`#)o$fdgxS>3#dvpr@{lrx4wX#UsMAe)Bw*yypTI==Olj|vcpm#( zY)7H#VBnWl{%2tG7wx2B`C|XIK|$v}OBC@ynx4zMZ~~z#5l+gWT5P%^8@NqX%^61K zkZ_$!R{W`f#iNKwbaW8}me*GUeXmmEUDU@tG;t9$z^IR)mFuO%I0H2pZy){ruNKNS z{2|#LuF$*iKx54X6j^3%HW6@#=!_4{JuPYV4}C8#%Xo_RO7r5UT@7mg8$cQrI&hC_B$6&yVzt;uj?rGNM$6kved%!_`bD5;&$Am}XMgTO#*i8E3 z^xQRnxi`ko)qWojL-L}l(^VNN$#COTaxOoh^tFG@qCDt-C>qXWmigaQF}slAdEAUo4M>b$@DOfNg_vwn)A?MH;xSPc&_h~_KB zABML50fz+6wY5CO-GR~i;yx%vh|oTMX=fiF)JD*~w1qP6n32^zySvM|L4ZlQ(C zNkI^7H^Q!#pV72|Scoc^hK)t^Bg}qBlG%ZfY8K%zoRdx4 zXCanUFE0Kot#60**M1uL<^)G0!>B+TYDiHpw05mx_>-TiTFiIDNs>{R_Y19ehxss! zi!B0U?igjobx^r=)HsS9(Hq4q2F%SB#VhkG;%kVZT5p8E1RcYW;4O0)WKzR0ztMkX z`vF}Q3`fn9W@*ex6HThl7za`d0Qh2XcSR1kpm? z0A`g!_S`%wOU?+`_TGZLkXvFgbrjnyf}&qT|O4QkF)@?b_)lhbOG>kS$mC z<4?wTkHN3!XtV>C20;!`64Q>;=t*?FWXb!4gK$4_1mflnL#?HOIH4>3np3V5hQ2|8 z`zIg18{YCaJsb>_>x@e|_;DZDZU;{IyoxMAx`x;FUC=5Cne>4#Fn#|xwivrR6Ex6t zV0|K+Pe&m^n_|-F({|X94NpIGr$*i1%CN9 zNKl9N6>F=QgGHPAtK#9^j)}xrOOOgwRMt{_CjhN5d)H+N`TGJ}E048>c@bjmmg$VE zFAI%V7eSBh6k0VuDakFj8q_z!O$hw(2Z#W~Canxgq+rkfmDEomeBO`ip{nXoKor5B zZH$~HxL^(^VN?%l92fux5udkVJI>^1p~wN*2Z5_;pQV;ShS#Lo#@KiW=NmMp45(wX z>ti+Y^Lu@hpJGy3cm-Q8{8(C`?td3L1UXmKFii^=mg#`-vH)EIePSG)9WmCOT9}7X zIhpK5j;rrKIS&B64ASU4i(M;Jb$K$p02csQWxfIYA-gZcc10GUL|2;({Z)df#PmcK zojlQ3;2Uh?!?Cj_{^B)Kp_2jAdr?L`v>oPWEGb zB_gCY&9DejVRT7T6Lr~8-YO7pIurBoRC>2q>|C1ar>t`=!s=cRm2| zeQ_^B4m-=M2>>>Pf9@@_8`bwxbZ5-gT z$KNYT0Px=B=(tLIawx3pv$i3-`cup8rhxYXYrr90ljSzdAI$9&)Pa(X{*{l0EV(T0 zBQ{|*iiMRV-%&NVg0XU=Drve@cBWcPCi1sCE-EbgXfi6Se~5Z_ZCTLFLjD{i_yOJ{ zzHPVrs^C(#oM3Dr!tUBf1!*G-1^ZTjWR>n1J+2vrdtwy)5bcrnG%p&KS$s zo>lfeJPE|3VTHwl9!iGsrapd-fr>Q<+o*z4V1I{OTB9RdQjsII=mvlf68m;0WZp@S zPVLx~Wgb6f*sPEY48u0(oGaTDo^lzZ;W;%PH_W+zw5X9RU-zn$nfEmmYtRC9SViFJ z9`<8HH4eF6P4lS+e%u+PU{Gg8?i=XgG!ap31;<1Rp4DI zDHn-}*R->mGTItcCO${K3v+kJBOA7tl^8p_-CWVDOFQZ)=VM7DnB|>2WAV%)DVxth zlU}o@d!}FT?oTmd1Oe~3flc0lhEdSdtK|ZM6X-zn?fuNmgG9mB#%c~`nIRaKeyr0h zaQzQh<9Hjm+?=llARq<3b;bQ&SS|bU>11w_cYb(qX_z;MlxO?h&rq3B)P1=qRX+vV z&Xl~OeBzTiV?;_m%aU(gt>Gn+0)HqhJ@RB?hsP<%k6=yeScTXE&gMI)!Brn>{SLyK zY-Cv^q1ZRrmUVtvZ&6N0^cKs+oRo z_{-v>?9~pXR_!Z0x@d6LA0iKZcjX1ju<0VC~rMhyCa3&(-}i^!4%a-qG##{^>L5&|i8v zvFnIL>L#PbH?@Cnl&!fK_)R4u4Ctkaa9>#hQWgGc_kr?+fY6VNgPs|C`3HWU=e5PF z+h@M#o?$Pd!SIo(5Ph=hdi*=?hDab~z!NjBTadd4j6qb&`vsUyWtqx%rVSRCHkzMc zR)F(c9ddU}ez*af71sU`JZg>KOfSHp3 zs?rWtijw){rc=flJQSf-w^i}}Wi{k3pI?DP=deJy8PwF2t zx=;`m`uu?(t0G3J#C%{LKtnizln#h}@Q7R;*jmiVepF*Wf+yjwFKlfpVrq-mC{M@( zI9L+cA!QoE~&kI5r-0?i}vi;kt}Pa0yl zE1*#g)p2{aRd%7A956zYldN4-gST+gH7T98O7u(o6b%sRTAo^HYDnB75g5HuHiVC6 z<;sK|!N2O?)U<9I^(OT)EOSbVC9ki|R z=k=2$=VmbLdim-v*?r|0)xi5!xF@L57}J1x0^L*)_{ zFOTR%s%>fyR$gu<70MGmBP}d*)7ydu0UDWvo64@8dg209Y?|wmRz*9R*jL6_%D6gD z3ZK4s+Y+u|TiDF=dg{P5D7)OKpS}q*Ao!#=54*tNzMlA`<-sD0Oz#mg$G4-$l<#VG zoB{xqLup0DK^-h{#^P9*)KbQ4izrksNS?@!%PLkj30L0E6#0baTlQULm$x10|yFbnz6o$TpUpDqjA z5iO>uI-BtDFnBp?_0?S~a-#Jh)ds-~YQvbh&exyyMI;Oy{Z1Mx4(T~VfwgN(GW*@0OKg4l&sDHtf!aVvHb^|Kn z@+rn3Y_gaF*N`thZf__0mg&is?$b4itPO{)*AW`oPx^#M{wgl(X^g|VC;XBOZUquL zHDAuR)ICLsESZh~V4Q1sBlmA)#}4UcUKk+?fEV2t#uA$L^%>chdv#k)U{ii5csN8@ zedM3AwP-DOhbcS_{|ErN&*?NpF|&l=@q7m4_h~HPOjZ+$qF+pPS$WK+G0J)9dGQ@J|W zf^tBMmv$+$OhW$eeNHD0H=qhH;;)?D2y0{<7*46ukE3g_rcp6 z*Kk1G7=|4}Z6oy?SScmX{QLDcyvww&m^A<#=*{2t5Vk#%=qSo~_1#yT+>UFba|Pn4 zj=YBYhfl#Kp&50-(F%N>UpIC$QA41=f}!4Fl``e_JMyH zZ1GV%%<3HGk6pi>+fU2;t&;scy*v^lKn>^iWLY}l8M&p<(=!Bp;up8udBEwJX)IL*1imzC;U?TkDNV5VzrS)pb#cC zu+fk}Npx>bbEhD}xOw%H59@SzCF)gKvSwR|aph~9VFT{j5a_Wz| zD}dAy>YGYejzuDQQxU?6B2osrVCU`FE>V#_plL9s@gzhA{T8NMo6f`It^RWL8~4;U zJm$nNe<@nJ;KOo;WB0p;D08p7)6?!~5SiP;KIE>w(=X>#O~M{$%myBSmCj3I9)lBt zrt`qkKeXyOEhzC$kL+S+r3fraRe;DFPiHw5o(P%(lCrMuyhy!UhYn(JZQ}^4=j+p;<|}uTgY(A@kiS3{PpH?a`d! zM(5ZxgGev<$Uf_UeMhx7%w{xd?}3vOZJ{?{l=Q1lZ+8%BpzGCd^x8IaBt#1BC9 z%f{YXHiKk)6spvTKfWkmDmwru-niM{y_KK}@vIuY6V`&g;2x6JG<~oLI>AwgPAPxnBeMCN;qt@hwH@AQ ze;JEf)DezK3X`v!6O}g(6TP_A)B@=u$>+fG3QWzR&@3h7p#ss7L5H)cD!4;Y21N8>bw5Bovs;ob+IBMy5u&m zyXS+9Gy^X3BVB)I)n`tX4@3*TC0rj7Krj`ahqMxXL!$|H$o?nZYB|w);O-MuHHmKy z((i!$NLs7ME0LWrhw=)Vrj#k7>@iL}zZI~oZ@AFFy#dVr2IFMfB|%GQ2@^R*Zg6B> zlLFxe$CrsH90#kYN62^oWFC+=;BuzCeIOVTo1w9KueKJ}QGn@ph0->SZS^aNy2BqH zT7h=(M}S2N!$n^>{C)K$F@X)~a-xN6w<~o*$~Wvd6JZ3}^0M}Nn;Z@r69al?>go38 za`~#z(@+ame%%wZxcc!>)+SF&Mu@iz4DMlsX<>wT7+Z$(yqwL{eO?-thUmPh-)PC! zv>%T$p)*YYx5tZ@_&0$nTTTOIr`!F1exzVVe^v13j#o5M$rQA@#s*}(l!$wScT2>q z>fg06ieOMa=ep5q1TF{r{QN62@gX8iFd(U%mM7fAh>6g&h}!nWON!M*E)H1>1r=r| zv0?GS@FbF^l;irZ?TO8V6tp6_k88W4ZyC9s(%yDJh-T<8{m2sG3y7=}a!nvDe}x6t zyd3iY8wbtaw{PAJHxJ>W7A>idkCp3>jx3E_xyrAc@7;LUxQ%0n2U~1Ppcoc|oV@7d zX>vPaCH#KCC%*j-syxr44MK6s884@!o_^6Ebf1`+O||SLj^oNT89h^14WouAJ*BE% zAK!s`r_yaFYoAn$K)@Mk6LCedA|4x}?iBq4F*!s+`Z@gy>GeYE=0k8d-MsQzLzT8C zAB`~UW?~+96|l624_g_o$#DNrk6q%?THoyEUkp5KWn`|1W>PpJIU#4mmwAwY_vi2o zY@tJshCrdZx$CN}ZaT9)Z)w!{~M4$Ei!$QV(Q zoJ{EP^tgiGh(!yy!5YDeOrkfAE4d+wq$eJUeERIY$lP<2AM$mNV0D`DsySxr*`Jb{ z?VZS2ELV~3e*e2~oR%|eZG>WMFSj8f)WNOl65lOJna$^Hcl9XA{Ux^_{eaoFF3woJ z?6`s3sQc?h1OtnXj$yhCf`qwwWaR>!?}?F z7X|sz=b*Vf=alU%h6Lsqsf&0pQPLA1+V_LU`TheN8wjTm)ttd>o(5ppSuZ`5#X4p9 z0vWD2>LkSuAmMbo!(qWs;eRm}*EElDXz`ZPB}FVW&YliLLw#-g76ZZlKL9c@Sd@KoBVTg2*?PW|w?+XvblS&3Sc)gk{VV!bw4up`QI zeYotuZn9Lkhm&TgxIPurXr-b6O?TdEZF1?~YT$7x&~)p~b&DQ;k_V5DGYj)9DVgy| zT6bhnPvUty83Bd9>Qf(ii@F|L1u-{_FIOupaauaQyzdBbdNaAPbY;w!@P^&k?v64A z(Mr>omz(gB_}BGh!;Y6{MV2zGSV0^ea}`&eJD&7<)1856!i>kpM3eHNL62NY6J0Qn zA-x(D?7JU4jDl`kuA+3uVvb~5qzNAM7521aVTdMT6$L9nO(gV@tdx=fz7r`LU`TPztT-MEdAC@5s^!&sKb^IJUzGB&eyWCz9w_5B?bU@^%F6k>_^-s zJz}?U5ahBBPr}!Tj_T8=UfnMYt}@~N;N+OGKU=|efG)O}-t+A({Kp)@!%-7wE&ejC zN`}QO?yjFT62AvC7WkaF*`ChLMTOU}K#wVFuZZPYh`(wIYPIQ`P&dK?;J0wjsxrAvGa|C}Xr`ett?UniKs93p)pe~SOU zY5&$m^ZVI|SIQ{u^9wC=|AOP~cLe9EzYx5cN_wjtvi=WGyuVeEGh9h=?k!>jHHU5G zCPN>=sjabM2XMEO)H?N>gwA9vBs0H)-u*$yoSFQMpUzqk_#Wt(`XKCgJ`M9qySk4m zoQzAN-5^#9or8c=YLeGF;90-}Fo3IA6-@j*rJN8l;QaxFLDJ^u%*(!0Tc3lFA=D62 z+@t8l?Qz{dXjol&Jp|8d;^m|Tnl=5LDx&KB4QsksUt;QK%vZ4sgAvyF02%foOP1o; zvzv|VIKKkLq)#RqtEC{aL}!|d@q44Q_pka_^-%VLOFZPIKV)cn^6%8RGm=UempkJ` zQIyfuOFzQ?>4|IX!-sD0e>O_ z9y7)*hkSec`6R3~P6o|9RpUKGYFR6x%IEoX>qt0B1By>Wv4nFNp+LoVb9PcC;z1y?eH^2Y)uGq3GU>?SYE6 z33Kde1IVc7`vmc`a_{0LZJ}Fb&=Lueg(=sa;~A92fB#bmMQWfGH*+3sO~F4w?Q1}L zhC7#Y8Ez>8wF0#eo`}w@r(f%Cv{qp4Di8H?Q@Iv4JNTP0gT3l|AUdipk)CwDND2!w zFPTEqQcPYc+8s=qe&xq%#a*~x#15Q9Cs>M^MOt26NsKLO&$HUYr`9=IV z(5c-+h2ZcTCQc_(i&qRKRn(3?*NN4E|9j-YtEw8G55cs}qQ9&~Enu~kRo%d?upO8L zu7v>P43>eX%O3^8jB`p0#k=+fwR=BA+~N2|kN39uk>qP}{o0M0qdK!3WAam})p}0O z=tVpQpJZ)%HuE>A*6FY#Zp?+nCpcA?a+ZJhcBV9ddeFL2z*c32d9Isz# zqTa`^Y-4VIwv6;L4`grz@(ws}#L{lEw=7@jGv{$(9M@-&Rou5QS%imsYFt#VvCK?;I|x{!7m0 z9!F42d!#L29U!F#VrjoTnz4WvqFwDtUdv+;s;OuS^>btVUdJF{hLI%N%^@EhidiBu zX+6ymeT@L&fCGe=z;C)03P&4SaVK$&2YyWBeg_u^1svFdxW;pwaJ1(3>MJ#v=J}m?p5KstXf>My4qy`T_8UQO_!N$pr)PyVJ*$1zhbw zAzk}H9Rd;Vl2cAPG4V#-7!lRvoT9wYU6=1H!lQ|uqB-$?J4e*v#u81j%5Il8 z-lhA3?&v@U6h3~}j6Us{{9yLQW}ImI0(r#65D8TaV8J#7TPlVb-ebRmyn+yU;elaY z1`TRQS>~}-^XmH6^f@nF8sUgYkvfe!FCk^_EbGyup+Fd0jyVf^E_Xy2iI{7i>UoLv z3s3yyJP0P9^U0ZpsDMgu&&I0Am`v?m-S-K1R(mQ1PcDfYk9V+g2RCano9-y))}L*| z6%}PxBbJCNL>Fq_KZRnWLe9pDe?FH>xb8OCRj?xj440Niet6lb`u1$%v+bVwHO(FF zkV^K{&TOf=sq_fpa)-}E+OtA&A5s$f^~Uc&{OAtl}GRAFErCAK?t23^pZ0yYRdpX zTCX>r_5F*crc&0UE5mlg*korD{19@W?Wveb_xp0X5)sVLDj^Yk=27|ljHkG;>BAq{ zsXIu;ig~`Bq$43Tm>Z2RZ?HLDPh(c@+WE;0YiA-ecrb6u@Pv2*E>FQ851NN<*>~=kUYmvUQ@9s+qCf zUt&zU7+;TYCPlGO5qQb6B1?X3PCXH;+;Gw(N%?r~BACyDWpAW~^gn-9N;}xIz{qg9 zTp!!{Wh0ECl}jbdh6|;002%;*`LEkr0k=YTZ-NS{#aTRfZ8Zy+Ig1Xp!qukcWZ!z7E#W; zA$=yN_eM7ax!OL~_Lw2Ux^apdHXnK|z{mh}R5YV%??ERtavrU4X15ERIARstC^PpKkS@34MYQt%QrpjcNQ` zpcfo6MAm_HeQ@vO4zrzRFQ%kx12L_{3c9rq<5Yq9Qvq-qMu9>xm0b?kB|;V)B}+2t}BQOv*Xx5E@o%eaiQVwaG9p(9j&HfVNfOy9Trv~@; zqZ46x)Pmaft^*#iCe^&YPi9Bf8Mjc6>yPC%R27T@$Jl5TQ`{9DgYp?$`8 zb0GGg?6kAAvWuVmBin5=&B*Fi4VSb-glH>m04ykW9!73J;q);US z^GII-e8{5-1mmLAs6B-l9@4%80Nq#GF+cliyV{5QuLa`<#A$2`GDPRDHfAH(wLEMV zAMU_gU!AWpe`3pUp63e?j3fLuqfp_z^g`VL26#+`mLvLqt-FyVdfT74*_Fk_jI_9( z5MagML2cT?q4|WzJJTep#`>W{9S1LL!0BK zQWLrV=>SmZd>~LLkeP|HrORpb@)SNfhQko7*+nT2piq8-7!7?_!53MC5-|Y?DT}p} z2Sh2Dg4MgUA=-Ie?}YO)iY-6^?9|=7(nNE%#6dGB-&#gUha~mB`~aa z!xG|O|GE)jP_FKJ(?GTu327Asd7qDxANU{GvbA>QThGuyt!ezi%`nlpf-2jtTnLeh z8@`pMfH|L3PJF$W3$B=1?3<9&7KjRZ!^C>%A+|{%$n7c z$s(Q^=*F-=z?6D7;=#}Twu~MktH#c1jr%vinB6KWLvomgg$fAR6aPOV1d#E+D8+x9 z9E|B-zI`~qym$j{U+!Oypd*%ttCK56MkXdUC^)&GcTWUBhr)-Qv? ziD?^TPCY!DvIC@A1NkRrGVA00875~U^ z+!V5;L^WE0)VKDlgZg;9JMUFSiAd(&A*^tnA{Q@X43s>ujB?U*>X_2i#k!wD=e9ykVq0?8_8km|$+3D?Sl(B!WRZPt(BwL!+u#_pmVjhBm#@- zlXNU$O;xy67USzUT>bJHc?0L@<@~whyq!1kqI{v1)CLnEnr{56*kFNnZRvjds|_&3 z_YVyTlaKo@!=f-dkEJ%pGDTV6S@InP`EmD8(wVa&lI7R;F~vkm2^>KIiv((Xzdl@4 z{lxhC-A3~bamUKj$BDmEMDO-{k%&| z605qKcDhSuoW}rur;wNxLk(P)hQduGL`nEfDUSfaF45xLq#hHum;1wwnJd$dw03ii zFzp^zL&Vof)Xw3D`f8w%!Q8QE;QfsK0u~vV-lGEYes#vE2q|ubl zoHV=r{_hX-#0*WloZm$n$$PQ8-9}fALn9!j(TjY6 z=P;5<_1evDXV6uPW%;>`HYYApV_ezR;DmOQ^CWsZ6jGbe7mX%7T19t!pk?%AvKY7e>45Qkj z54@6df`Qzl#IgTqALqc?7mW+@UFAIz-V>B;MD&Pcqy=b77S1(V~cROS{yT5{b9XJ&5(YJMI_euc{`6-zXt!Me1C+3Xk8;-JA zvRUClntTV%6I5dRtsieT{oipCLA7ZY6MwdhQepF6TYooIS_AivTGxKLXhbC*u9rq7 zpF=*`!4*IUrxOcLGXCJ2a8H-Nmu_5QoxW>-#_eO>go{o&H zThKb}KvaiW^o5{8B%dKs%|N~n_v~j5;n;Ob==bzc_>4Sia_%9Xq#^a~td>L{%EiX< zV@EGZQO4)nA$q+|UTXT!xV!|=0sz+F4eh6<{Mm55jWnLTY@^#M393abCTu{Q@N(t6@!3(O!|X-+Wzbs0j)c%OECfydL9 z$V8Te1uR|)rD9!3yyJHdzE`aN8 z?zt3vpC$!&jPy*Jfq;cgNF1a>4t$WC`I!$myal5(&(ABn3?C=@k?=iPr|iAC+>*>3+x|6Ud=O2+acc)+neD4 zGXD7e+dnY5#~WLnF;Ax9kq~TCzbx;^;S8v349lR1ATtFWJ3K%Ahl;ThIs!mE4J|D_ zJw@ta5D}Wbp59}ub zK*DBELKK|{!Q_y-C;eLgNwNB}{6*AxcoHi{6$bP>X#U_~II^?}{G(*IO^ z78$G~i9Ivlu~t%N`@za}t^_+92AhYWF{l2^e7NgoYw3@^t1*BZ8Vp?;1+O~maXU{#OptDe5FF7qnhQv5J857w< z9`tYeA4qh!zSEWC;;EoH3^amf6H~mIOl)?!R<+;RDhWz^VQW!uq%0xKWsP9ZlES&O zSAATQ_0gsJ23K_AQ#19Y3Q5Q%B{;N5Pqy1b+%n5@oWo$kp!D;-vEC23MlYrFg_Be9 zk*Vl@UV}(6&NElP+kw`}V=?*pIA}XQ_A0#dWChhj4=Aj#Yu!se?+~&=i0`MrsQP!* z5O<)K8h|FM6Hzp%b{vFdK>*R~?3)kS3k&J5wOk7u&6C}X@#h;^r_)7$nlCj)+d(}P z{sz(T&~&rmk8=nXrfk2EUA*i(qJB#p^7;=T zmVcJxTeU6^Jmd631YFErc)(A8+4$y7H|V|=)7gCE9?-d%oK?m$i6=qtet?l0AwGCe zWc!L}*Z|yyK&+e4pLAGMc=!I1yJE?|{Vasb0VOFH-(gfAa9J$F5%J1R1MSlS5bBfC zx0kn9YhLVXX$unfbE~$qBkAdtHq9Il({EpK6YzexI8)An^~gVvV4i0`c%7IsUC5Zv z5>XDf(U{r5f;D0CE(Q{6)<=XxNi(2au-sP?Q`<16?Vrj1y?di}7mhz-k?6F%kvb)F zqvS@}!@UY&#t*40k1$tUyyesZMg^95PpxFUJ_|w4Qi1lQe6dx&lXdn+>FCzsZ->p8 zt0A)lFMl_4D|R==rD>z!InC(7tu4;_lQAcQSmRtw`g3EbZMeil3CbCI0yDSdxDs7S z8UA5ApfG%wYqpIk5+F1&EmA)^NEo=DCI%{|%BOt)f}v8|7Ca)q1v`auKZ93&uG{)B zrbZ9tiaAHY_WXn$3$bnv)L)9hJu?~)`OAhK+JH;GI>+udzVU91VFjkU@Z;;Xm*ne% zV6@ezzrHGY)AIMN(TIbSBf1A7m)^Cb6Aad(u)h^@ae^4bg0;B?VoG}6-K&eE!cre| zPJZHGQD>2#M{1RS-SpcNYLLc*I2D%$dUV;JWF)m}8e-?QWvKl&Yw}@xbAxG}PZaJ5 z%L-C`*FSM8`mP49$UOvy*ZRQjn&>$Sl(DxmprFge{ygRpEXjCkE={QoV&6|P?FbbF zO>E`fP<|m0X~=})aH-%U1`_n)^f3JzZ@E=F;iJJjazd}8-8CBWh$Src_ZI8l(v-|+ z@M3=n6}8Cv+&IhL;ydY*>0{KPXdoA|KaH z0OnIzt@6gFra#tO6!5qIlyLkceq>lcQ5Ww;xw2#tEfi%Mh;3{r^9>DiAzfOo!EvrM zz8u_U+xdEAm1D2l9e>?4Bm+M;laSUQNK|`k8=1^kl>?6%%?(4P>p$I#_8rqIqV?yJ zH8L>r;MnB`&D0I}tBhYDFUYc;LSkpGbkAHc)1nCQ6N_NLOA>i64w87wPK*T%GY@yZ zs4;PlE*>1*7NoYv^`o6Fn??ThnQ!?Q9Txu5IolLkMv_JUeT|H3Ir6!kF$WA36&o7n zke+5Z_41aBzg*1{sk<(#Yvq~xtUqAW^ZF-o$c#ZIpK{UjB<4WO*r|6kQYBIvWZ{h; zqXcr~!)e6bwlM5{Yda(5i^aHxqO|`OkNAwuR_wmE-W+#Z$7`9ZwjMX2i>GWPv)pRi{?@l zE~USh=W2WUnhRe}R^&9%CbW*lg=t(CfwOY5P;%d1I%ZZy`MK)R_>20;!o`cZfqd=g z5q3p6sd{;w(V(RBt0p}^l-6gvVorqIoF1VACNZ6_KyG4HN`8)U-agI!ad!8Hj;TMhWrf=D2X_4?>2oi8_Ib^YM ziCviIXZRA=V*$`MgHn#8V6=}Rb?ygfs%vBMY}o{#qEQ>RHYXFmj-cmFAV5Uy+UgtZ zAqfDLcz}np4&#viL@&(5!UuG&48NtJjB7tP2ejQxKjv+Gw0%nIv)RD*F<>4Abn)N7 zYM5-5_6oS?JMf{}4Tl*y%3p*J39D^2o?)F-U^iZI`{aX^=+}Oik^;JLZ}KM0gng*1 zG93S2)u=4p5edc+cv^po4rqN^GbMlJq_fwF*AD)RI{8a_Hs1>M|Enzi{V%wH2n82@ z-}|LuvvF~}uH8NFZd{z6o*eE%2@%JK3P^91J=J7=AIedmxFoa@(fcU7kMjei8*D_C z7;ecrT>A^2*&~K_KJm-9h7UZvj|7dd8U!z?*D8t$*1?lol7KqIAIjH-jtWXDbL*oy zt6m*<`smlU#f?>5o%n^9L)kK*CD}v=&Sxd56r=`pQ3lkaq=MS#g1xcQz1q=9u zDyV+2So-na@>pkirv8c6q*PR!`Hty83O8{R#vW(tz20@z-q=A#(z?Q)N0ethr7RTh z%@2gVh1p0k-n@B;MS%E9VF4R&_9dN*)61Xh>gqokB;xr;Z@e22YOu=Kr0R z`E52OW?%P6|tFY$C>(&1(3#=4YMf8dh%->)tKnB4Jpkr_4i`K&k=E8l9! zr(~VOIOY|k2@}ZfNy`G)!l*GjR*5EXlyU<@8;sqU)EB30ASg*mQBO*TYZ+Q!siBsl z`K5cW9zR_*h$b)hsng#b#BS*8eZ z-a*fL-@kEd=S0m}&$tdj_wY4qxG~MJFbOlbW}7V_*DmOf{8$B**+^EQA36t*9rm5* zI^}N{Q_X?Z3kkL!!nvHcZEUB1sp_GxJXMnRkpZnKrAD3uuIuF~8~e*nB#$W1!7CTv z;ZI=F)!>h_N)_>1a$$sr~(6%kW{Eowgr#iDkAD)|6Rp zPY5lEn3WjRo_%-H-WvR2=gSdacnRc-4I6Ya;)l=%rIH31a9qR+eja#;>dRvBrxwWv zegj@G9lYuo+gB>BU|_%C&q6%Fll1DnQC-Giba%&^qwQVOqj1 zNNjU83D2ujAAF*d~e73|pI{I7^1|-~! zMi)F2@c==vrE=v^=L93{t2A*N8B!??Nv?c8F4BA~cfx#oC@ec>X3y8 zJ$Q^4Y$t9I*#pT_=JZVS3qPOFiF!))@~<~^+lV!%11S|QSq#t0@kcw`l;YFPK0o4t z6h;drUg&WlJyn4W#1qbOvU9p~%OHr^OwR-!S9O^O5l!~DQV1LBLi3UeW@GN@F2{o> zH%tHDj`(Wr!I*Rc8;Tz}SNy<@c}?gX|5RPv_oyhK5)3R~6d8oxUzH>0R8wfXXb`95 zbwkh#_VwA zwzOC|LC$6VdgTX;jvViIZziZ%O)a1j6L{C>f-CIk(jY39`m$utj~^StYbcRjo_m#a z1v?now<<0ft%$IEMh9>+JTQ_gDMaah+T+4L2&);Yd_n<-;i1mqkxZ9oOc!kpe72sR z=iE01FcCj{>G~z>_%iV&+LV^xRl_0`z9B;+yfUbqK`ZoqtJ?!Y{M>D7Vg&(1emFGI z0*|&VNISBz6}|xoK;634TlGuwxQ)s3t8bj&BlOR#X^Z6}OS+m3FrR)YLEJj6q_{`| zPaK`NavdE>HdyMdS8ivGd)SA%}$T>j$h2GH@4rV33#_jCnQ76Gs!P~AwT@< zGxtX;Mz^|<9T+$o=oKb`+Q_K`<+c&)P_p}_`}v>p7v_Ys@bEx&`;c3GeggyFrn_AcSk5BD?4N6!bv?ITysYG7vt=UqIuFvX=+bCHW zTk!cSXOIt!o6Y-HY1&YlN)G2tnV!yOg3TMp(u6x2MDn98)^kTOMIejs6g{wC4@I<) zdqras1xmTUCEeZs{?2D^4pX@JM!zOatPKq)F3H+S>`}fc!s(~F>JpXn33S7cR48y5 zH3+~X|GvV~U(+Z%Rsvwlb7}Xt{p%oln}NaGf?m=~$9krf#TxZ#W{#N)r0W}o16I_) zpN_B;L0Nb$1})F803AL>tK~1`vE)OMSMOxy`Yj{oGg;5T1IE+kpRDZRNI8@8T#oh? z$HEE9eBnHDW;!TA=&Z3i^7jPZ9=%LH9|nLzzeVaRB+q<_;U++x}JBX!`p?Ma)@DJvt4jo;Y| z`=m9u5~sJPa2+vcXggOPO~8_^eZytKK7aI}c2f;c_Ey+{Z9&N5kbCS&8>ffq$(8qh zZlo4R;GdK2W-6Z+9hj@TJPJz009x+Oi~S$|l)}p-sf5-v&Dx3_cvA3>Ign(xTn@#= z3DA5$mLpK=8D6b0@T?^#u#vnVpjA*cfKJmdy0BN@0<|#)Fsj^hfL;;;)$icCgX#^R zKJ<=+@|8whB1yGogZTtEG#Eve0Zd!JwTF6e1~eV#xMkpwbh$4WLL+Ld<<$t`DmxE1GXST$xxC(x|R+-fK#}^RlnD-kRjO z`esXXyJM3fMRl}8!G=;q^)ui{CzTRoh12huwp6GEJ!$+|#EYV&^>z3I94K$XzP*|N zbM(t{0c_S~Qb&^%hmn>pxd#&rV;rv!zdOxtU0=oxOo@d>n*u~C91gyRF`_)a@J>&? zUK$<-j1!ccTaEM59+U7Iv4%7jX6UZA+)AObhhUnt`9>;0V)bY^J;%=Bho@>!TNw~E z4-x=`WJb@nxrf8A$$x1qtV5R3R;&==iIaj5K-UaF8J6}5b&p}kaREOJkid(Um`2q4 zGU2m&``mVuS#0&vC5#JCs}miVI=Qn&=6^mD*FAwQ)h!ku3&=oVPD4G#nufgTT>stn z#hP=wpSL@=sTLk2*JZ%C-xsBtFk)#pVZ>J@5R4C0zta9G??KvK{d;4nCmjK$6Mp&t zQ2HT|1KGY)Rlf_)QGU*?2c=>K1o>nd*amQWy21w|noH_fX_!sWur(3KRZH0^Um3u> zGL9KWY^2>4>qb1y;Wzk4Mn)YFZCY7y#J*7Iia&4tr&=c zj1kIK3lWP!Q(E`5a{p3zXF#=9j>F)!dSp|yW;l5rkw~=(u`o z_bQL*pxU_b-QJfHBh$kugzZbv!Rp5Twe_*HT9VclYj_`jDmj&;d0&@Z73%8vJX7G> zmcL49+mpr5`|?sfES|k3A5NL-XVIfj#|9pBX*iolqcMec{kkUW!RY3J{+5t_R6t*b zxFPy%1YRh?HFya#)%jW62)g1z!IXe(6$^OsR}X?YfM-Eig3W?w3Ko9kzbPBv7Ir=B zOWCn`x;@+J--yOr9>Tx^HhVdaa;XGXBu8~II`ZzmeEbB;l_IJgrc}=b%KSx<)Vk>2 z_x0qLS9d??kiNd4?4ut`>hL>@IZw%aYCPG^T9nzJv>xJJ1ERl>y3Bux+BbC&XfN&1 zLb#3s%nIIQFGhDjUU@fy5k(iCmFj$j_E?3$CY#f(bI+fzSX}c0g>FR8F(__ReF?Z#f>Qax>=iqiARCa>oeB|z@B6|-3siN zF8~S*I~v0N{=lc*xK7e2GoRF*UF9Rf#C3hYCh82kMaeO@BjQ#9k&CMgo1s7SVc?QO ze;0(4FsUw?9kn=Kgz8RbUQH!_!6u_dd|?t#NjQ`AD;{xn>(rm?Tx{jQnyy3bo_8X{ z^eR?VFRq#%as)f}@vRSE4$cYuM-3bqb&{KbsZK2Y!LFAuN}UPg905G{&ySA20Ad@4 zq!B_~SznoLaX^nq92#ULE22y|LmDYtju1-$p3MTb`m{bcv4K+$2018**Rj6?262sh zbnMxWs0#DvNnRh|x}jVi?wSXfPyBMQX9k{&lfUMz0kOPs2*9FFFYn7j@76kkf#S>6 z;|4B)oax zlMv*!vH*x3L4oGawoWXEC>h;qC4ZC0FeJbIESklgxbm(Sj^406hp?q@yP7{7|D12Y zry}96I3FEX>sut~y|v>-VicAl*bkq6!Y&nLo~YiA8q#G$g9FwqRt@3Xb(yws58zz0 z3i@YgQ8lMJSwNQ=fCGa}t1c}%;4B~oWX-*vyIU^jw?q`2v37tKabdka}XRCmIr` z(PD69eKvli|K7q@bRU_%8>fggE8b5g@RmfPxmg`78WGO(LMSRK7; z>g>~)q`~p>7Q4Iz0iU341W|$|dh0x++Ex%F*E9$&3n$>OCq*m_*C$Yz^6%=`Zs!O? zd3dUVZ#H5^KXb>Hls7hEAbUy zBjC&DNVVAV;}VAnU8|Qt1YlXYTF9OAJgwR!4nJ$WaTYEVQ7g;q;c=&Ud$P@-5a2AD zG?qGA7#%kD+RMIJ!j$l0w$CehrJHE`W5O;%tqp)mo~3vgKGLS6D$^P)nbO!Ed|aC} z!eAi$J<&x7hDtJ08rN*X+r2dgcxWD`Qb)@DU=R<0FSyTOyyt6OAtJ8b2NX( zd@D2-!@J&{80cI+kNfoOZRYDFGW&OS3+6NT?1{P}zTD_D+EEXI70eRqI|`8OzxVUo z9{7&vQ?I_QIKcf(*M8AEcu1tu<`+Y`Y?{bvY0Y+{gO*5+V(2C#?_vRPQQUt1bhFjs zN4$c2R$MW%?>cztLYxr$+CS=zkyznH0*K4WJ!v>CZ6)ck6Y$*9R{m2Rvh?7>#tQ~a zGDR=n+7TKt=0^a7@}r42r=l2~>%$+e)$hZs9D=*%JOwMh(!^_x&9l7)LPEMOJec$t zrvesYfncalyBBB!g@)qH0-$;M`UemphI$=Ot4^=UP4;Xk`U&)2wYRq4^A0AOGFW2#y zum_7z<+8OSXlnoZfPJLTvfO2@SC>0o;RFuE^l9L`vs-uavb#L6A1c%@O z0tEMsCb+x1LvWW(f(8w4L4pT&*Wm8%?(VX={CAu)PQUbXjq0kkde*FOidX>DLBna8 zaaE=jS_flftCISfH?TeNGt4Wu(ffOfx(_EA6+FMIt(cZWE~OJmvQX%`X9I-=MOln+ z-$Wr{jyTbk@hW8CTqy@-TdM|ua<3R7;%K+tV|5i28xVI~i6JwgqmG!~&PV7sVFJsY zXdUM0x$K5?;lR&amZlmHU!eqEI{#d7CdsqQt%kA~W^gAD3781dEPh6OMAS7D3&bdv z$0`ssE7lS_+egUMCBX_$7d~gE%j*nUkO#|YHNlXmqix^(^oQ5_x!?VS5h)3je>B24 zM5vH|#z!3E{c7qUYUmJfFIIiZS#5rb4yZgl26yAV`!2c_Q-$BWm!y$`oUHLoH;7TU zqBpzr)r!FbJhKa63F4>N@a)&mFBcbF0WrJd3W(p#c>jgJ^o%OugqQ;bZ7Wd$8Z-#N z+gWcv%$a)By_{XA0G$`ejD4v-^osr-V+X3y{vH8jNt!9so<*8tzay3Z zl_lRhbWmyxo&$t~{{bDXKj0^=H9}-Zs$vu*f^$lKt(9TT-#WWrl-nzO(ewzDUh@3i z6xV1O!~3~X3EJMk(#+IuT=Djn4Bl;RMWRDO)@BvnL8kkRb(x%1 z==%sP3&u!ogEyalU7sLI6d{8}wf?&}r;!n~PV4I$So z&e%d5m+0f5GkXJM&Pz&>0T!Q5b91LXe&OX`G z%45Lq!RYmFt$Zq8bF3|917~XL(DaWc(K`_lLg|C@YB)=V#;g@>onUCdv5(8LsnejJ zmV4ZQkK*-qZTa(*ZBR>LwVi^2;&S84PjuzRNAfkALJdZz_W^J(D@t?WHmnj}v6>_vjl53la6^GF=63LSW ziFuU2AV65qCn<)CoJ(FikmxQZ<`|l){ z9+SQHcmZ=*tMe_wTZa|>7#U(LoFdLZ(U_S9WHq?2&&}A~g30)}Plc`}D4AZ{#smoR z-4wX)*v8bvXfHQf|0J+a_menhWnDti%s77`kw~KS<6nx9F4Ww_^sjDRc9gEw+rb;7 z!^YsQ>U|P>#w}PM|AK`z+YKq!oWLfeJR3QYo%tBJ@maUqP-GbiibZRbAbya^PU$8% zRV#EhBY;+M3MZRWz;Jmo1PZzfZ1m})2}O{ZA&^EKXKNq(t8~J-k;GY812eAMa3O(K zH7i|;WNFf|TL*l_wCv4!6X#e1yfb1i6$eoV(xJn1nGA*qxUDYaz@xL_UqMPjwB(n- zJR)Ey@5DgQ(?Pz??){iWsu2{*&gokxxR$(oX=2SR&4MT`q2XrzTSF|1KB$1~J_1=& zF-SKlD5mw-L7hO%NO3pTpOv3u&Y#9hX(nLyLp)TlI&Thb;Do<=x`mr6hz#(P$T4=P zrns5Hz7iu={yR6gw@ zk!{N5lDYyg`=~T`ZsMk$SbW(927GBUyN@J@wgb_KSEiSxJ2i%cWb~w56W){;8-Ziz zA9r2cvpxBVcmR4Hkfrbm{Q5KgU~RXsBAAW?aJV%){E@&z+;q|72L;zz-O`r(TP|tb z3@5a4<;aftm4b9mwQV*U3OOYg7O-2BCEdPD&EPQ5|vwtiY*B-1{73|eVc zM)~wLNO$(#W~5HNGw(@o?aiD!K`lA%wh|_2erl0i`3@tEcnsz}Wh|eDJ-i_jW4S5k zLP>6KFFY5Kds}CTO6MAZx225gJo?|udPA{1^MvX=X15FJdi1*@o}C_!%&DofH#I zw=iHZQd)kfUtP=FnnCP-RI3^QaC-9E)>>1mA&cW;ioz>g*IY?nPB*0nW=#TL&%O1h z1dvskIaT{jmwWaCt|c_imr5X;~`_P0dpY z*6^*i2>_5MS(pcRz6L(#soLyf8<((vR#i11B-UazH{J{^zA?y4ICIk<_r@3jnuG80 zu`!xv^b%vA*A}&#M1VrCH#+7vJYD<0z+q!Wm^a^z`bmPt1R=!5v&-JQ8gtxNg0-2^ zaB-wF2TW1`1EE225TpJPz>eqwY=)fdp85P>Q?b}foZIClJGgl2i{{sugZp3)SSSX2 zUIg6m&ZIIy_3e*Q)8P5iO26PidE^GO&W2%=7McB_c~!CV|2Cvp55|I{r>e0rG&9VC z4G5z(@K3{{OdGt82KUfFz~kxX9RZwox_VV!vUVX?tcU{o#49eT0mKuBxVG_P(evJq!G8ua0|$EgJbF#P}t8diK> z?eaXTN&E?yrBY?kRnYlJeZrXF>F_w+CP{#l3NsjW>K{3#u<=|lV$4~lJ4%cuzSs4h z&BJ?Fd;o{Hv`A$r^S3==fjB+h-WOSlp0ONOeDf9s!}HBR48mmT-ka}b>8lKJHA_il z_#PRPW69-4r5)0Y+<~SLnD4O@++nk7i~A2uZ3Ca7ZwptRMJ)U7ggkozb8iG=*|!s+ z3CFMs2Cc)7*dC+_6O)4;^n}a^toMx~{B^ndmC_8GGL*lS()P>O;iyLgcSy_WQy!^w zkzQ&Gh=Kt?=VEAv3i>ZzI_u}Qr2mAef|#qw%~cOJG@cZ*FIkEAUoHKb-;qesJvTV}ww(0z82+HA;|T8|8Xth{ap@Xa4#<)gEDO4G z)y3?!5D0>7^KA}Cc?Z#kW~OmmKJkot<%?u$DV3xQstJ+>qMP#!|DYrej2a`Zm-0f) zd-nm<)H7yYT!x^3x4aL>wH2(8sCJlIP3(rk_7OzeN(u;Pf(1L$_Hn*AfsHT$uR`)> z)v2L?RI>q+KK^!Fg9jh?^yJ=r*U7HMTvb`Y^=2A(5&)pq+KNPt7+$JIoWbFUX31#r zyBXIdF79Xvmv~K4AA+p6EICh`r%6;qmWnxY?U#>?t{IzUqA$;W`vIpY;GBI=#nL}X zo(CwhUth!YGk2B=OLe2S$$5LC{3%f6crUT~!8U=V0Gy(EVBrulT%T?PQE%%PCHNG5 zQ!inu+uY{BsFvy>!t8^_{;@UrX>5q%3oXFkG8+)<4@)+;yf0cZ9P~`=n*HwY4w)Xn z;Rvz?;yUe?D~PxtG>{YL434aWf^p#OK2j#JzAhKTiGk~9Qy;GuTdfQiUjO4&t$io2 z7T2fxKZ<-Qc+U;s#qA}x5o`^_j%=sK%oX}9gDUDjk9-gI9Nz--rJ6!mUtK(7-fcVR z3Jtg2EanqO$Jt?}xRY{9c4^<)YF3%_2kGsu>Q!d6756&MSOfMG-w66X;JP$OytYuh z@fnvEAyiurW)4c{EXn9bnl$;1ZXFyD3=*1f$><)q4=fx5&||hi~@8< zWj_%*){85PACk@@urS`B)6*CxK{?!uW^P(TzdM5|F*$n=&bMG_jegs;=z~E(ME%zD ziZ12D&H~AnvOTl|^^PNlFnT(grPg5np@7AF6*{&N^_G2SKX@wW>bkNcBL~x=(*v%U zk&_TcJ17wi_ihm;tUESBjkH||)OtI6)Uf~#mIF~XpSS}B3!}!=kPLYe zF-zUd+11iu_{IN-U9e%1?exVrfzms!E!XtU2@iuKVdHMjUp+~9p`ps1G3i-v<-Tdg zbT-G1D9w($FKMRQ;tKhZ?x(JGHpu>Cvkh;tK4J8afbKqMQ-sQ#=QSUuI;EH;fdoG8Y9_U6%EdH*McULW%-!-T|rm&%$@1+a#x) zSgj&PWxkGrq&qXk12y11pBrmEVx^v ztdjgGzIk>G)+N6=Z4{3MFjsGu?z?H02!se(8bQ7Hi7>HpR?djDb|fl-zmiQMPA_nX zkkZLARWmazv@k0X5A(Lmn{KGoS>F{om%8~Re6n;29cXyU%Cgnc1Q@55FI&Z@?>W~+ zR~uXWgxiRfY#o`iUpPS~g1iTY`F;=V{?ppTo%w1QFeqMZdTxXAMH!W4k()GFMK?Ji6BS!4-c&VM5VtRg(2`2 zFE#+9PY)hcLQvO`Zu%Ck`_G}Gh09aXM2sei0HU&@ys)`jjw6{0T__~6 zuM62W#ra<3x6-*u#;K&EQb$8Fy5W*h-jrF4;h5nBOO(T&#j-*jF370RwS1^Sl1Gqn z6^-}r3n6|F<)@ADMiHCAS(rxK&YYW;9d2`azyS{t7Y7S@<}UxYs%p!Th;*_|87lYYOy5} zZ~g4CE!!))Gwk+L{FNcqjDqmvJ#O!+a%7cfC)ez3{_O-NjC6rL1~8gN&XUr(!u(nw z#?|O+YcoW*G~DS+3YL%M{wBhSJ>ufnI5PQlimeJ~zv<%oX2Q=+RxvTO9!rz1 zSm9683xjno7BD!>{dD}8Fn!)s?+R&@#l1w_sBy4ak*U`+cO1p%h z%nhHzV_0nJU5(aJGKh5(?H8Mk6B#ecv|c7(8K^*99QdVL?#KF&@p!JoB8zo63V{n^ zvfyRQoXX$}qq?Ewjp9VX-_4?k)?|JktrXZQ#VL`6A7Lv@-O~(w3P?>`+k{?xgqR=7 z$4H_tgv%Ao)WNOr@4Llx)?Ux{!X33GKuJooO-f7N_j^Wt7ir&>IdQANZYhgPu*q!) znP)#3L~ta(jvMTxguxZUyGgJ-5~a6B?{BKIh_{OZp*2ZnoBtl)hx>sGM1UqNS_6D= z6pMkAE(MjDG^nL|qf+Y|DP8~crpbIb&Hb5K$25NW8FQ&c;_S``y-&y>pki+(N@sMH z+``7nfVq`o>a@KF(0`l3?u-&OK&C|&#ciETkF*A(lZpNv!1&I_k{zHi3uRbVXn=#* zk++?xW(Fu(`>`CSs?&JCzW5xlr50ag9w%R~*A9{>N9(ayI&1m-Uh+=&9#hVJ1%AW9XPzV0z;!?_50o4r8hoThHf^4pDtf7Or-k<>q*U}~4jjh61_!}Uuc?d8vPEla)x{&r7Vh(8En41ULV{MOJHHhb>L8Q@yb;3YVz)Coejx?3*I4@TA8gm^kGW2YLT|dJh3OXUPm!0XK#*aRlFN z2?gkk{c@FQQ*Ir#1yH(vzM1+{E3;KOb2IKCvso4Lg~dk>iWP>8u-a7Jm%~9Xy7|uc zV@DZX8^bsh-Mhlt54bPKQXgHXFyH`;h|A&4Jm|Geo50bpcU_bS1S_Qv=zx$L$?p1Z zS;_X0prMVKzr3$G#mJV_xD{~wwE<+G89(E_T@U~kWHh{5yF0sB6sD%21JI<0@qF^H zsZh78fIz<2KqCjsBIv0z5=HzR<%vVo(jkFVFX84UERd zOR4g+=2z)I;DxC{4Zn~F@~T9BSG?Q#Oa9g|jSs2w997f+9m~Q#t7Lo(3nc=;Quxh^ zP{H+=Wg;(ol<5K3H=x!yEwv+a?K5$n(x6C?Q3>tN=qF9j=DxqgofH7Lii;swBWFkq zof^rYpiW>DleCR~tz8F5v7C(>rg!D~lFrcUjH?H}wgKgx}ge@5vJEB2UbnXQv zy7xxn^c@!ro?odc%l2OFY%Eev86>d|R};~TE7*MwRbJ!ZP%`WZGemKFglJj6ACB=E z1Riy|4r$oRX^7T<7jc3vBccgvi+WeIW|H{XHNy9G+WKZ zz`ALa&g3m30$W~iExi}8^Jq)5+{+yUi0ih36+AG=xJXuoOQ>6zims+*ZMm;qBvj!7 z(ytfMAZt{({ILC$ke3hxZF2v1qC}Yo1^-v#C*7m%7fp6`6&>qYdr0Ph3b&f*yAGqd zbjROL?7pe(ZbnlroiiBxv>(&&=;Ux985Y0A?v78wO7v;Jb!ydXA3K0bz3-7`F?bjb(2 z^{O2|B$aYQu$U27xM(d*h1-2-`&m1w?Uod&e{@!Zu5p15R(AQXlZ$5~FL$*OQm40x z;LF9>FMc$wT;ijM0=8F@@KRZ^KTR0blY$dXA)fZ7C za0h;}9>m2!0nH0Z2K(m6((BvCCLurHLOkC+n=d1Q7}1^Y+fM?$+)Mm-E`C~em}FBi z+>=x01aOp=FZqDqBW{zDLtZ9?n(Q!dHR5ks013nf6sEy9=&GkwFF)79bes zafGTPu)M~7w2ah=P`l)3gm4$OvKi&WV*6vna-`+1$cVU!!FYB*vQ?<;vr_1~G`(-m z5g6pfuf+wWA2zDP09gh>bZrO)w@xJOe(C-2r{ul=wV~6zLAaqAW*6D=iSA#FH(?2u zcnBHKkdhARSV8AShTW;@?WAc6o;R1bEEuHFr{t7rJ$t8nrif@;us55lE^k`F_6(Zv z+-H21jOr~?igUT)m&9t&;cvdRVmuxCWvjV~ z5DlckT&eHilZiq;k&A!0Sr zOby{DEEhhZ&vwbO;nq^e*}`7a&Z*}&uVIowkPQlRp)m^JzTRbGbAx&E6tG54HGy^bP8fF>s5d0F)|6{ms1EqylXo_ zdgI$4^iT5+tjjT<$$K&0rM>q6fpCDPa4L_-L(9{7Q2?mGsY8=CfQa4)Cul?IdH5~deb7gcxuu@n;QiO` zi8ni!7M*R@0dr!?P{xzi@tp&U)9d3HSs)rgHa<7S#R7%O>&HsZ(vLwBo>PD^9tmc= zEqJ0wfW_#V7zN(6C>$i_->h$e54iA5`P7!(9nEx~^&b`Mb@oaDZJcOCy2|!J^x=!N zJ?UOVbpjA{LtW4#pRr_(-kWxH-!t6!?{3z60D4mr-h8!HjCkU=Xc1y7XLD+XqjT{L zX|1%~e?ox31Tt6G_vnAel#jB2eWwTyiFj=F%^=L;-d`?Ef)am1s1zt{pH+k7^oU}M zLn0-z3BTxJ^npp{a3<{jubn^YR$VJA<+h-;`qRjUFnb#sc2xz&fOj z!i4{kvi<|4+Ki{ezj{(Vir7Jf0LjDGC_63JD9XnzquU*$0zO;q$SEnR@aa^2b<#G-=zv!m0`E;#&Sr3 z4eR+HYB<}!7|dy?KSD=f0LaJkwMD`zP_9Ay6L%~@0K72x`-&(kAjCQRo|HT3TuT3f zcr?%qgZ01_cR+L?^7PIpBJM3R# zc(X@E5a7+f77ZzQf*m~*fkth{b&e9$&cd~S!@uLM{_eNpes{zx5{0_`oaSJ05-LV= zhB1T?NVy}tFg;fq9;lWxLZoCBr7ljg@}7iq%A;Qh<{mik_9ZbvT1cGUTbr*j_N;MT zUfqKlhb@S_S+C|ZfbfYUN=)qqTFl5vZ3Gf)ybijb+Hjd4`!1F5xZd`M40TZoMM9C! zMfx#&RxA`RpMjR$i>=z0gOwyngX5F6-Jv&VHaoZH`w)(YO0y3jra!5F*(%<_lFC7@ z!H3xOjd=C>+Ts~E)$J5r0$gw#OHxXYoVLu%KJr;2Rw&jWjtjmD_37{IdC z+wVaeeA!j#KNXNDAIpWoMC5CeiFF!#%2Psowb=zzFWZJjRa_d}RM{|PGMcOTUkLDg z^FZ&{&12;<-B%Z0pdpPF)TV}}-Y)Zi+Y*YI&cnW-2ir%GxQqtqUu!;6WkE89d|F(% zeE2$jSns9{%FujfJ7HDQv`SZ6i)0kWvyzF0ooZrVE=+O93^jj-X=Zq8hzy3&x<|jh zIQC}nWeL^&q0Wuu8h~ZgKIHj*I!Y#_ZYTpo1hz^px(~g`Z<3)LM4-^Q*RwuGs3}&s z{WWwjY3dvKD7M3RI~8CskkhRnG2#=McG`@Mpnq(^dng9`=w?dhzl)lx&0Ad#=4ilP zi|Atj+RTQT4~(Dz_m#=g(z|%}VaTjSsUCiVrlB9PPSL&!Um;KWPa^q3#NFT3YE`Ia>z)P8go<*aPvaWvzek-g;`QrzzK zQ91%S3CWK1GYYX==+@%jo?5O3$vmqA-O1xS_CQOaYtQ~p>!)-p6xMxFVu7pm+&JBJ z&1yW&TS9m&qZaWWcfq_!l|JncKZt>o1Iu<{t+nY78WQt>A*@HWcoqxo+ZfPj{o%nx zMQ4(Q0%ewO%zA?AKCX+aVEUKO@W7{6_pYLHj<*)0SAg?)M?HFg&NPZ}Bc*Ki&%wqD zuY!5Oc-E4+W2cVFo|+9oi5*S$OgI+A&1>(6Br=@qoLuh8PN!HPz6ASqb$idDvFcab z(V8P|sOEbMqVg*rWgB#JSN<9aok{IKH%ev+8=QaXO!L`dPxNAT9JBgeWO%Sh=X*Y4 zWl?`4O*~AoPV?$FIpPK!5E9w$TR4zVpm2#G+k*ALJk99V>S(MSr#7LDC^nZo&#E7Of zTm9XM6&F7!jQ!L$isznPT;%n)$Z51+jK+QZfDZmr0ocYJ+AGoqHy&?C{EI3+3&pu; zs`L5qfe?nU?OkM+<7Cm91bh!ENPU)Ahqt2pV5Pv&{#j#Bpld%nXiu%SAjB?Jt zP3Zq5;7t}RctTxcNB*FwB$-X64cm38Am?N1$Tg&t$f~`k^KFQtT)h;|b@^NKFV_O; z<05nX$s~oJXyXTv4y~7mvK1gOOuTGUTv@pK%h^}@Rw zdtqQ9?v@A>5HeTAe94CjTcEpsrf?scKYNEl@6yU;RqC31-G{esyA^-utdjXMvoQDG z-vBj^Ke6qE(qiD=vK2ym%uQqL*Qp~6f*+aq*iR{#iJik}NdaLBZ%A9+z7~;${MttwsQ&!&%UDkYbcg6m7`9hl`r_VO#1Rh**eZYCvXJos9ypXW8k!)AyofZV=-ux)*Ln!#7KFW=~um7=AMu@fIyHB;Ta zpShpVoJ;x@;N+D>3onfl#eKeh!rU z!Wf7|EHhi{+L=oid0lSj5N91KQM0E#vhsZY0PTLjJu9@OZHz!M`L)~F@^cW!g&Sg* z2%#;S2Juy46)b@=rUn|nZO;l0pfUOKev==!Ro%LI%?O~4pG>38h7~fWcK5%#5BORi zeCYH={utiSw%CVdyPt^-;nFf(dzu3ADrT>g@9&9ejLr}D$^6^K5NE$Rcpv?$U?6o ze)LDDq2p&GI_Pjn(U#DS3ii9n1#+KR zVZTiY1NyG2`5x9j!}^6KECrphaLKZ9o)BPx8fO?!bJmO-;|4tQ0z1cTF&N#$Ou)@@ zYJ$P1+4>WEt|nak6E4lrmT>P>BP#8Wy%+uoVb1cmZ8RVtZr6Matxu+`3u%fECQrUJ zDV*Z~1{eI0AG@rum^wSf!K;*Zw09$X*`v&1|4W!gz|!n{I-jY&*+@XO!90Eq{vVb6 zRNZrif#^>xdz(MiW7GOyrgcdG;nweKCE{*M-tc4fWDdPtkd8FY^6!? zRC>k_fUzSNCvzT;T?OJ>>2189zkRvjH#B_r3O@0Ucn?0%=R)w=hFYtn9UVLJWQ$IS zyXWTaza!;=rC|z@ewP_Z(NvvLuKb4^Zgx~9(vQy_g`;C8_s6x8dd5v43-X+bJuRI^ zaF+3U8dbF$ENaLdQyI5bvka=$>utuG z;*dI351o3RhMq4AOQUKdhfpz3`eLqwH;0m+8FjQo|eXsDb`&PlkS&OCtfq|L<#`(b6x8EbCFP-;C znf@or`r0geV^L?@RCQmLT_(C{ZkV7RvIm`d2WkW8W&V51pvH)-G=n*wC%sDBxp``v zNS2@O(*_Zr@L3XQ_AI?rUjqq_J~#}REE-Q9HnZE5G_)7l_hl5YAMkSf*Ei`&kgCaL zv+`SA4NfOvhfh%$@}7x`X!LnXwwn6;yy_}5Sdby z4DzW}G*4}Z0Reul;$K?}QGxXDMfx6=I{sn-;+o(N*?^16w?h#V=%+hBsPgM)x;0E^ zzD%NxY^%~w1-hvit#g>S*;GpdZtI}dK z{N=4JSzjub!{nGapp#UZ%~WWF6}Cqwmkc`9!Xg0u!OU@05+^#0`unB0uAcC*cr(GH zKHi!xz{)jNWx?-y%u+{&F;HK2hvx4#4Xw8sJ1$p6GU;ed7s6XjbGh@gAj9G}YFx*o zC8h0UZik7V)mDG2$e3fK%c7(G^EfQ_MWqpOvQH5cEeYmY2FkS;1iq9{&Pv#M$O~nO zCg3OQHT2mM1O3cP9mO^6=nALU#YOu{8*s>0fe6tqhxayu!@J^NU5ujCC1EmO+aP2l z8JPq{LDCWLnfMpivS}XpBMM+4!f$m*G=l|{(Jzvl{JpBEh#lLU^$({nZgiWve?+FuY_Jv zC8x3{=3>tOUuUNMOrD7jIA8CGpeuxiv8U&(!MeCah01rP+bH1^Ec}9K$FTn>-n}Z4 zJE$rsC5(9${YJT(IZ&5PsEgvs^Jjsi1HQo@+?fyRz1N5-*v&QveABx>U>x2M{wrh@ zE%>y&TcvYXUX;A~G~E#-&E@I1x)Bu@5$oE-OolIfDVpCt??unbCAurOlUB{IXiJzx zXy(h|_;bUcWBz})1RU?%U)_Jte^H=lZ|^aDJWNpQs#*Hk6E{^dR;TMMuu=A`8CE9^ zdb{xBcX>Q`4jo8w;lB~epMhbYxn+caBZB*qEt;$Q3_Q!9bFt&nSOeou>m1RjtPm(=^9 zE1`nTZS`4lD$VE4-k0qC*+lN?Ms%2ElSACM^)^rojsk6{GTBz<827Dx$EIl^xpi6N SnZSv_J0ivHJ2nid-gtx=H{vZ0`Sju<@~ph)wvS@p@O*BI~ZF!-d8~+ zO8#l`7V@X?8KQXK^S`e9p7#{#bM*(f^>_c*^%e0iBQB7xW%=6TnWBR^)W*_S;}3hN zG?aslgN==sjSI@40ylLwv9vRXO4_+tI@sIU!tIZkUk{4O<%-0Bs^7MH5J*2DXtjWJ^NtB{6q(k)!%7B0bg*Mz{?my=}N+ZN{XRxw2D8O zl?k}NaZ0MH$*Y5xv%aPaeA>l%+QmydF;Mrjm-gpC-I+lB-+@LXLI0$4ujSwO>Ce=m z5Fqn0EMb)~`w?084_G#0Ku`$+V0y0-D0=K8#@HO`d^4*u%al5c;yT-bD&~PItUpaa zJR#kW2FSEb&i{XsnRWvFe@`M7eN2D|sLS3r6uoa~B~@s99hg!7Xt)mmZ7QO|-0i^i z(vhpzQ21tSibDFwNrDm``WXvAulP^H9np^9QGWZ6G;&O#j86xqZyYSD zoPz3V>Y6UL+8>?g>jU*?oR_D)mZu{O9tQn)VEvcp0HD(Z{PD?n<8b!gRDT6A^uGrF zm*>18?2V!L8bd2vMJqqXJoJ-G@r3Iefuu5*yeg6YHzMb8Vz?@g{x~;$Tpd2?0-vpe z>(+Z|*Zt!#f8Azz+W9{`=iWsg!6H|sVv+vsIhhQRKlmaaOUKe`$I`ncn1>`6CZ%r| zW@G#}&#?$CNDM6q4&4lnWC%&H3`s6($hPS(+im<`(|>u+O9xsofu1AjK>Ht_)6PyI z4ti4+v;4{5ISPIQ73w7U@IMUz0PWFOvVYbQWfhi574AtD7Iihj|Jh?e>Li!^I2Wkc z4*)<40FOZ<2jGS}M2p!8YN4@j&?0BSP_n*|1Qg(MV!^N%uzuuEIbh zA?F`K#~TU7?#$PdUgtvtmpvpv8326Q``EvbI1EdF&6F5sM^B6IgFVTM8aNg&~5 zq|3)QSxwCulm40;Pa+$dmWyu^QVMngP{AK&)@U>lM1&9kjImTO7z5)~h8Z`aRr=Z2 zDO6-&1*xjTFf_`5es+{Je_X~q3e{o8UW$N0(e+gSQBei}fVM-xpBMv|sU(2=1o-}% zb|j8VmXJ=CKyri-K20D${ef$Ui(6SueSkoHQcZoHSYEx3PM$zs{!~q!KvJDZeLO*4 zz1DVw3qGr+zDTS-SqGmd_SQ^rUgnh725+Z8s`GS$m%)^+e&Ro@tEp?dz_ov?YfgE|f>c%cSt51yI`!EzTlEC56(@ClP5A6@b!}pA-RZ!UUtTLD z_nfCEok6P66x^uZd6~g7+0rWeQ&BQQQBh%0oo!KBsc!aGQFc*(m3dKFNq<#&ahc67 zNG- zn`b`bKz{K~V_{>X-EQNX!8%)toT8mprh(3i{;I>>M%Ef<8fA6o#d!TyO>iEz25-}K ze+O3C^0$><^@9w?&S4|=6b)dvYCCeUuIJ>bun}Kmo_R7j(xTFoqT<~uyQf_xyJE`f zUiu&4%e?y95ABwDBXy@EvWs>anFd-xLF@}X_7qKQ6#DZ#AR(=)6w}M3?>G90^?c8p ztLLk~oO8;t(0ijmY(Va@LC`OfMe`KFmk$D<&}&pBI<9%o@v5X~4{FshaVb6q4 zIGzbE$7ZhSurzvJ%{>8RwV9cVBPNrVODHSDqA>^pIcH2%sxTK{Rl2YiWR;goEGxra zN2qJZK1Bic$i>%{X6zwUwPoo^e%u2ES$(}1{zt}oVm!zy$v;*`ru0Ls%3x~TJuCl6 z8EMA4SQ$BRR5CJ^fhsyS>{F>KHr(K-KvuCbHY`0lx^lJ7xH_1BMpas?VQp2~0}7|h zBaxM^gRm!s4sv3QjOv4; zXmqv1Fh<7iDHs}E99xRY;ANv0`%e@D7fyRkmiy2 zkCNmPn&3XlBLVG_M`!}-mc$W9jEU4_Sd@V=KuLy)F%VZqnl29vt}(#46v1XRUW)=8 z(BE~$5X%^gJqYTg#=(RaASd&r&=1sTsWS+LyzW6AtJ0bo5wz04DGpgW5DI3cUlMhm z0>BG1?sL_EZ)F?J_{F-|_oedqyh zviI>vI7k3*dq4tglj1&0b&ULXVDj%0`u}GVg2~x=~|b9ko(UJ5NX3e1@2JEHD2;Dl3_C6&k+{~4D`AZ!4acS1_Uu~ zi_Zsk(s(2IhA-B5o+xI`VrU8R(u|L|re=tx1ZIOA878(f|5LNdW zp$P!Z@V71?`oHRMpKtz!76_=#zwP3c#Qs1FEeot;qy$06@TWuvmeBtOaDTuUfDeXp z@gV2Fb@BM1j6dOByvjWyLDk$7{y_Cl37zI%U4I(W{Ox-m3xW_uykCVMZ_(!TKeFLk z=|ohr=#v3_u>j!BjMXmVR3EfEH6TGYAld=f_!*u`DC}h=T#B@tWHO#Tk5E;`dMnj9 zTv;*AM25YqBwj;?A?DqfLrJa6Aow&3MFZGyX*m5vAcQ1+pr8OGMj*4IeUx1f326;I70)VNHoFS z5W;9*e*!z#AJ~eYJJ6p?=HdK(_=W&f01%4}ee@_97Ksz}AR0FYFBU(JARdG-0DOn| zJ^*}ak%NPS%_4KURuO3>OapSitRd0;A>U_cXn!A7kp7haKAell|0Ul)oZpKnEpT-w zXJPK`Y^<-Z?QAM->8Nd=n_k^ze)g1;@A3|UM0sQHn*v>!jHhg;yd}nX5)qOgzTaq4 zGM^lpaZi@jpa_K;jL zn@|+y_q6gfHF4ulh);5j3djtI>KNFHm6tPS7%hc3MVXNgrZ<~G?AOt|QdN|vwzl4W zPQuwsDD!py4oQ~R`Enf9nN-a7X?}AgnvNA`ph#6Ap2VPeK~bmkdupZbW6y2(eb=H? zeVDK$v%`yUGEJqt;7KTFz~Z|fD*NUY^B<(^Ty{QapcO-}BfZI%4I7UfFKACSb?ANU z>n(H;Tj6RmbQ~FmKx*ZR3_Df@pasdB^iJoZDg-Emj=Ul|5J{(QrkTs{Mi-A^^JcLY zpKm;m%1XO(i676g^?n%5$q9Fw#`b>`f!AhToTFBR!+XKsqqnIq<)NXcdaM?$8&xfp zyL4vnXHM0n7{P=quub}n*bBafgn~?`r?yeUaf?iI6ArNzy$E#(Fov-sJ$^iCgvFOn z+_$@w<5Rz4sF0VsxN8hwW1g9c5aM|_*1n+Y#_=O~htd2YWHy_<7KO@;_Buu&Weebg zlSQM^_s9qcKj)!EoJlLyWXu@;6+7K_-Vi$7+oW+-Gc@xlM1RV$RpSSjo7=;g9%=HZ z^Hz0cK=9ctvfd$enPEGca0659C5iI$Mt`m(kC{C@5BP)C=cN&E^7TyQ$FgxSdm^@v zIPL8s{4#hfWe_Mnzepp=FVJ7fx)wRaK@>oUVy6lA{b-tMcK3;*acw*_Xba8Fpc-FZ z_iN}axBHv3cty(7>nBQ0J^OkP$Ss_9k#r0R@jKyQ=Nemn$VWw~UjYb5dxpBdGWw+6t$27{MQBT41OjXg@-ieSqvFBcmgUC#&7ZqXeukRfOL4x z7amiBaP-feL@AV+mQRmMj!F!H^6SsHYga#eMhs9j6CymO5LY}nDv3<|H+iB^r&X(3 zgjn$ep_L4=R(Gim)eeKQc6gG4L5lL2?>iicoawWJt}cDnC0IRX84|og{JViRIr1_Y zMz+4Yr-F4h&eLe~msbjWaTFBqC?+3E_7O9Ki&MjDFmWkym+ z$sDF44QjTlJsdYD0^_}(hbFG_-I#@-%4?z+531L7i5&Fjvln|w9`?QWDjt{J;7LGS zbyrWs**SVD5=Wk=8V`pc+{WRVCfH4z=zW(p8Ap{jrACOuBPpealtQj zjU=%?<p+hb3YG$2G7_@a3ihyogkD+>+}{{4{0`>VbrL^J~V@#t$)0xyhncWQ&t)L*CvQ z_%Bo=>|*Jl-lqT4}4N6#fg#|3f^)pqE& zB0Ub`Qm#g%+rwEAM;7BPpQ%VW_e`rFv1$r5I-uc6f8vTyvj?>Qw z%`O#DTWsG&nM>r1;jL`#e3;M2Xj<*g$9BdQXs_uON7o@F55LJ+*~XQOGdd?u!>lrm zV@rKPWcjZy z+IB-}-Tp^n%vqkW_lBa{AW^D4I@v=)vI(moHd3ADQ9v|(ATKb%l{5<_Dy5cUTB5vhO{6?5i zwkxt8PnO(|9X^YX%IK^(CZ%C+_^%!$CkN3h-+3`TVneuvBmIyHkNb)6U5orN;+A~! zR!Xz_JBVlS!zDW2#aDN6_ATy}mS^VZ)k!1TKTd5;iZ`k@$`L}*fmSD{8UsohO(HIu8bgMcDn_!~|~-=_KYhodXg+iM@FhQ-L>pFo>t9-qz5# znV;?VqxpFjXQ{|wJohzj8{#uXOssC_JV#MMc5lt5%3X|osk!|d<58 zZ$s5{5wf4Is_E(VwQVFiFLAHrG<@_3fABxc5HxSIv@LJaOwZSj%`f`V^eNoTW(%;s zQNjj<%xG6h<5+;#uNoiw3JD*}yfmLdK%>S-9n|jaZ{&H^bgOC_T3W9ttx<2}*}!TO z(Z;t@-@u70R`k2g-*75C{e+6cLXN-LxXlaSJJ{3>AJ>6*@`MD1+a|3{0dXGdW?0Rs z)l1MbmaTpuMm7_zer zE;WLSOB&gB)$BcObd#Ds-YqZQ2KBNRI|z7KfP-FBjToY0qjB`AC4UOYT@Sm~S$lQ? zcC!W7ZUX|1MjsFT3hHt4=Gl_G*h?o9sdO@g%Xmk=G*=8X?T;aDcJ$E(H2*pxT^mzc zx~M^A=#FMU!cTf@k%EvvsS_L|oXE*}SHM0w<7ijSP3hBc(IBiLKn6fXV zJtoj$Rh>2dfUeE{CY9uk>cGZAVMxxz`LmXO2+%IPm`kRvD{@tnUgzyCVdC54j&aU; zu=i@*s*&h-iBI|(R&tf@x!H`(LILhl}0!A$@Q7loVan0c_JgS<>ddZa`=i zSL59C#g4?KP-!A(5xJ7Qm3KOH1*7Ixo;42Ot^3z4^;ME^TmkC(hV1Z$P4gk+Ko{!o@@GjxM1heA?HAp$inT#3I2($OlvZ;N z#%KeMJa(@bK28gMBMoA#hxT1{;~mg+L;d$Yj#&4ujEYG$m>?fEreU~}$fS2u#~Aw` zj=-n+j%~j8`byG@q4&zP`C8$LBD#7EFnxB%l;RpVbIi?GL&M@p$q90GRLu*3+$o}*htD@5M7I&JoI_ihW zMG2M;`){-DlHhx)=9Uq_B{?2BV&ho(boq7*hv>sx*2&YcIoGGU_bTz9txNamZ-x?fAV*&Lssw`2I2YLW*jo%Ug~AC<7Rk8dMIGh=%As;DjU~ z59aGtiQ?&di+^J7m^Ttq+j%iEK%Dup42b2;f>3WUh?uu%qXLQ7ju_d88Kt}ZQN%Uo z)VyAocnNnc8adkTmRfY;$JrCrvxmoTBYx$)*<5ssaJt-Xw!qNQFW=1Y;cX$45>RlA zW3_ssZC?0dtO$GxQmg$E!)!8uk)q%~IvF1(gKMv^k5MqOBAJ@yP@(pWQ?aManyHzC z(e)=q9o6!M6|*Ul*6*Wu&u%pXqR~iVxz%kn>09(@H+%*IF@XLTDFlYOu&{5~9H?y1 z9l7C2gcb1qfy2mLiPVjk^Q6GBO9H8DS=D=c1xf5&Dq{uV&-#{=iEbXk zd*-V|PBap)CF=Wz+g`(05CN>?Rsq9IV+k3T5NxQwsJzJjg-Pu84)*1;Rsmk@d4jMW z;u}YbEaWS5zvK)Q)8jI$P~ItlxS+tyjXg3FQ{N4Vx7o&un77&AKi%v;S%>S)^Y(fe z9Z@3K-1J|G#GKMR|INIp6Ddx2J(g2W?|5~49=|XI|Vw`Iz^ zsFge>QNZ76b?@s73Wb~BM+M>ur@|@qu6A&gAnR^RC*pc53(HHELNwIi>|QQ!=NLgl zp6{Uo>h+Ogv}=XWN0X)ADUw*RwY@y2+kTK&F8+=bMv03ShVD0{-7Q-YE1FM45%BebT`daR37ogD9iOb0zK@Im zkD*Va@7h=M^%EEH{fA?Xbjjl;`4#Xh0kq7uPwRU+vX$R^)=tft4EWL;we(dts;7TO zZFpAO+g|Ey9DCls%llaB0n!JmNRQCfyh;lda#C~SKO$-;ziZRZ^qTT< ztgg>o=cs$ngn}3V5wDO^DvM0zG>fLc&@EXD6e<2%+=V7)8C_dn9UV1%Io@9cUtO_4g3jvWkr+xGszIs?DUz`k(| zkkg>wN=7Upz;y*qiPBsvl#mlEs!=`yfK9WoaD~r}$nE$@F*W_nNO@h2y6(-~2zDv! zRC>-u59+{mo-A#3Azh3Wc2p@__1l|+I`K66$s%=0iuVW*-x?tU0oRPjhpN98*hP}*V$y@L` zf1|fvWC`QaHbgKoYspZtOcqsEIz(yp%ruDiiO4!L97e_f+#E_DV<>5239ta++dJQV zF%fwUIufa#MHp3~?$eD9$RQz);JgSr6Ry^f?s|!yv=#O}&)I_Btx$l)Iu~V*A7Saq zz|jScD=VA^8(NATeAxad4oK?ip2!nJQ7F%BOdVSgv6|k0Diei%1ic{2ANe7DSuH>Z z2=QP=M3EvtydW4HJy8urwRo}`gmMJ{R6ij{Erf*7UKK2nyAbKcgx?1~oOk<&9R~6n z@($7{bq09FJlfh42;+^O!n0L4!4P$h05s)(LbJhTJYT?$fNK@JmYH% zDo|~oqvcWXxtqE#c$7C&d-q|)wRYWsLr9(lSSS=n{27+XWvcz%eb&?`9sh8o z9s9KU<>Jv(3_sf~F^Z7ML=#|Da_*ya4Rgem#`|HPQvRwHt5nrvcYm^zWaPf*e#aFg zd_8%{W*_!@xkz3XiSjk{!7m``JQ8!=;mB6apM!Q!ElH6LY5X9Wvr4uzzF!{rPQz;0 z+ja5*g{0%_~q@#QAbi&Mp)iz#z;gJ}Wre*BGV0}JsBFAB1^S9@rC)@o!TLL*t2 zd=Q^~N^J|azi2eW;8UU$_gZ)9crF6L#05He15zHS)nbI>1sU> zg(qJWN5_bIQM{qBmX{ziHm%K=@}ivK1cwX9Eoob;@SINr#YL9ZOG;imhB9r{SYEU{ zJ(KZ4KeC-3AtORM4=wnS0&*2On4nd^l*SA*_&3vlp zUP$|L-+4Lm0^)i~d!M89ZX0Eye;ivwTICUely8Om4Ve)h$bqi(GB^T(OMGDP1Zw_>C9<&BPonL}vrGQ93+noiue9w}bC%~xC-D_z!* z+F3nLT%v_-y>s7Eu_KG+Hh*fXs*vc_B%wQ2ju`i&Y`@hx_DegjrLG@Gq!Z8%8BL6G z9Tgtm-JOlbIXG4(fB9p*7#nxjvSWq#l`q^w$4rv9N0H{ejwcxl0)9T0Au_~69RIeF z`dt_feZ|P5mABw2^q4zpBEpQ{78^pVpOux0%~-J7{%G!3|D+|j+IRdQ*~eN#v!?FH zm5!>S{$Fe6vH({^?hczI1YX4-CO5Y+pD(KelihxP9_qIr@m}HG=(okPUO0ZF#l3~ZRwWvq_yZWQibX%?x@HG=P@k0zeQFyveIJFS z&)Q|YUrkClnLa(-)@ivuyD3OmsYky*Bk{Qd4CkDYKs9Dg}D_?Ey;r%%X!z zWk6_QHqHKe)~B|_-~Lw|wZYYiMOl!6&_NJv*@-r#LcBP1gi%dW6%7HvEvPwc^)>$y zCPPxJonREl5YAZ&LDUy5VC~g8qN&I-N=g{k5~#(cK~h}iC(M{R_|&r_URxXr3qzKn z_BVU7tw1|3|Sq-=NnL(F4Q-h52oo@XNRG}_t#`CVuaZ`n;>6K?}s z>RGvb(Uk9(J+l+PNi(&)%f_83=0IaUUqt9dQ#y|twV}bK-KT6b<9%!w8carHJ?((9F@dUFg%!@pr0 zTDd+|e+W3mpdne|NXv>({@!_=UdTGp$&bUGqu(RO#rD3C2jKub_)xpy>88>DWK4wB zn>3!X_(hr1_bY8XrV^J~9$>aaF3=sZ{cwZ&n11Js}EqSu@x@r(^?B7K8nbHHp z2z_*K?|Oa4n<=hG_9IFUb(iLA2MfwMlhY70WI>;*aHER+Tzg$awe*Ga)P>wHOClVz zncPh(dr~P6u~x9Qi?+5Ni~q#^8OO__gVq!+OLDHRdEF)zfZXW3;;sX@z5b;m$=*#t2&VByHk?*y_q3QvjGM%7#lE&Ccs*cbt189CtTP zY=tM)8ilM0mMb-S0f^u$Py+_7qg_W=1VM%o5uOh&gDzK6Gu74+zsdH3Kf?D+_!gK$ z(Ss0j3?82*ZLq%MZwi@L(V5hm2vZhnefg@T9Hri*VIA#k($_2ktA8fMCn1_!Ir zbnSYbS`O-|Uhc8`I)j4U<>v~~;hsU(n&&8YQ ze*5Fs{3K%6bV1a_K_slQKfl1%2^AS=uoHXtTjrZ5nkDiMVk$nvK_yqf!l&i;m%&md zP03L0%urE1fuaehTS#+9(;7yB=TqxtuCKQU9}}}~j0D?w9sLgVV=`<}zkkzAXV!|w zoKmQ~?uYtJeWga!_m`fSHcPSHQ70nrP5f@HwygDGTf0av>ZE#ti{Gj{&JI7an&6cg z5#+uok~sqh@V8QpHoJeF>)pTNcQohj;o$TYWz7m z5ntug?E4HGZ*aWkpg%74Mt;+7hL`wSZ@JdR>18PciF5%4gTt8GVfU8xBGQz9(g4dm zeGW&8htTxhwYY&(ajwUeOzMUw6+fCso(kROtdRxQ&j#v#4Wb}*bRHnx3~4)f5T_K8 z@%1HPoZVxRUM}`q3JbI@jP_WcGl3?{mUZi^#e@gHrZA7sZcb{hYGbB<36KdovF1Ih z;9`A~+pJnf(0XwckRv4NlRv}Sxx0xzGq@JQ!{G1f%OFIF%K78Xp5qSJ9CDh6J#McE znjC+O;Y38wCK=BR;&2vj>@I|U<0VVKMql;5T+8xi2$n*m2KSjsY6a`^MOs6bJ0|S` zFpp}-+OOAKkuw(=X8d%a*G^!`dy~o{Q=Cuz^#(JAU&;Gqcj`;Y5{PQwSZJ-q(=&R;8Y&M!P*c5HvqaitXw7 z93YafvegM8i~vf07A-R8x5>L>RL&U4n;fM$s6^haS;&4%w+C6(ww`i%Xndq3(@iw< zUO6JFbFsFiB`!e54b?FaTQOgF52|rErN{-Q;GYE?S?U>Zhg*A?) zK*4uRK~rev{@`_$dyFcxgS{6#kZ3mr5>flE^dkdR2-(IA?pA-R+Kuexz4}V`yBB+G zNE8(%8s68_QKX$6<*y+bGA|pSj8_1AMU62d#?_&59;D34lJ^gYvstQAiX=#HOP{-L(+g7*1y5M*Zu;x70&4Q zcP8)kw-7XZ)74~oV87y#p{NEoO&P**RjJgi4L9ZLUtMS7{D(Oii2T?0nMrdu5o7vy zp8H`8mvTzJc$iYD(%&NZJ)J>v$ zJ@K^_l}4k^`1|Yf7eyW{8LM&`%B%!H^8yW9(ND|@irMRYYG$_Ip^;$?x(*wIV^ErJ zdWNU9E*}%tZ~X+tKJuu{mY;?#a&b_|vA!p5G(z--t96s6u%eL!t*WqE80tY9w=Q5K zWGEF6arCeIy@w~3s;T`Imfr^b?o8l6G(X5)O4aE1#wauTAUQCyH$)Xw%e+ghx{%0= zi_^V_>FSQfU@Vlfrl7ZEPx?AXBDxfz1^yTphesg6(-4?jr<<|fIq_Yq1ZrpT6kpqS z)qBmR&be(&$T;E@j=D6zc*ft{&enG;ZPGyH{mk;26S0&?C7#rz)N3`?h^qSZk8eqJ z*pGNGe$^F1S+Rro9>N`WCb9o~4}lZ_euH#>-G2{p|DD9UEVw;t!{^TC>MB_(v$bx# zp$BY0fxV3!gOc>e2WtXRv@C!yzx(NV3G4L3aRr`{lO}53XZc!(cd1DqvclnJn6VcI zn)xs}8_V^l4-Ma@;bgtFnDL-!`V5UZ4IPdYn|zyjrF9dKi#XgHygrhH5@h^6`BC^$ zS>2x4oZaHil3xhmjzp^%t0pBf#6?C|HHi5unxq8FkWYC>#7>Q=+^uB)b*u2OZ) z8mmoyVzK-{fpjLVLgMhA#PnB-o}(%J;5)-FaPlPiOo#$MAw&yOByGBnuE-8h@;PiZ z?AN!DY;p+NahBcctj`nv%CNHHbX%=we+;%O5`(YILp3rR1w8)~l0TL*^G_oCh>o$t8$4nP}dpO(hbTbH=pN4ejfi5XJK^z41rS z;-PTqsgW-`T6|ObPOMWg+5=bA$h!S~MtI6QdQMrN#k|m;-t_^fU_APR?zIR4UmKeV zH9A|Q(THZGX%?_W&-tc}Rnt58=4!}iQ|>OJxST%Ec01)p+%AR?mNyZ}gkG0b<_N+90z5 zpZuoMW7-$S9nw71dq;!)?`@xubgay!@y9F_nyhsiU(Sp-Qm_=dPBO*4cvApRIQ~{I zd0sJ*wrx;n#fdm8r5If2fR(j=4ZZ7ob1oURF10UmtSL(T?_l80|>zD20uFR*0 zQW`SaGDhSR{l}~vym;geHezk?d7eLb6xBy;;bazoK%YroAl+IMGz`T&TzVy7Ie1b3 z1urh3w}#0FTQi3`x`~Wf!42LM+ravW4-c9;aS3~2io(Ly)YswJTKHP0viG1+tm!3V zbC@j^Bl5D%^UoWRM098}JwSd@=x)xObLxjl^j&(rP0#WQTd$hk4Z>R@pcNc4cP=vC zmj#|00pXcz5%RT?!)ilOKHobkZ->2sI~4r4!uhv1JC}adyY{??_=}phx6I3f&BN1; zdg2DBQ_*>u6cdx`Tb|V-MxiTN%K2OYZB#JRz4dNKs%6b37l(5M3-oZs_Q_nd7FenI za&~8sta||ZMUeeO#yFiqVkTa{%^gd@APN)Z1Kp(nHC literal 0 HcmV?d00001 diff --git a/Resources/Audio/Medical/Surgery/scalpel2.ogg b/Resources/Audio/Medical/Surgery/scalpel2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..7335f3d9cefa069550ecbac001fea9e997b21f8e GIT binary patch literal 13098 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 +# Манипуляция органами +Хирургия позволяет вам заменять органы у пациентов на здоровые, что позволит вам лечить некоторые виды хронических болезней. + +## Анатомия +Обычно в теле присутствуют следующие органы: + + + + + + + + + + + + + +Некоторые виды имеют больше или меньше органов, например у Дион функции множества из этих органов объединены в одном универсальном, но в целом это общее представление о том, что вы можете встретить. +Для удаления органа, вам необходимо провести соответствующую операцию Удалить Орган на части тела, в которой этот орган находится. С помощью этой процедуры вы сможете извлечь любой орган без вреда для пациента. + +Соответственно для трансплантации органа вам нужно использовать процедуру Добавления Органа на той части тела где он был раньше. + +## Что делает каждая из трансплантаций? +- Трансплантация [color=#a4885c]мозга[/color] Позволит пациенту контролировать другое тело. Идеальная альтернатива клонированию если у вас есть свободное тело. +- Трансплантация [color=#a4885c]печени[/color] излечит пациента от нанесённого ему урона ядами. +- Трансплантация [color=#a4885c]лёгких[/color] излечит пациента от огромного количества урона удушьем. +- Трансплантация [color=#a4885c]сердца[/color] излечит пациента от гниения и генетического урона. +- Трансплантация [color=#a4885c]глаз[/color] позволит пациенту снова видеть, и излечит любой урон от глаз. + +## Где мне достать новые органы? + +Обычно когда к вам приходит пациент с целью трансплантации нового органа, им понадобится новый, поскольку старый будет либо отсутствовать, либо будет повреждён без возможности восстановления. +Используйте для этого Медицинский Биофабрикатор, который производит био-синтетические органы для всех рас за биомассу. + + + + + + + +Плата медицинского биофабрикатора есть у Главного Врача в его шкафчике. + +## Почему трансплантация органа +## не произвела никакого эффекта? + +Тело вашего пациента отвергла орган, поскольку он в плохом состоянии, попробуйте использовать свежий орган от донора, либо же создайте новый при помощи Медицинского Биофабрикатора. + + diff --git a/Resources/ServerInfo/Corvax/Guidebook/Medical/PartManipulation.xml b/Resources/ServerInfo/Corvax/Guidebook/Medical/PartManipulation.xml new file mode 100644 index 00000000000..284fa0fe230 --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/Medical/PartManipulation.xml @@ -0,0 +1,51 @@ + +# Манипуляция частями тела +С этим руководством вы сможете превращать феленидов в людей, либо же наоборот если вы особенно жестоки. + +## Анатомия +Обычно тело имеет 10 основных частей. Среди них: + + + + + + + + + + + + + + + + + + +Некоторые расы могут иметь больше или меньше частей тела, такие как хвосты, крылья или дополнительные конечностей, но в целом это приближённая модель того что вы увидите. +Для удаления конечности, вам необходимо провести на ней хирурхическую операцию Удаления Конечности, которая удалит её без вреда для пациента. + +Однако если вы хотите присоединить конечность, вам необходимо провести операцию Присоединения Конечности на части тела к которой вы хотите её присоединить. +Ладони прикреплены к рукам, стопы прикреплены к ногам, всё остальное прикреплено к туловищу. + +## Где мне взять больше частей тела? + +Обычно когда к вам приходит пациент с целью установки новой конечности, им понадобится новая, поскольку старая будет либо отсутствовать, либо повреждена без возможности восстановления. +Для этого используйте Медицинский Биофабрикатор и немного биомассы. Затем произведите любую био-синтетическую часть тела, которая подойдёт любым расам. + + + + + + + +Плата медицинского биофабрикатора есть у Главного Врача в его шкафчике. + +## Я присоединил часть тела к пациенту, +## но почему она не работает? + +После прикрепления части тела к пациенту ей необходимо приживиться, для этого вам необходимо вылечить только что присоединённую часть тела. +Неповреждённая часть потребует небольших затрат для этого, но с серьёзно повреждённой конечностью могут возникнуть трудности. +Используйте хирургическую операцию для Лечения Ран, или же потратьте медикаменты для лечения нужной конечности. + + diff --git a/Resources/ServerInfo/Corvax/Guidebook/Medical/Surgery.xml b/Resources/ServerInfo/Corvax/Guidebook/Medical/Surgery.xml new file mode 100644 index 00000000000..c746bb64b03 --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/Medical/Surgery.xml @@ -0,0 +1,40 @@ + +# Хирургия +Ваша еженедельная активность. С помощью проведения хирургических операций на пациентах вы можее лечить повреждения, добавлять новые части тела и органы, и так далее. + +## Основы +Для начала хирургии пациент должен быть в положении лёжа, и в идеале без сознания. + +Если пациент всё ещё в сознании, он будет чувствовать огромную боль и могут получать гораздо более серьёзные травмы из-за болевого шока. + + + + + + +Вам также потребуется надеть Перчатки и Маску для предотвращения попадания инфекции в тело пациента. + + + + + + +## Начало + +Для хирургического вмешательства, вам потребуется следующий набор инструментов. + + + + + + + + + + + + + +Как только любой хирургический инструмент есть у вас в руке, провзаимодействуйте с телом пациента для начала операции. Вы можете выбрать части тела на которых хотите провести хирургию. + + diff --git a/Resources/ServerInfo/Corvax/Guidebook/Medical/UtilitySurgeries.xml b/Resources/ServerInfo/Corvax/Guidebook/Medical/UtilitySurgeries.xml new file mode 100644 index 00000000000..16d26b4d224 --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/Medical/UtilitySurgeries.xml @@ -0,0 +1,24 @@ + +# Особые применения хирургии + +## Лечение ран + +Залечить Раны - это хирургическая операция, которая позволяет лечить Механический урон или урон от Ожогов без медикаментов. +Для начала вам потребуется открыть разрез на теле пациента, а затем применять гемостат до тех пор, пока конечность не будет полностью восстановлена. +Далее закройте разрез при помощи прибора для прижигания. + + + + + + + +Эта процедура работает тем лучше, чем больше у вашего пациента повреждений, особенно если он всё ещё жив. Это позволяет вам воскрешать пациентов +с огромным количеством урона, например тупого Технического Ассистента который вошёл в горящую тритьеварку. + +## Имплантирование в полость + +Эта процедура позволяет вам имплантировать любой крошечный или маленький предмет в туловище пациента. Для начала вам необходимо открыть разрез, а затем открыть грудную клетку. +Пациент не сможет никак взаимодействовать с имплантированным предметом, однако для этого могут быть особые способы использования, например это даёт возможность ещё эффективнее спрятать диск ядерной аунтетификации. + + diff --git a/Resources/Textures/Interface/Ashen/target_doll.png b/Resources/Textures/Interface/Ashen/target_doll.png new file mode 100644 index 0000000000000000000000000000000000000000..e8eb2f52717b08c7124e99ddf4e2196a958b9362 GIT binary patch literal 422 zcmV;X0a^ZuP)B!WNgi#Ry4AL+$E_3_uFqG4dg>tn??69QH5lvm-Ll}lhpd9N#+YW% zasLXji1&+wmlEqi2;ZTeheu^_Y$rnaVE}n~a3r{2Cn*r|%S-3nOz1*N2_u>aRX`%5 z1hn{*z%>*?uj4?dHCEw-Q1+>9Q)euM(t%tZl+h3~0i}H8T=sKDX$U?EdG?W(P0}VjAg!8)cZ@$o{WHe@4;JDYw)l`f Q3jhEB07*qoM6N<$g4h?VQ2+n{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Clockwork/target_doll.png b/Resources/Textures/Interface/Clockwork/target_doll.png new file mode 100644 index 0000000000000000000000000000000000000000..8426d42299a09f42051f2e351fdc74b8f3b60c27 GIT binary patch literal 1219 zcmV;!1U&nRP)Z zPe>zI9LGPVGj?oJn=v?UD27c4%eEc#P+>(BHuchz*B*1&s|RrpUb?5<+hSRYUJ5-3 zg|fYMPi3J*h!h12RYLI~MwBw$Y0bFl32U(ZyI6w#^EX7zdS;E z)#yxq_uNQ}4@?`h#La9TmNh+*GAy%+mH-LxHaBhfPh<9i=*`1Ov+#vq#?y+0Nl+Nzq#)T ze)?p+q9vt(VDq>YA4y7jadylbTUpxF&Er;Jt$EyvFMc_$`(>z_%=~9bV`14yTV@l} z#ytXY=C?8m0FNH7RRA6@PU?>yu2oX;cN~Bt=PaJjDuK-binC*^EN$w$)rPmW?wkQo zw_3=jZ@XAjH5n}dF;8O~{ycD9^zq`P{&;axfBIy-lFurRs>w8adjgxUENup!#o00P zSw(O5_QX|9reBo+=vO6FP4<52;a-Lmu*@dV_5lbwNfZNh=L{_=aj>;VW;91(Y5>4{ z9&GIeEcP={w_0(*OnSIC5atpQ5ZZedBqda2$2@LTO68hfXwSX;ahtoh6C7;qQ7YFk zk6V>|R&fBD$2}gK5baN03aEWC$A9MHzo4t`oKd%06{zWjsR8cZc4;e>YwT7V6~H@h z863eRfRGc;F1~ z%>i^pLl~DbplWj9U05Cty-a(HT)AjkxAZI)1C8Am)p+V`xc9 z->o*{etA*sUdVv(WN_o%rEf3N`h%@KcJ^&bm>Qr|uHB2=IfQ&x(fxViGC#O71L5QY(NR&D8Xz;83)F`H#egV2qU!k(6%D0w zje?jf*Dht?+)OBgLa;(YcPbX>S0%(Z{o5@Z3o&*P1Hb?31g~U6O6Oec*U{F)%`x!tr*T-X zqiQndZ*)2%fVJvLdj3Juh-%ON_^Szxpy1p`eUW1y4tBFBWPbIn+kJI)M$;21Dlisnyww+$jRXH!SXObo-%vG~Kxbr`P3C6Yo=w%{ zfHSI^d{3lUKZ@i129SZywXB^VGM3rg2rDe)il=Eqk7&B!WNgi#Ry4AL+$E_3_uFqG4dg>tn??69QH5lvm-Ll}lhpd9N#+YW% zasLXji1&+wmlEqi2;ZTeheu^_Y$rnaVE}n~a3r{2Cn*r|%S-3nOz1*N2_u>aRX`%5 z1hn{*z%>*?uj4?dHCEw-Q1+>9Q)euM(t%tZl+h3~0i}H8T=sKDX$U?EdG?W(P0}VjAg!8)cZ@$o{WHe@4;JDYw)l`f Q3jhEB07*qoM6N<$g4h?VQ2+n{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Minimalist/target_doll.png b/Resources/Textures/Interface/Minimalist/target_doll.png new file mode 100644 index 0000000000000000000000000000000000000000..e8eb2f52717b08c7124e99ddf4e2196a958b9362 GIT binary patch literal 422 zcmV;X0a^ZuP)B!WNgi#Ry4AL+$E_3_uFqG4dg>tn??69QH5lvm-Ll}lhpd9N#+YW% zasLXji1&+wmlEqi2;ZTeheu^_Y$rnaVE}n~a3r{2Cn*r|%S-3nOz1*N2_u>aRX`%5 z1hn{*z%>*?uj4?dHCEw-Q1+>9Q)euM(t%tZl+h3~0i}H8T=sKDX$U?EdG?W(P0}VjAg!8)cZ@$o{WHe@4;JDYw)l`f Q3jhEB07*qoM6N<$g4h?VQ2+n{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Plasmafire/target_doll.png b/Resources/Textures/Interface/Plasmafire/target_doll.png new file mode 100644 index 0000000000000000000000000000000000000000..57262d67028b03c02f37300c70b7c86d9dc066ae GIT binary patch literal 462 zcmV;<0WtoGP);043`B7PLs~nf6~#%~{Qq}W8ry{Zp#$fDv2@X5Rh2tbRk_oloEhx< zCj)n`O^pcvpZrpvT{39f%iFs*A%p-?&o23Y=|zUF zTR$Om1W4e8HKF(43_)ZNVGw<lAhm=O>#2=`?`MobCN^uYi$4=o6m1arbb!T_HUa{{cA`~|pL5lBu3 zh+72xw;I^3`*BTBr$d6CrD+Tsbzn1t_995GGd*K+xEJ5#m1x^(%&E zD~4ygLwLH`=&^~8ZJm!^7R!VaSgOhJj^huiJjU_=1B90xZ-OR$IRF3v07*qoM6N<$ Eg5+YkBme*a literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Retro/target_doll.png b/Resources/Textures/Interface/Retro/target_doll.png new file mode 100644 index 0000000000000000000000000000000000000000..a147539c3ae627b06ea0fcfe67a9228dd21ae5cd GIT binary patch literal 383 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Doll/eyes_hover.png b/Resources/Textures/Interface/Targeting/Doll/eyes_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..72a30d73b8426fed3a93dfa2b5fb3609c02b952d GIT binary patch literal 6856 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 q9~u)6+vB#bTBxqBu8|mMpA3Un$baVF literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Doll/groin.png b/Resources/Textures/Interface/Targeting/Doll/groin.png new file mode 100644 index 0000000000000000000000000000000000000000..2c1a3debdaaffb23acce3d308e55eef9bae1bfc4 GIT binary patch literal 5485 zcmeHLc~lcu7Y|fXS)>)INJV4ZaG7K#nIw~GB4|JoFo+OWY|CV30)u2>5==lUxWEy& zinIb&>)KXrK@^dytw;r1v2|BI)E;TA{itQJmQBT;?)J? zZ;2jfO|J{DNqjSL;(+ktqwJ}Z?;JmT^-}J_Kc*uW&Wud=d&BVvZ4wEqh%M?+zZI8%F9D%zIa0SNmtk0{m<2aE2l5M<5Lzh z&aGHo=qBD`Ejkeswz}{@Rkn*Ie!=u%w`&4C)vR_)QXE!QSt@8;&^g=#DsO9GQZ4q8 z{pO7K+g#DdGVpaRhb*V#W_YW{RI|0k8?%Yp30>0X`*&3o>K-`jm6zkX8ON4a+} zo^OuAeQ!m2^+B0YC!bk#|>k3CD+xs9XFZctp&qMszrj;Y;Wq&gEC zF>&q>(MjVs=k4hi1l5xWno0w-Lh-f>PsuxQ?*|1McdMA3TJ8J zWlgQ69~6;~T5p!+8^2rHWVp9+`6KdO;#62b(=LzLpKJ2pymRR6fwZ!mBFVUK5FUAIw%Z?p+tN za~)S);N`C476^3PTI2FN$NT^I`|8+3U0<%x$Y11cy*0LDa`~()GrBz6LK~-Mn zQ7WUy{{UTe^skUPp|O!ZA#0rps-5q3l9Qs9GjQ3g5o2HVFia^&Ci_oH zUWM)1>wm{%c)sts*sWLD_rxt{-tzmJnLM%h@`zB+h}C0UUJ>pO-0A5-To*^r9Q(8U z?)RgTy9Tjmew?&Cmvr&nyKzKN=cumcqQdPTuz9Ytcl=g;B(&Nz~GkPGvor0HOwVH8(z-F`YZ6dyjjTay?nM?o+1wtVNG$2c= z(Ms4Mqh*W(q8lTGwva4iwlXFo*MUjsOet0cj|b+tPy92OHJYdJMoSM1fDeJ4Fbfbq zEHD@Zy)7)(&?Nw*$Du#9uxP=)E{LWrrWBT>LzmD->zLjU6#3NNoWdqK!=Xq4okSae zss*fy^jR`Yt%-VS;h-R%F_@iJfb2e+R!0AftUkUuW}M;lb_AF|#qFd0BzC7V(9&q| z5EGf=a8Dhg;5pXEDHF+1xN}H~#273V=^;Iekr1j!5s1KO7?PlR9YKLaVN$vml-g*q z5=N4CKml+*18^ueYbwW`jKEuQs2#`+3K*ZAmvoYQ|;UFBJ z7Nu73gnam!Br1up>VX010mev~Y?fzJTE;-fSP2K8h*X3i7y{}Og+*di@=R$i&00V$ zI#3aqFA_Ru9Erg}IDlHhQKj?z`^W zB*xiHT&}Y%aDwa(!9pydDW{(Rt9yz}AdK-e*gtv-_KBSNlVZ@pLPSOgVF;Fy1cXvj zkU>m{L9m3Dh!L@jBuRZ=bc;!EwGk{mEgtX)xB><0x&hlzEFUXQ>KC=&^U(g+3-q)q}MI#h(}B|;%ei~G9!7sHb{!UIJi zME{NO5R8(@D4Ku}k_7!HlF|?+5y22C6AE=wL`Q)r|JLxNS{TNKQd}(kH^QS4874yX zplT2q1)&l>4e4|g4MwmYBS=gN13&t7#b39MgiQ=X6iCJ5I!Z@Y6%bKez&bezC}N@%w_V7j!)r1J9-WqPkwt^;`@*m-371 z`rGJofA*wL8^Pam8+eYd`)g=dpgf)dMuW_%1r`p+!^d&CaJFpq z1Hu7TwI*~xgU2AB39qZmJU$1aaCOKu?ZDcUvj<-Z4j#(6*s)DDUK-s$aN6Vd?rL;^}cK{s&?y(xCtV literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Doll/groin_hover.png b/Resources/Textures/Interface/Targeting/Doll/groin_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..313b6a1124c38adbcc7948afb59fd7ce4525b431 GIT binary patch literal 6452 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Doll/head.png b/Resources/Textures/Interface/Targeting/Doll/head.png new file mode 100644 index 0000000000000000000000000000000000000000..9c645d2353c88f96bbf8e92fed127ce532d950d4 GIT binary patch literal 5663 zcmeHKX;f3!77j?60$5N~P)dkc1r3>Q$V~_$285^#0xF`m+}zxR7&4Gt5~QFg2nyBW z0EnPihgNC9A{N96Z2>`)r-BnGO8ZnSN{a9hpW42Y;DGCOt+!mS?Ju*|P0rnC@9*sW z?Y+;**$^HYWNYngO&}0#1;GIk;MWQ~7MAAVyS+#fOCXr7NREoeBM==)rB;fi@fZnT zslrHDl2l9}B(*=vU#@;Q&1T*0CG|7TI5;>ocU7;@(wa*qcia+i4;Ietl|5XM?r)he zbB#~g>fbsaP?yaQ670FRKVN-ki)Y?M&sED7`;_2~PfwI57YtPRx@dK@9gK4+CzER) zxjq`eRgSi-)ccKRZ(Z`!M%BD{mb3S>J(KL|p8eV=Wl-TEyJId#WJ`h$D)a>xuPyBS znd-#L&kU++ebU<0b9_QuQFg=m6O6l~{!#qYnshcSLeWj)eX;Dv56vYmVHdPPrv9fc zKUirptKGgdMLMwg>fXWGvg_&XL`qkOd+qvVyY3b|+AtvV{CYqy9#<=SUXi-7c_H_c zwl8jXwmzv5f4fJprtR)0ZRiGxt=1*7u5H(yLnIHPx^Y3n@&up5$!YDphD!;fOY2U5 zFNllS8`3kw!Zu^t35SWE=hORdbl*7on7}^gz?OT{if{Pi#n-3wGskhiE;}21KYml; z)HB|RB*;Y$1|}K%Qeo}{@GddiS`*dVTGm3#PvRwxt?KW zOb4P z6uWxy4fnzrIawp7@+`5z?m13-c+TCVsy$s)HlHajd!O(ed8F zeOmMdzB=9cR@;!fW9Hz#%te)1#O$8~(w)*098434X2EfG;;gNf7B#WjHn?Y-{XX+b zfxnFzX5aIb#qqlFmq<^7ZfX3r{7NDa~p(xqUX&g6ika zOzg3@PN?QNm%7z!?K{5dUA3Z4Rh6?xN}9SiaIo&zMxDrqzklQHip4jEtY=KSe(Z|* zGtJ^F`MQ|;+@s8*EZHrmFG(ltZrrI4>ywx-%ve2_7gIo)NuT^!@~!6FsR)lTe2Ff% zaC_{y$6S$mC)|A^Y+qKz=R2&3A9-tv+H*s1dS8x~$eYiee-JY`OO^X1rO!3*L9NZ> z8d^kL*STn?!_E%Y1>WkVjm|qSRy4;r&f{Z?9}PWAFN?k!WBS1}n~l5Xce-7=()YBU z)4O@q5biAcB!8@IY+1SYxv`ctzbxY|mIs&6bNf0M1(sgiNzM$IlQuOY*@3fG(5?(N zZ47GB+NB0LcTA0*Y+ksztgqnuBAL5K=TBjsCHb|RR=K?3{yTA?r#owtDo($owf4Z> z+OWv9#x4TEWSx}H4;S$HuXY`<*A%C2_6`1V)`ZO4UuCaeXyLOS799v37mx$bbNF~6YN zElj67V>aC1u86LiSjQ~NZ&_IaH)d~{of67JE`G4VwZ`lC^M;x`-<@Wr&*5^yCb^Fz z%4by5r#pKlWWf6lINv2Y6*#smExw}8W9gedozN(q?or-4DbQx#`pG8tjM8ae+7OX; zR>XYw2fSapToayKshj@kxn?tJ;&>o;lHZW)^WL(;l3nVprVDoW*H`&9q?Iq&R6MmE2nJarbJu!B0>p;vrqKip-$LadSd0U^PHM_(P2?}hQHa~~frF@j+w^w=2 zlwUndzoVo29w*c_4f@xLr{*wh)U3BU$POG3&sX9l}s|K;4)uwbVxXf zuT*0s$P4nKQ38{sS_XNhHHoJdiMbI0b6!G#H(zobj;pv-s!pf#(lNc1Y6+Fj;c%!l z29?2}01b*}r2>!0H#6JQWY*$Do6%QM5s)}eaU1nPkQB_Ton@X8eXA! z$pYYmnuMsRbT1lJE~k#P(BOeu0P@nIKeW(9fzy;4foYV9Y7`69VhVinNC*-7+Fq5Y zjyHxQLaA6hCI_k-uqyqnC4&SZ;jb+W6iB3UmC*{2{gx&!6~7_tE#C|?#&AYD0?c3I zzNP&tcB3-T3JKu`DA7cNdx8L8vSEF$NQp{CT;mX8LnzE)Gbk{`L?{qTgi>H{7EEEW zX)G3vPG_Pl&Il-hLW3g;6f-~pa4#vq5wX1)bPmj-AP~%;Kx`I7f$2031rmzc5XKZD z2#qxYB1|m>Rf)up^vVDw0#F#r5+V>nr+7nR*Z>7U5xSTHBPdmM%gB{RHeZzSRI2rdQ&pa-N1ky595GZiJ3W05#w;FHc~ z(&;dR!(kiZ;f%0fgsC;477eI$nirE{G&dxM3&H`^B8Ex@07f~8hRauD2(DB|DV6cQ zWP?*AgXQb#5YSK}1V;i890Q;<2E?V)xin4`g9*O5EcSF77>v+YilpL||4ZA@J|y07 z(u1WMu>MM;Xt<{$v4r8b;n#Snv6)CDV_R?$bT|YJqQyi;KLOV86dH#pBpBE~UKZ>t zx%3Z;fyH9cVIjt*AZ&t#2Ad>cKNfyV@J_wTqcbRG5?P6AP&NUG0=J#We`fDZ!M_TRM>XvCuWFS?{jX{sRv2+WfUFP8z`+B~G3x7s>}5HCRQ#2n zmtFK%E|UGM37CkEb0`F(Z$X>?h?xe8+n@c&f@F1n)A zdDY;OY%ZJ^6kxnA6Q1&quLdJ4RqzrGfj}H%cuWX8iYEY}1uh5)wCE;UjkV$&>`&wX z5xD#KM@?vzx47B;5dL9Cm)`e++tImOt!?tIe|*xZ>hSfC^`r@Q3u@uRsmOWv%HPGA z`*wez-+lLldu;tK1=`h@{u^QHcjkx8&hOOwe{<`8r6!!HyBSf1C-Of!)s;=OOR*l4 ZVzPAJ_=bV_{l6Mq6a?=%dC~$d-vJ?z3(|^CBoLm zbg8VSECd2sYHnt12VUjCuZ*-5_}jy5fkPm&^gw$jp&eZW^X2ncY##t74DbbDfSApK zK*X~a-8mXMD0qkTg!*BL;0U3 zAQP7b=SsA$)&5a2DNfJuoS9}{@=Wv6lTGf&+6GBQb`^J}N=z5s$hxE3!J}t?nxq^` zy8NnTGJ;X%UdD;A^u`J zbh?0JY3+7ky8lM&%MHA@ZQiL5;vY4x3&HRMpd~({t%ru<8Pg*yn~x+pXj?!?yWTW2 z_*0wnyRAViHL8l0ONw>TZ{pg1Q}Ozw`{Z+b5M4;@v1DGibHqSIYuuDn$J->uNyew1 zW>Lv3x$^A>ODlQ-EcqD9h!Taj@S^`tg~kTYDy(pBa(drG;qF8~X#KtJ&QRj;(>)1$ zsV+x7QHNfCIpH?(tKuN%w~y^UnRlC=9Hm)4=jbVUZuh&Emq63|7@e&Xqm`-BHe-)! z&S@`wd^#vRdX}IQURfV~I-&a_!gWjoqJ;Kmp_w~Ah@Vvso-EOke81Xg&&sB~WEo|t z)&C+b0ixHGJN?UgsXqQp_%;_K1>BZb5?D$!BjN~;Hb~UVu$nQuUS?Z|{xw-p9plX{ zIPYXvouRx*D$*rQXT#peaC>%xcXnnU?RpcUX3btFyw^VStvGtkz4r9xB3hY58ookmVM7Hy+f)I5;{7EA8KM|Kfpm z;7Ly5(C6`2-7V1KL!J09V))9Pdrbp^qV`0$E^F`9NviX8@~!UnL#r)&{_x-dhg3UM zT|!-sYE|S)C#HVt@?&Co#jCwW?Vo$MsBzCE{_z=ELNbTWsD5^=BMII>1BXpZf_w3J z&BRKENHuX+uGzTXq2|^53AaCW_19MKzisA3uDgFgO@e#dB@3C@8mXb)*828VOnAku z^9KrD{o{(u3yZgB1h1y88}1$Du0=q-&p3<3co%(Qtf!9F(JJw0o?GHi^JL?iA2?i2k^W_$HDR-10_4a!R_eMaw+sC7hXcDepn{z8qo|3w>*BVSrou=k z_0J364Q46Fz{^_HRvUFQjo#?x-N;HRnziqewj47GINXyh?<->w71Z`o<83>|sdGZp z{N#-*LzouCk<6@)P2LF24G~@GwPDMbu;?V zOX_2K3=Q)WEJ{?vZ-*zD4_NL!-+5aD!(P3pD@M*$#=F5jVz7AnspMYIL4+3VjQY%( zr6aEAMy~YSi@RiLZg!_~7@0M?`Q$Hk($n&%-J5D=RHYnwuCb#p92goh*8rQ&=Pgp& zr@Yp<)pYK?nf9!Hx;f8g7$USZFpBQk-RH*5dF^?X(ouP=t45(_LwTB6-J3v(QxTQI zXWMsld)4EoWf+V07plDQERk*eHKFu0J3R66bAvRtf=uVi%vwlV*9xR0?)3xg*@DQj zWc;Aa%~e&8QrSaG?O*vTR-V$YPpI4+Ui!f(NwcO}p)4%pEg*I?fln{7aK>FX|A^+YLVBWSfUJLg z_|xHWjzNjRVr`A_Tl+#Ujh0;)zvQvcHtU({2|spE^$J6WgA~Jep%BT0@V*mkE)6;! zH(f;4*LrSPRK8dxXdhv}sz=d|NzY0Va^fVHxH21i!mUj^)W;a=gUM{}KKj%E^QpkM zr0Z4(Ib>zH&Y6I8sT8HK_TSK-YP7^vmn`$V*Dj$_2m{Xu?)njwsJw}~XDRZjHXkOL z%T&&wml>bHRiC-s7{C9@GkM8|0_rcaM`Zyi_tTF&hT~-p2i*2qls5o;kbD@e4BMNY zf3XvPFI9c)Y#t)P#Fp8-L_#y3l0EAlICdij@0AJxbVlzH0HeG<^JnkEm)pl`LdV~S zDpeV6ok^&E1D%xGHKG14DU)loN`03&OgSl~sj4Y>cdLEbyHKXI^5d3c%9l9?p`49z z((W0joFzoJ{@RJwzCv{@~vD#|#k{Z3O77LO-9@LjgE zG(+I+G-W}I-E}2pyApqWwV{??T2&I?P;}LpmIGN&vbRm$v(35@^IYN;#W<_!?D3&R zyd1MG+_LF_ho?^XS>M#?z!blSKfb@oc?>H$|H_YEw| zDK1lyM+l1CpUlFQKls5U?mvXrm^c@p@-|&{873pL#)9*nc(~nAjdZUu9%D6Ulyj`@ z1E18rtyf{E8=VYPcGgd56V~KP5lW9-9+iA?DQkDRZOp|sSIp~y1jn;*`%ryI%WYbP zt1E5Uogipv`k4Kzis|9JsiEGtZJ%RIQ_LFIPc@LbjAEme*xBQT3R|sKPo2=bUaKrF z=vlv`qAkh-yku{mt=9zL{u7ax)k3#q`!UB>FhA(nIvzU_`6SbynH?cGw#K1wsK!~S z@MwC+P}ygF6DBn&_nGdpnkEZ+*l>LMQI~3r?NgJ=GTDZVU!0!1E;3A*igDE--d>;X z8x&QaHNO0I_T{)QUPTmCw5LhNvs%qO=rvu9s)MShON-ZZw9cM1{D{mNgr2FG0<7L6 zYdwFr+cm7%TX^_+J?)=SegTke}k#%nG|AG#JjY}e}cWy<`^hY088>Rex|itqTp^%-<~5r5>}_0jdC3c9{^e&}^A$s1mVX9enh4l9b2Bq~fekhKo>kfjF( z^ip5sz4~%*My*$QG}au|Nrpfq!q`Sew&q4g-!_}z7Be|GnrimgK>c{f)yP8*OSXg) znb&MojZYFSR8G2IzN13(M-_}ICgOB9AxM_`kSe;@3;(yzTP z+ED1ve~Ew=APQ$H3Oa9= zVvp`1lXkAuQI+FtzKhn=)b%??ymC#mS5D)+O09EpGd~_bQthT*#n#)D)40+^-ZFfx z#B$8_jhE%+=&$g0RyuDf16@$R85w?ckM7}UhJ?zsvn#hvLT83=B&4SBV;AkZG+O@K zwu;akmrJ|yhDI1|++@gS&rS>PDLsGp@z^n%rQ9lsqiv<-{+6*5p-)!1Pnw^Xua2I< zg&kZi-j>d*S!8tAU?j2aZXd}88jAb4e@co-l&p}8D;j=3JUm`J>)bflp?ExupPOKv zyBq>h#IeEMzmv5UnZe^A=uDmmfDm(h!P5Z*LfIzvr8B$%AVvY}2Ko(QA=W)s4{hS!7 z4VzaHdQ-KXtZiXNJU#%!A#ey3+(gVifYIJ63#0IvEV7;Pj;|2l6II(wDD)*Gks^@@ zA;Kbfd`~2rL?R(k7$gP*2Q}b=0IrZOhI0jL=O7j^i~#|I&-N9vd0f~WCf$SQFQjT~ zgX6Go@o{{ut-r%_1z%YJ`9O;4zDP6zh2(IMKUxTcCI>)}uL1o>3xPd&h(g){0-isg z0hk;BxWctRLNFQM?S1|EKJ)1?8A!kf;DD+E&@1{cE=|p?ZNFR0QQ*nu_|98_WdB7| z$Y%XX)?Z?q8<|h%$3Q^y@3?=_{+9c^GN@&3O*ZB+{O7_mH>PUO`6n}Z3^tQIe~TmF z7(@~Q11I9JbT|&rWWb5~cp@B6K;iKyG#bmmlYW3Q=L&>$E(4f@0>Ke%5Ql;GAfgER zShzmG@_^%*bRwKYAY$M+3_wDA;4usqfd2tvC!Y;gCEe%8sOF%UAQZsBd(d%oG+ZCY zBEoS5JRVM`qgikw9dv@HV{jfg;ye_SLEgdRbLil7vN?250O`y1oFAAYoV?xEoT`mM zp#GHD`p|_e&;aZKHkZj03H}_iXLEqvLi!w^XaW|ECgJdS5*Cd|VKILy?E&}#uomY~ z(I~{%k-3Q>gXw_O(&s7_1emt~vmqPt0lJXKx99PEsM>Qu!R9Q#4_ku`#iR@A#&jV7 zf}$`uG8#=rqwG-_G6qA&lJrnmGU^9?9+S-q`2V!$+6P8im~=C?0Q4U)FIwoS-GJZ1 z)54<kBe);Q`k%K+`o#zgKmuJ`U&um zEahQoY7F@@cV5PBI5-MkWPHu`3c&x_l;*w?ki=wlP`E^BZf&xpUrt6%bwhIJyS?t$>rvDs z{l4G#n8__jh>v>C)!S7d5Ih$X9i9l!L*OxNm<#;9K)mHF5I6-bP$yXvnM|R{Y}E2; zKxmzB0zzQpwE}_d+_jQ9=5Z6zz_wuJ|u5YdUuyjpS0i_kUZwQH-J^fa?;;Ye_aR;v4qzf?5)62S=&+M;x z@0-_K(_9za3On(`ebf2u6D>r`=F{^$uNRKlyg&ce3$9t&kzHDXCnl|;U_7L03{R^{#E?jGv($={(WHC#= zl={`T5e365;up?bzw?s`9V0&9P}Rur^#R#~hrcP^=DnvnH@U0Xr}BLqv$+>GRh}+C zd@j~2?!EKl1L%hLk9mJqUV1Qh!V+))=l;1`>E?1GgITp?S8Bzzz^F5dMj5v%OZXmu*s`HhVp-xWTL6v(3XKlZoKg%U5Y2ue%%ef)l@>fPw zES7~Ol{>k=db#WK)%%g0kw^E<#pGj)Ls#S`h;}u^=7o9-yrzsFy4+)=aFij*_e!hp zZfr{x7Qt`agDx9im%edHUY@6Cnt5`L*EZo|(%W1ay?U}JMm=rMI?u#uYZA|plG?3d z+h%_K!H$n+7daPADw)z?Ow$qxX$Ezg!vVO{ZO*QPq^< z({k@O7wNesTk)o43qD*nqq%5E%?zQaSlXyop{ z&x$<7OrBcX)% z=EAw1PG@U|UH&+CRnuX=JJddz^Y`n+7R@+)_YL;vTZM1c-siP71qW+3e`j>9E}Nuz zAi-ZcaJlDpwn?T)2Id#grNliz3NBuI$njtxW9jrf{RD>u|v6~4KvUFqSHvLd>n>B{z6GWZ{7 z6$xjrnnVJfL~hx!r4jNseH}Bf0+BHfb7i9%j;4Ytt`Ko6{p(56o_SZJF<6>AmE)slw!4-Xo(~< zGgF*Nh>d2Q1fwWQg5nY!N1y~^nQyQ%HpF0g*$&Z*5e_V@nKxN^qd{oLWHiPMt3o7# z^TLPr=}jtCKfJ-x#{%R-Vq;7aOpHqOddWZyi#1{%1nD#AcQq_(_;`>c0*f)j%z}t{ zz+ioOAOy$u>zgvnX%2TdRszz19*SDvs@P*oM#ZQS`Zeqn=y<)!p#{l)Ow!70ACdK# zZT1<5I|B`Y>ixKnNk8=6Aq=HdDmvWAX4uV(30H{h>(iW(0geTL!UF?|0Z=gpij<6)o zuo?_Sr7~;)#B?(cvyw?0Xq6p`gHWst<1{FyLAXE}i;$RxK;%-uAZ(ykh5|}Pa5CV4 z;#fM;Xx1|@oV=dV0g1_=b4=I?r^6Cr6e3)VJ{n0#W2{=J0Be9ZaK=o_qbW772Q#gV zoli_gU@$pJ9J-Clap@zWS-@<8xoAhlP%(i!X6%8Xp*xUT#-6DVz%dTJp_OL9SdC`2 z(U_(X*^Ls~HT$Pku%I}`%7imk06|flq%n-fP&G=>B>YkV@B$qmZ{&FG{Qo6wFCSrW zZ_uN83tWG`W2m>LW`gwIyWZP0-cd|Kp`$ElhV6C1!psAl!%m3RJH@6j1|5L?qc33} zj`P2l3^>LyS`nPlk9UvMO0^s&MG*!i?77a$5jjf$M5dK< zxK@e<%Cv!xoBMyd7pTTj8l`9w`!n1F93Dt&FeyS1ECJnvag@uYfe0(t0E*#ca;OO*4TmFgjf~|0MansfeX7x;)Hw7_O5=Y@ za-tl=GFrgGl!V1WY6vO3LbV9WY8e1vVO5YDGUif`8&B@DV92Mm3tlZ{@RDn{>B|Gr{AmV@yN$d z&3`GUThkk8Re2WgoAh+SM0@+Iij957+6@l(PyF5AVLxjA_PWh|reDg++ix09mp-it z7%tkO>eU;yYJ0_Q^VBEaXLt4>x`T8ku?I55`kFJ{mD~zKThdvk&ND2-&A110!+lGQ zxQ#8#%rgcO0^O|lNFi+y`eqrG=NsE#T&EzHH0<`>O&S|KcvFI4Q-T6!&hDf57e$-%+3 z@o8C@G%wRV`&%|Wjf*kGBb(|ua-`gOjb=$r#*0-oiI>*q)mK+lhaRra?Kr;r;9i{q z_F`M_Ln&o>gp0m8#}Abq;^M1QOWId6TrQRq%liOv^Gyu}-zV3^m_76(eka49@ZzkC z)qe_W>jH}z`H`sD3pD8QvA)&5g;&kCdHGdK`hwCnUU^u%~O>sO7|fw^8}h4!!K||Eph%n zTco8*;qexBM)k2tYcih8k>9QvOrXD^55}Ay(GBYE?4qRjxj%AEGq^$yHsM_(U;o41 z_R=2f8_y~gOlrgXZe}j;e)95(>#u30-q}t4Q7$zLOCI-jmtD5}b$5YZ_ob-33iqS8 z9H>DFKgB90RUOiGbyE?S^jE(<-h1i|PuiPFn!LaBlt%kC>-5R4GrJ;En?+WQXIMrR zJ&_g#L~=#*8|cRYXR1xu=FXH&BDZVVD{(*f`Xds2tA`TH}tr!*PU7prZ~H&V_=0*t|Gf5E=G9IV@7__b+;#m z+QKYT=u*+Mto?)@*JtXGUqv}7@20odTt&UUG0&{aN2y&}H;@^3YVJw3_@f=&DVNu@ zMx=w~ZpYwqD+G<&@k%h#x0r8?SIT)H*8^15?HO$5-KZE6;+p`zX?uFBZ# z9(;3g!m~YR0;-fx6eB@|t3j21vr0kd@X^e{oU5a)%2kE{CqTDLdmD#hqr z>Iul>=I?YX!MUYr1tPsOkKU30>A;R7f6<~12QH878>Y7;y_@LnHfakO5oWzU=B~K( z!RguM-SHows;HQ-6+cJYZWq+WXX*`A^?F>4F1IC-14I{Y4Ppnz#$z7co4D*WAhzqKIXOex(v4HH4S4gw_j=^4_{O0dJ&nf??qvi8mj$cU?wvQN;5qge`Wh|( zZz94Y9;M!^(XG!3Te(l3npHV}*H{OlYXABpH+qBrj%*k9xHMGcy(y<13R#+P1m?lHmE<&etDeiV7B5Jy7Db-EMT@Ul{gRY>!;vP`cJ|B+=U;yxA^gMzmhe zPb-HmB0|-cZ5um#z1haq)yGfkpgwfx$;I;qqZ0``=d4pO2u;6gUr68;F>T*_A5KaB ztt36K+(Us!Kr7eW%H$T86Ds{JY7>{&blBToEA(tda(5Y?`B_cJZUnD|dvI%u+uNqX zbJDA*P3+C-wodw6Z)m6I)3u)q|6cUqOg~5YXcUUAe4^E)WyeazcVnTx8k!GV7g;#p zMeQ`)XEV#X(418I2pmL>YmqauvoquFR+%ehIv;Czpp^sFFAN$k@|x&tpJlwcvwg3g z&AjLOa-It`x@PhmjCQCE2g>gl5t(eRz6J8;)h4anBL3?`@XMO;HE|o3%-Jt|ssf5~ zn0EK{%jg;%vvy4E*OyD4_d;YhPGqB3R4yEAMZ82x~Bg-QYh>)S3SFJloh(${P!Qz^$i2+U(U)Wm@c+RPY7;m+Sht0aa&ELW@Q3$ zT;bmEK*=N2&oMi7d|RZ#h*_f>M?3o?;@mL!KZo;XcwWS19WBdiuiWZ)EuY$aHp@3o4KZcuyi>*z_F&S?DH8Ntxk&HG`eHm)7k5Q?!FP+P+@D zjcdNRvU|S0x^s$&oEGlTqW$V>;0>aOi|LT%b?gn5|%>+F}l&T2+-i8mWt!<@6< z#C00^k2~#DZ_k`0Bt`!uwJ8>K$kXeVj^^L2dq8zHjw8GZnoy)rW}H*YIsJ6(>C@L| z-mmE%zB4O1NpxfvmT(#sd-y!bB{{J{;mpOumL-vp(Ak!$cud;jmd4C^D;`cVf7GwvbT} zz~u?2tYEUg(UfpGU#H<@HAoUa{$%|GLQqx~uNDP>rT!Jyd*SYa~vob0SnviWIj z0gKC~OLXyehslw#D%L84EfqC85A3aVv(_ICV*w4 z*(5RxO~5koFcbu$StJe_fT(0Vn+#2P!)DPO1R@>?r<2PA10al$A22155l*vpbFxC= zEPyW~ZXuwA0~^3Sz~!?A5#lc*Pc9EyB>`o8V##ePy)fA z0FFSzVrf{w6Ts1M01Zbp2kvZ9xNB(;)T7G?h&u10aV4;R(~l@EKh!;7B4s5o8+x^9XYV7w8mM$VDGhwfI|aA_5^< z9$?DQSS%VKcw(tEm^C;jn14S!0*A<9V~GG71n>adBrFP=!oovnGKa#(afnzFnM3;4 z-T!BJBu}^;04j}u{cnT^v2i2<6H7$n@hm(X9-K!Cg-AlPC`^b7vdI(zdAh{^sqB$G z0f2^wOZ~qR9*F|rDI|~uhesyC#fgI-c6cfWjptCXEG(0QXR;~(WcI%5=TF(Q#K@Mj zPpxQ)`CrXCt?mQ>_^~;++#D}-%5%7Eb(97WG@HYTOrt@+;#0S~u0Q|z} z7w}0%=;$LxAk^l_4mm{rZhd%AN#ew?S9+wTGFQhyP`CLQJY?%+XX~ll%VLjT&Nzoq zNL8=#cll+}#<=+ScsU=fISTTHjwolO=}||ZQ37UD;>w%l{Bl+Lwv=g85Ng`qn8G-UJ7{bZk)vj`xf5QI&60H=Z literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Doll/leftfoot.png b/Resources/Textures/Interface/Targeting/Doll/leftfoot.png new file mode 100644 index 0000000000000000000000000000000000000000..07da8e67b7544af6097d5fd978fd36a563621bb2 GIT binary patch literal 5462 zcmeHLdr%YC8V}VA%0uvhRjZN)z2alZZgw}>T@!gEJR$}WBdC3`*=!&{9wdPTM2jE{ zYVj(*mGLoh>!TI5ScKw>tAL>OQ58pQN3iAA2Zh_KB35wjNrH&e&fIav_AfKD$=P$h z?{~iMcYfbF*Ic*!GWvEbJgT!V(#zYn`Cd&c3s)0w4QXo;n*T%*aL z(WbIoOQwT41Xbh$3+>CKl{tZ#_AB-SmE zjy*hM(r)j_?;c;ejrQh;-kjZ-{BiPBx7lS?rZcDiQGN9KckAMpZ2oFV*2cZkF1Lb! zx@SK;8Ju$)zo`+4xK;FKkkumAF3 z#Ki|4PkLs0O^lNISEL3N9Y2*Q?J5WjxUhNc_@uDzVZnDAsYPnK|`CsdqcW+}8^Che9;#kGI>7bLv&ywaI?mMGlrWeWyEV8-w*NAHA$*05;@~UR3_3ey$l7V% zgBuo=<`kJL>qhPQXJez!lyhlYm#>&Te9-o3UWZL_?SALiNUkZdFOuiYzj5GTWJ6fg z)VMpbsej+Je!nkj{-WtaadlRj`N{o*Cf^UYEspy7{?|=SE#)<)GwrVVP0_R3F6{lh zyd>kdMVFe6EY0d@jyl$HqDyEyce)p8JlwixO~#e{gO;|aL#CT;@h6(k#%(Xw?4Zsc zy;pv*tF+?C^Vm}%MMC`J($FhAu5s}tTXt1OV_RIt?485aFXz0sE$?RQ2Gp%8A>&%* zgAKz=UCTp4JO@7v`*Qun_7S&bdEfh`MQ!?|^4HGdsO25oe_GbowX(Tz=kAk*KkS8z zvxY?bdD<95dEC|lW!mwH)pP5&w^*O~NrMWOdG>zdIaL2y_k$<=rf87d=|GnwagoI$`%w-^J;0)g$k1 z*rcg}YjRU+YIfEh$Xi`rHmod{+db$`drRqE-sEMQM=d^UGg`enmv)~2!I~4pN3XYU z8La$PP<&+HmWHxbA04_Y^>$4vio9^`$NjaKxc-JDJNuN!!x^351Vx-GM#r{{T>0}B z{lc^Fokh2Ax|q3>IJc@eG&@>MU;f)lzpB9Mp1P`*!>7@_aEhEee$r?U-Hc<%^l{VD zRuHB8#7Mw0 zt6y5rP*cNC)0VGeTzvPf9Us)~*VA!u>&_jf_3zBv^{}=gs4l1Mqh0gLf9Ygy=}S1z z6I*7dJe{7N(6#>2;wX;^E_t_3*QQ6Uf0A>4LPEEEvuDG)9xOk5qAh5Tq46E*vEa^a zw~qarjP}dH9w$F_C5XXw9ve<{{Mymcb+Y$^tL?YF3-V2ewki${=Wu*RYQbK#P%(#M z47xyCZBVg+Hk}ddRUD2u$Y!LO6xPC3v58u}gx6VpipSNeCA@fC0V|ABHc1~|u@;(Z)1~Uolug2O;8LJ%@8R6X9qFhUKAXzw zfT0m^ETMuh91}vMh$JAEB~Tn@1+-8t8~`!bqy?&^QwK(6 zhf)J5R77ARl}ZDkFad-S2n!J!Ap&V|4G2Yqt5g{3fKoG5xWS~O!E$PKbRx?)>JuFU zcEYKU7`cQe2!vnu#H7*|4R8Q8pw+7lR`bgtrB=tzx6pPz5fO?Yga9K@QhTeJyHWvwqaS2LNlh$mF_@GFL#l*l4~lE|>>pNuf>P5K zT1Hz~0168*3PC8CR0>cEMkoO~9R`g7_6D_9lllLw?d8K2I~P4tYXl0b9fAk6VMZfkB#GpYDQp4h4^;%?6FdN}Je_M8G593JBD}6*r)7siwXfjWvn2uLGbA zLJ$bXln6<|0tyxK_NevANa19G#v!11Q+a&(XDY)FXle`wcZ|QnV*K0BGTE=hH^_H&JV&Jum->U14 z(dGW~NuSk&zvou)98c8EdkWqGxT>NeWRAB1oTt+2PeE&_F>;Za!|@ntzg#%mO2&Xr zH;Y^m=62U(=qQ(WPxSovIp`wfvJmBv8;ZsduN>HiQ&W}8DY^dM;{Obid*$SGbw9eY vG+J0(kh|txYm7CUfF{RJx+JcD)BMa#-U6LS9tVyM%1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Doll/leftfoot_hover.png b/Resources/Textures/Interface/Targeting/Doll/leftfoot_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..2c9f9e38df46d02146b3875717a9ff840faee264 GIT binary patch literal 5476 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Doll/lefthand_hover.png b/Resources/Textures/Interface/Targeting/Doll/lefthand_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff52eae555b870e68bb83de31a192057d27fdf5 GIT binary patch literal 6174 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Doll/leftleg.png b/Resources/Textures/Interface/Targeting/Doll/leftleg.png new file mode 100644 index 0000000000000000000000000000000000000000..99dc24ce62ece522e0099552bfac0170da399f1d GIT binary patch literal 5488 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 T)k~kCmKb+uAE(kKVJZIsYnLPV literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Doll/mouth.png b/Resources/Textures/Interface/Targeting/Doll/mouth.png new file mode 100644 index 0000000000000000000000000000000000000000..202f411874e1bfebf30b7edf2642593cc4424c14 GIT binary patch literal 5219 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 b`pNt`E{SyxIoSrb#0nndAF3|$owe{kU37F` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Doll/mouth_hover.png b/Resources/Textures/Interface/Targeting/Doll/mouth_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..a5014f42ca3db0a388ddf896159d75a6c4cd5106 GIT binary patch literal 5208 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 Sge(HMy!hxOMeSrw(SHDU=oxna literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Doll/rightarm_hover.png b/Resources/Textures/Interface/Targeting/Doll/rightarm_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..7121c80830df2fa38f689ab9050edf0f918c64a1 GIT binary patch literal 6592 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Doll/righthand.png b/Resources/Textures/Interface/Targeting/Doll/righthand.png new file mode 100644 index 0000000000000000000000000000000000000000..e71f8de80ed087cb7adea8ca430681c53120a505 GIT binary patch literal 5467 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Doll/righthand_hover.png b/Resources/Textures/Interface/Targeting/Doll/righthand_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..d51910da1735eae1f8cd1ac6621aaba45d280ada GIT binary patch literal 6207 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 E0F#f?zyJUM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Doll/rightleg_hover.png b/Resources/Textures/Interface/Targeting/Doll/rightleg_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..b0936de0a0988200facc73e57f9acb8fee7e2891 GIT binary patch literal 5908 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Doll/torso.png b/Resources/Textures/Interface/Targeting/Doll/torso.png new file mode 100644 index 0000000000000000000000000000000000000000..44297c96c3271250a96874abef4cacc3e397c34c GIT binary patch literal 5284 zcmeHKdsGuw8V>>@1bidl;u3>)6*|dGGUU}n(0~vzAtJu3GMSl>fxJitiHZuMR7CNC z1+-aFu@qRvTCIvyQ4tj%^?_Qeb=CDneX)uUwCd?iK*X~>XOCy={$XgI`bZ_3G9YJhkrhUIwGflUWH9>3A%iWww~Kl%8bK zGtDH6v{70H!*=n0(eN|Zhj=f1X4m9r4q9+96)vu<9v)O1R7||ywM}tSpzgY)Uf$#y z?|FO6yy#YsT(57IpOqHbgX2Rg%u#jMzq}JNv~1k8ihFCO{Z=Q)UvYYH`OR5Rez+g> z>T%y)m5U2s_k6S?Ja9|UsEaS=_PN-n;qju=O;gJC1Fzk6HDv9Uov6QmyLWy|<+IjM z?_otbBlJ{w)Pv@Ro_ngA`raBF!yeUZZ{YIh8(F?V-N;ouAMD$U|JZ)tv&$on>ZBV3 z8$F?MN~vE+(%iVar@hiA=kCn?Wxl=S$)(p3FV-IQdbMnIL36*_r+L%j2mW(IcnPw5 z+4tH_8_JfbZ|^BT96z2p!=tQt?Ci{G`8m-8u~0wa@JPeD^LU>5I0??oT6c-2o4|rd*V?ye9-f6I`b^#d~W%+`8owvX_W>PZK@BX#%I-SPT&@Ri0JAuLh#&r-H~mW-1t|F!n3 zh<>`P^&9r)Gbdf?(ydq7cu{u2if(6PR`H^60o(12OZkDcK-RE`%!KMXg^C@Zx8FYN zuh~9&Qov=GSG$f!j2N7k<)aEn{CeYs@WQ~^<(0blbDPSlqEZU&-`%o9Cu6s+ndntk zc;fixiD?gS-1+&$<-DH`M474NhWf=t@yYde-=n^zq29@|*5$zi`sZg{xE3u=u6s&V zP{&TJ*?A`UHfO-I=#!UsKRa_*@wXjkR;y$!)HfwJH@QwR#Q0N9N9uBx@$MA#zmLy8 z8Kf>%F7>ORbaBZ|VY6dS{h*?Gu5kC~dcKy`;WPxW@) zPxrpN&ZB0Z-)Y5zd8y38X}ca?S;_2k`HLH`Z#>PPToNuf^r}%^^G@z-AJ)xAZYk{> zkfVN>v9zZ9!}AY!KAF%I`q=k{*PMlWM@(P8Y=K+&m6mxIOvjRQOA0r>bZ0PJ7E*G# zS|OLeDF7gQ`|j4SM`g`6OHoCOI*L*cXAqB{kX>(bkI;v z{`{2v`%CI8v-7r9b+4MwYIXhBy{j9W*n{U5^__gsW=`+XJg52C<@8K7mw)bFv0K6k z-pZ}z#SK-9r*3JI_vory8gu;Y^@@5_diW<hzyk!JLR4mRL!Y*d8qp8xBK|nBPHUvz(M_(hEI1Qq5VTr7l<~N z_rJ*uDDwSriv67B%dqB#>HbHk(4ke0fl=PEi-KKx@hXR`_hw=j!{SE|`c-=8T2Sgs zPfNp%kgOHBi*Nbz!0^_fmk&0tE?H|S=rU$qOZ|@ULzz`m*NxeBzZt(|v@>2OT^*J3 zJTxuwX~E;kvCIK3*_Za!r^OaL%RDw9u~kvz-LT>%x-jFfw(wHZ(Ju0x5zT8Z?Yt#c z1!ba7lAm`KiQEn`SM7Q5@WF$pdtXgyymzHX&O*zU)ygfs7>ph$1$Lx~%FzZmy|ivnWEwo)D&lm1a4qqhe-R$g#6j3HYoO zTuiXThj~eD5&&QzX^dqv=#5s1O~!WONq013`NGjkCR%rzLe zojt5{)C>U99?&0pSQEg;&W$InrZfvqM$I6NbZ}<~0`KrQr&;vQbO@YF>PZ7IwSrlZ zcczS1DAgSv4hoVegW2f?$bQF?rnGO#dM7r=h%=qefdKao+;^1f?)qY0QX| z4k!T5p#TnyY7qhv2_Xa(3LzBL5RisXh#*|Z7itMUiHcFO6GWVa0;;^q4*a%9t;c9BZ~!$x83|Lm_3cmsWgy4Wn1fG5$VU(nPmBtYFrGL}@YZNNX|Vz= zI#3aq!*2`1u`m*l4xkouC=~!WJwP@RxrM}NlO@4q(#zP6pjZyij$tJzC<3FgNQ@={ zD9l482qJ;S2|PY{N?>6q3>uy6O$4Q#`QNM^<-?M;EqV-P1@q5zcD2>iSTeQkt?gA$ zIg5$Ka+ZYz!`o7@Vlzm>87IJM8^U#%F^L5GN4sF(^izKz27!YpE5(VI+xZwQXYPK)0H-bUJ1shbI9Z0arkvPOex(+LvnRyV0cUNXI$=%782& z7)?L`Upxs9W^+G$dO({npX7@n1a_oHh!9AF!x)5U2~t34v_PZccfuB)&~wAaE@_14zhMR0HuA%PkR-8$SGK?kCVI?zaQ!PNY{HY@Lt9r)%B6C z_hR6^j6bUDPovB0?NyjGg8#4S;G#R=Qb9hrBzM)sMn^iY%Z%spnt7n*X^xp>WiXh1 z9A6j48oNK}^q>{WD32zlXJ1bb-Adg`&^28VIXuC?aq}sp`}~NWIj4np`z<)wqMqfw z$1U(s;}~@;In;L~vqCWG`>QFhM?b2}^$Q(Y0)2M1IJIuvo?+{s>`8hQ{o96C%yM8s sth+rmZul3`?$G|Brs(YTHr*j_(?a*|EZ!XU*N)&6QL4zQ5sCAE2i`c7%>V!Z literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Doll/torso_hover.png b/Resources/Textures/Interface/Targeting/Doll/torso_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..70f5e5969c0e4f785950a19a2f1c592bae45d605 GIT binary patch literal 5672 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 b(-6`!tD(BsYYi)bH_6-GSCl(5Y~{ZJA-QRJ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/groin.rsi/groin_0.png b/Resources/Textures/Interface/Targeting/Status/groin.rsi/groin_0.png new file mode 100644 index 0000000000000000000000000000000000000000..2e46e3a8cf1db046c2c06ac090df412c212feb73 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z$Oe?FXU)|rTBV%O-?XRoK2VCaB*-tA;Xe?_Tu=ja)Jcw;s&1sCywwi w`Sk1%bzsP2)e&e2X5=ssEMZp!%Ed4+)UYtPAAVBv4XBO5)78&qol`;+0ARK(JOBUy literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/groin.rsi/groin_2.png b/Resources/Textures/Interface/Targeting/Status/groin.rsi/groin_2.png new file mode 100644 index 0000000000000000000000000000000000000000..8a6e3add67f7a291a76514fd82b795cf10e81070 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z#04>|n9Q(u8AE9bL*Z9>51Ixyt1>IgIhGjbRRmar=VFVdQ&MBb@04ZiGk^lez literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/groin.rsi/groin_3.png b/Resources/Textures/Interface/Targeting/Status/groin.rsi/groin_3.png new file mode 100644 index 0000000000000000000000000000000000000000..6d7966fc14190edf38b2d63e198f3c2944052822 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z#5pjmC}h}M$586WFrj3}JD?P6NswPK!+#)Ixyt1>IgIhGjbRRmar=VFVdQ&MBb@07$_r{Qv*} literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/groin.rsi/groin_4.png b/Resources/Textures/Interface/Targeting/Status/groin.rsi/groin_4.png new file mode 100644 index 0000000000000000000000000000000000000000..cc36cf23ca46540663073a1f24171aa7d3b36643 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z#3?bXuwmHi#89fqkYf4b3{Z--B*-tA;Xe?_Tu=j%1Yy=`evXSj*=k1V21w?aP?G(5m3y;)5S5wqBl7~ zf^~6&&w)cnP8~aT>e!JEZ$@QdVPlSs4@?>-&XsK`&|+XzYkH@!Btc{XH^WvthKvKX S_h$h0GkCiCxvXFVdQ&MBb@0EKBN5&!@I literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/head.rsi/head_1.png b/Resources/Textures/Interface/Targeting/Status/head.rsi/head_1.png new file mode 100644 index 0000000000000000000000000000000000000000..0ba1a77dfd9a8755f1793921a8c583cd40f5767e GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SBC!#L2(R|S1>Hw%aC5m zU{Q1NJy43VB*-tA!Qt7BG$2RY)5S4FV`6fGf;0!$f=`lDMFLq{rc4c(${{H&C=}py k`Ou3;9{af68ILkB%>2r9ye>3(0#F-+r>mdKI;Vst0Ak1|qyPW_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/head.rsi/head_2.png b/Resources/Textures/Interface/Targeting/Status/head.rsi/head_2.png new file mode 100644 index 0000000000000000000000000000000000000000..1cb55b4fe97f7c31bd11c3a899fd4ef2feb8b6bf GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SBC!#aX}0#CNu0^#!#BV zQ215e11QB<666=m;PC858jz#y>EaloF)=woL7IbW!6(V7B7v+eQ>F$?<&cyX6bf*< keCWj^kA2+kj7J$5W`1QlUKg4?0jQ0^)78&qol`;+04^XV`Tzg` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/head.rsi/head_3.png b/Resources/Textures/Interface/Targeting/Status/head.rsi/head_3.png new file mode 100644 index 0000000000000000000000000000000000000000..d797b40a16129e062c7a105896b1d9a0784102be GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SBC!#aSjYC3K{m+F_ii- zOeop$4k*P~666=m;PC858jz#y>EaloF)=woL7IbW!6(V7B7v+eQ>F$?<&cyX6bf*< keCWj^kA2+kj7J$5W`1QlUKg4?0jQ0^)78&qol`;+087s&WdHyG literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/head.rsi/head_4.png b/Resources/Textures/Interface/Targeting/Status/head.rsi/head_4.png new file mode 100644 index 0000000000000000000000000000000000000000..fbc1678ce5dacc75e2bbeea26616cf509326c462 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SBC!#aY_s;Y#8=BF_daD zq*%T<1C(Mc3GxeOaCmkj4am{FVdQ&MBb@0Pj^MSO5S3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/head.rsi/head_5.png b/Resources/Textures/Interface/Targeting/Status/head.rsi/head_5.png new file mode 100644 index 0000000000000000000000000000000000000000..f6caf62d4058d5de67d165425d3c4759984dfec1 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SBC!#aV!ig*ctY+F_f|} z#J_VB1xhiN1o;IsI6S+N2IOdax;TbtOiWHtkmlf8@JVv2NFZy=l&JwzIV7b8g#w%| kAA0e~V;{FW<532NnO~WX*M%le0BU3KboFyt=akR{0DB!I`v3p{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/head.rsi/head_6.png b/Resources/Textures/Interface/Targeting/Status/head.rsi/head_6.png new file mode 100644 index 0000000000000000000000000000000000000000..74b58c642bbb81375ac68067edc66aaa7dad4983 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SBC!#dU|@n!NGBHaaLAV z*XF-v1xhiN1o;IsI6S+N2IOdax;TbtOiWHtkmlf8@JVv2NFZy=l&JwzIV7b8g#w%| kAA0e~V;{FW<532NnO~WX*M%le0BU3KboFyt=akR{01!?lxBvhE literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/head.rsi/head_7.png b/Resources/Textures/Interface/Targeting/Status/head.rsi/head_7.png new file mode 100644 index 0000000000000000000000000000000000000000..74b58c642bbb81375ac68067edc66aaa7dad4983 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SBC!#dU|@n!NGBHaaLAV z*XF-v1xhiN1o;IsI6S+N2IOdax;TbtOiWHtkmlf8@JVv2NFZy=l&JwzIV7b8g#w%| kAA0e~V;{FW<532NnO~WX*M%le0BU3KboFyt=akR{01!?lxBvhE literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/head.rsi/head_8.png b/Resources/Textures/Interface/Targeting/Status/head.rsi/head_8.png new file mode 100644 index 0000000000000000000000000000000000000000..4d024c61f7f2c0bc5fd3e850e0d7af7d2eb1c05f GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$DvSBC!#3m6#m^z?#*gHJFp z#Kpz^XJD|hvJ(B-yc4K~u_VYZn8D%MjWi&~(9^{+L}Oxdf`T-M=7LW%eR={|Lwx22 zPSsf6wt$PHot1k*mZ96_Ln?6|`?%d1k1{X>JZ4Fr_DE+JP&0$4tDnm{r-UW|Q%fr_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/head.rsi/meta.json b/Resources/Textures/Interface/Targeting/Status/head.rsi/meta.json new file mode 100644 index 00000000000..2c34f86c28e --- /dev/null +++ b/Resources/Textures/Interface/Targeting/Status/head.rsi/meta.json @@ -0,0 +1,38 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c7e14784b35b1a136351c396d3a546f461ee2451", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "head_0" + }, + { + "name": "head_1" + }, + { + "name": "head_2" + }, + { + "name": "head_3" + }, + { + "name": "head_4" + }, + { + "name": "head_5" + }, + { + "name": "head_6" + }, + { + "name": "head_7" + }, + { + "name": "head_8" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_0.png b/Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_0.png new file mode 100644 index 0000000000000000000000000000000000000000..22c7982489b70ff16db2cb15624b07f8a3de7ca9 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z$Oe?FXU+X#I@Ja!$XpWS7tHYgze~V1MIcwr)5S5wqBl7~f^`dXPm73wV9-Gq4_0AC m(ViZbvk59MdIAlc7#W;zGsrAoyrCPYgTd3)&t;ucLK6V3)h4|F literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_1.png b/Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_1.png new file mode 100644 index 0000000000000000000000000000000000000000..cd3b5d4c1c8dcde3933519ebbb0bc9dc4f9fbfc0 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z1jR8-UcvC|7`p{fkhvttFPP!~f0ux3ia@TKr;B5VMQ?I~1nU;&o)!@U!JvaK9<0KO mqCGtF)}#cW{_FFctbZ(2ZN`ppUXO@geCx^F(#J) literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_2.png b/Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_2.png new file mode 100644 index 0000000000000000000000000000000000000000..e4db19616792928b1dbebd853069562e1fe392fd GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#04>|n9LAUah@9}$XpWS7tHYgze~V1MIcwr)5S5wqBl7~f^`dXPm73wV9-Gq4_0AC m(ViZbvk59MdIAlc7#W;zGsrAoyrCPYgTd3)&t;ucLK6Up_9jLE literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_3.png b/Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_3.png new file mode 100644 index 0000000000000000000000000000000000000000..d6a204a18a9cdece9985776c6faa1d9cb6a98d73 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#5pjmC}hwQnAHvxWG)Hv3ugHL-zDIhB9N=*>Eak-(VLtg!McUHr$xj-FzBF*2dl86 mXipEz*#wmrJ%I*Jj111V8Dy3(-p~!y!QkoY=d#Wzp$Pz7|0TZw literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_4.png b/Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_4.png new file mode 100644 index 0000000000000000000000000000000000000000..2c9e81508b33ad3544c5d44f04a6c14ef249e34c GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#3?bXuwm#i?SBLmWG)Hv3ugHL-zDIhB9N=*>Eak-(VLtg!McUHr$xj-FzBF*2dl86 mXipEz*#wmrJ%I*Jj111V8Dy3(-p~!y!QkoY=d#Wzp$Pzlqb5TD literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_5.png b/Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_5.png new file mode 100644 index 0000000000000000000000000000000000000000..930a7b52ed1cb8bd36bb84e653a1c7d5cef2167a GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#IZ1}U}yNpwyO>($XpWS7tHYgze~V1MIcwr)5S5wqBl7~f^`dXPm73wV9-Gq4_0AC m(ViZbvk59MdIAlc7#W;zGsrAoyrCPYgTd3)&t;ucLK6UOk0ts5 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_6.png b/Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_6.png new file mode 100644 index 0000000000000000000000000000000000000000..efc7380c270a1ef691f11aa0e478b2304e32c53e GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z=;`SN2M4d76Jr4sWG)Hv3ugHL-zDIhB9N=*>Eak-(VLtg!McUHr$xj-FzBF*2dl86 mXipEz*#wmrJ%I*Jj111V8Dy3(-p~!y!QkoY=d#Wzp$PzVJ|+tQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_7.png b/Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_7.png new file mode 100644 index 0000000000000000000000000000000000000000..efc7380c270a1ef691f11aa0e478b2304e32c53e GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z=;`SN2M4d76Jr4sWG)Hv3ugHL-zDIhB9N=*>Eak-(VLtg!McUHr$xj-FzBF*2dl86 mXipEz*#wmrJ%I*Jj111V8Dy3(-p~!y!QkoY=d#Wzp$PzVJ|+tQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_8.png b/Resources/Textures/Interface/Targeting/Status/leftarm.rsi/leftarm_8.png new file mode 100644 index 0000000000000000000000000000000000000000..a00a6b1822e796f1cb38c52e4aa16f445ed3115c GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z=;`U5U|56jtvlr+T$J%I*Jj0`cw4C*55F3ycPa#zuyM m0S8WW__GR21l)}L!N?#c&Y<|GG;bqNIfJLGpUXO@geCy^pC?rS literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_1.png b/Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b8e10c8c48c228683e8de51710e707e4c86e4f41 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| zOkTkd6vwb^FT?wp{QW?2mXaX9V21zy|8LfH=m7GSJzX3_EP9g@Bv=waPKc#safyx;?UHx3vIVCg!04^>k`2YX_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_2.png b/Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..31feb63b7bcc2e66bdf2ae1d4f3453a2e4677947 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| zteDIY7sRl48N&qKEw_N;EG0pH!3_WZ|KF_Z&;jHtd%8G=So9_*NU$zW5V^o;U}$V) oC>U_yM2A1CutdPk$RCUhV&V*ne@gQ<0+lm(y85}Sb4q9e05}pT9smFU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_3.png b/Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_3.png new file mode 100644 index 0000000000000000000000000000000000000000..274855e4194b5d05834a62a87f33995572ee10cd GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| ztSDrNb70t8$G{{hYYY@;DGBlmX88aA|7Kl>4j^CI)5S5wqBl7~f^~6%$OT3NLt`UD n!GHrNI{aCMB?4|n{$OMf6K7ETQ<}FCsGPym)z4*}Q$iB}i2Nnu literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_4.png b/Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_4.png new file mode 100644 index 0000000000000000000000000000000000000000..b3e5dfefa166a79b05b1a4d0531a8aa8142235e7 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| ztgvB-Q)1Zb#GueH{Vq_Pr6kBNnBo8b|C@CkI)Hp-PZ!4!i{9h}3D(64A{Q7942_Kp n1p^M8=yQ nf&m9kbojFhO9b4E{K3c|CeEPvr!;RPP&tFAtDnm{r-UW|jmahn literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_6.png b/Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_6.png new file mode 100644 index 0000000000000000000000000000000000000000..9822dfba4cb714b81e32705f429ce563e2427f60 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z1P2G}>FLGA#U;G@V+#~#DGBlmX88aA|7Kl>4j^CI)5S5wqBl7~f^~6%$OT3NLt`UD n!GHrNI{aCMB?4|n{$OMf6K7ETQ<}FCsGPym)z4*}Q$iB}4k9O| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_7.png b/Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_7.png new file mode 100644 index 0000000000000000000000000000000000000000..9822dfba4cb714b81e32705f429ce563e2427f60 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z1P2G}>FLGA#U;G@V+#~#DGBlmX88aA|7Kl>4j^CI)5S5wqBl7~f^~6%$OT3NLt`UD n!GHrNI{aCMB?4|n{$OMf6K7ETQ<}FCsGPym)z4*}Q$iB}4k9O| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_8.png b/Resources/Textures/Interface/Targeting/Status/leftfoot.rsi/leftfoot_8.png new file mode 100644 index 0000000000000000000000000000000000000000..bdaec2557cb5c485bc4173a6f4e7dd0e7b033cc6 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|Bm#UwTp9i| zoM2!G4h~+x0Aw=g>FLGA#m!`3cA7#LJ0G6+v7zO@pllEKr}&t;ucLK6UZOCzuV literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_1.png b/Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e5a7aea1b40fa2e1227e2ae1d7312ed50f16ba20 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z1jR8-UcvC|7`p{fkhvttFPP!~f0ux3ia@TMr;B5VMQ?I~1nc4kfrOMK6$Ss5Ol)pU epB5)LFfgc0WDuTEd}}38C4;A{pUXO@geCxP*CUDm literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_2.png b/Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_2.png new file mode 100644 index 0000000000000000000000000000000000000000..43c72f0b2109137d0a8072d0e27d424ce07263fd GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#04>|n9LAUah@9}$XpWS7tHYgze~V1MIcws)5S5wqBl7~f^~6&Ktf8Aih}=2CN?*w ePm2>A7#LJ0G6+v7zO@pllEKr}&t;ucLK6U2BqKQh literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_3.png b/Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_3.png new file mode 100644 index 0000000000000000000000000000000000000000..3114a1995cdfbaca9693d435046fedbe1ede8c22 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#5pjmC}hwQnAHvxWG)Hv3ugHL-zDIhB9JTR>Eak-(VLtg!MeCXAR#45MZte16Pp{; er^N{l3=Aq08H6Vk-&zS&$>8bg=d#Wzp$PylWg@Zw literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_4.png b/Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_4.png new file mode 100644 index 0000000000000000000000000000000000000000..83c4daefabf1aa53bb56177cd30a59bc033f609c GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#3?bXuwm#i?SBLmWG)Hv3ugHL-zDIhB9JTR>Eak-(VLtg!MeCXAR#45MZte16Pp{; er^N{l3=Aq08H6Vk-&zS&$>8bg=d#Wzp$Py|=_57( literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_5.png b/Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_5.png new file mode 100644 index 0000000000000000000000000000000000000000..06946c97c745f7ea70046dcb325f547a42003e6c GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#IZ1}U}yNpwyO>($XpWS7tHYgze~V1MIcws)5S5wqBl7~f^~6&Ktf8Aih}=2CN?*w ePm2>A7#LJ0G6+v7zO@pllEKr}&t;ucLK6T!9U|=j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_6.png b/Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_6.png new file mode 100644 index 0000000000000000000000000000000000000000..7d2ed496616e2767b566168b4a5ab2d4156a6111 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z=;`SN2M4d76Jr4sWG)Hv3ugHL-zDIhB9JTR>Eak-(VLtg!MeCXAR#45MZte16Pp{; er^N{l3=Aq08H6Vk-&zS&$>8bg=d#Wzp$Py)L?ZqG literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_7.png b/Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_7.png new file mode 100644 index 0000000000000000000000000000000000000000..7d2ed496616e2767b566168b4a5ab2d4156a6111 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z=;`SN2M4d76Jr4sWG)Hv3ugHL-zDIhB9JTR>Eak-(VLtg!MeCXAR#45MZte16Pp{; er^N{l3=Aq08H6Vk-&zS&$>8bg=d#Wzp$Py)L?ZqG literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_8.png b/Resources/Textures/Interface/Targeting/Status/lefthand.rsi/lefthand_8.png new file mode 100644 index 0000000000000000000000000000000000000000..2b33680d43842bc7cab7aeaf2efd290ce5798e63 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z=;`U5U|*9n7%x-ROYJa$9 iaB3t-v2eAiFff>|Wzg-ZUwjp)l)=;0&t;ucLK6T;uq8?W literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_1.png b/Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ab0c3e410daebde3b664a5051ee922b41c502ec5 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| zOkTkd6vwb^FT?wp{QW?2mXaX9V21zy|8LfH=m7HNJzX3_EP9g@Bv=4j^CN)5S5wqBl7~f^~7i1ZFokH?==p jGdML8q*%DxR2Udc*D~n#)GxjYRLbD#>gTe~DWM4f-pV7_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_4.png b/Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_4.png new file mode 100644 index 0000000000000000000000000000000000000000..9dcd84fffdf08bb6afa4e24643e5754bb42ffe67 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| ztgvB-Q)1Zb#GueH{Vq_Pr6kBNnBo8b|C@CkI)Hq6PZ!4!i{9h}3D(646PVrH+|>SX j&EV8XkYeF#Q(<5*UCW@`Q@{8sP$`3_tDnm{r-UW|D`+I~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_5.png b/Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_5.png new file mode 100644 index 0000000000000000000000000000000000000000..4e302cda6492c72b10abe7adc4af9a0bd24bc0ef GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| ztYBw|V`13K#-OyhBN!;oQWE4B%<%vJ|INA%9YDUkr;B5VMQ?I~1nc623CwP8ZfbwH jW^igGNU?CWsW32@u4T~esb72*sFcCe)z4*}Q$iB};`<~1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_6.png b/Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_6.png new file mode 100644 index 0000000000000000000000000000000000000000..d36a43c441db820231e3346d15e4571c4bd66705 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z1P2G}>FLGA#U;G@V+#~#DGBlmX88aA|7Kl>4j^CN)5S5wqBl7~f^~7i1ZFokH?==p jGdML8q*%DxR2Udc*D~n#)GxjYRLbD#>gTe~DWM4fT;wI1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_7.png b/Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_7.png new file mode 100644 index 0000000000000000000000000000000000000000..d36a43c441db820231e3346d15e4571c4bd66705 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z1P2G}>FLGA#U;G@V+#~#DGBlmX88aA|7Kl>4j^CN)5S5wqBl7~f^~7i1ZFokH?==p jGdML8q*%DxR2Udc*D~n#)GxjYRLbD#>gTe~DWM4fT;wI1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_8.png b/Resources/Textures/Interface/Targeting/Status/leftleg.rsi/leftleg_8.png new file mode 100644 index 0000000000000000000000000000000000000000..75bd581d69b23e914f915868d69b5e8ad04b74ca GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|Bm#UwTp9i| zoM2!G4h~+x0Aw=g>FLGA#m!`3c|n9LAUah@9}$XpWS7tHYgze~V1MIcwx)5S5wqBl7~g7pe}Ps@{;948-#GfX+Y qnnB}y$93KwpO!fmTyBg43=FQU3^K=dELsfI#Ng@b=d#Wzp$PzZk128h literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/rightarm.rsi/rightarm_3.png b/Resources/Textures/Interface/Targeting/Status/rightarm.rsi/rightarm_3.png new file mode 100644 index 0000000000000000000000000000000000000000..cd974fdeea6f52a03ae3e4c44048df5ec4d83f5e GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#5pjmC}hwQnAHvxWG)Hv3ugHL-zDIhB9N=;>Eak-(VLtg!Fq+gr{&2^j+2kW8KxXx q&7g6<<2rATPsEak-(VLtg!Fq+gr{&2^j+2kW8KxXx q&7g6<<2rATPs($XpWS7tHYgze~V1MIcwx)5S5wqBl7~g7pe}Ps@{;948-#GfX+Y qnnB}y$93KwpO!fmTyBg43=FQU3^K=dELsfI#Ng@b=d#Wzp$Pz7L@6c! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/rightarm.rsi/rightarm_6.png b/Resources/Textures/Interface/Targeting/Status/rightarm.rsi/rightarm_6.png new file mode 100644 index 0000000000000000000000000000000000000000..35eec2905a589c16da56548c94ff65c360ea589a GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z=;`SN2M4d76Jr4sWG)Hv3ugHL-zDIhB9N=;>Eak-(VLtg!Fq+gr{&2^j+2kW8KxXx q&7g6<<2rATPsEak-(VLtg!Fq+gr{&2^j+2kW8KxXx q&7g6<<2rATPs6cY~Ol5@kv8w?Y8HU9GlomO3X?7*3Wr$79>7uj}P+N$$f|7kg~ zBpHTHGAV|-41s(Mk$>La)Q!4fpY`lOI|IY-8QgErE&crvXd8p4tDnm{r-UW|y3ja{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/rightfoot.rsi/rightfoot_1.png b/Resources/Textures/Interface/Targeting/Status/rightfoot.rsi/rightfoot_1.png new file mode 100644 index 0000000000000000000000000000000000000000..967639b3fd1ab59ac776dca393efce1f977b7148 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z1jR8-UcsbP0l+XkKDcC65 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/rightfoot.rsi/rightfoot_2.png b/Resources/Textures/Interface/Targeting/Status/rightfoot.rsi/rightfoot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..bff7d8016d0aa34190d2a21f08606564f3095d92 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z#04>|n9Q(u8N-$0A|9YPOG%JlFvI`<|2OM8bO8BEo-U3d7QM*{60D08L@tOJ7#SHF nKboALq_lv6XT@8cBnAdydj_d1|GqT?RWo?H`njxgN@xNA|FkGb literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/rightfoot.rsi/rightfoot_3.png b/Resources/Textures/Interface/Targeting/Status/rightfoot.rsi/rightfoot_3.png new file mode 100644 index 0000000000000000000000000000000000000000..d74824df983c9e2c4571bd2ebe4fd5b0da4ee7d7 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z#5pjmC}h}M$M8{N{wJU~OG%JlFvI`<|2OM8bO8BEo-U3d7QM*{60D08L@tOJ7#SHF nKboALq_lv6XT@8cBnAdydj_d1|GqT?RWo?H`njxgN@xNAAZ94R literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/rightfoot.rsi/rightfoot_4.png b/Resources/Textures/Interface/Targeting/Status/rightfoot.rsi/rightfoot_4.png new file mode 100644 index 0000000000000000000000000000000000000000..50f6abc2c3493932b95c919b9ec8e43fd3501e17 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z#3?bXuwmHi#IV8bt}#%Yr6kBNnBo8b|C@CkI)Hp7PZ!4!i{9h}3D(64A{RsqjEoG8 nA5BhAQd+>kv*N8z5(9&4j^C2)5S5wqBl7~f^~6%$ORDtBO^oO mN0ZZ&lol}Xtaz)F#K0hI&meW>-?wI4j^C2)5S5wqBl7~f^~6%$ORDtBO^oO mN0ZZ&lol}Xtaz)F#K0hI&meW>-?wIEU|7Jw5EmEspMk;P^3h_T0``(1zhH*{V6e1)*>9kbx~Gd{h(&L5f&}a0 z1d$6O8w`v#8a|qso|2T7lzK3mL0KU1cH|KT2H7tRI&;<^Z31dx@O1TaS?83{1OTZc BG5G)h literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/righthand.rsi/meta.json b/Resources/Textures/Interface/Targeting/Status/righthand.rsi/meta.json new file mode 100644 index 00000000000..61c5b77862c --- /dev/null +++ b/Resources/Textures/Interface/Targeting/Status/righthand.rsi/meta.json @@ -0,0 +1,38 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Edited by Mocho from the original tgstation sprites taken at commit https://github.com/tgstation/tgstation/commit/c7e14784b35b1a136351c396d3a546f461ee2451", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "righthand_0" + }, + { + "name": "righthand_1" + }, + { + "name": "righthand_2" + }, + { + "name": "righthand_3" + }, + { + "name": "righthand_4" + }, + { + "name": "righthand_5" + }, + { + "name": "righthand_6" + }, + { + "name": "righthand_7" + }, + { + "name": "righthand_8" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_0.png b/Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_0.png new file mode 100644 index 0000000000000000000000000000000000000000..a69056bb651613cf0373d6463343d5a1a77732ec GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z$Oe?FXU+X#I@Ja!$XpWS7tHYgze~V1MIcwf)5S5wqBl7~f^{*2uz``GP>_QIt0OB< g56ctxg9n%yRO=apt55Wa1JyEky85}Sb4q9e0E{OhtN;K2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_1.png b/Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e14168b2e7d274acd23f5bd8ac0ffcc7b3bdf673 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z1jR8-UcvC|7`p{fkhvttFPP!~f0ux3ia@S{r;B5VMQ?I~1nXi3VFM#Wp&$nbR!3Hz g9+oHW2M;hasMa$GSD)w;2dZW8boFyt=akR{0D@;Ch5!Hn literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_2.png b/Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b12b15e883b39f3f0b24ee9dfb8ea87d3c2a0deb GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#04>|n9LAUah@9}$XpWS7tHYgze~V1MIcwf)5S5wqBl7~f^{*2uz``GP>_QIt0OB< g56ctxg9n%yRO=apt55Wa1JyEky85}Sb4q9e0BRBEak-(VLtg!Md11*ucn8D9FKq)sdB_ ghvkX;!2`?;s`U)Q)hGJIfod5%UHx3vIVCg!06|3|t^fc4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_4.png b/Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_4.png new file mode 100644 index 0000000000000000000000000000000000000000..4afd3e7f53131f6cc8a2439b08eed334157435a3 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z#3?bXuwm#i?SBLmWG)Hv3ugHL-zDIhB9N=#>Eak-(VLtg!Md11*ucn8D9FKq)sdB_ ghvkX;!2`?;s`U)Q)hGJIfod5%UHx3vIVCg!0A($XpWS7tHYgze~V1MIcwf)5S5wqBl7~f^{*2uz``GP>_QIt0OB< g56ctxg9n%yRO=apt55Wa1JyEky85}Sb4q9e08n!w=>Px# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_6.png b/Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_6.png new file mode 100644 index 0000000000000000000000000000000000000000..87e8f18ef82614f9b10061639b22fd21f04193f2 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z=;`SN2M4d76Jr4sWG)Hv3ugHL-zDIhB9N=#>Eak-(VLtg!Md11*ucn8D9FKq)sdB_ ghvkX;!2`?;s`U)Q)hGJIfod5%UHx3vIVCg!09L#q`Tzg` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_7.png b/Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_7.png new file mode 100644 index 0000000000000000000000000000000000000000..87e8f18ef82614f9b10061639b22fd21f04193f2 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I0Jk_Tp9i| z=;`SN2M4d76Jr4sWG)Hv3ugHL-zDIhB9N=#>Eak-(VLtg!Md11*ucn8D9FKq)sdB_ ghvkX;!2`?;s`U)Q)hGJIfod5%UHx3vIVCg!09L#q`Tzg` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_8.png b/Resources/Textures/Interface/Targeting/Status/righthand.rsi/righthand_8.png new file mode 100644 index 0000000000000000000000000000000000000000..797e0683e8b2b453220a4df0e6ae10ba30836206 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z=;`S#U|I}ei(k> r$eA-8_gTc4xFjSvBMiCNQ z#W5tpJvl*wb+Mv>6cZYuY|A3y$;oiD;nV+^psWI2^X00Om&nhK^;u%Uux#4Q=IJuI z5nm@fWtiZ3f8O0iUCJlQ7(#Q{rHo!NWVJq7VF@&?#F>FX)0yqo?d7cbK>HXxUHx3v IIVCg!0E0I)jsO4v literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_1.png b/Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_1.png new file mode 100644 index 0000000000000000000000000000000000000000..786b0777c38cc7425ad85f8ca833f6798ccbce1c GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z1jR8-Ucs|n9Q(u8N-$0A|9YPOG%JlFvI`<|2OM8bO8DCo-U3d7QM*{60D08J}|kdsi`q> j&EV8ZkjY?m7H42E+rXg1_{^gasFcCe)z4*}Q$iB}Iz%Jo literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_3.png b/Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_3.png new file mode 100644 index 0000000000000000000000000000000000000000..2f9690690d72a2be8182a5b4fde5ffaac6c252e4 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z#5pjmC}h}M$M8{N{wJU~OG%JlFvI`<|2OM8bO8DCo-U3d7QM*{60D08J}|kdsi`q> j&EV8ZkjY?m7H42E+rXg1_{^gasFcCe)z4*}Q$iB}S$rg3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_4.png b/Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_4.png new file mode 100644 index 0000000000000000000000000000000000000000..ec62ccb0627d4b41348a43414fd1307746a28a83 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z#3?bXuwmHi#IV8bt}#%Yr6kBNnBo8b|C@CkI)Hq6PZ!4!i{9h}3D(64ADGgTe~DWM4f16?CK literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_5.png b/Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_5.png new file mode 100644 index 0000000000000000000000000000000000000000..d30e124e64d0a0410302091ffcc642193a22e52b GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z#IZ1}U}xCN#&CA`))JsNOG%JlFvI`<|2OM8bO8DCo-U3d7QM*{60D08J}|kdsi`q> j&EV8ZkjY?m7H42E+rXg1_{^gasFcCe)z4*}Q$iB}2sk5G literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_6.png b/Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_6.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4ee1f90383d727ece0ef7e402bfc181671a459 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z=;`SN2M5Q+#eH#KZweG=DGBlmX88aA|7Kl>4j^CN)5S5wqBl7~f^~7i2PQW)H8m!# j8Jt=PG8wGS;tULC8yIvLpLrAll`?p``njxgN@xNA8!sb{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_7.png b/Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_7.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4ee1f90383d727ece0ef7e402bfc181671a459 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|cmjMvTp9i| z=;`SN2M5Q+#eH#KZweG=DGBlmX88aA|7Kl>4j^CN)5S5wqBl7~f^~7i2PQW)H8m!# j8Jt=PG8wGS;tULC8yIvLpLrAll`?p``njxgN@xNA8!sb{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_8.png b/Resources/Textures/Interface/Targeting/Status/rightleg.rsi/rightleg_8.png new file mode 100644 index 0000000000000000000000000000000000000000..70ccb309add238bae2e54d34edc459ea25e12070 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|L<4+6Tp9i| z=;`SN2M3>EU|7Jw5EmEspMk;P^3h_T0``(1zhH*{V6e1)*>9kbj;D)bh(&L5f&}a0 zgbz$^YH4bFxFTjm%=|d}z?oAX2e{1sa5aQ&2uM46ft4Zf7=z2<%H0A$eGHzielF{r G5}E+?-ZjSn literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/torso.rsi/meta.json b/Resources/Textures/Interface/Targeting/Status/torso.rsi/meta.json new file mode 100644 index 00000000000..7baeebd0801 --- /dev/null +++ b/Resources/Textures/Interface/Targeting/Status/torso.rsi/meta.json @@ -0,0 +1,38 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Edited by Mocho from the original tgstation sprites taken at commit https://github.com/tgstation/tgstation/commit/c7e14784b35b1a136351c396d3a546f461ee2451", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "torso_0" + }, + { + "name": "torso_1" + }, + { + "name": "torso_2" + }, + { + "name": "torso_3" + }, + { + "name": "torso_4" + }, + { + "name": "torso_5" + }, + { + "name": "torso_6" + }, + { + "name": "torso_7" + }, + { + "name": "torso_8" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_0.png b/Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_0.png new file mode 100644 index 0000000000000000000000000000000000000000..b20ce001ba61861a3aa92b565589686fd607802f GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z$Oe?FXU)|rTBV%O-?XRoK2VCaB*-tA;Xe?_Tu=jFVdQ&MBb@0LMEl AQ~&?~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_1.png b/Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_1.png new file mode 100644 index 0000000000000000000000000000000000000000..591b6a5bab5ae843376516c4b6ec7ff84745a0f7 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z1jR8-Ucsa)Jb_2}6&M!hw!x zMqy(PgNI=Uco;=yICwBBhcNnu3xybPwb?Q-Sl2PM?z*#lK2Rrvr>mdKI;Vst0HK&G A<^TWy literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_2.png b/Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_2.png new file mode 100644 index 0000000000000000000000000000000000000000..71f09fc7f6b9bd060464f2194375919c69f0f400 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z#04>|n9Q(u8AE9bL*Z9>518F~p)bIYENegrUbr;Xp?; zqp&fD!NafvJd7eU96T76Lm2(Sg+dIt+H4sZtm_zBcimY&AE=YT)78&qol`;+0BA}p AJOBUy literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_3.png b/Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_3.png new file mode 100644 index 0000000000000000000000000000000000000000..fa9f954321ca062b2e99e196306e10b6c1ef3e71 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z#5pjmC}h}M$586WFrj3}JD?P6NswPK!+#)8F~p)bIYENegrUbr;Xp?; zqp&fD!NafvJd7eU96T76Lm2(Sg+dIt+H4sZtm_zBcimY&AE=YT)78&qol`;+0Ep%* ArvLx| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_4.png b/Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_4.png new file mode 100644 index 0000000000000000000000000000000000000000..ada865a05feb185577dd430bd00969d23bfcd6aa GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z#3?bXuwmHi#89fqkYf4b3{Z--B*-tA;Xe?_Tu=jFVdQ&MBb@03{$Q Ang9R* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_5.png b/Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_5.png new file mode 100644 index 0000000000000000000000000000000000000000..8f3a6ad7d0e9c1c43f6ed6e0beb727b9aebedead GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z#IZ1}U}xCN#!$+_5dY3i6ez`7666=m@E-_dE~tS_((`n246*1pF(kU3Zqx2kK<-boFyt=akR{0H;nV AJpcdz literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_6.png b/Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_6.png new file mode 100644 index 0000000000000000000000000000000000000000..c289a454bdb5a9074999e863762f2703f3d301bc GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z=;`SN2M5Q+#aUTdU7P=w6)448666=m@E-_dE~tS_((`n246*1pF(kU3Zqx2kK<-boFyt=akR{07$AT A`Tzg` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_7.png b/Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_7.png new file mode 100644 index 0000000000000000000000000000000000000000..c289a454bdb5a9074999e863762f2703f3d301bc GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|_yc@GTp9i| z=;`SN2M5Q+#aUTdU7P=w6)448666=m@E-_dE~tS_((`n246*1pF(kU3Zqx2kK<-boFyt=akR{07$AT A`Tzg` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_8.png b/Resources/Textures/Interface/Targeting/Status/torso.rsi/torso_8.png new file mode 100644 index 0000000000000000000000000000000000000000..eefec17cf6057f69452a6cb4da15774d87e6ad7d GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|Bm#UwTp9i| zEMQ;=4h}xSz@Vq6_n(0wE-uc>%1Yy=`evXSj*=k1V21w?aP?G(5m3y=)5S5wqBl7~ zg4Kkf$H(W4kB`m{QG<<}Hg4Qx_%MuN5}VQ;t{DflW}MvKG?6ohH7|UV!`cIndjk#5 aFfwR`GrXC!cS0-B90pHUKbLh*2~7YCBs|Li literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel.png b/Resources/Textures/Objects/Specific/Medical/Surgery/bone_gel.rsi/bone-gel.png new file mode 100644 index 0000000000000000000000000000000000000000..f66bf6cdf9eb1aea9b77e8819b3f0cd71609ab3b GIT binary patch literal 432 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/limbgrower.rsi/limbgrower_openpanel.png b/Resources/Textures/Structures/Machines/limbgrower.rsi/limbgrower_openpanel.png new file mode 100644 index 0000000000000000000000000000000000000000..cc174c7d8b9612da38c3952579702f93c9c01961 GIT binary patch literal 3981 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/limbgrower.rsi/limbgrower_unfill.png b/Resources/Textures/Structures/Machines/limbgrower.rsi/limbgrower_unfill.png new file mode 100644 index 0000000000000000000000000000000000000000..6aa57f247e2a662abf1fa970c6cc3a0d8688aff1 GIT binary patch literal 9104 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 HE(!k!t;RL{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/limbgrower.rsi/meta.json b/Resources/Textures/Structures/Machines/limbgrower.rsi/meta.json new file mode 100644 index 00000000000..f940fe8c6c0 --- /dev/null +++ b/Resources/Textures/Structures/Machines/limbgrower.rsi/meta.json @@ -0,0 +1,85 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from /tg/station at commit 85c26c1, all icons under CC-BY-SA-3.0, unless otherwise indicated.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "limbgrower_fill", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "limbgrower_unfill", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "limbgrower_openpanel", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "limbgrower_idleoff", + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "limbgrower_idleon", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "limbgrower_panelopen" + } + ] +} diff --git a/Resources/keybinds.yml b/Resources/keybinds.yml index 153d7c35b61..f6bde4eb498 100644 --- a/Resources/keybinds.yml +++ b/Resources/keybinds.yml @@ -70,21 +70,27 @@ binds: - function: CameraRotateLeft type: State key: NumpadNum7 + mod1: Control - function: CameraRotateRight type: State key: NumpadNum9 + mod1: Control - function: CameraReset type: State key: NumpadNum8 + mod1: Control - function: ZoomOut type: State key: NumpadNum4 + mod1: Control - function: ZoomIn type: State key: NumpadNum6 + mod1: Control - function: ResetZoom type: State key: NumpadNum5 + mod1: Control # Misc - function: ShowEscapeMenu type: State @@ -584,6 +590,25 @@ binds: type: State key: MouseRight canFocus: true +# _CorvaxNext: surgery Targeting +- function: TargetHead + type: State + key: NumpadNum8 +- function: TargetTorso + type: State + key: NumpadNum5 +- function: TargetLeftArm + type: State + key: NumpadNum6 +- function: TargetRightArm + type: State + key: NumpadNum4 +- function: TargetLeftLeg + type: State + key: NumpadNum3 +- function: TargetRightLeg + type: State + key: NumpadNum1 - function: OfferItem # Corvax-Next-Offer type: State key: F