diff --git a/_maps/shuttles/skyrat/pirate_nri_raider.dmm b/_maps/shuttles/skyrat/pirate_nri_raider.dmm
index 876c9b188c6..65d31ccb6b5 100644
--- a/_maps/shuttles/skyrat/pirate_nri_raider.dmm
+++ b/_maps/shuttles/skyrat/pirate_nri_raider.dmm
@@ -233,8 +233,8 @@
"iq" = (
/obj/structure/table/reinforced,
/obj/machinery/fax{
- fax_name = "NRI Ship";
- name = "NRI ship fax machine"
+ fax_name = "PSC Ship";
+ name = "PSC ship fax machine"
},
/obj/item/paper/fluff/nri_police,
/turf/open/floor/pod,
diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm
index 0882720cdfb..b09d37fe80d 100644
--- a/code/controllers/subsystem/weather.dm
+++ b/code/controllers/subsystem/weather.dm
@@ -119,7 +119,7 @@ SUBSYSTEM_DEF(weather)
var/datum/weather/A
for(var/V in processing)
var/datum/weather/W = V
- if((z in W.impacted_z_levels) && W.area_type == active_area.type)
+ if((z in W.impacted_z_levels) && istype(active_area, W.area_type)) // BUBBER EDIT: This proc was broken, fixed to now use istype.
A = W
break
return A
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 2568171e322..18c5b58edd2 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -271,7 +271,7 @@
var/immediately_stun = should_stun && !(flags & SHOCK_DELAY_STUN)
if (immediately_stun)
if (paralyze)
- StaminaKnockdown(stun_duration / 4) // SKYRAT EDIT CHANGE - ORIGINAL: Paralyze(40)
+ Paralyze(stun_duration)
else
Knockdown(stun_duration)
//Jitter and other fluff.
@@ -285,7 +285,7 @@
///Called slightly after electrocute act to apply a secondary stun.
/mob/living/carbon/proc/secondary_shock(paralyze, stun_duration)
if (paralyze)
- StaminaKnockdown(stun_duration / 6) // SKYRAT EDIT CHANGE - ORIGINAL: Paralyze(60)
+ Paralyze(stun_duration)
else
Knockdown(stun_duration)
diff --git a/code/modules/research/designs/autolathe/service_designs.dm b/code/modules/research/designs/autolathe/service_designs.dm
index 2f60366a7e5..28207d660ad 100644
--- a/code/modules/research/designs/autolathe/service_designs.dm
+++ b/code/modules/research/designs/autolathe/service_designs.dm
@@ -641,3 +641,16 @@
RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_SERVICE,
)
departmental_flags = DEPARTMENT_BITFLAG_SERVICE
+
+// BUBBER EDIT: Adds Umbrellas
+/datum/design/umbrella
+ name = "Collapsable Umbrella"
+ id = "collapsable_umbrella"
+ build_type = PROTOLATHE | AUTOLATHE
+ materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.75, /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 0.25)
+ build_path = /obj/item/umbrella/collapsible
+ category = list(
+ RND_CATEGORY_INITIAL,
+ RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_SERVICE,
+ )
+ departmental_flags = DEPARTMENT_BITFLAG_SERVICE
diff --git a/code/modules/research/techweb/nodes/service_nodes.dm b/code/modules/research/techweb/nodes/service_nodes.dm
index bb28a26a00c..e261c40c7f7 100644
--- a/code/modules/research/techweb/nodes/service_nodes.dm
+++ b/code/modules/research/techweb/nodes/service_nodes.dm
@@ -37,6 +37,7 @@
"ticket_machine",
"radio_entertainment",
"photocopier",
+ "collapsable_umbrella",
)
/datum/techweb_node/sanitation
diff --git a/html/changelogs/AutoChangeLog-bubber-pr-4682.yml b/html/changelogs/AutoChangeLog-bubber-pr-4682.yml
new file mode 100644
index 00000000000..7977daa19dc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-bubber-pr-4682.yml
@@ -0,0 +1,4 @@
+author: "Alecksohs"
+delete-after: True
+changes:
+ - rscadd: "Added umbrellas for Rimpoint at Autolathes and Service Protolathes which block rain reagants."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-bubber-pr-4683.yml b/html/changelogs/AutoChangeLog-bubber-pr-4683.yml
new file mode 100644
index 00000000000..7030e63e579
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-bubber-pr-4683.yml
@@ -0,0 +1,4 @@
+author: "ArrisFairburne"
+delete-after: True
+changes:
+ - rscadd: "The sex holobarrier is now loadout-available"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-bubber-pr-4686.yml b/html/changelogs/AutoChangeLog-bubber-pr-4686.yml
new file mode 100644
index 00000000000..9b8967a8f4b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-bubber-pr-4686.yml
@@ -0,0 +1,4 @@
+author: "theselfish"
+delete-after: True
+changes:
+ - rscadd: "Finally, cats can have four sets of ears with a brand new hoodie. (Also comes in earless variety)"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-bubber-pr-4687.yml b/html/changelogs/AutoChangeLog-bubber-pr-4687.yml
new file mode 100644
index 00000000000..c4c5fd4b9af
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-bubber-pr-4687.yml
@@ -0,0 +1,5 @@
+author: "Redrover1760"
+delete-after: True
+changes:
+ - balance: "Shocked airlocks and grilles now stun you instead of just a knockdown and mild stamina damage."
+ - bugfix: "Fixed repeatedly shocking yourself to crit on airlocks and grilles due to not being stunned by airlocks/grilles. Should be less directly deadly now if you don't react to stop yourself."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-bubber-pr-4688.yml b/html/changelogs/AutoChangeLog-bubber-pr-4688.yml
new file mode 100644
index 00000000000..cfe8d8122ed
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-bubber-pr-4688.yml
@@ -0,0 +1,4 @@
+author: "BasilTamaya"
+delete-after: True
+changes:
+ - qol: "Racks now have a precise placement (left click) vs center placement (right click) mechanic, making shelfs and racks fancier."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-bubber-pr-4693.yml b/html/changelogs/AutoChangeLog-bubber-pr-4693.yml
new file mode 100644
index 00000000000..7c465989254
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-bubber-pr-4693.yml
@@ -0,0 +1,5 @@
+author: "ElisavetPinko"
+delete-after: True
+changes:
+ - bugfix: "Fixed couple names related to the PSC."
+ - rscadd: "Teshari can now interact with the \"Police\" pirates by joining."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-bubber-pr-4696.yml b/html/changelogs/AutoChangeLog-bubber-pr-4696.yml
new file mode 100644
index 00000000000..aaf72559332
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-bubber-pr-4696.yml
@@ -0,0 +1,4 @@
+author: "theselfish"
+delete-after: True
+changes:
+ - bugfix: "Entertainer related Pets no longer speak what they see. Or something. I dunno. $4 a pound."
\ No newline at end of file
diff --git a/icons/map_icons/clothing/head/_head.dmi b/icons/map_icons/clothing/head/_head.dmi
index 30b4441aaf4..0eee032e563 100644
Binary files a/icons/map_icons/clothing/head/_head.dmi and b/icons/map_icons/clothing/head/_head.dmi differ
diff --git a/icons/map_icons/clothing/suit/_suit.dmi b/icons/map_icons/clothing/suit/_suit.dmi
index 46e4b48707c..e7f572b1cf2 100644
Binary files a/icons/map_icons/clothing/suit/_suit.dmi and b/icons/map_icons/clothing/suit/_suit.dmi differ
diff --git a/modular_skyrat/master_files/code/modules/mob/living/simple_animal/friendly/pets.dm b/modular_skyrat/master_files/code/modules/mob/living/simple_animal/friendly/pets.dm
index 217cd623b8f..f2718d2ed2c 100644
--- a/modular_skyrat/master_files/code/modules/mob/living/simple_animal/friendly/pets.dm
+++ b/modular_skyrat/master_files/code/modules/mob/living/simple_animal/friendly/pets.dm
@@ -48,8 +48,9 @@
"honk!",
"mrow!",
"henk!",
- emote_see = list("plays tricks.", "slips.", "honks a tiny horn.")
)
+ emote_see = list("plays tricks.", "slips.", "honks a tiny horn.")
+
/mob/living/basic/pet/cat/mime
name = "mime cat"
@@ -81,8 +82,9 @@
speak = list(
"...",
"....",
- emote_see = list("cowers in fear.", "surrenders.", "plays dead.","looks as though there is a tiny cat shaped wall in front of them.")
)
+ emote_see = list("cowers in fear.", "surrenders.", "plays dead.","looks as though there is a tiny cat shaped wall in front of them.")
+
/mob/living/basic/pet/cat/tiger
name = "tiger cat"
diff --git a/modular_skyrat/modules/GAGS/greyscale_configs.dm b/modular_skyrat/modules/GAGS/greyscale_configs.dm
index c2ba1a6d0df..6d4c55bac5b 100644
--- a/modular_skyrat/modules/GAGS/greyscale_configs.dm
+++ b/modular_skyrat/modules/GAGS/greyscale_configs.dm
@@ -670,6 +670,43 @@
name = "Branded Hoodie Worn"
json_config = 'modular_skyrat/modules/GAGS/json_configs/hoodie/hoodie_branded_worn.json'
+
+//Doppler Hoodies.
+/datum/greyscale_config/big_hoodie
+ name = "Big Hoodie"
+ icon_file = 'modular_skyrat/modules/GAGS/icons/suit/dopplerhoodieobj.dmi'
+ json_config = 'modular_skyrat/modules/GAGS/json_configs/suits/hoodies/big_hoodie.json'
+
+/datum/greyscale_config/big_hoodie/worn
+ name = "Big Hoodie (Worn)"
+ icon_file = 'modular_skyrat/modules/GAGS/icons/suit/dopplerhoodie.dmi'
+
+/datum/greyscale_config/big_hoodie_hood
+ name = "Big Hoodie Hood"
+ icon_file = 'modular_skyrat/modules/GAGS/icons/suit/dopplerhoodie.dmi'
+ json_config = 'modular_skyrat/modules/GAGS/json_configs/suits/hoodies/big_hoodie_hood.json'
+
+/datum/greyscale_config/big_hoodie_hood/worn
+ name = "Big Hoodie Hood (Worn)"
+
+/datum/greyscale_config/twee_hoodie
+ name = "Twee Hoodie"
+ icon_file = 'modular_skyrat/modules/GAGS/icons/suit/dopplerhoodieobj.dmi'
+ json_config = 'modular_skyrat/modules/GAGS/json_configs/suits/hoodies/twee_hoodie.json'
+
+/datum/greyscale_config/twee_hoodie/worn
+ name = "Twee Hoodie (Worn)"
+ icon_file = 'modular_skyrat/modules/GAGS/icons/suit/dopplerhoodie.dmi'
+
+/datum/greyscale_config/twee_hoodie_hood
+ name = "Twee Hoodie Hood"
+ icon_file = 'modular_skyrat/modules/GAGS/icons/suit/dopplerhoodie.dmi'
+ json_config = 'modular_skyrat/modules/GAGS/json_configs/suits/hoodies/twee_hoodie_hood.json'
+
+/datum/greyscale_config/twee_hoodie_hood/worn
+ name = "Twee Hoodie Hood (Worn)"
+
+
// CARDIGAN
/datum/greyscale_config/cardigan
diff --git a/modular_skyrat/modules/GAGS/icons/suit/dopplerhoodie.dmi b/modular_skyrat/modules/GAGS/icons/suit/dopplerhoodie.dmi
new file mode 100644
index 00000000000..094d464b5e9
Binary files /dev/null and b/modular_skyrat/modules/GAGS/icons/suit/dopplerhoodie.dmi differ
diff --git a/modular_skyrat/modules/GAGS/icons/suit/dopplerhoodieobj.dmi b/modular_skyrat/modules/GAGS/icons/suit/dopplerhoodieobj.dmi
new file mode 100644
index 00000000000..9b5fc7cdaf4
Binary files /dev/null and b/modular_skyrat/modules/GAGS/icons/suit/dopplerhoodieobj.dmi differ
diff --git a/modular_skyrat/modules/GAGS/json_configs/suits/hoodies/big_hoodie.json b/modular_skyrat/modules/GAGS/json_configs/suits/hoodies/big_hoodie.json
new file mode 100644
index 00000000000..d1cb5e34b2f
--- /dev/null
+++ b/modular_skyrat/modules/GAGS/json_configs/suits/hoodies/big_hoodie.json
@@ -0,0 +1,18 @@
+{
+ "big_hoodie": [
+ {
+ "type": "icon_state",
+ "icon_state": "big_hoodie",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ }
+ ],
+ "big_hoodie_t": [
+ {
+ "type": "icon_state",
+ "icon_state": "big_hoodie_t",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ }
+ ]
+}
diff --git a/modular_skyrat/modules/GAGS/json_configs/suits/hoodies/big_hoodie_hood.json b/modular_skyrat/modules/GAGS/json_configs/suits/hoodies/big_hoodie_hood.json
new file mode 100644
index 00000000000..ce07c0c6e5f
--- /dev/null
+++ b/modular_skyrat/modules/GAGS/json_configs/suits/hoodies/big_hoodie_hood.json
@@ -0,0 +1,10 @@
+{
+ "big_hoodie_hood": [
+ {
+ "type": "icon_state",
+ "icon_state": "big_hoodie_hood",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ }
+ ]
+}
diff --git a/modular_skyrat/modules/GAGS/json_configs/suits/hoodies/twee_hoodie.json b/modular_skyrat/modules/GAGS/json_configs/suits/hoodies/twee_hoodie.json
new file mode 100644
index 00000000000..0d79de14df7
--- /dev/null
+++ b/modular_skyrat/modules/GAGS/json_configs/suits/hoodies/twee_hoodie.json
@@ -0,0 +1,18 @@
+{
+ "twee_hoodie": [
+ {
+ "type": "icon_state",
+ "icon_state": "twee_hoodie",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ }
+ ],
+ "twee_hoodie_t": [
+ {
+ "type": "icon_state",
+ "icon_state": "twee_hoodie_t",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ }
+ ]
+}
diff --git a/modular_skyrat/modules/GAGS/json_configs/suits/hoodies/twee_hoodie_hood.json b/modular_skyrat/modules/GAGS/json_configs/suits/hoodies/twee_hoodie_hood.json
new file mode 100644
index 00000000000..308f3dcefb5
--- /dev/null
+++ b/modular_skyrat/modules/GAGS/json_configs/suits/hoodies/twee_hoodie_hood.json
@@ -0,0 +1,10 @@
+{
+ "twee_hoodie_hood": [
+ {
+ "type": "icon_state",
+ "icon_state": "twee_hoodie_hood",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ }
+ ]
+}
diff --git a/modular_skyrat/modules/aesthetics/rack/code/rack.dm b/modular_skyrat/modules/aesthetics/rack/code/rack.dm
index 082e01bb40c..dbdfe6c4e9d 100644
--- a/modular_skyrat/modules/aesthetics/rack/code/rack.dm
+++ b/modular_skyrat/modules/aesthetics/rack/code/rack.dm
@@ -7,6 +7,44 @@
icon = 'modular_skyrat/modules/aesthetics/rack/icons/rack.dmi'
icon_state = "shelf"
+/obj/structure/rack/Initialize(mapload)
+ . = ..()
+
+/obj/structure/rack/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+ if(isnull(held_item))
+ return .
+
+ // Add tooltips if the item is not a wrench (wrenches handled by parent)
+ if(held_item.tool_behaviour != TOOL_WRENCH)
+ context[SCREENTIP_CONTEXT_LMB] = "Precise placement"
+ context[SCREENTIP_CONTEXT_RMB] = "Center item"
+ . |= CONTEXTUAL_SCREENTIP_SET
+
+ return .
+
+/obj/structure/rack/base_item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+ // Wrench deconstruction
+ if(tool.tool_behaviour == TOOL_WRENCH)
+ return ..()
+
+ // Right click to center item placement
+ if(LAZYACCESS(modifiers, RIGHT_CLICK))
+ if(user.transfer_item_to_turf(tool, get_turf(src), silent = FALSE))
+ return ITEM_INTERACT_SUCCESS
+ return ITEM_INTERACT_BLOCKING
+
+ // Left click for precise placement
+ if(LAZYACCESS(modifiers, ICON_X) && LAZYACCESS(modifiers, ICON_Y))
+ var/x_offset = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(ICON_SIZE_X * 0.5), ICON_SIZE_X * 0.5)
+ var/y_offset = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(ICON_SIZE_Y * 0.5), ICON_SIZE_Y * 0.5)
+ if(user.transfer_item_to_turf(tool, get_turf(src), x_offset, y_offset, silent = FALSE))
+ return ITEM_INTERACT_SUCCESS
+ return ITEM_INTERACT_BLOCKING
+
+ // Default rack behavior otherwise
+ return ..()
+
/obj/item/gun
var/on_rack = FALSE
diff --git a/modular_skyrat/modules/encounters/code/nri_raiders.dm b/modular_skyrat/modules/encounters/code/nri_raiders.dm
index bdecce7bb37..70a18de378c 100644
--- a/modular_skyrat/modules/encounters/code/nri_raiders.dm
+++ b/modular_skyrat/modules/encounters/code/nri_raiders.dm
@@ -48,7 +48,7 @@ GLOBAL_VAR(first_officer)
threat_content = "Greetings %STATION, this is the %SHIPNAME dispatch outpost. \
Due to recent Imperial regulatory violations, such as %RESULT and many other smaller issues, your station has been fined %PAYOFF credits. \
Inadequate imperial police activity is currently present in your sector, thus the failure to comply might instead result in a police patrol dispatch \
- for second attempt negotiations, sector police presence reinforcement and close-up inspections. Novaya Rossiyskaya Imperiya collegial secretary out."
+ for second attempt negotiations, sector police presence reinforcement and close-up inspections. Pan Slavic Commonwealth's collegial secretary out."
arrival_announcement = "Regulation-identified vessel approaching. Vessel ID tag is %NUMBER1-%NUMBER2-%NUMBER3. \
Vessel Model: Potato Beetle, Flight ETA: three minutes minimal. Vessel is authorised by the international regulations to perform its duties. \
We're clear for close orbit. Friendly reminder not to measure the distance between the vessel and the destination location, nor install any tracking devices anywhere on board of the vessel or in its close vicinity, \
@@ -187,9 +187,9 @@ GLOBAL_VAR(first_officer)
faction = list(FACTION_RAIDER)
you_are_text = "You are a Pan-Slavic Commonwealth task force."
flavour_text = "The station has refused to pay the fine for breaking Imperial regulations, you are here to recover the debt. Do so by demanding the funds. Force approach is usually recommended, but isn't the only method."
- important_text = "Allowed races are humans, Akulas, IPCs. Follow your field officer's orders. Important mention - while you are listed as the pirates gamewise, you really aren't lore-and-everything-else-wise. Roleplay accordingly."
+ important_text = "Allowed races are Humans, Akula, Teshari and Synths. Follow your field officer's orders. Important mention - while you are listed as the pirates gamewise, you really aren't lore-and-everything-else-wise. Roleplay accordingly."
outfit = /datum/outfit/pirate/nri
- restricted_species = list(/datum/species/human, /datum/species/akula, /datum/species/synthetic)
+ restricted_species = list(/datum/species/human, /datum/species/akula, /datum/species/synthetic, /datum/species/teshari)
random_appearance = FALSE
show_flavor = TRUE
@@ -221,7 +221,7 @@ GLOBAL_VAR(first_officer)
mob_name = "Pan-Slavic Commonwealth police patrol's field officer"
outfit = /datum/outfit/pirate/nri/officer
flavour_text = "The station has refused to pay the fine for breaking Imperial regulations, as a consequence you are here to perform a prolonged inspection."
- important_text = "Allowed races are humans, Akulas, IPCs. Roleplay accordingly. There is an important document in your pocket I'd advise you to read and keep safe."
+ important_text = "Allowed races are Humans, Akula, Teshari and Synths. Roleplay accordingly. There is an important document in your pocket I'd advise you to read and keep safe."
/obj/effect/mob_spawn/ghost_role/human/nri_raider/officer/apply_codename(mob/living/carbon/human/spawned_human)
var/callsign = pick(GLOB.callsigns_nri)
diff --git a/modular_skyrat/modules/novaya_ert/code/ert.dm b/modular_skyrat/modules/novaya_ert/code/ert.dm
index 20849825bb8..be2b0b8441a 100644
--- a/modular_skyrat/modules/novaya_ert/code/ert.dm
+++ b/modular_skyrat/modules/novaya_ert/code/ert.dm
@@ -46,7 +46,7 @@
missiondesc += "
3. Stabilise the situation."
missiondesc += "
4. Contact whoever called you and assist in resolving the matter."
missiondesc += "
5. Protect, ensure, and uphold the rights of Pan-Slavic Commonwealth's, Kingdom of Agurkrral's and Free Teshari League's citizens on board [station_name()]. TerraGov citizens' wellbeing is up to your discretion."
- missiondesc += "
6. Attempt to subvert the station's crew in order to shift the station's territory under control of Novaya Rossiyskaya Imperiya."
+ missiondesc += "
6. Attempt to subvert the station's crew in order to shift the station's territory under control of Pan-Slavic Commonwealth."
missiondesc += span_warning("
Your Mission: [ert_team.mission.explanation_text]")
to_chat(owner,missiondesc)
diff --git a/modular_skyrat/modules/novaya_ert/code/outfit.dm b/modular_skyrat/modules/novaya_ert/code/outfit.dm
index 707c417474f..c8765ff9eef 100644
--- a/modular_skyrat/modules/novaya_ert/code/outfit.dm
+++ b/modular_skyrat/modules/novaya_ert/code/outfit.dm
@@ -30,7 +30,7 @@
id_trim = /datum/id_trim/nri
/datum/outfit/centcom/ert/nri/commander
- name = "Novaya Rossiyskaya Imperiya Platoon Commander"
+ name = "Pan-Slavic Commonwealth Platoon Commander"
head = null
glasses = /obj/item/clothing/glasses/thermal/eyepatch
uniform = /obj/item/clothing/under/costume/nri/captain
diff --git a/modular_zubbers/code/modules/clothing/suits/jacket.dm b/modular_zubbers/code/modules/clothing/suits/jacket.dm
index ad541fea7dd..b9677b3d6cc 100644
--- a/modular_zubbers/code/modules/clothing/suits/jacket.dm
+++ b/modular_zubbers/code/modules/clothing/suits/jacket.dm
@@ -531,6 +531,7 @@
dog_fashion = null
armor_type = /datum/armor/armor_hos
strip_delay = 80
+
//SERVICE
/obj/item/clothing/suit/armor/hop_tailcoat
@@ -743,3 +744,99 @@
worn_icon = 'modular_zubbers/icons/mob/clothing/suits/jacket.dmi'
icon_state = "galfed"
body_parts_covered = CHEST|ARMS|GROIN
+
+//Doppler Hoodies, sprites seemingly by kittysmooch of who woulda guessed, Doppler.
+
+/obj/item/clothing/suit/hooded/big_hoodie
+ name = "oversized hoodie"
+ desc = "Cotton fibres grown in vertical aeroponic farming systems were ringspun and knit into a continuous loop fleece with \
+ a soft pile and little stretch. This fabric was cut oversized with soft sloping shoulders and cuffs that fall right at the first knuckle."
+ icon = 'icons/map_icons/clothing/suit/_suit.dmi'
+ icon_state = "/obj/item/clothing/suit/hooded/big_hoodie"
+ post_init_icon_state = "big_hoodie"
+ greyscale_config = /datum/greyscale_config/big_hoodie
+ greyscale_config_worn = /datum/greyscale_config/big_hoodie/worn
+ greyscale_colors = "#5d6161"
+ hoodtype = /obj/item/clothing/head/hooded/big_hoodie_hood
+ flags_1 = IS_PLAYER_COLORABLE_1
+ body_parts_covered = CHEST|GROIN|ARMS
+ cold_protection = CHEST|GROIN|ARMS
+ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
+
+/obj/item/clothing/head/hooded/big_hoodie_hood
+ name = "oversized hood"
+ desc = "Cotton fibres grown in vertical aeroponic farming systems were ringspun and knit into a continuous loop fleece with \
+ a soft pile and little stretch. The hood was cut comfortably oversized."
+ icon = 'icons/map_icons/clothing/head/_head.dmi'
+ icon_state = "/obj/item/clothing/head/hooded/big_hoodie_hood"
+ post_init_icon_state = "big_hoodie_hood"
+ body_parts_covered = HEAD
+ cold_protection = HEAD
+ flags_inv = HIDEEARS|HIDEHAIR
+ flags_1 = IS_PLAYER_COLORABLE_1
+ hair_mask = /datum/hair_mask/winterhood
+ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
+ greyscale_config = /datum/greyscale_config/big_hoodie_hood
+ greyscale_config_worn = /datum/greyscale_config/big_hoodie_hood/worn
+ greyscale_colors = "#5d6161"
+
+/obj/item/clothing/suit/hooded/big_hoodie/set_greyscale(list/colors, new_config, new_worn_config, new_inhand_left, new_inhand_right)
+ . = ..()
+ if(!hood)
+ return
+ var/list/hoodie_colors = SSgreyscale.ParseColorString(greyscale_colors)
+ var/list/new_hoodie_colors = hoodie_colors.Copy(1)
+ hood.set_greyscale(new_hoodie_colors)
+ hood.update_slot_icon()
+
+/obj/item/clothing/suit/hooded/big_hoodie/on_hood_created(obj/item/clothing/head/hooded/hood)
+ . = ..()
+ var/list/hoodie_colors = (SSgreyscale.ParseColorString(greyscale_colors))
+ var/list/new_hoodie_colors = hoodie_colors.Copy(1)
+ hood.set_greyscale(new_hoodie_colors)
+
+/obj/item/clothing/suit/hooded/twee_hoodie
+ name = "disconcertingly twee hoodie"
+ desc = "A sweatshirt of heavy and soft ringspun fleece has been adorned with a fabric simulation of ears."
+ icon = 'icons/map_icons/clothing/suit/_suit.dmi'
+ icon_state = "/obj/item/clothing/suit/hooded/twee_hoodie"
+ post_init_icon_state = "twee_hoodie"
+ greyscale_config = /datum/greyscale_config/twee_hoodie
+ greyscale_config_worn = /datum/greyscale_config/twee_hoodie/worn
+ greyscale_colors = "#dbc0e0"
+ hoodtype = /obj/item/clothing/head/hooded/twee_hoodie_hood
+ flags_1 = IS_PLAYER_COLORABLE_1
+ body_parts_covered = CHEST|GROIN|ARMS
+ cold_protection = CHEST|GROIN|ARMS
+ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
+
+/obj/item/clothing/head/hooded/twee_hoodie_hood
+ name = "disconcertingly twee hood"
+ desc = "A hood of heavy and soft ringspun fleece has been adorned with a fabric simulation of ears."
+ icon = 'icons/map_icons/clothing/head/_head.dmi'
+ icon_state = "/obj/item/clothing/head/hooded/twee_hoodie_hood"
+ post_init_icon_state = "twee_hoodie_hood"
+ body_parts_covered = HEAD
+ cold_protection = HEAD
+ flags_inv = HIDEEARS|HIDEHAIR
+ flags_1 = IS_PLAYER_COLORABLE_1
+ hair_mask = /datum/hair_mask/winterhood
+ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
+ greyscale_config = /datum/greyscale_config/twee_hoodie_hood
+ greyscale_config_worn = /datum/greyscale_config/twee_hoodie_hood/worn
+ greyscale_colors = "#dbc0e0"
+
+/obj/item/clothing/suit/hooded/twee_hoodie/set_greyscale(list/colors, new_config, new_worn_config, new_inhand_left, new_inhand_right)
+ . = ..()
+ if(!hood)
+ return
+ var/list/hoodie_colors = SSgreyscale.ParseColorString(greyscale_colors)
+ var/list/new_hoodie_colors = hoodie_colors.Copy(1,2)
+ hood.set_greyscale(new_hoodie_colors)
+ hood.update_slot_icon()
+
+/obj/item/clothing/suit/hooded/twee_hoodie/on_hood_created(obj/item/clothing/head/hooded/hood)
+ . = ..()
+ var/list/hoodie_colors = (SSgreyscale.ParseColorString(greyscale_colors))
+ var/list/new_hoodie_colors = hoodie_colors.Copy(1,2)
+ hood.set_greyscale(new_hoodie_colors)
diff --git a/modular_zubbers/code/modules/lewd_machinery/sex_barrier.dm b/modular_zubbers/code/modules/lewd_machinery/sex_barrier.dm
index 0a37bd22c27..32dd584db1d 100644
--- a/modular_zubbers/code/modules/lewd_machinery/sex_barrier.dm
+++ b/modular_zubbers/code/modules/lewd_machinery/sex_barrier.dm
@@ -4,6 +4,7 @@
max_signs = 4
creation_time = 10
holosign_type = /obj/structure/holosign/sexsign
+ w_class = WEIGHT_CLASS_TINY
//The janitor sign is also purple so no need to make custom sprites here.
/obj/structure/holosign/sexsign
diff --git a/modular_zubbers/code/modules/loadout/categories/inhands.dm b/modular_zubbers/code/modules/loadout/categories/inhands.dm
index 55c8ba9b25a..8ba170e1ee9 100644
--- a/modular_zubbers/code/modules/loadout/categories/inhands.dm
+++ b/modular_zubbers/code/modules/loadout/categories/inhands.dm
@@ -27,3 +27,7 @@
/datum/loadout_item/inhand/wheelchair
name = "folded wheelchair"
item_path = /obj/item/wheelchair
+
+/datum/loadout_item/inhand/sex_sign
+ name = "sex holosign projector"
+ item_path = /obj/item/holosign_creator/sex
diff --git a/modular_zubbers/code/modules/loadout/categories/suit.dm b/modular_zubbers/code/modules/loadout/categories/suit.dm
index c3c697840b7..71c3853ebdf 100644
--- a/modular_zubbers/code/modules/loadout/categories/suit.dm
+++ b/modular_zubbers/code/modules/loadout/categories/suit.dm
@@ -163,3 +163,13 @@
/datum/loadout_item/suit/frontier_colonist_short
name = "Frontier jacket"
item_path = /obj/item/clothing/suit/jacket/frontier_colonist/short/loadout
+
+//Doppler hoodies.
+
+/datum/loadout_item/suit/hoodie/big_hoodie
+ name = "Big Hoodie"
+ item_path = /obj/item/clothing/suit/hooded/big_hoodie
+
+/datum/loadout_item/suit/hoodie/twee_hoodie
+ name = "Disconcertingly Twee Hoodie"
+ item_path = /obj/item/clothing/suit/hooded/twee_hoodie
diff --git a/modular_zubbers/code/modules/rimpoint_newfeatures/code/umbrella.dm b/modular_zubbers/code/modules/rimpoint_newfeatures/code/umbrella.dm
new file mode 100644
index 00000000000..6b364a48dee
--- /dev/null
+++ b/modular_zubbers/code/modules/rimpoint_newfeatures/code/umbrella.dm
@@ -0,0 +1,146 @@
+/obj/item/umbrella
+ name = "umbrella"
+ icon = 'modular_zubbers/icons/obj/equipment/umbrella.dmi'
+ icon_state = "umbrella"
+ lefthand_file = 'modular_zubbers/icons/obj/equipment/umbrella_inhand_l.dmi'
+ righthand_file = 'modular_zubbers/icons/obj/equipment/umbrella_inhand_r.dmi'
+ inhand_icon_state = "umbrella"
+ w_class = WEIGHT_CLASS_BULKY
+ custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 0.75, /datum/material/plastic = SMALL_MATERIAL_AMOUNT * 0.25)
+ custom_premium_price = PAYCHECK_COMMAND * 2
+
+ // Sound effect from the rain hitting it.
+ var/datum/looping_sound/umbrella/rain_on_plastic/looping_sound
+
+ // Seems easier to do this.
+ var/mob/user_holding
+
+ // For some overhang.
+ inhand_x_dimension = 64
+ inhand_y_dimension = 64
+
+ // The umbrella provides some protection against weather effects. Perhaps you may want to change this. I don't judge.
+ var/immunity_type = TRAIT_RAINSTORM_IMMUNE
+
+
+/obj/item/umbrella/equipped(mob/user, slot, initial = FALSE)
+ . = ..()
+ if(!looping_sound)
+ looping_sound = new(src, FALSE)
+ if(!user_holding)
+ RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_move))
+ user_holding = user
+ proccess_rainsounds()
+
+/obj/item/umbrella/dropped(mob/user, silent)
+ . = ..()
+ revoke_trait(user, immunity_type)
+ QDEL_NULL(looping_sound)
+ UnregisterSignal(user, COMSIG_MOVABLE_MOVED)
+ user_holding = null
+
+/obj/item/umbrella/proc/on_move(atom/old_loc, dir, forced, list/old_locs)
+ SIGNAL_HANDLER
+
+ proccess_rainsounds(old_loc)
+
+/obj/item/umbrella/proc/proccess_rainsounds()
+ if(!SSweather)
+ return
+
+
+ var/turf/turf = get_turf(user_holding)
+ if(!turf)
+ return
+ var/datum/weather/weather = SSweather.get_weather(turf.z, get_area(turf))
+ if(!weather || !(turf.loc in weather.impacted_areas) )
+ looping_sound.stop() // If there is no weather, why even have a sound?
+ return
+ if(weather.recursive_weather_protection_check(user_holding)) // If the player is protected by the weather, play the umbrella sounds.
+ looping_sound.start()
+ else
+ looping_sound.stop()
+
+/obj/item/umbrella/collapsible
+ name = "collapsible umbrella"
+ icon = 'modular_zubbers/icons/obj/equipment/umbrella.dmi'
+ icon_state = "umbrella_retract_off"
+ slot_flags = ITEM_SLOT_POCKETS
+ w_class = WEIGHT_CLASS_SMALL
+ inhand_icon_state = "sheathed_umbrella"
+
+ /// Whether the umbrella is currently collapsed or open.
+ var/collapsed = FALSE
+ /// sound when toggled open/closed
+ var/toggle_sound = 'modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/umbrella_open.ogg'
+ var/close_sound = 'modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/umbrella_close.ogg'
+
+/obj/item/umbrella/collapsible/Initialize(mapload)
+ . = ..()
+ AddComponent( \
+ /datum/component/transforming, \
+ w_class_on = WEIGHT_CLASS_BULKY, \
+ attack_verb_continuous_on = list("whaps", "thwacks", "whacks", "beats"), \
+ attack_verb_simple_on = list("whap", "thwack", "whack", "beat"), \
+ )
+ RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform))
+
+
+/obj/item/umbrella/collapsible/proc/on_transform(obj/item/source, mob/user, active)
+ SIGNAL_HANDLER
+
+ collapsed = active
+ if(!user)
+ return COMPONENT_BLOCK_TRANSFORM // Just in case.
+ if(collapsed)
+ icon_state = "umbrella_retract_on"
+ give_trait(user, immunity_type)
+ inhand_icon_state = "umbrella"
+ slot_flags = NONE
+ if(toggle_sound)
+ playsound(user, toggle_sound, 100)
+ to_chat(user, "You open the umbrella.")
+ else
+ icon_state = "umbrella_retract_off"
+ inhand_icon_state = "sheathed_umbrella"
+ slot_flags = ITEM_SLOT_POCKETS
+ revoke_trait(user, immunity_type)
+ if(toggle_sound)
+ playsound(user, close_sound, 100)
+ to_chat(user, "You close the umbrella.")
+
+ balloon_alert(user, active ? "extended" : "collapsed")
+ proccess_rainsounds()
+ return COMPONENT_NO_DEFAULT_MESSAGE
+
+
+
+/obj/item/umbrella/proc/give_trait(mob/living/user,immunity_type)
+ ADD_TRAIT(user, immunity_type, REF(src))
+
+
+/obj/item/umbrella/proc/revoke_trait(mob/living/user,immunity_type)
+ REMOVE_TRAIT(user, immunity_type, REF(src))
+
+
+
+/datum/looping_sound/umbrella/rain_on_plastic
+ mid_sounds = list(
+ 'modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic2.ogg' = 1,
+ 'modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic3.ogg' = 1,
+ 'modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic4.ogg' = 1,
+ 'modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic5.ogg' = 1,
+ 'modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic6.ogg' = 1,
+ 'modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic7.ogg' = 1,
+ )
+ mid_length = 2.5 SECONDS
+ falloff_distance = 1
+ falloff_exponent = 10
+ volume = 25
+ use_reverb = TRUE
+ in_order = TRUE
+
+
+/datum/loadout_item/inhand/collapsible_umbrella
+ name = "Umbrella"
+ item_path = /obj/item/umbrella/collapsible
diff --git a/modular_zubbers/code/modules/rimpoint_newfeatures/sound/attributions.txt b/modular_zubbers/code/modules/rimpoint_newfeatures/sound/attributions.txt
new file mode 100644
index 00000000000..dc8c6e1ea28
--- /dev/null
+++ b/modular_zubbers/code/modules/rimpoint_newfeatures/sound/attributions.txt
@@ -0,0 +1 @@
+raindrops.umbrella.flac by dobroide -- https://freesound.org/s/14901/ -- License: Attribution 4.0
diff --git a/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic2.ogg b/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic2.ogg
new file mode 100644
index 00000000000..d93dfdef5b4
Binary files /dev/null and b/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic2.ogg differ
diff --git a/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic3.ogg b/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic3.ogg
new file mode 100644
index 00000000000..a18d42aadd1
Binary files /dev/null and b/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic3.ogg differ
diff --git a/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic4.ogg b/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic4.ogg
new file mode 100644
index 00000000000..6dc794a96da
Binary files /dev/null and b/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic4.ogg differ
diff --git a/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic5.ogg b/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic5.ogg
new file mode 100644
index 00000000000..44fb6643010
Binary files /dev/null and b/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic5.ogg differ
diff --git a/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic6.ogg b/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic6.ogg
new file mode 100644
index 00000000000..c54582bb9b4
Binary files /dev/null and b/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic6.ogg differ
diff --git a/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic7.ogg b/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic7.ogg
new file mode 100644
index 00000000000..def1c8569b9
Binary files /dev/null and b/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/rain_on_plastic7.ogg differ
diff --git a/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/umbrella_close.ogg b/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/umbrella_close.ogg
new file mode 100644
index 00000000000..e3ca23fbbbb
Binary files /dev/null and b/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/umbrella_close.ogg differ
diff --git a/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/umbrella_open.ogg b/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/umbrella_open.ogg
new file mode 100644
index 00000000000..0de44fc42a9
Binary files /dev/null and b/modular_zubbers/code/modules/rimpoint_newfeatures/sound/effects/umbrella_open.ogg differ
diff --git a/modular_zubbers/code/modules/vending/clothmate.dm b/modular_zubbers/code/modules/vending/clothmate.dm
index d3ff0020baf..a89808475b4 100644
--- a/modular_zubbers/code/modules/vending/clothmate.dm
+++ b/modular_zubbers/code/modules/vending/clothmate.dm
@@ -63,6 +63,8 @@
/obj/item/clothing/suit/hooded/sigmarcoat = 5,
/obj/item/clothing/suit/jacket/skyy = 5,
/obj/item/clothing/suit/jacket/tailcoat = 5,
+ /obj/item/clothing/suit/hooded/big_hoodie = 5,
+ /obj/item/clothing/suit/hooded/twee_hoodie = 5,
/obj/item/clothing/under/dress/skirt/skyrat/black_skirt = 5,
/obj/item/clothing/suit/misc/suit_harness = 5,
/obj/item/clothing/under/dress/miniskirt = 5,
diff --git a/modular_zubbers/icons/obj/equipment/umbrella.dmi b/modular_zubbers/icons/obj/equipment/umbrella.dmi
new file mode 100644
index 00000000000..c4ae465bc4f
Binary files /dev/null and b/modular_zubbers/icons/obj/equipment/umbrella.dmi differ
diff --git a/modular_zubbers/icons/obj/equipment/umbrella_inhand_l.dmi b/modular_zubbers/icons/obj/equipment/umbrella_inhand_l.dmi
new file mode 100644
index 00000000000..3f042556ee1
Binary files /dev/null and b/modular_zubbers/icons/obj/equipment/umbrella_inhand_l.dmi differ
diff --git a/modular_zubbers/icons/obj/equipment/umbrella_inhand_r.dmi b/modular_zubbers/icons/obj/equipment/umbrella_inhand_r.dmi
new file mode 100644
index 00000000000..e41efd5c8a0
Binary files /dev/null and b/modular_zubbers/icons/obj/equipment/umbrella_inhand_r.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index daaa076ec09..0e9d1aa89e9 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -9639,6 +9639,7 @@
#include "modular_zubbers\code\modules\research\designs\autolathe\security_designs.dm"
#include "modular_zubbers\code\modules\research\techweb\all_nodes.dm"
#include "modular_zubbers\code\modules\research\techweb\circuit_nodes.dm"
+#include "modular_zubbers\code\modules\rimpoint_newfeatures\code\umbrella.dm"
#include "modular_zubbers\code\modules\rr_opt_in\examine.dm"
#include "modular_zubbers\code\modules\rr_opt_in\rr_opt_config.dm"
#include "modular_zubbers\code\modules\rr_opt_in\rr_optin_preferences.dm"