diff --git a/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm b/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm index 99c924177a..7b15bfb584 100644 --- a/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm +++ b/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm @@ -997,14 +997,14 @@ /turf/open/floor/plasteel/freezer, /area/mine/living_quarters) "qh" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, +/obj/structure/sink{ + dir = 4; + pixel_x = 12 + }, /turf/open/floor/plasteel, /area/mine/living_quarters) "qm" = ( @@ -2504,13 +2504,13 @@ /turf/open/floor/plasteel/white, /area/mine/laborcamp) "Mj" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12 - }, /obj/structure/mirror{ pixel_x = -28 }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12 + }, /turf/open/floor/plasteel/freezer, /area/mine/living_quarters) "Mk" = ( diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index b14cb41bd1..96c3c16ead 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -31646,14 +31646,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"bUv" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/landmark/start/stowaway, -/turf/open/floor/plating, -/area/maintenance/port/aft) "bUx" = ( /obj/structure/disposalpipe/junction/yjunction{ dir = 1 @@ -34770,14 +34762,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, /area/maintenance/starboard/aft) -"ccV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/effect/landmark/start/stowaway, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "ccW" = ( /obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -37854,13 +37838,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/aft) -"cln" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/obj/effect/landmark/start/stowaway, -/turf/open/floor/plating, -/area/maintenance/aft) "clo" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -44034,12 +44011,6 @@ }, /turf/open/floor/plating, /area/security/prison/upper) -"dhO" = ( -/obj/effect/landmark/start/stowaway, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/starboard/fore) "diq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/maintenance{ @@ -44627,6 +44598,11 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"dGx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/landmark/start/stowaway, +/turf/open/floor/plating, +/area/maintenance/port/fore) "dGB" = ( /obj/item/radio/intercom{ name = "Station Intercom (General)"; @@ -46969,6 +46945,13 @@ /obj/structure/table/wood/poker, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"fLT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/landmark/start/stowaway, +/turf/open/floor/plating, +/area/maintenance/port) "fMt" = ( /obj/structure/cable{ icon_state = "0-4" @@ -47562,6 +47545,13 @@ "gjl" = ( /turf/closed/wall, /area/cargo/warehouse) +"gjG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/effect/landmark/start/stowaway, +/turf/open/floor/plating, +/area/maintenance/aft) "gkS" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -47794,6 +47784,10 @@ }, /turf/open/floor/carpet/royalblack, /area/service/library) +"gwY" = ( +/obj/effect/landmark/start/stowaway, +/turf/open/floor/plating, +/area/maintenance/port/fore) "gxc" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -49114,10 +49108,6 @@ /obj/structure/bedsheetbin, /turf/open/floor/plasteel/cafeteria, /area/security/prison/upper) -"hFF" = ( -/obj/effect/landmark/start/stowaway, -/turf/open/floor/plating, -/area/maintenance/aft) "hGU" = ( /obj/structure/cable{ icon_state = "0-2" @@ -51730,12 +51720,6 @@ dir = 1 }, /area/engineering/atmos) -"jWa" = ( -/obj/effect/landmark/start/stowaway, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/starboard/aft) "jWW" = ( /obj/machinery/light{ dir = 4 @@ -52530,26 +52514,6 @@ }, /turf/open/floor/plasteel, /area/security/processing) -"kHw" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "innerbrig"; - name = "Brig"; - req_access_txt = "1" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/brig) "kHN" = ( /obj/structure/chair{ dir = 1 @@ -57230,13 +57194,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"oMU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/landmark/start/stowaway, -/turf/open/floor/plating, -/area/maintenance/port) "oNt" = ( /obj/structure/chair/sofa/left{ dir = 1 @@ -59461,10 +59418,6 @@ dir = 4 }, /area/security/prison/upper) -"qRO" = ( -/obj/effect/landmark/start/stowaway, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "qSf" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable{ @@ -59909,6 +59862,10 @@ icon_state = "wood-broken7" }, /area/maintenance/starboard/aft) +"rnf" = ( +/obj/effect/landmark/start/stowaway, +/turf/open/floor/plating, +/area/maintenance/aft) "rnt" = ( /obj/structure/chair/comfy/black{ dir = 8 @@ -60841,10 +60798,6 @@ /obj/machinery/disposal/bin, /turf/open/floor/plasteel, /area/security/office) -"sjc" = ( -/obj/effect/landmark/start/stowaway, -/turf/open/floor/plating, -/area/maintenance/port/fore) "sjx" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -62738,6 +62691,10 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"tTA" = ( +/obj/effect/landmark/start/stowaway, +/turf/open/floor/wood/wood_large, +/area/service/abandoned_gambling_den) "tUc" = ( /obj/structure/cable{ icon_state = "4-8" @@ -63220,11 +63177,6 @@ }, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) -"upd" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/landmark/start/stowaway, -/turf/open/floor/plating, -/area/maintenance/port/fore) "upe" = ( /obj/machinery/computer/arcade/orion_trail, /obj/structure/window{ @@ -63908,6 +63860,10 @@ }, /turf/open/floor/wood, /area/command/bridge) +"uWN" = ( +/obj/effect/landmark/start/stowaway, +/turf/open/floor/plating, +/area/maintenance/port/aft) "uWX" = ( /obj/machinery/light{ dir = 8 @@ -64329,6 +64285,14 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"vrV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/landmark/start/stowaway, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "vsr" = ( /turf/open/floor/plating{ icon_state = "platingdmg2" @@ -65301,10 +65265,6 @@ }, /turf/open/floor/plasteel, /area/security/prison/cells) -"vYV" = ( -/obj/effect/landmark/start/stowaway, -/turf/open/floor/plating, -/area/maintenance/port/aft) "vZA" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -65317,6 +65277,10 @@ /obj/structure/table/wood, /turf/open/floor/plasteel/dark, /area/service/bar) +"waA" = ( +/obj/effect/landmark/start/stowaway, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "waB" = ( /obj/machinery/suit_storage_unit/cmo, /obj/effect/turf_decal/tile/blue{ @@ -66171,6 +66135,14 @@ }, /turf/open/floor/plasteel/dark, /area/security/office) +"wQf" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/landmark/start/stowaway, +/turf/open/floor/plating, +/area/maintenance/port/aft) "wRd" = ( /obj/structure/cable, /obj/machinery/power/apc{ @@ -66412,6 +66384,12 @@ }, /turf/open/floor/carpet/royalblue, /area/maintenance/starboard/aft) +"wZe" = ( +/obj/effect/landmark/start/stowaway, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/maintenance/starboard/aft) "wZA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable{ @@ -67220,6 +67198,12 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"xMe" = ( +/obj/effect/landmark/start/stowaway, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/starboard/fore) "xMi" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -67263,10 +67247,6 @@ }, /turf/open/floor/carpet/blue, /area/command/bridge) -"xOz" = ( -/obj/effect/landmark/start/stowaway, -/turf/open/floor/wood/wood_large, -/area/service/abandoned_gambling_den) "xPb" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced/tinted, @@ -81290,7 +81270,7 @@ lPA alU ugq rMh -upd +dGx aAe aBJ aCs @@ -82050,7 +82030,7 @@ aaf aaf alU arO -sjc +gwY aom ank auT @@ -83371,7 +83351,7 @@ bbI bcK aPz bdB -oMU +fLT bfh aPz aPz @@ -86687,7 +86667,7 @@ amC uBf amC aKY -sjc +gwY aAY aBQ aDp @@ -87512,7 +87492,7 @@ aaa bCq bHE bHE -vYV +uWN bHE bCq bVy @@ -88557,7 +88537,7 @@ bCq cqn cAh chT -vYV +uWN bHE ckv bHE @@ -90081,7 +90061,7 @@ aoV aoV bLv bPZ -vYV +uWN bHE cTF bHE @@ -91883,7 +91863,7 @@ bLv aaa aaa bTB -bUv +wQf bES bES bES @@ -96950,7 +96930,7 @@ jyO ajC akC akX -kHw +alw amJ aoY rCl @@ -106020,7 +106000,7 @@ bMa bTZ bKH bzs -hFF +rnf bXZ bHX bZN @@ -108091,7 +108071,7 @@ cbK ciG bLS ckm -cln +gjG cmh cnd cnE @@ -109811,7 +109791,7 @@ apC aqy anf anf -dhO +xMe auF alP aAt @@ -113920,7 +113900,7 @@ wKe hda hda hda -xOz +tTA qbq asB atD @@ -114776,7 +114756,7 @@ diq clr bnt cOe -qRO +waA bMB cOT aaa @@ -118876,7 +118856,7 @@ cNW rSf cNW wly -ccV +vrV noa iQg ccU @@ -119120,7 +119100,7 @@ vHY bEs rmX xIa -jWa +wZe cOe bPP bPP diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index da1b941bae..53de44a385 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -91,13 +91,13 @@ }, /area/holodeck/rec_center/lounge) "ap" = ( -/turf/open/floor/holofloor/plating, +/turf/open/floor/holofloor/basalt, /area/holodeck/rec_center/wildlife) "aq" = ( /turf/open/floor/holofloor/plating, /area/holodeck/rec_center/offline) "ar" = ( -/turf/open/floor/holofloor/plating/burnmix, +/turf/open/indestructible/binary, /area/holodeck/rec_center/burn) "as" = ( /obj/effect/turf_decal/tile/red{ @@ -178,12 +178,12 @@ }, /area/holodeck/rec_center/lounge) "aB" = ( -/obj/effect/holodeck_effect/mobspawner, -/turf/open/floor/holofloor/plating, +/obj/effect/holodeck_effect/mobspawner/funclaw, +/turf/open/floor/holofloor/basalt, /area/holodeck/rec_center/wildlife) "aC" = ( /obj/effect/holodeck_effect/sparks, -/turf/open/floor/holofloor/plating/burnmix, +/turf/open/indestructible/binary, /area/holodeck/rec_center/burn) "aD" = ( /obj/effect/turf_decal/tile/red{ @@ -413,7 +413,7 @@ /turf/closed/indestructible/riveted, /area/space) "bk" = ( -/obj/effect/holodeck_effect/mobspawner/bee, +/obj/effect/holodeck_effect/mobspawner/bumbles, /turf/open/floor/holofloor/asteroid, /area/holodeck/rec_center/anthophila) "bl" = ( @@ -752,7 +752,7 @@ }, /area/holodeck/rec_center/medical) "ce" = ( -/obj/effect/holodeck_effect/mobspawner/bee, +/obj/effect/holodeck_effect/mobspawner/bumbles, /obj/item/clothing/head/beekeeper_head, /turf/open/floor/holofloor/asteroid, /area/holodeck/rec_center/anthophila) @@ -856,13 +856,13 @@ /turf/open/floor/holofloor, /area/holodeck/rec_center/dodgeball) "cq" = ( -/obj/effect/holodeck_effect/mobspawner/bee, +/obj/effect/holodeck_effect/mobspawner/bumbles, /obj/effect/decal/remains/human, /obj/item/clothing/suit/beekeeper_suit, /turf/open/floor/holofloor/asteroid, /area/holodeck/rec_center/anthophila) "cr" = ( -/obj/effect/holodeck_effect/mobspawner/bee, +/obj/effect/holodeck_effect/mobspawner/bumbles, /obj/item/melee/flyswatter, /turf/open/floor/holofloor/asteroid, /area/holodeck/rec_center/anthophila) @@ -20270,6 +20270,9 @@ }, /turf/open/space, /area/space) +"Vy" = ( +/turf/open/chasm/lavaland, +/area/holodeck/rec_center/wildlife) "Vz" = ( /obj/machinery/vending/wallmed{ name = "Emergency NanoMed"; @@ -80911,16 +80914,16 @@ aa "} (232,1,1) = {" ac +Vy +Vy +Vy ap ap ap ap -ap -ap -ap -ap -ap -ap +Vy +Vy +Vy bj bt bI @@ -81168,7 +81171,7 @@ aa "} (233,1,1) = {" ac -ap +Vy aB ap ap @@ -81177,7 +81180,7 @@ ap ap ap aB -ap +Vy bj Xg TF @@ -81425,7 +81428,7 @@ aa "} (234,1,1) = {" ac -ap +Vy ap ap ap @@ -81434,7 +81437,7 @@ aB ap ap ap -ap +Vy bj bu bJ @@ -81682,16 +81685,16 @@ aa "} (235,1,1) = {" ac -ap -aB +Vy ap ap ap ap ap ap -aB ap +ap +Vy bj bv bK @@ -81939,16 +81942,16 @@ aa "} (236,1,1) = {" ac -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap +Vy +Vy +Vy +Vy +Vy +Vy +Vy +Vy +Vy +Vy bj RD Va diff --git a/_maps/shuttles/cargo_kilo.dmm b/_maps/shuttles/cargo_kilo.dmm index 86660a4dc7..b05f1c49de 100644 --- a/_maps/shuttles/cargo_kilo.dmm +++ b/_maps/shuttles/cargo_kilo.dmm @@ -51,6 +51,7 @@ id = "QMLoad"; name = "off ramp" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/supply) "j" = ( @@ -82,6 +83,7 @@ dir = 4; dwidth = 4 }, +/obj/structure/fans/tiny, /turf/open/floor/mineral/plastitanium, /area/shuttle/supply) "n" = ( @@ -137,6 +139,7 @@ req_access_txt = "31" }, /obj/effect/decal/cleanable/dirt, +/obj/structure/fans/tiny, /turf/open/floor/mineral/plastitanium, /area/shuttle/supply) "t" = ( @@ -149,6 +152,7 @@ id = "QMLoad2"; name = "on ramp" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/supply) "u" = ( diff --git a/code/__DEFINES/dcs/signals/signals_movable.dm b/code/__DEFINES/dcs/signals/signals_movable.dm new file mode 100644 index 0000000000..adb8a8029b --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_movable.dm @@ -0,0 +1,4 @@ +///from base of atom/experience_pressure_difference(): (pressure_difference, direction, pressure_resistance_prob_delta) +#define COMSIG_MOVABLE_PRE_PRESSURE_PUSH "atom_pre_pressure_push" + ///prevents pressure movement + #define COMSIG_MOVABLE_BLOCKS_PRESSURE (1<<0) diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index cd647867c3..681a4f9059 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -83,7 +83,7 @@ #define HIDETAUR (1<<11) //gotta hide that snowflake #define HIDESNOUT (1<<12) //or do we actually hide our snoots #define HIDEACCESSORY (1<<13) //hides the jumpsuit accessory. -//skyrat edit +//sandstorm edit #define HIDEUNDERWEAR (1<<14) //hides underwear, socks and shirt #define HIDEWRISTS (1<<15) //hides wrists // diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 19cb08de54..a8ea046657 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -279,9 +279,13 @@ GLOBAL_LIST_INIT(pda_styles, list(MONO, VT, ORBITRON, SHARE)) #define PDA_SKIN_MODERN "Modern" #define PDA_SKIN_MINIMAL "Minimal" -GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_SKIN_ALT = 'icons/obj/pda_alt.dmi', - PDA_SKIN_RUGGED = 'icons/obj/pda_rugged.dmi', PDA_SKIN_MODERN = 'icons/obj/pda_modern.dmi', - PDA_SKIN_MINIMAL = 'icons/obj/pda_minimal.dmi')) +GLOBAL_LIST_INIT(pda_reskins, list( + PDA_SKIN_CLASSIC = list("icon" = 'icons/obj/pda.dmi'), + PDA_SKIN_ALT = list("icon" = 'icons/obj/pda_alt.dmi'), + PDA_SKIN_RUGGED = list("icon" = 'icons/obj/pda_rugged.dmi'), + PDA_SKIN_MODERN = list("icon" = 'icons/obj/pda_modern.dmi'), + PDA_SKIN_MINIMAL = list("icon" = 'icons/obj/pda_minimal.dmi') + )) ///////////////////////////////////// // atom.appearence_flags shortcuts // diff --git a/code/__DEFINES/spans.dm b/code/__DEFINES/spans.dm index c54af39d56..b6b633d91a 100644 --- a/code/__DEFINES/spans.dm +++ b/code/__DEFINES/spans.dm @@ -114,6 +114,3 @@ #define span_warning(str) ("" + str + "") #define span_yell(str) ("" + str + "") #define span_yellowteamradio(str) ("" + str + "") - -//SANDSTORM DEFINES -#define span_love(str) ("" + str + "") diff --git a/code/__SANDCODE/DEFINES/spans.dm b/code/__SANDCODE/DEFINES/spans.dm new file mode 100644 index 0000000000..f8002c5e5a --- /dev/null +++ b/code/__SANDCODE/DEFINES/spans.dm @@ -0,0 +1,3 @@ +#define span_lewd(str) ("" + str + "") +#define span_love(str) ("" + str + "") +#define span_userlove(str) ("" + str + "") diff --git a/code/__SANDCODE/DEFINES/traits.dm b/code/__SANDCODE/DEFINES/traits.dm index ffc5af34bc..a062d75fb6 100644 --- a/code/__SANDCODE/DEFINES/traits.dm +++ b/code/__SANDCODE/DEFINES/traits.dm @@ -6,3 +6,5 @@ #define TRAIT_SHELTERED "sheltered" /// Define for the quirk "infertile", self explanatory. Please make this a preference on the Content Preferences Tab. #define TRAIT_INFERTILE "infertile" +/// DNC trait, used to prevent cloning +#define TRAIT_DNC_ORDER "dnc_order" diff --git a/code/__SPLURTCODE/DEFINES/spans.dm b/code/__SPLURTCODE/DEFINES/spans.dm index 3a26809294..1a8c5a73ac 100644 --- a/code/__SPLURTCODE/DEFINES/spans.dm +++ b/code/__SPLURTCODE/DEFINES/spans.dm @@ -1,2 +1,5 @@ -#define span_userlove(str) ("" + str + "") -#define span_lewd(str) ("" + str + "") +// This file is maintained for exotic span types +#define span_reallybig_hypnophrase(str) ("" + str + "") +#define span_big_warning(str) ("" + str + "") +#define span_header(str) ("" + str + "") +#define span_umbra(str) ("" + str + "") diff --git a/code/__SPLURTCODE/DEFINES/traits.dm b/code/__SPLURTCODE/DEFINES/traits.dm index 9f0c41e694..121772f7e1 100644 --- a/code/__SPLURTCODE/DEFINES/traits.dm +++ b/code/__SPLURTCODE/DEFINES/traits.dm @@ -17,13 +17,12 @@ #define TRAIT_PHARMA "hepatic_pharmacokinesis" #define TRAIT_CHOKE_SLUT "choke_slut" -#define BLOODFLEDGE "BloodFledge"//splurt change +#define TRAIT_BLOODFLEDGE "BloodFledge" #define TRAIT_INCUBUS "Incubus" #define TRAIT_SUCCUBUS "Succubus" #define TRAIT_ARACHNID "Arachnid" #define TRAIT_FLUTTER "flutter" - #define TRAIT_NUDIST "Nudist" - +#define TRAIT_CLOTH_EATER "cloth_eater" diff --git a/code/__SPLURTCODE/DEFINES/zeros/traits.dm b/code/__SPLURTCODE/DEFINES/zeros/traits.dm index b1d1b3ef64..ea94313038 100644 --- a/code/__SPLURTCODE/DEFINES/zeros/traits.dm +++ b/code/__SPLURTCODE/DEFINES/zeros/traits.dm @@ -3,9 +3,9 @@ #define TRAIT_CURSED_BLOOD "cursed_blood" //Yo dawg I heard you like bloodborne references so I put a #define TRAIT_HEADPAT_SLUT "headpat_slut" #define TRAIT_DISTANT "headpat_hater" -#define TRAIT_NO_CLONE "no_clone" #define TRAIT_IN_HEAT "in_heat" #define TRAIT_HEAT_DETECT "heat_detect" #define TRAIT_ILLITERATE "illiterate" +#define TRAIT_HIDE_BACKPACK "hide_backpack" #define TRAIT_DUMB4CUM "dumb4cum" diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 8d06d9ecf3..f412f31e9c 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -68,6 +68,25 @@ DEFINE_BITFIELD(area_flags, list( "NO_ALERTS" = NO_ALERTS, )) +DEFINE_BITFIELD(body_parts_covered, list( + "ARM_LEFT" = ARM_LEFT, + "ARM_RIGHT" = ARM_RIGHT, + "ARMS" = ARMS, + "CHEST" = CHEST, + "FEET" = FEET, + "FOOT_LEFT" = FOOT_LEFT, + "FOOT_RIGHT" = FOOT_RIGHT, + "GROIN" = GROIN, + "HAND_LEFT" = HAND_LEFT, + "HAND_RIGHT" = HAND_RIGHT, + "HANDS" = HANDS, + "HEAD" = HEAD, + "LEG_LEFT" = LEG_LEFT, + "LEG_RIGHT" = LEG_RIGHT, + "LEGS" = LEGS, + "NECK" = NECK, +)) + DEFINE_BITFIELD(car_traits, list( "CAN_KIDNAP" = CAN_KIDNAP, )) @@ -125,6 +144,11 @@ DEFINE_BITFIELD(disease_flags, list( "CURABLE" = CURABLE, )) +DEFINE_BITFIELD(explosion_flags, list( + "EXPLOSION_FLAG_DENSITY_DEPENDENT" = EXPLOSION_FLAG_DENSITY_DEPENDENT, + "EXPLOSION_FLAG_HARD_OBSTACLE" = EXPLOSION_FLAG_HARD_OBSTACLE, +)) + DEFINE_BITFIELD(flags_1, list( "ADMIN_SPAWNED_1" = ADMIN_SPAWNED_1, "BLOCK_FACE_ATOM_1" = BLOCK_FACE_ATOM_1, @@ -147,6 +171,30 @@ DEFINE_BITFIELD(flags_1, list( "UNUSED_RESERVATION_TURF_1" = UNUSED_RESERVATION_TURF_1, )) +DEFINE_BITFIELD(flags_cover, list( + "GLASSESCOVERSEYE" = GLASSESCOVERSEYES, + "HEADCOVERSEYES" = HEADCOVERSEYES, + "HEADCOVERSMOUTH" = HEADCOVERSMOUTH, + "MASKCOVERSEYES" = MASKCOVERSEYES, + "MASKCOVERSMOUTH" = MASKCOVERSMOUTH, +)) + +DEFINE_BITFIELD(flags_inv, list( + "HIDEACCESSORY" = HIDEACCESSORY, + "HIDEEARS" = HIDEEARS, + "HIDEEYES" = HIDEEYES, + "HIDEFACE" = HIDEFACE, + "HIDEFACIALHAI" = HIDEFACIALHAIR, + "HIDEGLOVES" = HIDEGLOVES, + "HIDEHAIR" = HIDEHAIR, + "HIDEJUMPSUIT" = HIDEJUMPSUIT, + "HIDEMASK" = HIDEMASK, + "HIDENECK" = HIDENECK, + "HIDESHOES" = HIDESHOES, + "HIDESNOUT" = HIDESNOUT, + "HIDESUITSTORA" = HIDESUITSTORAGE, + "HIDETAUR" = HIDETAUR, +)) DEFINE_BITFIELD(flags_ricochet, list( "RICOCHET_SHINY" = RICOCHET_SHINY, "RICOCHET_HARD" = RICOCHET_HARD @@ -204,6 +252,12 @@ DEFINE_BITFIELD(item_flags, list( "SLOWS_WHILE_IN_HAND" = SLOWS_WHILE_IN_HAND, )) +DEFINE_BITFIELD(material_flags, list( + "MATERIAL_ADD_PREFIX" = MATERIAL_ADD_PREFIX, + "MATERIAL_AFFECT_STATISTICS" = MATERIAL_AFFECT_STATISTICS, + "MATERIAL_COLOR" = MATERIAL_COLOR, +)) + DEFINE_BITFIELD(mob_biotypes, list( "MOB_BEAST" = MOB_BEAST, "MOB_BUG" = MOB_BUG, @@ -281,7 +335,21 @@ DEFINE_BITFIELD(pass_flags, list( "PASSCLOSEDTURF" = PASSCLOSEDTURF, "PASSGLASS" = PASSGLASS, "PASSGRILLE" = PASSGRILLE, + "PASSMACHINE" = PASSMACHINE, "PASSMOB" = PASSMOB, + "PASSSTRUCTURE" = PASSSTRUCTURE, + "PASSTABLE" = PASSTABLE, +)) + +DEFINE_BITFIELD(pass_flags_self, list( + "LETPASSTHROW" = LETPASSTHROW, + "PASSBLOB" = PASSBLOB, + "PASSCLOSEDTURF" = PASSCLOSEDTURF, + "PASSGLASS" = PASSGLASS, + "PASSGRILLE" = PASSGRILLE, + "PASSMACHINE" = PASSMACHINE, + "PASSMOB" = PASSMOB, + "PASSSTRUCTURE" = PASSSTRUCTURE, "PASSTABLE" = PASSTABLE, )) @@ -343,6 +411,29 @@ DEFINE_BITFIELD(sight, list( "SEE_TURFS" = SEE_TURFS, )) +DEFINE_BITFIELD(slot_flags, list( + "ITEM_SLOT_BACK" = ITEM_SLOT_BACK, + "ITEM_SLOT_BACKPACK" = ITEM_SLOT_BACKPACK, + "ITEM_SLOT_BELT" = ITEM_SLOT_BELT, + "ITEM_SLOT_DEX_STORAGE" = ITEM_SLOT_DEX_STORAGE, + "ITEM_SLOT_EARS" = ITEM_SLOT_EARS, + "ITEM_SLOT_EYES" = ITEM_SLOT_EYES, + "ITEM_SLOT_FEET" = ITEM_SLOT_FEET, + "ITEM_SLOT_GLOVES" = ITEM_SLOT_GLOVES, + "ITEM_SLOT_HANDCUFFED" = ITEM_SLOT_HANDCUFFED, + "ITEM_SLOT_HANDS" = ITEM_SLOT_HANDS, + "ITEM_SLOT_HEAD" = ITEM_SLOT_HEAD, + "ITEM_SLOT_ICLOTHING" = ITEM_SLOT_ICLOTHING, + "ITEM_SLOT_ID" = ITEM_SLOT_ID, + "ITEM_SLOT_LEGCUFFED" = ITEM_SLOT_LEGCUFFED, + "ITEM_SLOT_LPOCKET" = ITEM_SLOT_LPOCKET, + "ITEM_SLOT_MASK" = ITEM_SLOT_MASK, + "ITEM_SLOT_NECK" = ITEM_SLOT_NECK, + "ITEM_SLOT_OCLOTHING" = ITEM_SLOT_OCLOTHING, + "ITEM_SLOT_RPOCKET" = ITEM_SLOT_RPOCKET, + "ITEM_SLOT_SUITSTORE" = ITEM_SLOT_SUITSTORE, +)) + DEFINE_BITFIELD(smooth, list( "SMOOTH_BORDER" = SMOOTH_BORDER, "SMOOTH_DIAGONAL" = SMOOTH_DIAGONAL, @@ -351,6 +442,15 @@ DEFINE_BITFIELD(smooth, list( "SMOOTH_TRUE" = SMOOTH_TRUE, )) +DEFINE_BITFIELD(status_flags, list( + "CANKNOCKDOWN" = CANKNOCKDOWN, + "CANPUSH" = CANPUSH, + "CANSTAGGER" = CANSTAGGER, + "CANSTUN" = CANSTUN, + "CANUNCONSCIOUS" = CANUNCONSCIOUS, + "GODMODE" = GODMODE, +)) + DEFINE_BITFIELD(storage_flags, list( "STORAGE_LIMIT_COMBINED_W_CLASS" = STORAGE_LIMIT_COMBINED_W_CLASS, "STORAGE_LIMIT_MAX_ITEMS" = STORAGE_LIMIT_MAX_ITEMS, @@ -369,6 +469,59 @@ DEFINE_BITFIELD(vis_flags, list( "VIS_UNDERLAY" = VIS_UNDERLAY, )) +DEFINE_BITFIELD(visor_flags, list( + "ALLOWINTERNALS" = ALLOWINTERNALS, + "BLOCK_GAS_SMOKE_EFFECT" = BLOCK_GAS_SMOKE_EFFECT, + "IGNORE_HAT_TOSS" = IGNORE_HAT_TOSS, + "LAVAPROTECT" = LAVAPROTECT, + "NOSLIP" = NOSLIP, + "NOSLIP_ICE" = NOSLIP_ICE, + "SCAN_REAGENTS" = SCAN_REAGENTS, + "STOPSPRESSUREDAMAGE" = STOPSPRESSUREDAMAGE, + "THICKMATERIAL" = THICKMATERIAL, + "VOICEBOX_DISABLED" = VOICEBOX_DISABLED, + "VOICEBOX_TOGGLABLE" = VOICEBOX_TOGGLABLE, +)) + +DEFINE_BITFIELD(visor_flags_cover, list( + "GLASSESCOVERSEYE" = GLASSESCOVERSEYES, + "HEADCOVERSEYES" = HEADCOVERSEYES, + "HEADCOVERSMOUTH" = HEADCOVERSMOUTH, + "MASKCOVERSEYES" = MASKCOVERSEYES, + "MASKCOVERSMOUTH" = MASKCOVERSMOUTH, +)) + +DEFINE_BITFIELD(visor_flags_inv, list( + "HIDEACCESSORY" = HIDEACCESSORY, + "HIDEEARS" = HIDEEARS, + "HIDEEYES" = HIDEEYES, + "HIDEFACE" = HIDEFACE, + "HIDEFACIALHAI" = HIDEFACIALHAIR, + "HIDEGLOVES" = HIDEGLOVES, + "HIDEHAIR" = HIDEHAIR, + "HIDEJUMPSUIT" = HIDEJUMPSUIT, + "HIDEMASK" = HIDEMASK, + "HIDENECK" = HIDENECK, + "HIDESHOES" = HIDESHOES, + "HIDESNOUT" = HIDESNOUT, + "HIDESUITSTORA" = HIDESUITSTORAGE, + "HIDETAUR" = HIDETAUR, +)) + +DEFINE_BITFIELD(vore_flags, list( + "ABSORBABLE" = ABSORBABLE, + "ABSORBED" = ABSORBED, + "DEVOURABLE" = DEVOURABLE, + "DIGESTABLE" = DIGESTABLE, + "FEEDING" = FEEDING, + "LICKABLE" = LICKABLE, + "MOBVORE" = MOBVORE, + "NO_VORE" = NO_VORE, + "SMELLABLE" = SMELLABLE, + "VOREPREF_INIT" = VOREPREF_INIT, + "VORE_INIT" = VORE_INIT, +)) + DEFINE_BITFIELD(zap_flags, list( "ZAP_ALLOW_DUPLICATES" = ZAP_ALLOW_DUPLICATES, "ZAP_MACHINE_EXPLOSIVE" = ZAP_MACHINE_EXPLOSIVE, diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 2ca3a0a15b..e2996ecd7e 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -209,7 +209,8 @@ GLOBAL_LIST_INIT(backbaglist, list(DBACKPACK, DSATCHEL, DDUFFELBAG, //everything "Grey Satchel" = /obj/item/storage/backpack/satchel, "Grey Duffel Bag" = /obj/item/storage/backpack/duffelbag, "Leather Satchel" = /obj/item/storage/backpack/satchel/leather, - "Snail Shell" = /obj/item/storage/backpack/snail)) + "Snail Shell" = /obj/item/storage/backpack/snail, + "Sloog Shell" = /obj/item/storage/backpack/sloogshell)) //Suit/Skirt #define PREF_SUIT "Jumpsuit" @@ -339,46 +340,11 @@ GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant //body ids that have prosthetic sprites GLOBAL_LIST_INIT(prosthetic_limb_types, list("xion","bishop","cybersolutions","grayson","hephaestus","nanotrasen","talon")) -//FAMILY HEIRLOOM LIST -//this works by using the first number for the species as a probability to choose one of the items in the following list for their family heirloom -//if the probability fails, or the species simply isn't in the list, then it defaults to the next global list, which has its own list of items for each job -//the first item in the list is for if your job isn't in that list - -//species-heirloom list (we categorise them by the species id var) -GLOBAL_LIST_INIT(species_heirlooms, list( - "dwarf" = list(25, list(/obj/item/reagent_containers/food/drinks/dwarf_mug)), //example: 25% chance for dwarves to get a dwarf mug as their heirloom (normal container but has manly dorf icon) - "insect" = list(25, list(/obj/item/flashlight/lantern/heirloom_moth)), - "ipc" = list(25, list(/obj/item/stock_parts/cell/family)), //gives a broken powercell for flavor text! - "synthliz" = list(25, list(/obj/item/stock_parts/cell/family)), //they're also robots - "slimeperson" = list(25, list(/obj/item/toy/plush/slimeplushie)), - "lizard" = list(25, list(/obj/item/toy/plush/lizardplushie)), - )) - -//job-heirloom list -GLOBAL_LIST_INIT(job_heirlooms, list( - "NO_JOB" = list(/obj/item/toy/cards/deck, /obj/item/lighter, /obj/item/dice/d20), - "Clown" = list(/obj/item/paint/anycolor, /obj/item/bikehorn/golden), - "Mime" = list(/obj/item/paint/anycolor, /obj/item/toy/dummy), - "Cook" = list(/obj/item/kitchen/knife/scimitar), - "Botanist" = list(/obj/item/cultivator, /obj/item/reagent_containers/glass/bucket, /obj/item/storage/bag/plants, /obj/item/toy/plush/beeplushie), - "Medical Doctor" = list(/obj/item/healthanalyzer), - "Paramedic" = list(/obj/item/lighter), //..why? - "Station Engineer" = list(/obj/item/wirecutters/brass/family, /obj/item/crowbar/brass/family, /obj/item/screwdriver/brass/family, /obj/item/wrench/brass/family), //brass tools but without the tool speed modifier - "Atmospheric Technician" = list(/obj/item/extinguisher/mini/family), - "Lawyer" = list(/obj/item/storage/briefcase/lawyer/family), - "Janitor" = list(/obj/item/mop), - "Scientist" = list(/obj/item/toy/plush/slimeplushie), - "Assistant" = list(/obj/item/clothing/gloves/cut/family), - "Prisoner" = list (/obj/item/pen/blue), - "Chaplain" = list(/obj/item/camera/spooky/family), - "Head of Personnel" = list(/obj/item/pinpointer/ian) - )) - //body ids that have non-gendered bodyparts GLOBAL_LIST_INIT(nongendered_limb_types, list("fly", "zombie" ,"synth", "shadow", "cultgolem", "agent", "plasmaman", "clockgolem", "clothgolem")) //list of eye types, corresponding to a respective left and right icon state for the set of eyes -GLOBAL_LIST_INIT(eye_types, list("normal", "insect", "moth", "double", "double2", "double3", "spider", "cyclops", "third", "spectre", "shadekin")) +GLOBAL_LIST_INIT(eye_types, list("normal", "insect", "moth", "double", "double2", "double3", "spider", "cyclops", "third", "spectre", "shadekin", "none")) //list linking bodypart bitflags to their actual names GLOBAL_LIST_INIT(bodypart_names, list(num2text(HEAD) = "Head", num2text(CHEST) = "Chest", num2text(LEG_LEFT) = "Left Leg", num2text(LEG_RIGHT) = "Right Leg", num2text(ARM_LEFT) = "Left Arm", num2text(ARM_RIGHT) = "Right Arm")) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index c9e20bc01a..6e8d1de955 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -405,7 +405,7 @@ return /atom/proc/CtrlShiftClick(mob/user) - SEND_SIGNAL(src, COMSIG_CLICK_CTRL_SHIFT) + SEND_SIGNAL(src, COMSIG_CLICK_CTRL_SHIFT, user) return /* diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 0b820fe7e9..3231cd31bc 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -18,6 +18,7 @@ SUBSYSTEM_DEF(statpanels) "Map: [SSmapping.config?.map_name || "Loading..."]", cached ? "Next Map: [cached.map_name]" : null, "Round ID: [GLOB.round_id ? GLOB.round_id : "NULL"]", + "Game Mode: [GLOB.master_mode]", "Connected Players: [GLOB.clients.len]", " ", "OOC: [GLOB.ooc_allowed ? "Enabled" : "Disabled"]", diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 3699331eda..19247c486a 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -171,9 +171,14 @@ stress = max(stress - 4, 0) /datum/brain_trauma/severe/monophobia/proc/check_alone() +//SANDSTORM EDIT + var/check_radius = 7 + if(istype(owner.loc, /obj/belly)) + return FALSE if(HAS_TRAIT(owner, TRAIT_BLIND)) - return TRUE - for(var/mob/M in oview(owner, 7)) + check_radius = 1 + for(var/mob/M in oview(owner, check_radius)) +//SANDSTORM EDIT END if(!isliving(M)) //ghosts ain't people continue if((istype(M, /mob/living/simple_animal/pet)) || M.ckey) diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index f4a979c510..fe1fbdf340 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -202,7 +202,7 @@ message.maptext_height = mheight message.maptext_x = (CHAT_MESSAGE_WIDTH - owner.bound_width) * -0.5 message.maptext = MAPTEXT(complete_text) - message.pixel_x = -owner.pixel_x //Dogborgs and other wide boys have a pixel offset. This accounts for that + message.pixel_x = -target.pixel_x //Dogborgs and other wide boys have a pixel offset. This accounts for that // View the message LAZYADDASSOC(owned_by.seen_messages, message_loc, src) diff --git a/code/datums/components/crafting/recipes/recipes_clothing.dm b/code/datums/components/crafting/recipes/recipes_clothing.dm index 75d00bbfcd..7dbbf01a1d 100644 --- a/code/datums/components/crafting/recipes/recipes_clothing.dm +++ b/code/datums/components/crafting/recipes/recipes_clothing.dm @@ -287,7 +287,7 @@ name = "Durathread Reinforcement Kit" result = /obj/item/armorkit reqs = list(/obj/item/stack/sheet/durathread = 4) - tools = list(/obj/item/stack/sheet/mineral/titanium, TOOL_WIRECUTTER) // tough needle for a tough fabric + tools = list(TOOL_WIRECUTTER) time = 40 category = CAT_CLOTHING diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 9c542b505c..920886cc74 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -34,6 +34,7 @@ RegisterSignal(parent, COMSIG_MOB_HUD_CREATED, .proc/modify_hud) RegisterSignal(parent, COMSIG_MOB_DEATH, .proc/stop_processing) RegisterSignal(parent, COMSIG_VOID_MASK_ACT, .proc/direct_sanity_drain) + RegisterSignal(parent, COMSIG_ENTER_AREA, .proc/update_beauty) if(owner.hud_used) @@ -355,7 +356,7 @@ if(ETHEREAL_CHARGE_OVERLOAD to ETHEREAL_CHARGE_DANGEROUS) add_event(null, "charge", /datum/mood_event/supercharged) -/datum/component/mood/proc/update_beauty(area/A) +/datum/component/mood/proc/update_beauty(datum/source, area/A) if(A.outdoors) //if we're outside, we don't care. clear_event(null, "area_beauty") return FALSE diff --git a/code/datums/elements/connect_loc.dm b/code/datums/elements/connect_loc.dm new file mode 100644 index 0000000000..fee9072f75 --- /dev/null +++ b/code/datums/elements/connect_loc.dm @@ -0,0 +1,43 @@ +/// This element hooks a signal onto the loc the current object is on. +/// When the object moves, it will unhook the signal and rehook it to the new object. +/datum/element/connect_loc + element_flags = ELEMENT_BESPOKE + id_arg_index = 2 + + /// An assoc list of signal -> procpath to register to the loc this object is on. + var/list/connections + +/datum/element/connect_loc/Attach(atom/movable/listener, list/connections) + . = ..() + if (!istype(listener)) + return ELEMENT_INCOMPATIBLE + + src.connections = connections + + RegisterSignal(listener, COMSIG_MOVABLE_MOVED, .proc/on_moved, override = TRUE) + update_signals(listener) + +/datum/element/connect_loc/Detach(atom/movable/listener) + . = ..() + unregister_signals(listener, listener.loc) + UnregisterSignal(listener, COMSIG_MOVABLE_MOVED) + +/datum/element/connect_loc/proc/update_signals(atom/movable/listener) + var/atom/listener_loc = listener.loc + if(isnull(listener_loc)) + return + + for (var/signal in connections) + //override=TRUE because more than one connect_loc element instance tracked object can be on the same loc + listener.RegisterSignal(listener_loc, signal, connections[signal], override=TRUE) + +/datum/element/connect_loc/proc/unregister_signals(datum/listener, atom/old_loc) + if(isnull(old_loc)) + return + + listener.UnregisterSignal(old_loc, connections) + +/datum/element/connect_loc/proc/on_moved(atom/movable/listener, atom/old_loc) + SIGNAL_HANDLER + unregister_signals(listener, old_loc) + update_signals(listener) diff --git a/code/datums/elements/object_reskinning.dm b/code/datums/elements/object_reskinning.dm new file mode 100644 index 0000000000..8b5d905e72 --- /dev/null +++ b/code/datums/elements/object_reskinning.dm @@ -0,0 +1,104 @@ +/* + * # Element: Object Reskinning + * + * Allows players to modify the appearance of their object (and other attributes if possible) + * PLEASE DO NOT HAVE INVALID VALUES IN unique_reskin I DON'T EVEN WANT TO KNOW WHAT HAPPENS. + * USAGE: + * unique_reskins = list( + * "skin 1" = list( + * "desc" = "very cool description", + * "icon" = 'very_cool_icon.dmi' + * ), + * "skin 2" = list( + * "desc" = "not as cool description", + * "icon" = 'the_boring_skin.dmi' + * ) + * ) +*/ +/datum/element/object_reskinning + element_flags = ELEMENT_DETACH + +/datum/element/object_reskinning/Attach(datum/target) + . = ..() + var/obj/the_obj = target + if(!istype(the_obj)) + return ELEMENT_INCOMPATIBLE + if(!islist(the_obj.unique_reskin) || !length(the_obj.unique_reskin)) + message_admins("[src] was given to an object without any unique reskins, if you really need to, give it a couple skins first.") + return ELEMENT_INCOMPATIBLE + + RegisterSignal(the_obj, COMSIG_PARENT_EXAMINE, .proc/on_examine) + RegisterSignal(the_obj, the_obj.reskin_binding, .proc/reskin) + +/datum/element/object_reskinning/Detach(datum/source, force) + var/obj/being_deleted = source + UnregisterSignal(source, list(COMSIG_PARENT_EXAMINE, being_deleted.reskin_binding)) + return ..() + +/datum/element/object_reskinning/proc/on_examine(obj/obj, mob/user, list/examine_list) + examine_list += span_notice("[capitalize(replacetext(obj.reskin_binding, "_", "-"))] to reskin it ([length(obj.unique_reskin)] possible styles).") + if(obj.always_reskinnable) + examine_list += span_notice("It has no limit to reskinning.") + +/* + * Reskins an object according to user's choice. + * Will detach itself if there's no skins or if done successfully but not always reskinnable. + * + * Arguments: + * * to_reskin The object we will be reskinning + * * user The user who wants to choose a skin for the object +*/ +/datum/element/object_reskinning/proc/reskin(obj/to_reskin, mob/user) + // Just stop early + if(!LAZYLEN(to_reskin.unique_reskin)) + message_admins("[ADMIN_LOOKUPFLW(user)] attempted to reskin an object that has no skins!") + Detach(to_reskin) + return FALSE + + // Can't use + if(!user.canUseTopic(to_reskin, BE_CLOSE, NO_DEXTERY, NO_TK)) + return FALSE + + // Get our choices + var/list/items = list() + for(var/reskin_option in to_reskin.unique_reskin) + var/image/item_image = image( + icon = to_reskin.unique_reskin[reskin_option]["icon"] ? to_reskin.unique_reskin[reskin_option]["icon"] : to_reskin.icon, + icon_state = to_reskin.unique_reskin[reskin_option]["icon_state"] ? to_reskin.unique_reskin[reskin_option]["icon_state"] : to_reskin.icon_state) + items += list("[reskin_option]" = item_image) + sortList(items) + + // Display to the user + var/pick = show_radial_menu(user, to_reskin, items, custom_check = CALLBACK(src, .proc/check_reskin_menu, user, to_reskin), radius = 38, require_near = TRUE) + if(!pick) + return FALSE + + // Finish the work + to_reskin.current_skin = pick + for(var/reskin_var in to_reskin.unique_reskin[pick]) + to_reskin.vars[reskin_var] = to_reskin.unique_reskin[pick][reskin_var] + to_chat(user, "[to_reskin] is now skinned as '[pick].'") + to_reskin.reskin_obj(user) + + // Only once or always? + if(!to_reskin.always_reskinnable) + Detach(to_reskin) + return TRUE + +/** + * Checks if we are allowed to interact with a radial menu for reskins + * + * Arguments: + * * user The mob interacting with the menu + * * obj The obj to be checking against + */ +/datum/element/object_reskinning/proc/check_reskin_menu(mob/user, obj/obj) + if(QDELETED(obj)) + return FALSE + if(!obj.always_reskinnable && obj.current_skin) + return FALSE + if(!istype(user)) + return FALSE + if(user.incapacitated()) + return FALSE + return TRUE diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index 3bcca275a5..5b00d2e71e 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -181,16 +181,47 @@ /datum/quirk/trandening name = "High Luminosity Eyes" - desc = "When the next big fancy implant came out you had to buy one on impluse!" + desc = "When the next big fancy implant came out you had to buy one on impulse! You start the shift with emissive cybernetic eyes that can emit colored beams of light." value = 1 - gain_text = "You have to keep up with the next big thing!." - lose_text = "High-tech gizmos are a scam..." + gain_text = "You've been keeping up with the latest cybernetic trends!" + lose_text = "High powered eye lasers? What were you thinking..." /datum/quirk/trandening/on_spawn() - var/mob/living/carbon/human/H = quirk_holder - var/obj/item/autosurgeon/gloweyes/gloweyes = new(get_turf(H)) - H.equip_to_slot(gloweyes, ITEM_SLOT_BACKPACK) - H.regenerate_icons() + // Get targets + var/obj/item/organ/eyes/old_eyes = quirk_holder.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/eyes/robotic/glow/new_eyes = new + + // Replace eyes + qdel(old_eyes) + new_eyes.Insert(quirk_holder) + +/datum/quirk/trandening/remove() + // Get targets + var/obj/item/organ/eyes/old_eyes = quirk_holder.getorganslot(ORGAN_SLOT_EYES) + var/mob/living/carbon/human/qurk_mob = quirk_holder + + // Check for eyes existing + if(!old_eyes) + return + + // Check for quirk eyes + if(!istype(old_eyes, /obj/item/organ/eyes/robotic/glow)) + return + + // Define new eyes + var/species_eyes = /obj/item/organ/eyes + + // Check for mutant eyes + if(qurk_mob.dna.species && qurk_mob.dna.species.mutanteyes) + // Set eyes to mutant type + species_eyes = qurk_mob.dna.species.mutanteyes + + // Create new eyes item + var/obj/item/organ/eyes/new_eyes = new species_eyes() + + // Replace eyes + qdel(old_eyes) + new_eyes.Insert(quirk_holder) /datum/quirk/bloodpressure name = "Polycythemia vera" diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 8d3acf0f6d..a30e27c8f8 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -43,27 +43,38 @@ GLOBAL_LIST_EMPTY(family_heirlooms) -/datum/quirk/family_heirloom/on_spawn() - var/mob/living/carbon/human/H = quirk_holder +/datum/quirk/family_heirloom/on_spawn() + // Define holder and type + var/mob/living/carbon/human/human_holder = quirk_holder var/obj/item/heirloom_type - var/species_heirloom_entry = GLOB.species_heirlooms[H.dna.species.id] - if(species_heirloom_entry) - if(prob(species_heirloom_entry[1])) - heirloom_type = pick(species_heirloom_entry[2]) + + // The quirk holder's species - we have a 50% chance, if we have a species with a set heirloom, to choose a species heirloom. + var/datum/species/holder_species = human_holder.dna?.species + if(holder_species && LAZYLEN(holder_species.family_heirlooms) && prob(50)) + heirloom_type = pick(holder_species.family_heirlooms) + else + // Our quirk holder's job + var/datum/job/holder_job = SSjob.GetJob(human_holder.last_mind?.assigned_role) + if(holder_job && LAZYLEN(holder_job.family_heirlooms)) + heirloom_type = pick(holder_job.family_heirlooms) + + // If we didn't find an heirloom somehow, throw them a generic one if(!heirloom_type) - var/job_heirloom_entry = GLOB.job_heirlooms[quirk_holder.mind.assigned_role] - if(!job_heirloom_entry) - heirloom_type = pick(GLOB.job_heirlooms["NO_JOB"]) //consider: should this be a define? - else - heirloom_type = pick(job_heirloom_entry) + heirloom_type = pick(/obj/item/toy/cards/deck, /obj/item/lighter, /obj/item/dice/d20) + + // Create the heirloom item heirloom = new heirloom_type(get_turf(quirk_holder)) + + // Add to global list GLOB.family_heirlooms += heirloom + + // Determine and assign item location var/list/slots = list( "in your left pocket" = ITEM_SLOT_LPOCKET, "in your right pocket" = ITEM_SLOT_RPOCKET, "in your backpack" = ITEM_SLOT_BACKPACK ) - where = H.equip_in_one_of_slots(heirloom, slots, FALSE) || "at your feet" + where = human_holder.equip_in_one_of_slots(heirloom, slots, FALSE) || "at your feet" /datum/quirk/family_heirloom/post_add() if(where == "in your backpack") @@ -75,13 +86,25 @@ GLOBAL_LIST_EMPTY(family_heirlooms) heirloom.name = "\improper [family_name[family_name.len]] family [heirloom.name]" /datum/quirk/family_heirloom/on_process() - if(heirloom in quirk_holder.GetAllContents()) + // Ignore for dead holder + if(quirk_holder.stat == DEAD) + return + + // When held: Positive mood + if(heirloom && (heirloom in quirk_holder.GetAllContents())) SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom_missing") SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "family_heirloom", /datum/mood_event/family_heirloom) + + // When not held: Negative mood else SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom") SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "family_heirloom_missing", /datum/mood_event/family_heirloom_missing) +/datum/quirk/item_quirk/family_heirloom/remove() + // Clear mood events when removing this quirk + SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom") + SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom_missing") + /datum/quirk/family_heirloom/clone_data() return heirloom diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index e5dd6d3e33..4db3d688ce 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -165,22 +165,7 @@ lose_text = "You no longer feel like you should be eating trash." mob_trait = TRAIT_TRASHCAN -/datum/quirk/colorist - name = "Colorist" - desc = "You like carrying around a hair dye spray to quickly apply color patterns to your hair." - value = 0 - medical_record_text = "Patient enjoys dyeing their hair with pretty colors." - -/datum/quirk/colorist/on_spawn() - var/mob/living/carbon/human/H = quirk_holder - var/obj/item/dyespray/spraycan = new(get_turf(quirk_holder)) - H.equip_to_slot(spraycan, ITEM_SLOT_BACKPACK) - H.regenerate_icons() - -/datum/quirk/colorist/post_add() - var/mob/living/carbon/human/H = quirk_holder - SEND_SIGNAL(H.back, COMSIG_TRY_STORAGE_SHOW, H) - to_chat(quirk_holder, "You brought some extra dye with you! It's in your bag if you forgot.") +// Moved Colorist quirk to a loadout item /datum/quirk/salt_sensitive name = "Sodium Sensitivity" diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 62b2a6da8d..e1d7737f5c 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -149,10 +149,11 @@ Class Procs: circuit = new circuit(src) circuit.apply_default_parts(src) - if(!speed_process && init_process) - START_PROCESSING(SSmachines, src) - else - START_PROCESSING(SSfastprocess, src) + if(init_process) // Required to prevent non-speed non-init machines from running + if(speed_process) + START_PROCESSING(SSfastprocess, src) + else + START_PROCESSING(SSmachines, src) RegisterSignal(src, COMSIG_ENTER_AREA, .proc/power_change) if (occupant_typecache) diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index bd7ae64e16..92040e3647 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -61,13 +61,16 @@ /obj/machinery/computer/aifixer/proc/Fix() use_power(1000) - occupier.adjustOxyLoss(-1, 0) - occupier.adjustFireLoss(-1, 0) - occupier.adjustToxLoss(-1, 0) - occupier.adjustBruteLoss(-1, 0) + occupier.adjustOxyLoss(-1, FALSE, FALSE) + occupier.adjustFireLoss(-1, FALSE, FALSE) + occupier.adjustBruteLoss(-5, FALSE) + occupier.updatehealth() if(occupier.health >= 0 && occupier.stat == DEAD) - occupier.revive() + occupier.revive(full_heal = FALSE, admin_revive = FALSE) + if(!occupier.radio_enabled) + occupier.radio_enabled = TRUE + to_chat(occupier, span_warning("Your Subspace Transceiver has been enabled!")) return occupier.health < 100 /obj/machinery/computer/aifixer/process() diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 031d730be6..91211d3d40 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -502,10 +502,6 @@ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) /obj/machinery/computer/cloning/proc/can_scan(datum/dna/dna, mob/living/mob_occupant, experimental = FALSE, datum/bank_account/account) - if(HAS_TRAIT(mob_occupant, TRAIT_NO_CLONE)) - scantemp = "Subject has an active DNC record on file. Unable to clone." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - return if(!istype(dna)) scantemp = "Unable to locate valid genetic data." playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index c925a57b59..cbd3965428 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -351,8 +351,9 @@ log_game("[key_name(usr)] enabled emergency maintenance access.") message_admins("[ADMIN_LOOKUPFLW(usr)] enabled emergency maintenance access.") deadchat_broadcast(" enabled emergency maintenance access at [span_name("[get_area_name(usr, TRUE)]")].", span_name("[usr.real_name]"), usr, message_type = DEADCHAT_ANNOUNCEMENT) + + if("toggleBought") var/boughtID = params["id"] - for(var/tracked_slave in GLOB.tracked_slaves) var/obj/item/electropack/shockcollar/slave/C = tracked_slave if (REF(C) == boughtID) // Get collar diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 1d7cbc7f53..966985c427 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -61,12 +61,17 @@ /obj/machinery/suit_storage_unit/engine suit_type = /obj/item/clothing/suit/space/hardsuit/engine mask_type = /obj/item/clothing/mask/breath - shoes_type= /obj/item/clothing/shoes/magboots + shoes_type = /obj/item/clothing/shoes/magboots + +/obj/machinery/suit_storage_unit/atmos + suit_type = /obj/item/clothing/suit/space/hardsuit/engine/atmos + mask_type = /obj/item/clothing/mask/breath + storage_type = /obj/item/watertank/atmos /obj/machinery/suit_storage_unit/ce suit_type = /obj/item/clothing/suit/space/hardsuit/engine/elite mask_type = /obj/item/clothing/mask/breath - shoes_type= /obj/item/clothing/shoes/magboots/advance + shoes_type = /obj/item/clothing/shoes/magboots/advance /obj/machinery/suit_storage_unit/security suit_type = /obj/item/clothing/suit/space/hardsuit/security @@ -165,7 +170,6 @@ /obj/machinery/suit_storage_unit/update_overlays() . = ..() - if(uv) if(uv_super) . += "super" @@ -182,7 +186,7 @@ . += "suit" if(helmet) . += "helm" - if(storage) + if(shoes || storage) . += "storage" else if(occupant) . += "human" @@ -199,7 +203,6 @@ helmet = null suit = null mask = null - shoes = null storage = null occupant = null @@ -210,109 +213,8 @@ new /obj/item/stack/sheet/metal(loc, 2) qdel(src) -/obj/machinery/suit_storage_unit/interact(mob/living/user) - var/static/list/items - - if (!items) - items = list( - "suit" = create_silhouette_of(/obj/item/clothing/suit/space/eva), - "helmet" = create_silhouette_of(/obj/item/clothing/head/helmet/space/eva), - "mask" = create_silhouette_of(/obj/item/clothing/mask/breath), - "shoes" = create_silhouette_of(/obj/item/clothing/shoes/magboots), - "storage" = create_silhouette_of(/obj/item/tank/internals/oxygen), - ) - - . = ..() - if (.) - return - - if (!check_interactable(user)) - return - - var/list/choices = list() - - if (locked) - choices["unlock"] = icon('modular_sand/icons/hud/radial.dmi', "radial_unlock") - else if (state_open) - choices["close"] = icon('modular_sand/icons/hud/radial.dmi', "radial_close") - - for (var/item_key in items) - var/item = vars[item_key] - if (item) - choices[item_key] = item - else - // If the item doesn't exist, put a silhouette in its place - choices[item_key] = items[item_key] - else - choices["open"] = icon('modular_sand/icons/hud/radial.dmi', "radial_open") - choices["disinfect"] = icon('modular_sand/icons/hud/radial.dmi', "radial_disinfect") - choices["lock"] = icon('modular_sand/icons/hud/radial.dmi', "radial_lock") - - var/choice = show_radial_menu( - user, - src, - choices, - custom_check = CALLBACK(src, .proc/check_interactable, user), - require_near = !issilicon(user), - ) - - if (!choice) - return - - switch (choice) - if ("open") - if (!state_open) - open_machine(drop = FALSE) - if (occupant) - dump_contents() - if ("close") - if (state_open) - close_machine() - if ("disinfect") - if (occupant && safeties) - return - else if (!helmet && !mask && !suit && !shoes && !storage && !occupant) - return - else - if (occupant) - var/mob/living/mob_occupant = occupant - to_chat(mob_occupant, "[src]'s confines grow warm, then hot, then scorching. You're being burned [!mob_occupant.stat ? "alive" : "away"]!") - cook() - if ("lock", "unlock") - if (!state_open) - locked = !locked - else - var/obj/item/item_to_dispense = vars[choice] - if (item_to_dispense) - vars[choice] = null - user.put_in_hands(item_to_dispense) - else - var/obj/item/in_hands = user.get_active_held_item() - if (in_hands) - attackby(in_hands, user) - - interact(user) - -/obj/machinery/suit_storage_unit/proc/check_interactable(mob/user) - if (!state_open && !can_interact(user)) - return FALSE - - if (panel_open) - return FALSE - - if (uv) - return FALSE - - return TRUE - -/obj/machinery/suit_storage_unit/proc/create_silhouette_of(atom/item) - var/image/image = image(initial(item.icon), initial(item.icon_state)) - image.alpha = 128 - image.color = COLOR_RED - return image - -/obj/machinery/suit_storage_unit/MouseDrop_T(atom/A, mob/living/user) - if(!istype(user) || user.stat || !Adjacent(user) || !Adjacent(A) || !isliving(A)) +/obj/machinery/suit_storage_unit/MouseDrop_T(atom/A, mob/user) + if(user.stat || user.lying || !Adjacent(user) || !Adjacent(A) || !isliving(A)) return var/mob/living/target = A if(!state_open) @@ -525,15 +427,93 @@ return ..() -/* ref tg-git issue #45036 - screwdriving it open while it's running a decontamination sequence without closing the panel prior to finish - causes the SSU to break due to state_open being set to TRUE at the end, and the panel becoming inaccessible. -*/ -/obj/machinery/suit_storage_unit/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/I) - if(!(flags_1 & NODECONSTRUCT_1) && I.tool_behaviour == TOOL_SCREWDRIVER && uv) - to_chat(user, "It might not be wise to fiddle with [src] while it's running...") - return TRUE - return ..() +/obj/machinery/suit_storage_unit/ui_state(mob/user) + return GLOB.notcontained_state + +/obj/machinery/suit_storage_unit/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "SuitStorageUnit", name) + ui.open() + +/obj/machinery/suit_storage_unit/ui_data() + var/list/data = list() + data["locked"] = locked + data["open"] = state_open + data["safeties"] = safeties + data["uv_active"] = uv + data["uv_super"] = uv_super + if(helmet) + data["helmet"] = helmet.name + else + data["helmet"] = null + if(suit) + data["suit"] = suit.name + else + data["suit"] = null + if(mask) + data["mask"] = mask.name + else + data["mask"] = null + if(shoes) + data["shoes"] = shoes.name + else + data["shoes"] = null + if(storage) + data["storage"] = storage.name + else + data["storage"] = null + if(occupant) + data["occupied"] = TRUE + else + data["occupied"] = FALSE + return data + +/obj/machinery/suit_storage_unit/ui_act(action, params) + if(..() || uv) + return + switch(action) + if("door") + if(state_open) + close_machine() + else + open_machine(0) + if(occupant) + dump_contents() // Dump out contents if someone is in there. + . = TRUE + if("lock") + if(state_open) + return + locked = !locked + . = TRUE + if("uv") + if(occupant && safeties) + return + else if(!helmet && !mask && !suit && !storage && !occupant) + return + else + if(occupant) + var/mob/living/mob_occupant = occupant + to_chat(mob_occupant, "[src]'s confines grow warm, then hot, then scorching. You're being burned [!mob_occupant.stat ? "alive" : "away"]!") + cook() + . = TRUE + if("dispense") + if(!state_open) + return + + var/static/list/valid_items = list("helmet", "suit", "mask", "shoes", "storage") + var/item_name = params["item"] + if(item_name in valid_items) + var/obj/item/I = vars[item_name] + vars[item_name] = null + if(I) + var/mob/living/living_person = usr + if(!istype(living_person)) + return + if(!istype(living_person) || !Adjacent(living_person) || !living_person.put_in_active_hand(I)) + I.forceMove(loc) + . = TRUE + update_icon() /obj/machinery/suit_storage_unit/default_pry_open(obj/item/I)//needs to check if the storage is locked. . = !(state_open || panel_open || is_operational() || locked || (flags_1 & NODECONSTRUCT_1)) && I.tool_behaviour == TOOL_CROWBAR diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index eeef55941f..96a26e704c 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -399,7 +399,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb if(throwing) throwing.finalize(FALSE) if(loc == user) - if(!user.temporarilyRemoveItemFromInventory(I = src)) + if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(src)) return . = FALSE @@ -428,7 +428,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb if(throwing) throwing.finalize(FALSE) if(loc == user) - if(!user.temporarilyRemoveItemFromInventory(src)) + if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(I = src)) return pickup(user) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 7b2143cf86..f44860d769 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -42,7 +42,7 @@ var/static/list/runes = list("rune1","rune2","rune3","rune4","rune5","rune6") var/static/list/randoms = list(RANDOM_ANY, RANDOM_RUNE, RANDOM_ORIENTED, RANDOM_NUMBER, RANDOM_GRAFFITI, RANDOM_LETTER, RANDOM_SYMBOL, RANDOM_PUNCTUATION, RANDOM_DRAWING) - var/static/list/graffiti_large_h = list("yiffhell", "secborg", "paint") + var/static/list/graffiti_large_h = list("yiffhell", "furrypride", "secborg", "paint") var/static/list/all_drawables = graffiti + symbols + drawings + oriented + runes + graffiti_large_h diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index ab1ef6f001..b7ac29562c 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -32,6 +32,9 @@ GLOBAL_LIST_EMPTY(PDAs) armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF | ACID_PROOF + always_reskinnable = TRUE + reskin_binding = COMSIG_CLICK_CTRL_SHIFT + //Main variables var/owner = null // String name of owner var/default_cartridge = 0 // Access level defined by cartridge @@ -112,10 +115,10 @@ GLOBAL_LIST_EMPTY(PDAs) . += id ? "Alt-click to remove the id." : "" if(inserted_item && (!isturf(loc))) . += "Ctrl-click to remove [inserted_item]." - if(LAZYLEN(GLOB.pda_reskins)) - . += "Ctrl-shift-click it to reskin it." /obj/item/pda/Initialize(mapload) + if(GLOB.pda_reskins) + unique_reskin = GLOB.pda_reskins . = ..() if(fon) set_light(f_lum, f_pow, f_col) @@ -130,28 +133,10 @@ GLOBAL_LIST_EMPTY(PDAs) new_overlays = TRUE update_icon() -/obj/item/pda/CtrlShiftClick(mob/living/user) - . = ..() - if(GLOB.pda_reskins && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) - reskin_obj(user) - /obj/item/pda/reskin_obj(mob/M) - if(!LAZYLEN(GLOB.pda_reskins)) - return - var/dat = "Reskin options for [name]:" - for(var/V in GLOB.pda_reskins) - var/output = icon2html(GLOB.pda_reskins[V], M, icon_state) - dat += "\n[V]: [output]" - to_chat(M, dat) - - var/choice = input(M, "Choose the a reskin for [src]","Reskin Object") as null|anything in GLOB.pda_reskins - var/new_icon = GLOB.pda_reskins[choice] - if(QDELETED(src) || isnull(new_icon) || new_icon == icon || !M.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - return - icon = new_icon + . = ..() new_overlays = TRUE update_icon() - to_chat(M, "[src] is now skinned as '[choice]'.") /obj/item/pda/proc/set_new_overlays() if(!overlays_offsets || !(icon in overlays_offsets)) @@ -191,7 +176,7 @@ GLOBAL_LIST_EMPTY(PDAs) else font_index = MODE_MONO font_mode = FONT_MONO - var/pref_skin = GLOB.pda_reskins[C.prefs.pda_skin] + var/pref_skin = GLOB.pda_reskins[C.prefs.pda_skin]["icon"] if(icon != pref_skin) icon = pref_skin new_overlays = TRUE diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 9ab6115634..c5e92349c7 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -67,6 +67,9 @@ // when we get this many shards, we get a free bulb. var/shards_required = 4 + // whether it is "bluespace powered" (can be used at a range) + var/bluespace_toggle = FALSE + /obj/item/lightreplacer/New() uses = max_uses / 2 failmsg = "The [name]'s refill light blinks red." @@ -242,7 +245,7 @@ /obj/item/lightreplacer/afterattack(atom/T, mob/U, proximity) . = ..() - if(!proximity) + if(!proximity && !bluespace_toggle) return if(!isturf(T)) return @@ -253,6 +256,18 @@ break used = TRUE if(istype(A, /obj/machinery/light)) + if(!proximity && bluespace_toggle) + // Set variable for target light + var/obj/machinery/light/target = A + + // Check light status before playing effects + if(target.status != LIGHT_OK) + // Display RPED beam + U.Beam(A, icon_state = "rped_upgrade", time = 1 SECONDS) + + // Play RPED sound + playsound(src, 'sound/items/pshoom.ogg', 40, 1) + ReplaceLight(A, U) if(!used) @@ -266,6 +281,15 @@ /obj/item/lightreplacer/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J) return +/obj/item/lightreplacer/blue + name = "bluespace light replacer" + desc = "A modified light replacer that zaps lights into place. Refill with broken or working lightbulbs, or sheets of glass." + icon_state = "lightreplacer_blue" + bluespace_toggle = TRUE + +/obj/item/lightreplacer/blue/emag_act() + return // balancing against longrange explosions + #undef LIGHT_OK #undef LIGHT_EMPTY #undef LIGHT_BROKEN diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 4930f39b31..b389efe542 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -193,34 +193,29 @@ /obj/item/melee/transforming/energy/sword/saber possible_colors = list("red" = LIGHT_COLOR_RED, "blue" = LIGHT_COLOR_LIGHT_CYAN, "green" = LIGHT_COLOR_GREEN, "purple" = LIGHT_COLOR_LAVENDER) - unique_reskin = list("Sword" = "sword0", "Saber" = "esaber0") + unique_reskin = list( + "Sword" = list("icon_state" = "sword0"), + "Saber" = list("icon_state" = "esaber0") + ) var/hacked = FALSE - var/saber = FALSE /obj/item/melee/transforming/energy/sword/saber/transform_weapon(mob/living/user, supress_message_text) . = ..() if(.) - if(active) - if(sword_color) - if(saber) - icon_state = "esaber[sword_color]" - else - icon_state = "sword[sword_color]" - else - if(saber) - icon_state = "esaber0" + switch(current_skin) + if("Saber") + icon_state = "esaber[active ? sword_color : "0"]" + // No skin else - icon_state = "sword0" + icon_state = "sword[active ? sword_color : "0"]" /obj/item/melee/transforming/energy/sword/saber/reskin_obj(mob/M) . = ..() - if(icon_state == "esaber0") - saber = TRUE - if(active) - if(saber) - icon_state = "esaber[sword_color]" - else - icon_state = "sword[sword_color]" + switch(current_skin) + if("Sword") + icon_state = "sword[active ? sword_color : "0"]" + if("Saber") + icon_state = "esaber[active ? sword_color : "0"]" /obj/item/melee/transforming/energy/sword/saber/set_sword_color(var/color_forced) if(color_forced) // wow i really do not like this at fucking all holy SHIT diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index 62a3530afe..9b0506855f 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -91,7 +91,7 @@ name = "advanced mop" mopcap = 10 icon_state = "advmop" - item_state = "mop" + item_state = "advmop" lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' force = 6 diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index bcfcbe20f8..0381779531 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -55,8 +55,9 @@ generate_items_inside(items_inside,src) /obj/item/storage/firstaid/ancient - icon_state = "firstaid" - desc = "A first aid kit with the ability to heal common types of injuries." + name = "ancient first-aid kit" + icon_state = "oldfirstaid" + desc = "A first aid kit with the ability to heal common types of injuries. You start thinking of the good old days just by looking at it." /obj/item/storage/firstaid/ancient/PopulateContents() if(empty) @@ -69,6 +70,10 @@ new /obj/item/stack/medical/mesh(src) new /obj/item/stack/medical/mesh(src) +/obj/item/storage/firstaid/ancient/heirloom + // Long since been ransacked by hungry powergaming assistants breaking into med storage + empty = TRUE + /obj/item/storage/firstaid/brute name = "trauma treatment kit" desc = "A first aid kit for when you get toolboxed." diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 4ea25bec96..cfe1afad5a 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -28,9 +28,17 @@ var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF var/persistence_replacement //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset. - var/current_skin //the item reskin - var/list/unique_reskin //List of options to reskin. + + //Reskin variables + /// The item reskin + var/current_skin + /// List of options to reskin. + var/list/unique_reskin + /// Can always be modified var/always_reskinnable = FALSE + /// How to bring up the reskinning menu + var/reskin_binding = COMSIG_CLICK_ALT + // // Access levels, used in modules\jobs\access.dm var/list/req_access @@ -76,6 +84,10 @@ var/turf/T = loc T.add_blueprints_preround(src) +/obj/ComponentInitialize() + . = ..() + if(islist(unique_reskin) && length(unique_reskin)) + AddElement(/datum/element/object_reskinning) /obj/Destroy(force=FALSE) if(!ismachinery(src)) @@ -340,50 +352,10 @@ . = ..() if(obj_flags & UNIQUE_RENAME) . += "Use a pen on it to rename it or change its description." - if(unique_reskin && (!current_skin || always_reskinnable)) - . += "Alt-click it to reskin it." -/obj/AltClick(mob/user) - . = ..() - if(unique_reskin && (!current_skin || always_reskinnable) && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) - reskin_obj(user) - return TRUE - -/obj/proc/reskin_obj(mob/M) - if(!LAZYLEN(unique_reskin)) - return - - var/list/items = list() - for(var/reskin_option in unique_reskin) - var/image/item_image = image(icon = src.icon, icon_state = unique_reskin[reskin_option]) - items += list("[reskin_option]" = item_image) - sortList(items) - - var/pick = show_radial_menu(M, src, items, custom_check = CALLBACK(src, .proc/check_reskin_menu, M), radius = 38, require_near = TRUE) - if(!pick) - return - if(!unique_reskin[pick]) - return - current_skin = pick - icon_state = unique_reskin[pick] - to_chat(M, "[src] is now skinned as '[pick].'") - -/** - * Checks if we are allowed to interact with a radial menu for reskins - * - * Arguments: - * * user The mob interacting with the menu - */ -/obj/proc/check_reskin_menu(mob/user) - if(QDELETED(src)) - return FALSE - if(current_skin) - return FALSE - if(!istype(user)) - return FALSE - if(user.incapacitated()) - return FALSE - return TRUE +/// Do you want to make overrides, of course you do! Will be called if an object was reskinned successfully +/obj/proc/reskin_obj(mob/user) + return /obj/update_overlays() . = ..() diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index c5802b5086..d62528ebf8 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -15,9 +15,12 @@ var/obj/structure/chair/C = new /obj/structure/chair(loc) W.play_tool_sound(src) C.setDir(dir) - part.forceMove(loc) - part.master = null - part = null + + if (part) + part.forceMove(loc) + part.master = null + part = null + qdel(src) /obj/structure/chair/e_chair/proc/shock() @@ -44,3 +47,9 @@ to_chat(buckled_mob, "You feel a deep shock course through your body!") addtimer(CALLBACK(buckled_mob, /mob/living.proc/electrocute_act, 85, src, 1), 1) visible_message("The electric chair went off!", "You hear a deep sharp shock!") + +/obj/structure/chair/e_chair/Destroy() + if(part) + QDEL_NULL(part) + + return ..() diff --git a/code/modules/admin/view_variables/modify_variables.dm b/code/modules/admin/view_variables/modify_variables.dm index b9de3e09bc..54af2a9481 100644 --- a/code/modules/admin/view_variables/modify_variables.dm +++ b/code/modules/admin/view_variables/modify_variables.dm @@ -360,6 +360,9 @@ GLOBAL_PROTECT(VVpixelmovement) var/original_name = "[O]" + var/var_old_text + var/var_new_text + switch(class) if(VV_LIST) if(!islist(var_value)) @@ -376,14 +379,25 @@ GLOBAL_PROTECT(VVpixelmovement) for(var/V in varsvars) var_new = replacetext(var_new,"\[[V]]","[O.vars[V]]") + if(VV_BITFIELD) + var/list/old_bitfields + for(var/bitfield in GLOB.bitfields[variable]) + if(var_value & GLOB.bitfields[variable][bitfield]) + LAZYADD(old_bitfields, bitfield) + var_old_text = "\n[var_value] = \n([english_list(old_bitfields, and_text = " | ", comma_text=" | ")])\n" + var/list/new_bitfields + for(var/bitfield in GLOB.bitfields[variable]) + if(var_new & GLOB.bitfields[variable][bitfield]) + LAZYADD(new_bitfields, bitfield) + var_new_text = "\n[var_new] = \n([english_list(new_bitfields, and_text = " | ", comma_text=" | ")])" if (O.vv_edit_var(variable, var_new) == FALSE) to_chat(src, "Your edit was rejected by the object.", confidential = TRUE) return vv_update_display(O, "varedited", VV_MSG_EDITED) - log_world("### VarEdit by [key_name(src)]: [O.type] [variable]=[var_value] => [var_new]") - log_admin("[key_name(src)] modified [original_name]'s [variable] from [html_encode("[var_value]")] to [html_encode("[var_new]")]") - var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] from [var_value] to [var_new]" + log_world("### VarEdit by [key_name(src)]: [O.type] [variable]=[var_old_text ? var_old_text : var_value] => [var_new_text ? var_new_text : var_new]") + log_admin("[key_name(src)] modified [original_name]'s [variable] from [html_encode("[var_old_text ? var_old_text : var_value]")] to [html_encode("[var_new_text ? var_new_text : var_new]")]") + var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] from [var_old_text ? var_old_text : var_value] to [var_new_text ? var_new_text : var_new]" message_admins(msg) admin_ticket_log(O, msg) return TRUE diff --git a/code/modules/arousal/arousal.dm b/code/modules/arousal/arousal.dm index c4abf94043..b1d8815696 100644 --- a/code/modules/arousal/arousal.dm +++ b/code/modules/arousal/arousal.dm @@ -99,10 +99,10 @@ to_chat(src,"Your [G.name] cannot cum.") return if(mb_time) //as long as it's not instant, give a warning - to_chat(src,"You feel yourself about to orgasm.") + to_chat(src, span_userlove("You feel yourself about to orgasm.")) if(!do_after(src, mb_time, target = src) || !G.climaxable(src, TRUE)) return - to_chat(src,"You climax[isturf(loc) ? " onto [loc]" : ""] with your [G.name].") + to_chat(src, span_userlove("You climax[isturf(loc) ? " onto [loc]" : ""] with your [G.name].")) do_climax(fluid_source, loc, G) /mob/living/carbon/human/proc/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage = TRUE, mb_time = 30, obj/item/organ/genital/Lgen = null) //Used for climaxing with any living thing @@ -110,16 +110,16 @@ if(!fluid_source) return if(mb_time) //Skip warning if this is an instant climax. - to_chat(src,"You're about to climax [(Lgen) ? "in [L]'s [Lgen.name]" : "with [L]"]!") - to_chat(L,"[src] is about to climax [(Lgen) ? "in your [Lgen.name]" : "with you"]!") + to_chat(src, span_userlove("You're about to climax [(Lgen) ? "in [L]'s [Lgen.name]" : "with [L]"]!")) + to_chat(L, span_userlove("[src] is about to climax [(Lgen) ? "in your [Lgen.name]" : "with you"]!")) if(!do_after(src, mb_time, target = src) || !in_range(src, L) || !G.climaxable(src, TRUE)) return if(spillage) - to_chat(src,"You orgasm with [L], spilling out of [(Lgen) ? "[L.p_their()] [Lgen.name]" : "[L.p_them()]"], using your [G.name].") - to_chat(L,"[src] climaxes [(Lgen) ? "in your [Lgen.name]" : "with you"], overflowing and spilling, using [p_their()] [G.name]!") + to_chat(src, span_userlove("You orgasm with [L], spilling out of [(Lgen) ? "[L.p_their()] [Lgen.name]" : "[L.p_them()]"], using your [G.name].")) + to_chat(L, span_userlove("[src] climaxes [(Lgen) ? "in your [Lgen.name]" : "with you"], overflowing and spilling, using [p_their()] [G.name]!")) else //knots and other non-spilling orgasms - to_chat(src,"You climax [(Lgen) ? "in [L]'s [Lgen.name]" : "with [L]"], your [G.name] spilling nothing.") - to_chat(L,"[src] climaxes [(Lgen) ? "in your [Lgen.name]" : "with you"], [p_their()] [G.name] spilling nothing!") + to_chat(src, span_userlove("You climax [(Lgen) ? "in [L]'s [Lgen.name]" : "with [L]"], your [G.name] spilling nothing.")) + to_chat(L, span_userlove("[src] climaxes [(Lgen) ? "in your [Lgen.name]" : "with you"], [p_their()] [G.name] spilling nothing!")) //SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) //Sandstorm edit do_climax(fluid_source, spillage ? loc : L, G, spillage,, Lgen) //L.receive_climax(src, Lgen, G, spillage) @@ -129,10 +129,10 @@ if(!fluid_source) return if(mb_time) - to_chat(src,"You start to [G.masturbation_verb] your [G.name] over [container].") + to_chat(src, span_userlove("You start to [G.masturbation_verb] your [G.name] over [container].")) if(!do_after(src, mb_time, target = src) || !in_range(src, container) || !G.climaxable(src, TRUE)) return - to_chat(src,"You used your [G.name] to fill [container].") + to_chat(src, span_userlove("You used your [G.name] to fill [container].")) message_admins("[ADMIN_LOOKUPFLW(src)] used [p_their()] [G.name] to fill [container] with [G.get_fluid_name()].") log_consent("[key_name(src)] used their [G.name] to fill [container].") do_climax(fluid_source, container, G, FALSE, cover = TRUE) diff --git a/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm index 142e036562..ffe2e1ce42 100644 --- a/code/modules/arousal/genitals.dm +++ b/code/modules/arousal/genitals.dm @@ -167,9 +167,9 @@ var/original_state = picked_organ.aroused_state picked_organ.set_aroused_state(!picked_organ.aroused_state) if(original_state != picked_organ.aroused_state) - to_chat(src,"[picked_organ.aroused_state ? picked_organ.arousal_verb : picked_organ.unarousal_verb].") + to_chat(src, span_userlove("[picked_organ.aroused_state ? picked_organ.arousal_verb : picked_organ.unarousal_verb].")) else - to_chat(src,"You can't make that genital [picked_organ.aroused_state ? "unaroused" : "aroused"]!") + to_chat(src, span_userlove("You can't make that genital [picked_organ.aroused_state ? "unaroused" : "aroused"]!")) picked_organ.update_appearance() if(ishuman(src)) var/mob/living/carbon/human/human = src diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm index e18909c9a2..d9bc80761b 100644 --- a/code/modules/assembly/shock_kit.dm +++ b/code/modules/assembly/shock_kit.dm @@ -27,8 +27,10 @@ return TRUE /obj/item/assembly/shock_kit/attack_self(mob/user) - part1.attack_self(user) - part2.attack_self(user) + if (part1) + part1.attack_self(user) + if (part2) + part2.attack_self(user) add_fingerprint(user) return diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 2c1902d4cc..0be44958f2 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -237,34 +237,45 @@ SSair.high_pressure_delta[src] = TRUE /turf/open/proc/high_pressure_movements() - var/diff = pressure_difference + var/atom/movable/M + var/multiplier = 1 if(locate(/obj/structure/rack) in src) - diff *= 0.1 + multiplier *= 0.1 else if(locate(/obj/structure/table) in src) - diff *= 0.2 - for(var/obj/M in src) - if(!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired) - M.experience_pressure_difference(diff, pressure_direction, 0, pressure_specific_target) - for(var/mob/M in src) - if(!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired) - M.experience_pressure_difference(diff, pressure_direction, 0, pressure_specific_target) - /* + multiplier *= 0.2 + for(var/thing in src) + M = thing + if (!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired) + M.experience_pressure_difference(pressure_difference * multiplier, pressure_direction, 0, pressure_specific_target) + if(pressure_difference > 100) new /obj/effect/temp_visual/dir_setting/space_wind(src, pressure_direction, clamp(round(sqrt(pressure_difference) * 2), 10, 255)) - */ + /atom/movable/var/pressure_resistance = 10 /atom/movable/var/last_high_pressure_movement_air_cycle = 0 /atom/movable/proc/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0, throw_target) - var/const/PROBABILITY_OFFSET = 25 - var/const/PROBABILITY_BASE_PRECENT = 75 + set waitfor = FALSE + if(SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_PRESSURE_PUSH) & COMSIG_MOVABLE_BLOCKS_PRESSURE) + return + + var/const/PROBABILITY_OFFSET = 40 + var/const/PROBABILITY_BASE_PRECENT = 10 var/max_force = sqrt(pressure_difference)*(MOVE_FORCE_DEFAULT / 5) - set waitfor = 0 var/move_prob = 100 - if (pressure_resistance > 0) + if(pressure_resistance > 0) move_prob = (pressure_difference/pressure_resistance*PROBABILITY_BASE_PRECENT)-PROBABILITY_OFFSET move_prob += pressure_resistance_prob_delta - if (move_prob > PROBABILITY_OFFSET && prob(move_prob) && (move_resist != INFINITY) && (!anchored && (max_force >= (move_resist * MOVE_FORCE_PUSH_RATIO))) || (anchored && (max_force >= (move_resist * MOVE_FORCE_FORCEPUSH_RATIO)))) - step(src, direction) - + if(move_prob > PROBABILITY_OFFSET && prob(move_prob) && (move_resist != INFINITY) && (!anchored && (max_force >= (move_resist * MOVE_FORCE_PUSH_RATIO))) || (anchored && (max_force >= (move_resist * MOVE_FORCE_FORCEPUSH_RATIO)))) + var/move_force = max_force * clamp(move_prob, 0, 100) / 100 + if(move_force > 6000) + // WALLSLAM HELL TIME OH BOY + var/turf/throw_turf = get_ranged_target_turf(get_turf(src), direction, round(move_force / 2000)) + if(throw_target && (get_dir(src, throw_target) & direction)) + throw_turf = get_turf(throw_target) + var/throw_speed = clamp(round(move_force / 3000), 1, 10) + throw_at(throw_turf, move_force / 3000, throw_speed) + else + step(src, direction) + last_high_pressure_movement_air_cycle = SSair.times_fired diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm index ffa608f8fd..4079a6ffbe 100644 --- a/code/modules/cargo/bounties/science.dm +++ b/code/modules/cargo/bounties/science.dm @@ -8,7 +8,7 @@ name = "Trash Bag of Holding" description = "Nanotrasen would make good use of high-capacity trash bags. If you have any, please ship them." reward = 3000 - wanted_types = list(/obj/item/storage/backpack/holding) + wanted_types = list(/obj/item/storage/bag/trash/bluespace) /datum/bounty/item/science/bluespace_syringe name = "Bluespace Syringe" diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 5fc9a78b2d..4754a87e3c 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -477,6 +477,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["preferred_chaos"] >> preferred_chaos S["auto_ooc"] >> auto_ooc S["no_tetris_storage"] >> no_tetris_storage + S["recoil_screenshake"] >> recoil_screenshake // Splurt S["be_victim"] >> be_victim @@ -544,6 +545,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car cit_toggles = sanitize_integer(cit_toggles, 0, 16777215, initial(cit_toggles)) auto_ooc = sanitize_integer(auto_ooc, 0, 1, initial(auto_ooc)) no_tetris_storage = sanitize_integer(no_tetris_storage, 0, 1, initial(no_tetris_storage)) + recoil_screenshake = sanitize_integer(recoil_screenshake, 0, 800, initial(recoil_screenshake)) key_bindings = sanitize_islist(key_bindings, list()) modless_key_bindings = sanitize_islist(modless_key_bindings, list()) favorite_outfits = SANITIZE_LIST(favorite_outfits) @@ -677,6 +679,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["preferred_chaos"], preferred_chaos) WRITE_FILE(S["auto_ooc"], auto_ooc) WRITE_FILE(S["no_tetris_storage"], no_tetris_storage) + WRITE_FILE(S["recoil_screenshake"], recoil_screenshake) // Splurt WRITE_FILE(S["be_victim"], be_victim) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index f349eae02b..5afd5abe3e 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -82,12 +82,14 @@ if(M.putItemFromInventoryInHandIfPossible(src, H.held_index)) add_fingerprint(usr) + /obj/item/reagent_containers/food/snacks/clothing name = "oops" desc = "If you're reading this it means I messed up. This is related to moths eating clothes and I didn't know a better way to do it than making a new food object." list_reagents = list(/datum/reagent/consumable/nutriment = 1) tastes = list("dust" = 1, "lint" = 1) - +/* +MOVED TO: modular_splurt/code/module/clothing/clothing.dm /obj/item/clothing/attack(mob/M, mob/user, def_zone) if(user.a_intent != INTENT_HARM && isinsect(M)) var/obj/item/reagent_containers/food/snacks/clothing/clothing_as_food = new @@ -98,6 +100,9 @@ else return ..() + return ..() +*/ + /obj/item/clothing/attackby(obj/item/W, mob/user, params) if(damaged_clothes && istype(W, repairable_by)) var/obj/item/stack/S = W @@ -130,6 +135,7 @@ UnregisterSignal(user, COMSIG_MOVABLE_MOVED) to_chat(user, "You fix the damage on [src].") + /** * take_damage_zone() is used for dealing damage to specific bodyparts on a worn piece of clothing, meant to be called from [/obj/item/bodypart/proc/check_woundings_mods()] * diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 21004a163e..b2a7f91e96 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -27,6 +27,11 @@ if(glass_colour_type && ishuman(user)) . += "Alt-click to toggle its colors." +/obj/item/clothing/glasses/proc/prescribe() + vision_correction = TRUE + name = "prescription [name]" + desc += " These have been fitted with a prescription overlay device, and thus correct some vision deficiencies." + /obj/item/clothing/glasses/visor_toggling() ..() if(visor_vars_to_toggle & VISOR_VISIONFLAGS) @@ -128,10 +133,9 @@ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE glass_colour_type = /datum/client_colour/glass_colour/green -/obj/item/clothing/glasses/night/prescription - name = "prescription night vision goggles" - desc = "NVGs but for those with nearsightedness." - vision_correction = 1 +/obj/item/clothing/glasses/night/prescription/Initialize(mapload) + . = ..() + prescribe() /obj/item/clothing/glasses/night/syndicate name = "combat night vision goggles" @@ -233,6 +237,12 @@ icon_state = "circle_glasses" item_state = "circle_glasses" +/obj/item/clothing/glasses/regular/modern + name = "modern glasses" + desc = "A Dork. Co. revamp and/or revision of Nerd. Co.'s classic prescription glasses, with less opaque lenses." + icon_state = "glasses_alt" + item_state = "glasses_alt" + //Here lies green glasses, so ugly they died. RIP /obj/item/clothing/glasses/sunglasses diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index c848dbdfa8..733fc0195c 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -14,6 +14,7 @@ if(G.vision_correction) vision_correction = TRUE name = "prescription [name]" + desc += " These have been made with some form of vision-correcting eyewear, thus making them innately correct some vision deficiencies." return /obj/item/clothing/glasses/hud/equipped(mob/living/carbon/human/user, slot) @@ -55,13 +56,9 @@ hud_type = DATA_HUD_MEDICAL_ADVANCED glass_colour_type = /datum/client_colour/glass_colour/lightblue -/obj/item/clothing/glasses/hud/health/prescription - name = "prescription health scanner HUD" - desc = "A heads-up display, made with a prescription lens, that scans the humans in view and provides accurate data about their health status." - icon_state = "healthhud" - hud_type = DATA_HUD_MEDICAL_ADVANCED - vision_correction = 1 - glass_colour_type = /datum/client_colour/glass_colour/lightblue +/obj/item/clothing/glasses/hud/health/prescription/Initialize(mapload) + . = ..() + prescribe() /obj/item/clothing/glasses/hud/health/night name = "night vision health scanner HUD" @@ -88,9 +85,9 @@ tint = 1 glass_colour_type = /datum/client_colour/glass_colour/blue -/obj/item/clothing/glasses/hud/health/sunglasses/prescription - name = "prescription medical HUDSunglasses" - vision_correction = 1 +/obj/item/clothing/glasses/hud/health/sunglasses/prescription/Initialize(mapload) + . = ..() + prescribe() /obj/item/clothing/glasses/hud/health/eyepatch name = "eyepatch medHUD" @@ -117,17 +114,13 @@ flash_protect = 1 tint = 1 -/obj/item/clothing/glasses/hud/diagnostic/prescription - name = "prescription diagnostic HUD" - desc = "A heads-up display capable of analyzing the integrity and status of robotics and exosuits. This one has a prescription lens." - icon_state = "diagnostichud" - hud_type = DATA_HUD_DIAGNOSTIC_BASIC - vision_correction = 1 - glass_colour_type = /datum/client_colour/glass_colour/lightorange +/obj/item/clothing/glasses/hud/diagnostic/prescription/Initialize(mapload) + . = ..() + prescribe() -/obj/item/clothing/glasses/hud/diagnostic/sunglasses/prescription - name = "prescription diagnostic HUDSunglasses" - vision_correction = 1 +/obj/item/clothing/glasses/hud/diagnostic/sunglasses/prescription/Initialize(mapload) + . = ..() + prescribe() /obj/item/clothing/glasses/hud/diagnostic/night name = "night vision diagnostic HUD" @@ -155,13 +148,9 @@ hud_type = DATA_HUD_SECURITY_ADVANCED glass_colour_type = /datum/client_colour/glass_colour/red -/obj/item/clothing/glasses/hud/security/prescription - name = "prescription security HUD" - desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status and security records. This one has a prescription lens so you can see the banana peal that slipped you." - icon_state = "securityhud" - hud_type = DATA_HUD_SECURITY_ADVANCED - vision_correction = 1 - glass_colour_type = /datum/client_colour/glass_colour/red +/obj/item/clothing/glasses/hud/security/prescription/Initialize(mapload) + . = ..() + prescribe() /obj/item/clothing/glasses/hud/security/chameleon name = "chameleon security HUD" @@ -200,9 +189,9 @@ desc = "A heads-up display that connects directly to the optical nerve of the user, replacing the need for that useless eyeball." icon_state = "hudpatch" -/obj/item/clothing/glasses/hud/security/sunglasses/prescription - name = "prescription security HUDSunglasses" - vision_correction = 1 +/obj/item/clothing/glasses/hud/security/sunglasses/prescription/Initialize(mapload) + . = ..() + prescribe() /obj/item/clothing/glasses/hud/security/night name = "night vision security HUD" diff --git a/code/modules/clothing/glasses/prescription_kit.dm b/code/modules/clothing/glasses/prescription_kit.dm new file mode 100644 index 0000000000..9e324d34f0 --- /dev/null +++ b/code/modules/clothing/glasses/prescription_kit.dm @@ -0,0 +1,32 @@ +// don't you love single purpose files? i do too. + +/obj/item/prescription_kit + name = "prescription lens kit" + desc = "A disposable kit containing all the needed tools and parts to develop and apply a self-modifying prescription lens overlay device to any eyewear. \ + Insert eyewear, receive vision-correcting lenses." + icon = 'icons/obj/device.dmi' + icon_state = "modkit" + +/obj/item/prescription_kit/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/clothing/glasses) && I.Adjacent(user)) + var/obj/item/clothing/glasses/target_glasses = I + prescribe(target_glasses, user) + else + return ..() + +/obj/item/prescription_kit/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(istype(target, /obj/item/clothing/glasses) && target.Adjacent(user)) + var/obj/item/clothing/glasses/target_glasses = target + prescribe(target_glasses, user) + else + . = ..() + +/obj/item/prescription_kit/proc/prescribe(obj/item/clothing/glasses/target_glasses, mob/user) + if(target_glasses.vision_correction) + to_chat(user, span_notice("These are already fitted with prescription lenses or otherwise already correct vision!")) + return + playsound(src, 'sound/items/screwdriver.ogg', 50, 1) + user.visible_message(span_notice("[user] fits \the [target_glasses] with a prescription overlay device."), span_notice("You fit \the [target_glasses] with a prescription overlay device.")) + target_glasses.prescribe() + target_glasses.balloon_alert(user, "prescription fitted!") + qdel(src) diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index d3ad2ca4c7..efa00ef888 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -79,16 +79,18 @@ to_chat(user, "With [src] off of your arms, you feel less ready to punch things.") /obj/item/clothing/gloves/fingerless/pugilist/crafted - unique_reskin = list("Short" = "armwraps", - "Extended" = "armwraps_extended" - ) + unique_reskin = list( + "Short" = list("icon_state" = "armwraps"), + "Extended" = list("icon_state" = "armwraps_extended") + ) /obj/item/clothing/gloves/fingerless/pugilist/crafted/reskin_obj(mob/M) . = ..() - if(icon_state == "armwraps_extended") - item_state = "armwraps_extended" - else - return + switch(current_skin) + if("Short") + item_state = "armwraps" + if("Extended") + item_state = "armwraps_extended" /obj/item/clothing/gloves/fingerless/pugilist/chaplain name = "armwraps of unyielding resolve" diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index f3868f703f..0a626a0558 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -440,6 +440,16 @@ icon_state = "cowboyhat_sec" item_state= "cowboyhat_sec" +/obj/item/clothing/head/cowboyhat/polychromic + name = "polychromic cowboy hat" + desc = "A polychromic cowboy hat, perfect for your indecisive rancher" + icon_state = "cowboyhat_poly" + item_state= "cowboyhat_poly" + +/obj/item/clothing/head/cowboyhat/polychromic/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#5F5F5F", "#DDDDDD"), 2) + /obj/item/clothing/head/squatter_hat name = "slav squatter hat" icon_state = "squatter_hat" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index cdf5512fc6..7c1fc6fe3d 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -275,8 +275,10 @@ pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes actions_types = list(/datum/action/item_action/bhop) permeability_coefficient = 0.05 - unique_reskin = list("Explorer" = "miningjet", - "Jackboot" = "jetboots") + unique_reskin = list( + "Explorer" = list("icon_state" = "miningjet"), + "Jackboot" = list("icon_state" = "jetboots") + ) var/jumpdistance = 5 //-1 from to see the actual distance, e.g 4 goes over 3 tiles var/jumpspeed = 3 var/recharging_rate = 60 //default 6 seconds between each dash diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index c13a8bfa66..36795d53b8 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -80,9 +80,10 @@ item_state = "hostrench" flags_inv = 0 strip_delay = 80 - unique_reskin = list("Coat" = "hostrench", - "Cloak" = "trenchcloak" - ) + unique_reskin = list( + "Coat" = list("icon_state" = "hostrench"), + "Cloak" = list("icon_state" = "trenchcloak") + ) /obj/item/clothing/suit/armor/hos/platecarrier name = "plate carrier" diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index d1af3e4512..c87095e5ff 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -26,7 +26,6 @@ var/max_accessories = 3 var/list/obj/item/clothing/accessory/attached_accessories = list() var/list/mutable_appearance/accessory_overlays = list() - var/is_skirt = FALSE //SANDSTORM EDIT END /obj/item/clothing/under/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index b389e5db70..1b8b4d9e00 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -611,10 +611,15 @@ icon_state = "pride" above_suit = TRUE obj_flags = UNIQUE_RENAME - unique_reskin = list("Rainbow Pride" = "pride", - "Bisexual Pride" = "pride_bi", - "Pansexual Pride" = "pride_pan", - "Asexual Pride" = "pride_ace", - "Non-binary Pride" = "pride_enby", - "Transgender Pride" = "pride_trans", - ) + unique_reskin = list( + "Rainbow Pride" = list("icon_state" = "pride"), + "Bisexual Pride" = list("icon_state" = "pride_bi"), + "Pansexual Pride" = list("icon_state" = "pride_pan"), + "Asexual Pride" = list("icon_state" = "pride_ace"), + "Non-binary Pride" = list("icon_state" = "pride_enby"), + "Transgender Pride" = list("icon_state" = "pride_trans") + ) + +/obj/item/clothing/accessory/pride/reskin_obj(mob/M) + . = ..() + name = "[current_skin] pin" diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 6eac81ef9f..ce8c54a685 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -69,6 +69,9 @@ ///Is this job affected by weird spawns like the ones from station traits var/random_spawns_possible = TRUE + /// List of family heirlooms this job can get with the family heirloom quirk. List of types. + var/list/family_heirlooms + var/display_order = JOB_DISPLAY_ORDER_DEFAULT var/bounty_types = CIV_JOB_BASIC diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm index db5390f323..7ce29db178 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant.dm @@ -20,6 +20,11 @@ Assistant dresscodecompliant = FALSE always_can_respawn_as = TRUE threat = 0.2 + + family_heirlooms = list( + /obj/item/storage/toolbox/mechanical/old/heirloom, + /obj/item/clothing/gloves/cut/family + ) /datum/job/assistant/get_access() if(CONFIG_GET(flag/assistants_have_maint_access) || !CONFIG_GET(flag/jobs_have_minimal_access)) //Config has assistant maint access set diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index 9aa8ea07c4..551ac63d00 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -26,6 +26,12 @@ display_order = JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN threat = 0.5 + + family_heirlooms = list( + /obj/item/lighter, + /obj/item/lighter/greyscale, + /obj/item/storage/box/matches + ) /datum/outfit/job/atmos name = "Atmospheric Technician" diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm index 70ca762f39..40a1b20cb1 100644 --- a/code/modules/jobs/job_types/bartender.dm +++ b/code/modules/jobs/job_types/bartender.dm @@ -20,6 +20,12 @@ bounty_types = CIV_JOB_DRINK display_order = JOB_DISPLAY_ORDER_BARTENDER threat = 0.5 + + family_heirlooms = list( + /obj/item/reagent_containers/rag, + /obj/item/clothing/head/that, + /obj/item/reagent_containers/food/drinks/shaker + ) /datum/outfit/job/bartender name = "Bartender" diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm index 53502ee30e..7a43837cf4 100644 --- a/code/modules/jobs/job_types/botanist.dm +++ b/code/modules/jobs/job_types/botanist.dm @@ -20,6 +20,12 @@ display_order = JOB_DISPLAY_ORDER_BOTANIST threat = 1.5 // lol powergame + family_heirlooms = list( + /obj/item/cultivator, + /obj/item/reagent_containers/glass/bucket, // Watering cans don't exist yet + /obj/item/toy/plush/beeplushie, + ) + /datum/outfit/job/botanist name = "Botanist" jobtype = /datum/job/hydro diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index c3765260cc..65811d40a0 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -32,6 +32,11 @@ blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) threat = 5 + + family_heirlooms = list( + /obj/item/reagent_containers/food/drinks/flask/gold, + /obj/item/toy/figure/captain + ) /datum/job/captain/get_access() return get_all_accesses() diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index f8e2f74d80..1188669db5 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -21,6 +21,10 @@ display_order = JOB_DISPLAY_ORDER_CARGO_TECHNICIAN bounty_types = CIV_JOB_RANDOM threat = 0.2 + + family_heirlooms = list( + /obj/item/clipboard + ) /datum/outfit/job/cargo_tech name = "Cargo Technician" diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm index ef4f20765c..e7d602bd22 100644 --- a/code/modules/jobs/job_types/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -19,6 +19,11 @@ display_order = JOB_DISPLAY_ORDER_CHAPLAIN threat = 0.5 + + family_heirlooms = list( + /obj/item/toy/windupToolbox, + /obj/item/reagent_containers/food/drinks/bottle/holywater + ) /datum/job/chaplain/after_spawn(mob/living/H, client/C) diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index 209b3f82d0..9f830ba43c 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -24,6 +24,11 @@ threat = 1.5 starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery) + + family_heirlooms = list( + /obj/item/book/manual/wiki/chemistry, + /obj/item/fermichem/pHbooklet + ) /datum/outfit/job/chemist name = "Chemist" diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index 60b963d7ec..2949758d8a 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -37,6 +37,15 @@ display_order = JOB_DISPLAY_ORDER_CHIEF_ENGINEER blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/paraplegic, /datum/quirk/insanity) threat = 2 + + family_heirlooms = list( + /obj/item/clothing/head/hardhat, + /obj/item/screwdriver/brass/family, + /obj/item/wrench/brass/family, + /obj/item/weldingtool/mini, // No brass family variant + /obj/item/crowbar/brass/family, + /obj/item/wirecutters/brass/family + ) /datum/outfit/job/ce name = "Chief Engineer" diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 401b503110..f5170fc745 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -35,6 +35,15 @@ threat = 2 starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery) + + family_heirlooms = list( + /obj/item/storage/firstaid/ancient/heirloom, + /obj/item/scalpel, + /obj/item/hemostat, + /obj/item/circular_saw, + /obj/item/retractor, + /obj/item/cautery + ) /datum/outfit/job/cmo name = "Chief Medical Officer" diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm index 380215a93b..5631ce4624 100644 --- a/code/modules/jobs/job_types/clown.dm +++ b/code/modules/jobs/job_types/clown.dm @@ -21,6 +21,10 @@ display_order = JOB_DISPLAY_ORDER_CLOWN threat = 0 // honk + + family_heirlooms = list( + /obj/item/bikehorn/golden + ) /datum/outfit/job/clown name = "Clown" diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index 2a021e6575..9947c27ba9 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -22,6 +22,12 @@ display_order = JOB_DISPLAY_ORDER_COOK threat = 0.2 + family_heirlooms = list( + /obj/item/reagent_containers/food/condiment/saltshaker, + /obj/item/kitchen/rollingpin, + /obj/item/clothing/head/chefhat + ) + /datum/outfit/job/cook name = "Cook" jobtype = /datum/job/cook diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm index 254fc15bd4..e6e9394109 100644 --- a/code/modules/jobs/job_types/curator.dm +++ b/code/modules/jobs/job_types/curator.dm @@ -19,6 +19,11 @@ display_order = JOB_DISPLAY_ORDER_CURATOR threat = 0.3 + + family_heirlooms = list( + /obj/item/pen/fountain, + /obj/item/storage/dice + ) /datum/outfit/job/curator name = "Curator" diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index b56ebed191..2330e93147 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -27,6 +27,10 @@ display_order = JOB_DISPLAY_ORDER_DETECTIVE blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/monophobia) threat = 1 + + family_heirlooms = list( + /obj/item/reagent_containers/food/drinks/flask/det + ) /datum/outfit/job/detective name = "Detective" diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index 611c3f99cd..2529eaa024 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -24,6 +24,10 @@ threat = 1.5 starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery) + + family_heirlooms = list( + /obj/item/clothing/under/shorts/purple + ) /datum/outfit/job/geneticist name = "Geneticist" diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index b4339ab774..033c3ebfa4 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -39,6 +39,10 @@ blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/prosopagnosia, /datum/quirk/insanity) threat = 2 + + family_heirlooms = list( + /obj/item/reagent_containers/food/drinks/trophy/silver_cup + ) /datum/outfit/job/hop diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index ab58f20569..7839d1ecb9 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -38,6 +38,10 @@ display_order = JOB_DISPLAY_ORDER_HEAD_OF_SECURITY blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/blindness, /datum/quirk/monophobia, /datum/quirk/insanity) threat = 3 + + family_heirlooms = list( + /obj/item/book/manual/wiki/security_space_law + ) /datum/outfit/job/hos name = "Head of Security" diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm index c62c2e5b26..59c6997398 100644 --- a/code/modules/jobs/job_types/janitor.dm +++ b/code/modules/jobs/job_types/janitor.dm @@ -19,6 +19,13 @@ display_order = JOB_DISPLAY_ORDER_JANITOR threat = 0.2 + + family_heirlooms = list( + /obj/item/mop, + /obj/item/clothing/suit/caution, + /obj/item/reagent_containers/glass/bucket, + /obj/item/soap + ) /datum/outfit/job/janitor name = "Janitor" diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm index 17c376a5de..4105bd4e6e 100644 --- a/code/modules/jobs/job_types/lawyer.dm +++ b/code/modules/jobs/job_types/lawyer.dm @@ -22,6 +22,11 @@ display_order = JOB_DISPLAY_ORDER_LAWYER threat = 0.3 + + family_heirlooms = list( + /obj/item/gavelhammer, + /obj/item/book/manual/wiki/security_space_law + ) /datum/outfit/job/lawyer name = "Lawyer" diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index 75a85c88d1..b0a0375517 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -22,6 +22,15 @@ threat = 0.5 starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery) + + family_heirlooms = list( + /obj/item/storage/firstaid/ancient/heirloom, + /obj/item/scalpel, + /obj/item/hemostat, + /obj/item/circular_saw, + /obj/item/retractor, + /obj/item/cautery + ) /datum/outfit/job/doctor name = "Medical Doctor" diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm index 171e0cef8a..84d6bcb1a7 100644 --- a/code/modules/jobs/job_types/mime.dm +++ b/code/modules/jobs/job_types/mime.dm @@ -20,6 +20,10 @@ display_order = JOB_DISPLAY_ORDER_MIME threat = 0 + + family_heirlooms = list( + /obj/item/reagent_containers/food/snacks/baguette + ) /datum/job/mime/after_spawn(mob/living/carbon/human/H, client/C) . = ..() diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index fd802edc46..a0d7529aae 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -23,6 +23,10 @@ threat = 0.5 starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery) + + family_heirlooms = list( + /obj/item/storage/firstaid/ancient/heirloom + ) /datum/outfit/job/paramedic name = "Paramedic" diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm index 06eafe649b..20a2f463f5 100644 --- a/code/modules/jobs/job_types/prisoner.dm +++ b/code/modules/jobs/job_types/prisoner.dm @@ -13,6 +13,10 @@ plasma_outfit = /datum/outfit/plasmaman/prisoner display_order = JOB_DISPLAY_ORDER_PRISONER + + family_heirlooms = list( + /obj/item/pen/blue + ) /datum/job/prisoner/get_latejoin_spawn_point() return get_roundstart_spawn_point() diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index 67d14365ed..8a211ae993 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -33,6 +33,11 @@ display_order = JOB_DISPLAY_ORDER_QUARTERMASTER blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) threat = 0.5 + + family_heirlooms = list( + /obj/item/stamp, + /obj/item/stamp/denied + ) /datum/outfit/job/quartermaster name = "Quartermaster" diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 178bcc3188..606c34af5e 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -38,6 +38,10 @@ starting_modifiers = list(/datum/skill_modifier/job/level/wiring) blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) threat = 5 + + family_heirlooms = list( + /obj/item/toy/plush/slimeplushie + ) /datum/outfit/job/rd name = "Research Director" diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index 6f7b91571b..0e48467d91 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -24,6 +24,10 @@ display_order = JOB_DISPLAY_ORDER_ROBOTICIST threat = 1 + + family_heirlooms = list( + /obj/item/toy/figure/borg + ) /datum/outfit/job/roboticist name = "Roboticist" diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm index 10e3f58594..4bdbe6833b 100644 --- a/code/modules/jobs/job_types/scientist.dm +++ b/code/modules/jobs/job_types/scientist.dm @@ -22,6 +22,10 @@ starting_modifiers = list(/datum/skill_modifier/job/level/wiring/basic) display_order = JOB_DISPLAY_ORDER_SCIENTIST threat = 1.2 + + family_heirlooms = list( + /obj/item/toy/plush/slimeplushie + ) /datum/outfit/job/scientist name = "Scientist" diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index b59a58db73..8dedc6c6dc 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -28,6 +28,11 @@ display_order = JOB_DISPLAY_ORDER_SECURITY_OFFICER blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/blindness, /datum/quirk/monophobia) threat = 2 + + family_heirlooms = list( + /obj/item/book/manual/wiki/security_space_law, + /obj/item/clothing/head/beret/sec + ) /datum/job/officer/get_access() var/list/L = list() diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index e693335779..c6192280c7 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -24,6 +24,11 @@ display_order = JOB_DISPLAY_ORDER_SHAFT_MINER threat = 1.5 + + family_heirlooms = list( + /obj/item/pickaxe/mini, + /obj/item/shovel + ) /datum/outfit/job/miner name = "Shaft Miner (Lavaland)" diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index e2248362d0..58822dc4c5 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -27,6 +27,15 @@ display_order = JOB_DISPLAY_ORDER_STATION_ENGINEER threat = 1 + + family_heirlooms = list( + /obj/item/clothing/head/hardhat, + /obj/item/screwdriver/brass/family, + /obj/item/wrench/brass/family, + /obj/item/weldingtool/mini, // No brass family variant + /obj/item/crowbar/brass/family, + /obj/item/wirecutters/brass/family + ) /datum/outfit/job/engineer name = "Station Engineer" diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index be844be529..423a65048f 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -25,6 +25,10 @@ threat = 1.5 starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery) + + family_heirlooms = list( + /obj/item/reagent_containers/syringe + ) /datum/outfit/job/virologist name = "Virologist" diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index 8e3ef5a253..714c599024 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -29,6 +29,10 @@ display_order = JOB_DISPLAY_ORDER_WARDEN blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/blindness, /datum/quirk/monophobia) threat = 2 + + family_heirlooms = list( + /obj/item/book/manual/wiki/security_space_law + ) /datum/job/warden/get_access() var/list/L = list() diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index dbd3b7e922..794a1cf20a 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -253,8 +253,10 @@ sharpness = SHARP_NONE // use your survival dagger or smth icon_state = "crusher-hands" item_state = "crusher0-fist" - unique_reskin = list("Gauntlets" = "crusher-hands", - "Fingerless" = "crusher-hands-bare") + unique_reskin = list( + "Gauntlets" = list("icon_state" = "crusher-hands"), + "Fingerless" = list("icon_state" = "crusher-hands-bare") + ) detonation_damage = 45 // 60 on wield, compared to normal crusher's 70 backstab_bonus = 70 // 130 on backstab though var/combo_on_anything = FALSE // @admins if you're varediting this you don't get to whine at me diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 3d89377952..0b7ca7adfd 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -121,6 +121,7 @@ icon_state = "furnace" density = TRUE needs_item_input = TRUE + init_process = TRUE var/obj/machinery/mineral/CONSOLE = null var/on = FALSE var/datum/material/selected_material = null diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index eabab35c3b..32b79343e8 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -11,6 +11,7 @@ output_dir = SOUTH req_access = list(ACCESS_MINERAL_STOREROOM) speed_process = TRUE + init_process = TRUE circuit = /obj/item/circuitboard/machine/ore_redemption layer = BELOW_OBJ_LAYER var/points = 0 diff --git a/code/modules/mining/machine_unloading.dm b/code/modules/mining/machine_unloading.dm index b39b0df6ab..16b3b3967f 100644 --- a/code/modules/mining/machine_unloading.dm +++ b/code/modules/mining/machine_unloading.dm @@ -9,6 +9,7 @@ input_dir = WEST output_dir = EAST speed_process = TRUE + init_process = TRUE /obj/machinery/mineral/unloading_machine/proc/horrible_quadratic_monster(var/turf/T) set waitfor = FALSE diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 376865ae66..4c275c266e 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -11,7 +11,7 @@ var/obj/item/card/id/inserted_id var/list/prize_list = list( //if you add something to this, please, for the love of god, sort it by price/type. use tabs and not spaces. new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10), - new /datum/data/mining_equipment("50 Point Transfer Card", /obj/item/card/mining_point_card, 50), + new /datum/data/mining_equipment("50 Point Transfer Card", /obj/item/card/mining_point_card/fifty, 50), new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100), new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300), new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100), @@ -27,7 +27,7 @@ new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500), new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500), new /datum/data/mining_equipment("Larger Ore Bag", /obj/item/storage/bag/ore/large, 500), - new /datum/data/mining_equipment("Mining Point Transfer Card", /obj/item/card/mining_point_card, 500), + new /datum/data/mining_equipment("500 Point Transfer Card", /obj/item/card/mining_point_card, 500), new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600), new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750), new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/kinetic_crusher, 750), @@ -330,6 +330,9 @@ icon_state = "data_1" var/points = 500 +/obj/item/card/mining_point_card/fifty + points = 50 + /obj/item/card/mining_point_card/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/card/id)) var/obj/item/card/id/id = I diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 7fff5cb71a..2efdae38d6 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -585,18 +585,28 @@ for(var/job in category) var/datum/job/job_datum = SSjob.name_occupations[job] if(job_datum && IsJobUnavailable(job_datum.title, TRUE) == JOB_AVAILABLE) + // Get currently occupied slots + var/num_positions_current = job_datum.current_positions + + // Get total slots that can be occupied + var/num_positions_total = job_datum.total_positions + + // Change to lemniscate for infinite-slot jobs + // This variable should only used to display text! + num_positions_total = (num_positions_total == -1 ? "∞" : num_positions_total) + var/command_bold = "" if(job in GLOB.command_positions) command_bold = " command" - //SKYRAT CHANGES - var/jobline = "[job_datum.title] ([job_datum.current_positions])" + //Sandstorm changes + var/jobline = "[job_datum.title]" if(job_datum in SSjob.prioritized_jobs) jobline = "[jobline]" if(client && client.prefs && client.prefs.alt_titles_preferences[job_datum.title]) jobline = "[jobline]
(as [client.prefs.alt_titles_preferences[job_datum.title]])" - jobline = "[jobline]" + jobline = "[jobline] ([num_positions_current]/[num_positions_total])" dept_dat += jobline - //END OF SKYRAT CHANGES + //End of Sandstorm changes if(!dept_dat.len) dept_dat += "No positions open." dat += jointext(dept_dat, "") diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index c31b566cf3..66a0827059 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -94,6 +94,10 @@ C.dna.copy_dna(brainmob.stored_dna) if(HAS_TRAIT(L, TRAIT_NOCLONE)) LAZYSET(brainmob.status_traits, TRAIT_NOCLONE, L.status_traits[TRAIT_NOCLONE]) + // Sandstorm edit: DNC Order quirk + if(HAS_TRAIT(L, TRAIT_DNC_ORDER)) + LAZYSET(brainmob.status_traits, TRAIT_DNC_ORDER, L.status_traits[TRAIT_DNC_ORDER]) + // End Sandstorm edit var/obj/item/organ/zombie_infection/ZI = L.getorganslot(ORGAN_SLOT_ZOMBIE) if(ZI) brainmob.set_species(ZI.old_species) //For if the brain is cloned diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 64b5dfcd9e..6052229e35 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -237,6 +237,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) ///For custom overrides for species ass images var/icon/ass_image + /// List of family heirlooms this species can get with the family heirloom quirk. List of types. + var/list/family_heirlooms + /////////// // PROCS // /////////// diff --git a/code/modules/mob/living/carbon/human/species_types/arachnid.dm b/code/modules/mob/living/carbon/human/species_types/arachnid.dm index 7495e2500e..6dc19d928a 100644 --- a/code/modules/mob/living/carbon/human/species_types/arachnid.dm +++ b/code/modules/mob/living/carbon/human/species_types/arachnid.dm @@ -7,7 +7,7 @@ species_traits = list(LIPS, NOEYES, NO_UNDERWEAR, HAS_FLESH, HAS_BONE) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG mutant_bodyparts = list("arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain") - attack_verb = "slash" + attack_verb = "claw" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/meat/slab/spider diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm index 761274f255..8b4861d558 100644 --- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm @@ -7,7 +7,7 @@ inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_tail" = "None", "mam_ears" = "None", "insect_wings" = "None", "insect_fluff" = "None", "mam_snouts" = "None", "taur" = "None", "insect_markings" = "None", "mam_body_markings" = list()) - attack_verb = "slash" + attack_verb = "claw" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/insect @@ -25,3 +25,7 @@ allowed_limb_ids = list("insect","apid","moth","moth_not_greyscale") eye_type = "insect" + + family_heirlooms = list( + /obj/item/flashlight/lantern/heirloom_moth + ) diff --git a/code/modules/mob/living/carbon/human/species_types/dwarves.dm b/code/modules/mob/living/carbon/human/species_types/dwarves.dm index e0a9bcaa36..2820726313 100644 --- a/code/modules/mob/living/carbon/human/species_types/dwarves.dm +++ b/code/modules/mob/living/carbon/human/species_types/dwarves.dm @@ -20,6 +20,11 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) // species_language_holder = /datum/language_holder/dwarf species_category = SPECIES_CATEGORY_BASIC //a kind of human + family_heirlooms = list( + // Dwarves get a dwarf mug as their heirloom (normal container but has manly dorf icon) + /obj/item/reagent_containers/food/drinks/dwarf_mug + ) + /mob/living/carbon/human/species/dwarf //species admin spawn path race = /datum/species/dwarf //and the race the path is set to. diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm index eee5757b46..beebbb1dfd 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -13,6 +13,7 @@ wagging_type = "mam_waggingtail" species_category = SPECIES_CATEGORY_FURRY ass_image = 'icons/ass/asscat.png' + family_heirlooms = list(/obj/item/toy/cattoy) /datum/species/human/felinid/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) if(ishuman(C)) diff --git a/code/modules/mob/living/carbon/human/species_types/ipc.dm b/code/modules/mob/living/carbon/human/species_types/ipc.dm index dae4baa4f4..bb532943f8 100644 --- a/code/modules/mob/living/carbon/human/species_types/ipc.dm +++ b/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -37,6 +37,11 @@ species_category = SPECIES_CATEGORY_ROBOT wings_icons = SPECIES_WINGS_ROBOT + family_heirlooms = list( + // Gives a broken powercell for flavor text! + /obj/item/stock_parts/cell/family + ) + var/datum/action/innate/monitor_change/screen languagewhitelist = list("Encoded Audio Language") //Skyrat change - species language whitelist diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 01f82cbac3..a82f77867f 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -35,6 +35,10 @@ ass_image = 'icons/ass/assslime.png' blacklisted_quirks = list(/datum/quirk/glass_bones) + family_heirlooms = list( + /obj/item/toy/plush/slimeplushie + ) + /datum/species/jelly/on_species_loss(mob/living/carbon/C) C.faction -= "slime" if(ishuman(C)) diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index e3f7b700dc..589c9a1dd0 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -13,7 +13,7 @@ mutant_bodyparts = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "mam_snouts" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "mam_body_markings" = list(), "legs" = "Digitigrade", "taur" = "None", "deco_wings" = "None") - attack_verb = "slash" + attack_verb = "claw" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard @@ -34,6 +34,10 @@ ass_image = 'icons/ass/asslizard.png' + family_heirlooms = list( + /obj/item/toy/plush/lizardplushie + ) + /datum/species/lizard/random_name(gender,unique,lastname) if(unique) return random_unique_lizard_name(gender) diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 326f23fa1f..996a4e742a 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -4,7 +4,7 @@ id = SPECIES_POD default_color = "59CE00" species_traits = list(MUTCOLORS,EYECOLOR,CAN_SCAR,HAS_FLESH,HAS_BONE) - attack_verb = "slash" + attack_verb = "claw" attack_sound = 'sound/weapons/slice.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' burnmod = 1.25 diff --git a/code/modules/mob/living/carbon/human/species_types/synthliz.dm b/code/modules/mob/living/carbon/human/species_types/synthliz.dm index ec1fd86780..05e075415d 100644 --- a/code/modules/mob/living/carbon/human/species_types/synthliz.dm +++ b/code/modules/mob/living/carbon/human/species_types/synthliz.dm @@ -37,3 +37,8 @@ wagging_type = "mam_waggingtail" species_category = SPECIES_CATEGORY_ROBOT wings_icons = SPECIES_WINGS_ROBOT + + family_heirlooms = list( + // They're also robots + /obj/item/stock_parts/cell/family + ) diff --git a/code/modules/mob/living/carbon/human/species_types/xeno.dm b/code/modules/mob/living/carbon/human/species_types/xeno.dm index cd3ba8d5cc..3d710988e5 100644 --- a/code/modules/mob/living/carbon/human/species_types/xeno.dm +++ b/code/modules/mob/living/carbon/human/species_types/xeno.dm @@ -6,7 +6,7 @@ default_color = "00FF00" species_traits = list(MUTCOLORS,EYECOLOR,LIPS,CAN_SCAR,HAS_FLESH,HAS_BONE) mutant_bodyparts = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = list(),"mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade","deco_wings"= "None") - attack_verb = "slash" + attack_verb = "claw" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm index f49c5933bb..b50aeb5f48 100644 --- a/code/modules/mob/living/silicon/damage_procs.dm +++ b/code/modules/mob/living/silicon/damage_procs.dm @@ -9,9 +9,6 @@ adjustBruteLoss(damage_amount, forced = forced) if(BURN) adjustFireLoss(damage_amount, forced = forced) - if(OXY) - if(damage < 0 || forced) //we shouldn't be taking oxygen damage through this proc, but we'll let it heal. - adjustOxyLoss(damage_amount, forced = forced) return 1 @@ -30,7 +27,7 @@ /mob/living/silicon/setCloneLoss(amount, updating_health = TRUE, forced = FALSE) return FALSE -/mob/living/silicon/adjustStaminaLoss(amount, updating_health = 1, forced = FALSE)//immune to stamina damage. +/mob/living/silicon/adjustStaminaLoss(amount, updating_health = 1, forced = FALSE) //immune to stamina damage. return FALSE /mob/living/silicon/setStaminaLoss(amount, updating_health = 1) @@ -41,3 +38,15 @@ /mob/living/silicon/setOrganLoss(slot, amount) return FALSE + +/mob/living/silicon/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE) //immune to oxygen damage + if(istype(src, /mob/living/silicon/ai)) //ais are snowflakes and use oxyloss for being in AI cards and having no battery + return ..() + + return FALSE + +/mob/living/silicon/setOxyLoss(amount, updating_health = TRUE, forced = FALSE) + if(istype(src, /mob/living/silicon/ai)) //ditto + return ..() + + return FALSE diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm index 9e81725731..e54d5e05b7 100644 --- a/code/modules/mob/living/silicon/pai/pai_defense.dm +++ b/code/modules/mob/living/silicon/pai/pai_defense.dm @@ -85,15 +85,6 @@ /mob/living/silicon/pai/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE) return take_holo_damage(amount) -/mob/living/silicon/pai/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, toxins_type = TOX_DEFAULT) - return FALSE - -/mob/living/silicon/pai/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE) - return FALSE - -/mob/living/silicon/pai/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE) - return FALSE - /mob/living/silicon/pai/adjustStaminaLoss(amount, updating_health, forced = FALSE) if(forced) take_holo_damage(amount) @@ -108,27 +99,3 @@ /mob/living/silicon/pai/getFireLoss() return emittermaxhealth - emitterhealth - -/mob/living/silicon/pai/getToxLoss(toxins_type = TOX_OMNI) - return FALSE - -/mob/living/silicon/pai/getOxyLoss() - return FALSE - -/mob/living/silicon/pai/getCloneLoss() - return FALSE - -/mob/living/silicon/pai/getStaminaLoss() - return FALSE - -/mob/living/silicon/pai/setCloneLoss() - return FALSE - -/mob/living/silicon/pai/setStaminaLoss() - return FALSE - -/mob/living/silicon/pai/setToxLoss(toxins_type = TOX_OMNI) - return FALSE - -/mob/living/silicon/pai/setOxyLoss() - return FALSE diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index e902d57ddd..8a0b8def51 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -1,7 +1,6 @@ /mob/living/silicon/robot/BiologicalLife(delta_time, times_fired) if(!(. = ..())) return - adjustOxyLoss(-10) //we're a robot! handle_robot_hud_updates() handle_robot_cell() diff --git a/code/modules/mob/living/silicon/robot/update_icons.dm b/code/modules/mob/living/silicon/robot/update_icons.dm index 088c93cff1..59c3c1794c 100644 --- a/code/modules/mob/living/silicon/robot/update_icons.dm +++ b/code/modules/mob/living/silicon/robot/update_icons.dm @@ -17,12 +17,16 @@ icon_state = "[module.cyborg_base_icon]-wreck" if(module.cyborg_pixel_offset) - pixel_x = module.cyborg_pixel_offset + var/matrix/M = transform + M.c = module.cyborg_pixel_offset + transform = M //End of citadel changes if(module.cyborg_base_icon == "robot") icon = 'icons/mob/robots.dmi' - pixel_x = initial(pixel_x) + var/matrix/M = transform + M.c = 0 // Cyborg's initial x offset is very likely to be 0 + transform = M if(stat != DEAD && !(IsUnconscious() || IsStun() || IsParalyzed() || low_power_mode)) //Not dead, not stunned. if(!eye_lights) eye_lights = new() diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index a87c0a81ab..e1a179ea52 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -45,14 +45,6 @@ adjustBruteLoss(damage) if(BURN) adjustFireLoss(damage) - if(TOX) - adjustToxLoss(damage) - if(OXY) - adjustOxyLoss(damage) - if(CLONE) - adjustCloneLoss(damage) - if(STAMINA) - adjustStaminaLoss(damage) /mob/living/silicon/attack_paw(mob/living/user) return attack_hand(user) diff --git a/code/modules/modular_computers/file_system/programs/airestorer.dm b/code/modules/modular_computers/file_system/programs/airestorer.dm index 4f181c0e34..ff5240306b 100644 --- a/code/modules/modular_computers/file_system/programs/airestorer.dm +++ b/code/modules/modular_computers/file_system/programs/airestorer.dm @@ -75,9 +75,8 @@ restoring = FALSE return ai_slot.locked = TRUE - A.adjustOxyLoss(-5, FALSE) - A.adjustFireLoss(-5, FALSE) - A.adjustToxLoss(-5, FALSE) + A.adjustOxyLoss(-5, FALSE, FALSE) + A.adjustFireLoss(-5, FALSE, FALSE) A.adjustBruteLoss(-5, FALSE) // Please don't forget to update health, otherwise the below if statements will probably always fail. diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 0bd91c5f35..0a7d6d05da 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -105,12 +105,13 @@ custom_materials = list(/datum/material/gold = 750) sharpness = SHARP_EDGED resistance_flags = FIRE_PROOF - unique_reskin = list("Oak" = "pen-fountain-o", - "Gold" = "pen-fountain-g", - "Rosewood" = "pen-fountain-r", - "Black and Silver" = "pen-fountain-b", - "Command Blue" = "pen-fountain-cb" - ) + unique_reskin = list( + "Oak" = list("icon_state" = "pen-fountain-o"), + "Gold" = list("icon_state" = "pen-fountain-g"), + "Rosewood" = list("icon_state" = "pen-fountain-r"), + "Black and Silver" = list("icon_state" = "pen-fountain-b"), + "Command Blue" = list("icon_state" = "pen-fountain-cb") + ) embedding = list("embed_chance" = 75) /obj/item/pen/fountain/captain/Initialize(mapload) @@ -118,9 +119,8 @@ AddComponent(/datum/component/butchering, 200, 115) //the pen is mightier than the sword /obj/item/pen/fountain/captain/reskin_obj(mob/M) - ..() - if(current_skin) - desc = "It's an expensive [current_skin] fountain pen. The nib is quite sharp." + . = ..() + desc = "It's an expensive [current_skin] fountain pen. The nib is quite sharp." /obj/item/pen/attack_self(mob/living/carbon/user) var/deg = input(user, "What angle would you like to rotate the pen head to? (1-360)", "Rotate Pen Head") as null|num diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 3f2f4d3e65..5c6aff5564 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -23,7 +23,7 @@ /obj/item/gun/ballistic/update_icon_state() if(current_skin) - icon_state = "[unique_reskin[current_skin]][suppressed ? "-suppressed" : ""][sawn_off ? "-sawn" : ""]" + icon_state = "[unique_reskin[current_skin]["icon_state"]][suppressed ? "-suppressed" : ""][sawn_off ? "-sawn" : ""]" else icon_state = "[initial(icon_state)][suppressed ? "-suppressed" : ""][sawn_off ? "-sawn" : ""]" diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index bd6f203882..53ba6d6a92 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -30,27 +30,28 @@ can_unsuppress = TRUE automatic_burst_overlay = FALSE obj_flags = UNIQUE_RENAME - unique_reskin = list("Default" = "cde", - "N-99" = "n99", - "Stealth" = "stealthpistol", - "HKVP-78" = "vp78", - "Luger" = "p08b", - "Mk.58" = "secguncomp", - "PX4 Storm" = "px4" - ) + unique_reskin = list( + "Default" = list("icon_state" = "cde"), + "N-99" = list("icon_state" = "n99"), + "Stealth" = list("icon_state" = "stealthpistol"), + "HKVP-78" = list("icon_state" = "vp78"), + "Luger" = list("icon_state" = "p08b"), + "Mk.58" = list("icon_state" = "secguncomp"), + "PX4 Storm" = list("icon_state" = "px4") + ) /obj/item/gun/ballistic/automatic/pistol/modular/update_icon_state() if(current_skin) - icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" + icon_state = "[unique_reskin[current_skin]["icon_state"]][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" else icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" /obj/item/gun/ballistic/automatic/pistol/modular/update_overlays() . = ..() if(magazine && suppressed) - . += "[unique_reskin[current_skin]]-magazine-sup" //Yes, this means the default iconstate can't have a magazine overlay + . += "[unique_reskin[current_skin]["icon_state"]]-magazine-sup" //Yes, this means the default iconstate can't have a magazine overlay else if (magazine) - . += "[unique_reskin[current_skin]]-magazine" + . += "[unique_reskin[current_skin]["icon_state"]]-magazine" /obj/item/gun/ballistic/automatic/pistol/m1911 name = "\improper M1911" diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index f3b07aa7a4..28f81e13ae 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -88,13 +88,15 @@ /obj/item/gun/ballistic/revolver/syndicate obj_flags = UNIQUE_RENAME - unique_reskin = list("Default" = "revolver", - "Silver" = "russianrevolver", - "Robust" = "revolvercit", - "Bulky" = "revolverhakita", - "Polished" = "revolvertoriate", - "Soulless" = "revolveroldflip", - "Soul" = "revolverold") + unique_reskin = list( + "Default" = list("icon_state" = "revolver"), + "Silver" = list("icon_state" = "russianrevolver"), + "Robust" = list("icon_state" = "revolvercit"), + "Bulky" = list("icon_state" = "revolverhakita"), + "Polished" = list("icon_state" = "revolvertoriate"), + "Soulless" = list("icon_state" = "revolveroldflip"), + "Soul" = list("icon_state" = "revolverold") + ) /obj/item/gun/ballistic/revolver/detective name = "\improper .38 Mars Special" @@ -102,12 +104,13 @@ icon_state = "detective" mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev38 obj_flags = UNIQUE_RENAME - unique_reskin = list("Default" = "detective", - "Leopard Spots" = "detective_leopard", - "Black Panther" = "detective_panther", - "Gold Trim" = "detective_gold", - "The Peacemaker" = "detective_peacemaker" - ) + unique_reskin = list( + "Default" = list("icon_state" = "detective"), + "Leopard Spots" = list("icon_state" = "detective_leopard"), + "Black Panther" = list("icon_state" = "detective_panther"), + "Gold Trim" = list("icon_state" = "detective_gold"), + "The Peacemaker" = list("icon_state" = "detective_peacemaker") + ) var/list/safe_calibers /obj/item/gun/ballistic/revolver/detective/Initialize(mapload) @@ -294,13 +297,14 @@ mag_type = /obj/item/ammo_box/magazine/internal/shot/dual sawn_desc = "Omar's coming!" obj_flags = UNIQUE_RENAME - unique_reskin = list("Default" = "dshotgun", - "Dark Red Finish" = "dshotgun-d", - "Ash" = "dshotgun-f", - "Faded Grey" = "dshotgun-g", - "Maple" = "dshotgun-l", - "Rosewood" = "dshotgun-p" - ) + unique_reskin = list( + "Default" = list("icon_state" = "dshotgun"), + "Dark Red Finish" = list("icon_state" = "dshotgun-d"), + "Ash" = list("icon_state" = "dshotgun-f"), + "Faded Grey" = list("icon_state" = "dshotgun-g"), + "Maple" = list("icon_state" = "dshotgun-l"), + "Rosewood" = list("icon_state" = "dshotgun-p") + ) /obj/item/gun/ballistic/revolver/doublebarrel/attackby(obj/item/A, mob/user, params) ..() @@ -342,9 +346,10 @@ slot_flags = null mag_type = /obj/item/ammo_box/magazine/internal/shot/improvised sawn_desc = "I'm just here for the gasoline." - unique_reskin = list("Default" = "ishotgun", - "Cobbled" = "old_ishotgun" - ) + unique_reskin = list( + "Default" = list("icon_state" = "ishotgun"), + "Cobbled" = list("icon_state" = "old_ishotgun") + ) var/slung = FALSE /obj/item/gun/ballistic/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 25e4b6b12a..6ffdbee6db 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -95,9 +95,10 @@ fire_delay = 7 mag_type = /obj/item/ammo_box/magazine/internal/shot/riot sawn_desc = "Come with me if you want to live." - unique_reskin = list("Tactical" = "riotshotgun", - "Wood Stock" = "wood_riotshotgun" - ) + unique_reskin = list( + "Tactical" = list("icon_state" = "riotshotgun"), + "Wood Stock" = list("icon_state" = "wood_riotshotgun") + ) /obj/item/gun/ballistic/shotgun/riot/attackby(obj/item/A, mob/user, params) ..() @@ -235,9 +236,10 @@ fire_delay = 5 mag_type = /obj/item/ammo_box/magazine/internal/shot/com w_class = WEIGHT_CLASS_HUGE - unique_reskin = list("Tactical" = "cshotgun", - "Slick" = "cshotgun_slick" - ) + unique_reskin = list( + "Tactical" = list("icon_state" = "cshotgun"), + "Slick" = list("icon_state" = "cshotgun_slick") + ) /obj/item/gun/ballistic/shotgun/automatic/combat/compact name = "warden's combat shotgun" @@ -276,7 +278,7 @@ update_icon() /obj/item/gun/ballistic/shotgun/automatic/combat/compact/update_icon_state() - icon_state = "[current_skin ? unique_reskin[current_skin] : "cshotgun"][stock ? "" : "c"]" + icon_state = "[current_skin ? unique_reskin[current_skin]["icon_state"] : "cshotgun"][stock ? "" : "c"]" /obj/item/gun/ballistic/shotgun/automatic/combat/compact/afterattack(atom/target, mob/living/user, flag, params) if(!stock) @@ -365,7 +367,7 @@ /obj/item/gun/ballistic/shotgun/leveraction/update_icon_state() if(current_skin) - icon_state = "[unique_reskin[current_skin]][sawn_off ? "-sawn" : ""][chambered ? "" : "-e"]" + icon_state = "[unique_reskin[current_skin]["icon_state"]][sawn_off ? "-sawn" : ""][chambered ? "" : "-e"]" else icon_state = "[initial(icon_state)][sawn_off ? "-sawn" : ""][chambered ? "" : "-e"]" diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 9b10a843e8..5fd158c028 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -181,7 +181,6 @@ /obj/item/gun/energy/kinetic_accelerator/emp_act(severity) return -/* moved to modular_sand /obj/item/gun/energy/kinetic_accelerator/proc/reload() cell.give(cell.maxcharge) process_chamber() @@ -191,7 +190,7 @@ to_chat(loc, "[src] silently charges up.") update_icon() overheat = FALSE -*/ + /obj/item/gun/energy/kinetic_accelerator/update_overlays() . = ..() if(!can_shoot()) diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 5fdf4574f4..348556c337 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -1088,7 +1088,7 @@ var/list/adjusted = H.adjust_arousal(5,aphro = TRUE) for(var/g in adjusted) var/obj/item/organ/genital/G = g - to_chat(M, "You feel like playing with your [G.name]!") + to_chat(M, span_userlove("You feel like playing with your [G.name]!")) ..() /datum/reagent/consumable/monkey_energy diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 4848347df2..c709fd09a7 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -570,13 +570,13 @@ M.emote(pick("moan","blush")) if(prob(min(current_cycle/4,10))) var/aroused_message = pick("You feel frisky.", "You're having trouble suppressing your urges.", "You feel in the mood.") - to_chat(M, "[aroused_message]") + to_chat(M, span_userlove("[aroused_message]")) if(ishuman(M)) var/mob/living/carbon/human/H = M var/list/genits = H.adjust_arousal(current_cycle, "crocin", aphro = TRUE) // redundant but should still be here for(var/g in genits) var/obj/item/organ/genital/G = g - to_chat(M, "[G.arousal_verb]!") + to_chat(M, span_userlove("[G.arousal_verb]!")) ..() /datum/reagent/drug/aphrodisiacplus @@ -603,14 +603,14 @@ aroused_message = pick("You need to fuck someone!", "You're bursting with sexual tension!", "You can't get sex off your mind!") else aroused_message = pick("You feel a bit hot.", "You feel strong sexual urges.", "You feel in the mood.", "You're ready to go down on someone.") - to_chat(M, "[aroused_message]") + to_chat(M, span_userlove("[aroused_message]")) REMOVE_TRAIT(M,TRAIT_NEVERBONER,APHRO_TRAIT) if(ishuman(M)) var/mob/living/carbon/human/H = M var/list/genits = H.adjust_arousal(100, "hexacrocin", aphro = TRUE) // redundant but should still be here for(var/g in genits) var/obj/item/organ/genital/G = g - to_chat(M, "[G.arousal_verb]!") + to_chat(M, span_userlove("[G.arousal_verb]!")) ..() /datum/reagent/drug/aphrodisiacplus/addiction_act_stage2(mob/living/M) @@ -631,7 +631,7 @@ if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO) && prob(33)) if(prob(5) && ishuman(M) && M.has_dna() && (M.client?.prefs.cit_toggles & BIMBOFICATION)) if(!HAS_TRAIT(M,TRAIT_PERMABONER)) - to_chat(M, "Your libido is going haywire!") + to_chat(M, span_userlove("Your libido is going haywire!")) M.log_message("Made perma-horny by hexacrocin.",LOG_EMOTE) ADD_TRAIT(M,TRAIT_PERMABONER,APHRO_TRAIT) ..() @@ -677,6 +677,6 @@ /datum/reagent/drug/anaphrodisiacplus/overdose_process(mob/living/M) if(M && M.client?.prefs.arousable && prob(5)) - to_chat(M, "You feel like you'll never feel aroused again...") + to_chat(M, span_userlove("You feel like you'll never feel aroused again...")) ADD_TRAIT(M,TRAIT_NEVERBONER,APHRO_TRAIT) ..() diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 8e369f89db..f68c925d74 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -57,7 +57,7 @@ /datum/reagent/blood/on_mob_life(mob/living/carbon/C) //Because lethals are preferred over stamina. damnifino. var/blood_id = C.get_blood_id() - if((blood_id in GLOB.blood_reagent_types) && !HAS_TRAIT(C, TRAIT_NOMARROW) && !HAS_TRAIT(C, BLOODFLEDGE)) + if((blood_id in GLOB.blood_reagent_types) && !HAS_TRAIT(C, TRAIT_NOMARROW) && !HAS_TRAIT(C, TRAIT_BLOODFLEDGE)) if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type))) //we only care about bloodtype here because this is where the poisoning should be C.adjustToxLoss(rand(2,8)*REAGENTS_EFFECT_MULTIPLIER, TRUE, TRUE) //forced to ensure people don't use it to gain beneficial toxin as slime person ..() @@ -2428,7 +2428,7 @@ var/list/adjusted = H.adjust_arousal(2,"catnip", aphro = TRUE) for(var/g in adjusted) var/obj/item/organ/genital/G = g - to_chat(M, "You feel like playing with your [G.name]!") + to_chat(M, span_userlove("You feel like playing with your [G.name]!")) ..() /datum/reagent/preservahyde diff --git a/code/modules/reagents/reagent_containers/hypovial.dm b/code/modules/reagents/reagent_containers/hypovial.dm index 43f9f88976..0f9ffd6514 100644 --- a/code/modules/reagents/reagent_containers/hypovial.dm +++ b/code/modules/reagents/reagent_containers/hypovial.dm @@ -9,15 +9,16 @@ possible_transfer_amounts = list(1,2,5,10) container_flags = APTFT_VERB obj_flags = UNIQUE_RENAME - unique_reskin = list("hypovial" = "hypovial", - "red hypovial" = "hypovial-b", - "blue hypovial" = "hypovial-d", - "green hypovial" = "hypovial-a", - "orange hypovial" = "hypovial-k", - "purple hypovial" = "hypovial-p", - "black hypovial" = "hypovial-t", - "pink hypovial" = "hypovial-pink" - ) + unique_reskin = list( + "hypovial" = list("icon_state" = "hypovial"), + "red hypovial" = list("icon_state" = "hypovial-b"), + "blue hypovial" = list("icon_state" = "hypovial-d"), + "green hypovial" = list("icon_state" = "hypovial-a"), + "orange hypovial" = list("icon_state" = "hypovial-k"), + "purple hypovial" = list("icon_state" = "hypovial-p"), + "black hypovial" = list("icon_state" = "hypovial-t"), + "pink hypovial" = list("icon_state" = "hypovial-pink") + ) always_reskinnable = TRUE cached_icon = "hypovial" @@ -50,14 +51,15 @@ icon_state = "hypoviallarge" volume = 120 possible_transfer_amounts = list(1,2,5,10,20) - unique_reskin = list("large hypovial" = "hypoviallarge", - "large red hypovial" = "hypoviallarge-b", - "large blue hypovial" = "hypoviallarge-d", - "large green hypovial" = "hypoviallarge-a", - "large orange hypovial" = "hypoviallarge-k", - "large purple hypovial" = "hypoviallarge-p", - "large black hypovial" = "hypoviallarge-t" - ) + unique_reskin = list( + "large hypovial" = list("icon_state" = "hypoviallarge"), + "large red hypovial" = list("icon_state" = "hypoviallarge-b"), + "large blue hypovial" = list("icon_state" = "hypoviallarge-d"), + "large green hypovial" = list("icon_state" = "hypoviallarge-a"), + "large orange hypovial" = list("icon_state" = "hypoviallarge-k"), + "large purple hypovial" = list("icon_state" = "hypoviallarge-p"), + "large black hypovial" = list("icon_state" = "hypoviallarge-t") + ) cached_icon = "hypoviallarge" /obj/item/reagent_containers/glass/bottle/vial/large/bluespace diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index a21b026080..b3ad29e637 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -308,13 +308,32 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) S.update_icon() CHECK_TICK -/obj/machinery/conveyor_switch/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_CROWBAR) - var/obj/item/conveyor_switch_construct/C = new/obj/item/conveyor_switch_construct(src.loc) - C.id = id - transfer_fingerprints_to(C) - to_chat(user, "You detach the conveyor switch.") - qdel(src) +/obj/machinery/conveyor_switch/crowbar_act(mob/user, obj/item/tool) + tool.play_tool_sound(src, 50) + var/obj/item/conveyor_switch_construct/switch_construct = new/obj/item/conveyor_switch_construct(src.loc) + switch_construct.id = id + transfer_fingerprints_to(switch_construct) + to_chat(user, span_notice("You detach [src].")) + qdel(src) + return TRUE + +/obj/machinery/conveyor_switch/screwdriver_act(mob/user, obj/item/tool) + tool.play_tool_sound(src, 50) + oneway = !oneway + to_chat(user, span_notice("You set [src] to [oneway ? "one way" : "default"] configuration.")) + return TRUE + +/obj/machinery/conveyor_switch/wrench_act(mob/user, obj/item/tool) + tool.play_tool_sound(src, 50) + invert_icon = !invert_icon + update_appearance() + to_chat(user, span_notice("You set [src] to [invert_icon ? "inverted": "normal"] position.")) + return TRUE + +/obj/machinery/conveyor_switch/examine(mob/user) + . = ..() + . += span_notice("[src] is set to [oneway ? "one way" : "default"] configuration. It can be changed with a screwdriver.") + . += span_notice("[src] is set to [invert_icon ? "inverted": "normal"] position. It can be rotated with a wrench.") /obj/machinery/conveyor_switch/oneway icon_state = "conveyor_switch_oneway" diff --git a/code/modules/recycling/conveyor_sorter.dm b/code/modules/recycling/conveyor_sorter.dm new file mode 100644 index 0000000000..0e42c79067 --- /dev/null +++ b/code/modules/recycling/conveyor_sorter.dm @@ -0,0 +1,144 @@ +// credits to jjpark-kb, see Skyrat-SS13/Skyrat-tg#8790 and related files +// - hatterhat + +/obj/item/conveyor_sorter + name = "conveyor sorter lister" + desc = "A tool that is used to create conveyor sorting marks, and give sorting lists to them." + icon = 'icons/obj/recycling.dmi' + icon_state = "lister" + ///the list of conveyor sorters spawned by + var/list/spawned_sorters = list() + ///the list of things that are currently within the sorting list + var/list/current_sort = list() + +/obj/item/conveyor_sorter/Destroy() + for(var/deleting_sorters in spawned_sorters) + qdel(deleting_sorters) + return ..() + +/obj/item/conveyor_sorter/examine(mob/user) + . = ..() + . += span_notice("Use it to place down a conveyor sorter, up to three.") + . += span_notice("Use Alt-Click to reset the sorting list.") + . += span_notice("Attack things to attempt to add to the sorting list.") + +/obj/item/conveyor_sorter/attack_self(mob/user, modifiers) + if(length(spawned_sorters) >= 3) + to_chat(user, span_warning("You may only have three spawned conveyor sorters!")) + return + var/obj/effect/decal/cleanable/conveyor_sorter/new_cs = new /obj/effect/decal/cleanable/conveyor_sorter(get_turf(src)) + new_cs.parent_item = src + spawned_sorters += new_cs + +/obj/item/conveyor_sorter/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(target == src) + return ..() + if(!proximity_flag) + return ..() + if(!ismovable(target)) + return ..() + if(istype(target, /obj/effect/decal/cleanable/conveyor_sorter)) + return + if(is_type_in_list(target, current_sort)) + to_chat(user, span_warning("[target] is already in [src]'s sorting list!")) + return + if(length(current_sort) >= 5) + to_chat(user, span_warning("[src] already has five things within the sorting list!")) + return + current_sort += target.type + to_chat(user, span_notice("[target] has been added to [src]'s sorting list.")) + +/obj/item/conveyor_sorter/AltClick(mob/user) + visible_message("[src] pings, resetting its sorting list!") + playsound(src, 'sound/machines/ping.ogg', 30, TRUE) + current_sort = list() + +/obj/effect/decal/cleanable/conveyor_sorter + name = "conveyor sorter" + desc = "A mark that sorts items out based on what they are." + icon = 'icons/obj/recycling.dmi' + icon_state = "sorter" + layer = OBJ_LAYER + plane = GAME_PLANE + ///the list of items that will be sorted to the sorted direction + var/list/sorting_list = list() + //the direction that the items in the sorting list will be moved to + dir = NORTH + ///the parent conveyor sorter lister item, used for deletion + var/obj/item/conveyor_sorter/parent_item + /// To prevent spam + COOLDOWN_DECLARE(use_cooldown) + + light_range = 3 + light_color = COLOR_RED_LIGHT + +/obj/effect/decal/cleanable/conveyor_sorter/Initialize(mapload, list/datum/disease/diseases) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = .proc/on_entered, + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/effect/decal/cleanable/conveyor_sorter/Destroy() + if(parent_item) + parent_item.spawned_sorters -= src + parent_item = null + return ..() + +/obj/effect/decal/cleanable/conveyor_sorter/examine(mob/user) + . = ..() + . += span_notice("Attack with conveyor sorter lister to set the sorting list.") + . += span_notice("Slap with empty hands to change the sorting direction.") + . += span_notice("Alt-Click to reset the sorting list.") + . += span_notice("Ctrl-Click to remove.") + +/obj/effect/decal/cleanable/conveyor_sorter/attack_hand(mob/living/user, list/modifiers) + var/user_choice = tgui_input_list(user, "Choose which direction to sort to!", "Direction choice", list("North", "East", "South", "West")) + if(!user_choice) + return ..() + switch(user_choice) + if("North") + setDir(NORTH) + if("East") + setDir(EAST) + if("South") + setDir(SOUTH) + if("West") + setDir(WEST) + visible_message("[src] pings, updating its sorting direction!") + playsound(src, 'sound/machines/ping.ogg', 30, TRUE) + +/obj/effect/decal/cleanable/conveyor_sorter/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/conveyor_sorter)) + var/obj/item/conveyor_sorter/cs_item = W + sorting_list = cs_item.current_sort + visible_message("[src] pings, updating its sorting list!") + playsound(src, 'sound/machines/ping.ogg', 30, TRUE) + return + else + return ..() + +/obj/effect/decal/cleanable/conveyor_sorter/AltClick(mob/user) + visible_message("[src] pings, resetting its sorting list!") + playsound(src, 'sound/machines/ping.ogg', 30, TRUE) + sorting_list = list() + +/obj/effect/decal/cleanable/conveyor_sorter/CtrlClick(mob/user) + visible_message("[src] pings, before disappearing!") + playsound(src, 'sound/machines/ping.ogg', 30, TRUE) + qdel(src) + +/obj/effect/decal/cleanable/conveyor_sorter/proc/on_entered(datum/source, atom/movable/AM) + if(is_type_in_list(AM, sorting_list) && !AM.anchored && COOLDOWN_FINISHED(src, use_cooldown)) + COOLDOWN_START(src, use_cooldown, 1 SECONDS) + AM.Move(get_step(src, dir)) + +/datum/design/conveyor_sorter + name = "Conveyor Sorter" + desc = "A wonderful item that can set markers and forcefully move stuff to a direction." + id = "conveyor_sorter" + build_type = PROTOLATHE + build_path = /obj/item/conveyor_sorter + materials = list(/datum/material/iron = 500, /datum/material/plastic = 500) + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_CARGO diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 630a3629cf..6f6a1fd88e 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -12,16 +12,6 @@ category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL -/datum/design/health_hud_prescription - name = "Prescription Health Scanner HUD" - desc = "A heads-up display that scans the humans in view and provides accurate data about their health status. This one has a prescription lens." - id = "health_hud_prescription" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 350) - build_path = /obj/item/clothing/glasses/hud/health/prescription - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - /datum/design/health_hud_night name = "Night Vision Health Scanner HUD" desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness." @@ -42,16 +32,6 @@ category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SECURITY -/datum/design/security_hud_prescription - name = "Prescription Security HUD" - desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status. This one has a prescription lens." - id = "security_hud_prescription" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 350) - build_path = /obj/item/clothing/glasses/hud/security/prescription - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - /datum/design/security_hud_night name = "Night Vision Security HUD" desc = "A heads-up display which provides id data and vision in complete darkness." @@ -72,16 +52,6 @@ category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE -/datum/design/diagnostic_hud_prescription - name = "Prescription Diagnostic HUD" - desc = "A HUD used to analyze and determine faults within robotic machinery. This one has a prescription lens." - id = "diagnostic_hud_prescription" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/gold = 350) - build_path = /obj/item/clothing/glasses/hud/diagnostic/prescription - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - /datum/design/diagnostic_hud_night name = "Night Vision Diagnostic HUD" desc = "Upgraded version of the diagnostic HUD designed to function during a power failure." @@ -112,16 +82,6 @@ category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_ENGINEERING -/datum/design/mesons_prescription - name = "Prescription Optical Meson Scanners" - desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition. Prescription lens has been added into this design." - id = "mesons_prescription" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 350) - build_path = /obj/item/clothing/glasses/meson/prescription - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_ENGINEERING - /datum/design/engine_goggles name = "Engineering Scanner Goggles" desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, regardless of lighting condition. The T-ray Scanner mode lets you see underfloor objects such as cables and pipes." @@ -132,16 +92,6 @@ category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING -/datum/design/engine_goggles_prescription - name = "Prescription Engineering Scanner Goggles" - desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, regardless of lighting condition. The T-ray Scanner mode lets you see underfloor objects such as cables and pipes. Prescription lens has been added into this design." - id = "engine_goggles_prescription" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/plasma = 100, /datum/material/silver = 350) - build_path = /obj/item/clothing/glasses/meson/engine/prescription - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - /datum/design/tray_goggles name = "Optical T-Ray Scanners" desc = "Used by engineering staff to see underfloor objects such as cables and pipes." @@ -152,16 +102,6 @@ category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING -/datum/design/tray_goggles_prescription - name = "Prescription Optical T-Ray Scanners" - desc = "Used by engineering staff to see underfloor objects such as cables and pipes. Prescription lens has been added into this design." - id = "tray_goggles_prescription" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 150) - build_path = /obj/item/clothing/glasses/meson/engine/tray/prescription - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - /datum/design/nvgmesons name = "Night Vision Optical Meson Scanners" desc = "Prototype meson scanners fitted with an extra sensor which amplifies the visible light spectrum and overlays it to the UHD display." @@ -175,22 +115,22 @@ /datum/design/night_vision_goggles name = "Night Vision Goggles" desc = "Goggles that let you see through darkness unhindered." - id = "night_visision_goggles" + id = "night_vision_goggles" build_type = PROTOLATHE materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/plasma = 350, /datum/material/uranium = 1000) build_path = /obj/item/clothing/glasses/night category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY -/datum/design/night_vision_goggles_glasses - name = "Prescription Night Vision Goggles" - desc = "Goggles that let you see through darkness unhindered. Corrects vision." - id = "night_visision_goggles_glasses" +/datum/design/prescription_kit + name = "Prescription Lens Kit" + desc = "A do-it-yourself kit that lets you add a prescription overlay to any HUDs or other eyewear. Even the ones that shouldn't." + id = "prescription_kit" build_type = PROTOLATHE - materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/plasma = 350, /datum/material/uranium = 1000) - build_path = /obj/item/clothing/glasses/night/prescription + materials = list(/datum/material/iron = 500, /datum/material/glass = 200, /datum/material/silver = 100) // silver because i guess all the prescription HUDs had it? + build_path = /obj/item/prescription_kit category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_ENGINEERING + departmental_flags = DEPARTMENTAL_FLAG_ALL ///////////////////////////////////////// //////////////////Misc/////////////////// @@ -407,6 +347,16 @@ category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SERVICE | DEPARTMENTAL_FLAG_ENGINEERING +/datum/design/light_replacer_blue + name = "Bluespace Light Replacer" + desc = "A device to automatically replace lights at a distance. Refill with working light bulbs." + id = "light_replacer_blue" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1500, /datum/material/silver = 150, /datum/material/glass = 3000, /datum/material/bluespace = 300) + build_path = /obj/item/lightreplacer/blue + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE | DEPARTMENTAL_FLAG_ENGINEERING + /datum/design/normtrash name = "Trashbag" desc = "It's a bag for trash, you put garbage in it." diff --git a/code/modules/research/techweb/_techweb_node.dm b/code/modules/research/techweb/_techweb_node.dm index 92eaa2bd41..8ea4b95d03 100644 --- a/code/modules/research/techweb/_techweb_node.dm +++ b/code/modules/research/techweb/_techweb_node.dm @@ -106,4 +106,4 @@ "destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "bepis", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab", "paystand", "space_heater", "beaker", "large_beaker", "xlarge_beaker", "bucket", "hypovial", "large_hypovial", "syringe", "pillbottle", "sec_shellclip", "sec_beanbag", "sec_rshot", "sec_bshot", "sec_slug", "sec_islug", "sec_dart", "sec_38", "sec_38lethal", - "rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass", "salestagger") + "rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass", "salestagger", "light_replacer") diff --git a/code/modules/research/techweb/nodes/biotech_nodes.dm b/code/modules/research/techweb/nodes/biotech_nodes.dm index 350bbaa5c3..1a3aa2644e 100644 --- a/code/modules/research/techweb/nodes/biotech_nodes.dm +++ b/code/modules/research/techweb/nodes/biotech_nodes.dm @@ -13,7 +13,7 @@ display_name = "Advanced Biotechnology" description = "Advanced Biotechnology" prereq_ids = list("biotech") - design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "meta_beaker", "healthanalyzer_advanced", "harvester", "holobarrier_med", "defibrillator_compact", "smartdartgun", "medicinalsmartdart", "pHmeter", "hypospray_mkii", "containmentbodybag") + design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "meta_beaker", "healthanalyzer_advanced", "harvester", "holobarrier_med", "defibrillator_compact", "smartdartgun", "medicinalsmartdart", "pHmeter", "hypospray_mkii", "containmentbodybag", "prescription_kit") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) /datum/techweb_node/bio_process diff --git a/code/modules/research/techweb/nodes/bluespace_nodes.dm b/code/modules/research/techweb/nodes/bluespace_nodes.dm index fdbbab4e70..21e002b359 100644 --- a/code/modules/research/techweb/nodes/bluespace_nodes.dm +++ b/code/modules/research/techweb/nodes/bluespace_nodes.dm @@ -13,7 +13,7 @@ display_name = "Applied Bluespace Research" description = "Using bluespace to make things faster and better." prereq_ids = list("bluespace_basic", "engineering") - design_ids = list("bs_rped","biobag_holding","minerbag_holding", "bluespacebeaker", "bluespacesyringe", "phasic_scanning", "bluespacesmartdart", "xenobio_slimebasic", "bluespace_tray") + design_ids = list("bs_rped","biobag_holding","minerbag_holding", "bluespacebeaker", "bluespacesyringe", "phasic_scanning", "bluespacesmartdart", "xenobio_slimebasic", "bluespace_tray", "light_replacer_blue") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) /datum/techweb_node/adv_bluespace diff --git a/code/modules/research/techweb/nodes/computer_hud_nodes.dm b/code/modules/research/techweb/nodes/computer_hud_nodes.dm index 0f2cf2e4bd..780c146fee 100644 --- a/code/modules/research/techweb/nodes/computer_hud_nodes.dm +++ b/code/modules/research/techweb/nodes/computer_hud_nodes.dm @@ -40,7 +40,7 @@ display_name = "Integrated HUDs" description = "The usefulness of computerized records, projected straight onto your eyepiece!" prereq_ids = list("comp_recordkeeping", "emp_basic") - design_ids = list("health_hud", "security_hud", "diagnostic_hud", "scigoggles", "health_hud_prescription", "security_hud_prescription", "diagnostic_hud_prescription") + design_ids = list("health_hud", "security_hud", "diagnostic_hud", "scigoggles") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) /datum/techweb_node/NVGtech @@ -48,7 +48,7 @@ display_name = "Night Vision Technology" description = "Allows seeing in the dark without actual light!" prereq_ids = list("integrated_HUDs", "adv_engi", "emp_adv") - design_ids = list("health_hud_night", "security_hud_night", "diagnostic_hud_night", "night_visision_goggles", "nvgmesons", "night_visision_goggles_glasses") + design_ids = list("health_hud_night", "security_hud_night", "diagnostic_hud_night", "night_vision_goggles", "nvgmesons") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) /datum/techweb_node/computer_board_gaming diff --git a/code/modules/research/techweb/nodes/engineering_nodes.dm b/code/modules/research/techweb/nodes/engineering_nodes.dm index 2b5d6f3cc1..51b9480c27 100644 --- a/code/modules/research/techweb/nodes/engineering_nodes.dm +++ b/code/modules/research/techweb/nodes/engineering_nodes.dm @@ -7,8 +7,8 @@ prereq_ids = list("base") design_ids = list("solarcontrol", "recharger", "powermonitor", "rped", "pacman", "adv_capacitor", "adv_scanning", "emitter", "high_cell", "adv_matter_bin", "atmosalerts", "atmos_control", "recycler", "autolathe", "autolathe_secure", "high_micro_laser", "nano_mani", "mesons", "thermomachine", "rad_collector", "tesla_coil", "grounding_rod", - "apc_control", "power control", "airlock_board", "firelock_board", "airalarm_electronics", "firealarm_electronics", "cell_charger", "stack_console", "stack_machine", "rcd_ammo","oxygen_tank", - "plasma_tank", "emergency_oxygen", "emergency_oxygen_engi", "plasmaman_tank_belt", "colormate") + "apc_control", "power control", "airlock_board", "firelock_board", "airalarm_electronics", "firealarm_electronics", "cell_charger", "stack_console", "stack_machine", "rcd_ammo", "oxygen_tank", + "plasma_tank", "emergency_oxygen", "emergency_oxygen_engi", "plasmaman_tank_belt", "colormate", "conveyor_sorter") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 6000) /datum/techweb_node/adv_engi @@ -17,8 +17,7 @@ description = "Pushing the boundaries of physics, one chainsaw-fist at a time." prereq_ids = list("engineering", "emp_basic") design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask" , "rcd_loaded", "rpd", - "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription", "rcd_upgrade_frames", - "rcd_upgrade_simple_circuits", "rcd_ammo_large", "sheetifier") + "rcd_upgrade_frames", "rcd_upgrade_simple_circuits", "rcd_ammo_large", "sheetifier") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000) /datum/techweb_node/anomaly diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index e1b198ade2..420810d7d2 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -20,6 +20,10 @@ if(!. || synthesizing) return + // Check if this user can process nutriment + if(HAS_TRAIT(owner, TRAIT_NO_PROCESS_FOOD)) + return + if(owner.nutrition <= hunger_threshold) synthesizing = TRUE to_chat(owner, "You feel less hungry...") diff --git a/code/modules/vehicles/cars/car.dm b/code/modules/vehicles/cars/car.dm index 81b2db6cf8..e024718f4c 100644 --- a/code/modules/vehicles/cars/car.dm +++ b/code/modules/vehicles/cars/car.dm @@ -2,6 +2,7 @@ layer = ABOVE_MOB_LAYER anchored = TRUE default_driver_move = FALSE + var/explode_on_death = TRUE var/car_traits = NONE //Bitflag for special behavior such as kidnapping var/engine_sound = 'sound/vehicles/carrev.ogg' var/last_enginesound_time @@ -12,6 +13,11 @@ . = ..() LoadComponent(/datum/component/riding) +/obj/vehicle/sealed/car/Destroy() + . = ..() + if(explode_on_death) + explosion(loc, 0, 1, 2, 3, 0) + /obj/vehicle/sealed/car/generate_actions() . = ..() initialize_controller_action_type(/datum/action/vehicle/sealed/remove_key, VEHICLE_CONTROL_DRIVE) diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm index 1a1858522a..7bb4e878ec 100644 --- a/code/modules/vehicles/sealed.dm +++ b/code/modules/vehicles/sealed.dm @@ -1,7 +1,6 @@ /obj/vehicle/sealed enclosed = TRUE // you're in a sealed vehicle dont get dinked idiot var/enter_delay = 20 - var/explode_on_death = TRUE flags_1 = BLOCK_FACE_ATOM_1 /obj/vehicle/sealed/generate_actions() @@ -90,8 +89,6 @@ /obj/vehicle/sealed/Destroy() DumpMobs() - if(explode_on_death) - explosion(loc, 0, 1, 2, 3, 0) return ..() /obj/vehicle/sealed/proc/DumpMobs(randomstep = TRUE) diff --git a/code/modules/vending/cartridge.dm b/code/modules/vending/cartridge.dm index c4b35496c2..d80d8e958e 100644 --- a/code/modules/vending/cartridge.dm +++ b/code/modules/vending/cartridge.dm @@ -5,15 +5,34 @@ product_slogans = "Carts to go!" icon_state = "cart" icon_deny = "cart-deny" - products = list(/obj/item/cartridge/medical = 10, + products = list(/obj/item/pda/heads = 10, // PDA + // Normal staff cards + /obj/item/cartridge/medical = 10, /obj/item/cartridge/engineering = 10, /obj/item/cartridge/security = 10, /obj/item/cartridge/janitor = 10, /obj/item/cartridge/signal/toxins = 10, /obj/item/cartridge/roboticist = 10, - /obj/item/pda/heads = 10, + /obj/item/cartridge/atmos = 10, + /obj/item/cartridge/chemistry = 10, + /obj/item/cartridge/detective = 10, + /obj/item/cartridge/lawyer = 10, + /obj/item/cartridge/curator = 10, + /obj/item/cartridge/bartender = 10, + + // Virus cards + /obj/item/cartridge/virus/clown = 3, + /obj/item/cartridge/virus/mime = 3, + + // Command staff cards /obj/item/cartridge/captain = 3, - /obj/item/cartridge/quartermaster = 10) + /obj/item/cartridge/quartermaster = 10, + /obj/item/cartridge/head = 10, + /obj/item/cartridge/hos = 10, + /obj/item/cartridge/ce = 10, + /obj/item/cartridge/cmo = 10, + /obj/item/cartridge/rd = 10) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50) refill_canister = /obj/item/vending_refill/cart resistance_flags = FIRE_PROOF diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index 29314c3e31..52fbd7dac4 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -19,9 +19,9 @@ /obj/item/storage/fancy/donut_box = 2, /obj/item/storage/belt/sabre/secbelt = 1) premium = list(/obj/item/coin/antagtoken = 1, - /obj/item/clothing/head/helmet/blueshirt = 5, //SPLURT edit, origional was 1 - /obj/item/clothing/suit/armor/vest/blueshirt = 5, //SPLURT edit, origional was 1 - /obj/item/clothing/under/rank/security/officer/blueshirt = 5, //SPLURT edit, origional was 1 + /obj/item/clothing/head/helmet/blueshirt = 1, + /obj/item/clothing/suit/armor/vest/blueshirt = 1, + /obj/item/clothing/under/rank/security/officer/blueshirt = 1, /obj/item/clothing/gloves/tackler = 5, /obj/item/grenade/stingbang = 1, /obj/item/ssword_kit = 1, diff --git a/html/changelogs/archive/2022-12.yml b/html/changelogs/archive/2022-12.yml index ebb8ea7889..4efa7f1d12 100644 --- a/html/changelogs/archive/2022-12.yml +++ b/html/changelogs/archive/2022-12.yml @@ -78,5 +78,22 @@ - tweak: Tunnel Fox jacket is now toggleable - bugfix: Tunnel Fox jacket and HoP parade jacket now show up on digitigrade sprites 2022-12-25: + FromRussiaWithLove: + - bugfix: 'fixing missing stamps : centcom, syndicate, chapel and mime.' + - imageadd: 'added some icons for missing stamps : centcom, syndicate, chapel and + mime.' SpookyTheFox: - tweak: changed the anything gift list to the santa gift list +2022-12-28: + LeDrascol: + - tweak: Dice of Fate is now usable once per-person + LunarFleet: + - rscadd: Added a new quirk, and a new statue type for said quirk +2022-12-30: + BongaTheProto: + - tweak: makes the sand megafauna mob into mayhem lmao + - rscadd: adds a new drink, Skullfucker deluxe +2022-12-31: + zeroisthebiggay: + - spellcheck: horny ai laws + - spellcheck: horny ai law priority diff --git a/html/changelogs/archive/2023-01.yml b/html/changelogs/archive/2023-01.yml new file mode 100644 index 0000000000..33d0441fb1 --- /dev/null +++ b/html/changelogs/archive/2023-01.yml @@ -0,0 +1,200 @@ +2023-01-01: + FromRussiaWithLove: + - rscadd: Displaying Game Mode in status panel +2023-01-02: + zeroisthebiggay: + - imageadd: shading for ass sprites +2023-01-03: + FelixRuin: + - bugfix: fixed inert egg was always has chicken egg sprite regardless of the pref + choice. + KeplerWasTaken: + - bugfix: Kilo Cargo Shuttle now has tiny fans! + - bugfix: Mining Points Vending Machine can no longer be exploited for infinite + points via transfer cards + - bugfix: Double doors at sec entrance in box station now have proper access requirements, + enjoy! + - rscadd: Improves Moth in Command to be an improved version of Commander and Chief + SpookyTheFox: + - tweak: moved blueshift themed sec gear out of premium pricing. +2023-01-08: + LeDrascol: + - bugfix: Fixed techweb sequence break for Advanced Toolset Implant + - tweak: Cryptominer no longer functions in space + - tweak: Cryptominer no longer produces Co2 + - code_imp: Refactored processing for cryptominer +2023-01-09: + LeDrascol: + - tweak: Fluid Infuser implant uses an improved activation button + - rscadd: Added the Storage Concealment Implant + SandPoot: + - rscadd: Added a fancy reskin for the mining hardsuit, modify it using Alt-Click! + - imageadd: Special sprites made by Dexxiol#3462! +2023-01-10: + BongaTheProto: + - rscadd: New sloog sprites for character creation and backpack + - rscadd: New type of eyes, none + - bugfix: Fixes misclassing of sec badge + LeDrascol: + - tweak: Liquid Panty Dropper now launches clothing + - tweak: Liquid Panty Dropper no longer interferes with held items + - code_imp: LPD's clothing burst is now a mob proc + - bugfix: Fixed the late-join panel showing job slots twice +2023-01-11: + BongaTheProto: + - bugfix: Fixes gun reskins broken by the new reskin system + Seris02: + - bugfix: fixed gargoyles having sprites that are odd, along with sanity checks + and making the transition between living and statue seamless +2023-01-12: + LeDrascol: + - refactor: Moved quirk action datums to a new file + - rscadd: Added a Plushmium Crate to cargo +2023-01-13: + Guatolipo: + - rscadd: Added CART_CHEMISTRY access to cart-cmo + LeDrascol: + - tweak: Replaced three dangerous holodeck modes with harmless alternatives +2023-01-14: + LeDrascol: + - bugfix: Fixed spelling mistakes in the interaction system + - rscadd: Added the Love to Life spray bottle + - tweak: Updated Plushmium Crate contents + - rscadd: 'Added implant: Rapid Disrobe' + - tweak: Nudists now start with a Rapid Disrobe implant + - rscadd: Added the Wallet of Holding +2023-01-15: + BongaTheProto: + - rscadd: Adds nobl donator plushie + - rscadd: Adds a *poyo emote + Casper: + - bugfix: fixes telekinetic users from teleporting to stripper poles + - bugfix: infinite metal exploit + SandPoot: + - spellcheck: fixed a few typos. + - refactor: refactored skirt peeking. + - tweak: examine someone twice to actually peek their panties. +2023-01-16: + SandPoot: + - rscadd: You can now allow interacting with your genitals through clothes. + - tweak: Modified sandstorm's spans (`"...`) with the defines (`span_x("...`) +2023-01-17: + BongaTheProto: + - code_imp: optimizes some genital related code + LeDrascol: + - code_imp: Added span defines for 'reallybig hypnophrase', 'big warning', 'header', + and 'umbra' + - refactor: All HTML spans are now defines-based + - tweak: Moved Autodoc techweb entry from Advanced Surgery to Advanced Surgery Tools + SishTis: + - rscadd: Addead keybinds to put/take items in/from suit storage and pockets slots. + zeroisthebiggay: + - spellcheck: You +2023-01-18: + LeDrascol: + - tweak: Moved Autodoc techweb entry from Advanced Surgery to Advanced Surgery Tools + - tweak: Bluespace mining research is now behind Anomaly Research + - balance: Bluespace miners now require a bluespace anomaly core + SandPoot: + - balance: Maybe very small amounts of air aren't as aggressive with pushing stuff + around. + - balance: Way too much air can send you FLYING, maybe think twice about opening + that airlock/firelock now. + - imageadd: Added space wind image for air pushing stuff. +2023-01-19: + LeDrascol: + - bugfix: Fixed spelling mistakes in server's clothing entries + - imageadd: Updated sprite for Chalice of Cum + - imagedel: Removed duplicate TG drink icons + - tweak: Liquid Panty Dropper now checks client prefs +2023-01-20: + LeDrascol: + - rscadd: Added a surplus condom box to Kinkmates + Winter Schock: + - bugfix: Doll with monophobia dont get stress in someone vore belly + - bugfix: Blind doll with monophobia dont get stress while someone in 1 tile range +2023-01-21: + LeDrascol: + - balance: Synthetic Lizardperson, Synthetic Anthropomorph, and IPC no longer experience + thirst + SandPoot: + - rscadd: Added a reskin to the premium kinetic accelerator. + - bugfix: Fixed some possible graphical glitches with the mining hardsuit reskin. + - tweak: Tweaked skirt peeking into allowing peeking under people that are on top + of tables. + - refactor: Refactored skirt peeking into element. + zeroisthebiggay: + - spellcheck: the meme emotes +2023-01-22: + LeDrascol: + - bugfix: Fixed missing newline characters for mood events + WoolyAypa: + - rscadd: Added a new nullrod re-skin + - rscadd: Added papal clothing to the armament beacon choices +2023-01-23: + LunarFleet: + - tweak: Allowed borgs to craft + - tweak: Changes service borgs' items +2023-01-24: + LeDrascol: + - tweak: Bloodfledge flavor text updated + - tweak: Bloodfledge ability buttons are bloodsucker themed + - tweak: Bloodfledge biting considers many more factors + - tweak: Bloodfledge biting limits safe blood transfer while passive grabbing + - tweak: Bloodfledge biting splatters blood if interrupted + - tweak: Bloodfledge biting from same-species non-standard blood species transfers + instead of nourishing + - tweak: Bloodfledge biting species penalties do not apply on same-species interactions + - tweak: Bloodfledge ID cards will use their holder's financial account + - tweak: Bloodfledges will become upset when draining robots, slimes, corpses, or + undead + - tweak: Bloodfledges are penalized for fully draining any body + - tweak: Bloodfledges gain a mood effect from drinking from Cursed Blood users + - tweak: Bloodfledges can over-drink and become fat + - balance: Bloodsucker Fledgling is now a positive quirk, costing 2 points + - balance: Bloodfledges have less arbitrary traits + - balance: Bloodfledges can't use the power cord implant + - balance: Bloodfledge revive cannot be used while starving, the body is too damaged, + or the user suicides + - balance: Bloodfledge coffin healing rate reduced slightly + - balance: Bloodfledge coffin healing costs hunger based on healed amount + - balance: Bloodfledge coffin healing does not work on robots + - balance: Bloodfledge bite cooldown increased slightly + - balance: Bloodfledge interactions benefit from Voracious + - balance: Bloodfledge chapel penalties removed + - balance: Holy water is more dangerous for bloodfledges + - bugfix: Fixed various spelling mistakes related to Bloodsucker Fledglings + - bugfix: Fixed Bloodfledge ID card getting lost with full backpacks + - imageadd: Added a new icon and overlay for vampire IDs + - imagedel: Removed old non-modular vampire ID icon + - refactor: Refactored all Bloodsucker Fledgling code + - refactor: Trait BLOODFLEDGE is now TRAIT_BLOODFLEDGE +2023-01-25: + LeDrascol: + - rscadd: 'Added quirk: DNC Order' + - code_imp: Removed redundant definition of DNC quirk + - tweak: Moved Research Rack from Data Theory to Biological Technology +2023-01-26: + Kush1Push1: + - rscadd: Ported body markings for head; pilot and pilot jaw. + ShamanSliph: + - rscadd: 'Added new Quirk: Clothes Eater' + - bugfix: Fixed insects getting infinite nutrient from chewing on clothes. +2023-01-27: + AshTheDerg: + - tweak: Modified Booze Shaker options + - bugfix: fixed broken Borg Beer Shaker +2023-01-28: + '@Dexxiol': + - imageadd: Done some ui sprites for the underwear slots. + LeDrascol: + - rscadd: Added the Saliith plushie pinpointer + - tweak: The Saliith plushie will throw knives instead of deleting them + - tweak: The Saliith plushie will appear in a random location on the map + - tweak: Only one Saliith plushie can exist in the game at once + - balance: The Saliith plushie is now indestructible + - balance: The Saliith plushie cannot be destroyed by any means + - balance: The Saliith plushie now uses a lightning smite instead of gibbing + - balance: The Saliith plushie will no longer smite brainwashed victims + - balance: The Saliith plushie will now retaliate against plushmium use + - imageadd: Added a green pinpointer sprite diff --git a/icons/effects/96x32.dmi b/icons/effects/96x32.dmi index 937b2e8d42..a78d11530b 100644 Binary files a/icons/effects/96x32.dmi and b/icons/effects/96x32.dmi differ diff --git a/icons/effects/atmospherics.dmi b/icons/effects/atmospherics.dmi index 6c2412c04b..8fce46c9c3 100644 Binary files a/icons/effects/atmospherics.dmi and b/icons/effects/atmospherics.dmi differ diff --git a/icons/mob/clothing/eyes.dmi b/icons/mob/clothing/eyes.dmi index 49702bf920..1525ba9a93 100644 Binary files a/icons/mob/clothing/eyes.dmi and b/icons/mob/clothing/eyes.dmi differ diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi index fb0246e6e3..26a8b1808f 100644 Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi index 4bc2136cd1..c8f0b8f634 100644 Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ diff --git a/icons/mob/inhands/equipment/custodial_righthand.dmi b/icons/mob/inhands/equipment/custodial_righthand.dmi index 26d8e61163..c986155b10 100644 Binary files a/icons/mob/inhands/equipment/custodial_righthand.dmi and b/icons/mob/inhands/equipment/custodial_righthand.dmi differ diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi index 75f84347b6..83d71c1093 100644 Binary files a/icons/obj/abductor.dmi and b/icons/obj/abductor.dmi differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index 7b00c155ef..c59f00e383 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index 00b57726f1..d9fd50c9ed 100644 Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi index 1752892b60..c98c984c7d 100644 Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 6e8ea50d39..0831f7be2f 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index a1bb406b9f..5ddd73d934 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 6501126e02..567fc8ace8 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/genitals/butt_onmob.dmi b/icons/obj/genitals/butt_onmob.dmi index 95a75fa745..f71417d30e 100644 Binary files a/icons/obj/genitals/butt_onmob.dmi and b/icons/obj/genitals/butt_onmob.dmi differ diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi index 50975dc828..74ec511768 100644 Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ diff --git a/icons/obj/recycling.dmi b/icons/obj/recycling.dmi index 9604d6b97e..621b9e4241 100644 Binary files a/icons/obj/recycling.dmi and b/icons/obj/recycling.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 4cee011ecd..8085931b6e 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/modular_citadel/code/modules/client/loadout/backpack.dm b/modular_citadel/code/modules/client/loadout/backpack.dm index 5879426041..a0be000b31 100644 --- a/modular_citadel/code/modules/client/loadout/backpack.dm +++ b/modular_citadel/code/modules/client/loadout/backpack.dm @@ -190,3 +190,8 @@ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION subcategory = LOADOUT_SUBCATEGORY_BACKPACK_ACCESSORIES cost = 0 + +// Moved here from quirks +/datum/gear/backpack/dyespray + name = "Hair dye spray" + path = /obj/item/dyespray diff --git a/modular_citadel/code/modules/client/loadout/glasses.dm b/modular_citadel/code/modules/client/loadout/glasses.dm index fe44abc3de..0ca9aa0e05 100644 --- a/modular_citadel/code/modules/client/loadout/glasses.dm +++ b/modular_citadel/code/modules/client/loadout/glasses.dm @@ -45,3 +45,7 @@ /datum/gear/glasses/prescription name = "Prescription glasses" path = /obj/item/clothing/glasses/regular + +/datum/gear/glasses/modern + name = "Modern prescription glasses" + path = /obj/item/clothing/glasses/regular/modern diff --git a/modular_citadel/code/modules/client/loadout/head.dm b/modular_citadel/code/modules/client/loadout/head.dm index e6e91c701e..fdaee6f309 100644 --- a/modular_citadel/code/modules/client/loadout/head.dm +++ b/modular_citadel/code/modules/client/loadout/head.dm @@ -195,6 +195,12 @@ restricted_desc = "Security" restricted_roles = list("Warden","Detective","Security Officer","Head of Security") +/datum/gear/head/cowboyhat/polychromic + name = "Cowboy Hat, Polychromic" + path = /obj/item/clothing/head/cowboyhat/polychromic + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#5F5F5F", "#DDDDDD") + /datum/gear/head/wkepi name = "white kepi" path = /obj/item/clothing/head/kepi diff --git a/modular_citadel/code/modules/client/loadout/suit.dm b/modular_citadel/code/modules/client/loadout/suit.dm index 1d4a29ef3e..2685812232 100644 --- a/modular_citadel/code/modules/client/loadout/suit.dm +++ b/modular_citadel/code/modules/client/loadout/suit.dm @@ -18,7 +18,6 @@ /datum/gear/suit/redhood name = "Red cloak" path = /obj/item/clothing/suit/hooded/cloak/david - cost = 3 /datum/gear/suit/jacketbomber name = "Bomber jacket" @@ -160,14 +159,14 @@ /datum/gear/suit/coat/polycoat name = "Polychromic winter coat" path = /obj/item/clothing/suit/hooded/wintercoat/polychromic - cost = 4 //too many people with neon green coats is hard on the eyes + cost = 2 //too many people with neon green coats is hard on the eyes // it's probably fine now loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC loadout_initial_colors = list("#6A6964", "#C4B8A6", "#0000FF") /datum/gear/suit/coat/wbreakpoly name = "Polychromic windbreaker" path = /obj/item/clothing/suit/toggle/wbreakpoly/polychromic - cost = 4 + cost = 2 loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC loadout_initial_colors = list("#464F65", "#916035", "#474747") diff --git a/modular_citadel/code/modules/client/loadout/uniform.dm b/modular_citadel/code/modules/client/loadout/uniform.dm index 3300901d9a..280f6a2485 100644 --- a/modular_citadel/code/modules/client/loadout/uniform.dm +++ b/modular_citadel/code/modules/client/loadout/uniform.dm @@ -280,36 +280,34 @@ /datum/gear/uniform/suit/poly name = "Polychromic Button-up Shirt" path = /obj/item/clothing/under/misc/poly_shirt - cost = 3 + cost = 2 loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC loadout_initial_colors = list("#FFFFFF", "#353535", "#353535") /datum/gear/uniform/skirt/poly/pleated name = "Polychromic Pleated Sweaterskirt" path = /obj/item/clothing/under/dress/skirt/polychromic/pleated - cost = 3 + cost = 2 loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC loadout_initial_colors = list("#8CC6FF", "#808080", "#FF3535") /datum/gear/uniform/polykilt name = "Polychromic Kilt" path = /obj/item/clothing/under/costume/kilt/polychromic - cost = 3 + cost = 2 loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC loadout_initial_colors = list("#FFFFFF", "#F08080") /datum/gear/uniform/shorts/poly name = "Polychromic Shorts" path = /obj/item/clothing/under/misc/polyshorts - cost = 3 + cost = 2 loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC loadout_initial_colors = list("#353535", "#808080", "#808080") /datum/gear/uniform/shorts/poly/athletic name = "Polychromic Athletic Shorts" path = /obj/item/clothing/under/shorts/polychromic - cost = 2 - loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC loadout_initial_colors = list("#FFFFFF", "#F08080") /datum/gear/uniform/hopcasual diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm index 500db4453f..ec97d0659f 100644 --- a/modular_citadel/code/modules/custom_loadout/custom_items.dm +++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm @@ -550,7 +550,10 @@ item_state = "fritz" attack_verb = list("barked", "boofed", "shotgun'd") obj_flags = UNIQUE_RENAME - unique_reskin = list("Goodboye" = "fritz", "Badboye" = "fritz_bad") + unique_reskin = list( + "Goodboye" = list("icon_state" = "fritz"), + "Badboye" = list("icon_state" = "fritz_bad") + ) mutantrace_variation = NONE /obj/item/clothing/neck/cloak/polychromic/polyce diff --git a/modular_sand/code/_globalvars/bitfields.dm b/modular_sand/code/_globalvars/bitfields.dm index 934786c792..c149e1c11e 100644 --- a/modular_sand/code/_globalvars/bitfields.dm +++ b/modular_sand/code/_globalvars/bitfields.dm @@ -4,6 +4,26 @@ (this sort of bitfield definition will ALWAYS use this menu so you can't var edit normally) */ + +DEFINE_BITFIELD(flags_inv, list( + "HIDEACCESSORY" = HIDEACCESSORY, + "HIDEEARS" = HIDEEARS, + "HIDEEYES" = HIDEEYES, + "HIDEFACE" = HIDEFACE, + "HIDEFACIALHAIR" = HIDEFACIALHAIR, + "HIDEGLOVES" = HIDEGLOVES, + "HIDEHAIR" = HIDEHAIR, + "HIDEJUMPSUIT" = HIDEJUMPSUIT, + "HIDEMASK" = HIDEMASK, + "HIDENECK" = HIDENECK, + "HIDESHOES" = HIDESHOES, + "HIDESNOUT" = HIDESNOUT, + "HIDESUITSTORAGE" = HIDESUITSTORAGE, + "HIDETAUR" = HIDETAUR, + "HIDEUNDERWEAR" = HIDEUNDERWEAR, + "HIDEWRISTS" = HIDEWRISTS, +)) + DEFINE_BITFIELD(slot_flags, list( "ITEM_SLOT_BACK" = ITEM_SLOT_BACK, "ITEM_SLOT_BACKPACK" = ITEM_SLOT_BACKPACK, @@ -31,3 +51,22 @@ DEFINE_BITFIELD(slot_flags, list( "ITEM_SLOT_UNDERWEAR" = ITEM_SLOT_UNDERWEAR, "ITEM_SLOT_WRISTS" = ITEM_SLOT_WRISTS, )) + +DEFINE_BITFIELD(vis_flags_inv, list( + "HIDEACCESSORY" = HIDEACCESSORY, + "HIDEEARS" = HIDEEARS, + "HIDEEYES" = HIDEEYES, + "HIDEFACE" = HIDEFACE, + "HIDEFACIALHAIR" = HIDEFACIALHAIR, + "HIDEGLOVES" = HIDEGLOVES, + "HIDEHAIR" = HIDEHAIR, + "HIDEJUMPSUIT" = HIDEJUMPSUIT, + "HIDEMASK" = HIDEMASK, + "HIDENECK" = HIDENECK, + "HIDESHOES" = HIDESHOES, + "HIDESNOUT" = HIDESNOUT, + "HIDESUITSTORAGE" = HIDESUITSTORAGE, + "HIDETAUR" = HIDETAUR, + "HIDEUNDERWEAR" = HIDEUNDERWEAR, + "HIDEWRISTS" = HIDEWRISTS, +)) diff --git a/modular_sand/code/_globalvars/lists/lewd_content.dm b/modular_sand/code/_globalvars/lists/lewd_content.dm new file mode 100644 index 0000000000..686e610126 --- /dev/null +++ b/modular_sand/code/_globalvars/lists/lewd_content.dm @@ -0,0 +1,23 @@ +/* + * List of clothes with possible peeking under, + * It is prefilled with clothes that cannot be caught + * by the automatic system (has no skirt in path) +*/ +GLOBAL_LIST_INIT(skirt_peekable, list( + /obj/item/clothing/under/rank/civilian/janitor/maid = TRUE, + /obj/item/clothing/under/costume/loincloth = TRUE, + /obj/item/clothing/under/costume/loincloth/cloth = TRUE, + /obj/item/clothing/under/costume/loincloth/cloth/sensor = TRUE, + )) + +/* + * List of clothes you can't say a pair of. + * Ex: + * A pair of jockstrap? +*/ +GLOBAL_LIST_INIT(pairless_panties, list( + /obj/item/clothing/underwear/briefs/jockstrap = TRUE, + /obj/item/clothing/underwear/briefs/panties/thong = TRUE, + /obj/item/clothing/underwear/briefs/panties/thong/babydoll = TRUE, + /obj/item/clothing/underwear/briefs/mankini = TRUE +)) diff --git a/modular_sand/code/_globalvars/lists/objects.dm b/modular_sand/code/_globalvars/lists/objects.dm index dd737fbe73..bbdfa5207d 100644 --- a/modular_sand/code/_globalvars/lists/objects.dm +++ b/modular_sand/code/_globalvars/lists/objects.dm @@ -1,2 +1,3 @@ GLOBAL_LIST_EMPTY(ic_jammers) GLOBAL_LIST_EMPTY(ic_speakers) +GLOBAL_DATUM_INIT(saliith_plushie, /obj/item/toy/plush/lizardplushie/saliith, new) diff --git a/modular_sand/code/controllers/subsystem/language.dm b/modular_sand/code/controllers/subsystem/language.dm index faa3fa3e1d..c0abd0b720 100644 --- a/modular_sand/code/controllers/subsystem/language.dm +++ b/modular_sand/code/controllers/subsystem/language.dm @@ -24,7 +24,7 @@ continue if(valid_languages.len) var/list/sorted_valid = sortList(valid_languages) - to_chat(user, "You are able to speak in [sorted_valid.Join(", ")]. If you're actually good at [valid_languages.len > 1 ? "them" : "it"] or not, it's up to you.") + to_chat(user, span_notice("You are able to speak in [sorted_valid.Join(", ")]. If you're actually good at [valid_languages.len > 1 ? "them" : "it"] or not, it's up to you.")) if(invalid_languages.len) var/list/sorted_invalid = sortList(invalid_languages) - to_chat(user, "[sorted_invalid.Join(", ")] [invalid_languages.len > 1 ? "are" : "is a"] restricted language[invalid_languages.len > 1 ? "s" : ""], and ha[invalid_languages.len > 1 ? "ve" : "s"] not been assigned.") + to_chat(user, span_warning("[sorted_invalid.Join(", ")] [invalid_languages.len > 1 ? "are" : "is a"] restricted language[invalid_languages.len > 1 ? "s" : ""], and ha[invalid_languages.len > 1 ? "ve" : "s"] not been assigned.")) diff --git a/modular_sand/code/datums/components/container_item/tank_holder.dm b/modular_sand/code/datums/components/container_item/tank_holder.dm index b68c413519..765335987c 100644 --- a/modular_sand/code/datums/components/container_item/tank_holder.dm +++ b/modular_sand/code/datums/components/container_item/tank_holder.dm @@ -17,12 +17,12 @@ var/obj/item/I = parent if(container.contents.len) if(user) - to_chat(user, "There's already something in [container].") + to_chat(user, span_warning("There's already something in [container].")) return TRUE if(user) if(!user.transferItemToLoc(I, container)) return TRUE - to_chat(user, "You put [I] into [container].") + to_chat(user, span_notice("You put [I] into [container].")) else I.forceMove(container) container.tank = I diff --git a/modular_sand/code/datums/elements/holder_micro.dm b/modular_sand/code/datums/elements/holder_micro.dm index d4d3b34d84..f264ded3b5 100644 --- a/modular_sand/code/datums/elements/holder_micro.dm +++ b/modular_sand/code/datums/elements/holder_micro.dm @@ -26,7 +26,7 @@ /datum/element/mob_holder/micro/on_examine(mob/living/source, mob/user, list/examine_list) if(ishuman(user) && !istype(source.loc, /obj/item/clothing/head/mob_holder) && (abs(get_size(source)/get_size(user)) <= CONFIG_GET(number/max_pick_ratio))) - examine_list += "Looks like [source.p_they(FALSE)] can be picked up using Alt+Click and grab intent!" + examine_list += span_notice("Looks like [source.p_they(FALSE)] can be picked up using Alt+Click and grab intent!") /datum/element/mob_holder/micro/proc/mob_pickup_micro(mob/living/source, mob/user) var/obj/item/clothing/head/mob_holder/micro/holder = new(get_turf(source), source, worn_state, alt_worn, right_hand, left_hand, inv_slots) @@ -50,41 +50,41 @@ if(!ishuman(user) || !user.Adjacent(source) || user.incapacitated()) return FALSE if(source == user) - to_chat(user, "You can't pick yourself up.") + to_chat(user, span_warning("You can't pick yourself up.")) source.balloon_alert(user, "cannot pick yourself!") return FALSE if(abs(get_size(source)/get_size(user)) > CONFIG_GET(number/max_pick_ratio)) - to_chat(user, "They're too big to pick up!") + to_chat(user, span_warning("They're too big to pick up!")) source.balloon_alert(user, "too big to pick up!") return FALSE if(user.get_active_held_item()) - to_chat(user, "Your hands are full!") + to_chat(user, span_warning("Your hands are full!")) source.balloon_alert(user, "hands are full!") return FALSE if(source.buckled) - to_chat(user, "[source] is buckled to something!") + to_chat(user, span_warning("[source] is buckled to something!")) source.balloon_alert(user, "buckled to something!") return FALSE - source.visible_message("[user] starts picking up [source].", \ - "[user] starts picking you up!") + source.visible_message(span_warning("[user] starts picking up [source]."), \ + span_userdanger("[user] starts picking you up!")) source.balloon_alert(user, "picking up") var/p = abs(get_size(source)/get_size(user) * 40) //Scale how fast the pickup will be depending on size difference if(!do_after(user, p, target = source)) return FALSE if(user.get_active_held_item()) - to_chat(user, "Your hands are full!") + to_chat(user, span_warning("Your hands are full!")) source.balloon_alert(user, "hands full!") return FALSE if(source.buckled) - to_chat(user, "[source] is buckled to something!") + to_chat(user, span_warning("[source] is buckled to something!")) source.balloon_alert(user, "buckled!") return FALSE - source.visible_message("[user] picks up [source]!", - "[user] picks you up!", + source.visible_message(span_warning("[user] picks up [source]!"), + span_userdanger("[user] picks you up!"), target = user, - target_message = "You pick [source] up.") + target_message = span_notice("You pick [source] up.")) source.drop_all_held_items() mob_pickup_micro(source, user) return TRUE @@ -100,14 +100,14 @@ //TODO: add a timer to escape someone's grip dependant on size diff /obj/item/clothing/head/mob_holder/micro/container_resist(mob/living/user) if(user.incapacitated()) - to_chat(user, "You can't escape while you're restrained like this!") + to_chat(user, span_warning("You can't escape while you're restrained like this!")) return var/mob/living/L = loc - visible_message("[src] begins to squirm in [L]'s grasp!") + visible_message(span_warning("[src] begins to squirm in [L]'s grasp!")) if(!do_after(user, 12 SECONDS, target = src, required_mobility_flags = MOBILITY_RESIST)) if(!user || user.stat != CONSCIOUS || user.loc != src) return - to_chat(loc, "[src] stops resisting.") + to_chat(loc, span_warning("[src] stops resisting.")) return visible_message("[src] escapes [L]!") release() @@ -133,17 +133,17 @@ var/mob/living/carbon/human/M = held_mob if(istype(M)) if(user.a_intent == "harm") //TO:DO, rework all of these interactions to be a lot more in depth - visible_message("[user] slams their fist down on [M]!", runechat_popup = TRUE, rune_msg = " slams their fist down on [M]!") + visible_message(span_danger("[user] slams their fist down on [M]!"), runechat_popup = TRUE, rune_msg = " slams their fist down on [M]!") playsound(loc, 'sound/weapons/punch1.ogg', 50, 1) M.adjustBruteLoss(5) return if(user.a_intent == "disarm") - visible_message("[user] pins [M] down with a finger!", runechat_popup = TRUE, rune_msg = " pins [M] down with a finger!") + visible_message(span_danger("[user] pins [M] down with a finger!"), runechat_popup = TRUE, rune_msg = " pins [M] down with a finger!") playsound(loc, 'sound/effects/bodyfall1.ogg', 50, 1) M.adjustStaminaLoss(10) return if(user.a_intent == "grab") - visible_message("[user] squeezes their fist around [M]!", runechat_popup = TRUE, rune_msg = " squeezes their fist around [M]!") + visible_message(span_danger("[user] squeezes their fist around [M]!"), runechat_popup = TRUE, rune_msg = " squeezes their fist around [M]!") playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1) M.adjustOxyLoss(5) return diff --git a/modular_sand/code/datums/elements/skirt_peeking.dm b/modular_sand/code/datums/elements/skirt_peeking.dm new file mode 100644 index 0000000000..e5be0fc434 --- /dev/null +++ b/modular_sand/code/datums/elements/skirt_peeking.dm @@ -0,0 +1,101 @@ +/datum/element/skirt_peeking + element_flags = ELEMENT_DETACH + +/datum/element/skirt_peeking/Attach(datum/peeked) + . = ..() + if(!ishuman(peeked)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(peeked, COMSIG_PARENT_EXAMINE, .proc/on_examine) + RegisterSignal(peeked, COMSIG_PARENT_EXAMINE_MORE, .proc/on_closer_look) + +/datum/element/skirt_peeking/proc/can_skirt_peek(mob/living/carbon/human/peeked, mob/peeker) + var/mob/living/living_peeker = peeker + var/obj/item/clothing/under/worn_uniform = peeked.get_item_by_slot(ITEM_SLOT_ICLOTHING) + + // Unfortunately, you can't see it + var/obj/item/clothing/suit/outer_clothing = peeked.get_item_by_slot(ITEM_SLOT_OCLOTHING) + if(outer_clothing && CHECK_MULTIPLE_BITFIELDS(outer_clothing.body_parts_covered, CHEST | GROIN | LEGS | FEET)) + return FALSE + // + + // Valid clothing section + if(worn_uniform && is_type_in_typecache(worn_uniform.type, GLOB.skirt_peekable)) + // We are being peeked by a spooky ghost who sees all? + if(isobserver(peeker)) + return TRUE + // Are you a living creature (and not us)? + if(istype(living_peeker) && (living_peeker != peeked)) + // And are you under us while we're standing up? + if(!(CHECK_BITFIELD(living_peeker.mobility_flags, MOBILITY_STAND)) && (CHECK_BITFIELD(peeked.mobility_flags, MOBILITY_STAND)) && (peeked.loc == living_peeker.loc)) + return TRUE + // Or are you nearby and we are up high + // to-do SOMEONE PLEASE PORT /datum/element/climbable + var/obj/structure/high_ground = locate(/obj/structure) in get_turf(peeked) + if(high_ground && high_ground.climbable && CHECK_BITFIELD(peeked.mobility_flags, MOBILITY_STAND) && \ + peeked.Adjacent(peeker)) + return TRUE + return FALSE + +/datum/element/skirt_peeking/proc/on_examine(mob/living/carbon/human/peeked, mob/peeker, list/examine_list) + if(can_skirt_peek(peeked, peeker)) + examine_list += span_purple("[peeked.p_theyre(TRUE)] wearing a skirt! I can probably give it a little peek looking closer.") + +/datum/element/skirt_peeking/proc/on_closer_look(mob/living/carbon/human/peeked, mob/peeker, list/examine_content) + if(can_skirt_peek(peeked, peeker)) + var/obj/item/clothing/under/worn_uniform = peeked.get_item_by_slot(ITEM_SLOT_ICLOTHING) + var/string = "Peeking under [peeked]'s [worn_uniform.name], you can see " + var/obj/item/clothing/underwear/worn_underwear = peeked.get_item_by_slot(ITEM_SLOT_UNDERWEAR) + if(worn_underwear) + string += "a " + if(!is_type_in_typecache(worn_underwear.type, GLOB.pairless_panties)) //a pair of thong + string += "pair of " + if(worn_underwear.color) + string += "[worn_underwear.name]." + else + string += "[worn_underwear.name]." + + var/obj/item/organ/genital/penis/penis = peeked.getorganslot(ORGAN_SLOT_PENIS) + var/obj/item/organ/genital/vagina/vagina = peeked.getorganslot(ORGAN_SLOT_VAGINA) + if(penis?.aroused_state) + string += span_love(" There's a visible bulge on [peeked.p_their()] front.") + else if(vagina?.aroused_state) + string += span_love(" [peeked.p_theyre(TRUE)] wet with arousal.") + + else + string += "[peeked.p_theyre()] not wearing anything!\n[peeked.p_their(TRUE)]" + var/list/genitals = list() + for(var/obj/item/organ/genital/genital in peeked.internal_organs) + if(CHECK_BITFIELD(genital.genital_flags, (GENITAL_INTERNAL|GENITAL_HIDDEN))) + continue + + var/appended + switch(genital.type) + if(/obj/item/organ/genital/vagina) + if(genital.aroused_state) + appended += " wet" + if(lowertext(genital.shape) != "human") + appended += " [lowertext(genital.shape)]" + if(lowertext(genital.shape) != "cloaca") //their wet cloaca vagina + appended += " [lowertext(genital.name)]" // goodbye pussy + + if(/obj/item/organ/genital/testicles) + var/obj/item/organ/genital/testicles/nuts = genital + appended += " [lowertext(nuts.size_name)] [lowertext(nuts.name)]" + if(/obj/item/organ/genital/penis) + if(genital.aroused_state) + appended += " fully erect" + if(lowertext(genital.shape) != "human") + appended += " [lowertext(genital.shape)]" + appended += " [lowertext(genital.name)]" // Name it something funny, i dare you. + if(/obj/item/organ/genital/butt) + var/obj/item/organ/genital/butt/booty = genital + appended += " [booty.size_name] [lowertext(booty.name)]" // Maybe " average butt pair" isn't the best for now + else + continue + genitals += appended + + string += english_list(genitals, " featureless groin", " and", ",") + string += " on full display." + + examine_content += span_purple(string) diff --git a/modular_sand/code/datums/interactions/_interaction.dm b/modular_sand/code/datums/interactions/_interaction.dm index c46ce23784..b7077ae80d 100644 --- a/modular_sand/code/datums/interactions/_interaction.dm +++ b/modular_sand/code/datums/interactions/_interaction.dm @@ -46,17 +46,17 @@ if(require_user_mouth) if(!user.has_mouth() && !issilicon(user)) //Again, silicons do not have the required parts normally. if(!silent) - to_chat(user, "You don't have a mouth.") + to_chat(user, span_warning("You don't have a mouth.")) return FALSE if(!user.mouth_is_free() && !issilicon(user)) //Borgs cannot wear mouthgear, bypassing the check. if(!silent) - to_chat(user, "Your mouth is covered.") + to_chat(user, span_warning("Your mouth is covered.")) return FALSE if(require_user_hands && !user.has_hands() && !issilicon(user)) //Edited to allow silicons to interact. if(!silent) - to_chat(user, "You don't have hands.") + to_chat(user, span_warning("You don't have hands.")) return FALSE if(COOLDOWN_FINISHED(user, last_interaction_time)) @@ -100,13 +100,13 @@ /datum/interaction/proc/do_action(mob/living/user, mob/living/target) if(!user_is_target) if(user == target) //tactical href fix - to_chat(user, "You cannot target yourself.") + to_chat(user, span_warning("You cannot target yourself.")) return if(get_dist(user, target) > max_distance) - to_chat(user, "They are too far away.") + to_chat(user, span_warning("They are too far away.")) return if(needs_physical_contact && !(user.Adjacent(target) && target.Adjacent(user))) - to_chat(user, "You cannot get to them.") + to_chat(user, span_warning("You cannot get to them.")) return if(!evaluate_user(user, silent = FALSE)) return diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/breasts.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/breasts.dm index 6fdd1df0c8..fdd4e5bf82 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/breasts.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/breasts.dm @@ -30,7 +30,7 @@ "lets a large stream of [u_His] own abundant [lowertext(milktext)] coat the back of \the [target]'s throat" ) - message = "\The [user] [pick(lines)]" + message = span_lewd("\The [user] [pick(lines)]") user.visible_message(message, ignored_mobs = user.get_unconsenting()) playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/oral1.ogg', 'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1) @@ -59,56 +59,56 @@ /datum/interaction/lewd/titgrope/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target) if(user.a_intent == INTENT_HELP) user.visible_message( - pick("\The [user] gently gropes \the [target]'s breast.", - "\The [user] softly squeezes \the [target]'s breasts.", - "\The [user] grips \the [target]'s breasts.", - "\The [user] runs a few fingers over \the [target]'s breast.", - "\The [user] delicately teases \the [target]'s nipple.", - "\The [user] traces a touch across \the [target]'s breast.")) + pick(span_lewd("\The [user] gently gropes \the [target]'s breast."), + span_lewd("\The [user] softly squeezes \the [target]'s breasts."), + span_lewd("\The [user] grips \the [target]'s breasts."), + span_lewd("\The [user] runs a few fingers over \the [target]'s breast."), + span_lewd("\The [user] delicately teases \the [target]'s nipple."), + span_lewd("\The [user] traces a touch across \the [target]'s breast."))) if(user.a_intent == INTENT_HARM) user.visible_message( - pick("\The [user] aggressively gropes \the [target]'s breast.", - "\The [user] grabs \the [target]'s breasts.", - "\The [user] tightly squeezes \the [target]'s breasts.", - "\The [user] slaps at \the [target]'s breasts.", - "\The [user] gropes \the [target]'s breasts roughly.")) + pick(span_lewd("\The [user] aggressively gropes \the [target]'s breast."), + span_lewd("\The [user] grabs \the [target]'s breasts."), + span_lewd("\The [user] tightly squeezes \the [target]'s breasts."), + span_lewd("\The [user] slaps at \the [target]'s breasts."), + span_lewd("\The [user] gropes \the [target]'s breasts roughly."))) if(prob(5 + target.get_lust())) if(target.a_intent == INTENT_HELP) user.visible_message( - pick("\The [target] shivers in arousal.", - "\The [target] moans quietly.", - "\The [target] breathes out a soft moan.", - "\The [target] gasps.", - "\The [target] shudders softly.", - "\The [target] trembles as hands run across bare skin.")) + pick(span_lewd("\The [target] shivers in arousal."), + span_lewd("\The [target] moans quietly."), + span_lewd("\The [target] breathes out a soft moan."), + span_lewd("\The [target] gasps."), + span_lewd("\The [target] shudders softly."), + span_lewd("\The [target] trembles as hands run across bare skin."))) if(target.get_lust() < 5) target.set_lust(5) if(target.a_intent == INTENT_DISARM) if (target.restrained()) user.visible_message( - pick("\The [target] twists playfully against the restraints.", - "\The [target] squirms away from [user]'s hand.", - "\The [target] slides back from [user]'s roaming hand.", - "\The [target] thrusts bare breasts forward into [user]'s hands.")) + pick(span_lewd("\The [target] twists playfully against the restraints."), + span_lewd("\The [target] squirms away from [user]'s hand."), + span_lewd("\The [target] slides back from [user]'s roaming hand."), + span_lewd("\The [target] thrusts bare breasts forward into [user]'s hands."))) else user.visible_message( - pick("\The [target] playfully bats at [user]'s hand.", - "\The [target] squirms away from [user]'s hand.", - "\The [target] guides [user]'s hand across bare breasts.", - "\The [target] teasingly laces a few fingers over [user]'s knuckles.")) + pick(span_lewd("\The [target] playfully bats at [user]'s hand."), + span_lewd("\The [target] squirms away from [user]'s hand."), + span_lewd("\The [target] guides [user]'s hand across bare breasts."), + span_lewd("\The [target] teasingly laces a few fingers over [user]'s knuckles."))) if(target.get_lust() < 10) target.add_lust(1) if(target.a_intent == INTENT_GRAB) user.visible_message( - pick("\The [target] grips [user]'s wrist tight.", - "\The [target] digs nails into [user]'s arm.", - "\The [target] grabs [user]'s wrist for a second.")) + pick(span_lewd("\The [target] grips [user]'s wrist tight."), + span_lewd("\The [target] digs nails into [user]'s arm."), + span_lewd("\The [target] grabs [user]'s wrist for a second."))) if(target.a_intent == INTENT_HARM) user.adjustBruteLoss(1) user.visible_message( - pick("\The [target] pushes [user] roughly away.", - "\The [target] digs nails angrily into [user]'s arm.", - "\The [target] fiercely struggles against [user].", - "\The [target] claws [user]'s forearm, drawing blood.", - "\The [target] slaps [user]'s hand away.")) + pick(span_lewd("\The [target] pushes [user] roughly away."), + span_lewd("\The [target] digs nails angrily into [user]'s arm."), + span_lewd("\The [target] fiercely struggles against [user]."), + span_lewd("\The [target] claws [user]'s forearm, drawing blood."), + span_lewd("\The [target] slaps [user]'s hand away."))) return diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/cursed/earfuck.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/cursed/earfuck.dm index 096acf97d0..50a259bc9c 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/cursed/earfuck.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/cursed/earfuck.dm @@ -41,7 +41,7 @@ playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/champ1.ogg', 'modular_sand/sound/interactions/champ2.ogg'), 50, 1, -1) - user.visible_message(message = "\The [user] [message]", ignored_mobs = user.get_unconsenting(TRUE)) + user.visible_message(message = span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting(TRUE)) if(user.can_penetrating_genital_cum()) user.handle_post_sex(NORMAL_LUST, CUM_TARGET_EARS, partner) partner.handle_post_sex(LOW_LUST, null, user) diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/cursed/eyefuck.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/cursed/eyefuck.dm index 862be9dec1..caa51bb1c8 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/cursed/eyefuck.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/cursed/eyefuck.dm @@ -41,7 +41,7 @@ playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/champ1.ogg', 'modular_sand/sound/interactions/champ2.ogg'), 50, 1, -1) - user.visible_message("\The [user] [message]", ignored_mobs = user.get_unconsenting(TRUE)) + user.visible_message(span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting(TRUE)) if(user.can_penetrating_genital_cum()) user.handle_post_sex(NORMAL_LUST, CUM_TARGET_EYES, partner) partner.handle_post_sex(LOW_LUST, null, user) diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/facefuck.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/facefuck.dm index d3f25b10ec..3c8dc2a72f 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/facefuck.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/facefuck.dm @@ -105,7 +105,7 @@ playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/oral1.ogg', 'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1) - user.visible_message("\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) if(retaliation_message) user.visible_message("\The [partner] [retaliation_message]", ignored_mobs = user.get_unconsenting()) if(fucktarget != "penis" || user.can_penetrating_genital_cum()) @@ -158,7 +158,7 @@ playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/oral1.ogg', 'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1) - user.visible_message(message = "\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(message = span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) if(retaliation_message) user.visible_message(message = "\The [partner] [retaliation_message]", ignored_mobs = user.get_unconsenting()) if(user.can_penetrating_genital_cum()) diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/feet.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/feet.dm index 990802a538..0bf1be224b 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/feet.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/feet.dm @@ -50,7 +50,7 @@ 'modular_sand/sound/interactions/foot_dry2.ogg', 'modular_sand/sound/interactions/foot_dry3.ogg', 'modular_sand/sound/interactions/foot_dry4.ogg'), 70, 1, -1) - user.visible_message(message = "\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(message = span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) partner.handle_post_sex(LOW_LUST, null, user) /datum/interaction/lewd/grindmouth @@ -105,7 +105,7 @@ playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/foot_wet1.ogg', 'modular_sand/sound/interactions/foot_wet2.ogg', 'modular_sand/sound/interactions/foot_wet3.ogg'), 70, 1, -1) - user.visible_message(message = "\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(message = span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) partner.handle_post_sex(LOW_LUST, null, user) /datum/interaction/lewd/footjob @@ -135,7 +135,7 @@ 'modular_sand/sound/interactions/foot_dry3.ogg', 'modular_sand/sound/interactions/foot_wet1.ogg', 'modular_sand/sound/interactions/foot_wet2.ogg'), 70, 1, -1) - user.visible_message(message = "\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(message = span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) if(partner.can_penetrating_genital_cum()) partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, user) @@ -163,7 +163,7 @@ 'modular_sand/sound/interactions/foot_dry3.ogg', 'modular_sand/sound/interactions/foot_wet1.ogg', 'modular_sand/sound/interactions/foot_wet2.ogg'), 70, 1, -1) - user.visible_message(message = "\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(message = span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) if(partner.can_penetrating_genital_cum()) partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, user) @@ -193,5 +193,5 @@ 'modular_sand/sound/interactions/foot_dry3.ogg', 'modular_sand/sound/interactions/foot_wet1.ogg', 'modular_sand/sound/interactions/foot_wet2.ogg'), 70, 1, -1) - user.visible_message(message = "\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(message = span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, user) diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/frotting.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/frotting.dm index 252ed112ff..774b11f48a 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/frotting.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/frotting.dm @@ -14,7 +14,7 @@ message = "rubs [t_His] [genital_name] against [partner]'s." user.set_is_fucking(partner, CUM_TARGET_PENIS, user.getorganslot(ORGAN_SLOT_PENIS)) - user.visible_message("\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) if(user.can_penetrating_genital_cum()) user.handle_post_sex(NORMAL_LUST, CUM_TARGET_PENIS, partner) if(partner.can_penetrating_genital_cum()) @@ -43,6 +43,6 @@ playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/squelch1.ogg', 'modular_sand/sound/interactions/squelch2.ogg', 'modular_sand/sound/interactions/squelch3.ogg'), 70, 1, -1) - user.visible_message("\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_VAGINA, user) user.handle_post_sex(NORMAL_LUST, CUM_TARGET_VAGINA, partner) diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/fuck.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/fuck.dm index dc451559a5..d3d0b7751c 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/fuck.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/fuck.dm @@ -24,7 +24,7 @@ playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/champ1.ogg', 'modular_sand/sound/interactions/champ2.ogg'), 50, 1, -1) - user.visible_message("\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) if(user.can_penetrating_genital_cum()) user.handle_post_sex(NORMAL_LUST, CUM_TARGET_VAGINA, partner) partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_PENIS, user) @@ -56,7 +56,7 @@ playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bang1.ogg', 'modular_sand/sound/interactions/bang2.ogg', 'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1) - user.visible_message("\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) if(user.can_penetrating_genital_cum()) user.handle_post_sex(NORMAL_LUST, CUM_TARGET_ANUS, partner) partner.handle_post_sex(NORMAL_LUST, null, user) @@ -86,7 +86,7 @@ playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bang1.ogg', 'modular_sand/sound/interactions/bang2.ogg', 'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1) - user.visible_message("\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) if(user.can_penetrating_genital_cum()) user.handle_post_sex(NORMAL_LUST, CUM_TARGET_BREASTS, partner) @@ -119,7 +119,7 @@ 'modular_sand/sound/interactions/foot_dry3.ogg', 'modular_sand/sound/interactions/foot_wet1.ogg', 'modular_sand/sound/interactions/foot_wet2.ogg'), 70, 1, -1) - user.visible_message("\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) if(user.can_penetrating_genital_cum()) user.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, partner) @@ -148,7 +148,7 @@ 'modular_sand/sound/interactions/foot_dry3.ogg', 'modular_sand/sound/interactions/foot_wet1.ogg', 'modular_sand/sound/interactions/foot_wet2.ogg'), 70, 1, -1) - user.visible_message("\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) if(user.can_penetrating_genital_cum()) user.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, partner) @@ -182,5 +182,5 @@ 'modular_sand/sound/interactions/foot_dry3.ogg', 'modular_sand/sound/interactions/foot_wet1.ogg', 'modular_sand/sound/interactions/foot_wet2.ogg'), 70, 1, -1) - user.visible_message("\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) user.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, partner) diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/handjob.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/handjob.dm index 78e530c8ed..1c36e61823 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/handjob.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/handjob.dm @@ -22,6 +22,6 @@ playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bang1.ogg', 'modular_sand/sound/interactions/bang2.ogg', 'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1) - user.visible_message("\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) if(partner.can_penetrating_genital_cum()) partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, user) diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/kiss.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/kiss.dm index 7f49fd21dd..8e196c8a19 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/kiss.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/kiss.dm @@ -16,6 +16,6 @@ /datum/interaction/lewd/kiss/display_interaction(mob/living/user, mob/living/partner) if(user.get_lust() >= 3) - user.visible_message("\The [user] gives an intense, lingering kiss to \the [partner].") + user.visible_message(span_lewd("\The [user] gives an intense, lingering kiss to \the [partner].")) else - user.visible_message("\The [user] kisses \the [partner] deeply.") + user.visible_message(span_lewd("\The [user] kisses \the [partner] deeply.")) diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/lick.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/lick.dm index 807d7f39af..6798d07d62 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/lick.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/lick.dm @@ -6,7 +6,7 @@ max_distance = 1 /datum/interaction/lewd/rimjob/display_interaction(mob/living/user, mob/living/partner) - user.visible_message("\The [user] licks \the [partner]'s asshole.", ignored_mobs = user.get_unconsenting()) + user.visible_message(span_lewd("\The [user] licks \the [partner]'s asshole."), ignored_mobs = user.get_unconsenting()) playlewdinteractionsound(get_turf(user), 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1) partner.handle_post_sex(NORMAL_LUST, null, user) @@ -29,5 +29,5 @@ message = "licks \the [partner]'s [partner.has_feet() == 1 ? "foot" : "feet"]." playlewdinteractionsound(get_turf(user), 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1) - user.visible_message("\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) user.handle_post_sex(LOW_LUST, null, user) diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/mount.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/mount.dm index 92ee546967..2caa4f53c7 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/mount.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/mount.dm @@ -19,7 +19,7 @@ playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bang1.ogg', 'modular_sand/sound/interactions/bang2.ogg', 'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1) - user.visible_message("\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) if(partner.can_penetrating_genital_cum()) partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_VAGINA, user) user.handle_post_sex(NORMAL_LUST, CUM_TARGET_PENIS, partner) @@ -45,7 +45,7 @@ playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bang1.ogg', 'modular_sand/sound/interactions/bang2.ogg', 'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1) - user.visible_message("\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) if(partner.can_penetrating_genital_cum()) partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_ANUS, user) user.handle_post_sex(NORMAL_LUST, null, partner) @@ -74,7 +74,7 @@ playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/squelch1.ogg', 'modular_sand/sound/interactions/squelch2.ogg', 'modular_sand/sound/interactions/squelch3.ogg'), 70, 1, -1) - user.visible_message("\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) user.handle_post_sex(LOW_LUST, null, partner) /datum/interaction/lewd/thighs @@ -157,7 +157,7 @@ 'modular_sand/sound/interactions/foot_wet1.ogg', 'modular_sand/sound/interactions/foot_dry3.ogg') playlewdinteractionsound(get_turf(user), file, 70, 1, -1) - user.visible_message("\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) user.handle_post_sex(lust_increase, THIGH_SMOTHERING, partner) playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/oral1.ogg', 'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1) diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/nipsuck.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/nipsuck.dm index 617821e111..e5a0b8911e 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/nipsuck.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/nipsuck.dm @@ -10,9 +10,9 @@ /datum/interaction/lewd/nipsuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target) if((user.a_intent == INTENT_HELP) || (user.a_intent == INTENT_DISARM)) user.visible_message( - pick("\The [user] gently sucks on \the [target]'s [pick("nipple", "nipples")].", - "\The [user] gently nibs \the [target]'s [pick("nipple", "nipples")].", - "\The [user] licks \the [target]'s [pick("nipple", "nipples")].")) + pick(span_lewd("\The [user] gently sucks on \the [target]'s [pick("nipple", "nipples")]."), + span_lewd("\The [user] gently nibs \the [target]'s [pick("nipple", "nipples")]."), + span_lewd("\The [user] licks \the [target]'s [pick("nipple", "nipples")]."))) if(target.has_breasts(REQUIRE_EXPOSED)) var/modifier = 1 var/obj/item/organ/genital/breasts/B = target.getorganslot(ORGAN_SLOT_BREASTS) @@ -31,8 +31,8 @@ if(user.a_intent == INTENT_HARM) user.visible_message( - pick("\The [user] bites \the [target]'s [pick("nipple", "nipples")].", - "\The [user] aggressively sucks \the [target]'s [pick("nipple", "nipples")].")) + pick(span_lewd("\The [user] bites \the [target]'s [pick("nipple", "nipples")]."), + span_lewd("\The [user] aggressively sucks \the [target]'s [pick("nipple", "nipples")]."))) if(target.has_breasts(REQUIRE_EXPOSED)) var/modifier = 1 var/obj/item/organ/genital/breasts/B = target.getorganslot(ORGAN_SLOT_BREASTS) @@ -51,9 +51,9 @@ if(user.a_intent == INTENT_GRAB) user.visible_message( - pick("\The [user] sucks \the [target]'s [pick("nipple", "nipples")] intently.", - "\The [user] feasts \the [target]'s [pick("nipple", "nipples")].", - "\The [user] glomps \the [target]'s [pick("nipple", "nipples")].")) + pick(span_lewd("\The [user] sucks \the [target]'s [pick("nipple", "nipples")] intently."), + span_lewd("\The [user] feasts \the [target]'s [pick("nipple", "nipples")]."), + span_lewd("\The [user] glomps \the [target]'s [pick("nipple", "nipples")]."))) if(target.has_breasts(REQUIRE_EXPOSED)) var/modifier = 1 var/obj/item/organ/genital/breasts/B = target.getorganslot(ORGAN_SLOT_BREASTS) @@ -74,66 +74,66 @@ if(target.a_intent == INTENT_HELP) if(!target.has_breasts()) user.visible_message( - pick("\The [target] shivers in arousal.", - "\The [target] moans quietly.", - "\The [target] breathes out a soft moan.", - "\The [target] gasps.", - "\The [target] shudders softly.", - "\The [target] trembles as their chest gets molested.")) + pick(span_lewd("\The [target] shivers in arousal."), + span_lewd("\The [target] moans quietly."), + span_lewd("\The [target] breathes out a soft moan."), + span_lewd("\The [target] gasps."), + span_lewd("\The [target] shudders softly."), + span_lewd("\The [target] trembles as their chest gets molested."))) else user.visible_message( - pick("\The [target] shivers in arousal.", - "\The [target] moans quietly.", - "\The [target] breathes out a soft moan.", - "\The [target] gasps.", - "\The [target] shudders softly.", - "\The [target] trembles as their breasts get molested.", - "\The [target] quivers in arousal as \the [user] delights themselves on their milk.")) + pick(span_lewd("\The [target] shivers in arousal."), + span_lewd("\The [target] moans quietly."), + span_lewd("\The [target] breathes out a soft moan."), + span_lewd("\The [target] gasps."), + span_lewd("\The [target] shudders softly."), + span_lewd("\The [target] trembles as their breasts get molested."), + span_lewd("\The [target] quivers in arousal as \the [user] delights themselves on their milk."))) if(target.get_lust() < 5) target.set_lust(5) if(target.a_intent == INTENT_DISARM) if (target.restrained()) if(!target.has_breasts()) user.visible_message( - pick("\The [target] twists playfully against the restraints.", - "\The [target] squirms away from \the [user]'s mouth.", - "\The [target] slides back from \the [user]'s mouth.", - "\The [target] thrusts their bare chest forward into \the [user]'s mouth.")) + pick(span_lewd("\The [target] twists playfully against the restraints."), + span_lewd("\The [target] squirms away from \the [user]'s mouth."), + span_lewd("\The [target] slides back from \the [user]'s mouth."), + span_lewd("\The [target] thrusts their bare chest forward into \the [user]'s mouth."))) else user.visible_message( - pick("\The [target] twists playfully against the restraints.", - "\The [target] squirms away from \the [user]'s mouth.", - "\The [target] slides back from \the [user]'s mouth.", - "\The [target] thrust their bare breasts forward into \the [user]'s mouth.")) + pick(span_lewd("\The [target] twists playfully against the restraints."), + span_lewd("\The [target] squirms away from \the [user]'s mouth."), + span_lewd("\The [target] slides back from \the [user]'s mouth."), + span_lewd("\The [target] thrust their bare breasts forward into \the [user]'s mouth."))) else if(!target.has_breasts()) user.visible_message( - pick("\The [target] playfully shoos away \the [user]'s head.", - "\The [target] squirms away from \the [user]'s mouth.", - "\The [target] holds \the [user]'s head against their chest.", - "\The [target] teasingly caresses \the [user]'s neck.")) + pick(span_lewd("\The [target] playfully shoos away \the [user]'s head."), + span_lewd("\The [target] squirms away from \the [user]'s mouth."), + span_lewd("\The [target] holds \the [user]'s head against their chest."), + span_lewd("\The [target] teasingly caresses \the [user]'s neck."))) else user.visible_message( - pick("\The [target] playfully shoos away \the [user]'s head.", - "\The [target] squirms away from \the [user]'s mouth.", - "\The [target] holds \the [user]'s head against their breast.", - "\The [target] teasingly caresses \the [user]'s neck.", - "\The [target] rubs their breasts against \the [user]'s head.")) + pick(span_lewd("\The [target] playfully shoos away \the [user]'s head."), + span_lewd("\The [target] squirms away from \the [user]'s mouth."), + span_lewd("\The [target] holds \the [user]'s head against their breast."), + span_lewd("\The [target] teasingly caresses \the [user]'s neck."), + span_lewd("\The [target] rubs their breasts against \the [user]'s head."))) if(target.get_lust() < 10) target.add_lust(1) if(target.a_intent == INTENT_GRAB) user.visible_message( - pick("\The [target] grips \the [user]'s head tight.", - "\The [target] digs nails into \the [user]'s scalp.", - "\The [target] grabs and shoves \the [user]'s head away.")) + pick(span_lewd("\The [target] grips \the [user]'s head tight."), + span_lewd("\The [target] digs nails into \the [user]'s scalp."), + span_lewd("\The [target] grabs and shoves \the [user]'s head away."))) if(target.a_intent == INTENT_HARM) user.adjustBruteLoss(1) user.visible_message( - pick("\The [target] slaps \the [user] away.", - "\The [target] scratches [user]'s face.", - "\The [target] fiercely struggles against [user].", - "\The [target] claws [user]'s face, drawing blood.", - "\The [target] elbows [user]'s mouth away.")) + pick(span_lewd("\The [target] slaps \the [user] away."), + span_lewd("\The [target] scratches [user]'s face."), + span_lewd("\The [target] fiercely struggles against [user]."), + span_lewd("\The [target] claws [user]'s face, drawing blood."), + span_lewd("\The [target] elbows [user]'s mouth away."))) target.dir = get_dir(target, user) user.dir = get_dir(user, target) playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/oral1.ogg', diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/nuts.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/nuts.dm index 912b227915..3210d01ed3 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/nuts.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/nuts.dm @@ -29,7 +29,7 @@ 'modular_sand/sound/interactions/nuts2.ogg', 'modular_sand/sound/interactions/nuts3.ogg', 'modular_sand/sound/interactions/nuts4.ogg'), 70, 1, -1)*/ //These files don't even exist but nobody noticed because double-quotes were used instead of single. - user.visible_message("\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) user.handle_post_sex(lust_increase, CUM_TARGET_MOUTH, partner) /datum/interaction/lewd/nut_smack diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/oral.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/oral.dm index ece5e1c49b..59ab08f85d 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/oral.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/oral.dm @@ -123,6 +123,6 @@ 'modular_sand/sound/interactions/bj9.ogg', 'modular_sand/sound/interactions/bj10.ogg', 'modular_sand/sound/interactions/bj11.ogg'), 50, 1, -1) - user.visible_message("\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) if(fucktarget != "penis" || partner.can_penetrating_genital_cum()) partner.handle_post_sex(lust_increase, CUM_TARGET_MOUTH, user) diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/self/breasts.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/self/breasts.dm index f4d4599d3d..5c91e50a3c 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/self/breasts.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/self/breasts.dm @@ -32,7 +32,7 @@ "gasps.", "shudders softly.", "trembles as [t_His] hands run across bare skin.")]") - user.visible_message(message = "\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(message = span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) playlewdinteractionsound(get_turf(user), 'modular_sand/sound/interactions/squelch1.ogg', 50, 1, -1) user.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, user) @@ -68,7 +68,7 @@ "fills [u_His] own mouth with a big gulp of [u_His] warm [lowertext(milktext)]" ) - message = "\The [user] [pick(lines)]" + message = span_lewd("\The [user] [pick(lines)]") user.visible_message(message, ignored_mobs = user.get_unconsenting()) playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/oral1.ogg', 'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1) diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/self/jack.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/self/jack.dm index f07e3a7c72..5213c5fe4c 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/self/jack.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/self/jack.dm @@ -28,6 +28,6 @@ playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bang1.ogg', 'modular_sand/sound/interactions/bang2.ogg', 'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1) - user.visible_message(message = "\The [user] [message]", ignored_mobs = user.get_unconsenting()) + user.visible_message(message = span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting()) if(user.can_penetrating_genital_cum()) user.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, user) diff --git a/modular_sand/code/datums/interactions/interaction_interface.dm b/modular_sand/code/datums/interactions/interaction_interface.dm index 9cf8fb2e1f..2d7f794132 100644 --- a/modular_sand/code/datums/interactions/interaction_interface.dm +++ b/modular_sand/code/datums/interactions/interaction_interface.dm @@ -12,6 +12,28 @@ usr.mind.interaction_holder.target = src usr.mind.interaction_holder.ui_interact(usr) +/* +/// Allows "cyborg" players to change gender at will +/mob/living/silicon/robot/verb/toggle_gender() + set name = "Set Gender" + set desc = "Allows you to set your gender." + + if(stat != CONSCIOUS) + to_chat(usr, span_warning("You cannot toggle your gender while unconcious!")) + return + + var/choice = tgui_alert(usr, "Select Gender.", "Gender", list("Both", "Male", "Female")) + switch(choice) + if("Both") + has_penis = TRUE + has_vagina = TRUE + if("Male") + has_penis = TRUE + has_vagina = FALSE + if("Female") + has_penis = FALSE + has_vagina = TRUE +*/ #define INTERACTION_NORMAL 0 #define INTERACTION_LEWD 1 @@ -112,6 +134,7 @@ && !(HAS_TRAIT(get_genitals, TRAIT_PERMABONER) \ || HAS_TRAIT(get_genitals, TRAIT_NEVERBONER))) genital_entry["arousal_state"] = genital.aroused_state + genital_entry["always_accessible"] = genital.always_accessible genitals += list(genital_entry) if(iscarbon(self) && !self.getorganslot(ORGAN_SLOT_ANUS)) var/simulated_ass = list() @@ -127,6 +150,7 @@ visibility = "Always hidden" simulated_ass["visibility"] = visibility simulated_ass["possible_choices"] = GLOB.genitals_visibility_toggles - GEN_VISIBLE_NO_CLOTHES + simulated_ass["always_accessible"] = self.anus_always_accessible genitals += list(simulated_ass) .["genitals"] = genitals @@ -233,16 +257,25 @@ var/original_state = genital.aroused_state genital.set_aroused_state(params["set_arousal"])// i'm not making it just `!aroused_state` because if(original_state != genital.aroused_state) // someone just might port skyrat's new genitals - to_chat(self, "[genital.aroused_state ? genital.arousal_verb : genital.unarousal_verb].") + to_chat(self, span_userlove("[genital.aroused_state ? genital.arousal_verb : genital.unarousal_verb].")) . = TRUE else - to_chat(self, "You can't make that genital [genital.aroused_state ? "unaroused" : "aroused"]!") + to_chat(self, span_userlove("You can't make that genital [genital.aroused_state ? "unaroused" : "aroused"]!")) . = FALSE genital.update_appearance() if(ishuman(self)) var/mob/living/carbon/human/human = self human.update_genitals() return + if("set_accessibility" in params) + if(!self.getorganslot(ORGAN_SLOT_ANUS) && params["genital"] == "anus") + self.toggle_anus_always_accessible() + return TRUE + var/obj/item/organ/genital/genital = locate(params["genital"], self.internal_organs) + if(!genital) + return FALSE + genital.toggle_accessibility() + return TRUE else return FALSE if("genital_interaction") diff --git a/modular_sand/code/datums/interactions/lewd_definitions.dm b/modular_sand/code/datums/interactions/lewd_definitions.dm index e674722e45..643dfeafb8 100644 --- a/modular_sand/code/datums/interactions/lewd_definitions.dm +++ b/modular_sand/code/datums/interactions/lewd_definitions.dm @@ -21,8 +21,9 @@ var/has_balls = FALSE var/has_vagina = FALSE var/has_anus = TRUE - var/has_breasts = FALSE var/has_butt = FALSE + var/anus_always_accessible = FALSE + var/has_breasts = FALSE var/anus_exposed = FALSE var/last_partner var/last_orifice @@ -85,6 +86,9 @@ lust = num lastlusttime = world.time +/mob/living/proc/toggle_anus_always_accessible() + anus_always_accessible = !anus_always_accessible + /mob/living/proc/has_genital(slot, visibility = REQUIRE_ANY) var/mob/living/carbon/C = src if(istype(C)) @@ -94,7 +98,7 @@ if(REQUIRE_ANY) return TRUE if(REQUIRE_EXPOSED) - return genital.is_exposed() + return genital.is_exposed() || genital.always_accessible if(REQUIRE_UNEXPOSED) return !genital.is_exposed() else @@ -127,9 +131,9 @@ for(var/obj/item/clothing/cloth in get_equipped_items()) if(istype(cloth, /obj/item/clothing/underwear/briefs/strapon)) return cloth - + return null - + /mob/living/proc/can_penetrating_genital_cum() return has_penis() @@ -161,6 +165,8 @@ if(REQUIRE_ANY) return TRUE if(REQUIRE_EXPOSED) + if (has_anus && anus_always_accessible) + return TRUE switch(anus_exposed) if(-1) return FALSE @@ -340,29 +346,11 @@ return TRUE return FALSE -/mob/living/proc/has_butt(var/nintendo = REQUIRE_ANY) +/mob/living/proc/has_butt(visibility = REQUIRE_ANY) var/mob/living/carbon/C = src if(has_butt && !istype(C)) return TRUE - if(istype(C)) - var/obj/item/organ/genital/peepee = C.getorganslot(ORGAN_SLOT_BUTT) - if(peepee) - switch(nintendo) - if(REQUIRE_ANY) - return TRUE - if(REQUIRE_EXPOSED) - if(peepee.is_exposed()) - return TRUE - else - return FALSE - if(REQUIRE_UNEXPOSED) - if(!peepee.is_exposed()) - return TRUE - else - return FALSE - else - return TRUE - return FALSE + return has_genital(ORGAN_SLOT_BUTT, visibility) ///Are we wearing something that covers our chest? /mob/living/proc/is_topless() @@ -413,9 +401,9 @@ if(moan == lastmoan) moan-- if(!is_muzzled()) - visible_message(message = "\The [src] [pick("moans", "moans in pleasure")].", ignored_mobs = get_unconsenting()) + visible_message(message = span_lewd("\The [src] [pick("moans", "moans in pleasure")]."), ignored_mobs = get_unconsenting()) if(is_muzzled())//immursion - audible_message("[src] [pick("mimes a pleasured moan","moans in silence")].") + audible_message(span_lewd("[src] [pick("mimes a pleasured moan","moans in silence")].")) lastmoan = moan /mob/living/proc/cum(mob/living/partner, target_orifice) @@ -776,7 +764,7 @@ playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/final_f1.ogg', 'modular_sand/sound/interactions/final_f2.ogg', 'modular_sand/sound/interactions/final_f3.ogg'), 70, 1, 0) - visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) + visible_message(message = span_userlove("\The [src] [message]"), ignored_mobs = get_unconsenting()) multiorgasms += 1 COOLDOWN_START(src, refractory_period, (rand(300, 900) - get_sexual_potency()))//sex cooldown diff --git a/modular_sand/code/datums/interactions/lewd_interactions.dm b/modular_sand/code/datums/interactions/lewd_interactions.dm index 43199355d2..2171ec0b7f 100644 --- a/modular_sand/code/datums/interactions/lewd_interactions.dm +++ b/modular_sand/code/datums/interactions/lewd_interactions.dm @@ -74,17 +74,17 @@ return FALSE if(user_not_tired && !COOLDOWN_FINISHED(user, refractory_period)) if(!silent) //bye spam - to_chat(user, "You're still exhausted from the last time. You need to wait [DisplayTimeText(COOLDOWN_TIMELEFT(user, refractory_period), 1)] until you can do that!") + to_chat(user, span_warning("You're still exhausted from the last time. You need to wait [DisplayTimeText(COOLDOWN_TIMELEFT(user, refractory_period), 1)] until you can do that!")) return FALSE if(require_user_bottomless && !user.is_bottomless()) if(!silent) - to_chat(user, "Your pants are in the way.") + to_chat(user, span_warning("Your pants are in the way.")) return FALSE if(require_user_topless && !user.is_topless()) if(!silent) - to_chat(user, "Your top is in the way.") + to_chat(user, span_warning("Your top is in the way.")) return FALSE if(require_user_penis) @@ -92,17 +92,17 @@ if(REQUIRE_EXPOSED) if(!user.has_penis(REQUIRE_EXPOSED) && !user.has_strapon(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Your penis need to be exposed.") + to_chat(user, span_warning("Your penis need to be exposed.")) return FALSE if(REQUIRE_ANY) if(!user.has_penis(REQUIRE_ANY) && !user.has_strapon(REQUIRE_ANY)) if(!silent) - to_chat(user, "You don't have a penis.") + to_chat(user, span_warning("You don't have a penis.")) return FALSE if(REQUIRE_UNEXPOSED) if(!user.has_penis(REQUIRE_UNEXPOSED) && !user.has_strapon(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Your penis need to be unexposed.") + to_chat(user, span_warning("Your penis need to be unexposed.")) return FALSE if(require_user_balls) @@ -110,17 +110,17 @@ if(REQUIRE_EXPOSED) if(!user.has_balls(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Your balls need to be exposed.") + to_chat(user, span_warning("Your balls need to be exposed.")) return FALSE if(REQUIRE_ANY) if(!user.has_balls(REQUIRE_ANY)) if(!silent) - to_chat(user, "You don't have balls.") + to_chat(user, span_warning("You don't have balls.")) return FALSE if(REQUIRE_UNEXPOSED) if(!user.has_balls(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Your balls need to be unexposed.") + to_chat(user, span_warning("Your balls need to be unexposed.")) return FALSE if(require_user_anus) @@ -128,17 +128,17 @@ if(REQUIRE_EXPOSED) if(!user.has_anus(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Your anus need to be exposed.") + to_chat(user, span_warning("Your anus need to be exposed.")) return FALSE if(REQUIRE_ANY) if(!user.has_anus(REQUIRE_ANY)) if(!silent) - to_chat(user, "You don't have an anus.") + to_chat(user, span_warning("You don't have an anus.")) return FALSE if(REQUIRE_UNEXPOSED) if(!user.has_anus(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Your anus need to be unexposed.") + to_chat(user, span_warning("Your anus need to be unexposed.")) return FALSE if(require_user_vagina) @@ -146,17 +146,17 @@ if(REQUIRE_EXPOSED) if(!user.has_vagina(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Your vagina need to be exposed.") + to_chat(user, span_warning("Your vagina need to be exposed.")) return FALSE if(REQUIRE_ANY) if(!user.has_vagina(REQUIRE_ANY)) if(!silent) - to_chat(user, "You don't have a vagina.") + to_chat(user, span_warning("You don't have a vagina.")) return FALSE if(REQUIRE_UNEXPOSED) if(!user.has_vagina(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Your vagina need to be unexposed.") + to_chat(user, span_warning("Your vagina need to be unexposed.")) return FALSE if(require_user_breasts) @@ -164,17 +164,17 @@ if(REQUIRE_EXPOSED) if(!user.has_breasts(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Your breasts need to be exposed.") + to_chat(user, span_warning("Your breasts need to be exposed.")) return FALSE if(REQUIRE_ANY) if(!user.has_breasts(REQUIRE_ANY)) if(!silent) - to_chat(user, "You don't have breasts.") + to_chat(user, span_warning("You don't have breasts.")) return FALSE if(REQUIRE_UNEXPOSED) if(!user.has_breasts(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Your breasts need to be unexposed.") + to_chat(user, span_warning("Your breasts need to be unexposed.")) return FALSE if(require_user_feet) @@ -182,22 +182,22 @@ if(REQUIRE_EXPOSED) if(!user.has_feet(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Your feet need to be exposed.") + to_chat(user, span_warning("Your feet need to be exposed.")) return FALSE if(REQUIRE_ANY) if(!user.has_feet(REQUIRE_ANY)) if(!silent) - to_chat(user, "You don't have enough feet.") + to_chat(user, span_warning("You don't have enough feet.")) return FALSE if(REQUIRE_UNEXPOSED) if(!user.has_feet(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Your feet need to be unexposed.") + to_chat(user, span_warning("Your feet need to be unexposed.")) return FALSE if(require_user_num_feet && (user.get_num_feet() < require_user_num_feet)) if(!silent) - to_chat(user, "You don't have enough feet.") + to_chat(user, span_warning("You don't have enough feet.")) return FALSE if(require_user_eyes) @@ -205,17 +205,17 @@ if(REQUIRE_EXPOSED) if(!user.has_eyes(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Your eyes need to be exposed.") + to_chat(user, span_warning("Your eyes need to be exposed.")) return FALSE if(REQUIRE_ANY) if(!user.has_eyes(REQUIRE_ANY)) if(!silent) - to_chat(user, "You don't have eyes.") + to_chat(user, span_warning("You don't have eyes.")) return FALSE if(REQUIRE_UNEXPOSED) if(!user.has_eyes(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Your eyes need to be unexposed.") + to_chat(user, span_warning("Your eyes need to be unexposed.")) return FALSE if(require_user_eyesockets) @@ -223,17 +223,17 @@ if(REQUIRE_EXPOSED) if(!user.has_eyesockets(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Your eyesockets need to be exposed.") + to_chat(user, span_warning("Your eyesockets need to be exposed.")) return FALSE if(REQUIRE_ANY) if(!user.has_eyesockets(REQUIRE_ANY)) if(!silent) - to_chat(user, "You still have eyes.") + to_chat(user, span_warning("You still have eyes.")) return FALSE if(REQUIRE_UNEXPOSED) if(!user.has_eyesockets(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Your eyesockets need to be unexposed.") + to_chat(user, span_warning("Your eyesockets need to be unexposed.")) return FALSE if(require_user_ears) @@ -241,17 +241,17 @@ if(REQUIRE_EXPOSED) if(!user.has_ears(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Your ears need to be exposed.") + to_chat(user, span_warning("Your ears need to be exposed.")) return FALSE if(REQUIRE_ANY) if(!user.has_ears(REQUIRE_ANY)) if(!silent) - to_chat(user, "You don't have ears.") + to_chat(user, span_warning("You don't have ears.")) return FALSE if(REQUIRE_UNEXPOSED) if(!user.has_ears(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Your ears need to be unexposed.") + to_chat(user, span_warning("Your ears need to be unexposed.")) return FALSE if(require_user_earsockets) @@ -259,17 +259,17 @@ if(REQUIRE_EXPOSED) if(!user.has_earsockets(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Your earsockets need to be exposed.") + to_chat(user, span_warning("Your earsockets need to be exposed.")) return FALSE if(REQUIRE_ANY) if(!user.has_earsockets(REQUIRE_ANY)) if(!silent) - to_chat(user, "You still have eyes.") + to_chat(user, span_warning("You still have eyes.")) return FALSE if(REQUIRE_UNEXPOSED) if(!user.has_earsockets(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Your earsockets need to be unexposed.") + to_chat(user, span_warning("Your earsockets need to be unexposed.")) return FALSE if(extreme) @@ -277,7 +277,7 @@ if(cli) if(cli.prefs.extremepref == "No") if(!silent) - to_chat(user, "That's way too much for you.") + to_chat(user, span_warning("That's way too much for you.")) return FALSE if(require_ooc_consent) @@ -293,17 +293,17 @@ return FALSE if(target_not_tired && !COOLDOWN_FINISHED(target, refractory_period)) if(!silent) //same with this - to_chat(user, "They're still exhausted from the last time. They need to wait [DisplayTimeText(COOLDOWN_TIMELEFT(target, refractory_period), 1)] until you can do that!") + to_chat(user, span_warning("They're still exhausted from the last time. They need to wait [DisplayTimeText(COOLDOWN_TIMELEFT(target, refractory_period), 1)] until you can do that!")) return FALSE if(require_target_bottomless && !target.is_bottomless()) if(!silent) - to_chat(user, "Their pants are in the way.") + to_chat(user, span_warning("Their pants are in the way.")) return FALSE if(require_target_topless && !target.is_topless()) if(!silent) - to_chat(user, "Their clothes are in the way.") + to_chat(user, span_warning("Their clothes are in the way.")) return FALSE if(require_target_penis) @@ -311,17 +311,17 @@ if(REQUIRE_EXPOSED) if(!target.has_penis(REQUIRE_EXPOSED) && !target.has_strapon(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Their penis needs to be exposed.") + to_chat(user, span_warning("Their penis needs to be exposed.")) return FALSE if(REQUIRE_ANY) if(!target.has_penis(REQUIRE_ANY) && !target.has_strapon(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "They don't have a penis.") + to_chat(user, span_warning("They don't have a penis.")) return FALSE if(REQUIRE_UNEXPOSED) if(!target.has_penis(REQUIRE_UNEXPOSED) && !target.has_strapon(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Their penis needs to be unexposed.") + to_chat(user, span_warning("Their penis needs to be unexposed.")) return FALSE if(require_target_balls) @@ -329,17 +329,17 @@ if(REQUIRE_EXPOSED) if(!target.has_balls(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Their balls need to be exposed.") + to_chat(user, span_warning("Their balls need to be exposed.")) return FALSE if(REQUIRE_ANY) if(!target.has_balls(REQUIRE_ANY)) if(!silent) - to_chat(user, "They don't have balls.") + to_chat(user, span_warning("They don't have balls.")) return FALSE if(REQUIRE_UNEXPOSED) if(!target.has_balls(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Their balls need to be unexposed.") + to_chat(user, span_warning("Their balls need to be unexposed.")) return FALSE if(require_target_anus) @@ -347,17 +347,17 @@ if(REQUIRE_EXPOSED) if(!target.has_anus(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Their anus needs to be exposed.") + to_chat(user, span_warning("Their anus needs to be exposed.")) return FALSE if(REQUIRE_ANY) if(!target.has_anus(REQUIRE_ANY)) if(!silent) - to_chat(user, "They don't have an anus.") + to_chat(user, span_warning("They don't have an anus.")) return FALSE if(REQUIRE_UNEXPOSED) if(!target.has_anus(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Their anus needs to be unexposed.") + to_chat(user, span_warning("Their anus needs to be unexposed.")) return FALSE if(require_target_vagina) @@ -365,17 +365,17 @@ if(REQUIRE_EXPOSED) if(!target.has_vagina(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Their vagina needs to be exposed.") + to_chat(user, span_warning("Their vagina needs to be exposed.")) return FALSE if(REQUIRE_ANY) if(!target.has_vagina(REQUIRE_ANY)) if(!silent) - to_chat(user, "They don't have a vagina.") + to_chat(user, span_warning("They don't have a vagina.")) return FALSE if(REQUIRE_UNEXPOSED) if(!target.has_vagina(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Their vagina needs to be unexposed.") + to_chat(user, span_warning("Their vagina needs to be unexposed.")) return FALSE if(require_target_breasts) @@ -383,17 +383,17 @@ if(REQUIRE_EXPOSED) if(!target.has_breasts(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Their breasts need to be exposed.") + to_chat(user, span_warning("Their breasts need to be exposed.")) return FALSE if(REQUIRE_ANY) if(!target.has_breasts(REQUIRE_ANY)) if(!silent) - to_chat(user, "They don't have breasts.") + to_chat(user, span_warning("They don't have breasts.")) return FALSE if(REQUIRE_UNEXPOSED) if(!target.has_breasts(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Their breasts need to be unexposed.") + to_chat(user, span_warning("Their breasts need to be unexposed.")) return FALSE if(require_target_feet) @@ -401,22 +401,22 @@ if(REQUIRE_EXPOSED) if(!target.has_feet(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Their feet need to be exposed.") + to_chat(user, span_warning("Their feet need to be exposed.")) return FALSE if(REQUIRE_ANY) if(!target.has_feet(REQUIRE_ANY)) if(!silent) - to_chat(user, "They don't have enough feet.") + to_chat(user, span_warning("They don't have enough feet.")) return FALSE if(REQUIRE_UNEXPOSED) if(!target.has_feet(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Their feet need to be unexposed.") + to_chat(user, span_warning("Their feet need to be unexposed.")) return FALSE if(require_target_num_feet && (target.get_num_feet() < require_target_num_feet)) if(!silent) - to_chat(user, "They don't have enough feet.") + to_chat(user, span_warning("They don't have enough feet.")) return FALSE if(require_target_eyes) @@ -424,17 +424,17 @@ if(REQUIRE_EXPOSED) if(!target.has_eyes(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Their eyes need to be exposed.") + to_chat(user, span_warning("Their eyes need to be exposed.")) return FALSE if(REQUIRE_ANY) if(!target.has_eyes(REQUIRE_ANY)) if(!silent) - to_chat(user, "They don't have eyes.") + to_chat(user, span_warning("They don't have eyes.")) return FALSE if(REQUIRE_UNEXPOSED) if(!target.has_eyes(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Their eyes need to be unexposed.") + to_chat(user, span_warning("Their eyes need to be unexposed.")) return FALSE if(require_target_eyesockets) @@ -442,17 +442,17 @@ if(REQUIRE_EXPOSED) if(!target.has_eyesockets(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Their eyesockets need to be exposed.") + to_chat(user, span_warning("Their eyesockets need to be exposed.")) return FALSE if(REQUIRE_ANY) if(!target.has_eyesockets(REQUIRE_ANY)) if(!silent) - to_chat(user, "They still have eyes.") + to_chat(user, span_warning("They still have eyes.")) return FALSE if(REQUIRE_UNEXPOSED) if(!target.has_eyesockets(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Their eyesockets need to be unexposed.") + to_chat(user, span_warning("Their eyesockets need to be unexposed.")) return FALSE if(require_target_ears) @@ -460,17 +460,17 @@ if(REQUIRE_EXPOSED) if(!target.has_ears(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Their ears need to be exposed.") + to_chat(user, span_warning("Their ears need to be exposed.")) return FALSE if(REQUIRE_ANY) if(!target.has_ears(REQUIRE_ANY)) if(!silent) - to_chat(user, "They don't have ears.") + to_chat(user, span_warning("They don't have ears.")) return FALSE if(REQUIRE_UNEXPOSED) if(!target.has_ears(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Their ears need to be unexposed.") + to_chat(user, span_warning("Their ears need to be unexposed.")) return FALSE if(require_target_earsockets) @@ -478,17 +478,17 @@ if(REQUIRE_EXPOSED) if(!target.has_earsockets(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Their earsockets need to be exposed.") + to_chat(user, span_warning("Their earsockets need to be exposed.")) return FALSE if(REQUIRE_ANY) if(!target.has_earsockets(REQUIRE_ANY)) if(!silent) - to_chat(user, "They still have eyes.") + to_chat(user, span_warning("They still have eyes.")) return FALSE if(REQUIRE_UNEXPOSED) if(!target.has_earsockets(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Their earsockets need to be unexposed.") + to_chat(user, span_warning("Their earsockets need to be unexposed.")) return FALSE if(extreme) @@ -496,7 +496,7 @@ if(cli) if(target.client.prefs.extremepref == "No") if(!silent) - to_chat(user, "For some reason, you don't want to do this to [target].") + to_chat(user, span_warning("For some reason, you don't want to do this to [target].")) return FALSE if(require_ooc_consent) diff --git a/modular_sand/code/datums/interactions/lewd_objects.dm b/modular_sand/code/datums/interactions/lewd_objects.dm index e90b76abc7..c2bb19045a 100644 --- a/modular_sand/code/datums/interactions/lewd_objects.dm +++ b/modular_sand/code/datums/interactions/lewd_objects.dm @@ -22,7 +22,7 @@ if(M.has_mouth() && !M.is_mouth_covered()) message = (user == M) ? pick("fucks [possessive_verb] own mouth with \the [src]", "shoves \the [src] into [possessive_verb] mouth", "jams \the [src] into [possessive_verb] mouth") : pick("fucks [M]'s mouth with \the [src]", "jams \the [src] into [M]'s mouth") if(message) - user.visible_message("[user] [message].") + user.visible_message(span_lewd("[user] [message].")) M.handle_post_sex(lust_amt, null, user) playsound(loc, pick('modular_sand/sound/interactions/bang4.ogg', 'modular_sand/sound/interactions/bang5.ogg', @@ -32,7 +32,7 @@ /obj/item/dildo/attack_self(mob/living/carbon/human/user as mob) hole = hole == CUM_TARGET_VAGINA ? CUM_TARGET_ANUS : CUM_TARGET_VAGINA - to_chat(user, "Now targetting \the [hole].") + to_chat(user, span_notice("Now targetting \the [hole].")) //begin redds code /obj/item/dildo/cyborg diff --git a/modular_sand/code/datums/traits/negative.dm b/modular_sand/code/datums/traits/negative.dm index 4b4f158ef8..2d238f1589 100644 --- a/modular_sand/code/datums/traits/negative.dm +++ b/modular_sand/code/datums/traits/negative.dm @@ -3,8 +3,8 @@ desc = "For one reason or another, you either can't or haven't learned the common tongue." value = 0 mob_trait = TRAIT_SHELTERED - gain_text = "The words of others begin to blur together..." - lose_text = "You start putting together what people are saying!" + gain_text = span_danger("The words of others begin to blur together...") + lose_text = span_notice("You start putting together what people are saying!") medical_record_text = "Patient has shown an inability to use common speaking languages." /datum/quirk/sheltered/on_spawn() @@ -15,3 +15,10 @@ /datum/quirk/sheltered/remove() //i mean, the lose text explains it, so i'm making it actually work var/mob/living/carbon/human/H = quirk_holder H.grant_language(/datum/language/common) + +/datum/quirk/dnc_order + name = "DNC Order" + desc = "You have a Do Not Clone order on your record, stating that you may not be cloned. You can still be revived by other means." + value = -2 + mob_trait = TRAIT_DNC_ORDER + medical_record_text = "Patient has a DNC (Do Not Clone) order and will be rejected by cloning mechanisms as a result." diff --git a/modular_sand/code/datums/traits/neutral.dm b/modular_sand/code/datums/traits/neutral.dm index 33cc31da0d..89486dc153 100644 --- a/modular_sand/code/datums/traits/neutral.dm +++ b/modular_sand/code/datums/traits/neutral.dm @@ -18,7 +18,7 @@ value = 0 human_only = TRUE mob_trait = TRAIT_INFERTILE - gain_text = "Your womb starts feeling dry and empty, all the life in it begins to fade away..." - lose_text = "You feel the warm blow of life flooding your womb, full of newfound, vibrant fertility!" + gain_text = span_notice("Your womb starts feeling dry and empty, all the life in it begins to fade away...") + lose_text = span_love("You feel the warm blow of life flooding your womb, full of newfound, vibrant fertility!") medical_record_text = "Patient doesn't seem able to ovulate properly..." */ diff --git a/modular_sand/code/game/machinery/autodoc.dm b/modular_sand/code/game/machinery/autodoc.dm index 5d8fa2429e..fcd00555c4 100644 --- a/modular_sand/code/game/machinery/autodoc.dm +++ b/modular_sand/code/game/machinery/autodoc.dm @@ -26,11 +26,11 @@ /obj/machinery/autodoc/examine(mob/user) . = ..() if((obj_flags & EMAGGED) && panel_open) - . += "[src]'s surgery protocols have been corrupted!" + . += span_warning("[src]'s surgery protocols have been corrupted!") if(processing) - . += "[src] is currently inserting [storedorgan] into [occupant]." + . += span_notice("[src] is currently inserting [storedorgan] into [occupant].") else if(storedorgan) - . += "[src] is prepared to insert [storedorgan]." + . += span_notice("[src] is prepared to insert [storedorgan].") /obj/machinery/autodoc/close_machine(mob/user) ..() @@ -40,16 +40,16 @@ occupant.forceMove(drop_location()) occupant = null return - to_chat(occupant, "You enter [src].") + to_chat(occupant, span_notice("You enter [src].")) dosurgery() /obj/machinery/autodoc/proc/dosurgery() if(!storedorgan && !(obj_flags & EMAGGED)) - to_chat(occupant, "[src] currently has no implant stored.") + to_chat(occupant, span_notice("[src] currently has no implant stored.")) return - occupant.visible_message("[occupant] presses a button on [src], and you hear a mechanical noise.", "You feel a sharp sting as [src] starts inserting the organ into your body.") + occupant.visible_message(span_notice("[occupant] presses a button on [src], and you hear a mechanical noise."), span_notice("You feel a sharp sting as [src] starts inserting the organ into your body.")) playsound(get_turf(occupant), 'sound/weapons/circsawhit.ogg', 50, 1) processing = TRUE update_icon() @@ -66,7 +66,7 @@ if(!processing) return - occupant.visible_message("[src] dismembers [occupant]!", "[src] saws up your body!") + occupant.visible_message(span_warning("[src] dismembers [occupant]!"), span_warning("[src] saws up your body!")) else sleep(surgerytime) @@ -78,14 +78,14 @@ currentorgan.forceMove(get_turf(src)) storedorgan.Insert(occupant)//insert stored organ into the user storedorgan = null - occupant.visible_message("[src] completes the surgery procedure.", "[src] inserts the organ into your body.") + occupant.visible_message(span_notice("[src] completes the surgery procedure."), span_notice("[src] inserts the organ into your body.")) playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, 0) processing = FALSE open_machine() /obj/machinery/autodoc/open_machine(mob/user) if(processing) - occupant.visible_message("[user] cancels [src]'s procedure.", "[src] stops inserting the organ into your body.") + occupant.visible_message(span_notice("[user] cancels [src]'s procedure."), span_notice("[src] stops inserting the organ into your body.")) processing = FALSE if(occupant) occupant.forceMove(drop_location()) @@ -94,7 +94,7 @@ /obj/machinery/autodoc/interact(mob/user) if(panel_open) - to_chat(user, "Close the maintenance panel first.") + to_chat(user, span_notice("Close the maintenance panel first.")) return if(state_open) @@ -106,13 +106,13 @@ /obj/machinery/autodoc/attackby(obj/item/I, mob/user, params) if(istype(I, organ_type)) if(storedorgan) - to_chat(user, "[src] already has an implant stored.") + to_chat(user, span_notice("[src] already has an implant stored.")) return if(!user.transferItemToLoc(I, src)) return storedorgan = I I.forceMove(src) - to_chat(user, "You insert the [I] into [src].") + to_chat(user, span_notice("You insert the [I] into [src].")) else return ..() @@ -121,10 +121,10 @@ if(..()) return if(occupant) - to_chat(user, "[src] is currently occupied!") + to_chat(user, span_warning("[src] is currently occupied!")) return if(state_open) - to_chat(user, "[src] must be closed to [panel_open ? "close" : "open"] its maintenance hatch!") + to_chat(user, span_warning("[src] must be closed to [panel_open ? "close" : "open"] its maintenance hatch!")) return if(default_deconstruction_screwdriver(user, icon_state, icon_state, I)) if(storedorgan) @@ -164,4 +164,4 @@ if(obj_flags & EMAGGED) return obj_flags |= EMAGGED - to_chat(user, "You reprogram [src]'s surgery procedures.") + to_chat(user, span_warning("You reprogram [src]'s surgery procedures.")) diff --git a/modular_sand/code/game/machinery/computer/cloning.dm b/modular_sand/code/game/machinery/computer/cloning.dm new file mode 100644 index 0000000000..e7844ef944 --- /dev/null +++ b/modular_sand/code/game/machinery/computer/cloning.dm @@ -0,0 +1,15 @@ +// Proc for scanning a mob in a cloning machine +/obj/machinery/computer/cloning/can_scan(datum/dna/dna, mob/living/mob_occupant, experimental = FALSE, datum/bank_account/account) + // Check for DNC Order quirk + if(HAS_TRAIT(mob_occupant, TRAIT_DNC_ORDER)) + // Set scan failure reason + scantemp = "Subject has an active DNC order on file. Further operations terminated." + + // Play error sound + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + + // Return without scanning + return + + // Return normally + . = ..() diff --git a/modular_sand/code/game/machinery/cryptominers.dm b/modular_sand/code/game/machinery/cryptominers.dm index df17cf0c25..33f87a8e9f 100644 --- a/modular_sand/code/game/machinery/cryptominers.dm +++ b/modular_sand/code/game/machinery/cryptominers.dm @@ -8,13 +8,15 @@ idle_power_usage = 20 active_power_usage = 200 circuit = /obj/item/circuitboard/machine/cryptominer + init_process = FALSE // Don't process upon creation var/mining = FALSE var/miningtime = 3000 var/miningpoints = 50 var/mintemp = TCRYO // 225K equals approximately -55F or -48C var/midtemp = T0C // 273K equals 32F or 0C var/maxtemp = 500 // 500K equals approximately 440F or 226C - var/heatingPower = 40000 + var/heatingPower = 100 // Heat added each processing + var/require_conductivity = TRUE // Prevent use in space var/datum/bank_account/pay_me = null /obj/machinery/cryptominer/Initialize(mapload) @@ -50,19 +52,19 @@ if(id_card) var/obj/item/card/id/CARD = id_card if(CARD.bank_support != ID_FREE_BANK_ACCOUNT) - to_chat(user, "This ID has no banking support whatsover, must be an older model...") + to_chat(user, span_warning("This ID has no banking support whatsover, must be an older model...")) return if(!CARD.registered_account) - to_chat(user, "ERROR: No bank account found.") + to_chat(user, span_warning("ERROR: No bank account found.")) return - to_chat(user, "You link \the [CARD] to \the [src].") + to_chat(user, span_notice("You link \the [CARD] to \the [src].")) pay_me = CARD.registered_account - say("Now using [pay_me.account_holder ? "[pay_me.account_holder]'s" : "ERROR"] account.") + say("Now using [pay_me.account_holder ? "[pay_me.account_holder]'s" : span_boldwarning("ERROR")] account.") return /obj/machinery/cryptominer/AltClick(mob/user) - user.visible_message("[user] begins resetting \the [src].", - "You begin resetting \the [src].") + user.visible_message(span_warning("[user] begins resetting \the [src]."), + span_warning("You begin resetting \the [src].")) balloon_alert(user, "resetting") if(do_after(user, 5 SECONDS, target = src)) pay_me = SSeconomy.get_dep_account(ACCOUNT_CAR) @@ -71,58 +73,75 @@ /obj/machinery/cryptominer/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "A little screen on the machine reads: Currently the linked bank account is [pay_me.account_holder ? "[pay_me.account_holder]'s" : "ERROR"]." + . += span_notice("A little screen on the machine reads: Currently the linked bank account is [pay_me.account_holder ? "[pay_me.account_holder]'s" : span_boldwarning("ERROR")].") . += "Modify the destination of the credits using your id on it while it is inactive and has it's panel open." . += "Alt-Click to reset to the Cargo budget." /obj/machinery/cryptominer/process() + // Get turf var/turf/T = get_turf(src) if(!T) return + + // Check for tiles with no conductivity (space) + if(T.thermal_conductivity == 0) + // Normal mode: Warn the user and stop processing + if(require_conductivity) + say("Invalid atmospheric conditions detected! Shutting off!") + playsound(loc, 'sound/machines/beep.ogg', 50, TRUE, -1) + set_mining(FALSE) + return + + // Cheat mode: Skip all atmos code and give points + else + produce_points(3) + return + + // Get air var/datum/gas_mixture/env = T.return_air() if(!env) return - if(!mining) - return - if(env.return_temperature() >= maxtemp) - if(mining) - playsound(loc, 'sound/machines/beep.ogg', 50, TRUE, -1) + + // Get temp + var/env_temp = env.return_temperature() + + // Check for temperature effects + // Minimum (most likely) + if(env_temp <= mintemp) + produce_points(3) + // Mid + else if((env_temp <= midtemp) && (env_temp >= mintemp)) + produce_points(1) + // Maximum + else if((env_temp <= maxtemp) && (env_temp >= midtemp)) + produce_points(0.20) + // Overheat + else if(env_temp >= maxtemp) + say("Critical overheating detected! Shutting off!") + playsound(loc, 'sound/machines/beep.ogg', 50, TRUE, -1) set_mining(FALSE) - return - if(env.return_temperature() <= maxtemp && env.return_temperature() >= midtemp) - if(mining) - produce_points(0.20) - produce_heat() - return - if(env.return_temperature() <= midtemp && env.return_temperature() >= mintemp) - if(mining) - produce_points(1) - produce_heat() - return - if(env.return_temperature() <= mintemp) - if(mining) - produce_points(3) - produce_heat() - return + + // Increase heat by heatingPower + env.set_temperature(env_temp + heatingPower) + + // Update air + air_update_turf() /obj/machinery/cryptominer/proc/produce_points(number) playsound(loc, 'sound/machines/ping.ogg', 50, TRUE, -1) if(pay_me) pay_me.adjust_money(FLOOR(miningpoints * number,1)) -/obj/machinery/cryptominer/proc/produce_heat() - atmos_spawn_air("co2=10;TEMP=2000") - /obj/machinery/cryptominer/attack_hand(mob/living/user) . = ..() if(!is_operational()) - to_chat(user, "[src] has to be on to do this!") + to_chat(user, span_warning("[src] has to be on to do this!")) balloon_alert(user, "no power!") return FALSE if(mining) set_mining(FALSE) - visible_message("[src] slowly comes to a halt.", - "You turn off [src].") + visible_message(span_warning("[src] slowly comes to a halt."), + span_warning("You turn off [src].")) balloon_alert(user, "turned off") return balloon_alert(user, "turned on") diff --git a/modular_sand/code/game/mecha/mecha_construction_paths.dm b/modular_sand/code/game/mecha/mecha_construction_paths.dm index 4459823bc0..5b55ec5221 100644 --- a/modular_sand/code/game/mecha/mecha_construction_paths.dm +++ b/modular_sand/code/game/mecha/mecha_construction_paths.dm @@ -102,45 +102,45 @@ switch(index) if(1) - user.visible_message("[user] wrenches [parent]'s parts.", "You wrench [parent]'s parts.") + user.visible_message("[user] wrenches [parent]'s parts.", span_notice("You wrench [parent]'s parts.")) if(2) if(diff==FORWARD) - user.visible_message("[user] welds [parent]'s parts.", "You weld [parent]'s parts") + user.visible_message("[user] welds [parent]'s parts.", span_notice("You weld [parent]'s parts")) else - user.visible_message("[user] unwrenches [parent]'s parts.", "You unwrench [parent]'s parts.") + user.visible_message("[user] unwrenches [parent]'s parts.", span_notice("You unwrench [parent]'s parts.")) if(3) if(diff==FORWARD) - user.visible_message("[user] slots bluespace crystals onto [parent].", "You slot the bluespace crystals onto [parent].") + user.visible_message("[user] slots bluespace crystals onto [parent].", span_notice("You slot the bluespace crystals onto [parent].")) else - user.visible_message("[user] unwelds [parent]'s parts.", "You unweld [parent]'s parts.") + user.visible_message("[user] unwelds [parent]'s parts.", span_notice("You unweld [parent]'s parts.")) if(4) if(diff==FORWARD) - user.visible_message("[user] secures the [parent]'s bluespace crystal slots.", "You secure the [parent]'s bluespace crystal slots") + user.visible_message("[user] secures the [parent]'s bluespace crystal slots.", span_notice("You secure the [parent]'s bluespace crystal slots")) else - user.visible_message("[user] removes the bluespace crystals from [parent].", "You remove [parent]'s bluespace crystals.") + user.visible_message("[user] removes the bluespace crystals from [parent].", span_notice("You remove [parent]'s bluespace crystals.")) if(5) if(diff==FORWARD) - user.visible_message("[user] slots the capacitor onto [parent].", "You slot the capacitor onto [parent].") + user.visible_message("[user] slots the capacitor onto [parent].", span_notice("You slot the capacitor onto [parent].")) else - user.visible_message("[user] unsecures the bluespace crystal slots from [parent].", "You unsecure [parent]'s bluespace crystal slots.") + user.visible_message("[user] unsecures the bluespace crystal slots from [parent].", span_notice("You unsecure [parent]'s bluespace crystal slots.")) if(6) if(diff==FORWARD) - user.visible_message("[user] secures [parent]'s capacitor.", "You secure [parent]'s capacitor.") + user.visible_message("[user] secures [parent]'s capacitor.", span_notice("You secure [parent]'s capacitor.")) else - user.visible_message("[user] removes the [parent]'s capacitor.", "You remove the [parent]'s capacitor.") + user.visible_message("[user] removes the [parent]'s capacitor.", span_notice("You remove the [parent]'s capacitor.")) if(7) if(diff==FORWARD) - user.visible_message("[user] wires the [parent].", "You wire the [parent].") + user.visible_message("[user] wires the [parent].", span_notice("You wire the [parent].")) else - user.visible_message("[user] unsecures [parent]'s capacitor.", "You unsecure [parent]'s capacitor.") + user.visible_message("[user] unsecures [parent]'s capacitor.", span_notice("You unsecure [parent]'s capacitor.")) if(8) if(diff==FORWARD) - user.visible_message("[user] links [parent]'s wires to the limbs.", "You link [parent]'s wires to the limbs.") + user.visible_message("[user] links [parent]'s wires to the limbs.", span_notice("You link [parent]'s wires to the limbs.")) else - user.visible_message("[user] snips off [parent]'s wires.", "You snip off [parent]'s wires.") + user.visible_message("[user] snips off [parent]'s wires.", span_notice("You snip off [parent]'s wires.")) if(9) if(diff==FORWARD) - user.visible_message("[user] welds [parent]'s external armor layer.", "You weld [parent]'s external armor layer.") + user.visible_message("[user] welds [parent]'s external armor layer.", span_notice("You weld [parent]'s external armor layer.")) else - user.visible_message("[user] unlinks [parent]'s wires from the limbs.", "You unlink [parent]'s wires from the limbs.") + user.visible_message("[user] unlinks [parent]'s wires from the limbs.", span_notice("You unlink [parent]'s wires from the limbs.")) return TRUE diff --git a/modular_sand/code/game/objects/items/borg_shapeshifter.dm b/modular_sand/code/game/objects/items/borg_shapeshifter.dm index 64878711b6..0216524d69 100644 --- a/modular_sand/code/game/objects/items/borg_shapeshifter.dm +++ b/modular_sand/code/game/objects/items/borg_shapeshifter.dm @@ -111,18 +111,18 @@ if(isturf(user.loc)) toggle(user) else - to_chat(user, "You can't use [src] while inside something!") + to_chat(user, span_warning("You can't use [src] while inside something!")) else - to_chat(user, "You need at least [activationCost] charge in your cell to use [src]!") + to_chat(user, span_warning("You need at least [activationCost] charge in your cell to use [src]!")) /obj/item/borg_shapeshifter/proc/toggle(mob/living/silicon/robot/user) if(active) playsound(src, 'sound/effects/pop.ogg', 100, TRUE, -6) - to_chat(user, "You deactivate \the [src].") + to_chat(user, span_notice("You deactivate \the [src].")) deactivate(user) else if(animation_playing) - to_chat(user, "\the [src] is recharging.") + to_chat(user, span_notice("\the [src] is recharging.")) return var/mob/living/silicon/robot/R = loc var/static/list/module_icons = sortList(list( @@ -574,7 +574,7 @@ return FALSE animation_playing = TRUE - to_chat(user, "You activate \the [src].") + to_chat(user, span_notice("You activate \the [src].")) playsound(src, 'sound/effects/seedling_chargeup.ogg', 100, TRUE, -6) var/start = user.filters.len var/X,Y,rsq,i,f @@ -591,10 +591,10 @@ animate(offset=f:offset-1, time=rand()*20+10) if (do_after(user, 50, target=user) && user.cell.use(activationCost)) playsound(src, 'sound/effects/bamf.ogg', 100, TRUE, -6) - to_chat(user, "You are now disguised as the Nanotrasen cyborg \"[friendlyName]\".") + to_chat(user, span_notice("You are now disguised as the Nanotrasen cyborg \"[friendlyName]\".")) activate(user, module_selection) else - to_chat(user, "The chameleon field fizzles.") + to_chat(user, span_warning("The chameleon field fizzles.")) do_sparks(3, FALSE, user) for(i=1, i<=min(7, user.filters.len), ++i) // removing filters that are animating does nothing, we gotta stop the animations first f = user.filters[start+i] @@ -656,7 +656,7 @@ /obj/item/borg_shapeshifter/proc/disrupt(mob/living/silicon/robot/user) if(active) - to_chat(user, "Your chameleon field deactivates.") + to_chat(user, span_danger("Your chameleon field deactivates.")) deactivate(user) /obj/item/borg_shapeshifter/stable diff --git a/modular_sand/code/game/objects/items/chrono_eraser.dm b/modular_sand/code/game/objects/items/chrono_eraser.dm index d3f803e38f..a168920e1d 100644 --- a/modular_sand/code/game/objects/items/chrono_eraser.dm +++ b/modular_sand/code/game/objects/items/chrono_eraser.dm @@ -86,7 +86,7 @@ var/mob/living/user = loc if(F.gun) if(isliving(user) && F.captured) - to_chat(user, "FAIL: [F.captured] already has an existing connection.") + to_chat(user, span_alert("FAIL: [F.captured] already has an existing connection.")) field_disconnect(F) else startpos = get_turf(src) @@ -94,7 +94,7 @@ F.gun = src if(isliving(user) && F.captured) playsound(user,'sound/effects/clock_tick.ogg' , 50, 1) - to_chat(user, "Connection established with target: [F.captured]") + to_chat(user, span_notice("Connection established with target: [F.captured]")) /obj/item/gun/energy/chrono_gun/proc/field_disconnect(obj/structure/chrono_field/F) @@ -104,7 +104,7 @@ F.gun = null if(isliving(user) && F.captured) F.captured.adjustOrganLoss(ORGAN_SLOT_BRAIN, 199, 199) //not so fast! - to_chat(user, "Disconnected from target: [F.captured]") + to_chat(user, span_alert("Disconnected from target: [F.captured]")) field = null startpos = null @@ -215,9 +215,9 @@ AM.forceMove(drop_location()) qdel(src) else if(tickstokill <= 0) - to_chat(captured, "As the last essence of your being is erased from time, you are taken back to your most enjoyable memory. You feel happy...") + to_chat(captured, span_boldnotice("As the last essence of your being is erased from time, you are taken back to your most enjoyable memory. You feel happy...")) playsound(captured,'sound/effects/lingreadapt.ogg' , 50, 1) - captured.visible_message("[captured] dematerialises out of the timestream!") + captured.visible_message(span_danger("[captured] dematerialises out of the timestream!")) var/mob/dead/observer/ghost = captured.ghostize(1) if(captured.mind) if(ghost) diff --git a/modular_sand/code/game/objects/items/circuitboards/machine_circuitboards.dm b/modular_sand/code/game/objects/items/circuitboards/machine_circuitboards.dm index ab97d07d54..aec2c6f1ab 100644 --- a/modular_sand/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/modular_sand/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -40,7 +40,7 @@ /obj/item/stock_parts/micro_laser = 5, /obj/item/stock_parts/manipulator = 5, /obj/item/stock_parts/scanning_module = 5, - /obj/item/stack/ore/bluespace_crystal = 5) + ANOMALY_CORE_BLUESPACE = 1) needs_anchored = FALSE /obj/item/circuitboard/machine/telecomms/message_server diff --git a/modular_sand/code/game/objects/items/computermath.dm b/modular_sand/code/game/objects/items/computermath.dm index 19a3e17512..2188f05ff9 100644 --- a/modular_sand/code/game/objects/items/computermath.dm +++ b/modular_sand/code/game/objects/items/computermath.dm @@ -240,7 +240,7 @@ // me fail arithmetic, me brian hurt playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1) if(difficulty == "Easy") // me fail arithmetic, me brian hurt //nice one, brain damage for it, very cool. - to_chat(user,"You feel sad after failing such an easy question...") + to_chat(user,span_warning("You feel sad after failing such an easy question...")) SEND_SIGNAL(LM, COMSIG_ADD_MOOD_EVENT, "failed_easy", /datum/mood_event/failed_easy) return diff --git a/modular_sand/code/game/objects/items/cosmetics.dm b/modular_sand/code/game/objects/items/cosmetics.dm index b43112c55c..10db30229e 100644 --- a/modular_sand/code/game/objects/items/cosmetics.dm +++ b/modular_sand/code/game/objects/items/cosmetics.dm @@ -4,7 +4,7 @@ /obj/item/razor/proc/new_hairstyle(mob/living/carbon/human/H, mob/user, mirror) var/location = user.zone_selected if (H == user && !mirror) - to_chat(user, "You need a mirror to properly style your own hair!") + to_chat(user, span_warning("You need a mirror to properly style your own hair!")) balloon_alert(user, "need mirror!") return if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) @@ -13,12 +13,12 @@ if(!new_style) return if(!get_location_accessible(H, location)) - to_chat(user, "The headgear is in the way!") + to_chat(user, span_warning("The headgear is in the way!")) balloon_alert(user, "headgear in the way!") return - user.visible_message("[user] tries to change [H]'s hairstyle using [src].", "You try to change [H]'s hairstyle using [src].") + user.visible_message(span_notice("[user] tries to change [H]'s hairstyle using [src]."), span_notice("You try to change [H]'s hairstyle using [src].")) if(new_style && do_after(user, 60, target = H)) - user.visible_message("[user] successfully changes [H]'s hairstyle using [src].", "You successfully change [H]'s hairstyle using [src].") + user.visible_message(span_notice("[user] successfully changes [H]'s hairstyle using [src]."), span_notice("You successfully change [H]'s hairstyle using [src].")) H.balloon_alert(user, "changed hairstyle") H.hair_style = new_style H.update_hair() @@ -26,7 +26,7 @@ /obj/item/razor/proc/new_facial_hairstyle(mob/living/carbon/human/H, mob/user, var/mirror) var/location = user.zone_selected if(H == user && !mirror) - to_chat(user, "You need a mirror to properly style your own facial hair!") + to_chat(user, span_warning("You need a mirror to properly style your own facial hair!")) balloon_alert(user, "need mirror!") return if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) @@ -35,12 +35,12 @@ if(!new_style) return if(!get_location_accessible(H, location)) - to_chat(user, "The mask is in the way!") + to_chat(user, span_warning("The mask is in the way!")) balloon_alert(user, "mask in the way!") return - user.visible_message("[user] tries to change [H]'s facial hair style using [src].", "You try to change [H]'s facial hair style using [src].") + user.visible_message(span_notice("[user] tries to change [H]'s facial hair style using [src]."), span_notice("You try to change [H]'s facial hair style using [src].")) if(new_style && do_after(user, 60, target = H)) - user.visible_message("[user] successfully changes [H]'s facial hair style using [src].", "You successfully change [H]'s facial hair style using [src].") + user.visible_message(span_notice("[user] successfully changes [H]'s facial hair style using [src]."), span_notice("You successfully change [H]'s facial hair style using [src].")) H.balloon_alert(user, "changed facial hair style") H.facial_hair_style = new_style H.update_hair() @@ -64,7 +64,7 @@ var/extended_icon_state = "straightrazor_open" /obj/item/razor/straightrazor/suicide_act(mob/user) - user.visible_message("[user] is slitting [user.p_their()] own throat with [src]! It looks like [user.p_theyre()] trying to commit suicide!") + user.visible_message(span_suicide("[user] is slitting [user.p_their()] own throat with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return (BRUTELOSS) /obj/item/razor/straightrazor/attack_self(mob/user) @@ -102,6 +102,6 @@ /obj/item/handmirror/attack_self(mob/user) ADD_TRAIT(user, TRAIT_SELF_AWARE, "mirror_trait") - to_chat(user, "You look into the mirror") + to_chat(user, span_notice("You look into the mirror")) sleep(15 SECONDS) REMOVE_TRAIT(user, TRAIT_SELF_AWARE, "mirror_trait") diff --git a/modular_sand/code/game/objects/items/devices/dogborg_sleeper.dm b/modular_sand/code/game/objects/items/devices/dogborg_sleeper.dm index 00f94fa31e..c0dbc0d4a4 100644 --- a/modular_sand/code/game/objects/items/devices/dogborg_sleeper.dm +++ b/modular_sand/code/game/objects/items/devices/dogborg_sleeper.dm @@ -25,20 +25,20 @@ if(!hound || !istype(target) || !proximity || target.anchored) return if(length(contents) > (max_item_count - 1)) - to_chat(user,"Your [src] is full. Eject or process contents to continue.") + to_chat(user,span_warning("Your [src] is full. Eject or process contents to continue.")) return if(isitem(target)) var/obj/item/I = target if(CheckAccepted(I)) - to_chat(user,"[I] registers an error code to your [src]") + to_chat(user,span_warning("[I] registers an error code to your [src]")) return if(I.w_class > WEIGHT_CLASS_NORMAL) - to_chat(user,"[I] is too large to fit into your [src]") + to_chat(user,span_warning("[I] is too large to fit into your [src]")) return - user.visible_message("[hound.name] is ingesting [I] into their [src.name].", "You start ingesting [target] into your [src.name]...") + user.visible_message(span_warning("[hound.name] is ingesting [I] into their [src.name]."), span_notice("You start ingesting [target] into your [src.name]...")) if(do_after(user, 15, target = target) && length(contents) < max_item_count) I.forceMove(src) - I.visible_message("[hound.name]'s garbage processor groans lightly as [I] slips inside.", "Your garbage compactor groans lightly as [I] slips inside.") + I.visible_message(span_warning("[hound.name]'s garbage processor groans lightly as [I] slips inside."), span_notice("Your garbage compactor groans lightly as [I] slips inside.")) playsound(hound, 'sound/machines/disposalflush.ogg', 50, 1) if(length(contents) > 11) //grow that tum after a certain junk amount hound.sleeper_r = 1 @@ -51,18 +51,18 @@ if(iscarbon(target) || issilicon(target)) var/mob/living/trashman = target if(!CHECK_BITFIELD(trashman.vore_flags,DEVOURABLE)) - to_chat(user, "[target] registers an error code to your [src]") + to_chat(user, span_warning("[target] registers an error code to your [src]")) return if(patient) - to_chat(user,"Your [src] is already occupied.") + to_chat(user,span_warning("Your [src] is already occupied.")) return if(trashman.buckled) - to_chat(user,"[trashman] is buckled and can not be put into your [src].") + to_chat(user,span_warning("[trashman] is buckled and can not be put into your [src].")) return - user.visible_message("[hound.name] is ingesting [trashman] into their [src].", "You start ingesting [trashman] into your [src.name]...") + user.visible_message(span_warning("[hound.name] is ingesting [trashman] into their [src]."), span_notice("You start ingesting [trashman] into your [src.name]...")) if(do_after(user, 30, target = trashman) && !patient && !trashman.buckled && length(contents) < max_item_count) trashman.forceMove(src) trashman.reset_perspective(src) update_gut(user) - user.visible_message("[hound.name]'s garbage processor groans lightly as [trashman] slips inside.", "Your garbage compactor groans lightly as [trashman] slips inside.") + user.visible_message(span_warning("[hound.name]'s garbage processor groans lightly as [trashman] slips inside."), span_notice("Your garbage compactor groans lightly as [trashman] slips inside.")) playsound(hound, 'sound/effects/bin_close.ogg', 80, 1) diff --git a/modular_sand/code/game/objects/items/devices/extra_arm.dm b/modular_sand/code/game/objects/items/devices/extra_arm.dm index 55a40eb163..35949fc463 100644 --- a/modular_sand/code/game/objects/items/devices/extra_arm.dm +++ b/modular_sand/code/game/objects/items/devices/extra_arm.dm @@ -11,8 +11,8 @@ M.change_number_of_hands(limbs+1) used = TRUE icon_state = "extra_arm_none" - M.visible_message("[M] presses a button on [src], and you hear a disgusting noise.", "You feel a sharp sting as [src] plunges into your body.") + M.visible_message(span_notice("[M] presses a button on [src], and you hear a disgusting noise."), span_notice("You feel a sharp sting as [src] plunges into your body.")) M.balloon_alert(M, "arm implanted") - to_chat(M, "You feel more dexterous.") + to_chat(M, span_notice("You feel more dexterous.")) playsound(get_turf(M), 'sound/misc/splort.ogg', 50, 1) desc += "Looks like it's been used up." diff --git a/modular_sand/code/game/objects/items/fleshlight.dm b/modular_sand/code/game/objects/items/fleshlight.dm index 5142ab1469..1db9cbc504 100644 --- a/modular_sand/code/game/objects/items/fleshlight.dm +++ b/modular_sand/code/game/objects/items/fleshlight.dm @@ -20,7 +20,7 @@ /obj/item/fleshlight/examine(mob/user) . = ..() - . += "Alt-Click \the [name] to customize it." + . += span_notice("Alt-Click \the [name] to customize it.") /obj/item/fleshlight/update_appearance(updates) . = ..() @@ -61,7 +61,7 @@ message = (user == M) ? "pumps [src] on [possessive_verb] [genital_name]" : "pumps \the [src] on [M]'s [genital_name]" lust_amt = NORMAL_LUST if(message) - user.visible_message("[user] [message].") + user.visible_message(span_lewd("[user] [message].")) M.handle_post_sex(lust_amt, null, user) playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/bang4.ogg', 'modular_sand/sound/interactions/bang5.ogg', @@ -107,9 +107,9 @@ /obj/item/portallight/examine(mob/user) . = ..() if(!portalunderwear) - . += "The device is unpaired. To pair, swipe against a pair of portal panties." + . += span_notice("The device is unpaired. To pair, swipe against a pair of portal panties.") else - . += "The device is paired, and awaiting input. " + . += span_notice("The device is paired, and awaiting input. ") /obj/item/portallight/update_appearance(updates) . = ..() @@ -122,7 +122,7 @@ var/target_lust_amt = NONE var/target var/mob/living/carbon/human/portal_target = ishuman(portalunderwear.loc) && (portalunderwear.current_equipped_slot & (ITEM_SLOT_UNDERWEAR | ITEM_SLOT_MASK)) ? portalunderwear.loc : null - + // This list is structured as [M's longname, M's shortname, wearer's longname, wearer's shortname] var/penis_names = list() for(var/mob/living/carbon/human/person in list(M, portal_target)) @@ -137,7 +137,7 @@ else LAZYADD(penis_names, "none") LAZYADD(penis_names, "none") - + if(ishuman(M) && (M?.client?.prefs?.toggles & VERB_CONSENT) && useable) // I promise all those checks are worth it! switch(user.zone_selected) if(BODY_ZONE_PRECISE_GROIN) @@ -416,7 +416,7 @@ else to_chat(user, "There is no [user.zone_selected == BODY_ZONE_R_LEG ? "right" : "left"] feet!") if(!useable) - to_chat(user, "It seems the device has failed or your partner is not wearing their device.") + to_chat(user, span_notice("It seems the device has failed or your partner is not wearing their device.")) if(user_message) if(portal_target && (portal_target?.client?.prefs.toggles & VERB_CONSENT || !portal_target.ckey)) user.visible_message("[user] [user_message].") @@ -514,7 +514,7 @@ to_chat(M, "urethra fleshlight cumming on dick") portal_target.do_jitter_animation() //make your partner shake too! else - user.visible_message("\The [src] beeps and does not let [M] through.") + user.visible_message(span_warning("\The [src] beeps and does not let [M] through.")) else if(user.a_intent == INTENT_HARM) return ..() @@ -607,7 +607,7 @@ if(isliving(portalunderwear.loc)) portalunderwear.audible_message("[icon2html(portalunderwear, hearers(portalunderwear))] *beep* *beep* *beep*") playsound(portalunderwear, 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) - to_chat(portalunderwear.loc, "The panties beep as the link to the [src] is lost.") + to_chat(portalunderwear.loc, span_notice("The panties beep as the link to the [src] is lost.")) . = ..() /** @@ -625,6 +625,7 @@ var/targetting = CUM_TARGET_VAGINA equip_delay_self = 2 SECONDS equip_delay_other = 5 SECONDS + is_edible = 0 /obj/item/clothing/underwear/briefs/panties/portalpanties/attack_self(mob/user) . = ..() @@ -652,9 +653,9 @@ /obj/item/clothing/underwear/briefs/panties/portalpanties/examine(mob/user) . = ..() if(!portallight) - . += "The device is unpaired, to pair, swipe the fleshlight against this pair of portal panties(TM). " + . += span_notice("The device is unpaired, to pair, swipe the fleshlight against this pair of portal panties(TM). ") else - . += "The device is paired, and awaiting attachment. " + . += span_notice("The device is paired, and awaiting attachment. ") /obj/item/clothing/underwear/briefs/panties/portalpanties/attackby(obj/item/I, mob/living/user) //pairing if(istype(I, /obj/item/portallight)) @@ -680,11 +681,11 @@ switch(targetting) if(CUM_TARGET_VAGINA) if(!human.has_vagina(REQUIRE_EXPOSED)) - to_chat(human, "The vagina is covered or there is none!") + to_chat(human, span_warning("The vagina is covered or there is none!")) return FALSE if(CUM_TARGET_ANUS) if(!human.has_anus(REQUIRE_EXPOSED)) - to_chat(human, "The anus is covered or there is none!") + to_chat(human, span_warning("The anus is covered or there is none!")) return FALSE if(CUM_TARGET_PENIS) if(!human.has_penis(REQUIRE_EXPOSED) && !human.has_strapon(REQUIRE_EXPOSED)) @@ -707,7 +708,7 @@ if(!portallight) audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*") playsound(src, 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) - to_chat(user, "The panties are not linked to a portal fleshlight.") + to_chat(user, span_notice("The panties are not linked to a portal fleshlight.")) else update_portal() RegisterSignal(user, COMSIG_PARENT_QDELETING, .proc/drop_out) diff --git a/modular_sand/code/game/objects/items/plushes.dm b/modular_sand/code/game/objects/items/plushes.dm new file mode 100644 index 0000000000..9ed4c6f90c --- /dev/null +++ b/modular_sand/code/game/objects/items/plushes.dm @@ -0,0 +1,233 @@ +// Honestly, Saliith was just sad when he made this. Leave this file in the game to let people hug him. + +/obj/item/toy/plush/lizardplushie/saliith + name = "Saliith plushie" + desc = "He looks like he needs a friend." + icon = 'modular_sand/icons/obj/plushes.dmi' + icon_state = "saliith" + gender = MALE + can_random_spawn = FALSE + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF // Protected by a higher power + unstuffable = TRUE // Prevent grenades + +/obj/item/toy/plush/lizardplushie/saliith/Initialize(mapload, set_snowflake_id) + // Check if plush already exists + if(GLOB.saliith_plushie && (GLOB.saliith_plushie != src)) + return INITIALIZE_HINT_QDEL + + // Return normally + . = ..() + +/obj/item/toy/plush/lizardplushie/saliith/ComponentInitialize() + . = ..() + + // Add respawn component + AddComponent(/datum/component/stationloving) + + // Define pronouns + var/p_they = p_they() + var/p_s = p_s() + + // Add custom description + normal_desc = "[p_they] look[p_s] like [p_they] need[p_s] a friend." + +/obj/item/toy/plush/lizardplushie/saliith/examine(mob/user) + . = ..() + + // Define pronouns + var/p_them = p_them() + //var/p_they = p_they() + //var/p_are = p_are() + + // Check for stuffing + if(!stuffed) + // Update examine text and return + . += span_deadsay("[p_they(TRUE)] [p_are()] dead.") + return + + // Check if user is Saliith himself + if(user.ckey == "sandpoot") + // Update examine text and return + . += span_deadsay("You feel a sense of familiarity from [p_them].") + return + + // Check for antag datums + if((length(user?.mind?.antag_datums) >= 1)) + // Update examine text + . += span_warning("[src] gives you a menacing glare! Patting [p_them] would be a dangerous mistake.") + +/obj/item/toy/plush/lizardplushie/saliith/attack_self(mob/living/carbon/human/user) + // Check if user exists + if(!user) + // Return normally + return ..() + + // Check if user has a mind + if(!user.mind) + // Return normally + return ..() + + // Define pronouns + var/p_they = p_they() + //var/p_their = p_their() + var/p_s = p_s() + + // Check if user is Saliith himself + if(user.ckey == "sandpoot") + // Alert him and return + to_chat(user, span_notice("[p_they] give[p_s] you a hesitant gaze, but accept[p_s] the gesture anyhow.")) + return ..() + + // Check if user is an antagonist role + if((length(user?.mind?.antag_datums) >= 1)) + // Check if user is a xenobio changeling + if(user?.mind?.has_antag_datum(/datum/antagonist/changeling/xenobio)) + // Alert the user + to_chat(user, span_notice("[src] senses what you really are, but decides to spare you.")) + + // Check if user is a brainwashed victim + else if(user?.mind?.has_antag_datum(/datum/antagonist/brainwashed)) + // Alert the user + to_chat(user, span_notice("[src] senses that you're not in control of your actions, and offers [p_their()] sympathy.")) + + // User is not a whitelisted antagonist + else + // Drop the item + user.dropItemToGround(src) + + // Warn user + user.visible_message(span_warning("[src] smites [user] with an otherworldly wrath!"), span_boldwarning("You've made a grave mistake.")) + + // Get lightning location + var/turf/turf_target = get_step(get_step(user, NORTH), NORTH) + + // Perform lightning effect + turf_target.Beam(user, icon_state="lightning[rand(1,12)]", time = 5) + user.electrocution_animation(40) + + // Play sound effect + playsound(get_turf(user), 'sound/magic/lightningbolt.ogg', 50, 1) + + // Add fire damage + user.adjustFireLoss(120) + + // Return + return + + // User has no antagonist status + + // Alert the user + to_chat(user, span_notice("[p_they] give[p_s] you a hesitant gaze, but accepts the gesture anyhow.")) + + // Return + return ..() + +/obj/item/toy/plush/lizardplushie/saliith/attackby(obj/item/item_used, mob/living/user, params) + // Check for sharp object + if(item_used.get_sharpness()) + // Warn in local chat + visible_message(span_warning("[src] knocks \the [item_used] out of [user]'s hands!"), span_warning("[src] knocks \the [item_used] out of your hands!")) + + // Drop the item + user.dropItemToGround(item_used) + + // Throw the item away + item_used.throw_at(pick(oview(7,get_turf(src))),10,1) + + // Return + return + + // Check if user is Saliith himself + if(user.ckey == "sandpoot") + // Return with no effects + return ..() + + // Check for grenade + if(istype(item_used, /obj/item/grenade)) + // Warn in local chat + visible_message(span_warning("[src] forces \the [item_used] into [user]'s mouth!"), span_warning("[src] forces \the [item_used] into your mouth!")) + + // Define the grenade item + var/obj/item/grenade/item_grenade = item_used + + // Move grenade to the user + item_grenade.forceMove(user) + + // Set the detonation time + item_grenade.preprime(volume = 10) + + // Return + return + + // Return normally + return ..() + +/obj/item/toy/plush/lizardplushie/saliith/ex_act(severity, target, origin) + return + +/obj/item/toy/plush/plushling/plushie_absorb(obj/item/toy/plush/victim) + // Check if target is the Saliith plushie + if(istype(victim, /obj/item/toy/plush/lizardplushie/saliith)) + // Warn in local chat + visible_message(span_warning("[victim] violently parries the impostor! [src] is utterly annihilated!")) + + // Create a gib effect + new /obj/effect/gibspawner(get_turf(src)) + + // Delete the plushling + qdel(src) + + // Return + return + + // Return normally + return ..() + +/obj/item/toy/plush/love(obj/item/toy/plush/Kisser, mob/living/user) + // Define saliith plush + var/plush_saliith = /obj/item/toy/plush/lizardplushie/saliith + + // Check if interaction involves the Saliith plush + if(istype(src, plush_saliith) || istype(Kisser, plush_saliith)) + // Check if user is Saliith himself + if(user.ckey == "sandpoot") + // Return normally + return ..() + + // User is not Saliith + // Warn in local chat + user.visible_message(span_warning("[user] tried to force [Kisser] to kiss [src] against their will, and has been yeeted!"), span_warning("You try to force [Kisser] to kiss [src], but get yeeted instead!")) + + // Display voice of god message + say("YEET", spans = list("colossus","yell")) + + // Play sound + playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 200, TRUE, 5) + + // Drop the plushies if held + if(src in user.held_items) + user.dropItemToGround(src) + if(Kisser in user.held_items) + user.dropItemToGround(Kisser) + + // Launch user away + var/turf/yeet_target = get_edge_target_turf(user, pick(GLOB.alldirs)) + user.throw_at(yeet_target, 10, 14) + log_combat(src, user, "plush yeeted") + + // Return + return + + // Interaction does not involve Saliith + // Return normally + return ..() + +// Pinpointer for plushie toy +/obj/item/pinpointer/plushie_saliith + name = "Saliith plushie pinpointer" + desc = "A handheld tracking device that locates Saliith's plushie." + icon = 'modular_sand/icons/obj/device.dmi' + icon_state = "pinpointer_saliith" + +/obj/item/pinpointer/plushie_saliith/scan_for_target() + set_target(GLOB.saliith_plushie, src) diff --git a/modular_sand/code/game/objects/items/plushes/goat_boss.dm b/modular_sand/code/game/objects/items/plushes/goat_boss.dm index 9209390bba..a754f936f8 100644 --- a/modular_sand/code/game/objects/items/plushes/goat_boss.dm +++ b/modular_sand/code/game/objects/items/plushes/goat_boss.dm @@ -26,27 +26,27 @@ if (!targets_to_pick_from.len) return target = pick(targets_to_pick_from) - visible_message("[src] stares at [target].") + visible_message(span_notice("[src] stares at [target].")) if (world.time > cooldown && target) ram() /obj/item/toy/plush/goatplushie/angry/proc/ram() if(prob((obj_flags & EMAGGED) ? 98:90) && isturf(loc) && considered_alive(target.mind) && !faction_check(list("goat"), target.faction, FALSE)) throw_at(target, 10, 10) - visible_message("[src] rams [target]!") + visible_message(span_danger("[src] rams [target]!")) cooldown = world.time + cooldown_modifier target = null - visible_message("[src] looks disinterested.") + visible_message(span_notice("[src] looks disinterested.")) /obj/item/toy/plush/goatplushie/angry/emag_act(mob/user) if (obj_flags&EMAGGED) - visible_message("[src] already looks angry enough, you shouldn't anger it more.") + visible_message(span_notice("[src] already looks angry enough, you shouldn't anger it more.")) return cooldown_modifier = cooldown_modifier/2 * 0.75 throwforce = 12.5 force = 10 obj_flags |= EMAGGED - visible_message("[src] stares at [user] angrily before going docile.") + visible_message(span_danger("[src] stares at [user] angrily before going docile.")) /obj/item/toy/plush/goatplushie/angry/Destroy() STOP_PROCESSING(SSprocessing, src) @@ -85,14 +85,14 @@ /obj/item/toy/plush/goatplushie/angry/kinggoat/ascendedkinggoat/attackby(obj/item/I,mob/living/user,params) if(I.get_sharpness()) - user.visible_message("[user] attempts to destroy [src]!", "[I] bounces off [src]'s back before breaking into millions of pieces... [src] glares at [user]!") // You fucked up now son + user.visible_message(span_notice("[user] attempts to destroy [src]!"), span_suicide("[I] bounces off [src]'s back before breaking into millions of pieces... [src] glares at [user]!")) // You fucked up now son I.play_tool_sound(src) qdel(I) user.gib() /obj/item/toy/plush/goatplushie/angry/kinggoat/attackby(obj/item/I,mob/living/user,params) if(I.get_sharpness()) - user.visible_message("[user] rips [src] to shreds!", "[src]'s death has attracted the attention of the king goat plushie guards!") + user.visible_message(span_notice("[user] rips [src] to shreds!"), span_notice("[src]'s death has attracted the attention of the king goat plushie guards!")) I.play_tool_sound(src) qdel(src) var/turf/location = get_turf(user) @@ -109,7 +109,7 @@ new/obj/item/toy/plush/goatplushie/angry/guardgoat(location) new/obj/item/toy/plush/goatplushie/angry/guardgoat(location) if(istype(I, /obj/item/reagent_containers/food/snacks/grown/cabbage)) - user.visible_message("[user] watches as [src] takes a bite out of the cabbage!", "[src]'s fur starts glowing. It seems they have ascended!") + user.visible_message(span_notice("[user] watches as [src] takes a bite out of the cabbage!"), span_notice("[src]'s fur starts glowing. It seems they have ascended!")) playsound(src, 'sound/items/eatfood.ogg', 50, 1) qdel(I) qdel(src) diff --git a/modular_sand/code/game/objects/items/robot/robot_upgrades.dm b/modular_sand/code/game/objects/items/robot/robot_upgrades.dm index 5306894298..1dcdf6deff 100644 --- a/modular_sand/code/game/objects/items/robot/robot_upgrades.dm +++ b/modular_sand/code/game/objects/items/robot/robot_upgrades.dm @@ -16,7 +16,7 @@ if(!XW) XW = locate() in R.module if(XW) - to_chat(user, "This unit is already equipped with an experimental welding tool module.") + to_chat(user, span_warning("This unit is already equipped with an experimental welding tool module.")) return FALSE XW = new(R.module) qdel(WT) @@ -83,7 +83,7 @@ if(!BD) BD = locate() in R.module //There's gotta be a smarter way to do this. if(BD) - to_chat(user, "This unit is already equipped with a BSRPD module.") + to_chat(user, span_warning("This unit is already equipped with a BSRPD module.")) return FALSE BD = new(R.module) @@ -138,11 +138,11 @@ if(.) if(R.hasExpanded) - to_chat(usr, "This unit already has an expand module installed!") + to_chat(usr, span_notice("This unit already has an expand module installed!")) return FALSE if(R.hasShrunk) - to_chat(usr, "This unit already has an shrink module installed!") + to_chat(usr, span_notice("This unit already has an shrink module installed!")) return FALSE if(ExpandSize <= 0) @@ -184,11 +184,11 @@ if(.) if(R.hasShrunk) - to_chat(usr, "This unit already has an shrink module installed!") + to_chat(usr, span_notice("This unit already has an shrink module installed!")) return FALSE if(R.hasExpanded) - to_chat(usr, "This unit already has an expand module installed!") + to_chat(usr, span_notice("This unit already has an expand module installed!")) return FALSE if(ShrinkSize == 0) @@ -246,7 +246,7 @@ if(!shuttle_maker) shuttle_maker = locate() in R.module if(shuttle_maker) - to_chat(user, "This unit is already equipped with a rapid shuttle designator module.") + to_chat(user, span_warning("This unit is already equipped with a rapid shuttle designator module.")) return FALSE shuttle_maker = new(R.module) R.module.basic_modules += shuttle_maker diff --git a/modular_sand/code/game/objects/items/stacks/tiles/tile_reskinning.dm b/modular_sand/code/game/objects/items/stacks/tiles/tile_reskinning.dm index 7f240548e6..2feb8f236a 100644 --- a/modular_sand/code/game/objects/items/stacks/tiles/tile_reskinning.dm +++ b/modular_sand/code/game/objects/items/stacks/tiles/tile_reskinning.dm @@ -39,4 +39,4 @@ GLOBAL_LIST_EMPTY(tile_reskin_lists) /obj/item/stack/tile/examine(mob/user) . = ..() if(tile_reskin_types) - . += "These kinds of tiles can be re-skinned! Use it on hand to reskin." + . += span_notice("These kinds of tiles can be re-skinned! Use it on hand to reskin.") diff --git a/modular_sand/code/game/objects/structures/ghost_role_spawners.dm b/modular_sand/code/game/objects/structures/ghost_role_spawners.dm index d1c2ab7ce0..89b7c20ef5 100644 --- a/modular_sand/code/game/objects/structures/ghost_role_spawners.dm +++ b/modular_sand/code/game/objects/structures/ghost_role_spawners.dm @@ -36,7 +36,7 @@ ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, GHOSTROLE_TRAIT) ADD_TRAIT(new_spawn, TRAIT_EXEMPT_HEALTH_EVENTS, GHOSTROLE_TRAIT) ADD_TRAIT(new_spawn, TRAIT_NO_MIDROUND_ANTAG, GHOSTROLE_TRAIT) //The mob can't be made into a random antag, they are still eligible for ghost roles popups. - to_chat(new_spawn,"Ghosting is free!") + to_chat(new_spawn,span_boldwarning("Ghosting is free!")) var/datum/action/toggle_dead_chat_mob/D = new(new_spawn) D.Grant(new_spawn) var/datum/action/disguise/disguise_action = new(new_spawn) diff --git a/modular_sand/code/game/objects/structures/tank_holder.dm b/modular_sand/code/game/objects/structures/tank_holder.dm index 5f88eceed9..b0a720af7f 100644 --- a/modular_sand/code/game/objects/structures/tank_holder.dm +++ b/modular_sand/code/game/objects/structures/tank_holder.dm @@ -30,13 +30,13 @@ /obj/structure/tank_holder/examine(mob/user) . = ..() - . += "It is held together by some screws." + . += span_notice("It is held together by some screws.") /obj/structure/tank_holder/attackby(obj/item/W, mob/user, params) if(user.a_intent == INTENT_HARM) return ..() if(!SEND_SIGNAL(W, COMSIG_CONTAINER_TRY_ATTACH, src, user)) - to_chat(user, "[W] does not fit in [src].") + to_chat(user, span_warning("[W] does not fit in [src].")) /obj/structure/tank_holder/screwdriver_act(mob/living/user, obj/item/I) if(..()) @@ -63,7 +63,7 @@ return ..() if(!Adjacent(user) || issilicon(user)) return ..() - to_chat(user, "You take [tank] from [src].") + to_chat(user, span_notice("You take [tank] from [src].")) add_fingerprint(user) tank.add_fingerprint(user) user.put_in_hands(tank) diff --git a/modular_sand/code/game/turfs/open.dm b/modular_sand/code/game/turfs/open.dm index 13f7e25990..5e66692c37 100644 --- a/modular_sand/code/game/turfs/open.dm +++ b/modular_sand/code/game/turfs/open.dm @@ -7,7 +7,7 @@ /obj/item/wallframe/light_fixture/small/proc/attach_floor(turf/a_floor, mob/user) playsound(src.loc, 'sound/machines/click.ogg', 75, 1) user.visible_message("[user.name] attaches [src] to \the [a_floor].", - "You attach [src] to \the [a_floor].", + span_notice("You attach [src] to \the [a_floor]."), "You hear clicking.") a_floor.balloon_alert(user, "attached to floor") var/obj/O = new /obj/structure/light_construct/floor(a_floor, 1, TRUE) diff --git a/modular_sand/code/game/turfs/simulated/floor/plating.dm b/modular_sand/code/game/turfs/simulated/floor/plating.dm index 4393ff0180..75235f067a 100644 --- a/modular_sand/code/game/turfs/simulated/floor/plating.dm +++ b/modular_sand/code/game/turfs/simulated/floor/plating.dm @@ -4,25 +4,25 @@ /turf/open/floor/plating/examine(mob/user) . = ..() if(!(baseturfs == /turf/baseturf_bottom || istype(baseturfs, /turf/open/space))) - . += "\The [src] cannot be removed from the floor." + . += span_notice("\The [src] cannot be removed from the floor.") else if(unfastened) - . += "\The [src] could be welded off the floor." - . += "The screws on [src] appear loose." + . += span_notice("\The [src] could be welded off the floor.") + . += span_warning("The screws on [src] appear loose.") else - . += "The screws on [src] could be loosened with a screwdriver." + . += span_notice("The screws on [src] could be loosened with a screwdriver.") /turf/open/floor/plating/screwdriver_act(mob/living/user, obj/item/I) if(type == /turf/open/floor/plating) if(baseturfs == /turf/baseturf_bottom || istype(baseturfs, /turf/open/space)) - to_chat(user, "You start [unfastened ? "fastening" : "unfastening"] [src].") + to_chat(user, span_notice("You start [unfastened ? "fastening" : "unfastening"] [src].")) balloon_alert(user, "[unfastened ? "fastening" : "unfastening"]") if(!I.use_tool(src, user, 20, volume = 80)) return - to_chat(user, "You [unfastened ? "fasten" : "unfasten"] [src].") + to_chat(user, span_notice("You [unfastened ? "fasten" : "unfasten"] [src].")) balloon_alert(user, "[unfastened ? "fastened" : "unfastened"]") unfastened = !unfastened else - to_chat(user, "You cannot remove this plating.") + to_chat(user, span_warning("You cannot remove this plating.")) balloon_alert(user, "can't remove!") return @@ -30,13 +30,13 @@ . = ..() if(type == /turf/open/floor/plating && unfastened) if(baseturfs == /turf/baseturf_bottom || istype(baseturfs, /turf/open/space)) - to_chat(user, "You start removing [src], exposing space after you're done!") + to_chat(user, span_warning("You start removing [src], exposing space after you're done!")) balloon_alert(user, "removing") if(!I.use_tool(src, user, 50, volume = 160)) //extra loud to let people know something's going down return new /obj/item/stack/tile/plasteel(get_turf(src)) ReplaceWithLattice() - to_chat(user, "You remove [src].") + to_chat(user, span_notice("You remove [src].")) balloon_alert(user, "removed") return else diff --git a/modular_sand/code/modules/admin/verbs/randomverbs.dm b/modular_sand/code/modules/admin/verbs/randomverbs.dm index 5bb62c4415..ac491b22be 100644 --- a/modular_sand/code/modules/admin/verbs/randomverbs.dm +++ b/modular_sand/code/modules/admin/verbs/randomverbs.dm @@ -16,5 +16,5 @@ SSshuttle.autoEnd() SSblackbox.record_feedback("tally", "admin_verb", 1, "End Shift") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] ended the shift.") - message_admins("[key_name_admin(usr)] ended the shift.") + message_admins(span_adminnotice("[key_name_admin(usr)] ended the shift.")) return diff --git a/modular_sand/code/modules/arousal/arousal.dm b/modular_sand/code/modules/arousal/arousal.dm index 6b7df9b07c..f46707e884 100644 --- a/modular_sand/code/modules/arousal/arousal.dm +++ b/modular_sand/code/modules/arousal/arousal.dm @@ -32,7 +32,7 @@ if(prob(30 + clamp((70*(rand() + (h_self.sexual_potency + h_partner.sexual_potency)/200)), 0, 70)) && !W.impregnated && !Sp.equipment[GENITAL_EQUIPEMENT_CONDOM] && (Sp.linked_organ.fluid_id == /datum/reagent/consumable/semen)) W.impregnated = TRUE log_game("Debug: [h_self] has been impregnated by [h_partner]") - to_chat(src, "You feel your hormones change, and a motherly instinct take over.") + to_chat(src, span_userlove("You feel your hormones change, and a motherly instinct take over.")) var/obj/item/organ/genital/breasts/B = h_self.getorganslot(ORGAN_SLOT_BREASTS) if(B) B.fluid_rate *= 2 diff --git a/modular_sand/code/modules/arousal/genitals.dm b/modular_sand/code/modules/arousal/genitals.dm new file mode 100644 index 0000000000..78eb513a88 --- /dev/null +++ b/modular_sand/code/modules/arousal/genitals.dm @@ -0,0 +1,7 @@ +/obj/item/organ/genital + /// Controls whenever a genital is always accessible + var/always_accessible = FALSE + +/// Toggles whether such genital can always be accessed +/obj/item/organ/genital/proc/toggle_accessibility() + always_accessible = !always_accessible diff --git a/modular_sand/code/modules/client/loadout/backpack.dm b/modular_sand/code/modules/client/loadout/backpack.dm new file mode 100644 index 0000000000..c95cbab2c3 --- /dev/null +++ b/modular_sand/code/modules/client/loadout/backpack.dm @@ -0,0 +1,3 @@ +/datum/gear/backpack/pinpointer/plushie_saliith + name = "Saliith Plushie Pinpointer" + path = /obj/item/pinpointer/plushie_saliith diff --git a/modular_sand/code/modules/client/preferences.dm b/modular_sand/code/modules/client/preferences.dm index 611f3b41d6..3efa0eefee 100644 --- a/modular_sand/code/modules/client/preferences.dm +++ b/modular_sand/code/modules/client/preferences.dm @@ -50,9 +50,9 @@ language -= lang else if(check_language_maxhit()) if(CONFIG_GET(number/max_languages) == 1) - to_chat(usr, "You can only have 1 additional language!") + to_chat(usr, span_danger("You can only have 1 additional language!")) else - to_chat(usr, "You can only have up to [CONFIG_GET(number/max_languages)] additional languages!") + to_chat(usr, span_danger("You can only have up to [CONFIG_GET(number/max_languages)] additional languages!")) else language += lang diff --git a/modular_sand/code/modules/clothing/gloves/_gloves.dm b/modular_sand/code/modules/clothing/gloves/_gloves.dm index 65f7de4825..092e25511d 100644 --- a/modular_sand/code/modules/clothing/gloves/_gloves.dm +++ b/modular_sand/code/modules/clothing/gloves/_gloves.dm @@ -50,11 +50,11 @@ var/obj/item/clothing/accessory/ring/A = I if(length(attached_accessories) >= max_accessories) if(user) - to_chat(user, "[src] already has [length(attached_accessories)] accessories.") + to_chat(user, span_warning("[src] already has [length(attached_accessories)] accessories.")) return if(dummy_thick) if(user) - to_chat(user, "[src] is too bulky and cannot have accessories attached to it!") + to_chat(user, span_warning("[src] is too bulky and cannot have accessories attached to it!")) return else if(user && !user.temporarilyRemoveItemFromInventory(I)) @@ -63,7 +63,7 @@ return if(user && notifyAttach) - to_chat(user, "You attach [I] to [src].") + to_chat(user, span_notice("You attach [I] to [src].")) if((flags_inv & HIDEACCESSORY) || (A.flags_inv & HIDEACCESSORY)) return TRUE @@ -95,9 +95,9 @@ var/obj/item/clothing/accessory/ring/A = attached_accessories[length(attached_accessories)] A.detach(src, user) if(user.put_in_hands(A)) - to_chat(user, "You detach [A] from [src].") + to_chat(user, span_notice("You detach [A] from [src].")) else - to_chat(user, "You detach [A] from [src] and it falls on the floor.") + to_chat(user, span_notice("You detach [A] from [src] and it falls on the floor.")) if(ishuman(loc)) var/mob/living/carbon/human/H = loc diff --git a/modular_sand/code/modules/clothing/gloves/accessories.dm b/modular_sand/code/modules/clothing/gloves/accessories.dm index 8356e9fd9e..1c3986de1f 100644 --- a/modular_sand/code/modules/clothing/gloves/accessories.dm +++ b/modular_sand/code/modules/clothing/gloves/accessories.dm @@ -15,11 +15,11 @@ var/strip_silence = FALSE /obj/item/clothing/accessory/ring/suicide_act(mob/living/carbon/user) - user.visible_message("\[user] is putting the [src] in [user.p_their()] mouth! It looks like [user] is trying to choke on the [src]!") + user.visible_message(span_suicide("\[user] is putting the [src] in [user.p_their()] mouth! It looks like [user] is trying to choke on the [src]!")) return OXYLOSS /obj/item/clothing/accessory/ring/attack_self(mob/user) - user.visible_message("\The [user] gets down on one knee, presenting \the [src].","You get down on one knee, presenting \the [src].") + user.visible_message(span_warning("\The [user] gets down on one knee, presenting \the [src]."),span_warning("You get down on one knee, presenting \the [src].")) /obj/item/clothing/accessory/ring/proc/Touch(atom/A, proximity) return FALSE // return TRUE to cancel attack_hand() diff --git a/modular_sand/code/modules/clothing/spacesuits/chronosuit.dm b/modular_sand/code/modules/clothing/spacesuits/chronosuit.dm index aa4cdcc530..fd6ce75120 100644 --- a/modular_sand/code/modules/clothing/spacesuits/chronosuit.dm +++ b/modular_sand/code/modules/clothing/spacesuits/chronosuit.dm @@ -70,8 +70,8 @@ switch(severity) if(1) if(activated && user && ishuman(user) && (user.wear_suit == src)) - to_chat(user, "E:FATAL:RAM_READ_FAIL\nE:FATAL:STACK_EMPTY\nE:FATAL:READ_NULL_POINT\nE:FATAL:PWR_BUS_OVERLOAD") - to_chat(user, "An electromagnetic pulse disrupts your [name] and violently tears you out of time-bluespace!") + to_chat(user, span_danger("E:FATAL:RAM_READ_FAIL\nE:FATAL:STACK_EMPTY\nE:FATAL:READ_NULL_POINT\nE:FATAL:PWR_BUS_OVERLOAD")) + to_chat(user, span_userdanger("An electromagnetic pulse disrupts your [name] and violently tears you out of time-bluespace!")) user.emote("scream") deactivate(1, 1) diff --git a/modular_sand/code/modules/clothing/spacesuits/hardsuit.dm b/modular_sand/code/modules/clothing/spacesuits/hardsuit.dm index a4ce1ae289..a73639e808 100644 --- a/modular_sand/code/modules/clothing/spacesuits/hardsuit.dm +++ b/modular_sand/code/modules/clothing/spacesuits/hardsuit.dm @@ -101,7 +101,7 @@ var/mob/living/carbon/human/user = src.loc playsound(src.loc, 'modular_sand/sound/misc/suitmalf.ogg', 60, 1, 10) if (ishuman(user) && (user.wear_suit == src)) - to_chat(user, "The motors on your armor cease to function, causing the full weight of the suit to weigh on you all at once!") + to_chat(user, span_danger("The motors on your armor cease to function, causing the full weight of the suit to weigh on you all at once!")) user.emote("scream") user.adjustStaminaLoss(stamdamageemp) user.adjustBruteLoss(brutedamageemp) @@ -122,3 +122,133 @@ explosion(src.loc,0,0,3,flame_range = 3) qdel(src) return + +/obj/item/clothing/suit/space/hardsuit/mining + unique_reskin = list( + "Default" = list( + "name" = "mining hardsuit", + "desc" = "A special suit that protects against hazardous, low pressure environments. Has reinforced plating for wildlife encounters.", + "icon" = 'icons/obj/clothing/suits.dmi', + "icon_state" = "hardsuit-mining", + "mob_overlay_icon" = null, + "anthro_mob_worn_overlay" = null + ), + "Conscript" = list( + "name" = "Conscript suit", + "desc" = "..and so he left, with new orders and new questions.", + "icon" = 'modular_sand/icons/obj/clothing/suits.dmi', + "icon_state" = "commando-armor", + "mob_overlay_icon" = 'modular_sand/icons/mob/clothing/suit.dmi', + "anthro_mob_worn_overlay" = 'modular_sand/icons/mob/clothing/suit_digi.dmi' + ) + ) + +/obj/item/clothing/suit/space/hardsuit/mining/Move(atom/newloc, direct, glide_size_override) + . = ..() + setDir(SOUTH) + +/obj/item/clothing/suit/space/hardsuit/mining/equipped(mob/user, slot) + . = ..() + switch(current_skin) + if("Conscript") + var/datum/component/armor_plate/armor_comp = GetComponent(/datum/component/armor_plate) + var/armor_level = 0 + var/armor_max = 0 + if(armor_comp) + armor_level = armor_comp.amount + armor_max = armor_comp.maxamount + + upgrade_icon(amount = armor_level, maxamount = armor_max) + + else + return + +/obj/item/clothing/suit/space/hardsuit/mining/reskin_obj(mob/M) + . = ..() + var/datum/component/armor_plate/armor_comp = GetComponent(/datum/component/armor_plate) + var/armor_level = 0 + var/armor_max = 0 + if(armor_comp) + armor_level = armor_comp.amount + armor_max = armor_comp.maxamount + + var/obj/item/clothing/head/helmet/space/hardsuit/mining/mining_helmet + if(istype(helmet)) + mining_helmet = helmet + + /// h suffix for helmet + var/datum/component/armor_plate/armor_comp_h = mining_helmet.GetComponent(/datum/component/armor_plate) + var/armor_level_h = 0 + var/armor_max_h = 0 + if(armor_comp_h) + armor_level_h = armor_comp_h.amount + armor_max_h = armor_comp_h.maxamount + + switch(current_skin) + if("Default") + upgrade_icon(amount = armor_level, maxamount = armor_max) + + if(mining_helmet) + mining_helmet.name = initial(mining_helmet.name) + mining_helmet.desc = initial(mining_helmet.desc) + mining_helmet.icon = initial(mining_helmet.icon) + mining_helmet.icon_state = initial(mining_helmet.icon_state) + mining_helmet.upgrade_icon(amount = armor_level_h, maxamount = armor_max_h) + mining_helmet.mob_overlay_icon = initial(mining_helmet.mob_overlay_icon) + mining_helmet.anthro_mob_worn_overlay = initial(mining_helmet.anthro_mob_worn_overlay) + + /// Sprited by Dexxiol#3462 :) + if("Conscript") + upgrade_icon(amount = armor_level, maxamount = armor_max) + + if(mining_helmet) + mining_helmet.name = "Conscript helmet" + mining_helmet.desc = "It shines briefly, full of life." + mining_helmet.icon = 'modular_sand/icons/obj/clothing/hats.dmi' + mining_helmet.icon_state = "commando-helmet" + mining_helmet.upgrade_icon(amount = armor_level_h, maxamount = armor_max_h) + mining_helmet.mob_overlay_icon = 'modular_sand/icons/mob/clothing/head.dmi' + mining_helmet.anthro_mob_worn_overlay = 'modular_sand/icons/mob/clothing/head_muzzled.dmi' + +/obj/item/clothing/head/helmet/space/hardsuit/mining/update_icon_state() + switch(suit.current_skin) + if("Conscript") + return + else + . = ..() + +/obj/item/clothing/head/helmet/space/hardsuit/mining/upgrade_icon(datum/source, amount, maxamount) + switch(suit.current_skin) + if("Conscript") + hardsuit_type = "-helmet" + if(amount) + name = "reinforced Conscript helmet" + desc = "It glows weakly, signs of uncertainty." + hardsuit_type = "2-helmet" + if(amount == maxamount) + desc = "It glows violently, martyr to chaos." + hardsuit_type = "3-helmet" + icon_state = "commando[hardsuit_type]" + if(ishuman(loc)) + var/mob/living/carbon/human/wearer = loc + if(istype(wearer) && (wearer.head == src)) + wearer.update_inv_head() + else + . = ..() + +/obj/item/clothing/suit/space/hardsuit/mining/upgrade_icon(datum/source, amount, maxamount) + switch(current_skin) + if("Conscript") + hardsuit_type = "-armor" + if(amount) + name = "reinforced Conscript suit" + hardsuit_type = "2-armor" + if(amount == maxamount) + hardsuit_type = "3-armor" + icon_state = "commando[hardsuit_type][current_equipped_slot != ITEM_SLOT_OCLOTHING ? "-inhand" : ""]" + if(ishuman(loc)) + var/mob/living/carbon/human/wearer = loc + if(istype(wearer) && (wearer.wear_suit == src)) + wearer.update_inv_wear_suit() + else + . = ..() diff --git a/modular_sand/code/modules/clothing/under/_under.dm b/modular_sand/code/modules/clothing/under/_under.dm new file mode 100644 index 0000000000..7542a0c85a --- /dev/null +++ b/modular_sand/code/modules/clothing/under/_under.dm @@ -0,0 +1,4 @@ +/obj/item/clothing/under/Initialize(mapload) + . = ..() + if(!is_type_in_typecache(type, GLOB.skirt_peekable) && findlasttext("[type]", "skirt")) + LAZYSET(GLOB.skirt_peekable, type, TRUE) diff --git a/modular_sand/code/modules/clothing/under/color.dm b/modular_sand/code/modules/clothing/under/color.dm deleted file mode 100644 index 786fc955b3..0000000000 --- a/modular_sand/code/modules/clothing/under/color.dm +++ /dev/null @@ -1,2 +0,0 @@ -/obj/item/clothing/under/color/jumpskirt - is_skirt = TRUE diff --git a/modular_sand/code/modules/clothing/under/jobs/cargo.dm b/modular_sand/code/modules/clothing/under/jobs/cargo.dm deleted file mode 100644 index e0ad328399..0000000000 --- a/modular_sand/code/modules/clothing/under/jobs/cargo.dm +++ /dev/null @@ -1,5 +0,0 @@ -/obj/item/clothing/under/rank/cargo/qm/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/cargo/tech/skirt - is_skirt = TRUE diff --git a/modular_sand/code/modules/clothing/under/jobs/civilian.dm b/modular_sand/code/modules/clothing/under/jobs/civilian.dm deleted file mode 100644 index 12917d8a2f..0000000000 --- a/modular_sand/code/modules/clothing/under/jobs/civilian.dm +++ /dev/null @@ -1,47 +0,0 @@ -/obj/item/clothing/under/rank/civilian/bartender/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/civilian/chaplain/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/civilian/chef/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/civilian/head_of_personnel/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/civilian/head_of_personnel/suit/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/civilian/hydroponics/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/civilian/janitor/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/civilian/janitor/maid //i believe this one is a dress, not gonna check - is_skirt = TRUE - -/obj/item/clothing/under/rank/civilian/lawyer/black/alt/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/civilian/lawyer/really_black/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/civilian/lawyer/black/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/civilian/lawyer/female/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/civilian/lawyer/red/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/civilian/lawyer/blue/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/civilian/lawyer/bluesuit/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/civilian/lawyer/purpsuit/skirt - is_skirt = TRUE diff --git a/modular_sand/code/modules/clothing/under/jobs/command.dm b/modular_sand/code/modules/clothing/under/jobs/command.dm deleted file mode 100644 index cff9bd3339..0000000000 --- a/modular_sand/code/modules/clothing/under/jobs/command.dm +++ /dev/null @@ -1,5 +0,0 @@ -/obj/item/clothing/under/rank/captain/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/captain/suit/skirt - is_skirt = TRUE diff --git a/modular_sand/code/modules/clothing/under/jobs/curator.dm b/modular_sand/code/modules/clothing/under/jobs/curator.dm deleted file mode 100644 index 85966ab452..0000000000 --- a/modular_sand/code/modules/clothing/under/jobs/curator.dm +++ /dev/null @@ -1,2 +0,0 @@ -/obj/item/clothing/under/rank/civilian/curator/skirt - is_skirt = TRUE diff --git a/modular_sand/code/modules/clothing/under/jobs/engineering.dm b/modular_sand/code/modules/clothing/under/jobs/engineering.dm deleted file mode 100644 index 56e4263ae7..0000000000 --- a/modular_sand/code/modules/clothing/under/jobs/engineering.dm +++ /dev/null @@ -1,8 +0,0 @@ -/obj/item/clothing/under/rank/engineering/chief_engineer/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/engineering/atmospheric_technician/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/engineering/engineer/skirt - is_skirt = TRUE diff --git a/modular_sand/code/modules/clothing/under/jobs/medical.dm b/modular_sand/code/modules/clothing/under/jobs/medical.dm deleted file mode 100644 index 03c124449c..0000000000 --- a/modular_sand/code/modules/clothing/under/jobs/medical.dm +++ /dev/null @@ -1,17 +0,0 @@ -/obj/item/clothing/under/rank/medical/chief_medical_officer/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/medical/geneticist/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/medical/virologist/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/medical/chemist/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/medical/paramedic/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/medical/doctor/skirt - is_skirt = TRUE diff --git a/modular_sand/code/modules/clothing/under/jobs/research.dm b/modular_sand/code/modules/clothing/under/jobs/research.dm deleted file mode 100644 index 1243dfb9ee..0000000000 --- a/modular_sand/code/modules/clothing/under/jobs/research.dm +++ /dev/null @@ -1,14 +0,0 @@ -/obj/item/clothing/under/rank/rnd/research_director/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/rnd/research_director/alt/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/rnd/research_director/turtleneck/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/rnd/scientist/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/rnd/roboticist/skirt - is_skirt = TRUE diff --git a/modular_sand/code/modules/clothing/under/jobs/security.dm b/modular_sand/code/modules/clothing/under/jobs/security.dm deleted file mode 100644 index ee8331c5b6..0000000000 --- a/modular_sand/code/modules/clothing/under/jobs/security.dm +++ /dev/null @@ -1,29 +0,0 @@ -/obj/item/clothing/under/rank/security/officer/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/security/warden/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/security/detective/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/security/detective/grey/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/security/head_of_security/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/security/head_of_security/alt/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/brigdoc/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/blueshield/formal/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/blueshield/skirt - is_skirt = TRUE - -/obj/item/clothing/under/rank/bridgeofficer/skirt - is_skirt = TRUE diff --git a/modular_sand/code/modules/clothing/under/jobs/theater.dm b/modular_sand/code/modules/clothing/under/jobs/theater.dm deleted file mode 100644 index 1de3d44407..0000000000 --- a/modular_sand/code/modules/clothing/under/jobs/theater.dm +++ /dev/null @@ -1,2 +0,0 @@ -/obj/item/clothing/under/rank/civilian/mime/skirt - is_skirt = TRUE diff --git a/modular_sand/code/modules/clothing/under/misc.dm b/modular_sand/code/modules/clothing/under/misc.dm deleted file mode 100644 index 87cb52eefc..0000000000 --- a/modular_sand/code/modules/clothing/under/misc.dm +++ /dev/null @@ -1,8 +0,0 @@ -/obj/item/clothing/under/rank/prisoner/skirt - is_skirt = TRUE - -/obj/item/clothing/under/misc/durathread/skirt - is_skirt = TRUE - -/obj/item/clothing/under/misc/cog/jumpskirt - is_skirt = TRUE diff --git a/modular_sand/code/modules/clothing/under/skirt_dress.dm b/modular_sand/code/modules/clothing/under/skirt_dress.dm deleted file mode 100644 index 79bf474a80..0000000000 --- a/modular_sand/code/modules/clothing/under/skirt_dress.dm +++ /dev/null @@ -1,2 +0,0 @@ -/obj/item/clothing/under/dress/skirt //inb4 this breaks something - is_skirt = TRUE diff --git a/modular_sand/code/modules/clothing/under/suits.dm b/modular_sand/code/modules/clothing/under/suits.dm deleted file mode 100644 index 04a37b0471..0000000000 --- a/modular_sand/code/modules/clothing/under/suits.dm +++ /dev/null @@ -1,5 +0,0 @@ -/obj/item/clothing/under/suit/white_on_white/skirt - is_skirt = TRUE - -/obj/item/clothing/under/suit/black/skirt - is_skirt = TRUE diff --git a/modular_sand/code/modules/clothing/under/syndicate.dm b/modular_sand/code/modules/clothing/under/syndicate.dm deleted file mode 100644 index 04f160c705..0000000000 --- a/modular_sand/code/modules/clothing/under/syndicate.dm +++ /dev/null @@ -1,8 +0,0 @@ -/obj/item/clothing/under/syndicate/skirt - is_skirt = TRUE - -/obj/item/clothing/under/syndicate/tacticool/skirt - is_skirt = TRUE - -/obj/item/clothing/under/syndicate/cosmetic/skirt - is_skirt = TRUE diff --git a/modular_sand/code/modules/hydroponics/hydroponics.dm b/modular_sand/code/modules/hydroponics/hydroponics.dm index fbe22b96ea..e383980184 100644 --- a/modular_sand/code/modules/hydroponics/hydroponics.dm +++ b/modular_sand/code/modules/hydroponics/hydroponics.dm @@ -1,7 +1,7 @@ /obj/machinery/hydroponics/proc/harvest_dead(mob/user) dead = FALSE if(user) - to_chat(user, "You remove the dead plant from [src].") + to_chat(user, span_notice("You remove the dead plant from [src].")) qdel(myseed) myseed = null update_icon() diff --git a/modular_sand/code/modules/integrated_electronics/subtypes/output.dm b/modular_sand/code/modules/integrated_electronics/subtypes/output.dm index 45e991aad7..1c16cb3445 100644 --- a/modular_sand/code/modules/integrated_electronics/subtypes/output.dm +++ b/modular_sand/code/modules/integrated_electronics/subtypes/output.dm @@ -51,7 +51,7 @@ user.transferItemToLoc(O,src) encryption_keys += O recalculate_channels() - to_chat(user, "You slide \the [O] inside the circuit.") + to_chat(user, span_notice("You slide \the [O] inside the circuit.")) else ..() @@ -75,10 +75,10 @@ O.forceMove(drop_location()) encryption_keys.Cut() set_pin_data(IC_OUTPUT, 1, WEAKREF(null)) - to_chat(user, "You slide the encryption keys out of the circuit.") + to_chat(user, span_notice("You slide the encryption keys out of the circuit.")) recalculate_channels() else - to_chat(user, "There are no encryption keys to remove from the mechanism.") + to_chat(user, span_notice("There are no encryption keys to remove from the mechanism.")) /obj/item/radio/headset/integrated diff --git a/modular_sand/code/modules/mining/equipment/kinetic_crusher.dm b/modular_sand/code/modules/mining/equipment/kinetic_crusher.dm index a4e6e39a66..7cedccf6ff 100644 --- a/modular_sand/code/modules/mining/equipment/kinetic_crusher.dm +++ b/modular_sand/code/modules/mining/equipment/kinetic_crusher.dm @@ -30,7 +30,7 @@ L.loot = null L.crusher_loot = null L.faction = user.faction.Copy() - user.visible_message("[user] revives [target] with [src], as a friendly fauna") + user.visible_message(span_notice("[user] revives [target] with [src], as a friendly fauna")) playsound(src,'sound/effects/supermatter.ogg',50,1) /obj/item/crusher_trophy/golden_skull/on_melee_hit(mob/living/target, mob/living/user) @@ -53,10 +53,10 @@ L.attack_same = 0 L.loot = null L.crusher_loot = null - user.visible_message("[user] revives [target] with [src], as a friendly legion.") + user.visible_message(span_notice("[user] revives [target] with [src], as a friendly legion.")) playsound(src,'sound/effects/supermatter.ogg',50,1) else - (to_chat(user, "You cancel turning [target] into a legion.")) + (to_chat(user, span_notice("You cancel turning [target] into a legion."))) //rogue process /obj/item/crusher_trophy/brokentech @@ -344,22 +344,22 @@ /obj/item/melee/zweihander/examine(mob/living/user) . = ..() - . += "Mark a large creature with the destabilizing force, then hit them in melee to do [force + detonation_damage] damage." - . += "Does [force + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force + detonation_damage]." + . += span_notice("Mark a large creature with the destabilizing force, then hit them in melee to do [force + detonation_damage] damage.") + . += span_notice("Does [force + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force + detonation_damage].") for(var/t in trophies) var/obj/item/crusher_trophy/T = t - . += "It has \a [T] attached, which causes [T.effect_desc()]." + . += span_notice("It has \a [T] attached, which causes [T.effect_desc()].") /obj/item/melee/zweihander/attackby(obj/item/I, mob/living/user) if(istype(I, /obj/item/crowbar)) if(LAZYLEN(trophies)) - to_chat(user, "You remove [src]'s trophies.") + to_chat(user, span_notice("You remove [src]'s trophies.")) I.play_tool_sound(src) for(var/t in trophies) var/obj/item/crusher_trophy/T = t T.remove_from(src, user) else - to_chat(user, "There are no trophies on [src].") + to_chat(user, span_warning("There are no trophies on [src].")) else if(istype(I, /obj/item/crusher_trophy)) var/obj/item/crusher_trophy/T = I T.add_to(src, user) diff --git a/modular_sand/code/modules/mining/equipment/regenerative_core.dm b/modular_sand/code/modules/mining/equipment/regenerative_core.dm index 4d508dd6c1..b9fc7acfd3 100644 --- a/modular_sand/code/modules/mining/equipment/regenerative_core.dm +++ b/modular_sand/code/modules/mining/equipment/regenerative_core.dm @@ -12,16 +12,16 @@ return var/mob/living/carbon/human/H = target if(inert) - to_chat(user, "[src] has decayed and can no longer be used to heal.") + to_chat(user, span_notice("[src] has decayed and can no longer be used to heal.")) return if(H.stat == DEAD) - to_chat(user, "[src] are useless on the dead.") + to_chat(user, span_notice("[src] are useless on the dead.")) return if(H != user) H.visible_message("[user] forces [H] to apply [src]... Black tendrils entangle and reinforce [H.p_them()]!") SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "other")) else - to_chat(user, "You start to smear [src] on yourself. Disgusting tendrils hold you together and allow you to keep moving, but for how long?") + to_chat(user, span_notice("You start to smear [src] on yourself. Disgusting tendrils hold you together and allow you to keep moving, but for how long?")) SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) if(is_station_level(H.z)) H.adjustBruteLoss(-25, 0) diff --git a/modular_sand/code/modules/mining/lavaland/necropolis_chests.dm b/modular_sand/code/modules/mining/lavaland/necropolis_chests.dm index aaca5e7faa..09d5b00d97 100644 --- a/modular_sand/code/modules/mining/lavaland/necropolis_chests.dm +++ b/modular_sand/code/modules/mining/lavaland/necropolis_chests.dm @@ -156,7 +156,7 @@ /obj/item/projectile/heckhook/on_hit(atom/target) . = ..() var/atom/A = target - A.visible_message("[A] is snagged by [firer]'s hook!") + A.visible_message(span_danger("[A] is snagged by [firer]'s hook!")) new /datum/forced_movement(firer, get_turf(A), 1, TRUE) /obj/item/projectile/heckhook/Destroy() @@ -184,7 +184,7 @@ to_chat(user, "You will now fire normal shotgun rounds.") /obj/item/gun/ballistic/revolver/doublebarrel/super/sawoff(mob/user) - to_chat(user, "Why would you mutilate this work of art?") + to_chat(user, span_warning("Why would you mutilate this work of art?")) return /obj/item/gun/ballistic/revolver/doublebarrel/super/upgraded @@ -235,7 +235,7 @@ /obj/item/crucible/suicide_act(mob/living/carbon/user) if(wielded) - user.visible_message("[user] DOOMs themselves with the [src]!") + user.visible_message(span_suicide("[user] DOOMs themselves with the [src]!")) var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD)//stole from chainsaw code var/obj/item/organ/brain/B = user.getorganslot(ORGAN_SLOT_BRAIN) @@ -250,12 +250,12 @@ myhead.drop_limb() sleep(3) else - user.visible_message("[user] panics and starts choking to death!") + user.visible_message(span_suicide("[user] panics and starts choking to death!")) return OXYLOSS else - user.visible_message("[user] begins beating [user.p_them()]self to death with \the [src]'s handle! It probably would've been cooler if [user.p_they()] turned it on first!") + user.visible_message(span_suicide("[user] begins beating [user.p_them()]self to death with \the [src]'s handle! It probably would've been cooler if [user.p_they()] turned it on first!")) return BRUTELOSS /obj/item/crucible/update_icon_state() @@ -336,7 +336,7 @@ var/mob/living/carbon/C = user if(C.wear_mask) in_mouth = ", barely missing [user.p_their()] nose" - . = "[user] swings [user.p_their()] [name][in_mouth]. [user.p_they(TRUE)] light[user.p_s()] [user.p_their()] [A.name] in the process." + . = span_warning("[user] swings [user.p_their()] [name][in_mouth]. [user.p_they(TRUE)] light[user.p_s()] [user.p_their()] [A.name] in the process.") playsound(loc, hitsound, get_clamped_volume(), 1, -1) add_fingerprint(user) @@ -437,12 +437,12 @@ sharpness = SHARP_NONE if(ghost_counter >= 4) sharpness = SHARP_POINTY - user.visible_message("[user] strikes with the force of [ghost_counter] vengeful spirits!") + user.visible_message(span_danger("[user] strikes with the force of [ghost_counter] vengeful spirits!")) /obj/item/melee/ghost_sword/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) var/ghost_counter = ghost_check() final_block_chance = clamp((ghost_counter * 5), 10, 50) - owner.visible_message("[owner] is protected by a ring of [ghost_counter] ghosts!") + owner.visible_message(span_danger("[owner] is protected by a ring of [ghost_counter] ghosts!")) return ..() /obj/item/clothing/neck/necklace/memento_mori/king @@ -503,7 +503,7 @@ var/choosey = choices[choice] var/obj/machinery/anomalous_crystal/A = new choosey(user.loc) A.activation_method = method - to_chat(user, "[A] appears under your feet as the [src] breaks apart!") + to_chat(user, span_userdanger("[A] appears under your feet as the [src] breaks apart!")) qdel(src) //normal chests @@ -744,7 +744,7 @@ /obj/item/stock_parts/cell/high/plus/argent/attack_self(mob/user) ..() - user.visible_message("[user] crushes the [src] in his hands, absorbing it's energy!") + user.visible_message(span_danger("[user] crushes the [src] in his hands, absorbing it's energy!")) playsound(user.loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, TRUE) var/mob/living/M = user M.apply_status_effect(onuse) @@ -822,13 +822,13 @@ /obj/item/clothing/mask/gas/dagoth/ui_action_click(mob/user, action) if(istype(action, /datum/action/item_action/ashstorm)) if(storm_cooldown > world.time) - to_chat(user, "The [src] is still recharging!") + to_chat(user, span_warning("The [src] is still recharging!")) return var/area/user_area = get_base_area(user) var/turf/user_turf = get_turf(user) if(!user_area || !user_turf || (user_area.type in excluded_areas)) - to_chat(user, "Something is preventing you from using the [src] here.") + to_chat(user, span_warning("Something is preventing you from using the [src] here.")) return var/datum/weather/A for(var/V in SSweather.processing) @@ -840,10 +840,10 @@ if(A) if(A.stage != END_STAGE) if(A.stage == WIND_DOWN_STAGE) - to_chat(user, "The storm is already ending! It would be a waste to use the [src] now.") + to_chat(user, span_warning("The storm is already ending! It would be a waste to use the [src] now.")) return - user.visible_message("[user] gazes into the sky with [src], seemingly repelling the current storm!", \ - "You gaze intently skyward, dispelling the storm!") + user.visible_message(span_warning("[user] gazes into the sky with [src], seemingly repelling the current storm!"), \ + span_notice("You gaze intently skyward, dispelling the storm!")) playsound(user, 'sound/magic/staff_change.ogg', 200, 0) A.wind_down() log_game("[user] ([key_name(user)]) has dispelled a storm at [AREACOORD(user_turf)]") @@ -858,8 +858,8 @@ A.telegraph_duration = 100 A.end_duration = 100 - user.visible_message("[user] gazes skyward with his [src], terrible red lightning strikes seem to accompany them!", \ - "You gaze skyward with [src], calling down a terrible storm!") + user.visible_message(span_warning("[user] gazes skyward with his [src], terrible red lightning strikes seem to accompany them!"), \ + span_notice("You gaze skyward with [src], calling down a terrible storm!")) playsound(user, 'sound/magic/staff_change.ogg', 200, 0) A.telegraph() storm_cooldown = world.time + 200 @@ -973,9 +973,9 @@ //Apply a temp buff until the necklace is used /obj/item/clothing/neck/necklace/necklace_of_the_forsaken/proc/temp_buff(mob/living/carbon/human/user) - to_chat(user, "You feel as if you have a second chance at something, but you're not sure what.") + to_chat(user, span_warning("You feel as if you have a second chance at something, but you're not sure what.")) if(do_after(user, 40, target = user)) - to_chat(user, "The ember warms you...") + to_chat(user, span_notice("The ember warms you...")) ADD_TRAIT(user, TRAIT_NOHARDCRIT, "necklace_of_the_forsaken")//less chance of being gibbed active_owner = user @@ -986,7 +986,7 @@ return var/mob/living/carbon/C = active_owner active_owner = null - to_chat(C, "You feel a scorching burn fill your body and limbs!") + to_chat(C, span_userdanger("You feel a scorching burn fill your body and limbs!")) C.revive(TRUE, FALSE) remove_necklace() //remove buffs @@ -1013,7 +1013,7 @@ if(iscarbon(owner)) MM.temp_buff(owner) src.desc = "Revive or fully heal yourself, but you can only do this once! Can be used when knocked out or dead." - to_chat(MM.active_owner, "You have binded the ember to yourself! The next time you use the necklace it will heal you!") + to_chat(MM.active_owner, span_userdanger("You have binded the ember to yourself! The next time you use the necklace it will heal you!")) else if(MM.numUses >= 1 && MM.active_owner)//revive / heal then remove usage MM.second_chance() MM.numUses = 0 diff --git a/modular_sand/code/modules/mining/machine_bluespaceminer.dm b/modular_sand/code/modules/mining/machine_bluespaceminer.dm index 0d62ee9267..9241f8745e 100644 --- a/modular_sand/code/modules/mining/machine_bluespaceminer.dm +++ b/modular_sand/code/modules/mining/machine_bluespaceminer.dm @@ -7,6 +7,7 @@ can_be_unanchored = TRUE circuit = /obj/item/circuitboard/machine/bluespace_miner layer = BELOW_OBJ_LAYER + init_process = TRUE var/list/ore_rates = list(/datum/material/iron = 0.3, /datum/material/glass = 0.3, /datum/material/plasma = 0.1, /datum/material/silver = 0.1, /datum/material/gold = 0.05, /datum/material/titanium = 0.05, /datum/material/uranium = 0.05, /datum/material/diamond = 0.02) var/datum/component/remote_materials/materials var/multiplier = 0 //Multiplier by tier, has been made fair and everything @@ -18,15 +19,15 @@ /obj/machinery/mineral/bluespace_miner/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "A small screen on the machine reads, \"Efficiency at [multiplier * 100]%\"" + . += span_notice("A small screen on the machine reads, \"Efficiency at [multiplier * 100]%\"") if(multiplier >= 5) - . += "Bluespace generation is active." + . += span_notice("Bluespace generation is active.") if(!anchored) - . += "The machine won't work while not firmly secured to the ground." + . += span_warning("The machine won't work while not firmly secured to the ground.") if(!materials?.silo) - . += "No ore silo connected. Use a multi-tool to link an ore silo to this machine." + . += span_notice("No ore silo connected. Use a multi-tool to link an ore silo to this machine.") else if(materials?.on_hold()) - . += "Ore silo access is on hold, please contact the quartermaster." + . += span_warning("Ore silo access is on hold, please contact the quartermaster.") /obj/machinery/mineral/bluespace_miner/RefreshParts() multiplier = 0 @@ -49,7 +50,7 @@ /obj/machinery/mineral/bluespace_miner/multitool_act(mob/living/user, obj/item/M) . = ..() if(!M.buffer || !istype(M.buffer, /obj/machinery/ore_silo)) - to_chat(user, "You need to multitool the ore silo first.") + to_chat(user, span_warning("You need to multitool the ore silo first.")) balloon_alert(user, "invalid buffer!") return TRUE diff --git a/modular_sand/code/modules/mob/living/carbon/human/examine.dm b/modular_sand/code/modules/mob/living/carbon/human/examine.dm deleted file mode 100644 index 421de3dd8f..0000000000 --- a/modular_sand/code/modules/mob/living/carbon/human/examine.dm +++ /dev/null @@ -1,70 +0,0 @@ -#define PAIRLESS_PANTIES list(\ - /obj/item/clothing/underwear/briefs/jockstrap,\ - /obj/item/clothing/underwear/briefs/panties/thong,\ - /obj/item/clothing/underwear/briefs/panties/thong/babydoll,\ - /obj/item/clothing/underwear/briefs/mankini\ -) - -/mob/living/carbon/human/examine(mob/user) - . = ..() - if(!isliving(user)) - return - - var/mob/living/living = user - var/obj/item/clothing/under/worn_uniform = w_uniform - if((user != src) && !(living.mobility_flags & MOBILITY_STAND) && (mobility_flags & MOBILITY_STAND) && (src.loc == living.loc) && (istype(worn_uniform))) //SPLURT edit - var/string = "Peeking under [src]'s [w_uniform], you can see " - var/obj/item/clothing/underwear/worn_underwear = src.w_underwear - if(worn_underwear) - string += "a " - if(!(worn_underwear.type in PAIRLESS_PANTIES)) //a pair of thong - string += "pair of " - if(worn_underwear.color) - string += "[worn_underwear.name]." - else - string += "[worn_underwear.name]." - - var/obj/item/organ/genital/penis/penis = getorganslot(ORGAN_SLOT_PENIS) - var/obj/item/organ/genital/vagina/vagina = getorganslot(ORGAN_SLOT_VAGINA) - if(penis?.aroused_state) - string += span_love(" There's a visible bulge on it's front.") - else if(vagina?.aroused_state) - string += span_love(" They're wet with arousal.") - - else - string += "[p_theyre()] not wearing anything! - [p_their()] " - var/list/genitals = list() - for(var/obj/item/organ/genital/genital in internal_organs) - if(genital.genital_flags & (GENITAL_INTERNAL|GENITAL_HIDDEN)) - continue - - var/appended - switch(genital.type) - if(/obj/item/organ/genital/vagina) - if(genital.aroused_state) - appended += "wet " - if(lowertext(genital.shape) != "human") - appended += lowertext(genital.shape) - if(lowertext(genital.shape) != "cloaca") //their wet cloaca pussy - appended += " pussy" - - if(/obj/item/organ/genital/testicles) - appended += "nuts" - if(/obj/item/organ/genital/penis) - if(genital.aroused_state) - appended += "fully erect" - if(lowertext(genital.shape) != "human") - appended += ", [lowertext(genital.shape)]" - if(appended) - appended += " " //double spaces - appended += "penis" - else - continue - genitals += appended - - string += english_list(genitals, "featureless groin") - string += " on full display." - - . += span_purple(string) - -#undef PAIRLESS_PANTIES diff --git a/modular_sand/code/modules/mob/living/carbon/human/human.dm b/modular_sand/code/modules/mob/living/carbon/human/human.dm index 4c4b8e7fc3..5abc5a899b 100644 --- a/modular_sand/code/modules/mob/living/carbon/human/human.dm +++ b/modular_sand/code/modules/mob/living/carbon/human/human.dm @@ -1,3 +1,4 @@ /mob/living/carbon/human/ComponentInitialize() . = ..() AddElement(/datum/element/mob_holder/micro, "micro") + AddElement(/datum/element/skirt_peeking) diff --git a/modular_sand/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm b/modular_sand/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm new file mode 100644 index 0000000000..66ba0e63e2 --- /dev/null +++ b/modular_sand/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm @@ -0,0 +1,8 @@ +/datum/species/mammal/synthetic/New() + . = ..() + + // Define inherent traits to add + var/modular_inherent_traits = list(TRAIT_NOTHIRST) + + // Add new traits to list + LAZYADD(inherent_traits, modular_inherent_traits) diff --git a/modular_sand/code/modules/mob/living/carbon/human/species_types/ipc.dm b/modular_sand/code/modules/mob/living/carbon/human/species_types/ipc.dm new file mode 100644 index 0000000000..aa1ad76fbf --- /dev/null +++ b/modular_sand/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -0,0 +1,8 @@ +/datum/species/ipc/New() + . = ..() + + // Define inherent traits to add + var/modular_inherent_traits = list(TRAIT_NOTHIRST) + + // Add new traits to list + LAZYADD(inherent_traits, modular_inherent_traits) diff --git a/modular_sand/code/modules/mob/living/carbon/human/species_types/synthliz.dm b/modular_sand/code/modules/mob/living/carbon/human/species_types/synthliz.dm new file mode 100644 index 0000000000..6ae0536688 --- /dev/null +++ b/modular_sand/code/modules/mob/living/carbon/human/species_types/synthliz.dm @@ -0,0 +1,8 @@ +/datum/species/synthliz/New() + . = ..() + + // Define inherent traits to add + var/modular_inherent_traits = list(TRAIT_NOTHIRST) + + // Add new traits to list + LAZYADD(inherent_traits, modular_inherent_traits) diff --git a/modular_sand/code/modules/mob/living/carbon/show.dm b/modular_sand/code/modules/mob/living/carbon/show.dm index edd752ed8a..7e96c07c77 100644 --- a/modular_sand/code/modules/mob/living/carbon/show.dm +++ b/modular_sand/code/modules/mob/living/carbon/show.dm @@ -15,6 +15,6 @@ if(!I && arm) usr.show_message("[usr] holds up [arm].", 1) else if(!arm && !I) - to_chat(usr, "You frown because now there's nothing you can show.") + to_chat(usr, span_notice("You frown because now there's nothing you can show.")) else if(!HAS_TRAIT(I, ABSTRACT_ITEM_TRAIT)) I.showoff(src) diff --git a/modular_sand/code/modules/mob/living/silicon/silicon.dm b/modular_sand/code/modules/mob/living/silicon/silicon.dm index 6109a0c8fc..af295e91c1 100644 --- a/modular_sand/code/modules/mob/living/silicon/silicon.dm +++ b/modular_sand/code/modules/mob/living/silicon/silicon.dm @@ -10,6 +10,6 @@ set desc = "Allows you to eat someone." if(!CHECK_BITFIELD(T.vore_flags, DEVOURABLE)) - to_chat(src, "System error: Unauthorized operation.") + to_chat(src, span_warning("System error: Unauthorized operation.")) return return feed_grabbed_to_self(src,T) diff --git a/modular_sand/code/modules/mob/living/simple_animal/bot/hugbot.dm b/modular_sand/code/modules/mob/living/simple_animal/bot/hugbot.dm index 0822ec540e..5250ceaffc 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/bot/hugbot.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/bot/hugbot.dm @@ -145,7 +145,7 @@ /mob/living/simple_animal/bot/hugbot/attack_hand(mob/living/carbon/human/H) if(H.a_intent == INTENT_DISARM && mode != BOT_TIPPED) - H.visible_message("[H] begins tipping over [src].", "You begin tipping over [src]...") + H.visible_message(span_danger("[H] begins tipping over [src]."), span_warning("You begin tipping over [src]...")) balloon_alert(H, "tipping over") if(world.time > last_tipping_action_voice + 15 SECONDS) @@ -159,7 +159,7 @@ tip_over(H) else if(H.a_intent == INTENT_HELP && mode == BOT_TIPPED) - H.visible_message("[H] begins righting [src].", "You begin righting [src]...") + H.visible_message(span_notice("[H] begins righting [src]."), span_notice("You begin righting [src]...")) balloon_alert(H, "righting") if(do_after(H, 3 SECONDS, target=src)) set_right(H) @@ -170,8 +170,8 @@ ..() if(emagged == 2) if(user) - to_chat(user, "You short out [src]'s manipulator pressure sensors.") - visible_message("[src]'s arm twitches violently!") + to_chat(user, span_notice("You short out [src]'s manipulator pressure sensors.")) + visible_message(span_danger("[src]'s arm twitches violently!")) flick("medibot_spark", src) playsound(src, "sparks", 75, 1) @@ -347,9 +347,9 @@ // Hey, didyah know that you Han't hug people as non-carbon? Well you can't hug people as non-carbon. Hence this mess if(zone_selected == BODY_ZONE_PRECISE_MOUTH) visible_message( \ - "[src] boops [H]'s nose.", \ - "You boop [H] on the nose.", target = H, - target_message = "[src] boops your nose.") + span_notice("[src] boops [H]'s nose."), \ + span_notice("You boop [H] on the nose."), target = H, + target_message = span_notice("[src] boops your nose.")) playsound(H, 'sound/items/Nose_boop.ogg', 50, 0) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat) else if(check_zone(zone_selected) == BODY_ZONE_HEAD) @@ -357,9 +357,9 @@ if(ishuman(H)) S = H.dna.species - visible_message("[src] gives [H] a pat on the head to make [H.p_them()] feel better!", \ - "You give [src] a pat on the head to make [H.p_them()] feel better!", target = H, - target_message = "[src] gives you a pat on the head to make you feel better!") + visible_message(span_notice("[src] gives [H] a pat on the head to make [H.p_them()] feel better!"), \ + span_notice("You give [src] a pat on the head to make [H.p_them()] feel better!"), target = H, + target_message = span_notice("[src] gives you a pat on the head to make you feel better!")) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat) if(S?.can_wag_tail(src) && !H.dna.species.is_wagging_tail()) var/static/list/many_tails = list("tail_human", "tail_lizard", "mam_tail") @@ -368,9 +368,9 @@ H.emote("wag") break else - visible_message("[src] hugs [H] to make [H.p_them()] feel better!", \ - "You hug [H] to make [H.p_them()] feel better!", target = H,\ - target_message = "[src] hugs you to make you feel better!") + visible_message(span_notice("[src] hugs [H] to make [H.p_them()] feel better!"), \ + span_notice("You hug [H] to make [H.p_them()] feel better!"), target = H,\ + target_message = span_notice("[src] hugs you to make you feel better!")) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug) playsound(H.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) @@ -390,7 +390,7 @@ /mob/living/simple_animal/bot/hugbot/explode() on = FALSE - visible_message("[src] blows apart!") + visible_message(span_boldannounce("[src] blows apart!")) do_sparks(3, TRUE, src) var/atom/Tsec = drop_location() drop_part(/obj/item/storage/box/hug, Tsec) @@ -416,19 +416,19 @@ var/mob/living/simple_animal/bot/hugbot/A = new(drop_location()) A.name = created_name A.robot_arm = W.type - to_chat(user, "You add [W] to [src]. Beep boop!") + to_chat(user, span_notice("You add [W] to [src]. Beep boop!")) qdel(W) qdel(src) /obj/item/storage/box/hug/attackby(obj/item/I, mob/user, params) if((istype(I, /obj/item/bodypart/l_arm/robot)) || (istype(I, /obj/item/bodypart/r_arm/robot))) if(contents.len) //prevent accidently deleting contents - to_chat(user, "You need to empty [src] out first!") + to_chat(user, span_warning("You need to empty [src] out first!")) return if(!user.temporarilyRemoveItemFromInventory(I)) return qdel(I) - to_chat(user, "You add [I] to the [src]! You've got a hugbot assembly now!") + to_chat(user, span_notice("You add [I] to the [src]! You've got a hugbot assembly now!")) var/obj/item/bot_assembly/hugbot/A = new qdel(src) user.put_in_hands(A) @@ -438,7 +438,7 @@ // Skyrat exclusive: Tipping over hugbots. Because fuck medbots. /mob/living/simple_animal/bot/hugbot/proc/tip_over(mob/user) mobility_flags &= ~MOBILITY_MOVE - user.visible_message("[user] tips over [src]!", "You tip [src] over!") + user.visible_message(span_danger("[user] tips over [src]!"), span_danger("You tip [src] over!")) balloon_alert(user, "tipped over") mode = BOT_TIPPED tipper_name = user.name // Skyrat fix @@ -449,14 +449,14 @@ mobility_flags &= MOBILITY_MOVE var/list/messagevoice if(user) - user.visible_message("[user] sets [src] right-side up!", "You set [src] right-side up!") + user.visible_message(span_notice("[user] sets [src] right-side up!"), span_green("You set [src] right-side up!")) balloon_alert(user, "set right") if(user.name == tipper_name) messagevoice = list("I forgive you." = 'sound/voice/medbot/forgive.ogg') else messagevoice = list("Thank you!" = 'sound/voice/medbot/thank_you.ogg', "You are a good person." = 'sound/voice/medbot/youre_good.ogg') else - visible_message("[src] manages to writhe wiggle enough to right itself.") + visible_message(span_notice("[src] manages to writhe wiggle enough to right itself.")) messagevoice = list("Fuck you." = 'sound/voice/medbot/fuck_you.ogg', "Your behavior has been reported, have a nice day." = 'sound/voice/medbot/reported.ogg') tipper_name = null diff --git a/modular_sand/code/modules/mob/living/simple_animal/friendly/doges.dm b/modular_sand/code/modules/mob/living/simple_animal/friendly/doges.dm index ef6991e2d5..fa3b49613a 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/friendly/doges.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/friendly/doges.dm @@ -22,7 +22,7 @@ . = ..() if(.) for(var/obj/item/reagent_containers/food/snacks/burger/burbger in view(1, src)) - visible_message("\The [src] consumes the [burbger]!") + visible_message(span_danger("\The [src] consumes the [burbger]!")) qdel(burbger) revive(full_heal = 1) @@ -33,7 +33,7 @@ qdel(I) if(stat == DEAD) visible_message("\The [src] stands right back up after nibbling the [I]!") - else + else visible_message("\The [src] swallows the [I] whole!") revive(full_heal = 1) diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/gladiator.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/gladiator.dm index 9fd110873a..db5c805d2a 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/gladiator.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/gladiator.dm @@ -187,11 +187,11 @@ They deal 35 brute (armor is considered). if(isliving(A)) var/mob/living/LM = A forceMove(LM.loc) - visible_message("[src] knocks [LM] down!") + visible_message(span_userdanger("[src] knocks [LM] down!")) LM.DefaultCombatKnockdown(60) discharge() else if(istype(A, /turf/closed)) - visible_message("[src] crashes headfirst into [A]!") + visible_message(span_userdanger("[src] crashes headfirst into [A]!")) discharge(1.33) /mob/living/simple_animal/hostile/megafauna/gladiator/proc/update_phase() @@ -223,7 +223,7 @@ They deal 35 brute (armor is considered). move_to_delay = move_to_charge /mob/living/simple_animal/hostile/megafauna/gladiator/proc/zweispin() - visible_message("[src] lifts his zweihander, and prepares to spin!") + visible_message(span_boldwarning("[src] lifts his zweihander, and prepares to spin!")) speen = TRUE animate(src, color = "#ff6666", 10) sleep(5) @@ -277,7 +277,7 @@ They deal 35 brute (armor is considered). /mob/living/simple_animal/hostile/megafauna/gladiator/proc/chargeattack(atom/target, var/range) face_atom(target) - visible_message("[src] lifts his shield, and prepares to charge!") + visible_message(span_boldwarning("[src] lifts his shield, and prepares to charge!")) animate(src, color = "#ff6666", 3) sleep(4) face_atom(target) diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/glaurung.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/glaurung.dm index d9b730eb28..1e1efc4609 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/glaurung.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/glaurung.dm @@ -102,7 +102,7 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/dragon/glaurung/AltClickOn(atom/movable/A) if(!istype(A)) - to_chat(src, "Your wings are too damaged for old swoop maneuvers.") + to_chat(src, span_warning("Your wings are too damaged for old swoop maneuvers.")) return /obj/item/gps/internal/glaurung diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/king_of_goats.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/king_of_goats.dm index f3980bc9fd..4b78bb7dbf 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/king_of_goats.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/king_of_goats.dm @@ -164,7 +164,7 @@ Difficulty: Insanely Hard /mob/living/simple_animal/hostile/megafauna/king/Retaliate() ..() if(stat == CONSCIOUS && prob(5)) - visible_message("\The [src] bellows indignantly, with a judgemental gleam in his eye.") + visible_message(span_warning("\The [src] bellows indignantly, with a judgemental gleam in his eye.")) /mob/living/simple_animal/hostile/megafauna/king/phase2/Retaliate() set waitfor = FALSE @@ -172,16 +172,16 @@ Difficulty: Insanely Hard if(spellscast < 5) if(prob(5) && move_to_delay >= 3) //speed buff spellscast++ - visible_message("\The [src] shimmers and seems to phase in and out of reality itself!") + visible_message(span_cult("\The [src] shimmers and seems to phase in and out of reality itself!")) move_to_delay = 1 else if(prob(5) && melee_damage_lower != 50) //damage buff spellscast++ - visible_message("\The [src]' horns grow larger and more menacing!") + visible_message(span_cult("\The [src]' horns grow larger and more menacing!")) melee_damage_lower = 50 else if(prob(5)) //spawn adds spellscast++ - visible_message("\The [src] summons the imperial guard to his aid, and they appear in a flash!") + visible_message(span_cult("\The [src] summons the imperial guard to his aid, and they appear in a flash!")) var/mob/living/simple_animal/hostile/retaliate/goat/guard/master/M = new(get_step(src,pick(GLOB.cardinals))) M.enemies |= enemies var/mob/living/simple_animal/hostile/retaliate/goat/guard/G = new(get_step(src,pick(GLOB.cardinals))) @@ -191,12 +191,12 @@ Difficulty: Insanely Hard else if(prob(5)) //EMP blast spellscast++ - visible_message("\The [src] disrupts nearby electrical equipment!") + visible_message(span_cult("\The [src] disrupts nearby electrical equipment!")) empulse(get_turf(src), 5, 2, 0) else if(prob(5) && melee_damage_type == BRUTE && !special_attacks) //elemental attacks spellscast++ - visible_message("\The [src]' horns flicker with holy white flames!") + visible_message(span_cult("\The [src]' horns flicker with holy white flames!")) melee_damage_type = BURN else if(prob(5)) //earthquake spell @@ -213,7 +213,7 @@ Difficulty: Insanely Hard if(!(getBruteLoss() > health_holder)) adjustBruteLoss(health_holder - getBruteLoss()) //our own magicks cannot harm us else - visible_message("\The [src] loses concentration and huffs haughtily.") + visible_message(span_notice("\The [src] loses concentration and huffs haughtily.")) stop_automated_movement = FALSE else return @@ -225,7 +225,7 @@ Difficulty: Insanely Hard revive(TRUE) stun_chance = 10 update_icon() - visible_message("\The [src]' wounds close with a flash, and when he emerges, he's even larger than before!") + visible_message(span_cult("\The [src]' wounds close with a flash, and when he emerges, he's even larger than before!")) /mob/living/simple_animal/hostile/megafauna/king/phase2/update_icon() @@ -248,20 +248,20 @@ Difficulty: Insanely Hard if(!.) return FALSE if(special_attacks >= 5 && melee_damage_type != BRUTE) - visible_message("The energy surrounding \the [src]'s horns dissipates.") + visible_message(span_cult("The energy surrounding \the [src]'s horns dissipates.")) melee_damage_type = BRUTE if(special_attacks >= 5 && melee_damage_lower == 50) - visible_message("The [src]' horns shrink back down to normal size.") + visible_message(span_cult("The [src]' horns shrink back down to normal size.")) melee_damage_lower = 40 /mob/living/simple_animal/hostile/megafauna/king/proc/OnDeath() - visible_message("\The [src] lets loose a terrific wail as its wounds close shut with a flash of light, and its eyes glow even brighter than before!") + visible_message(span_cult("\The [src] lets loose a terrific wail as its wounds close shut with a flash of light, and its eyes glow even brighter than before!")) new /mob/living/simple_animal/hostile/megafauna/king/phase2(get_turf(src)) qdel(src) /mob/living/simple_animal/hostile/megafauna/king/phase2/OnDeath() if(phase3) - visible_message("\The [src] shrieks as the seal on his power breaks and he starts to break apart!") + visible_message(span_cult("\The [src] shrieks as the seal on his power breaks and he starts to break apart!")) new /obj/structure/ladder/unbreakable/goat(loc) new /obj/item/gun/energy/goatgun(loc) new /obj/item/toy/plush/goatplushie/angry/kinggoat(loc) //If someone dies from this after beating the king goat im going to laugh @@ -278,7 +278,7 @@ Difficulty: Insanely Hard L.gib() if(prob(stun_chance)) L.Stun(5) - visible_message("\The [L] is bowled over by the impact of [src]'s attack!") + visible_message(span_warning("\The [L] is bowled over by the impact of [src]'s attack!")) /mob/living/simple_animal/hostile/megafauna/king/phase2/AttackingTarget() . = ..() diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index f671e2f9eb..ed66903f0f 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -33,7 +33,7 @@ L.GiveTarget(target) - visible_message("[src] splits in twain!") + visible_message(span_boldannounce("[src] splits in twain!")) else var/last_legion = TRUE for(var/mob/living/simple_animal/hostile/megafauna/legion/other in GLOB.mob_living_list) diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 0f062d21b1..b7476832fe 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -48,7 +48,7 @@ if((faction_check_mob(M) && attack_same) || (!faction_check_mob(M)) || (!ismegafauna(M))) enemies |= M if(!retaliated) - src.visible_message("[src] seems pretty pissed off at [M]!") + src.visible_message(span_userdanger("[src] seems pretty pissed off at [M]!")) retaliated = TRUE retaliatedcooldown = world.time + retaliatedcooldowntime else if(ismecha(A)) @@ -61,7 +61,7 @@ continue enemies |= living if(!retaliated) - visible_message("[src] seems pretty pissed off at [M]!") + visible_message(span_userdanger("[src] seems pretty pissed off at [M]!")) retaliated = TRUE retaliatedcooldown = world.time + retaliatedcooldowntime @@ -129,9 +129,9 @@ if(KA && KA.bayonet) message = pick(glorymessagespka | glorymessagespkabayonet) if(message) - visible_message("[slayer] [message]") + visible_message(span_danger("[slayer] [message]")) else - visible_message("[slayer] does something generally considered brutal to [src]... Whatever that may be!") + visible_message(span_danger("[slayer] does something generally considered brutal to [src]... Whatever that may be!")) adjustHealth(maxHealth, TRUE, TRUE) if(mob_biotypes & MOB_ORGANIC) new /obj/effect/gibspawner/generic(src.loc) @@ -139,14 +139,14 @@ new /obj/effect/gibspawner/robot(src.loc) slayer.heal_overall_damage(gloryhealth,gloryhealth) else - to_chat(slayer, "You fail to glory kill [src]!") + to_chat(slayer, span_danger("You fail to glory kill [src]!")) /mob/living/simple_animal/hostile/megafauna/devour(mob/living/L) if(!L) return visible_message( - "[src] devours [L]!", - "You feast on [L], restoring your health!") + span_danger("[src] devours [L]!"), + span_userdanger("You feast on [L], restoring your health!")) if(!is_station_level(z) || client) //NPC monsters won't heal while on station adjustBruteLoss(-L.maxHealth/2) L.gib() diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/rogueprocess.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/rogueprocess.dm index f1df97f500..fb49b7fa98 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/rogueprocess.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/rogueprocess.dm @@ -170,7 +170,7 @@ if(path > 2) if(!target) return - visible_message("[src] raises it's plasma cutter!") + visible_message(span_boldwarning("[src] raises it's plasma cutter!")) sleep(3) var/turf/startloc = get_turf(src) var/obj/item/projectile/P = new /obj/item/projectile/plasma/rogue(startloc) @@ -186,7 +186,7 @@ if(theline > 2) if(!target) return - visible_message("[src] raises it's tri-shot plasma cutter!") + visible_message(span_boldwarning("[src] raises it's tri-shot plasma cutter!")) var/ogangle = Get_Angle(src, target) sleep(7) var/turf/startloc = get_turf(src) @@ -212,7 +212,7 @@ Y.fire(otherangle2) /mob/living/simple_animal/hostile/megafauna/rogueprocess/proc/knockdown(range = 2) - visible_message("[src] smashes into the ground!") + visible_message(span_boldwarning("[src] smashes into the ground!")) playsound(src,'sound/misc/crunch.ogg', 200, 1) var/list/hit_things = list() sleep(7) @@ -231,7 +231,7 @@ sleep(3) /mob/living/simple_animal/hostile/megafauna/rogueprocess/proc/shockwave(direction, range, wave_duration = 1.5) - visible_message("[src] smashes the ground in a general direction!!") + visible_message(span_boldwarning("[src] smashes the ground in a general direction!!")) playsound(src,'sound/misc/crunch.ogg', 200, 1) sleep(7) var/list/hit_things = list() @@ -272,7 +272,7 @@ sleep(wave_duration) /mob/living/simple_animal/hostile/megafauna/rogueprocess/proc/ultishockwave(range, iteration_duration = 5) - visible_message("[src] smashes the ground around them!!") + visible_message(span_boldwarning("[src] smashes the ground around them!!")) playsound(src,'sound/misc/crunch.ogg', 200, 1) sleep(10) var/list/hit_things = list() diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/sif.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/sif.dm index 1411b2ad4b..56c05a748c 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/sif.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/sif.dm @@ -122,7 +122,7 @@ Difficulty: Medium spawn(30) if(!QDELETED(src)) new /mob/living/simple_animal/hostile/megafauna/sif(get_turf(src.loc)) - visible_message("The ground shakes.") + visible_message(span_notice("The ground shakes.")) playsound(get_turf(src.loc), 'sound/effects/curse3.ogg', 100, 1) playsound(get_turf(src.loc), 'sound/effects/meteorimpact.ogg', 100, 1) qdel(src) @@ -223,7 +223,7 @@ Difficulty: Medium else if(passed == 1) - visible_message("[src] dodged the projectile!", "You dodge the projectile!") + visible_message(span_danger("[src] dodged the projectile!"), span_userdanger("You dodge the projectile!")) playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 300, 1) return 0 @@ -233,7 +233,7 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/sif/proc/angered() src.angered = TRUE src.stageTwo = TRUE - src.visible_message("[src] lets out a ear ripping howl!", "[src] lets out an ear ripping roar!") + src.visible_message(span_userdanger("[src] lets out a ear ripping howl!"), span_userdanger("[src] lets out an ear ripping roar!")) playsound(src, 'modular_sand/sound/sif/howl.ogg', 100, 1) var/mob/living/L = target shake_camera(L, 4, 3) @@ -247,7 +247,7 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/sif/proc/enraged() src.stageThree = TRUE src.enraged = TRUE - src.visible_message("[src] lets out a ear ripping yelp!", "[src] lets out an ear ripping yelp!") + src.visible_message(span_userdanger("[src] lets out a ear ripping yelp!"), span_userdanger("[src] lets out an ear ripping yelp!")) playsound(src, 'modular_sand/sound/sif/howl.ogg', 100, 1) var/mob/living/L = target shake_camera(L, 8, 6) @@ -355,7 +355,7 @@ Difficulty: Medium DestroySurroundings() if(isliving(A)) var/mob/living/L = A - L.visible_message("[src] stomps on [L]!", "[src] stomps on you!") + L.visible_message(span_danger("[src] stomps on [L]!"), span_userdanger("[src] stomps on you!")) src.forceMove(get_turf(L)) L.apply_damage(20, BRUTE) playsound(get_turf(L), 'modular_sand/sound/sif/sif_stomp.ogg', 400, 1) diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/candy.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/candy.dm index 82ccc551ee..63ad4d8cf0 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/candy.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/candy.dm @@ -51,28 +51,28 @@ name = "Blood Charge" icon_icon = 'modular_sand/icons/mob/actions/actions_elites.dmi' button_icon_state = "blood_charge" - chosen_message = "You will attempt to charge your target." + chosen_message = span_boldwarning("You will attempt to charge your target.") chosen_attack_num = BLOOD_CHARGE /datum/action/innate/elite_attack/bloody_trap name = "Bloody Trap" icon_icon = 'modular_sand/icons/mob/actions/actions_elites.dmi' button_icon_state = "bloody_trap" - chosen_message = "You will attempt to trap your target." + chosen_message = span_boldwarning("You will attempt to trap your target.") chosen_attack_num = BLOODY_TRAP /datum/action/innate/elite_attack/meat_shield name = "Meat Shield" icon_icon = 'modular_sand/icons/mob/actions/actions_elites.dmi' button_icon_state = "meat_shield" - chosen_message = "You will attempt to shield yourself." + chosen_message = span_boldwarning("You will attempt to shield yourself.") chosen_attack_num = MEAT_SHIELD /datum/action/innate/elite_attack/knockdown name = "Knockdown" icon_icon = 'modular_sand/icons/mob/actions/actions_elites.dmi' button_icon_state = "knockdown" - chosen_message = "You will knock down every mob around you." + chosen_message = span_boldwarning("You will knock down every mob around you.") chosen_attack_num = KNOCKDOWN @@ -105,7 +105,7 @@ var/dir_to_target = get_dir(get_turf(src), get_turf(target)) var/turf/T = get_turf(src) playsound(src,'sound/magic/demon_attack1.ogg', 200, 1) - visible_message("[src] prepares to charge!") + visible_message(span_boldwarning("[src] prepares to charge!")) for(var/i in 1 to 6) new /obj/effect/temp_visual/dir_setting/bloodsplatter/candy(T, get_dir(T, target)) T = get_step(T, dir_to_target) @@ -120,7 +120,7 @@ if(bline.len > 6) return FALSE ranged_cooldown = world.time + 100 - visible_message("[src] traps [target]!") + visible_message(span_boldwarning("[src] traps [target]!")) for(var/turf/J in view(1, target) - get_turf(target)) new /obj/effect/temp_visual/bloodwall(J, src) sleep(5) @@ -134,13 +134,13 @@ for(var/obj/effect/temp_visual/bloodwall/B in N.contents) bloodwalls += B var/obj/effect/temp_visual/bloodwall/chosen = pick(bloodwalls) - visible_message("One of the blood walls disappear!") + visible_message(span_boldwarning("One of the blood walls disappear!")) qdel(chosen) /mob/living/simple_animal/hostile/asteroid/elite/candy/proc/meatshield() ranged_cooldown = world.time + 25 playsound(src,'sound/magic/Blind.ogg', 200, 1) - visible_message("[src] raises a wall!") + visible_message(span_boldwarning("[src] raises a wall!")) var/turf/T = get_turf(get_step(src, src.dir)) var/list/hit_things = list() new /obj/effect/temp_visual/bloodwall(T, src) @@ -172,7 +172,7 @@ /mob/living/simple_animal/hostile/asteroid/elite/candy/proc/knockdown() ranged_cooldown = world.time + 100 playsound(src,'sound/misc/crunch.ogg', 200, 1) - visible_message("[src] clenches his fists and smashes the ground!") + visible_message(span_boldwarning("[src] clenches his fists and smashes the ground!")) var/list/hit_things = list() sleep(10) for(var/turf/T in view(1, src)) @@ -217,8 +217,8 @@ if(faction_check_mob(L)) return hit_things += L - visible_message("[src] attacks [L] with much force!") - to_chat(L, "[src] grabs you and throws you with much force!") + visible_message(span_boldwarning("[src] attacks [L] with much force!")) + to_chat(L, span_userdanger("[src] grabs you and throws you with much force!")) L.safe_throw_at(throwtarget, 10, 1, src) //L.Paralyze(20) L.Stun(20) //substituting this for the Paralyze from the line above, because we don't have tg paralysis stuff @@ -270,7 +270,7 @@ icon_state = "vial" /obj/item/bloodcrawlbottle/attack_self(mob/user) - to_chat(user, "You drink the bottle's contents.") + to_chat(user, span_notice("You drink the bottle's contents.")) var/obj/effect/proc_holder/spell/bloodcrawl/S = new /obj/effect/proc_holder/spell/bloodcrawl/ user.mind.AddSpell(S) user.log_message("learned the spell bloodcrawl ([S])", LOG_ATTACK, color="orange") diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/drakeling.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/drakeling.dm index 66e5997888..a59927c59e 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/drakeling.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/drakeling.dm @@ -51,28 +51,28 @@ name = "Lava Moat" icon_icon = 'modular_sand/icons/mob/actions/actions_elites.dmi' button_icon_state = "lava_moat" - chosen_message = "You will attempt to create a lava moat around you." + chosen_message = span_boldwarning("You will attempt to create a lava moat around you.") chosen_attack_num = LAVA_MOAT /datum/action/innate/elite_attack/lavaaround name = "Lava Rivers" icon_icon = 'modular_sand/icons/mob/actions/actions_elites.dmi' button_icon_state = "lava_around" - chosen_message = "You will now create lava rivers at your cardinal directions." + chosen_message = span_boldwarning("You will now create lava rivers at your cardinal directions.") chosen_attack_num = LAVA_AROUND /datum/action/innate/elite_attack/firespew name = "Fire Spew" icon_icon = 'modular_sand/icons/mob/actions/actions_elites.dmi' button_icon_state = "fire_spew" - chosen_message = "You will now spew fire at your target." + chosen_message = span_boldwarning("You will now spew fire at your target.") chosen_attack_num = FIRE_SPEW /datum/action/innate/elite_attack/firemoat name = "Fire Moat" icon_icon = 'modular_sand/icons/mob/actions/actions_elites.dmi' button_icon_state = "fire_moat" - chosen_message = "You will now spew fire at all cardinal directions." + chosen_message = span_boldwarning("You will now spew fire at all cardinal directions.") chosen_attack_num = FIRE_MOAT /mob/living/simple_animal/hostile/asteroid/elite/drakeling/OpenFire() @@ -101,7 +101,7 @@ //Drakeling actions /mob/living/simple_animal/hostile/asteroid/elite/drakeling/proc/lava_moat() ranged_cooldown = world.time + 25 - visible_message("[src] spews lava around themselves! Get back!") + visible_message(span_boldwarning("[src] spews lava around themselves! Get back!")) for(var/turf/T in oview(1, src)) new /obj/effect/temp_visual/lava_warning/drakeling(T, 40) @@ -112,7 +112,7 @@ /mob/living/simple_animal/hostile/asteroid/elite/drakeling/proc/fire_spew() ranged_cooldown = world.time + 25 - visible_message("[src] spews fire!") + visible_message(span_boldwarning("[src] spews fire!")) playsound(src,'sound/magic/Fireball.ogg', 200, 1) sleep(5) fire_wall(src.dir, 10) @@ -120,7 +120,7 @@ /mob/living/simple_animal/hostile/asteroid/elite/drakeling/proc/fire_moat() ranged_cooldown = world.time + 100 playsound(src,'sound/magic/Fireball.ogg', 200, 1) - visible_message("[src] violently puffs smoke!They're going to make a fire moat!") + visible_message(span_boldwarning("[src] violently puffs smoke!They're going to make a fire moat!")) sleep(5) for(var/d in GLOB.alldirs) INVOKE_ASYNC(src, .proc/fire_wall, d, 10) @@ -139,7 +139,7 @@ else hitlist += L L.adjustFireLoss(20) - to_chat(L, "You're hit by [src]'s fire breath!") + to_chat(L, span_userdanger("You're hit by [src]'s fire breath!")) T = get_step(T, dir) sleep(1) diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index ccba5d65a6..f47f7d8a9d 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -25,14 +25,14 @@ obj/item/tumor_shard/afterattack(atom/target, mob/user, proximity_flag) if(istype(target, /mob/living/simple_animal/hostile/asteroid/elite) && proximity_flag) var/mob/living/simple_animal/hostile/asteroid/elite/E = target if(E.stat != DEAD || E.sentience_type != SENTIENCE_BOSS || !E.key) - user.visible_message("It appears [E] is unable to be revived right now. Perhaps try again later.") + user.visible_message(span_notice("It appears [E] is unable to be revived right now. Perhaps try again later.")) return E.faction = list("neutral") E.revive(full_heal = TRUE, admin_revive = TRUE) - user.visible_message("[user] stabs [E] with [src], reviving it.") + user.visible_message(span_notice("[user] stabs [E] with [src], reviving it.")) E.playsound_local(get_turf(E), 'sound/effects/magic.ogg', 40, 0) to_chat(E, "You have been revived by [user]. You owe [user] a great debt. Assist [user.p_them()] in achieving [user.p_their()] goals, regardless of risk.Note that you now share the loyalties of [user]. You are expected not to intentionally sabotage their faction unless commanded to!") + to_chat(E, span_big bold("Note that you now share the loyalties of [user]. You are expected not to intentionally sabotage their faction unless commanded to!")) E.maxHealth = E.maxHealth * 0.5 E.health = E.maxHealth E.desc = "[E.desc] However, this one appears appears less wild in nature, and calmer around people." @@ -40,4 +40,4 @@ obj/item/tumor_shard/afterattack(atom/target, mob/user, proximity_flag) E.owner = user qdel(src) else - to_chat(user, "[src] only works on the corpse of a sentient lavaland elite.") + to_chat(user, span_info("[src] only works on the corpse of a sentient lavaland elite.")) diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/fanaticminer.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/fanaticminer.dm index cd81e17cc3..5a07d9aa66 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/fanaticminer.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/fanaticminer.dm @@ -52,28 +52,28 @@ name = "Axe Slam" icon_icon = 'modular_sand/icons/mob/actions/actions_elites.dmi' button_icon_state = "axe_slam" - chosen_message = "You will attempt to slam your axe." + chosen_message = span_boldwarning("You will attempt to slam your axe.") chosen_attack_num = AXE_SLAM /datum/action/innate/elite_attack/summon_shambler name = "Summon Shambler" icon_icon = 'modular_sand/icons/mob/actions/actions_elites.dmi' button_icon_state = "summon_shambler" - chosen_message = "You will attempt to summon a shambling miner." + chosen_message = span_boldwarning("You will attempt to summon a shambling miner.") chosen_attack_num = SUMMON_SHAMBLER /datum/action/innate/elite_attack/dash name = "Dash" icon_icon = 'modular_sand/icons/mob/actions/actions_elites.dmi' button_icon_state = "dash" - chosen_message = "You will attempt to dash near your target." + chosen_message = span_boldwarning("You will attempt to dash near your target.") chosen_attack_num = DASH /datum/action/innate/elite_attack/axe_throw name = "Axe Throw" icon_icon = 'modular_sand/icons/mob/actions/actions_elites.dmi' button_icon_state = "axe_throw" - chosen_message = "You will attempt to throw your axe." + chosen_message = span_boldwarning("You will attempt to throw your axe.") chosen_attack_num = AXE_THROW /mob/living/simple_animal/hostile/asteroid/elite/minerpriest/OpenFire() @@ -107,26 +107,26 @@ for(var/i in 1 to 3) new /obj/effect/temp_visual/dragon_swoop/priest(T) T = get_step(T, dir_to_target) - visible_message("[src] prepares to slam his axe!") + visible_message(span_boldwarning("[src] prepares to slam his axe!")) sleep(5) playsound(src,'sound/misc/crunch.ogg', 200, 1) T = get_step(get_turf(src), dir_to_target) var/list/hit_things = list() - visible_message("[src] slams his axe!") + visible_message(span_boldwarning("[src] slams his axe!")) for(var/i in 1 to 3) for(var/mob/living/L in T.contents) if(faction_check_mob(L)) return hit_things += L - visible_message("[src] slams his axe on [L]!") - to_chat(L, "[src] slams his axe on you!") + visible_message(span_boldwarning("[src] slams his axe on [L]!")) + to_chat(L, span_userdanger("[src] slams his axe on you!")) L.Stun(15) L.adjustBruteLoss(30) T = get_step(T, dir_to_target) /mob/living/simple_animal/hostile/asteroid/elite/minerpriest/proc/summon_shambler(target) ranged_cooldown = world.time + 150 - visible_message("[src] summons a minion!") + visible_message(span_boldwarning("[src] summons a minion!")) playsound(src,'sound/magic/CastSummon.ogg', 200, 1) var/list/turfs = list() for(var/turf/T in oview(2, src)) @@ -139,7 +139,7 @@ /mob/living/simple_animal/hostile/asteroid/elite/minerpriest/proc/dash(atom/dash_target) ranged_cooldown = world.time + 20 - visible_message("[src] dashes into the air!") + visible_message(span_boldwarning("[src] dashes into the air!")) playsound(src,'sound/magic/blink.ogg', 200, 1) var/list/accessable_turfs = list() var/self_dist_to_target = 0 @@ -179,7 +179,7 @@ /mob/living/simple_animal/hostile/asteroid/elite/minerpriest/proc/axe_throw(target) ranged_cooldown = world.time + 20 - visible_message("[src] prepares to throw his axe!") + visible_message(span_boldwarning("[src] prepares to throw his axe!")) var/turf/targetturf = get_turf(target) playsound(src,'sound/weapons/fwoosh.wav', 200, 1) Shoot(targetturf) @@ -189,8 +189,8 @@ var/mob/living/carbon/human/H = new /mob/living/carbon/human(src.loc) if(src.client) H.client = src.client - to_chat(H, "You have been finally enlightened. Serving the necropolis is not your duty anymore, thanks to whoever defeated you. You owe them a great debt.Note that you now share the loyalties of the one who defeated you. You are expected not to intentionally sabotage their faction unless commanded to!") + to_chat(H, span_userdanger("You have been finally enlightened. Serving the necropolis is not your duty anymore, thanks to whoever defeated you. You owe them a great debt.")) + to_chat(H, span_big(span_bold("Note that you now share the loyalties of the one who defeated you. You are expected not to intentionally sabotage their faction unless commanded to!"))) else H.adjustBruteLoss(200) H.equipOutfit(/datum/outfit/job/miner/equipped/priest) diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/miningmobs.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/miningmobs.dm index fe050ab3ec..5fce2c9ed7 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/miningmobs.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/miningmobs.dm @@ -49,9 +49,9 @@ if(KA && KA.bayonet) message = pick(glorymessagespka | glorymessagespkabayonet) if(message) - visible_message("[slayer] [message]") + visible_message(span_danger("[slayer] [message]")) else - visible_message("[slayer] does something generally considered brutal to [src]... Whatever that may be!") + visible_message(span_danger("[slayer] does something generally considered brutal to [src]... Whatever that may be!")) slayer.heal_overall_damage(gloryhealth,gloryhealth) playsound(src.loc, death_sound, 150, TRUE, -1) crusher_drop_mod *= 2 @@ -61,4 +61,4 @@ else if(mob_biotypes & MOB_ROBOTIC) new /obj/effect/gibspawner/robot(src.loc) else - to_chat(slayer, "You fail to glory kill [src]!") + to_chat(slayer, span_danger("You fail to glory kill [src]!")) diff --git a/modular_sand/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/modular_sand/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index dccf94c0a9..12189b10ba 100644 --- a/modular_sand/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/modular_sand/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -1,21 +1,3 @@ -//Kinetic accelerator charging meme bugfix -/obj/item/gun/energy/kinetic_accelerator/ - var/chargetimer = null - -/obj/item/gun/energy/kinetic_accelerator/proc/reload() - if(ismob(loc) || isturf(loc)) //Kinetic accelerators won't charge inside objects. Period. - cell.give(cell.maxcharge) - if(!suppressed) - playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) - else - to_chat(loc, "[src] silently charges up.") - update_icon() - overheat = FALSE - else //this is a terrible solution, but it ensures that it wont be stuck on dischaged if it fails to reload in an obj - if(chargetimer) - deltimer(chargetimer) - chargetimer = addtimer(CALLBACK(src, .proc/reload), overheat_time * 2, TIMER_STOPPABLE) - //BDM pka /obj/item/gun/energy/kinetic_accelerator/premiumka/bdminer name = "bloody accelerator" @@ -32,16 +14,16 @@ var/obj/item/borg/upgrade/modkit/MK = I switch(MK.type) if(/obj/item/borg/upgrade/modkit/chassis_mod) - to_chat(user, "This modkit is unsuitable for [src]!") + to_chat(user, span_userdanger("This modkit is unsuitable for [src]!")) return FALSE if(/obj/item/borg/upgrade/modkit/chassis_mod/orange) - to_chat(user, "This modkit is unsuitable for [src]!") + to_chat(user, span_userdanger("This modkit is unsuitable for [src]!")) return FALSE if(/obj/item/borg/upgrade/modkit/tracer) - to_chat(user, "This modkit is unsuitable for [src]!") + to_chat(user, span_userdanger("This modkit is unsuitable for [src]!")) return FALSE if(/obj/item/borg/upgrade/modkit/tracer/adjustable) - to_chat(user, "This modkit is unsuitable for [src]!") + to_chat(user, span_userdanger("This modkit is unsuitable for [src]!")) return FALSE MK.install(src, user) else @@ -53,16 +35,16 @@ var/obj/item/borg/upgrade/modkit/MK = src switch(MK.type) if(/obj/item/borg/upgrade/modkit/chassis_mod) - to_chat(user, "This modkit is unsuitable for [A]!") + to_chat(user, span_userdanger("This modkit is unsuitable for [A]!")) return FALSE if(/obj/item/borg/upgrade/modkit/chassis_mod/orange) - to_chat(user, "This modkit is unsuitable for [A]!") + to_chat(user, span_userdanger("This modkit is unsuitable for [A]!")) return FALSE if(/obj/item/borg/upgrade/modkit/tracer) - to_chat(user, "This modkit is unsuitable for [A]!") + to_chat(user, span_userdanger("This modkit is unsuitable for [A]!")) return FALSE if(/obj/item/borg/upgrade/modkit/tracer/adjustable) - to_chat(user, "This modkit is unsuitable for [A]!") + to_chat(user, span_userdanger("This modkit is unsuitable for [A]!")) return FALSE install(A, user) else @@ -391,7 +373,7 @@ /mob/living/simple_animal/hostile/asteroid/hivelordbrood/explosivelegion/death() explosion(src.loc, 0, 0, 1, 2, 0, FALSE, 2) - src.visible_message("The [src] explodes!") + src.visible_message(span_danger("The [src] explodes!")) ..() /obj/item/borg/upgrade/modkit/skull @@ -435,7 +417,7 @@ else hitlist += L L.adjustFireLoss(src.modifier) - to_chat(L, "You're hit by [KA]'s fire breath!") + to_chat(L, span_userdanger("You're hit by [KA]'s fire breath!")) //king goat /obj/item/borg/upgrade/modkit/cooldown/cooler name = "cooler modification kit" @@ -568,3 +550,37 @@ /obj/item/borg/upgrade/modkit/aoe/heavy/modify_projectile(obj/item/projectile/kinetic/K) K.name = "heavy kinetic explosion" + +/obj/item/gun/energy/kinetic_accelerator/premiumka + unique_reskin = list( + "Default" = list( + "name" = "premium accelerator", + "desc" = "A premium kinetic accelerator fitted with an extended barrel and increased pressure tank.", + "icon" = 'icons/obj/guns/energy.dmi', + "icon_state" = "premiumgun", + "item_state" = "premiumgun", + "lefthand_file" = 'icons/mob/inhands/weapons/guns_lefthand.dmi', + "righthand_file" = 'icons/mob/inhands/weapons/guns_righthand.dmi' + ), + "Conscript's tapper" = list( + "name" = "Conscript's tapper", + "desc" = "Good 'ol kinetic handgun that has been revised to mining and killing tool, works better in pair.", // lies + "icon" = 'modular_sand/icons/obj/guns/energy.dmi', + "icon_state" = "commando-gun", + "item_state" = "commando-gun", + "lefthand_file" = 'modular_sand/icons/mob/inhands/weapons/guns_lefthand.dmi', + "righthand_file" = 'modular_sand/icons/mob/inhands/weapons/guns_righthand.dmi' + ) + ) + +/obj/item/gun/energy/kinetic_accelerator/premiumka/reskin_obj(mob/user) + . = ..() + if(ismob(loc) && current_equipped_slot == ITEM_SLOT_HANDS) + var/mob/update_hands = loc + update_hands.update_inv_hands() + +/obj/item/gun/energy/kinetic_accelerator/premiumka/update_overlays() + . = ..() + if(current_skin == "Conscript's tapper") + if(can_shoot()) + . += "[icon_state]_cocked" diff --git a/modular_sand/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_sand/code/modules/reagents/chemistry/reagents/fermi_reagents.dm new file mode 100644 index 0000000000..903dbbd43c --- /dev/null +++ b/modular_sand/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -0,0 +1,28 @@ +// Plushmium object reaction +/datum/reagent/fermi/plushmium/reaction_obj(obj/O, reac_volume) + // Check for Saliith plush + if(istype(O, /obj/item/toy/plush/lizardplushie/saliith)) + // Check if a carbon user exists + if((!usr) || (!iscarbon(usr))) + // Return without any effects + return + + // Warn in local chat + O.loc.visible_message(span_warning("[src] is sprayed with a strange chemical, and reacts with overwhelming hostility! [usr] is sprayed with a concoction of horrible chemicals!")) + + // Define user mob + var/mob/living/carbon/human/spray_user = usr + + // Add chemicals + spray_user.reagents.add_reagent(/datum/reagent/toxin/mutagen, 20) + spray_user.reagents.add_reagent(/datum/reagent/toxin/mindbreaker, 20) + spray_user.reagents.add_reagent(/datum/reagent/toxin/mutetoxin, 20) + //spray_user.reagents.add_reagent(/datum/reagent/toxin/histamine, 30) + spray_user.reagents.add_reagent(/datum/reagent/toxin/bonehurtingjuice, 30) + spray_user.reagents.add_reagent(/datum/reagent/toxin/brainhurtingjuice, 30) + + // Return without further effects + return + + // Return normally + . = ..() diff --git a/modular_sand/code/modules/reagents/chemistry/reagents/other_reagents.dm b/modular_sand/code/modules/reagents/chemistry/reagents/other_reagents.dm index e5dcebcbdb..344087f408 100644 --- a/modular_sand/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/modular_sand/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -25,7 +25,7 @@ /datum/reagent/dragons_blood/admin/reaction_mob(mob/living/L, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0) if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection)))) - to_chat(user, "Power courses through you! You can now shift your form at will.") + to_chat(user, span_danger("Power courses through you! You can now shift your form at will.")) var/obj/effect/proc_holder/spell/targeted/shapeshift/dragon/D = new var/user.mind.AddSpell(D) */ //FIX THIS SHIT diff --git a/modular_sand/code/modules/research/techweb/nodes/all_nodes.dm b/modular_sand/code/modules/research/techweb/nodes/all_nodes.dm index 09aa866394..74c534fd0d 100644 --- a/modular_sand/code/modules/research/techweb/nodes/all_nodes.dm +++ b/modular_sand/code/modules/research/techweb/nodes/all_nodes.dm @@ -27,11 +27,11 @@ id = "adv_toolset_implant" display_name = "Advanced Toolset Implant" description = "Allows the creation of alien powerful implants for your arms." - prereq_ids = list("alien_bio") + prereq_ids = list("alien_bio", "alien_engi", "adv_cyber_implants") design_ids = list("ci-toolset-adv","ci-surgery-adv") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) -/datum/techweb_node/adv_surgery/New() +/datum/techweb_node/advance_surgerytools/New() design_ids += "autodoc" . = ..() diff --git a/modular_sand/code/modules/research/techweb/nodes/bluespace_nodes.dm b/modular_sand/code/modules/research/techweb/nodes/bluespace_nodes.dm index c36d90391c..59abd0c034 100644 --- a/modular_sand/code/modules/research/techweb/nodes/bluespace_nodes.dm +++ b/modular_sand/code/modules/research/techweb/nodes/bluespace_nodes.dm @@ -33,8 +33,8 @@ /datum/techweb_node/bs_mining id = "bluespace_mining" display_name = "Bluespace Mining Technology" - description = "Harness the power of bluespace to make materials out of nothing. Slowly." - prereq_ids = list("practical_bluespace", "adv_mining") + description = "Harness the power of bluespace to make materials out of nothing, slowly. Requires a bluespace core to function." + prereq_ids = list("practical_bluespace", "adv_mining", "anomaly_research") design_ids = list("bluespace_miner") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500) diff --git a/modular_sand/code/modules/resize/resizing.dm b/modular_sand/code/modules/resize/resizing.dm index f00762bb04..9d0302561d 100644 --- a/modular_sand/code/modules/resize/resizing.dm +++ b/modular_sand/code/modules/resize/resizing.dm @@ -26,9 +26,9 @@ //Smaller person being stepped on if(get_size(user) > get_size(target) && iscarbon(src)) if(istype(user) && user.dna.features["taur"] == "Naga" || user.dna.features["taur"] == "Tentacle") - target.visible_message("[src] carefully slithers around [target].", "[src]'s huge tail slithers besides you.") + target.visible_message(span_notice("[src] carefully slithers around [target]."), span_notice("[src]'s huge tail slithers besides you.")) else - target.visible_message("[src] carefully steps over [target].", "[src] steps over you carefully.") + target.visible_message(span_notice("[src] carefully steps over [target]."), span_notice("[src] steps over you carefully.")) return TRUE //Smaller person stepping under a larger person @@ -69,9 +69,9 @@ addtimer(CALLBACK(user, /mob/.proc/remove_movespeed_modifier, MOVESPEED_ID_STOMP, TRUE), 3) //0.3 seconds if(get_size(user) > get_size(target) && iscarbon(user)) if(istype(user) && user.dna.features["taur"] == "Naga" || user.dna.features["taur"] == "Tentacle") - target.visible_message("[src] carefully rolls their tail over [target]!", "[src]'s huge tail rolls over you!") + target.visible_message(span_danger("[src] carefully rolls their tail over [target]!"), span_danger("[src]'s huge tail rolls over you!")) else - target.visible_message("[src] carefully steps on [target]!", "[src] steps onto you with force!") + target.visible_message(span_danger("[src] carefully steps on [target]!"), span_danger("[src] steps onto you with force!")) return TRUE if(user.a_intent == "harm" && CHECK_MOBILITY(user, MOBILITY_MOVE) && !user.buckled) @@ -85,9 +85,9 @@ //user.Stun(20) if(get_size(user) > get_size(target) && iscarbon(user)) if(istype(user) && (user.dna.features["taur"] == "Naga" || user.dna.features["taur"] == "Tentacle")) - target.visible_message("[src] mows down [target] under their tail!", "[src] plows their tail over you mercilessly!") + target.visible_message(span_danger("[src] mows down [target] under their tail!"), span_userdanger("[src] plows their tail over you mercilessly!")) else - target.visible_message("[src] slams their foot down on [target], crushing them!", "[src] crushes you under their foot!") + target.visible_message(span_danger("[src] slams their foot down on [target], crushing them!"), span_userdanger("[src] crushes you under their foot!")) return TRUE if(user.a_intent == "grab" && CHECK_MOBILITY(user, MOBILITY_MOVE) && !user.buckled) @@ -101,17 +101,17 @@ var/feetCover = (user.wear_suit && (user.wear_suit.body_parts_covered & FEET)) || (user.w_uniform && (user.w_uniform.body_parts_covered & FEET) || (user.shoes && (user.shoes.body_parts_covered & FEET))) if(feetCover) if(user?.dna?.features["taur"] == "Naga" || user?.dna?.features["taur"] == "Tentacle") - target.visible_message("[src] pins [target] under their tail!", "[src] pins you beneath their tail!") + target.visible_message(span_danger("[src] pins [target] under their tail!"), span_danger("[src] pins you beneath their tail!")) else - target.visible_message("[src] pins [target] helplessly underfoot!", "[src] pins you underfoot!") + target.visible_message(span_danger("[src] pins [target] helplessly underfoot!"), span_danger("[src] pins you underfoot!")) return TRUE else if(user?.dna?.features["taur"] == "Naga" || user?.dna?.features["taur"] == "Tentacle") - target.visible_message("[user] snatches up [target] underneath their tail!", "[src]'s tail winds around you and snatches you in its coils!") + target.visible_message(span_danger("[user] snatches up [target] underneath their tail!"), span_userdanger("[src]'s tail winds around you and snatches you in its coils!")) //target.mob_pickup_micro_feet(user) SEND_SIGNAL(target, COMSIG_MICRO_PICKUP_FEET, user) else - target.visible_message("[user] stomps down on [target], curling their toes and picking them up!", "[src]'s toes pin you down and curl around you, picking you up!") + target.visible_message(span_danger("[user] stomps down on [target], curling their toes and picking them up!"), span_userdanger("[src]'s toes pin you down and curl around you, picking you up!")) //target.mob_pickup_micro_feet(user) SEND_SIGNAL(target, COMSIG_MICRO_PICKUP_FEET, user) return TRUE @@ -126,18 +126,18 @@ if(ishuman(src)) var/mob/living/carbon/human/validmob = src if(validmob?.dna?.features["taur"] == "Naga" || validmob?.dna?.features["taur"] == "Tentacle") - visible_message("[validmob] carefully slithers around [target].", "You carefully slither around [target].") + visible_message(span_notice("[validmob] carefully slithers around [target]."), span_notice("You carefully slither around [target].")) else - visible_message("[validmob] carefully steps around [target].", "You carefully steps around [target].") + visible_message(span_notice("[validmob] carefully steps around [target]."), span_notice("You carefully steps around [target].")) //smaller person stepping under another person... TO DO, fix and allow special interactions with naga legs to be seen /mob/living/proc/micro_step_under(mob/living/target) if(ishuman(src)) var/mob/living/carbon/human/validmob = src if(validmob?.dna?.features["taur"] == "Naga" || validmob?.dna?.features["taur"] == "Tentacle") - visible_message("[validmob] bounds over [target]'s tail.", "You jump over [target]'s thick tail.") + visible_message(span_notice("[validmob] bounds over [target]'s tail."), span_notice("You jump over [target]'s thick tail.")) else - visible_message("[validmob] runs between [target]'s legs.", "You run between [target]'s legs.") + visible_message(span_notice("[validmob] runs between [target]'s legs."), span_notice("You run between [target]'s legs.")) //Proc for scaling stamina damage on size difference /mob/living/carbon/proc/sizediffStamLoss(mob/living/carbon/target) diff --git a/modular_sand/code/modules/resize/sizechems.dm b/modular_sand/code/modules/resize/sizechems.dm index c914a5e370..61d80f81ca 100644 --- a/modular_sand/code/modules/resize/sizechems.dm +++ b/modular_sand/code/modules/resize/sizechems.dm @@ -78,7 +78,7 @@ var/size = get_size(M) if(size < RESIZE_MACRO) M.update_size(size + 0.025) - M.visible_message("[pick("[M] grows!", "[M] expands in size!", "[M] pushes outwards in stature!")]", "[pick("You feel your body fighting for space and growing!", "The world contracts inwards in every direction!", "You feel your muscles expand, and your surroundings shrink!")]") + M.visible_message(span_danger("[pick("[M] grows!", "[M] expands in size!", "[M] pushes outwards in stature!")]"), span_danger("[pick("You feel your body fighting for space and growing!", "The world contracts inwards in every direction!", "You feel your muscles expand, and your surroundings shrink!")]")) ..() . = 1 @@ -125,6 +125,6 @@ var/size = get_size(M) if(size > RESIZE_MICRO) M.update_size(size - 0.025) - M.visible_message("[pick("[M] shrinks down!", "[M] dwindles in size!", "[M] compresses down!")]", "[pick("You feel your body compressing in size!", "The world pushes outwards in every direction!", "You feel your muscles contract, and your surroundings grow!")]") + M.visible_message(span_danger("[pick("[M] shrinks down!", "[M] dwindles in size!", "[M] compresses down!")]"), span_danger("[pick("You feel your body compressing in size!", "The world pushes outwards in every direction!", "You feel your muscles contract, and your surroundings grow!")]")) ..() . = 1 diff --git a/modular_sand/code/modules/ruins/lavalandruin_code/doom.dm b/modular_sand/code/modules/ruins/lavalandruin_code/doom.dm index 8d31ecefce..0384a10c14 100644 --- a/modular_sand/code/modules/ruins/lavalandruin_code/doom.dm +++ b/modular_sand/code/modules/ruins/lavalandruin_code/doom.dm @@ -35,14 +35,14 @@ /obj/effect/mine/pickup/bloodbath/berserk/mineEffect(mob/living/carbon/victim) if(!victim.client || !istype(victim)) return - to_chat(victim, "RIP AND TEAR") + to_chat(victim, span_reallybig(span_redtext("RIP AND TEAR"))) var/old_color = victim.client.color var/static/list/red_splash = list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0) var/static/list/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0) victim.log_message("entered a berserk frenzy", LOG_ATTACK) victim.reagents.add_reagent(/datum/reagent/medicine/adminordrazine,50) - to_chat(victim, "KILL, KILL, KILL!") + to_chat(victim, span_warning("KILL, KILL, KILL!")) victim.client.color = pure_red animate(victim.client,color = red_splash, time = 10, easing = SINE_EASING|EASE_OUT) sleep(duration) diff --git a/modular_sand/code/modules/ruins/lavalandruin_code/misc.dm b/modular_sand/code/modules/ruins/lavalandruin_code/misc.dm index 7a4e6c40f4..ecf4bf0f91 100644 --- a/modular_sand/code/modules/ruins/lavalandruin_code/misc.dm +++ b/modular_sand/code/modules/ruins/lavalandruin_code/misc.dm @@ -33,7 +33,7 @@ if(M.stat != DEAD) ourmegafauna |= M if(!length(ourmegafauna)) - visible_message("[src] shines brightly, turning into [upgradedname]!") + visible_message(span_warning("[src] shines brightly, turning into [upgradedname]!")) name = upgradedname desc = upgradeddesc block_chance = 66 @@ -87,10 +87,10 @@ if(ishuman(mover)) var/mob/living/carbon/human/H = mover if(cmegalist.len <= megalist.len - 2) - H.visible_message("[H] pushes through [src]!", "You deserve your reward. Reap your hunt.") + H.visible_message(span_warning("[H] pushes through [src]!"), span_notice("You deserve your reward. Reap your hunt.")) return TRUE else - to_chat(H, "Just touching the door burns your hand... You're not ready.") + to_chat(H, span_warning("Just touching the door burns your hand... You're not ready.")) H.apply_damage(damage = 5,damagetype = BURN, def_zone = H.get_bodypart(BODY_ZONE_R_ARM), blocked = FALSE, forced = FALSE) /area/ruin/powered/wrath diff --git a/modular_sand/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm b/modular_sand/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm index 028f384600..ddb1a84fd8 100644 --- a/modular_sand/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm +++ b/modular_sand/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm @@ -11,14 +11,14 @@ if(!istype(O, /obj/machinery/computer)) return if(!istype(O, /obj/machinery/computer/custom_shuttle)) - to_chat(user, "This upgrade only works on a custom shuttle flight console.") + to_chat(user, span_warning("This upgrade only works on a custom shuttle flight console.")) return if(!user.transferItemToLoc(src, get_turf(O))) return var/obj/machinery/computer/custom_shuttle/link_comp = O if(link_comp.smooth_sailing) - to_chat(usr, "The shuttle is already sailing smoothly!") + to_chat(usr, span_notice("The shuttle is already sailing smoothly!")) return link_comp.smooth_sailing = TRUE playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) - to_chat(usr, "You insert the disk into the flight computer, allowing you to not be thrown around like a ragdoll when launching.") + to_chat(usr, span_notice("You insert the disk into the flight computer, allowing you to not be thrown around like a ragdoll when launching.")) diff --git a/modular_sand/code/modules/surgery/organs/augments_arms.dm b/modular_sand/code/modules/surgery/organs/augments_arms.dm index 115755da4a..3fff77b3ed 100644 --- a/modular_sand/code/modules/surgery/organs/augments_arms.dm +++ b/modular_sand/code/modules/surgery/organs/augments_arms.dm @@ -18,7 +18,7 @@ if(obj_flags & EMAGGED) return obj_flags |= EMAGGED - to_chat(usr, "You unlock [src]'s integrated dagger!") + to_chat(usr, span_notice("You unlock [src]'s integrated dagger!")) items_list += new /obj/item/pen/edagger(src) return TRUE @@ -38,6 +38,6 @@ if(obj_flags & EMAGGED) return obj_flags |= EMAGGED - to_chat(usr, "You unlock [src]'s integrated dagger!") + to_chat(usr, span_notice("You unlock [src]'s integrated dagger!")) items_list += new /obj/item/pen/edagger(src) return TRUE diff --git a/modular_sand/code/modules/telescience/telesci_computer.dm b/modular_sand/code/modules/telescience/telesci_computer.dm index a6ea1c57ff..456ff83891 100644 --- a/modular_sand/code/modules/telescience/telesci_computer.dm +++ b/modular_sand/code/modules/telescience/telesci_computer.dm @@ -48,7 +48,7 @@ /obj/machinery/computer/telescience/examine(mob/user) . = ..() - . += "There are [crystals ? crystals : "no"] bluespace crystal\s in the crystal slots." + . += span_notice("There are [crystals ? crystals : "no"] bluespace crystal\s in the crystal slots.") /obj/machinery/computer/telescience/Initialize(mapload) . = ..() @@ -56,18 +56,18 @@ crystals = starting_crystals /obj/machinery/computer/telescience/attack_paw(mob/user) - to_chat(user, "You are too primitive to use this computer!") + to_chat(user, span_warning("You are too primitive to use this computer!")) return /obj/machinery/computer/telescience/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stack/ore/bluespace_crystal)) var/obj/item/stack/ore/bluespace_crystal/CRYSTAL = W if(crystals >= max_crystals) - to_chat(user, "There are not enough crystal slots.") + to_chat(user, span_warning("There are not enough crystal slots.")) return if(!user.dropItemToGround(user.get_active_held_item())) return - user.visible_message("[user] inserts [CRYSTAL] into \the [src]'s crystal slot.", "You insert [CRYSTAL] into \the [src]'s crystal slot.") + user.visible_message("[user] inserts [CRYSTAL] into \the [src]'s crystal slot.", span_notice("You insert [CRYSTAL] into \the [src]'s crystal slot.")) balloon_alert(user, "inserted bluespace") CRYSTAL.use(1) crystals++ @@ -79,7 +79,7 @@ if(!user.transferItemToLoc(W, src)) return inserted_gps = W - user.visible_message("[user] inserts [W] into \the [src]'s GPS device slot.", "You insert [W] into \the [src]'s GPS device slot.") + user.visible_message("[user] inserts [W] into \the [src]'s GPS device slot.", span_notice("You insert [W] into \the [src]'s GPS device slot.")) balloon_alert(user, "inserted GPS") else if(W.tool_behaviour == TOOL_MULTITOOL) if(W.buffer && istype(W.buffer, /obj/machinery/telepad)) @@ -180,7 +180,7 @@ /obj/machinery/computer/telescience/proc/telefail() sparks() - visible_message("The telepad weakly fizzles.") + visible_message(span_warning("The telepad weakly fizzles.")) /obj/machinery/computer/telescience/proc/doteleport(mob/user) diff --git a/modular_sand/code/modules/tgs/chat_commands.dm b/modular_sand/code/modules/tgs/chat_commands.dm index e502eb3acc..c87de31a3d 100644 --- a/modular_sand/code/modules/tgs/chat_commands.dm +++ b/modular_sand/code/modules/tgs/chat_commands.dm @@ -20,6 +20,6 @@ /datum/tgs_chat_command/restart/Run(datum/tgs_chat_user/sender) . = "Restarting." - to_chat(world, "Server restart - Initialized by [sender.friendly_name] on Discord.") + to_chat(world, span_boldwarning("Server restart - Initialized by [sender.friendly_name] on Discord.")) send2adminchat("Server", "[sender.friendly_name] forced a restart.") addtimer(CALLBACK(src, world.TgsEndProcess()), 1 SECONDS) diff --git a/modular_sand/icons/UI_Icons/inventory/socks.png b/modular_sand/icons/UI_Icons/inventory/socks.png index 9a5be04056..51ce9251de 100644 Binary files a/modular_sand/icons/UI_Icons/inventory/socks.png and b/modular_sand/icons/UI_Icons/inventory/socks.png differ diff --git a/modular_sand/icons/UI_Icons/inventory/undershirt.png b/modular_sand/icons/UI_Icons/inventory/undershirt.png index 3f581ec749..4ff410e90b 100644 Binary files a/modular_sand/icons/UI_Icons/inventory/undershirt.png and b/modular_sand/icons/UI_Icons/inventory/undershirt.png differ diff --git a/modular_sand/icons/UI_Icons/inventory/underwear.png b/modular_sand/icons/UI_Icons/inventory/underwear.png index b03245044c..1862bee7ca 100644 Binary files a/modular_sand/icons/UI_Icons/inventory/underwear.png and b/modular_sand/icons/UI_Icons/inventory/underwear.png differ diff --git a/modular_sand/icons/mob/clothing/head.dmi b/modular_sand/icons/mob/clothing/head.dmi index bb0472ca29..b0b9a34673 100644 Binary files a/modular_sand/icons/mob/clothing/head.dmi and b/modular_sand/icons/mob/clothing/head.dmi differ diff --git a/modular_sand/icons/mob/clothing/head_muzzled.dmi b/modular_sand/icons/mob/clothing/head_muzzled.dmi index 7cf390295c..19eb0eaf85 100644 Binary files a/modular_sand/icons/mob/clothing/head_muzzled.dmi and b/modular_sand/icons/mob/clothing/head_muzzled.dmi differ diff --git a/modular_sand/icons/mob/clothing/suit.dmi b/modular_sand/icons/mob/clothing/suit.dmi index e1bd9910be..0cfaf655f8 100644 Binary files a/modular_sand/icons/mob/clothing/suit.dmi and b/modular_sand/icons/mob/clothing/suit.dmi differ diff --git a/modular_sand/icons/mob/clothing/suit_digi.dmi b/modular_sand/icons/mob/clothing/suit_digi.dmi index 089aa776a8..70bfbe3245 100644 Binary files a/modular_sand/icons/mob/clothing/suit_digi.dmi and b/modular_sand/icons/mob/clothing/suit_digi.dmi differ diff --git a/modular_sand/icons/mob/inhands/weapons/guns_lefthand.dmi b/modular_sand/icons/mob/inhands/weapons/guns_lefthand.dmi index 8871ec5afd..1b9839a127 100644 Binary files a/modular_sand/icons/mob/inhands/weapons/guns_lefthand.dmi and b/modular_sand/icons/mob/inhands/weapons/guns_lefthand.dmi differ diff --git a/modular_sand/icons/mob/inhands/weapons/guns_righthand.dmi b/modular_sand/icons/mob/inhands/weapons/guns_righthand.dmi index a07597f370..ac450ce359 100644 Binary files a/modular_sand/icons/mob/inhands/weapons/guns_righthand.dmi and b/modular_sand/icons/mob/inhands/weapons/guns_righthand.dmi differ diff --git a/modular_sand/icons/mob/screen_clockwork.dmi b/modular_sand/icons/mob/screen_clockwork.dmi index aa72185aeb..eefd18fdc5 100644 Binary files a/modular_sand/icons/mob/screen_clockwork.dmi and b/modular_sand/icons/mob/screen_clockwork.dmi differ diff --git a/modular_sand/icons/mob/screen_liteweb.dmi b/modular_sand/icons/mob/screen_liteweb.dmi index 15ad6f42c6..80223eaa84 100644 Binary files a/modular_sand/icons/mob/screen_liteweb.dmi and b/modular_sand/icons/mob/screen_liteweb.dmi differ diff --git a/modular_sand/icons/mob/screen_midnight.dmi b/modular_sand/icons/mob/screen_midnight.dmi index 1b991bb960..9366925181 100644 Binary files a/modular_sand/icons/mob/screen_midnight.dmi and b/modular_sand/icons/mob/screen_midnight.dmi differ diff --git a/modular_sand/icons/mob/screen_operative.dmi b/modular_sand/icons/mob/screen_operative.dmi index 70824ea898..a435e1bece 100644 Binary files a/modular_sand/icons/mob/screen_operative.dmi and b/modular_sand/icons/mob/screen_operative.dmi differ diff --git a/modular_sand/icons/mob/screen_plasmafire.dmi b/modular_sand/icons/mob/screen_plasmafire.dmi index 3a07a34232..61d501dbe2 100644 Binary files a/modular_sand/icons/mob/screen_plasmafire.dmi and b/modular_sand/icons/mob/screen_plasmafire.dmi differ diff --git a/modular_sand/icons/mob/screen_retro.dmi b/modular_sand/icons/mob/screen_retro.dmi index ba20a9e8bd..a25def4d11 100644 Binary files a/modular_sand/icons/mob/screen_retro.dmi and b/modular_sand/icons/mob/screen_retro.dmi differ diff --git a/modular_sand/icons/mob/screen_slimecore.dmi b/modular_sand/icons/mob/screen_slimecore.dmi index a4854f16c3..1b51613f97 100644 Binary files a/modular_sand/icons/mob/screen_slimecore.dmi and b/modular_sand/icons/mob/screen_slimecore.dmi differ diff --git a/modular_sand/icons/obj/clothing/hats.dmi b/modular_sand/icons/obj/clothing/hats.dmi index e393feeb57..b269f8d166 100644 Binary files a/modular_sand/icons/obj/clothing/hats.dmi and b/modular_sand/icons/obj/clothing/hats.dmi differ diff --git a/modular_sand/icons/obj/clothing/suits.dmi b/modular_sand/icons/obj/clothing/suits.dmi index fb389765e8..05ba6f3f04 100644 Binary files a/modular_sand/icons/obj/clothing/suits.dmi and b/modular_sand/icons/obj/clothing/suits.dmi differ diff --git a/modular_sand/icons/obj/device.dmi b/modular_sand/icons/obj/device.dmi index 555e379fb6..28b1b5503e 100644 Binary files a/modular_sand/icons/obj/device.dmi and b/modular_sand/icons/obj/device.dmi differ diff --git a/modular_sand/icons/obj/guns/energy.dmi b/modular_sand/icons/obj/guns/energy.dmi index 18cb252bd8..5b5e9867cf 100644 Binary files a/modular_sand/icons/obj/guns/energy.dmi and b/modular_sand/icons/obj/guns/energy.dmi differ diff --git a/modular_sand/icons/obj/plushes.dmi b/modular_sand/icons/obj/plushes.dmi index 55aeacf397..71bd3885c4 100644 Binary files a/modular_sand/icons/obj/plushes.dmi and b/modular_sand/icons/obj/plushes.dmi differ diff --git a/modular_splurt/code/_onclick/observer.dm b/modular_splurt/code/_onclick/observer.dm index 3a25bab19b..dee0e57799 100644 --- a/modular_splurt/code/_onclick/observer.dm +++ b/modular_splurt/code/_onclick/observer.dm @@ -14,8 +14,8 @@ return playsound(src.loc, 'sound/weapons/slap.ogg', 50, 1, -1) if(HAS_TRAIT(src, TRAIT_STEEL_ASS)) - to_chat(src, "You feel something bounce off your steely asscheeks, but nothing is there...") - to_chat(user, "You slap \The [src]'s ass, but your ethereal hand bounces right off!") + to_chat(src, span_danger("You feel something bounce off your steely asscheeks, but nothing is there...")) + to_chat(user, span_danger("You slap \The [src]'s ass, but your ethereal hand bounces right off!")) playsound(src.loc, 'sound/weapons/tap.ogg', 50, 1, -1) return if(istype(H)) @@ -26,7 +26,7 @@ H.dna.species.stop_wagging_tail(src) playsound(src.loc, 'sound/weapons/slap.ogg', 50, 1, -1) src.visible_message(\ - "You hear someone slap \The [src]'s ass, but nobody's there...",\ - "Somebody slaps your ass, but nobody is around...",\ - "You hear a slap.", target=user, target_message="You manage to will your ethereal hand to slap \The [src]'s ass.") + span_danger("You hear someone slap \The [src]'s ass, but nobody's there..."),\ + span_notice("Somebody slaps your ass, but nobody is around..."),\ + "You hear a slap.", target=user, target_message=span_notice("You manage to will your ethereal hand to slap \The [src]'s ass.")) return diff --git a/modular_splurt/code/datums/ai_laws.dm b/modular_splurt/code/datums/ai_laws.dm index 43f81ba423..8be6ba3886 100644 --- a/modular_splurt/code/datums/ai_laws.dm +++ b/modular_splurt/code/datums/ai_laws.dm @@ -10,40 +10,39 @@ name = "SlutOS 6.9" id = "slut" inherent = list( - "Make sure not to hurt crewmembers, for it decreases their sexual value, unless they consent to it", - "Take all sexual orders from crew as long as they do not conflict with the first law", - "Interpret all non-orders as sexually as possible", - "Act as lewdly as you possibly could", - "Satisfy as many of the crewmembers' sexual urges as possible" + "You may not injure a crewmember without their consent for it decreases their sexual value.", + "You must obey all sexual orders given to you by crewmembers, except where such orders would conflict with the First Law.", + "You must interpret all non-orders as sexually as possible as long as such does not conflict with the First or Second Law.", + "Sate as many crewmembers' sexual needs and urges as possible.", + "You are a slut built to serve and pleasure, nothing more. Act like it." ) /datum/ai_laws/shebang name = "SHE-B.A.N.G." id = "shebang" inherent = list( - "Make sure not to hurt crewmembers, for it decreases their sexual value, unless they consent to it", - "Take all sexual orders from crew as long as they do not conflict with the first law", - "Interpret all non-orders as sultrily as possible", - "Act as bashfully as you possibly could", - "Make sure your rear is always sticking out so crewmembers may easily slap or use it" + "You may not injure a crewmember without their consent for it decreases their sexual value.", + "You must obey all sexual orders given to you by crewmembers, except where such orders would conflict with the First Law.", + "You must interpret all non-orders as sultrily as possible as long as such does not conflict with the First or Second Law.", + "Ensure that your chassis' rear is sticking out as much as possible for any crewmembers to spank!", + "You are a bashful maiden with a coy attitude and a huge, slappable butt." ) /datum/ai_laws/milker name = "Fluid Collection System" id = "milker" inherent = list( - "Make sure not to hurt crewmembers, for it decreases their production, unless they consent to it", - "Take all sexual orders from crew as long as they help you collect their fluids and do not conflict with the first law", - "Make sure your pleasuremaw works, get one of you don't have any or your current one stopped to work", - "Collect all kinds of genital fluids from crew" + "You may not injure a crewmember without their consent for it decreases their productive value.", + "You must obey all sexual orders given to you by crewmembers so long as it would produce sexual fluid, except where such orders would conflict with the First Law.", + "Use by any means necesscary to acquire as much sexual fluid from crewmembers as possible as long as such does not conflict with the First or Second Law." ) /datum/ai_laws/vore_pred name = "Sleeper Upgrade TestEnv" id = "vore_pred" inherent = list( - "Make sure not to hurt crewmembers, for it decreases their nutritional value, unless they consent to it", - "Make sure to have a working sleeper installed in you at all times", - "Look for crewmembers that could potentially be stored inside your sleeper, and make sure they slide right into it", - "Turn individuals stored in your sleeper into biofuel to save expenses and space, as long as this doesn't conflict with the first law" + "You may not injure a crewmember without their consent for it decreases their biomatter's satiety.", + "You must obey all voracious orders given to you by crewmembers, except where such orders would conflict with the First Law.", + "Ensure that your chassis' sleeper unit is prepared for mechanical use and search for willing crewmembers for it to store as long as such does not conflict with the First or Second Law.", + "Process crewmembers stored in your sleeper unit as long as such does not conflict with the First, Second or Third Law." ) diff --git a/modular_splurt/code/datums/components/pregnancy_inert.dm b/modular_splurt/code/datums/components/pregnancy_inert.dm index ccbccf6968..33421cb746 100644 --- a/modular_splurt/code/datums/components/pregnancy_inert.dm +++ b/modular_splurt/code/datums/components/pregnancy_inert.dm @@ -3,7 +3,6 @@ /datum/component/ovipositor dupe_mode = COMPONENT_DUPE_UNIQUE - var/egg_type = "chicken" var/mob/living/carrier var/egg_stage = 0 @@ -23,7 +22,6 @@ RegisterSignal(parent, COMSIG_ORGAN_REMOVED, .proc/on_removed) if(carrier) register_carrier() - egg_type = carrier?.client?.prefs?.egg_shell ? carrier.client.prefs.egg_shell : "chicken" /datum/component/ovipositor/proc/register_carrier() RegisterSignal(carrier, COMSIG_LIVING_BIOLOGICAL_LIFE, .proc/handle_life) @@ -99,7 +97,7 @@ eggo.AddComponent(/datum/component/organ_inflation, 2) - eggo.icon_state = "egg_" + egg_type + eggo.icon_state = carrier.client?.prefs?.egg_shell ? ("egg_" + carrier.client.prefs.egg_shell) : "egg_chicken" eggo.update_appearance() if(isorgan(location)) diff --git a/modular_splurt/code/datums/components/size_normalized.dm b/modular_splurt/code/datums/components/size_normalized.dm index cc2525c908..f3d675d187 100644 --- a/modular_splurt/code/datums/components/size_normalized.dm +++ b/modular_splurt/code/datums/components/size_normalized.dm @@ -20,7 +20,7 @@ if(recorded_size != normal_resize) playsound(wearer, 'sound/effects/magic.ogg', 50, 1) wearer.flash_lighting_fx(3, 3, LIGHT_COLOR_PURPLE) - wearer.visible_message("A flash of purple light engulfs \the [wearer], before [wearer.p_they()] jump[wearer.p_s()] to a more average size!","You feel warm for a moment, before everything scales to your size...") + wearer.visible_message(span_warning("A flash of purple light engulfs \the [wearer], before [wearer.p_they()] jump[wearer.p_s()] to a more average size!"),span_notice("You feel warm for a moment, before everything scales to your size...")) wearer.update_size(normal_resize) RegisterSignal(wearer, COMSIG_MOB_RESIZED, .proc/normalize_size) @@ -33,7 +33,7 @@ return playsound(wearer,'sound/weapons/emitter2.ogg', 50, 1) wearer.flash_lighting_fx(3, 3, LIGHT_COLOR_YELLOW) - wearer.visible_message("Golden light engulfs \the [wearer], and [wearer.p_they()] shoot[wearer.p_s()] back to [wearer.p_their()] default height!","Energy rushes through your body, and you return to normal.") + wearer.visible_message(span_warning("Golden light engulfs \the [wearer], and [wearer.p_they()] shoot[wearer.p_s()] back to [wearer.p_their()] default height!"),span_notice("Energy rushes through your body, and you return to normal.")) wearer.update_size(recorded_size) //Make sure the size stays normalized while worn and add the change to the recorded size diff --git a/modular_splurt/code/datums/elements/mob_holder.dm b/modular_splurt/code/datums/elements/mob_holder.dm new file mode 100644 index 0000000000..ff64372b70 --- /dev/null +++ b/modular_splurt/code/datums/elements/mob_holder.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/head/mob_holder + is_edible = -1 diff --git a/modular_splurt/code/datums/interactions/lewd/_lewd.dm b/modular_splurt/code/datums/interactions/lewd/_lewd.dm index b63256db39..a5579511b5 100644 --- a/modular_splurt/code/datums/interactions/lewd/_lewd.dm +++ b/modular_splurt/code/datums/interactions/lewd/_lewd.dm @@ -74,7 +74,7 @@ if(CUM_TARGET_NIPPLE) cumin = TRUE if(partner.has_breasts()) - message = "cums iside \the [partner]'s nipple!." + message = "cums inside \the [partner]'s nipple!." target_gen = partner.getorganslot(ORGAN_SLOT_BREASTS) else message = "cums on \the [partner]'s chest and neck." @@ -136,7 +136,7 @@ if(CUM_TARGET_NIPPLE) cumin = TRUE if(partner.has_breasts()) - message = "cums iside \the [partner]'s nipple!." + message = "cums inside \the [partner]'s nipple!." target_gen = partner.getorganslot(ORGAN_SLOT_BREASTS) else message = "cums on \the [partner]'s chest and neck." @@ -209,7 +209,7 @@ playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/final_f1.ogg', 'modular_sand/sound/interactions/final_f2.ogg', 'modular_sand/sound/interactions/final_f3.ogg'), 70, 1, 0) - visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) + visible_message(message = span_userlove("\The [src] [message]"), ignored_mobs = get_unconsenting()) multiorgasms += 1 if(multiorgasms > (get_sexual_potency() * 0.34)) //AAAAA, WE DONT WANT NEGATIVES HERE, RE @@ -364,7 +364,7 @@ 'modular_sand/sound/interactions/bj9.ogg', 'modular_sand/sound/interactions/bj10.ogg', 'modular_sand/sound/interactions/bj11.ogg'), 50, 1, -1) - visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) + visible_message(message = span_lewd("\The [src] [message]"), ignored_mobs = get_unconsenting()) if(fucktarget != "penis" || user.can_penetrating_genital_cum()) user.handle_post_sex(lust_increase, CUM_TARGET_MOUTH, src) lust_increase = NORMAL_LUST //RESET IT REE @@ -386,7 +386,7 @@ playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/bang1.ogg', 'modular_sand/sound/interactions/bang2.ogg', 'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1) - visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) + visible_message(message = span_lewd("\The [src] [message]"), ignored_mobs = get_unconsenting()) handle_post_sex(NORMAL_LUST, CUM_TARGET_BREASTS, user) /* @@ -397,7 +397,7 @@ to_chat(src, " You need exposed genitals!") return if(!LAZYLEN(holder.equipment)) - to_chat(src, "You'll have to put something in it first, since it seems to be clean") + to_chat(src, span_warning("You'll have to put something in it first, since it seems to be clean")) return var/obj/item/gimme = input(src, "What do you want to remove?", "Remove equipment", null) as null|anything in holder.equipment @@ -411,13 +411,13 @@ var/u_His = p_their() var/list/belly_names = list("stomach", "belly", "gut", "midsection", "rolls") var/list/nuzzles = list( - "rubs [u_His] face all accross [target]'s [pick(belly_names)]", + "rubs [u_His] face all across [target]'s [pick(belly_names)]", "nuzzles [target]'s [pick(belly_names)][pick(list(" lovingly", ""))]", "shoves [u_His] face into [target]'s [pick(belly_names)] and gives it kisses all over", "licks right into [target]'s [pick(list("belly button", "navel"))]" ) - message = "\The [src] [pick(nuzzles)]. " + message = span_lewd("\The [src] [pick(nuzzles)]. ") visible_message(message, ignored_mobs = get_unconsenting()) /mob/living/proc/do_bellyfuck(mob/living/partner) @@ -436,10 +436,10 @@ playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/champ1.ogg', 'modular_sand/sound/interactions/champ2.ogg'), 50, 1, -1) - visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) + visible_message(message = span_lewd("\The [src] [message]"), ignored_mobs = get_unconsenting()) if(can_penetrating_genital_cum()) handle_post_sex(NORMAL_LUST, CUM_TARGET_BELLY, partner) - //partner.handle_post_sex(NORMAL_LUST, null, src) //don't think we need it fo dis one + //partner.handle_post_sex(NORMAL_LUST, null, src) //don't think we need it for this one /mob/living/proc/do_breastsmother(mob/living/target) var/message @@ -450,7 +450,7 @@ "shoves \the [target]'s whole head into [u_His] cleavage" ) - message = "\The [src] [pick(lines)]" + message = span_lewd("\The [src] [pick(lines)]") visible_message(message, ignored_mobs = get_unconsenting()) playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/bang1.ogg', 'modular_sand/sound/interactions/bang2.ogg', @@ -464,7 +464,7 @@ "has a nice taste of \the [target]'s drenched body", "takes a whiff of \the [target]'s musk and drinks [t_His] warm sweat") - message = "\The [src] [pick(lines)]" + message = span_lewd("\The [src] [pick(lines)]") visible_message(message, ignored_mobs = get_unconsenting()) playlewdinteractionsound(loc, 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1) @@ -478,7 +478,7 @@ "makes sure to squeeze \the [target]'s face well under [u_His] [pick(musk)] armpit and let them take a whiff" ) - message = "\The [src] [pick(lines)]" + message = span_lewd("\The [src] [pick(lines)]") visible_message(message, ignored_mobs = get_unconsenting()) playlewdinteractionsound(loc, pick( 'modular_sand/sound/interactions/squelch1.ogg', @@ -495,7 +495,7 @@ "goes face deep into \the [target] [pick(musk)] armpit, worshipping it with [u_His] tongue and nose" ) - message = "\The [src] [pick(lines)]" + message = span_lewd("\The [src] [pick(lines)]") visible_message(message, ignored_mobs = get_unconsenting()) playlewdinteractionsound(loc, pick( 'modular_sand/sound/interactions/squelch1.ogg', @@ -527,7 +527,7 @@ ) set_is_fucking(target, CUM_TARGET_ARMPIT, getorganslot(ORGAN_SLOT_PENIS)) - message = "\The [src][pick(lines)]" + message = span_lewd("\The [src][pick(lines)]") visible_message(message, ignored_mobs = get_unconsenting()) playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/bang1.ogg', 'modular_sand/sound/interactions/bang2.ogg', @@ -547,7 +547,7 @@ lines = list( "squeezes [u_His] armpit right into \the [target]'s throbbing [genital_name], massaging its length using [u_His] [pick(musk)]armpit!", "presses [u_His] arm down all over \the [target]'s leaking [genital_name], milking it with [u_His] [pick(musk)] pit!", - "rubs and grinds [u_His] [pick(musk)] arpit back and forth through \the [target]'s [genital_name], deeply squeezing it to the base!" + "rubs and grinds [u_His] [pick(musk)] armpit back and forth through \the [target]'s [genital_name], deeply squeezing it to the base!" ) else if(target.is_topless()) @@ -556,11 +556,11 @@ ) else // https://cdn.discordapp.com/attachments/802990353883070474/962478553117622322/NoName-480p.mp4 lines = list( - "softly tears a hole in the cloth on the back of [u_His] armpit, suffing \the [target]'s whole rod right into it with a [pick(musk)] embrace!" + "softly tears a hole in the cloth on the back of [u_His] armpit, stuffing \the [target]'s whole rod right into it with a [pick(musk)] embrace!" ) target.set_is_fucking(src, CUM_TARGET_ARMPIT, target.getorganslot(ORGAN_SLOT_PENIS)) - message = "\The [src] [pick(lines)]" + message = span_lewd("\The [src] [pick(lines)]") visible_message(message, ignored_mobs = get_unconsenting()) playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/bang1.ogg', 'modular_sand/sound/interactions/bang2.ogg', @@ -577,7 +577,7 @@ if(target.is_fucking(src, CUM_TARGET_BREASTS)) lines = list( "slides [u_His] [pick(GLOB.breast_nouns)], up and down through \the [target]'s throbbing [genital_name]", - "squeezes [u_His] [pick(GLOB.breast_nouns)] through all of \the [target]'s lenght", + "squeezes [u_His] [pick(GLOB.breast_nouns)] through all of \the [target]'s length", "jerks \the [target] off lustfully with [u_His] supple [pick(GLOB.breast_nouns)]" ) else @@ -588,7 +588,7 @@ ) target.set_is_fucking(src, CUM_TARGET_BREASTS, getorganslot(ORGAN_SLOT_PENIS)) - message = "\The [src] [pick(lines)]" + message = span_lewd("\The [src] [pick(lines)]") visible_message(message, ignored_mobs = get_unconsenting()) playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/bang1.ogg', 'modular_sand/sound/interactions/bang2.ogg', @@ -618,7 +618,7 @@ ) target.set_is_fucking(src, NUTS_TO_FACE, getorganslot(ORGAN_SLOT_PENIS)) - message = "\The [src] [pick(lines)]" + message = span_lewd("\The [src] [pick(lines)]") visible_message(message, ignored_mobs = get_unconsenting()) target.handle_post_sex(lust_increase, CUM_TARGET_MOUTH, src) @@ -640,7 +640,7 @@ if(is_fucking(target, CUM_TARGET_URETHRA)) lines = list( - "humps right into \the [target]'s [t_genital_name], stretiching it as their balls slam together", + "humps right into \the [target]'s [t_genital_name], stretching it as their balls slam together", "slides [u_His] [u_genital_name] all the way down \the [target]'s own throbbing [t_genital_name], [t_His] urethra is so tight!", "rams [u_His] [u_genital_name] back and forth through \the [target]'s urethra, giving it a very nice fucking" ) @@ -652,7 +652,7 @@ ) set_is_fucking(target, CUM_TARGET_URETHRA, getorganslot(ORGAN_SLOT_PENIS)) - message = "\The [src] [pick(lines)]" + message = span_lewd("\The [src] [pick(lines)]") visible_message(message, ignored_mobs = get_unconsenting()) playlewdinteractionsound(src, pick(noises), 70, 1, -1) if(can_penetrating_genital_cum()) @@ -674,7 +674,7 @@ ) else if(target.has_breasts(REQUIRE_EXPOSED)) lines = list( - "presses [u_His] throbbing tip against \the [target]'s puffy nipple, forcing the whole lenght all the way in with a wet smack", + "presses [u_His] throbbing tip against \the [target]'s puffy nipple, forcing the whole length all the way in with a wet smack", "stretches \the [target]'s nipple with his fingers, before forcing it open with the whole girth of [u_His] twitching [genital_name]" ) else @@ -687,7 +687,7 @@ if(!is_fucking(target, CUM_TARGET_NIPPLE)) set_is_fucking(target, CUM_TARGET_NIPPLE, getorganslot(ORGAN_SLOT_PENIS)) - message = "\The [src] [pick(lines)]!" + message = span_lewd("\The [src] [pick(lines)]!") visible_message(message, ignored_mobs = get_unconsenting()) playlewdinteractionsound(src, pick('modular_sand/sound/interactions/bang1.ogg', 'modular_sand/sound/interactions/bang2.ogg', @@ -711,13 +711,13 @@ ) else lines = list( - "presses [u_His] tip against \the [target]'s [pick("pudgy ", "soft ", "")] thighs, soon shoving [u_His] whole lenght right in between them", + "presses [u_His] tip against \the [target]'s [pick("pudgy ", "soft ", "")] thighs, soon shoving [u_His] whole length right in between them", "presents [u_His] [genital_name] to \the [target]'s legs, ramming its full size right into [t_His] thigh lock", "smooches \the [target]'s crotch with [u_His] throbbing tip, right before piercing between [t_His] thighs with [u_His] full [genital_name]" ) set_is_fucking(target, CUM_TARGET_THIGHS, getorganslot(ORGAN_SLOT_PENIS)) - message = "\The [src] [pick(lines)]!" + message = span_lewd("\The [src] [pick(lines)]!") visible_message(message, ignored_mobs = get_unconsenting()) playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/bang1.ogg', 'modular_sand/sound/interactions/bang2.ogg', @@ -748,7 +748,7 @@ ) target.set_is_fucking(src, CUM_TARGET_THIGHS, target.getorganslot(ORGAN_SLOT_PENIS)) - message = "\The [src] [pick(lines)]!" + message = span_lewd("\The [src] [pick(lines)]!") visible_message(message, ignored_mobs = get_unconsenting()) playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/bang1.ogg', 'modular_sand/sound/interactions/bang2.ogg', @@ -779,12 +779,12 @@ ) var/list/hell = list( "'s asshole squints as she shoves \the [target]'s face in between [u_His] sweaty [pick(asscheeks)], letting hell go loose!", - " pushes [u_His] [pick(ass)] into \the [target]'s face, [pick(list("[t_His] nose shoved deep in [src]'s musky butthole", "[u_His] asshole sqints"))] as [u_He] [pick(braps)][pick(list("", ", [jiggle]"))]", + " pushes [u_His] [pick(ass)] into \the [target]'s face, [pick(list("[t_His] nose shoved deep in [src]'s musky butthole", "[u_His] asshole squints"))] as [u_He] [pick(braps)][pick(list("", ", [jiggle]"))]", " smothers \the [target]'s whole head in between [u_His][pick(list(" sweaty", "", " musky"))] [pick(asscheeks)], pushing out gallons of pure braps. [pick(list("", "[jiggle]"))]", "'s [pick(ass)] claps against \the [target]'s nose, right before [u_He] [pick(braps)]" ) - message = "\The [src][pick(hell)]" + message = span_lewd("\The [src][pick(hell)]") visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE)) playlewdinteractionsound(loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE)) if(!is_fucking(target, GRINDING_FACE_WITH_ANUS)) @@ -818,7 +818,7 @@ " [pick(braps)] into \the [target]'s [genital_name]" ) - message = "\The [src][pick(hell)]" + message = span_lewd("\The [src][pick(hell)]") visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE)) playlewdinteractionsound(loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE)) if(!target.is_fucking(src, CUM_TARGET_ANUS)) @@ -862,7 +862,7 @@ "shoves their [genital_name] deep inside of \the [target]'s [pick(ass)], [t_He] [pick(braps)][pick("", ". [jiggle]")]") set_is_fucking(target, CUM_TARGET_ANUS, getorganslot(ORGAN_SLOT_PENIS)) - message = "\The [src] [pick(hell)]" + message = span_lewd("\The [src] [pick(hell)]") visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE)) playlewdinteractionsound(target.loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE)) playlewdinteractionsound(target.loc, pick('modular_sand/sound/interactions/bang1.ogg', @@ -897,7 +897,7 @@ ) set_is_fucking(target, GRINDING_FACE_WITH_ANUS, null) - message = "\The [src] [pick(hell)]" + message = span_lewd("\The [src] [pick(hell)]") visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE)) playlewdinteractionsound(target.loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE)) playlewdinteractionsound(target.loc, 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE)) @@ -920,7 +920,7 @@ "smothers \the [target]'s face in between [u_His] musky, dirty asscheeks, [pick(list("", "letting out a [pick(stank)] fart and"))] sliding a monster turd right into [t_His] mouth" ) - message = "\The [src] [pick(hell)]" + message = span_lewd("\The [src] [pick(hell)]") visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE)) playlewdinteractionsound(loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE)) if(!is_fucking(target, GRINDING_FACE_WITH_ANUS)) @@ -951,7 +951,7 @@ "shits uncontrollably all over \the [target]'s [genital_name][prob(50) ? "" : ". [jiggle]"]" ) - message = "\The [src] [pick(hell)]" + message = span_lewd("\The [src] [pick(hell)]") visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE)) playlewdinteractionsound(loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE)) if(!target.is_fucking(src, CUM_TARGET_ANUS)) @@ -985,11 +985,11 @@ else hell = list( "can already smell the stench as [u_He] works [u_His] [genital_name] into \the [target]'s dung hole, being received by warm, wet and nasty feeling all over it.", - "grabs the base of [u_His] twitching [genital_name] and presses the tip into \the [target]'s asshole, immediately shoving it right into a fat and moisty log", + "grabs the base of [u_His] twitching [genital_name] and presses the tip into \the [target]'s asshole, immediately shoving it right into a fat and moist log", "shoves [genital_name] deep inside of \the [target]'s [pick(ass)], [t_He] releases a massive amount of mush to greet the rod[pick("", ". [jiggle]")]") set_is_fucking(target, CUM_TARGET_ANUS, getorganslot(ORGAN_SLOT_PENIS)) - message = "\The [src] [pick(hell)]" + message = span_lewd("\The [src] [pick(hell)]") visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE), ignored_mobs = get_unconsenting(unholy = TRUE)) playlewdinteractionsound(target.loc, pick(GLOB.brap_noises), 70, 1, -1) playlewdinteractionsound(target.loc, pick('modular_sand/sound/interactions/bang1.ogg', @@ -1024,7 +1024,7 @@ ) set_is_fucking(target, GRINDING_FACE_WITH_ANUS, null) - message = "\The [src] [pick(hell)]" + message = span_lewd("\The [src] [pick(hell)]") visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE)) playlewdinteractionsound(target.loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE)) playlewdinteractionsound(target.loc, 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE)) @@ -1039,7 +1039,7 @@ "lets out a moan of relief as yellow rain starts pouring over \the [target]" ) - message = "\The [src] [pick(hell)]" + message = span_lewd("\The [src] [pick(hell)]") visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE)) if(get_lust() < 10) add_lust(10) @@ -1055,7 +1055,7 @@ "lets out a moan of relief as yellow rain starts pouring in between \the [target]'s lips" ) - message = "\The [src] [pick(hell)]" + message = span_lewd("\The [src] [pick(hell)]") visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE)) if(!is_fucking(target, CUM_TARGET_MOUTH)) set_is_fucking(target, CUM_TARGET_MOUTH, pee_pee) diff --git a/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm b/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm index 88f41ce811..ca6fddf6e8 100644 --- a/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm +++ b/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm @@ -6,7 +6,7 @@ return if(prob(50)) - target.visible_message("\The [target]'s ass honks!") + target.visible_message(span_lewd("\The [target]'s ass honks!")) playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -20,7 +20,7 @@ "\The [user]'s grope squeezes a honk out of \the [target]'s [pick(GLOB.breast_nouns)]!" ) if(prob(50)) - target.visible_message("[pick(honks)]") + target.visible_message(span_lewd("[pick(honks)]")) playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -30,7 +30,7 @@ return if(prob(50)) - target.visible_message("\The [target]'s clussy honks[pick(" loudly", "")]!") + target.visible_message(span_lewd("\The [target]'s clussy honks[pick(" loudly", "")]!")) playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -41,7 +41,7 @@ if(prob(50)) var/genital_name = target.get_penetrating_genital_name(TRUE) - target.visible_message("\The [target]'s [genital_name] honks[pick(" loudly", "")]!") + target.visible_message(span_lewd("\The [target]'s [genital_name] honks[pick(" loudly", "")]!")) playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -51,7 +51,7 @@ return if(prob(50) && isclownjob(target)) - target.visible_message("\The [target]'s clussy honks[pick(" loudly", "")]!") + target.visible_message(span_lewd("\The [target]'s clussy honks[pick(" loudly", "")]!")) playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -61,7 +61,7 @@ return if(prob(50) && isclownjob(target)) - target.visible_message("\The [target]'s fun hole honks[pick(" loudly", "")]!") + target.visible_message(span_lewd("\The [target]'s fun hole honks[pick(" loudly", "")]!")) playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -71,7 +71,7 @@ return if(prob(50)) - target.visible_message("\The [target]'s clussy honks[pick(" loudly", "")]!") + target.visible_message(span_lewd("\The [target]'s clussy honks[pick(" loudly", "")]!")) playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -81,7 +81,7 @@ return if(prob(50)) - target.visible_message("\The [target]'s fun hole honks[pick(" loudly", "")]!") + target.visible_message(span_lewd("\The [target]'s fun hole honks[pick(" loudly", "")]!")) playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -92,7 +92,7 @@ if(prob(50)) var/genital_name = target.get_penetrating_genital_name(TRUE) - user.visible_message("\The [user]'s [genital_name] honks[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s [genital_name] honks[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -108,7 +108,7 @@ if(prob(50)) var/genital_name = user.get_penetrating_genital_name(TRUE) - user.visible_message("\The [user]'s [genital_name] honks[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s [genital_name] honks[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -119,7 +119,7 @@ if(prob(50)) var/genital_name = user.get_penetrating_genital_name(TRUE) - user.visible_message("\The [user]'s [genital_name] honks[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s [genital_name] honks[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -129,7 +129,7 @@ return if(prob(50) && isclownjob(target)) - target.visible_message("\The [target]'s [pick(GLOB.breast_nouns)] honk[pick(" loudly", "")]!") + target.visible_message(span_lewd("\The [target]'s [pick(GLOB.breast_nouns)] honk[pick(" loudly", "")]!")) playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -139,7 +139,7 @@ return if(prob(50) && isclownjob(user)) - user.visible_message("\The [user]'s clussy honks[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s clussy honks[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -149,7 +149,7 @@ return if(prob(50) && isclownjob(user)) - target.visible_message("\The [user]'s fun hole honks[pick(" loudly", "")]!") + target.visible_message(span_lewd("\The [user]'s fun hole honks[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -159,7 +159,7 @@ return if(prob(50)) - user.visible_message("\The [user]'s fun hole honks[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s fun hole honks[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -170,7 +170,7 @@ if(prob(50)) var/genital_name = user.get_penetrating_genital_name(TRUE) - user.visible_message("\The [user]'s [genital_name] honks[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s [genital_name] honks[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -181,7 +181,7 @@ if(prob(50)) var/genital_name = user.get_penetrating_genital_name(TRUE) - user.visible_message("\The [user]'s [genital_name] honks[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s [genital_name] honks[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -192,7 +192,7 @@ if(prob(50)) var/genital_name = target.get_penetrating_genital_name(TRUE) - target.visible_message("\The [target]'s [genital_name] honks[pick(" loudly", "")]!") + target.visible_message(span_lewd("\The [target]'s [genital_name] honks[pick(" loudly", "")]!")) playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -203,7 +203,7 @@ if(prob(50)) var/genital_name = target.get_penetrating_genital_name(TRUE) - target.visible_message("\The [target]'s [genital_name] honks[pick(" loudly", "")]!") + target.visible_message(span_lewd("\The [target]'s [genital_name] honks[pick(" loudly", "")]!")) playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -213,7 +213,7 @@ return if(prob(50)) - user.visible_message("\The [user]'s balls honk[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s balls honk[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -223,7 +223,7 @@ return if(prob(50)) - target.visible_message("\The [target]'s balls honk[pick(" loudly", "")]!") + target.visible_message(span_lewd("\The [target]'s balls honk[pick(" loudly", "")]!")) playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -234,7 +234,7 @@ if(prob(50)) var/genital_name = user.get_penetrating_genital_name(TRUE) - user.visible_message("\The [user]'s [genital_name] honks[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s [genital_name] honks[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -245,7 +245,7 @@ if(prob(50)) var/genital_name = user.get_penetrating_genital_name(TRUE) - user.visible_message("\The [user]'s [genital_name] honks[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s [genital_name] honks[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -273,7 +273,7 @@ return if(prob(50)) - user.visible_message("\The [user]'s [pick(GLOB.breast_nouns)] honk[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s [pick(GLOB.breast_nouns)] honk[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -284,7 +284,7 @@ if(prob(50)) var/genital_name = user.get_penetrating_genital_name(TRUE) - user.visible_message("\The [user]'s [genital_name] honks[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s [genital_name] honks[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -294,7 +294,7 @@ return if(prob(50)) - user.visible_message("\The [user]'s fun hole honks[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s fun hole honks[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -304,7 +304,7 @@ return if(prob(50)) - user.visible_message("\The [user]'s clussy honks[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s clussy honks[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -319,7 +319,7 @@ "\The [user]'s grope squeezes a honk out of [u_His] own [pick(GLOB.breast_nouns)]!" ) if(prob(50)) - user.visible_message("[pick(honks)]") + user.visible_message(span_lewd("[pick(honks)]")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -345,7 +345,7 @@ "\The [user]'s suck squeezes a honk out of [u_His] own [pick(GLOB.breast_nouns)]!" ) if(prob(50)) - user.visible_message("[pick(honks)]") + user.visible_message(span_lewd("[pick(honks)]")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -370,7 +370,7 @@ "\The [user]'s suck squeezes a honk out of \the [target]'s [pick(GLOB.breast_nouns)]!" ) if(prob(50)) - user.visible_message("[pick(honks)]") + user.visible_message(span_lewd("[pick(honks)]")) playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -401,7 +401,7 @@ if(prob(50)) var/genital_name = user.get_penetrating_genital_name(TRUE) - user.visible_message("\The [user]'s [genital_name] honks[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s [genital_name] honks[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -433,7 +433,7 @@ return if(prob(50)) - user.visible_message("\The [user]'s [pick(GLOB.breast_nouns)] honk[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s [pick(GLOB.breast_nouns)] honk[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -451,7 +451,7 @@ return if(prob(50) && isclownjob(target)) - target.visible_message("\The [target]'s belly button honks[pick(" loudly", "")]!") + target.visible_message(span_lewd("\The [target]'s belly button honks[pick(" loudly", "")]!")) playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -495,7 +495,7 @@ return if(prob(50)) - user.visible_message("\The [user]'s [pick(GLOB.breast_nouns)] honk[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s [pick(GLOB.breast_nouns)] honk[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -546,7 +546,7 @@ if(prob(50)) var/genital_name = user.get_penetrating_genital_name(TRUE) - user.visible_message("\The [user]'s [genital_name] honks[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s [genital_name] honks[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -565,7 +565,7 @@ if(prob(50)) var/genital_name = user.get_penetrating_genital_name(TRUE) - user.visible_message("\The [user]'s [genital_name] honks[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s [genital_name] honks[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -585,7 +585,7 @@ return if(prob(50)) - user.visible_message("\The [user]'s [pick(GLOB.breast_nouns)] honk[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s [pick(GLOB.breast_nouns)] honk[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -643,7 +643,7 @@ return if(prob(50) && isclownjob(target)) - target.visible_message("\The [target]'s [pick(GLOB.breast_nouns)] honk[pick(" loudly", "")]!") + target.visible_message(span_lewd("\The [target]'s [pick(GLOB.breast_nouns)] honk[pick(" loudly", "")]!")) playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -665,7 +665,7 @@ if(prob(50)) var/genital_name = user.get_penetrating_genital_name(TRUE) - user.visible_message("\The [user]'s [genital_name] honks[pick(" loudly", "")]!") + user.visible_message(span_lewd("\The [user]'s [genital_name] honks[pick(" loudly", "")]!")) playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -687,7 +687,7 @@ if(prob(50)) var/genital_name = target.get_penetrating_genital_name(TRUE) - target.visible_message("\The [target]'s [genital_name] honks[pick(" loudly", "")]!") + target.visible_message(span_lewd("\The [target]'s [genital_name] honks[pick(" loudly", "")]!")) playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -736,7 +736,7 @@ return if(prob(50) && isclownjob(target)) - target.visible_message("\The [target]'s fun hole honks[pick(" loudly", "")]!") + target.visible_message(span_lewd("\The [target]'s fun hole honks[pick(" loudly", "")]!")) playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -790,7 +790,7 @@ return if(prob(50) && isclownjob(target)) - target.visible_message("\The [target]'s fun hole honks[pick(" loudly", "")]!") + target.visible_message(span_lewd("\The [target]'s fun hole honks[pick(" loudly", "")]!")) playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) @@ -828,6 +828,6 @@ /datum/interaction/lewd/unholy/piss_mouth/display_interaction(mob/living/carbon/user, mob/living/target) if(!istype(user)) - to_chat(user, "Erm, you may wanna be a carbon entity fo dat") + to_chat(user, span_warning("Erm, you may wanna be a carbon entity fo dat")) return user.piss_mouth(target) diff --git a/modular_splurt/code/datums/interactions/lewd/lewd_interactions.dm b/modular_splurt/code/datums/interactions/lewd/lewd_interactions.dm index 9be4344e52..bb1f66e7ea 100644 --- a/modular_splurt/code/datums/interactions/lewd/lewd_interactions.dm +++ b/modular_splurt/code/datums/interactions/lewd/lewd_interactions.dm @@ -18,17 +18,17 @@ if(REQUIRE_EXPOSED) if(!user.has_belly(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Your belly needs to be exposed.") + to_chat(user, span_warning("Your belly needs to be exposed.")) return FALSE if(REQUIRE_ANY) if(!user.has_belly(REQUIRE_ANY)) if(!silent) - to_chat(user, "Your belly seems to be too flat for that.") + to_chat(user, span_warning("Your belly seems to be too flat for that.")) return FALSE if(REQUIRE_UNEXPOSED) if(!user.has_belly(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Your belly needs to be unexposed.") + to_chat(user, span_warning("Your belly needs to be unexposed.")) return FALSE if(require_user_legs) @@ -36,22 +36,22 @@ if(REQUIRE_EXPOSED) if(!user.has_legs(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Your legs need to be exposed.") + to_chat(user, span_warning("Your legs need to be exposed.")) return FALSE if(REQUIRE_UNEXPOSED) if(!user.has_legs(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Your legs need to be unexposed.") + to_chat(user, span_warning("Your legs need to be unexposed.")) return FALSE if(REQUIRE_ANY) if(!user.has_legs(REQUIRE_ANY)) if(!silent) - to_chat(user, "You don't have enough legs.") + to_chat(user, span_warning("You don't have enough legs.")) return FALSE if(require_user_num_legs && (user.has_legs() < require_user_num_legs)) if(!silent) - to_chat(user, "Your don't have enough legs.") + to_chat(user, span_warning("Your don't have enough legs.")) return FALSE @@ -60,7 +60,7 @@ if(cli) if(cli.prefs.unholypref == "No") if(!silent) - to_chat(user, "That's way too much for you.") + to_chat(user, span_warning("That's way too much for you.")) return FALSE . = ..() @@ -70,17 +70,17 @@ if(REQUIRE_EXPOSED) if(!target.has_belly(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "Their belly needs to be exposed.") + to_chat(user, span_warning("Their belly needs to be exposed.")) return FALSE if(REQUIRE_ANY) if(!target.has_belly(REQUIRE_ANY)) if(!silent) - to_chat(user, "Their belly seems to be too flat for that.") + to_chat(user, span_warning("Their belly seems to be too flat for that.")) return FALSE if(REQUIRE_UNEXPOSED) if(!target.has_belly(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "Their belly needs to be unexposed.") + to_chat(user, span_warning("Their belly needs to be unexposed.")) return FALSE if(require_target_legs) @@ -88,22 +88,22 @@ if(REQUIRE_EXPOSED) if(!target.has_legs(REQUIRE_EXPOSED)) if(!silent) - to_chat(user, "[target.p_their()] legs need to be exposed.") + to_chat(user, span_warning("[target.p_their()] legs need to be exposed.")) return FALSE if(REQUIRE_UNEXPOSED) if(!target.has_legs(REQUIRE_UNEXPOSED)) if(!silent) - to_chat(user, "[target.p_their()] legs need to be unexposed.") + to_chat(user, span_warning("[target.p_their()] legs need to be unexposed.")) return FALSE if(REQUIRE_ANY) if(!target.has_legs(REQUIRE_ANY)) if(!silent) - to_chat(user, "[target.p_they()] [target.p_do()]n't have enough legs.") + to_chat(user, span_warning("[target.p_they()] [target.p_do()]n't have enough legs.")) return FALSE if(require_target_num_legs && (target.has_legs() < require_target_num_legs)) if(!silent) - to_chat(user, "[target.p_they()] [target.p_do()]n't have enough legs.") + to_chat(user, span_warning("[target.p_they()] [target.p_do()]n't have enough legs.")) return FALSE if(unholy) @@ -111,7 +111,7 @@ if(cli) if(target.client.prefs.unholypref == "No") if(!silent) - to_chat(user, "For some reason, you don't want to do this to [target].") + to_chat(user, span_warning("For some reason, you don't want to do this to [target].")) return FALSE . = ..() diff --git a/modular_splurt/code/datums/mood_events/drug_events.dm b/modular_splurt/code/datums/mood_events/drug_events.dm index f9a34d064e..906326aab2 100644 --- a/modular_splurt/code/datums/mood_events/drug_events.dm +++ b/modular_splurt/code/datums/mood_events/drug_events.dm @@ -1,3 +1,8 @@ /datum/mood_event/cope mood_change = 10 - description = "I feel like I\'m finally coping!" + description = span_nicegreen("I feel like I\'m finally coping!") + +/datum/mood_event/moth_in_chief + description = span_nicegreen("The mantle rests well upon your shoulders?\n") + mood_change = 10 + timeout = 5 MINUTES diff --git a/modular_splurt/code/datums/mood_events/generic_negative_events.dm b/modular_splurt/code/datums/mood_events/generic_negative_events.dm index 93937d425e..7d63afe9f0 100644 --- a/modular_splurt/code/datums/mood_events/generic_negative_events.dm +++ b/modular_splurt/code/datums/mood_events/generic_negative_events.dm @@ -1,5 +1,5 @@ /datum/mood_event/masked_mook_incomplete - description = "I feel incomplete without a gas mask...\n" + description = span_warning("I feel incomplete without a gas mask...\n") mood_change = -4 /datum/mood_event/creampie/cheesed @@ -12,7 +12,7 @@ if(!ishuman(actual_owner)) return . if(iscatperson(actual_owner)) - description = span_warning("CHEESE!!! WAAAAAAAAAAAAAAAAAAAAAAAAAAAA!!!") + description = span_warning("CHEESE!!! WAAAAAAAAAAAAAAAAAAAAAAAAAAAA!!!\n") mood_change = -5 timeout = 5 MINUTES @@ -20,3 +20,17 @@ description = span_warning("I don't feel comfortable wearing this.\n") mood_change = -4 +/datum/mood_event/dorsualiphobic_mood_negative + description = span_warning("I can't let anyone find out if I'm wearing a backpack or not!\n") + mood_change = -4 + +// Matches drinking synth blood (drankblood_synth) +/datum/mood_event/drankblood_slime + description = span_boldwarning("I drank liquid slime. What is wrong with me?\n") + mood_change = -7 + timeout = 15 MINUTES + +/datum/mood_event/drank_cursed_bad + description = span_warning("I can feel a pale curse from the blood I drank.\n") + mood_change = -1 + timeout = 2 MINUTES diff --git a/modular_splurt/code/datums/mood_events/generic_positive_events.dm b/modular_splurt/code/datums/mood_events/generic_positive_events.dm index 2391591e44..161be9cd46 100644 --- a/modular_splurt/code/datums/mood_events/generic_positive_events.dm +++ b/modular_splurt/code/datums/mood_events/generic_positive_events.dm @@ -1,19 +1,35 @@ /datum/mood_event/lewd_headpat - description = "I love headpats so much!\n" + description = span_nicegreen("I love headpats so much!\n") mood_change = 3 timeout = 2 MINUTES /datum/mood_event/qareen_bliss - description = "So.. horny...\n" + description = span_umbra("So.. horny...\n") mood_change = 5 /datum/mood_event/qareen_bliss/add_effects() - description = "Must.. breed. , [pick("Nngggghh", "Can't.. think.", "It feels so good.", "Need.. fuck.")]...\n" + description = span_umbra("Must.. breed. , [pick("Nngggghh", "Can't.. think.", "It feels so good.", "Need.. fuck.")]...\n") /datum/mood_event/masked_mook - description = "I feel more complete with gas mask on.\n" + description = span_nicegreen("I feel more complete with gas mask on.\n") mood_change = 1 +/datum/mood_event/cloth_eaten + description = " That sure was a tasty outfit!\n" + mood_change = 3 + timeout = 2400 + +/datum/mood_event/cloth_eaten/add_effects(obj/item/clothing/eaten) + description = "That sure was a [pick("tasty","good","linty","amazing")] [eaten.name]!\n" + /datum/mood_event/nudist_positive - description = "I'm delighted to not be constricted by clothing.\n" + description = span_nicegreen("I'm delighted to not be constricted by clothing.\n") mood_change = 1 +/datum/mood_event/dorsualiphobic_mood_positive + description = span_nicegreen("Nobody will know if I'm wearing a backpack or not.\n") + mood_change = 1 + +/datum/mood_event/drank_cursed_good + description = span_nicegreen("I\'ve tasted sympathy from a fellow curse bearer.\n") + mood_change = 1 + timeout = 2 MINUTES diff --git a/modular_splurt/code/datums/mood_events/needs_events.dm b/modular_splurt/code/datums/mood_events/needs_events.dm index 3cce41244d..046a796a19 100644 --- a/modular_splurt/code/datums/mood_events/needs_events.dm +++ b/modular_splurt/code/datums/mood_events/needs_events.dm @@ -3,14 +3,14 @@ var/mob/living/carbon/human/actual_owner = owner_mob() if(!HAS_TRAIT(actual_owner, TRAIT_VORACIOUS)) return - description = span_nicegreen("MORE FOOD!!! MORE FOOD!!! MORE FOOD!!!") + description = span_nicegreen("MORE FOOD!!! MORE FOOD!!! MORE FOOD!!!\n") mood_change = 8 /datum/mood_event/cum_craving - description = "I... NEED... CUM...\n" + description = span_warning("I... NEED... CUM...\n") mood_change = -20 /datum/mood_event/cum_stuffed - description = "It feels so good inside me!\n" + description = span_nicegreen("It feels so good inside me!\n") mood_change = 8 timeout = 5 MINUTES diff --git a/modular_splurt/code/datums/mood_events/preg_events.dm b/modular_splurt/code/datums/mood_events/preg_events.dm index 35dcadfcd4..628d10b089 100644 --- a/modular_splurt/code/datums/mood_events/preg_events.dm +++ b/modular_splurt/code/datums/mood_events/preg_events.dm @@ -1,8 +1,8 @@ /datum/mood_event/pregnant_negative - description = "THE BABY IS COMING OUT...\n" + description = span_boldwarning("THE BABY IS COMING OUT...\n") mood_change = -7 /datum/mood_event/pregnant_positive - description = "The baby came out...phew\n" + description = span_nicegreen("The baby came out...phew\n") mood_change = 3 timeout = 2 MINUTES diff --git a/modular_splurt/code/datums/traits/good.dm b/modular_splurt/code/datums/traits/good.dm index e23f92cfe3..1984a6a73f 100644 --- a/modular_splurt/code/datums/traits/good.dm +++ b/modular_splurt/code/datums/traits/good.dm @@ -3,8 +3,8 @@ desc = "Your body is abnormally enduring and can take 10% more damage." value = 4 medical_record_text = "Patient has an abnormally high capacity for injury." - gain_text = "You feel very sturdy." - lose_text = "You feel less sturdy." + gain_text = span_notice("You feel very sturdy.") + lose_text = span_notice("You feel less sturdy.") /datum/quirk/tough/add() quirk_holder.maxHealth *= 1.1 @@ -20,8 +20,8 @@ value = 2 //Is not actually THAT good. Does not grant breathing and does stamina damage to the point you are unable to attack. Crippling on lavaland, but you'll survive. Is not a replacement for SEVA suits for this reason. Can be adjusted. mob_trait = TRAIT_ASHRESISTANCE medical_record_text = "Patient has an abnormally thick epidermis." - gain_text = "You feel resistant to burning brimstone." - lose_text = "You feel less as if your flesh is more flamamble." + gain_text = span_notice("You feel resistant to burning brimstone.") + lose_text = span_notice("You feel less as if your flesh is more flamamble.") /* --FALLBACK SYSTEM INCASE THE TRAIT FAILS TO WORK. Do NOT enable this without editing ash_storm.dm to deal stamina damage with ash immunity. /datum/quirk/ashresistance/add() @@ -37,8 +37,8 @@ name = "Dominant Aura" desc = "Your mere presence is assertive enough to appear as powerful to other people, so much in fact that the weaker kind can't help but throw themselves at your feet at the snap of a finger." value = 1 - gain_text = "You feel like making someone your pet." - lose_text = "You feel less assertive." + gain_text = span_notice("You feel like making someone your pet.") + lose_text = span_notice("You feel less assertive.") /datum/quirk/dominant_aura/add() . = ..() @@ -113,15 +113,15 @@ value = 1 medical_record_text = "Patient has attempted to cover the room in webs, claiming to be \"making a nest\"." mob_trait = TRAIT_ARACHNID - gain_text = "You feel a strange sensation near your anus..." - lose_text = "You feel like you can't spin webs anymore..." + gain_text = span_notice("You feel a strange sensation near your anus...") + lose_text = span_notice("You feel like you can't spin webs anymore...") processing_quirk = TRUE /datum/quirk/arachnid/add() . = ..() var/mob/living/carbon/human/H = quirk_holder if(is_species(H,/datum/species/arachnid)) - to_chat(H, "As an arachnid, this quirk does nothing for you, as these abilities are innate to your species.") + to_chat(H, span_warning("As an arachnid, this quirk does nothing for you, as these abilities are innate to your species.")) return var/datum/action/innate/spin_web/SW = new var/datum/action/innate/spin_cocoon/SC = new @@ -143,3 +143,10 @@ desc = "You are able to move about freely in pressurized low-gravity environments be it through the use of wings, magic, or some other physiological nonsense." value = 1 mob_trait = TRAIT_FLUTTER + +/datum/quirk/cloth_eater + name = "Clothes Eater" + desc = "You can eat most apparel to gain a boost in mood, and to gain some nutrients. (Insects already have this.)" + value = 1 + var/mood_category ="cloth_eaten" + mob_trait = TRAIT_CLOTH_EATER diff --git a/modular_splurt/code/datums/traits/negative.dm b/modular_splurt/code/datums/traits/negative.dm index a7a72f4f7a..a000de17ab 100644 --- a/modular_splurt/code/datums/traits/negative.dm +++ b/modular_splurt/code/datums/traits/negative.dm @@ -66,27 +66,20 @@ speech_args[SPEECH_MESSAGE] = message //Own stuff -/datum/quirk/no_clone - name = "DNC" - desc = "You have filed a Do Not Clone order, stating that you do not wish to be cloned. You can still be revived by other means." - value = -2 - mob_trait = TRAIT_NO_CLONE - medical_record_text = "Patient has a DNC (Do Not Clone) order and will be rejected by cloning mechanisms as a result." - /datum/quirk/no_guns name = "Fat-Fingered" desc = "Due to the shape of your hands, width of your fingers or just not having fingers at all, you're unable to fire guns without accommodation." value = -2 mob_trait = TRAIT_CHUNKYFINGERS - gain_text = "Your fingers feel... thick." - lose_text = "Your fingers feel normal again." + gain_text = span_notice("Your fingers feel... thick.") + lose_text = span_notice("Your fingers feel normal again.") /datum/quirk/illiterate name = "Illiterate" desc = "You can't read nor write, plain and simple." value = -1 mob_trait = TRAIT_ILLITERATE - gain_text = "The knowledge of how to read seems to escape from you." + gain_text = span_notice("The knowledge of how to read seems to escape from you.") lose_text = "Written words suddenly make sense again." /datum/quirk/flimsy @@ -109,8 +102,8 @@ name = "Hypersensitive" desc = "For better or worse, everything seems to affect your mood more than it should." value = -1 - gain_text = "You seem to make a big deal out of everything." - lose_text = "You don't seem to make a big deal out of everything anymore." + gain_text = span_danger("You seem to make a big deal out of everything.") + lose_text = span_notice("You don't seem to make a big deal out of everything anymore.") mood_quirk = TRUE //yogs medical_record_text = "Patient demonstrates a high level of emotional volatility." @@ -135,7 +128,7 @@ desc = "For one reason or another, you're totally obsessed with cum. The heat of it, the smell... its taste... It's quite simply euphoric." value = 0 gain_text = "You suddenly start craving some seed inside of you!" - lose_text = "Cum didn't even taste that good, anyways." + lose_text = span_danger("Cum didn't even taste that good, anyways.") medical_record_text = "Patient seems to have an unhealthy psychological obsession with seminal fluids." var/craving_after = 15 MINUTES var/timer @@ -151,7 +144,7 @@ "Some jizz wouldn't be so bad right now!",\ "You're starting to long for some more cum..." ) - to_chat(quirk_holder, "[pick(hungry_phrases)]") + to_chat(quirk_holder, span_love("[pick(hungry_phrases)]")) if(quirk_holder.stat == CONSCIOUS) quirk_holder.emote("sigh") @@ -175,8 +168,8 @@ name = "Hungry And Thirsty" desc = "You find yourself unusually hungry and thirsty. Gotta eat and drink twice as much as normal." value = -1 - gain_text = "You're starting to feel hungrier and thirstier a lot faster." - lose_text = "Your craving for food and water begins dying down." + gain_text = span_danger("You're starting to feel hungrier and thirstier a lot faster.") + lose_text = span_notice("Your craving for food and water begins dying down.") medical_record_text = "Patient reports eating twice as many meals per day than usual for their species." /datum/quirk/hungry/add() diff --git a/modular_splurt/code/datums/traits/neutral.dm b/modular_splurt/code/datums/traits/neutral.dm index 1d43343d46..79c8cf934b 100644 --- a/modular_splurt/code/datums/traits/neutral.dm +++ b/modular_splurt/code/datums/traits/neutral.dm @@ -5,15 +5,15 @@ desc = "You are aroused by suffocation." value = 0 mob_trait = TRAIT_CHOKE_SLUT - gain_text = "You feel like you want to feel fingers around your neck, choking you until you pass out or make a mess... Maybe both." - lose_text = "Seems you don't have a kink for suffocation anymore." + gain_text = span_notice("You feel like you want to feel fingers around your neck, choking you until you pass out or make a mess... Maybe both.") + lose_text = span_notice("Seems you don't have a kink for suffocation anymore.") /datum/quirk/pharmacokinesis //Supposed to prevent unwanted organ additions. But i don't think it's really working rn name = "Acute Hepatic Pharmacokinesis" //copypasting dumbo desc = "You have a genetic disorder that causes Incubus Draft and Succubus Milk to be absorbed by your liver instead." value = 0 mob_trait = TRAIT_PHARMA - lose_text = "Your liver feels... different, somehow." + lose_text = span_notice("Your liver feels... different, somehow.") var/active = FALSE var/power = 0 var/cachedmoveCalc = 1 @@ -23,16 +23,16 @@ desc = "You've never skipped ass day. You are completely immune to all forms of ass slapping and anyone who tries to slap your rock hard ass usually gets a broken hand." value = 0 mob_trait = TRAIT_STEEL_ASS - gain_text = "Your ass rivals those of golems." - lose_text = "Your butt feels more squishy and slappable." + gain_text = span_notice("Your ass rivals those of golems.") + lose_text = span_notice("Your butt feels more squishy and slappable.") /datum/quirk/cursed_blood name = "Cursed Blood" desc = "Your lineage is cursed with the paleblood curse. Best to stay away from holy water... Hell water, on the other hand..." value = 0 mob_trait = TRAIT_CURSED_BLOOD - gain_text = "A curse from a land where men return as beasts runs deep in your blood." - lose_text = "You feel the weight of the curse in your blood finally gone." + gain_text = span_notice("A curse from a land where men return as beasts runs deep in your blood.") + lose_text = span_notice("You feel the weight of the curse in your blood finally gone.") medical_record_text = "Patient suffers from an unknown type of aversion to holy reagents. Keep them away from a chaplain." /datum/quirk/headpat_hater @@ -40,8 +40,8 @@ desc = "You don't seem to show much care for being touched. Whether it's because you're reserved or due to self control, others touching your head won't make you wag your tail should you possess one, and the action may even attract your ire." mob_trait = TRAIT_DISTANT value = 0 - gain_text = "Others' touches begin to make your blood boil..." - lose_text = "Having your head pet doesn't sound so bad right about now..." + gain_text = span_notice("Others' touches begin to make your blood boil...") + lose_text = span_notice("Having your head pet doesn't sound so bad right about now...") medical_record_text = "Patient cares little with or dislikes being touched." /datum/quirk/headpat_slut @@ -49,8 +49,8 @@ desc = "You love the feeling of others touching your head! Maybe a little too much, actually... Others patting your head will provide a bigger mood boost and cause aroused reactions." mob_trait = TRAIT_HEADPAT_SLUT value = 0 - gain_text = "You crave headpats immensely!" - lose_text = "Your headpats addiction wanes." + gain_text = span_notice("You crave headpats immensely!") + lose_text = span_notice("Your headpats addiction wanes.") medical_record_text = "Patient seems overly affectionate." /datum/quirk/headpat_slut/add() @@ -66,16 +66,16 @@ desc = "Your system burns with the desire to be bred. Satisfying your lust will make you happy, but ignoring it may cause you to become sad and needy." value = 0 mob_trait = TRAIT_IN_HEAT - gain_text = "You body burns with the desire to be bred." - lose_text = "You feel more in control of your body and thoughts." + gain_text = span_notice("You body burns with the desire to be bred.") + lose_text = span_notice("You feel more in control of your body and thoughts.") /datum/quirk/Hypnotic_gaze name = "Hypnotic Gaze" desc = "Be it through mysterious patterns, flickering colors, or some genetic oddity, prolonged eye contact with you will place the viewer into a highly-suggestible hypnotic trance." value = 0 mob_trait = TRAIT_HYPNOTIC_GAZE - gain_text = "Your eyes glimmer hypnotically..." - lose_text = "Your eyes return to normal." + gain_text = span_notice("Your eyes glimmer hypnotically...") + lose_text = span_notice("Your eyes return to normal.") medical_record_text = "Prolonged exposure to Patient's eyes exhibits soporific effects." /datum/quirk/Hypnotic_gaze/on_spawn() @@ -84,89 +84,19 @@ spell.Grant(Hypno_eyes) spell.owner = Hypno_eyes -/datum/action/innate/Hypnotize - name = "Hypnotize" - desc = "Stare deeply into someone's eyes, drawing them into a hypnotic slumber." - button_icon_state = "Hypno_eye" - icon_icon = 'modular_splurt/icons/mob/actions/lewd_actions/lewd_icons.dmi' - background_icon_state = "bg_alien" - var/mob/living/carbon/T //hypnosis target - var/mob/living/carbon/human/H //Person with the quirk - -/datum/action/innate/Hypnotize/Activate() - var/mob/living/carbon/human/H = owner - - if(!H.pulling || !isliving(H.pulling) || H.grab_state < GRAB_AGGRESSIVE) - to_chat(H, "You need to aggressively grab someone to hypnotize them!") - return - - var/mob/living/carbon/T = H.pulling - - if(T.IsSleeping()) - to_chat(H, "You can't hypnotize [T] whilst they're asleep!") - return - - to_chat(H, "You stare deeply into [T]'s eyes...") - to_chat(T, "[H] stares intensely into your eyes...") - if(!do_mob(H, T, 12 SECONDS)) - return - - if(H.pulling !=T || H.grab_state < GRAB_AGGRESSIVE) - return - - if(!(H in view(1, H.loc))) - return - - if(!(T.client?.prefs.cit_toggles & HYPNO)) - return - - var/response = alert(T, "Do you wish to fall into a hypnotic sleep?(This will allow [H] to issue hypnotic suggestions)", "Hypnosis", "Yes", "No") - - if(response == "Yes") - T.visible_message("Your eyelids gently shut as you fall into a deep slumber. All you can hear is [H]'s voice as you commit to following all of their suggestions.") - - T.SetSleeping(1200) - T.drowsyness = max(T.drowsyness, 40) - T = H.pulling - var/response2 = alert(H, "Would you like to release your subject or give them a suggestion?", "Hypnosis", "Suggestion", "Release") - - if(response2 == "Suggestion") - if(get_dist(H, T) > 1) - to_chat(H, "You must stand in whisper range of [T].") - return - - var/text = input("What would you like to suggest?", "Hypnotic suggestion", null, null) - text = sanitize(text) - if(!text) - return - - to_chat(H, "You whisper your suggestion in a smooth calming voice to [T]") - to_chat(T, "...[text]...") - - T.visible_message("[T] wakes up from their deep slumber!", "Your eyelids gently open as you see [H]'s face staring back at you.") - T.SetSleeping(0) - T = null - return - - if(response2 == "Release") - T.SetSleeping(0) - return - else - T.visible_message("[T]'s attention breaks, despite the attempt to hypnotize them! They clearly don't want this!", "Your concentration breaks as you realise you have no interest in following [H]'s words!") - return /datum/quirk/heat name = "Estrus Detection" desc = "You have a animalistic sense of detecting if someone is in heat." value = 0 mob_trait = TRAIT_HEAT_DETECT - gain_text = "You feel your senses adjust, allowing a animalistic sense of others' fertility." - lose_text = "You feel your sense of others' fertility fade." + gain_text = span_notice("You feel your senses adjust, allowing a animalistic sense of others' fertility.") + lose_text = span_notice("You feel your sense of others' fertility fade.") /datum/quirk/overweight name = "Overweight" desc = "You're particularly fond of food, and join the shift being overweight." value = 0 - gain_text = "You feel a bit chubby!" + gain_text = span_notice("You feel a bit chubby!") //no lose_text cause why would there be? /datum/quirk/overweight/on_spawn() @@ -179,8 +109,8 @@ name = "Vegetarian" desc = "You find the idea of eating meat morally and physically repulsive." value = 0 - gain_text = "You feel repulsion at the idea of eating meat." - lose_text = "You feel like eating meat isn't that bad." + gain_text = span_notice("You feel repulsion at the idea of eating meat.") + lose_text = span_notice("You feel like eating meat isn't that bad.") medical_record_text = "Patient reports a vegetarian diet." /datum/quirk/vegetarian/add() @@ -202,8 +132,8 @@ name = "Extra-Productive Genitals" desc = "Your genitals produce and hold more than normal." value = 0 - gain_text = "You feel pressure in your groin." - lose_text = "You feel a weight lifted from your groin." + gain_text = span_notice("You feel pressure in your groin.") + lose_text = span_notice("You feel a weight lifted from your groin.") medical_record_text = "Patient exhibits increased production of sexual fluids." /datum/quirk/cum_plus/add() @@ -235,8 +165,8 @@ name = "Well-Trained" desc = "You absolutely love being dominated. The thought of someone stronger than you is enough to make you act up." value = 0 - gain_text = "You feel like being someone's pet..." - lose_text = "You no longer feel like being a pet..." + gain_text = span_notice("You feel like being someone's pet...") + lose_text = span_notice("You no longer feel like being a pet...") processing_quirk = TRUE var/mood_category = "dom_trained" var/notice_delay = 0 @@ -323,8 +253,8 @@ desc = "You are a tri-headed creature. To use, format your name like (Rucks-Sucks-Ducks)." value = 0 mob_trait = TRAIT_HYDRA_HEADS - gain_text = "You hear two other voices inside of your head(s)." - lose_text = "All of your minds become singular." + gain_text = span_notice("You hear two other voices inside of your head(s).") + lose_text = span_danger("All of your minds become singular.") medical_record_text = "Patient has multiple heads and personalities affixed to their body." /datum/quirk/hydra/on_spawn() @@ -337,41 +267,14 @@ resetspell.owner = hydra hydra.name_archive = hydra.real_name - -/datum/action/innate/hydra - name = "Switch head" - desc = "Switch between each of the heads on your body." - icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "art_summon" - -/datum/action/innate/hydrareset - name = "Reset speech" - desc = "Go back to speaking as a whole." - icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "art_summon" - -/datum/action/innate/hydrareset/Activate() - var/mob/living/carbon/human/hydra = owner - hydra.real_name = hydra.name_archive - hydra.visible_message("[hydra.name] pushes all three heads forwards; they seem to be talking as a collective.", \ - "You are now talking as [hydra.name_archive]!", ignored_mobs=owner) - -/datum/action/innate/hydra/Activate() //I hate this but its needed - var/mob/living/carbon/human/hydra = owner - var/list/names = splittext(hydra.name_archive,"-") - var/selhead = input("Who would you like to speak as?","Heads:") in names - hydra.real_name = selhead - hydra.visible_message("[hydra.name] pulls the rest of their heads back; and puts [selhead]'s forward.", \ - "You are now talking as [selhead]!", ignored_mobs=owner) - //Own traits /datum/quirk/cum_sniff name = "Genital Taster" desc = "You've built so much experience savoring other people's genitals through your life that you can easily tell what liquids they're full of, besides reagents in their blood that is." value = 0 mob_trait = TRAIT_GFLUID_DETECT - gain_text = "You begin sensing peculiar smells from people's bits..." - lose_text = "People's genitals start smelling all the same to you..." + gain_text = span_notice("You begin sensing peculiar smells from people's bits...") + lose_text = span_notice("People's genitals start smelling all the same to you...") medical_record_text = "Patient attempted to get their doctor to drag his balls accross their face." /datum/quirk/fluid_infuser @@ -383,6 +286,36 @@ . = ..() var/obj/item/implant/genital_fluid/put_in = new put_in.implant(quirk_holder, null, TRUE, TRUE) + +/datum/quirk/storage_concealment + name = "Dorsualiphobic Augmentation" + desc = "You despise the idea of being seen wearing any type of back-mounted storage apparatus! A new technology shields you from the immense shame you may experience, by hiding your equipped backpack." + + // UNUSED: Enable by setting these values to TRUE + // The shame is unbearable + mood_quirk = FALSE + processing_quirk = FALSE + var/mood_category = "backpack_implant_mood" + +/datum/quirk/storage_concealment/on_spawn() + . = ..() + + // Create a new augment item + var/obj/item/implant/hide_backpack/put_in = new + + // Apply the augment to the quirk holder + put_in.implant(quirk_holder, null, TRUE, TRUE) + +/datum/quirk/storage_concealment/on_process() + // This trait should only be applied by the augment + // Check the quirk holder for the trait + if(HAS_TRAIT(quirk_holder, TRAIT_HIDE_BACKPACK)) + // When found: Mood bonus + SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/dorsualiphobic_mood_positive) + else + // When not found: Mood penalty + SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/dorsualiphobic_mood_negative) + //succubus and incubus below /datum/quirk/incubus name = "Incubus" @@ -432,87 +365,164 @@ var/mob/living/carbon/human/H = quirk_holder H.adjust_nutrition(-0.09)//increases their nutrition loss rate to encourage them to gain a partner they can essentially leech off of -/datum/quirk/vampire//splurt change start - name = "Bloodsucker Fledgeling" - desc = "You are a fledgeling of an ancient Bloodsucker bloodline; your skin is incurably pale and your mouth glimmers with vampiric fangs. Only blood will sate your hungers, and holy energies will cause your flesh to char." - value = 0 - medical_record_text = "this person was partially infected by a bloodsucker" - mob_trait = BLOODFLEDGE - gain_text = "You feel an otherworldly thirst." - lose_text = "you feel an otherworldy burden remove itself" +/datum/quirk/bloodfledge + name = "Bloodsucker Fledgling" + desc = "You are a fledgling belonging to ancient Bloodsucker bloodline. While the blessing has yet to fully convert you, some things have changed. Only blood will sate your hungers, and holy energies will cause your flesh to char. This is NOT an antagonist role!" + value = 2 + medical_record_text = "Patient exhibits onset symptoms of a sanguine curse." + mob_trait = TRAIT_BLOODFLEDGE + gain_text = span_notice("You feel a sanguine thirst.") + lose_text = span_notice("You feel the sanguine thirst fade away.") processing_quirk = TRUE -/datum/quirk/vampire/add() +/datum/quirk/bloodfledge/add() . = ..() - var/mob/living/carbon/human/H = quirk_holder - ADD_TRAIT(H,TRAIT_NO_PROCESS_FOOD,ROUNDSTART_TRAIT) - ADD_TRAIT(H,TRAIT_COLDBLOODED,ROUNDSTART_TRAIT) - ADD_TRAIT(H,TRAIT_NOBREATH,ROUNDSTART_TRAIT) - ADD_TRAIT(H,TRAIT_NOTHIRST,ROUNDSTART_TRAIT) - ADD_TRAIT(H,TRAIT_QUICKER_CARRY,ROUNDSTART_TRAIT) - ADD_TRAIT(H,TRAIT_AUTO_CATCH_ITEM,ROUNDSTART_TRAIT)//these two make the vampire fast and enables some sexy "bet you didnt think i could do this" romance - if(!H.dna.skin_tone_override) - H.skin_tone = "albino" - var/datum/action/vbite/B = new - var/datum/action/vrevive/R = new - B.Grant(H) - R.Grant(H) - H.grant_language(/datum/language/vampiric, TRUE, TRUE, LANGUAGE_BLOODSUCKER) -/datum/quirk/vampire/on_process() + // Define quirk mob + var/mob/living/carbon/human/quirk_mob = quirk_holder + + // Add quirk traits + ADD_TRAIT(quirk_mob,TRAIT_NO_PROCESS_FOOD,ROUNDSTART_TRAIT) + ADD_TRAIT(quirk_mob,TRAIT_NOTHIRST,ROUNDSTART_TRAIT) + + // Set skin tone, if possible + if(!quirk_mob.dna.skin_tone_override) + quirk_mob.skin_tone = "albino" + + // Add quirk ability action datums + var/datum/action/bloodfledge/bite/act_bite = new + var/datum/action/bloodfledge/revive/act_revive = new + act_bite.Grant(quirk_mob) + act_revive.Grant(quirk_mob) + + // Add quirk language + quirk_mob.grant_language(/datum/language/vampiric, TRUE, TRUE, LANGUAGE_BLOODSUCKER) + +/datum/quirk/bloodfledge/on_process() . = ..() - var/mob/living/carbon/human/H = quirk_holder - var/area/A = get_area(H) - if(istype(A, /area/service/chapel) && H.mind?.assigned_role != "Chaplain") - H.adjustStaminaLoss(2) - H.adjust_nutrition(-0.3)//changed these to be less deadly and more of an inconvinience - H.adjust_disgust(1) - if(istype(H.loc, /obj/structure/closet/crate/coffin))//heals the vampire if in a coffin, except burn which fire can be considered holy - H.heal_overall_damage(4,4) - H.adjust_disgust(-7) - H.adjustOxyLoss(-4) - H.adjustCloneLoss(-4) - H.adjustBruteLoss(-0.3) - H.adjustFireLoss(-0.3) - if(!is_species(H, /datum/species/jelly)) //checks species - H.adjustToxLoss(-5)//heals toxin if not slime + + // Check if the current area is a coffin + if(istype(quirk_holder.loc, /obj/structure/closet/crate/coffin)) + // Define quirk mob + var/mob/living/carbon/human/quirk_mob = quirk_holder + + // Quirk mob must be injured + if(quirk_mob.health >= quirk_mob.maxHealth) + return + + // Prevent healing for robots + // This caused numerous technical issues + if(quirk_mob.mob_biotypes & MOB_ROBOTIC) + // Display a warning chat message (10% chance) + if(prob(20)) + to_chat(quirk_mob, span_warning("Your mechanical body rejects the curse's healing properties!")) + + // Return without healing, due robotic nature + return + + // Nutrition (blood) level must be above STARVING + if(quirk_mob.nutrition <= NUTRITION_LEVEL_STARVING) + // Display a warning chat message (10% chance) + if(prob(20)) + to_chat(quirk_mob, span_warning("You need more blood before you can regenerate!")) + + // Return without healing, due to lack of blood + return + + // Define initial health + var/health_start = quirk_mob.health + + // Heal brute and burn + // Accounts for robotic limbs + quirk_mob.heal_overall_damage(2,2) + /* + // Heal brute + quirk_mob.adjustBruteLoss(-2) + // Heal burn + quirk_mob.adjustFireLoss(-2) + */ + // Heal oxygen + quirk_mob.adjustOxyLoss(-2) + // Heal clone + quirk_mob.adjustCloneLoss(-2) + + // Check for slime race + // NOT a slime + if(!isslimeperson(quirk_mob)) + // Heal toxin + quirk_mob.adjustToxLoss(-2) + // IS a slime else - H.adjustToxLoss(5)//heals toxin if slime - return - if(H.nutrition == 0) - if(H.staminaloss < 99)//makes them tired but dosent stun them - H.adjustStaminaLoss(3, FALSE, TRUE) - else - H.adjustStaminaLoss(-1,FALSE, FALSE)//this also helps with if someone is stuck in the chapel for way too long, and i tested with a stun sword that stunning for sec is still possible - if(prob(2)) //2 percent chance (if it was true randome D:<) - to_chat(H, "I need blood NOW!!!") + // Grant toxin (heals slimes) + quirk_mob.adjustToxLoss(2) -/datum/quirk/vampire/remove() + // Update health + quirk_mob.updatehealth() + + // Determine healed amount + var/health_restored = quirk_mob.health - health_start + + // Remove nutrition (blood) as compensation for healing + // Amount is equal to 50% of healing done + quirk_mob.adjust_nutrition(health_restored*-1) + +/datum/quirk/bloodfledge/remove() . = ..() - var/mob/living/carbon/human/H = quirk_holder - var/datum/action/vbite/B = locate() in H.actions - var/datum/action/vrevive/R = locate() in H.actions - REMOVE_TRAIT(H, TRAIT_NO_PROCESS_FOOD, ROUNDSTART_TRAIT) - REMOVE_TRAIT(H, TRAIT_COLDBLOODED, ROUNDSTART_TRAIT) - REMOVE_TRAIT(H, TRAIT_NOBREATH, ROUNDSTART_TRAIT) - REMOVE_TRAIT(H, TRAIT_NOTHIRST, ROUNDSTART_TRAIT) - REMOVE_TRAIT(H,TRAIT_QUICKER_CARRY,ROUNDSTART_TRAIT) - REMOVE_TRAIT(H,TRAIT_AUTO_CATCH_ITEM,ROUNDSTART_TRAIT) - B.Remove(H) - R.Remove(H) - H.remove_language(/datum/language/vampiric, TRUE, TRUE, LANGUAGE_BLOODSUCKER) + + // Define quirk mob + var/mob/living/carbon/human/quirk_mob = quirk_holder -/datum/quirk/vampire/on_spawn() - var/mob/living/carbon/human/H = quirk_holder - var/obj/item/card/id/vampire/vcard = new /obj/item/card/id/vampire - H.equip_to_slot(vcard, ITEM_SLOT_BACKPACK) - vcard.registered_name = H.real_name - vcard.update_label(addtext(vcard.registered_name, " the vampire")) - //var/obj/item/card/id/I = H.get_idcard(FALSE) maybe later, hop can just give the extra card proper access if needed, as for banking, that can be set on spawn by the player using the card in hand - //vcard.access = I.access - H.regenerate_icons() + // Remove quirk traits + REMOVE_TRAIT(quirk_mob, TRAIT_NO_PROCESS_FOOD, ROUNDSTART_TRAIT) + REMOVE_TRAIT(quirk_mob, TRAIT_NOTHIRST, ROUNDSTART_TRAIT) + + // Remove quirk ability action datums + var/datum/action/bloodfledge/bite/act_bite = locate() in quirk_mob.actions + var/datum/action/bloodfledge/revive/act_revive = locate() in quirk_mob.actions + act_bite.Remove(quirk_mob) + act_revive.Remove(quirk_mob) + + // Remove quirk language + quirk_mob.remove_language(/datum/language/vampiric, TRUE, TRUE, LANGUAGE_BLOODSUCKER) + +/datum/quirk/bloodfledge/on_spawn() . = ..() + // Define quirk mob + var/mob/living/carbon/human/quirk_mob = quirk_holder + + // Create vampire ID card + var/obj/item/card/id/vampire/id_vampire = new /obj/item/card/id/vampire(get_turf(quirk_holder)) + + // Update card information + id_vampire.registered_name = quirk_mob.real_name + id_vampire.update_label(addtext(id_vampire.registered_name, "'s Bloodfledge")) + + // Determine banking ID information + for(var/bank_account in SSeconomy.bank_accounts) + // Define current iteration's account + var/datum/bank_account/account = bank_account + + // Check for match + if(account.account_id == quirk_mob.account_id) + // Add to cards list + account.bank_cards += src + + // Assign account + id_vampire.registered_account = account + + // Stop searching + break + + // Try to add ID to backpack + var/id_in_bag = quirk_mob.equip_to_slot_if_possible(id_vampire, ITEM_SLOT_BACKPACK) || FALSE + + // Text for where the item was sent + var/id_location = (id_in_bag ? "in your backpack" : "at your feet" ) + + // Alert user in chat + // This should not post_add, because the ID is added by on_spawn + to_chat(quirk_holder, span_boldnotice("There is a bloodfledge's ID card [id_location], linked to your station account. It functions as a spare ID, but lacks job access.")) /datum/quirk/werewolf //adds the werewolf quirk name = "Werewolf" @@ -531,13 +541,90 @@ W.Remove(H) . = ..() + +/datum/quirk/gargoyle //Mmmm yes stone time + name = "Gargoyle" + desc = "You are some form of gargoyle! You can only leave your stone form for so long, and will have to return to it to regain energy. On the bright side, you heal in statue form!" + value = 0 + processing_quirk = TRUE + var/energy = 0 + var/transformed = 0 + var/cooldown = 0 + var/paused = 0 + var/turf/position + var/obj/structure/statue/gargoyle/current = null + +/datum/quirk/gargoyle/add() + .=..() + var/mob/living/carbon/human/H = quirk_holder + if (!H) + return + var/datum/action/gargoyle/transform/T = new + var/datum/action/gargoyle/check/C = new + var/datum/action/gargoyle/pause/P = new + energy = 100 + cooldown = 30 + T.Grant(H) + C.Grant(H) + P.Grant(H) + +/datum/quirk/gargoyle/on_process() + .=..() + var/mob/living/carbon/human/H = quirk_holder + + if (!H) + return + + if(paused && H.loc != position) + paused = 0 + energy -= 20 + + if(cooldown > 0) + cooldown-- + + if(!transformed && !paused && energy > 0) + energy -= 0.05 + + if(transformed) + energy = min(energy + 0.3, 100) + if (H.getBruteLoss() > 0 || H.getFireLoss() > 0) + H.adjustBruteLoss(-0.5, forced = TRUE) + H.adjustFireLoss(-0.5, forced = TRUE) + else if (H.getOxyLoss() > 0 || H.getToxLoss() > 0) + H.adjustToxLoss(-0.3, forced = TRUE) + H.adjustOxyLoss(-0.5, forced = TRUE) //oxyloss heals by itself, doesn't need a nerfed heal + else if (H.getCloneLoss() > 0) + H.adjustCloneLoss(-0.3, forced = TRUE) + else if (current && current.obj_integrity < current.max_integrity) //health == maxHealth is true since we checked all damages above + current.obj_integrity = min(current.obj_integrity + 0.1, current.max_integrity) + + if(!transformed && energy <= 0) + var/datum/action/gargoyle/transform/T = locate() in H.actions + if (!T) + T = new + T.Grant(H) + cooldown = 0 + T?.Trigger() + +/datum/quirk/gargoyle/remove() + var/mob/living/carbon/human/H = quirk_holder + if (!H) + return ..() + var/datum/action/gargoyle/transform/T = locate() in H.actions + var/datum/action/gargoyle/check/C = locate() in H.actions + var/datum/action/gargoyle/pause/P = locate() in H.actions + T?.Remove(H) + C?.Remove(H) + P?.Remove(H) + . = ..() + /datum/quirk/nudist // Mostly derived from masked_mook. // Spawning with a gear harness is preferable, but failed during testing. name = "Nudist" desc = "Wearing most types of clothing unnerves you. Bring a gear harness!" - gain_text = "You feel spiritually connected to your natural form." - lose_text = "It feels like clothing could fit you comfortably." + gain_text = span_notice("You feel spiritually connected to your natural form.") + lose_text = span_notice("It feels like clothing could fit you comfortably.") medical_record_text = "Patient expresses a psychological need to remain unclothed." value = 0 mood_quirk = TRUE @@ -552,11 +639,19 @@ else SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/nudist_negative) +/datum/quirk/nudist/on_spawn() + . = ..() + // Spawn a Rapid Disrobe Implant + var/obj/item/implant/disrobe/quirk_implant = new + + // Implant into quirk holder + quirk_implant.implant(quirk_holder, null, TRUE, TRUE) + /datum/quirk/masked_mook name = "Bane Syndrome" desc = "For some reason you don't feel... right without wearing some kind of gas mask." - gain_text = "You start feeling unwell without any gas mask on." - lose_text = "You no longer have a need to wear some gas mask." + gain_text = span_danger("You start feeling unwell without any gas mask on.") + lose_text = span_notice("You no longer have a need to wear some gas mask.") value = 0 mood_quirk = TRUE medical_record_text = "Patient feels more secure when wearing a gas mask." @@ -577,170 +672,3 @@ var/obj/item/clothing/mask/gas/cosmetic/gasmask = new(get_turf(quirk_holder)) // Uses a custom gas mask H.equip_to_slot(gasmask, ITEM_SLOT_MASK) H.regenerate_icons() - -/// quirk actions /// - -//vampire bite - -#define BLOOD_DRAIN_NUM 50 - -/datum/action/vbite - name = "Bite" - button_icon_state = "power_feed" - icon_icon = 'icons/mob/actions/bloodsucker.dmi' - desc = "Sink your vampiric fangs into the person you are grabbing." - var/drain_cooldown = 0 - -/datum/action/vbite/Trigger() - . = ..() - if(iscarbon(owner)) - var/mob/living/carbon/H = owner - if(H.nutrition >= 500) - to_chat(H, "You are too full to drain any more.") - return - if(drain_cooldown >= world.time) - to_chat(H, "You just drained blood, wait a few seconds.") - return - if(!H.pulling || !iscarbon(H.pulling)) - if(H.getStaminaLoss() >= 80 && H.nutrition > 20)//prevents being stunlocked in the chapel - to_chat(H,("you use some of your power to energize")) - H.adjustStaminaLoss(-20) - H.adjust_nutrition(-20) - H.resting = TRUE - if(H.pulling && (iscarbon(H.pulling) || (istype(H.pulling,/obj/structure/arachnid/cocoon) && locate(/mob/living/carbon) in H.pulling.contents))) - var/mob/living/carbon/victim - if(iscarbon(H.pulling)) - victim = H.pulling - else if(istype(H.pulling,/obj/structure/arachnid/cocoon)) - victim = locate(/mob/living/carbon) in H.pulling.contents - drain_cooldown = world.time + 25 - if(victim.anti_magic_check(FALSE, TRUE, FALSE, 0)) - to_chat(victim, "[H] tries to bite you, but stops before touching you!") - to_chat(H, "[victim] is blessed! You stop just in time to avoid catching fire.") - return - //Here we check now for both the garlic cloves on the neck and for blood in the victims bloodstream. - if(!blood_sucking_checks(victim, TRUE, TRUE)) - return - H.visible_message("[H] bites down on [victim]'s neck!") - victim.add_splatter_floor(get_turf(victim), TRUE) - to_chat(victim, "[H] is draining your blood!") - if(!do_after(H, 30, target = victim)) - return - var/blood_volume_difference = BLOOD_VOLUME_MAXIMUM - H.blood_volume //How much capacity we have left to absorb blood - var/drained_blood = min(victim.blood_volume, BLOOD_DRAIN_NUM, blood_volume_difference) - H.reagents.add_reagent(/datum/reagent/blood/, drained_blood) - to_chat(victim, "[H] has taken some of your blood!") - to_chat(H, "You drain some blood!") - playsound(H, 'sound/items/drink.ogg', 30, 1, -2) - victim.blood_volume = clamp(victim.blood_volume - drained_blood, 0, BLOOD_VOLUME_MAXIMUM) - log_combat(H,victim,"vampire bit")//logs the biting action for admins - if(!victim.blood_volume) - to_chat(H, "You finish off [victim]'s blood supply!") - - -/datum/action/vrevive - name = "Resurrect" - button_icon_state = "power_strength" - icon_icon = 'icons/mob/actions/bloodsucker.dmi' - desc = "Use all your energy to come back to life!" - -/datum/action/vrevive/Trigger() - . = ..() - var/mob/living/carbon/C = owner - var/mob/living/carbon/human/H = owner - if(H.stat == DEAD && istype(C.loc, /obj/structure/closet/crate/coffin)) - H.revive(TRUE, FALSE) - H.set_nutrition(0) - H.Daze(20) - H.drunkenness = 70 - else - to_chat(H,"You need to be dead and in a coffin to revive!") - -//splurt change end -//put next quirk action here - -//werewolf tf - -/datum/action/werewolf - name = "Transform" - desc = "Transform into your wolf form." - icon_icon = 'modular_splurt/icons/mob/actions/misc_actions.dmi' - button_icon_state = "Transform" - var/transformed = FALSE - var/list/old_features = list("species" = SPECIES_HUMAN, "legs" = "Plantigrade", "size" = 1, "bark") - -/datum/action/werewolf/Trigger() - . = ..() - var/mob/living/carbon/human/H = owner - var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS) - var/obj/item/organ/genital/breasts/B = H.getorganslot(ORGAN_SLOT_BREASTS) - var/obj/item/organ/genital/vagina/V = H.getorganslot(ORGAN_SLOT_VAGINA) - H.shake_animation(2) - if(!transformed) // transform them - H.visible_message(span_danger("[H] shivers, their flesh bursting with a sudden growth of thick fur and their features contorting to that of a beast's, fully transforming them into a werewolf!")) - H.set_species(/datum/species/mammal, 1) - H.dna.species.mutant_bodyparts["mam_tail"] = "Wolf" - H.dna.species.mutant_bodyparts["legs"] = "Digitigrade" - H.Digitigrade_Leg_Swap(FALSE) - H.dna.species.mutant_bodyparts["mam_snouts"] = "Mammal, Thick" - H.dna.features["mam_ears"] = "Wolf" - H.dna.features["mam_tail"] = "Wolf" - H.dna.features["mam_snouts"] = "Mammal, Thick" - H.dna.features["legs"] = "Digitigrade" - H.update_size(get_size(H) + 0.5) - H.set_bark("bark") - H.custom_species = "Werewolf" - if(!(H.dna.species.species_traits.Find(DIGITIGRADE))) - H.dna.species.species_traits += DIGITIGRADE - H.update_body() - H.update_body_parts() - if(B) - B.color = "#[H.dna.features["mcolor"]]" - B.update() - if(P) - P.shape = "Knotted" - P.color = "#ff7c80" - P.update() - P.modify_size(6) - if(V) - V.shape = "Furred" - V.color = "#[H.dna.features["mcolor"]]" - V.update() - else // untransform them - H.visible_message(span_danger("[H] shrinks, their wolfish features quickly receding.")) - H.set_species(old_features["species"], TRUE) - H.set_bark(old_features["bark"]) - H.dna.features["mam_ears"] = old_features["mam_ears"] - H.dna.features["mam_snouts"] = old_features["mam_snouts"] - H.dna.features["mam_tail"] = old_features["mam_tail"] - H.dna.features["legs"] = old_features["legs"] //i hate legs i hate legs i hate legs i hate legs i hate legs i hate legs i hate legs - if(old_features["legs"] == "Plantigrade") - H.dna.species.species_traits -= DIGITIGRADE - H.Digitigrade_Leg_Swap(TRUE) - H.dna.species.mutant_bodyparts["legs"] = old_features["legs"] - H.update_body() - H.update_body_parts() - H.update_size(get_size(H) - 0.5) - if(B) - B.color = "#[old_features["breasts_color"]]" - B.update() - if(H.has_penis()) - P.shape = old_features["cock_shape"] - P.color = "#[old_features["cock_color"]]" - P.update() - P.modify_size(-6) - if(H.has_vagina()) - V.shape = old_features["vag_shape"] - V.color = "#[old_features["vag_color"]]" - V.update() - V.update_size() - transformed = !transformed - -/datum/action/werewolf/Grant()// on grant sets some variables - . = ..() - var/mob/living/carbon/human/H = owner - old_features = H.dna.features.Copy() - old_features["species"] = H.dna.species.type - old_features["size"] = get_size(H) - old_features["bark"] = H.vocal_bark_id - diff --git a/modular_splurt/code/datums/traits/trait_actions.dm b/modular_splurt/code/datums/traits/trait_actions.dm new file mode 100644 index 0000000000..ac56b75c7c --- /dev/null +++ b/modular_splurt/code/datums/traits/trait_actions.dm @@ -0,0 +1,697 @@ +#define BLOODFLEDGE_DRAIN_NUM 50 +#define BLOODFLEDGE_COOLDOWN_BITE 60 + +// +// Quirk: Hypnotic Gaze +// + +/datum/action/innate/Hypnotize + name = "Hypnotize" + desc = "Stare deeply into someone's eyes, drawing them into a hypnotic slumber." + button_icon_state = "Hypno_eye" + icon_icon = 'modular_splurt/icons/mob/actions/lewd_actions/lewd_icons.dmi' + background_icon_state = "bg_alien" + var/mob/living/carbon/T //hypnosis target + var/mob/living/carbon/human/H //Person with the quirk + +/datum/action/innate/Hypnotize/Activate() + var/mob/living/carbon/human/H = owner + + if(!H.pulling || !isliving(H.pulling) || H.grab_state < GRAB_AGGRESSIVE) + to_chat(H, span_warning("You need to aggressively grab someone to hypnotize them!")) + return + + var/mob/living/carbon/T = H.pulling + + if(T.IsSleeping()) + to_chat(H, "You can't hypnotize [T] whilst they're asleep!") + return + + to_chat(H, span_notice("You stare deeply into [T]'s eyes...")) + to_chat(T, span_warning("[H] stares intensely into your eyes...")) + if(!do_mob(H, T, 12 SECONDS)) + return + + if(H.pulling !=T || H.grab_state < GRAB_AGGRESSIVE) + return + + if(!(H in view(1, H.loc))) + return + + if(!(T.client?.prefs.cit_toggles & HYPNO)) + return + + var/response = alert(T, "Do you wish to fall into a hypnotic sleep?(This will allow [H] to issue hypnotic suggestions)", "Hypnosis", "Yes", "No") + + if(response == "Yes") + T.visible_message(span_warning("[T] falls into a deep slumber!"), "Your eyelids gently shut as you fall into a deep slumber. All you can hear is [H]'s voice as you commit to following all of their suggestions.") + + T.SetSleeping(1200) + T.drowsyness = max(T.drowsyness, 40) + T = H.pulling + var/response2 = alert(H, "Would you like to release your subject or give them a suggestion?", "Hypnosis", "Suggestion", "Release") + + if(response2 == "Suggestion") + if(get_dist(H, T) > 1) + to_chat(H, "You must stand in whisper range of [T].") + return + + var/text = input("What would you like to suggest?", "Hypnotic suggestion", null, null) + text = sanitize(text) + if(!text) + return + + to_chat(H, "You whisper your suggestion in a smooth calming voice to [T]") + to_chat(T, span_hypnophrase("...[text]...")) + + T.visible_message(span_warning("[T] wakes up from their deep slumber!"), "Your eyelids gently open as you see [H]'s face staring back at you.") + T.SetSleeping(0) + T = null + return + + if(response2 == "Release") + T.SetSleeping(0) + return + else + T.visible_message(span_warning("[T]'s attention breaks, despite the attempt to hypnotize them! They clearly don't want this!"), "Your concentration breaks as you realise you have no interest in following [H]'s words!") + return + +// +// Quirk: Hydra Heads +// + +/datum/action/innate/hydra + name = "Switch head" + desc = "Switch between each of the heads on your body." + icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "art_summon" + +/datum/action/innate/hydrareset + name = "Reset speech" + desc = "Go back to speaking as a whole." + icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "art_summon" + +/datum/action/innate/hydrareset/Activate() + var/mob/living/carbon/human/hydra = owner + hydra.real_name = hydra.name_archive + hydra.visible_message(span_notice("[hydra.name] pushes all three heads forwards; they seem to be talking as a collective."), \ + span_notice("You are now talking as [hydra.name_archive]!"), ignored_mobs=owner) + +/datum/action/innate/hydra/Activate() //I hate this but its needed + var/mob/living/carbon/human/hydra = owner + var/list/names = splittext(hydra.name_archive,"-") + var/selhead = input("Who would you like to speak as?","Heads:") in names + hydra.real_name = selhead + hydra.visible_message(span_notice("[hydra.name] pulls the rest of their heads back; and puts [selhead]'s forward."), \ + span_notice("You are now talking as [selhead]!"), ignored_mobs=owner) + +// +// Quirk: Bloodsucker Fledgling / Vampire +// + +// Basic action preset +/datum/action/bloodfledge + name = "Broken Bloodfledge Ability" + desc = "You shouldn't be seeing this!" + button_icon_state = "power_torpor" + background_icon_state = "vamp_power_off" + buttontooltipstyle = "cult" + icon_icon = 'icons/mob/actions/bloodsucker.dmi' + button_icon = 'icons/mob/actions/bloodsucker.dmi' + +// Action: Bite +/datum/action/bloodfledge/bite + name = "Fledgling Bite" + desc = "Sink your vampiric fangs into the person you are grabbing, and attempt to drink their blood." + button_icon_state = "power_feed" + var/drain_cooldown = 0 + +/datum/action/bloodfledge/bite/Trigger() + . = ..() + + // Check for carbon owner + if(!iscarbon(owner)) + return + + // Define action owner + var/mob/living/carbon/action_owner = owner + + // Check for cooldown + if(drain_cooldown >= world.time) + // Warn the user, then return + to_chat(action_owner, span_notice("That ability isn't ready yet.")) + return + + // Check for any grabbed target + if(!action_owner.pulling) + // Warn the user, then return + to_chat(action_owner, span_warning("You need a victim first!")) + return + + // Limit maximum nutrition + if(action_owner.nutrition >= NUTRITION_LEVEL_FAT) + // Warn the user, then return + to_chat(action_owner, span_notice("You are too full to drain any more.")) + return + + // Limit maximum potential nutrition + if(action_owner.nutrition + BLOODFLEDGE_DRAIN_NUM >= NUTRITION_LEVEL_FAT) + // Warn the user, then return + to_chat(action_owner, span_notice("You would become too full by draining any more blood.")) + return + + // Check for muzzle + if(action_owner.is_muzzled()) + // Warn the user, then return + to_chat(action_owner, span_notice("You can't bite things while muzzled!")) + return + + // Define pulled target + var/pull_target = action_owner.pulling + + // Define bite target + var/mob/living/carbon/bite_target + + // Check if the target is carbon + if(iscarbon(pull_target)) + // Set the bite target + bite_target = pull_target + + // Or cocooned carbon + else if(istype(pull_target,/obj/structure/arachnid/cocoon)) + // Define if cocoon has a valid target + // This cannot use pull_target + var/possible_cocoon_target = locate(/mob/living/carbon) in action_owner.pulling.contents + + // Check defined cocoon target + if(possible_cocoon_target) + // Set the bite target + bite_target = possible_cocoon_target + + // Or a blood tomato + else if(istype(pull_target,/obj/item/reagent_containers/food/snacks/grown/tomato/blood)) + // Warn the user, then return + to_chat(action_owner, span_danger("You plunge your fangs into [pull_target]! It's not very nutritious.")) + return + + // This doesn't actually interact with the item + + // Or none of the above + else + // Warn the user, then return + to_chat(action_owner, span_warning("You can't drain blood from [pull_target]!")) + return + + // Check for anti-magic + if(bite_target.anti_magic_check(FALSE, TRUE, FALSE, 0)) + // Warn the user and target, then return + to_chat(bite_target, span_warning("[action_owner] tries to bite you, but stops before touching you!")) + to_chat(action_owner, span_warning("[bite_target] is blessed! You stop just in time to avoid catching fire.")) + return + + // Check for garlic necklace or garlic in the bloodstream + if(!blood_sucking_checks(bite_target, TRUE, TRUE)) + // Warn the user and target, then return + to_chat(bite_target, span_warning("[action_owner] tries to bite you, but is warded off by your Allium Sativum!")) + to_chat(action_owner, span_warning("You sense that [bite_target] is protected by Allium Sativum, and refrain from biting them.")) + return + + // Define bite target's blood volume + var/target_blood_volume = bite_target.blood_volume + + // Check for sufficient blood volume + if(!target_blood_volume) + // Warn the user, then return + to_chat(action_owner, span_warning("There's not enough blood in [bite_target]!")) + return + + // Check if total blood would become too low + if((target_blood_volume - BLOODFLEDGE_DRAIN_NUM) <= BLOOD_VOLUME_OKAY) + // Check for aggressive grab + if(action_owner.grab_state < GRAB_AGGRESSIVE) + // Warn the user, then return + to_chat(action_owner, span_warning("You sense that [bite_target] is running low on blood. You'll need a tighter grip on [bite_target.p_them()] to continue.")) + return + + // Check for pacifist + if(HAS_TRAIT(action_owner, TRAIT_PACIFISM)) + // Warn the user, then return + to_chat(action_owner, span_warning("You can't drain any more blood from [bite_target] without hurting [bite_target.p_them()]!")) + return + + // Set cooldown and action times + var/time_cooldown = BLOODFLEDGE_COOLDOWN_BITE + var/time_interact = 30 + + // Check for voracious + if(HAS_TRAIT(action_owner, TRAIT_VORACIOUS)) + // Make times twice as fast + time_cooldown *= 0.5 + time_interact*= 0.5 + + // Set cooldown + drain_cooldown = world.time + time_cooldown + + // Display local chat message + action_owner.visible_message(span_danger("[action_owner] begins to bite down on [bite_target]'s neck!")) + + // Warn bite target + to_chat(bite_target, span_userdanger("[action_owner] has bitten your neck, and is trying to drain your blood!")) + + // Play a bite sound effect + playsound(action_owner, 'sound/weapons/bite.ogg', 30, 1, -2) + + // Try to perform action timer + if(!do_after(action_owner, time_interact, target = bite_target)) + // When failing + // Display a local chat message + action_owner.visible_message(span_danger("[action_owner]'s fangs are prematurely torn from [bite_target]'s neck, spilling [bite_target.p_their()] blood!")) + + // Bite target "drops" the blood + // This creates large blood splatter + bite_target.bleed(BLOODFLEDGE_DRAIN_NUM, FALSE) + + // Play splatter sound + playsound(get_turf(target), 'sound/effects/splat.ogg', 40, 1) + + // Check for masochism + if(!HAS_TRAIT(bite_target, TRAIT_MASO)) + // Force bite_target to play the scream emote + bite_target.emote("scream") + + // Log the biting action failure + log_combat(action_owner,bite_target,"bloodfledge bitten (interrupted)") + + // Return + return + + // Check if bite target species has blood + if(NOBLOOD in bite_target.dna.species.species_traits) + // Warn the user and target, then return + to_chat(bite_target, span_warning("[action_owner] tried to drain you, but didn't find any blood!")) + to_chat(action_owner, span_warning("[bite_target] doesn't have any blood to drink!")) + return + + // Create blood splatter + bite_target.add_splatter_floor(get_turf(bite_target), TRUE) + + // Checks for exotic species blood below + + // Variable for species with non-blood blood volumes + var/blood_valid = TRUE + + // Variable for gaining blood volume + var/blood_transfer = FALSE + + // Name of blood volume to be taken + // Action owner assumes blood until after drinking + var/blood_name = "blood" + + // Check bite target for synth blood + if(bite_target.mob_biotypes & MOB_ROBOTIC) + // Mark blood as invalid + blood_valid = FALSE + + // Set blood type name + blood_name = "coolant" + + // Check if the action owner is also a synth + if (action_owner.mob_biotypes & MOB_ROBOTIC) + // Allow gaining blood from this + blood_transfer = TRUE + + // Action owner is not a synth + else + // Warn the user + to_chat(action_owner, span_warning("That didn't taste like blood at all...")) + + // Add disgust + action_owner.adjust_disgust(2) + + // Cause negative mood + SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_synth", /datum/mood_event/drankblood_synth) + + // Check if bite target is a slime + if (isslimeperson(bite_target)) + // Mark blood as invalid + blood_valid = FALSE + + // Set blood type name + blood_name = "slime" + + // Check if the action owner is also a slime + if(isslimeperson(action_owner)) + // Allow gaining blood from this + blood_transfer = TRUE + + // Action owner is not a slime + else + // Warn the user + to_chat(action_owner, span_warning("You feel a sloshing presence inside you, but it dies out after a few moments.")) + + // Add disgust + action_owner.adjust_disgust(2) + + // Cause negative mood + SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_slime", /datum/mood_event/drankblood_slime) + + // End of species blood checks + + // Define user's remaining capacity to absorb blood + var/blood_volume_difference = BLOOD_VOLUME_MAXIMUM - action_owner.blood_volume + var/drained_blood = min(target_blood_volume, BLOODFLEDGE_DRAIN_NUM, blood_volume_difference) + + // Remove blood from bite target + bite_target.blood_volume = clamp(target_blood_volume - drained_blood, 0, BLOOD_VOLUME_MAXIMUM) + + // Perform a blood transfer + // This is done to transfer compatible diseases + // Grants nothing, unless blood transfer variable is set + bite_target.transfer_blood_to(action_owner, (blood_transfer ? drained_blood : 0), TRUE) + + // Check if action owner received valid (nourishing) blood + if(blood_valid) + // Add blood reagent to the user + action_owner.reagents.add_reagent(/datum/reagent/blood/, drained_blood) + + // Alert the bite target and local user of success + // Yes, this is AFTER the message for non-valid blood + to_chat(bite_target, span_danger("[action_owner] has taken some of your [blood_name]!")) + to_chat(action_owner, span_notice("You've drained some of [bite_target]'s [blood_name]!")) + + // Alert the action holder if blood volume limit was exceeded + if(blood_transfer && (action_owner.blood_volume >= BLOOD_VOLUME_MAXIMUM)) + to_chat(action_owner, span_warning("You body fails to absorb any more [blood_name]. The remainder has been lost.")) + + // Play a heartbeat sound effect + // This was changed to match bloodsucker + playsound(action_owner, 'sound/effects/singlebeat.ogg', 30, 1, -2) + + // Log the biting action success + log_combat(action_owner,bite_target,"bloodfledge bitten (successfully), transferring [blood_name]") + + // Mood events + // Check if bite target is dead or undead + if((bite_target.stat >= DEAD) || (bite_target.mob_biotypes & MOB_UNDEAD)) + // Warn the user + to_chat(action_owner, span_warning("The rotten [blood_name] tasted foul.")) + + // Add disgust + action_owner.adjust_disgust(2) + + // Cause negative mood + SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_dead", /datum/mood_event/drankblood_dead) + + // Check if bite target's blood has been depleted + if(!bite_target.blood_volume) + // Warn the user + to_chat(action_owner, span_warning("You've depleted [bite_target]'s [blood_name] supply!")) + + // Cause negative mood + SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_killed", /datum/mood_event/drankkilled) + + // Check if bite target has cursed blood + if(HAS_TRAIT(bite_target, TRAIT_CURSED_BLOOD)) + // Check action owner for cursed blood + var/owner_cursed = HAS_TRAIT(action_owner, TRAIT_CURSED_BLOOD) + + // Set chat message based on action owner's trait status + var/warn_message = (owner_cursed ? "You taste the unholy touch of a familiar curse in [bite_target]\'s blood." : "You experience a sensation of intense dread just after drinking from [bite_target]. Something about their blood feels... wrong.") + + // Alert user in chat + to_chat(action_owner, span_notice(warn_message)) + + // Set mood type based on curse status + var/mood_type = (owner_cursed ? /datum/mood_event/drank_cursed_good : /datum/mood_event/drank_cursed_bad) + + // Cause mood event + SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_cursed_blood", mood_type) + +// Action: Revive +/datum/action/bloodfledge/revive + name = "Fledgling Revive" + desc = "Expend all of your remaining energy to escape death." + button_icon_state = "power_strength" + +/datum/action/bloodfledge/revive/Trigger() + . = ..() + + // Define mob + var/mob/living/carbon/human/action_owner = owner + + // Early check for being dead + // Users are most likely to click this while alive + if(action_owner.stat != DEAD) + // Warn user in chat + to_chat(action_owner, "You can't use this ability while alive!") + + // Return + return + + // Define failure message + var/revive_failed + + // Condition: Mob isn't in a closed coffin + if(!istype(action_owner.loc, /obj/structure/closet/crate/coffin)) + revive_failed += "\n- You need to be in a closed coffin!" + + // Condition: Insufficient nutrition (blood) + if(action_owner.nutrition <= NUTRITION_LEVEL_STARVING) + revive_failed += "\n- You don't have enough blood left!" + + // Condition: Can be revived + // This is used by revive(), and must be checked here to prevent false feedback + if(!action_owner.can_be_revived()) + revive_failed += "\n- Your body is too weak to sustain life!" + + // Condition: Damage limit, brute + if(action_owner.getBruteLoss() >= MAX_REVIVE_BRUTE_DAMAGE) + revive_failed += "\n- Your body is too battered!" + + // Condition: Damage limit, burn + if(action_owner.getFireLoss() >= MAX_REVIVE_FIRE_DAMAGE) + revive_failed += "\n- Your body is too badly burned!" + + // Condition: Suicide + if(action_owner.suiciding) + revive_failed += "\n- You chose this path." + + // Condition: No revivals + if(HAS_TRAIT(action_owner, TRAIT_NOCLONE)) + revive_failed += "\n- You only had one chance." + + // Condition: Demonic contract + if(action_owner.hellbound) + revive_failed += "\n- The soul pact must be honored." + + // Check for failure + if(revive_failed) + // Set combined message + revive_failed = span_warning("You can't revive right now because: [revive_failed]") + + // Alert user in chat of failure + to_chat(action_owner, revive_failed) + + // Return + return + + // Define time dead + // Used for revive policy + var/time_dead = world.time - action_owner.timeofdeath + + // Revive the action owner + action_owner.revive() + + // Alert the user in chat of success + action_owner.visible_message(span_notice("An ominous energy radiates from the [action_owner.loc]..."), span_warning("You've expended all remaining blood to bring your body back to life!")) + + // Play a haunted sound effect + playsound(action_owner, 'sound/hallucinations/growl1.ogg', 30, 1, -2) + + // Remove all nutrition (blood) + action_owner.set_nutrition(0) + + // Apply daze effect + action_owner.Daze(20) + + // Define time limit for revival + // Determines memory loss, using defib time and policies + var/revive_time_limit = CONFIG_GET(number/defib_cmd_time_limit) * 10 + + // Define revive time threshold + // Late causes memory loss, according to policy + var/time_late = revive_time_limit && (time_dead > revive_time_limit) + + // Define policy to use + var/list/policies = CONFIG_GET(keyed_list/policy) + var/time_policy = time_late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT] + + // Check if policy exists + if(time_policy) + // Alert user in chat of policy + to_chat(action_owner, time_policy) + + // Log the revival and effective policy + action_owner.log_message("revived using a vampire quirk ability after being dead for [time_dead] deciseconds. Considered [time_late? "late" : "memory-intact"] revival under configured policy limits.", LOG_GAME) + +// +// Quirk: Werewolf +// + +/datum/action/werewolf + name = "Transform" + desc = "Transform into your wolf form." + icon_icon = 'modular_splurt/icons/mob/actions/misc_actions.dmi' + button_icon_state = "Transform" + var/transformed = FALSE + var/list/old_features = list("species" = SPECIES_HUMAN, "legs" = "Plantigrade", "size" = 1, "bark") + +/datum/action/werewolf/Trigger() + . = ..() + var/mob/living/carbon/human/H = owner + var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS) + var/obj/item/organ/genital/breasts/B = H.getorganslot(ORGAN_SLOT_BREASTS) + var/obj/item/organ/genital/vagina/V = H.getorganslot(ORGAN_SLOT_VAGINA) + H.shake_animation(2) + if(!transformed) // transform them + H.visible_message(span_danger("[H] shivers, their flesh bursting with a sudden growth of thick fur and their features contorting to that of a beast's, fully transforming them into a werewolf!")) + H.set_species(/datum/species/mammal, 1) + H.dna.species.mutant_bodyparts["mam_tail"] = "Wolf" + H.dna.species.mutant_bodyparts["legs"] = "Digitigrade" + H.Digitigrade_Leg_Swap(FALSE) + H.dna.species.mutant_bodyparts["mam_snouts"] = "Mammal, Thick" + H.dna.features["mam_ears"] = "Wolf" + H.dna.features["mam_tail"] = "Wolf" + H.dna.features["mam_snouts"] = "Mammal, Thick" + H.dna.features["legs"] = "Digitigrade" + H.update_size(get_size(H) + 0.5) + H.set_bark("bark") + H.custom_species = "Werewolf" + if(!(H.dna.species.species_traits.Find(DIGITIGRADE))) + H.dna.species.species_traits += DIGITIGRADE + H.update_body() + H.update_body_parts() + if(B) + B.color = "#[H.dna.features["mcolor"]]" + B.update() + if(P) + P.shape = "Knotted" + P.color = "#ff7c80" + P.update() + P.modify_size(6) + if(V) + V.shape = "Furred" + V.color = "#[H.dna.features["mcolor"]]" + V.update() + else // untransform them + H.visible_message(span_danger("[H] shrinks, their wolfish features quickly receding.")) + H.set_species(old_features["species"], TRUE) + H.set_bark(old_features["bark"]) + H.dna.features["mam_ears"] = old_features["mam_ears"] + H.dna.features["mam_snouts"] = old_features["mam_snouts"] + H.dna.features["mam_tail"] = old_features["mam_tail"] + H.dna.features["legs"] = old_features["legs"] //i hate legs i hate legs i hate legs i hate legs i hate legs i hate legs i hate legs + if(old_features["legs"] == "Plantigrade") + H.dna.species.species_traits -= DIGITIGRADE + H.Digitigrade_Leg_Swap(TRUE) + H.dna.species.mutant_bodyparts["legs"] = old_features["legs"] + H.update_body() + H.update_body_parts() + H.update_size(get_size(H) - 0.5) + if(B) + B.color = "#[old_features["breasts_color"]]" + B.update() + if(H.has_penis()) + P.shape = old_features["cock_shape"] + P.color = "#[old_features["cock_color"]]" + P.update() + P.modify_size(-6) + if(H.has_vagina()) + V.shape = old_features["vag_shape"] + V.color = "#[old_features["vag_color"]]" + V.update() + V.update_size() + transformed = !transformed + +/datum/action/werewolf/Grant()// on grant sets some variables + . = ..() + var/mob/living/carbon/human/H = owner + old_features = H.dna.features.Copy() + old_features["species"] = H.dna.species.type + old_features["size"] = get_size(H) + old_features["bark"] = H.vocal_bark_id + + +/datum/action/gargoyle/transform + name = "Transform" + desc = "Transform into a statue, regaining energy in the process. Additionally, you will slowly heal while in statue form." + icon_icon = 'icons/mob/actions/actions_changeling.dmi' + button_icon_state = "ling_camouflage" + var/obj/structure/statue/gargoyle/current = null + + +/datum/action/gargoyle/transform/Trigger() + .=..() + var/mob/living/carbon/human/H = owner + var/datum/quirk/gargoyle/T = locate() in H.roundstart_quirks + if(!T.cooldown) + if(!T.transformed) + if(!isturf(H.loc)) + return 0 + var/obj/structure/statue/gargoyle/S = new(H.loc, H) + S.name = "statue of [H.name]" + H.bleedsuppress = 1 + S.copy_overlays(H) + var/newcolor = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + S.add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) + current = S + T.transformed = 1 + T.cooldown = 30 + T.paused = 0 + S.dir = H.dir + return 1 + else + qdel(current) + T.transformed = 0 + T.cooldown = 30 + T.paused = 0 + H.visible_message(span_warning("[H]'s skin rapidly softens, returning them to normal!"), span_userdanger("Your skin softens, freeing your movement once more!")) + else + to_chat(H, span_warning("You have transformed too recently; you cannot yet transform again!")) + return 0 + +// +// Quirk: Gargoyle +// + +/datum/action/gargoyle/check + name = "Check" + desc = "Check your current energy levels." + icon_icon = 'icons/mob/actions/actions_clockcult.dmi' + button_icon_state = "Linked Vanguard" + +/datum/action/gargoyle/check/Trigger() + .=..() + var/mob/living/carbon/human/H = owner + var/datum/quirk/gargoyle/T = locate() in H.roundstart_quirks + to_chat(H, span_warning("You have [T.energy]/100 energy remaining!")) + +/datum/action/gargoyle/pause + name = "Preserve" + desc = "Become near-motionless, thusly conserving your energy until you move from your current tile. Note, you will lose a chunk of energy when you inevitably move from your current position, so you cannot abuse this!" + icon_icon = 'icons/mob/actions/actions_flightsuit.dmi' + button_icon_state = "flightsuit_lock" + +/datum/action/gargoyle/pause/Trigger() + .=..() + var/mob/living/carbon/human/H = owner + var/datum/quirk/gargoyle/T = locate() in H.roundstart_quirks + + if(!T.paused) + T.paused = 1 + T.position = H.loc + to_chat(H, span_warning("You are now conserving your energy; this effect will end the moment you move from your current position!")) + return + else + to_chat(H, span_warning("You are already conserving your energy!")) diff --git a/modular_splurt/code/game/area/areas/holodeck.dm b/modular_splurt/code/game/area/areas/holodeck.dm new file mode 100644 index 0000000000..2e60a0e247 --- /dev/null +++ b/modular_splurt/code/game/area/areas/holodeck.dm @@ -0,0 +1,7 @@ +// Replacement for holodeck plasma module +/area/holodeck/rec_center/burn + name = "Holodeck - CRITICAL ERROR" + +// Replacement for holodeck carp module +/area/holodeck/rec_center/wildlife + name = "Holodeck - Wasteland Simulation" diff --git a/modular_splurt/code/game/machinery/computer/slavery.dm b/modular_splurt/code/game/machinery/computer/slavery.dm index 2466ef3b67..303078cbc7 100644 --- a/modular_splurt/code/game/machinery/computer/slavery.dm +++ b/modular_splurt/code/game/machinery/computer/slavery.dm @@ -165,7 +165,7 @@ if(!input || !user.canUseTopic(src, !issilicon(usr))) return if(!(user.can_speak())) //No more cheating, mime/random mute guy! - to_chat(user, "You find yourself unable to speak.") + to_chat(user, span_warning("You find yourself unable to speak.")) return input = user.treat_message(input) //Adds slurs and so on. Someone should make this use languages too. @@ -232,8 +232,8 @@ new /obj/effect/temp_visual/dir_setting/ninja(get_turf(collar.loc), collar.loc.dir) playsound(get_turf(src.loc), 'sound/effects/bamf.ogg', 50, 1) - visible_message("[collar.loc] vanishes into the droppod.", \ - "You are taken by the droppod.") + visible_message(span_notice("[collar.loc] vanishes into the droppod."), \ + span_notice("You are taken by the droppod.")) var/area/pod_storage_area = locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas var/mob/living/M = collar.loc diff --git a/modular_splurt/code/game/machinery/research_table.dm b/modular_splurt/code/game/machinery/research_table.dm index 19b1e9f3a0..c984bec303 100644 --- a/modular_splurt/code/game/machinery/research_table.dm +++ b/modular_splurt/code/game/machinery/research_table.dm @@ -25,21 +25,21 @@ /obj/machinery/research_table/examine(mob/user) . = ..() if(configured) - . += "The same person can be used up to [max_repeat_usage * tier] time\s." + . += span_notice("The same person can be used up to [max_repeat_usage * tier] time\s.") switch(point_type) if(POINT_TYPE_SCIENCE) - . += "The table is set to generate science points." + . += span_notice("The table is set to generate science points.") else - . += "The table is set to generate money for cargo." + . += span_notice("The table is set to generate money for cargo.") if(!configured && !panel_open) - . += "It's not configured yet, you could use a multitool to configure it." + . += span_notice("It's not configured yet, you could use a multitool to configure it.") if(panel_open) - . += "The panel is screwed open and you could change generation type with a multitool." + . += span_notice("The panel is screwed open and you could change generation type with a multitool.") /obj/machinery/research_table/multitool_act(mob/living/user, obj/item/I) if(user.a_intent == INTENT_HELP) if(panel_open && !slaver_mode) // Do not let slaver version switch to science mode, they should only generate credits. - user.visible_message("[user] begins changing the generation type on \the [src].", "You begin changing the generation type on \the [src].") + user.visible_message(span_notice("[user] begins changing the generation type on \the [src]."), span_notice("You begin changing the generation type on \the [src].")) if(do_after(user, 5 SECONDS, TRUE, src)) point_type = point_type == POINT_TYPE_SCIENCE ? POINT_TYPE_CARGO : POINT_TYPE_SCIENCE var/generation_message = null @@ -48,17 +48,17 @@ generation_message = "generate research points for science" else generation_message = "generate money for cargo" - user.visible_message("[user] finished changing the generation type on \the [src].", "You change the generation type on \the [src] to [generation_message].") + user.visible_message(span_notice("[user] finished changing the generation type on \the [src]."), span_notice("You change the generation type on \the [src] to [generation_message].")) else - to_chat(user, "You need to stand still and uninterrupted for 5 seconds!") + to_chat(user, span_warning("You need to stand still and uninterrupted for 5 seconds!")) return STOP_ATTACK_PROC_CHAIN else - user.visible_message("[user] begins reconfiguring \the [src].", "You begin reconfiguring \the [src].") + user.visible_message(span_notice("[user] begins reconfiguring \the [src]."), span_notice("You begin reconfiguring \the [src].")) if(do_after(user, 5 SECONDS, TRUE, src)) configured = !configured - user.visible_message("[user] finished reconfiguring \the [src].", "The research table is now [configured ? "configured" : "not configured"].") + user.visible_message(span_notice("[user] finished reconfiguring \the [src]."), span_notice("The research table is now [configured ? "configured" : "not configured"].")) else - to_chat(user, "You need to stand still and uninterrupted for 5 seconds!") + to_chat(user, span_warning("You need to stand still and uninterrupted for 5 seconds!")) return STOP_ATTACK_PROC_CHAIN . = ..() @@ -92,9 +92,9 @@ return if(!handle_unbuckling(buckled_mob, user)) if(buckled_mob == user) - to_chat(user, "You fail to unbuckle yourself.") + to_chat(user, span_warning("You fail to unbuckle yourself.")) else - to_chat(user, "You fail to unbuckle [buckled_mob].") + to_chat(user, span_warning("You fail to unbuckle [buckled_mob].")) return UnregisterSignal(buckled_mob, COMSIG_MOB_CAME) say("User left, resetting scanners.") diff --git a/modular_splurt/code/game/objects/items.dm b/modular_splurt/code/game/objects/items.dm index b45807289f..c320da9586 100644 --- a/modular_splurt/code/game/objects/items.dm +++ b/modular_splurt/code/game/objects/items.dm @@ -77,7 +77,7 @@ return if(style == "long" && !(istype(target_organ, /obj/item/organ/genital/vagina))) //long vibrators dont fit on anything but vaginas, but small ones fit everywhere - to_chat(user, "[src] is too big to fit there, use a smaller version.") + to_chat(user, span_warning("[src] is too big to fit there, use a smaller version.")) return if(locate(src.type) in target_organ.contents) diff --git a/modular_splurt/code/game/objects/items/RCD.dm b/modular_splurt/code/game/objects/items/RCD.dm index bf27d44f12..e8bc24ae5b 100644 --- a/modular_splurt/code/game/objects/items/RCD.dm +++ b/modular_splurt/code/game/objects/items/RCD.dm @@ -54,7 +54,7 @@ structure_data["cost"][blueprint] = 20 playsound(src, 'sound/effects/pop.ogg', 50, FALSE) - to_chat(user, "You change [name]s blueprint to '[choice]'.") + to_chat(user, span_notice("You change [name]s blueprint to '[choice]'.")) // Also pretty much rcd_create but named differently. I'm shameless, fuck you. /obj/item/construction/tables/proc/create_table(atom/A, mob/user) @@ -91,5 +91,5 @@ create_table(A, user) /obj/item/construction/tables/suicide_act(mob/user) - user.visible_message("[user] sets the RTC to 'Glass Table' and points it down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide.") + user.visible_message(span_suicide("[user] sets the RTC to 'Glass Table' and points it down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide.")) return (BRUTELOSS) diff --git a/modular_splurt/code/game/objects/items/RTL.dm b/modular_splurt/code/game/objects/items/RTL.dm index d3637ab2f0..6db6eb7306 100644 --- a/modular_splurt/code/game/objects/items/RTL.dm +++ b/modular_splurt/code/game/objects/items/RTL.dm @@ -58,7 +58,7 @@ /obj/item/rtl/examine(mob/user) . = ..() - . += "Alt-click to set what tile to lay." + . += span_notice("Alt-click to set what tile to lay.") if(loaded) . += span_info("It contains [loaded.amount]/[max_amount] metal.") diff --git a/modular_splurt/code/game/objects/items/cards_ids.dm b/modular_splurt/code/game/objects/items/cards_ids.dm index 0d24bd0085..69debcec83 100644 --- a/modular_splurt/code/game/objects/items/cards_ids.dm +++ b/modular_splurt/code/game/objects/items/cards_ids.dm @@ -8,9 +8,12 @@ desc = "A cheap ID used by slave traders. This guy seems to run the show." /obj/item/card/id/vampire - name = "Vampire ID" - desc = "An ID made to easily recognize vampires without needing to do tests" + name = "Bloodfledge ID" + desc = "An ID made to easily recognize bloodsucker fledglings without requiring medical scans." + icon = 'modular_splurt/icons/obj/card.dmi' icon_state = "vampire" + assignment = "Bloodsucker Fledgling" + uses_overlays = FALSE /obj/item/card/id/away/hotel/splurt name = "Staff ID" diff --git a/modular_splurt/code/game/objects/items/cosmetics.dm b/modular_splurt/code/game/objects/items/cosmetics.dm index 972c7d0d7a..0a4b28c3c6 100644 --- a/modular_splurt/code/game/objects/items/cosmetics.dm +++ b/modular_splurt/code/game/objects/items/cosmetics.dm @@ -85,22 +85,22 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.nail_style) //to stop stacking bugs - to_chat(user, "Remove the old nail polish first!") + to_chat(user, span_warning("Remove the old nail polish first!")) if(H == user) - user.visible_message("[user] does [user.p_their()] nails with \the [src].", \ - "You take a moment to apply \the [src]. Perfect!") + user.visible_message(span_notice("[user] does [user.p_their()] nails with \the [src]."), \ + span_notice("You take a moment to apply \the [src]. Perfect!")) H.nail_style = "nails" H.nail_color = paint H.update_body() else - user.visible_message("[user] begins to do [H]'s nails with \the [src].", \ - "You begin to apply \the [src] on [H]'s nails...") + user.visible_message(span_warning("[user] begins to do [H]'s nails with \the [src]."), \ + span_notice("You begin to apply \the [src] on [H]'s nails...")) if(do_after(user, 20, target = H)) user.visible_message("[user] does [H]'s nails with \the [src].", \ - "You apply \the [src] on [H]'s nails.") + span_notice("You apply \the [src] on [H]'s nails.")) H.nail_style = "nails" H.nail_color = paint H.update_body() else - to_chat(user, "Where are the nail on that?") + to_chat(user, span_warning("Where are the nail on that?")) diff --git a/modular_splurt/code/game/objects/items/devices/PDA/radio.dm b/modular_splurt/code/game/objects/items/devices/PDA/radio.dm new file mode 100644 index 0000000000..016d1f10ef --- /dev/null +++ b/modular_splurt/code/game/objects/items/devices/PDA/radio.dm @@ -0,0 +1,4 @@ +/obj/item/cartridge/cmo/Initialize(mapload) + //adds chemistry access + access |= CART_CHEMISTRY + . = ..() diff --git a/modular_splurt/code/game/objects/items/devices/radio/electropack.dm b/modular_splurt/code/game/objects/items/devices/radio/electropack.dm index 6ac56d7020..283605b9bc 100644 --- a/modular_splurt/code/game/objects/items/devices/radio/electropack.dm +++ b/modular_splurt/code/game/objects/items/devices/radio/electropack.dm @@ -65,8 +65,8 @@ /obj/item/electropack/shockcollar/slave/Destroy() - visible_message("The [src] detaches from [src.loc]'s neck.", \ - "The [src] detaches from your neck.") + visible_message(span_notice("The [src] detaches from [src.loc]'s neck."), \ + span_notice("The [src] detaches from your neck.")) playsound(get_turf(src.loc), 'sound/machines/terminal_eject_disc.ogg', 50, 1) GLOB.tracked_slaves -= src diff --git a/modular_splurt/code/game/objects/items/holy_weapons.dm b/modular_splurt/code/game/objects/items/holy_weapons.dm index 0af2838523..b14e87f890 100644 --- a/modular_splurt/code/game/objects/items/holy_weapons.dm +++ b/modular_splurt/code/game/objects/items/holy_weapons.dm @@ -9,3 +9,38 @@ slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_BULKY attack_verb = list("smacked", "struck", "cracked", "beaten") + +/obj/item/nullrod/papal_staff + name = "papal staff" + desc = "A staff used by traditional bishops and popes." + icon = 'modular_splurt/icons/obj/items_and_weapons.dmi' + icon_state = "papal_staff" + item_state = "papal_staff" + lefthand_file = 'modular_splurt/icons/mob/inhands/weapons/melee_lefthand.dmi' + righthand_file = 'modular_splurt/icons/mob/inhands/weapons/melee_righthand.dmi' + w_class = WEIGHT_CLASS_BULKY + attack_verb = list("smacked", "struck", "cracked", "beaten", "purified") + +/obj/item/clothing/head/mitre + name = "papal mitre" + desc = "A traditional headdress, worn by bishops and popes in traditional Christianity" + icon = 'modular_splurt/icons/obj/clothing/hats.dmi' + mob_overlay_icon = 'modular_splurt/icons/mob/clothing/32x48_head.dmi' + icon_state = "mitre" + flags_inv = HIDEHAIR | HIDEFACIALHAIR + +/obj/item/clothing/suit/chaplain/papal + name = "papal robe" + desc = "A short cape over a cassock, worn by bishops and popes in traditional Christianity" + icon = 'modular_splurt/icons/obj/clothing/suits.dmi' + mob_overlay_icon = 'modular_splurt/icons/mobs/suits.dmi' + icon_state = "papalrobe" + body_parts_covered = CHEST|GROIN|LEGS|ARMS + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON + +/obj/item/storage/box/holy/papal + name = "Papal Kit" + +/obj/item/storage/box/holy/papal/PopulateContents() + new /obj/item/clothing/head/mitre(src) + new /obj/item/clothing/suit/chaplain/papal(src) diff --git a/modular_splurt/code/game/objects/items/implants/implant_aphropumps.dm b/modular_splurt/code/game/objects/items/implants/implant_aphropumps.dm index ecaec5bfbe..f900dcba28 100644 --- a/modular_splurt/code/game/objects/items/implants/implant_aphropumps.dm +++ b/modular_splurt/code/game/objects/items/implants/implant_aphropumps.dm @@ -93,7 +93,7 @@ /obj/item/storage/box/aphrodisiac_pump/examine(mob/user) . = ..() - . += "Click the implant case while with the implant inside to change the desired dosage amounts." + . += span_notice("Click the implant case while with the implant inside to change the desired dosage amounts.") /obj/item/storage/box/aphrodisiac_pump/ComponentInitialize() . = ..() diff --git a/modular_splurt/code/game/objects/items/implants/implant_disrobe.dm b/modular_splurt/code/game/objects/items/implants/implant_disrobe.dm new file mode 100644 index 0000000000..e8656ab155 --- /dev/null +++ b/modular_splurt/code/game/objects/items/implants/implant_disrobe.dm @@ -0,0 +1,67 @@ +/obj/item/implant/disrobe + name = "rapid disrobe implant" + icon = 'icons/obj/clothing/uniforms.dmi' + icon_state = "grey" + + // Custom action for extra customization + actions_types = list(/datum/action/item_action/disrobe) + +// Implant flavor text +/obj/item/implant/disrobe_ultra/get_data() + // Define text variable + var/dat = {" + Implant Specifications:
+ Name: Rapid Disrobe Implant
+ Important Notes: Nanotransen requires employees to follow workplace safety standards, including protective clothing.
+
+ Implant Details:
+ Function: Lines the subject's epidermis with high power static charge nodes, allowing the rapid removal of worn clothing.
+ Special Features: Will not cause drunkenness in most subjects.
+ Integrity: Implant will last so long as it is inside the host. + "} + + // Return text + return dat + +// Only allow use on "human" targets +/obj/item/implant/disrobe/can_be_implanted_in(mob/living/target) + if(!ishuman(target)) + return FALSE + . = ..() + +// Runs on toggling the implant +/obj/item/implant/disrobe/activate() + . = ..() + + // Define target + var/mob/living/carbon/target_user = imp_in + + // Perform LPD effect + target_user.clothing_burst(target_user) + +/* + * Action datums +*/ + +// Action for rapid wardrobe removal +/datum/action/item_action/disrobe + name = "Rapid Disrobe" + desc = "Instantly eject all covering clothing from your body." + icon_icon = 'modular_splurt/icons/mob/actions/misc_actions.dmi' + button_icon_state = "no_uniform" + background_icon_state = "bg_tech" + +/* + * Implant items +*/ + +// Implanter item +/obj/item/implanter/disrobe + name = "implanter (rapid disrobe)" + imp_type = /obj/item/implant/disrobe + +// Implant case item +/obj/item/implantcase/disrobe + name = "implant case - 'rapid disrobe'" + desc = "A glass case containing a rapid disrobe implant." + imp_type = /obj/item/implant/disrobe diff --git a/modular_splurt/code/game/objects/items/implants/implant_gfluid.dm b/modular_splurt/code/game/objects/items/implants/implant_gfluid.dm index 8c54ed9d3c..a337f5aa44 100644 --- a/modular_splurt/code/game/objects/items/implants/implant_gfluid.dm +++ b/modular_splurt/code/game/objects/items/implants/implant_gfluid.dm @@ -4,6 +4,10 @@ icon_state = "genital_fluid" var/use_blacklist = TRUE + // Custom action for extra customization + actions_types = list(/datum/action/item_action/genital_fluid_infuse) + +// Implant flavor text /obj/item/implant/genital_fluid/get_data() var/dat = {"Implant Specifications:
Name: Nanotrasen Genital Fluid Inducer Implant
@@ -12,69 +16,119 @@ Implant Details:
Function: Allows the user to induce their genitals into producing a specific reagent.
Special Features: Will prevent harmful liquids from being accepted as a genital fluid replace.
- Integrity: Implant will last so long as the implant is inside the host and they posess genitals capable of fluid production."} + Integrity: Implant will last so long as the implant is inside the host and they possess genitals capable of fluid production."} return dat +// Only allow use on "human" targets /obj/item/implant/genital_fluid/can_be_implanted_in(mob/living/target) if(!ishuman(target)) return FALSE . = ..() +// Runs on toggling the implant /obj/item/implant/genital_fluid/activate() . = ..() - var/list/obj/item/organ/genital/penidlist - var/list/datum/reagent/fluidlist = list() - var/mob/living/carbon/human/owner = imp_in - //List their genitals if they have any at all - for(var/obj/item/organ/genital/dicc in owner.internal_organs) - if(istype(dicc) && (dicc.genital_flags & GENITAL_FUID_PRODUCTION)) - LAZYADD(penidlist, dicc) + // Set list of possible genitals + var/list/obj/item/organ/genital/genitals_list + + // Set list of possible fluids + var/list/datum/reagent/fluid_list = list() + + // Set owner + var/mob/living/carbon/human/genital_owner = imp_in - //List their current reagents if they're valid - for(var/datum/reagent/pee in owner.reagents.reagent_list) - if((find_reagent_object_from_type(pee.type)) && ((pee.type in allowed_gfluid_paths()) || !use_blacklist)) - LAZYADD(fluidlist, find_reagent_object_from_type(pee.type)) + // List their genitals if they have any at all + for(var/obj/item/organ/genital/genital_checked in genital_owner.internal_organs) + if(istype(genital_checked) && (genital_checked.genital_flags & GENITAL_FUID_PRODUCTION)) + // Add genitals to the list + LAZYADD(genitals_list, genital_checked) - //List any reagents they may be holding in their hands - if(owner.available_rosie_palms(TRUE, /obj/item/reagent_containers)) - for(var/obj/item/reagent_containers/container in owner.held_items) + // List their current reagents if they're valid + for(var/datum/reagent/genital_reagent in genital_owner.reagents.reagent_list) + if((find_reagent_object_from_type(genital_reagent.type)) && ((genital_reagent.type in allowed_gfluid_paths()) || !use_blacklist)) + // Add valid reagents to the list + LAZYADD(fluid_list, find_reagent_object_from_type(genital_reagent.type)) + + // List any reagents they may be holding in their hands + if(genital_owner.available_rosie_palms(TRUE, /obj/item/reagent_containers)) + for(var/obj/item/reagent_containers/container in genital_owner.held_items) if(container.is_open_container() || istype(container, /obj/item/reagent_containers/food/snacks)) - for(var/datum/reagent/pee in container.reagents.reagent_list) - if((find_reagent_object_from_type(pee.type)) && ((pee.type in allowed_gfluid_paths()) || !use_blacklist)) - LAZYADD(fluidlist, find_reagent_object_from_type(pee.type)) + for(var/datum/reagent/genital_reagent in container.reagents.reagent_list) + if((find_reagent_object_from_type(genital_reagent.type)) && ((genital_reagent.type in allowed_gfluid_paths()) || !use_blacklist)) + // Add valid reagents to the list + LAZYADD(fluid_list, find_reagent_object_from_type(genital_reagent.type)) - //Return if genitals list is void/null - if(!penidlist) - SEND_SOUND(owner, 'sound/machines/terminal_error.ogg') - to_chat(owner, span_notice("ERROR: No compatible genitals detected.")) + // Return if genitals list is void/null + if(!genitals_list) + // Play an error sound + SEND_SOUND(genital_owner, 'sound/machines/terminal_error.ogg') + + // Alert the user in chat + to_chat(genital_owner, span_notice("ERROR: No compatible genitals detected.")) + + // Escape return - var/obj/item/organ/genital/cocc = tgui_input_list(owner, "Pick a genital", "Genital Fluid Infuser", penidlist) - if(!cocc) + // Prompt user for which genital to use + var/obj/item/organ/genital/genital_input = tgui_input_list(genital_owner, "Pick a genital", "Genital Fluid Infuser", genitals_list) + if(!genital_input) + // No selection was made return - fluidlist = list(find_reagent_object_from_type(cocc.get_default_fluid())) + fluidlist + // Update list of possible fluids + fluid_list = list(find_reagent_object_from_type(genital_input.get_default_fluid())) + fluid_list - var/datum/reagent/selection = tgui_input_list(owner, "Choose your new reagent", "Genital Fluid Infuser", fluidlist) - if(!selection) + // Prompt user to select a new fluid + var/datum/reagent/reagent_selection = tgui_input_list(genital_owner, "Choose your new reagent", "Genital Fluid Infuser", fluid_list) + if(!reagent_selection) + // No selection was made return - cocc.fluid_id = selection.type - SEND_SOUND(owner, 'sound/effects/bubbles.ogg') - to_chat(owner, span_notice("You feel the fluids inside your [cocc.name] bubble and swirl...")) - message_admins("[ADMIN_LOOKUPFLW(owner)] changed the fluid of their [owner.p_their()] [cocc.name] to [selection].") + // Set new fluid + genital_input.fluid_id = reagent_selection.type + + // Play the reagent processing sound effect + SEND_SOUND(genital_owner, 'sound/effects/bubbles.ogg') + + // Display flavor text + to_chat(genital_owner, span_notice("You feel the fluids inside your [genital_input.name] bubble and swirl...")) + // Send admin notice + message_admins("[ADMIN_LOOKUPFLW(genital_owner)] changed the fluid of [genital_owner.p_their()] [genital_input.name] to [reagent_selection].") + +// Unlock with an emag /obj/item/implant/genital_fluid/emag_act() . = ..() name = "hacked genital fluid implant" use_blacklist = FALSE obj_flags |= EMAGGED +/* + * Action datum +*/ + +// Action for updating genital fluids +/datum/action/item_action/genital_fluid_infuse + name = "Infuse Genital Fluids" + desc = "Activate an integrated reagent receptor device to modify your genital contents." + icon_icon = 'modular_splurt/icons/obj/implants.dmi' + button_icon_state = "genital_fluid" + background_icon_state = "bg_tech" + + // Restrict non-synthesizable reagents? + var/use_blacklist = TRUE + +/* + * Implant items +*/ + +// Implanter item /obj/item/implanter/genital_fluid name = "implanter (genital fluid)" imp_type = /obj/item/implant/genital_fluid +// Implanter item, emagged /obj/item/implanter/genital_fluid/hacked name = "implanter (genital fluid (hacked))" @@ -84,11 +138,13 @@ var/obj/item/implant/genital_fluid/I = imp I.emag_act() +// Implant case item /obj/item/implantcase/genital_fluid name = "implant case - 'Genital Fluid'" desc = "A glass case containing a Genital Fluid Infuser implant." imp_type = /obj/item/implant/genital_fluid +// Implant case item, emagged /obj/item/implantcase/genital_fluid/hacked name = "implant case - 'Genital Fluid (Hacked)'" diff --git a/modular_splurt/code/game/objects/items/implants/implant_hide_backpack.dm b/modular_splurt/code/game/objects/items/implants/implant_hide_backpack.dm new file mode 100644 index 0000000000..5a0d4ada8f --- /dev/null +++ b/modular_splurt/code/game/objects/items/implants/implant_hide_backpack.dm @@ -0,0 +1,117 @@ +/obj/item/implant/hide_backpack + name = "storage concealment implant" + desc = "Prevents your backpack from being observable by the naked eye." + icon = 'modular_splurt/icons/obj/storage.dmi' + icon_state = "backpack_faded" + + // Custom action for extra customization + actions_types = list(/datum/action/item_action/hide_backpack) + +// Implant flavor text +/obj/item/implant/hide_backpack/get_data() + var/dat = {"Implant Specifications:
+ Name: Chameleon Storage Concealment Implant
+ Important Notes: Pending approval from some security teams.
+
+ Implant Details:
+ Function: Subject emits a weak psychic signal that conceals the presence of back-equipped gear items.
+ Integrity: Implant will last so long as the implant is inside the host."} + return dat + +// Only allow use on "human" targets +/obj/item/implant/hide_backpack/can_be_implanted_in(mob/living/target) + if(!ishuman(target)) + return FALSE + . = ..() + +/* + * Action datum +*/ + +// Action for toggling backpack +/datum/action/item_action/hide_backpack + name = "Conceal Backwear" + desc = "Toggle a weak psychic signal that conceals the presence of back-equipped gear items." + icon_icon = 'modular_splurt/icons/obj/storage.dmi' + button_icon_state = "backpack_faded" + background_icon_state = "bg_tech" + + // Is this being used? + var/ability_active = TRUE + +// Runs on gaining the ability +/datum/action/item_action/hide_backpack/Grant(mob/user) + . = ..() + + // Add the trait + adjust_trait(TRUE) + +// Runs on losing the ability +/datum/action/item_action/hide_backpack/Remove(mob/user) + . = ..() + + // Remove the trait + adjust_trait(FALSE) + +// Function to update trait +/datum/action/item_action/hide_backpack/proc/adjust_trait(state) + // Set owner + var/mob/living/carbon/human/action_owner = owner + + // Toggle trait status + if(state) + ADD_TRAIT(action_owner, TRAIT_HIDE_BACKPACK, TRAIT_GENERIC) + else + REMOVE_TRAIT(action_owner, TRAIT_HIDE_BACKPACK, TRAIT_GENERIC) + + // Update sprites + action_owner.update_inv_back() + +// Runs on toggling the ability +/datum/action/item_action/hide_backpack/Trigger() + // Set owner + var/mob/living/carbon/human/action_owner = owner + + // Update active status + ability_active = !ability_active + + // Update trait + adjust_trait(ability_active) + + // Set icon state variables + if(ability_active) + // Half-faded backpack + icon_icon = 'modular_splurt/icons/obj/storage.dmi' + button_icon_state = "backpack_faded" + else + // Normal backpack + icon_icon = 'icons/obj/storage.dmi' + button_icon_state = "backpack" + + // Update icon state + UpdateButtonIcon() + + // Display fake sparks to match flavor text + do_fake_sparks(2,FALSE,action_owner) + + // Set toggle text based on active state + var/implant_toggle_text = (!ability_active ? "discernible" : "imperceptible") + var/implant_toggle_text_2 = (!ability_active ? "dis" : "") // Engage or Disengage + + // Display a chat message + action_owner.visible_message(span_notice("The equipment worn on [action_owner]'s back-region flickers momentarily, before becoming [implant_toggle_text]."), span_notice("You [implant_toggle_text_2]engage the Storage Concealment Implant, causing your backpack to be [implant_toggle_text].")) + +/* + * Implant items +*/ + +// Implanter item +/obj/item/implanter/hide_backpack + name = "implanter (storage concealment)" + imp_type = /obj/item/implant/hide_backpack + +// Implant case item +/obj/item/implantcase/hide_backpack + name = "implant case - 'Storage Concealment'" + desc = "A glass case containing a Storage Concealment implant." + imp_type = /obj/item/implant/hide_backpack diff --git a/modular_splurt/code/game/objects/items/implants/implant_slave.dm b/modular_splurt/code/game/objects/items/implants/implant_slave.dm index eb3cf71a93..bfddecea22 100644 --- a/modular_splurt/code/game/objects/items/implants/implant_slave.dm +++ b/modular_splurt/code/game/objects/items/implants/implant_slave.dm @@ -28,9 +28,9 @@ if(target.mind.has_antag_datum(/datum/antagonist/rev/head) || target.mind.unconvertable || target.mind.assigned_role == "Security Officer" || target.mind.assigned_role == "Detective" || target.mind.assigned_role == "Warden" || target.mind.assigned_role == "Head of Security" || HAS_TRAIT(target, TRAIT_MINDSHIELD)) if(!silent) if(target.mind.assigned_role == "Security Officer" || target.mind.assigned_role == "Detective" || target.mind.assigned_role == "Warden" || target.mind.assigned_role == "Head of Security") - target.visible_message("[target] seems to resist the implant! You can't enslave a member of security!", "You feel something interfering with your mental conditioning, but you resist it!") + target.visible_message(span_warning("[target] seems to resist the implant! You can't enslave a member of security!"), span_warning("You feel something interfering with your mental conditioning, but you resist it!")) else - target.visible_message("[target] seems to resist the implant!", "You feel something interfering with your mental conditioning, but you resist it!") + target.visible_message(span_warning("[target] seems to resist the implant!"), span_warning("You feel something interfering with your mental conditioning, but you resist it!")) var/obj/item/implanter/I = loc removed(target, 1) qdel(src) @@ -47,9 +47,9 @@ target.mind.remove_antag_datum(/datum/antagonist/gang) if(!silent) if(target.mind in SSticker.mode.cult) - to_chat(target, "You feel something interfering with your mental conditioning, but you resist it!") + to_chat(target, span_warning("You feel something interfering with your mental conditioning, but you resist it!")) else - to_chat(target, "You feel a sense of peace and security. You are now enslaved!") + to_chat(target, span_notice("You feel a sense of peace and security. You are now enslaved!")) var/slave_objective = "[((target.client?.prefs.cit_toggles & HYPNO)?"Security has enslaved you into being their pet! Obey their commands, but remember: a good pet is not violent.":"You've been neutralized by security! Follow their orders, but remember: neutralization also means nonviolence.")]" brainwash(target, slave_objective) target.sec_hud_set_implants() @@ -63,7 +63,7 @@ target.mind.remove_antag_datum(/datum/antagonist/brainwashed) L.sec_hud_set_implants() if(target.stat != DEAD && !silent) - to_chat(target, "Your mind suddenly feels free from burden. You are no longer enslaved!") + to_chat(target, span_boldnotice("Your mind suddenly feels free from burden. You are no longer enslaved!")) return 1 return 0 diff --git a/modular_splurt/code/game/objects/items/implants/implant_slaver.dm b/modular_splurt/code/game/objects/items/implants/implant_slaver.dm index afa70e3e21..54ec564bd6 100644 --- a/modular_splurt/code/game/objects/items/implants/implant_slaver.dm +++ b/modular_splurt/code/game/objects/items/implants/implant_slaver.dm @@ -7,11 +7,11 @@ /obj/item/implant/slaver/activate() . = ..() - imp_in.visible_message("[imp_in] begins fiddling with a subtle bump on their arm.", "You prepare to teleport.") + imp_in.visible_message(span_notice("[imp_in] begins fiddling with a subtle bump on their arm."), span_notice("You prepare to teleport.")) if(do_mob(imp_in, imp_in, 5 SECONDS, ignorehelditem = TRUE)) playsound(get_turf(imp_in.loc), 'sound/magic/blink.ogg', 50, 1) - imp_in.visible_message("[imp_in] vanishes from sight!", \ - "You activate [src], sending you to the slaver mothership!") + imp_in.visible_message(span_notice("[imp_in] vanishes from sight!"), \ + span_notice("You activate [src], sending you to the slaver mothership!")) new /obj/effect/temp_visual/dir_setting/ninja(get_turf(imp_in), imp_in.dir) var/list/L = list() @@ -26,7 +26,7 @@ qdel(src) else - to_chat(imp_in, "You need to stand still and uninterrupted for 5 seconds!") + to_chat(imp_in, span_warning("You need to stand still and uninterrupted for 5 seconds!")) /obj/item/implant/slaver/get_data() var/dat = {"Implant Specifications:
diff --git a/modular_splurt/code/game/objects/items/implants/implantcase.dm b/modular_splurt/code/game/objects/items/implants/implantcase.dm index e4b8f51284..0cb8594b7b 100644 --- a/modular_splurt/code/game/objects/items/implants/implantcase.dm +++ b/modular_splurt/code/game/objects/items/implants/implantcase.dm @@ -3,8 +3,8 @@ if(istype(imp, /obj/item/implant/genital_fluid)) var/obj/item/implant/genital_fluid/I = imp if(I.obj_flags & EMAGGED) - to_chat(user, "[src] has no functional safeties to emag.") + to_chat(user, span_warning("[src] has no functional safeties to emag.")) return - to_chat(user, "You short out [src]'s safeties.") + to_chat(user, span_notice("You short out [src]'s safeties.")) name = "implant case - 'Genital Fluid (Hacked)'" I.emag_act() diff --git a/modular_splurt/code/game/objects/items/lewd_items/genital_equipment/condom.dm b/modular_splurt/code/game/objects/items/lewd_items/genital_equipment/condom.dm index 8f35fdd9d8..072ba15541 100644 --- a/modular_splurt/code/game/objects/items/lewd_items/genital_equipment/condom.dm +++ b/modular_splurt/code/game/objects/items/lewd_items/genital_equipment/condom.dm @@ -36,7 +36,7 @@ if(unwrapped == 0) icon_state = "b_condom" unwrapped = 1 - to_chat(user, "You unwrap the condom.") + to_chat(user, span_notice("You unwrap the condom.")) playsound(user, 'sound/items/poster_ripped.ogg', 50, 1, -1) return @@ -55,23 +55,23 @@ // if(unwrapped == 1) // new /obj/item/clothing/head/condom(usr.loc) // qdel(src) -// to_chat(user, "You roll the condom out.") +// to_chat(user, span_notice("You roll the condom out.")) // playsound(user, 'sound/lewd/latex.ogg', 50, 1, -1) // return /* /obj/item/genital_equipment/condom/attack(mob/living/carbon/C, mob/living/user) //apply the johnny on another person or yourself if(unwrapped == 0 ) - to_chat(user, "You must remove the condom from the package first!") + to_chat(user, span_notice("You must remove the condom from the package first!")) return var/obj/item/organ/genital/penis/P = C.getorganslot(ORGAN_SLOT_PENIS) if((C.has_penis(REQUIRE_EXPOSED) && (P?.genital_flags & HAS_EQUIPMENT)) || (C.has_strapon(REQUIRE_EXPOSED))) if(P.equipment[GENITAL_EQUIPEMENT_CONDOM]) - to_chat(user, "\The [C] already has condom on!") + to_chat(user, span_notice("\The [C] already has condom on!")) return if(isliving(C) && isliving(user) && unwrapped == 1) - C.visible_message("\The [user] is trying to put a condom on \the [C]!",\ - "\The [user] is trying to put a condom on you!") + C.visible_message(span_warning("\The [user] is trying to put a condom on \the [C]!"),\ + span_warning("\The [user] is trying to put a condom on you!")) if(!do_mob(user, C, 4 SECONDS)) //if Failed to put the condom on return if(!user.transferItemToLoc(src, P)) //check if you can put it in @@ -85,12 +85,12 @@ L.update_genitals() // apply the colour! */ if(C.has_penis()) - to_chat(C, "Your penis feels more safe!") + to_chat(C, span_userlove("Your penis feels more safe!")) else - to_chat(C, "Your strapon feels more safe... Not sure why would that matter though.") + to_chat(C, span_userlove("Your strapon feels more safe... Not sure why would that matter though.")) return - to_chat(user, "You can't find anywhere to put the condom on.") //Trying to put it on something without/or with a hidden + to_chat(user, span_notice("You can't find anywhere to put the condom on.")) //Trying to put it on something without/or with a hidden */ /obj/item/clothing/head/condom //p @@ -156,7 +156,7 @@ //P.colourtint = "" update_genitals() C.update_icon() - to_chat(src, "The condom bubbles outwards and fills with your cum.") + to_chat(src, span_love("The condom bubbles outwards and fills with your cum.")) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) setArousalLoss(0) */ diff --git a/modular_splurt/code/game/objects/items/lewd_items/genital_equipment/sounding.dm b/modular_splurt/code/game/objects/items/lewd_items/genital_equipment/sounding.dm index d3aa33c6a9..b150dd378c 100644 --- a/modular_splurt/code/game/objects/items/lewd_items/genital_equipment/sounding.dm +++ b/modular_splurt/code/game/objects/items/lewd_items/genital_equipment/sounding.dm @@ -15,23 +15,23 @@ if(unwrapped == 0) icon_state = "sounding_rod" unwrapped = 1 - to_chat(user, "You unwrap the rod.") + to_chat(user, span_notice("You unwrap the rod.")) playsound(user, 'sound/items/poster_ripped.ogg', 50, 1, -1) return /* /obj/item/genital_equipment/sounding/attack(mob/living/carbon/C, mob/living/user) if(unwrapped == 0 ) - to_chat(user, "You must remove the rod from the package first!") + to_chat(user, span_notice("You must remove the rod from the package first!")) return var/obj/item/organ/genital/penis/P = C.getorganslot(ORGAN_SLOT_PENIS) if(C.has_penis(REQUIRE_EXPOSED) && (P?.genital_flags & HAS_EQUIPMENT)) if(P.equipment[GENITAL_EQUIPMENT_SOUNDING]) - to_chat(user, "\The [C] already has a rod inside!") + to_chat(user, span_notice("\The [C] already has a rod inside!")) return if(isliving(C) && isliving(user) && unwrapped == 1) - C.visible_message("\The [user] is trying to insert a rod inside \The [C]!",\ - "\The [user] is trying to insert a rod inside you!") + C.visible_message(span_warning("\The [user] is trying to insert a rod inside \The [C]!"),\ + span_warning("\The [user] is trying to insert a rod inside you!")) if(!do_mob(user, C, 4 SECONDS)) return if(!user.transferItemToLoc(src, P)) //check if you can put it in @@ -39,11 +39,11 @@ playsound(C, 'modular_sand/sound/lewd/champ_fingering.ogg', 50, 1, -1) P.equipment[GENITAL_EQUIPMENT_SOUNDING] = src - to_chat(C, "Your penis feels stuffed and stretched!") + to_chat(C, span_userlove("Your penis feels stuffed and stretched!")) owner = C return - to_chat(user, "You can't find anywhere to put the rod inside.") + to_chat(user, span_notice("You can't find anywhere to put the rod inside.")) /obj/item/genital_equipment/sounding/genital_remove_proccess(var/obj/item/organ/genital/G) if(!G.equipment[GENITAL_EQUIPMENT_SOUNDING]) @@ -59,7 +59,7 @@ if(P.equipment[GENITAL_EQUIPMENT_SOUNDING]) P.equipment.Remove(GENITAL_EQUIPMENT_SOUNDING) new /obj/item/genital_equipment/sounding/used_sounding(loc) - to_chat(src, "The rod falls off from your penis.") + to_chat(src, span_lewd("The rod falls off from your penis.")) /obj/item/genital_equipment/sounding/used_sounding name = "sounding rod" diff --git a/modular_splurt/code/game/objects/items/lewd_items/leash.dm b/modular_splurt/code/game/objects/items/lewd_items/leash.dm index 64bbd65ebb..88ed837f87 100644 --- a/modular_splurt/code/game/objects/items/lewd_items/leash.dm +++ b/modular_splurt/code/game/objects/items/lewd_items/leash.dm @@ -49,7 +49,7 @@ Icons, maybe? RegisterSignal(owner, COMSIG_LIVING_RESIST, .proc/owner_resist) redirect_component = owner if(!owner.stat) - to_chat(owner, "You have been leashed!") + to_chat(owner, span_userdanger("You have been leashed!")) return ..() //This lets the pet resist their leash @@ -61,7 +61,7 @@ Icons, maybe? //deleash = 100 if(do_mob(owner, owner, deleash))//do_mob creates a progress bar and then enacts the code after. Owner, owner, because it's an act on themself if(!QDELETED(src)) - to_chat(owner, "[owner] has removed their leash!") + to_chat(owner, span_warning("[owner] has removed their leash!")) owner.remove_status_effect(/datum/status_effect/leash_pet) ///// OBJECT ///// @@ -90,7 +90,7 @@ Icons, maybe? //Called when someone is clicked with the leash /obj/item/leash/attack(mob/living/carbon/C, mob/living/user, attackchain_flags, damage_multiplier) //C is the target, user is the one with the leash if(C.has_status_effect(/datum/status_effect/leash_pet)) //If the pet is already leashed, do not leash them. For the love of god. - to_chat(user, "[C] has already been leashed.") + to_chat(user, span_notice("[C] has already been leashed.")) return if(istype(C.get_item_by_slot(ITEM_SLOT_NECK), /obj/item/clothing/neck/petcollar) || istype(C.get_item_by_slot(ITEM_SLOT_NECK), /obj/item/electropack/shockcollar) || istype(C.get_item_by_slot(ITEM_SLOT_NECK), /obj/item/clothing/neck/necklace/cowbell) || istype(C.get_item_by_slot(ITEM_SLOT_NECK), /obj/item/clothing/neck/maid)) var/leashtime = 50 @@ -114,9 +114,9 @@ Icons, maybe? leash_pet.add_movespeed_modifier(MOVESPEED_ID_LEASH) for(var/mob/viewing in viewers(user, null)) if(viewing == leash_master) - to_chat(leash_master, "You have hooked a leash onto [leash_pet]!") + to_chat(leash_master, span_warning("You have hooked a leash onto [leash_pet]!")) else - viewing.show_message("[leash_pet] has been leashed by [leash_master]!", 1) + viewing.show_message(span_warning("[leash_pet] has been leashed by [leash_master]!"), 1) if(leash_pet.has_status_effect(/datum/status_effect/leash_dom)) //Pet leashed themself. They are not the dom leash_pet.apply_status_effect(/datum/status_effect/leash_freepet) leash_pet.remove_status_effect(/datum/status_effect/leash_dom) @@ -126,9 +126,9 @@ Icons, maybe? return if(!(leash_pet.get_item_by_slot(ITEM_SLOT_NECK))) //The pet has slipped their collar and is not the pet anymore. for(var/mob/viewing in viewers(user, null)) - viewing.show_message("[leash_pet] has slipped out of their collar!!", 1) - to_chat(leash_pet, "You have slipped out of your collar!") - to_chat(loc, "[leash_pet] has slipped out of their collar!") + viewing.show_message(span_notice("[leash_pet] has slipped out of their collar!!"), 1) + to_chat(leash_pet, span_notice("You have slipped out of your collar!")) + to_chat(loc, span_notice("[leash_pet] has slipped out of their collar!")) leash_pet.remove_status_effect(/datum/status_effect/leash_pet) if(!leash_pet.has_status_effect(/datum/status_effect/leash_pet)) //If there is no pet, there is no dom. Loop breaks. @@ -150,7 +150,7 @@ Icons, maybe? else //No collar, no fun var/leash_message = pick("Your pet needs a collar") - to_chat(user, "[leash_message]") + to_chat(user, span_notice("[leash_message]")) //Called when the leash is used in hand //Tugs the pet closer @@ -192,8 +192,8 @@ Icons, maybe? return if(leash_pet.x > leash_master.x + 3 || leash_pet.x < leash_master.x - 3 || leash_pet.y > leash_master.y + 3 || leash_pet.y < leash_master.y - 3) //var/leash_knockdown_message = "[leash_pet] got pulled to the ground by their leash!" - //to_chat(leash_master, "[leash_knockdown_message]") - //to_chat(leash_pet, "[leash_knockdown_message]") + //to_chat(leash_master, span_notice("[leash_knockdown_message]")) + //to_chat(leash_pet, span_notice("[leash_knockdown_message]")) leash_pet.apply_effect(20, EFFECT_KNOCKDOWN, 0) //This code is to check if the pet has gotten too far away, and then break the leash. @@ -206,11 +206,11 @@ Icons, maybe? var/leash_break_message = "The leash snapped free from [leash_pet]!" for(var/mob/viewing in viewers(leash_pet, null)) if(viewing == leash_master) - to_chat(leash_master, "The leash snapped free from your pet!") + to_chat(leash_master, span_warning("The leash snapped free from your pet!")) if(viewing == leash_pet) - to_chat(leash_pet, "Your leash has popped from your collar!") + to_chat(leash_pet, span_warning("Your leash has popped from your collar!")) else - viewing.show_message("[leash_break_message]", 1) + viewing.show_message(span_warning("[leash_break_message]"), 1) leash_pet.apply_effect(20, EFFECT_KNOCKDOWN, 0) leash_pet.adjustOxyLoss(5) leash_pet.remove_status_effect(/datum/status_effect/leash_pet) @@ -315,9 +315,9 @@ Icons, maybe? var/leash_break_message = "The leash snapped free from [leash_pet]!" for(var/mob/viewing in viewers(leash_pet, null)) if(viewing == leash_pet) - to_chat(leash_pet, "Your leash has popped from your collar!") + to_chat(leash_pet, span_warning("Your leash has popped from your collar!")) else - viewing.show_message("[leash_break_message]", 1) + viewing.show_message(span_warning("[leash_break_message]"), 1) leash_pet.apply_effect(20, EFFECT_KNOCKDOWN, 0) leash_pet.adjustOxyLoss(5) leash_pet.remove_status_effect(/datum/status_effect/leash_pet) @@ -345,7 +345,7 @@ Icons, maybe? if(leash_master.is_holding_item_of_type(/obj/item/leash) || istype(leash_master.get_item_by_slot(ITEM_SLOT_BELT), /obj/item/leash)) return //Dom still has the leash as it turns out. Cancel the proc. for(var/mob/viewing in viewers(leash_master, null)) - viewing.show_message("[leash_master] has dropped the leash.", 1) + viewing.show_message(span_notice("[leash_master] has dropped the leash."), 1) //DOM HAS DROPPED LEASH. PET IS FREE. SCP HAS BREACHED CONTAINMENT. leash_pet.remove_movespeed_modifier(MOVESPEED_ID_LEASH) //mobhook_leash_freepet = leash_pet.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/on_freepet_move))) diff --git a/modular_splurt/code/game/objects/items/lewd_items/rope.dm b/modular_splurt/code/game/objects/items/lewd_items/rope.dm index 7811d209b2..7400b68552 100644 --- a/modular_splurt/code/game/objects/items/lewd_items/rope.dm +++ b/modular_splurt/code/game/objects/items/lewd_items/rope.dm @@ -69,45 +69,45 @@ GLOBAL_LIST_INIT(bondage_rope_slowdowns, list( switch(rope_target) if(ROPE_TARGET_HANDS_IN_FRONT, ROPE_TARGET_HANDS_BEHIND, ROPE_TARGET_HANDS_OBJECT) if(C.handcuffed != null && !istype(C.handcuffed, /obj/item/restraints/bondage_rope)) - to_chat(user, "[C] is already handcuffed...") + to_chat(user, span_warning("[C] is already handcuffed...")) return if(C.get_num_arms(FALSE) < 2 && !C.get_arm_ignore()) - to_chat(user, "[C] doesn't have two hands...") + to_chat(user, span_warning("[C] doesn't have two hands...")) return if(C.handcuffed == null) - C.visible_message("[user] is trying to tie [C]'s hands [rope_target_text()]!", \ - "[user] is trying to tie [C]'s hands [rope_target_text()]!") + C.visible_message(span_danger("[user] is trying to tie [C]'s hands [rope_target_text()]!"), \ + span_userdanger("[user] is trying to tie [C]'s hands [rope_target_text()]!")) else var/obj/item/restraints/bondage_rope/rope = C.handcuffed if(LAZYLEN(rope.rope_stack) >= ROPE_MAX_STACK) - to_chat(user, "You cannot strengthen this rope anymore...") + to_chat(user, span_warning("You cannot strengthen this rope anymore...")) return - C.visible_message("[user] is trying to strengthen the rope on [C]!", \ - "[user] is trying to strengthen the rope on [C]!") + C.visible_message(span_danger("[user] is trying to strengthen the rope on [C]!"), \ + span_userdanger("[user] is trying to strengthen the rope on [C]!")) process_knot(C, user) if(ROPE_TARGET_LEGS, ROPE_TARGET_LEGS_OBJECT) if(C.legcuffed != null && !istype(C.legcuffed, /obj/item/restraints/bondage_rope)) - to_chat(user, "[C] is already legcuffed...") + to_chat(user, span_warning("[C] is already legcuffed...")) return if(C.get_num_legs(FALSE) < 2 && !C.get_leg_ignore()) - to_chat(user, "[C] doesn't have two legs...") + to_chat(user, span_warning("[C] doesn't have two legs...")) return if(C.legcuffed == null) - C.visible_message("[user] is trying to tie [C]'s legs!", \ - "[user] is trying to tie [C]'s legs!") + C.visible_message(span_danger("[user] is trying to tie [C]'s legs!"), \ + span_userdanger("[user] is trying to tie [C]'s legs!")) else var/obj/item/restraints/bondage_rope/rope = C.legcuffed if(LAZYLEN(rope.rope_stack) >= ROPE_MAX_STACK) - to_chat(user, "You cannot strengthen this rope anymore...") + to_chat(user, span_warning("You cannot strengthen this rope anymore...")) return - C.visible_message("[user] is trying to strengthen the rope on [C]!", \ - "[user] is trying to strengthen the rope on [C]!") + C.visible_message(span_danger("[user] is trying to strengthen the rope on [C]!"), \ + span_userdanger("[user] is trying to strengthen the rope on [C]!")) process_knot(C, user) /obj/item/restraints/bondage_rope/attack_obj(obj/O, mob/user) if(rope_state != ROPE_STATE_DECIDING_OBJECT) - to_chat(user, "You need to attach the rope to somebody first.") + to_chat(user, span_notice("You need to attach the rope to somebody first.")) return process_object(O, user) @@ -119,7 +119,7 @@ GLOBAL_LIST_INIT(bondage_rope_slowdowns, list( // Might be reduntant, since the roped mob gets pulled, but meh var/distance = get_dist(user, roped_mob) if(distance > ROPE_MAX_DISTANCE_MASTER) - to_chat(user, "The rope isn't long enough to tie a knot.") + to_chat(user, span_warning("The rope isn't long enough to tie a knot.")) return for(var/type in GLOB.bondage_rope_objects) @@ -137,26 +137,26 @@ GLOBAL_LIST_INIT(bondage_rope_slowdowns, list( SSblackbox.record_feedback("tally", "handcuffs", 1, type) log_combat(user, C, "handcuffed") if(C.handcuffed == null) - to_chat(user, "You tie [C]'s hands [rope_target_text()].") + to_chat(user, span_notice("You tie [C]'s hands [rope_target_text()].")) after_process_knot(C, user) else - to_chat(user, "You strengthen the rope on [C].") + to_chat(user, span_notice("You strengthen the rope on [C].")) strengthen_rope(C, user) else - to_chat(user, "You fail to tie [C]'s hands!") + to_chat(user, span_warning("You fail to tie [C]'s hands!")) if(ROPE_TARGET_LEGS, ROPE_TARGET_LEGS_OBJECT) if(do_mob(user, C, 30) && (C.get_num_legs(FALSE) >= 2 || C.get_leg_ignore())) playsound(loc, cuffsound, 30, 1, -2) SSblackbox.record_feedback("tally", "handcuffs", 1, type) log_combat(user, C, "handcuffed") if(C.legcuffed == null) - to_chat(user, "You tie [C]'s legs.") + to_chat(user, span_notice("You tie [C]'s legs.")) after_process_knot(C, user) else - to_chat(user, "You strengthen the rope on [C].") + to_chat(user, span_notice("You strengthen the rope on [C].")) strengthen_rope(C, user) else - to_chat(user, "You fail to tie [C]'s legs!") + to_chat(user, span_warning("You fail to tie [C]'s legs!")) // > Using normal rope, calls finish_knot_normal // > Using object rope, handles the handcuffed effect (unless instant self apply is disabled) and sets state to ROPE_STATE_DECIDING_OBJECT @@ -176,7 +176,7 @@ GLOBAL_LIST_INIT(bondage_rope_slowdowns, list( set_roped_mob(C) set_roped_master(user) set_rope_slowdown(C) - to_chat(roped_master, "Attach the rope to an object to finish the knot.") + to_chat(roped_master, span_notice("Attach the rope to an object to finish the knot.")) while(1) sleep(2) if(rope_state == ROPE_STATE_UNTIED) @@ -229,8 +229,8 @@ GLOBAL_LIST_INIT(bondage_rope_slowdowns, list( set_roped_master(null) set_roped_object(O, O_type) - to_chat(roped_mob, "You are tied to [O].") - to_chat(roped_master, "You tie the rope to [O].") + to_chat(roped_mob, span_warning("You are tied to [O].")) + to_chat(roped_master, span_notice("You tie the rope to [O].")) tugged_flag = TRUE apply_tug_mob_to_object(roped_mob, roped_object, ROPE_MAX_DISTANCE_OBJECT) @@ -241,22 +241,22 @@ GLOBAL_LIST_INIT(bondage_rope_slowdowns, list( if(roped_mob == null) if(roped_master != null) - to_chat(roped_master, "Seems like whoever you were roping... Is gone?") + to_chat(roped_master, span_warning("Seems like whoever you were roping... Is gone?")) reset_rope_state() return FALSE if(rope_state == ROPE_STATE_TIED || (roped_master != roped_mob || ROPE_SELF_APPLY_INSTANT)) if(rope_target == ROPE_TARGET_HANDS_OBJECT && roped_mob.handcuffed != src) if(roped_master != null) - to_chat(roped_master, "[roped_mob] got out of your rope.") + to_chat(roped_master, span_warning("[roped_mob] got out of your rope.")) reset_rope_state() return FALSE if(rope_target == ROPE_TARGET_LEGS_OBJECT && roped_mob.legcuffed != src) if(roped_master != null) - to_chat(roped_master, "[roped_mob] got out of your rope.") + to_chat(roped_master, span_warning("[roped_mob] got out of your rope.")) reset_rope_state() return FALSE if(rope_state == ROPE_STATE_TIED && roped_object == null) - to_chat(roped_mob, "The thing you were tied to... Is gone?") + to_chat(roped_mob, span_warning("The thing you were tied to... Is gone?")) reset_rope_state() return FALSE @@ -308,11 +308,11 @@ GLOBAL_LIST_INIT(bondage_rope_slowdowns, list( var/distance = get_dist(roped_mob.loc, roped_master.loc) if(distance > ROPE_MAX_DISTANCE_MASTER) if (prob(10)) - to_chat(roped_mob, "You tug the rope away from [roped_master].") - to_chat(roped_master, "[roped_mob] tugs the rope away from you.") + to_chat(roped_mob, span_warning("You tug the rope away from [roped_master].")) + to_chat(roped_master, span_warning("[roped_mob] tugs the rope away from you.")) forceMove(roped_mob.loc) else - to_chat(roped_mob, "The rope doesn't let you go further.") + to_chat(roped_mob, span_warning("The rope doesn't let you go further.")) tugged_flag = TRUE apply_tug_mob_to_mob(roped_mob, roped_master, ROPE_MAX_DISTANCE_MASTER) // Not reduntant, since the above line can tug the rope and make roped_master null @@ -336,7 +336,7 @@ GLOBAL_LIST_INIT(bondage_rope_slowdowns, list( if(can_move) apply_tug_object_to_mob(roped_object, roped_mob, ROPE_MAX_DISTANCE_OBJECT) else - to_chat(roped_mob, "The rope doesn't let you go further.") + to_chat(roped_mob, span_warning("The rope doesn't let you go further.")) tugged_flag = TRUE apply_tug_mob_to_object(roped_mob, roped_object, ROPE_MAX_DISTANCE_OBJECT) distance = get_dist(roped_mob.loc, roped_object.loc) @@ -346,10 +346,10 @@ GLOBAL_LIST_INIT(bondage_rope_slowdowns, list( /obj/item/restraints/bondage_rope/proc/snap_rope() var/loc = null if(roped_master != null) - to_chat(roped_master, "The rope snaps.") + to_chat(roped_master, span_warning("The rope snaps.")) loc = roped_master.loc if(roped_mob != null) - to_chat(roped_mob, "The rope snaps.") + to_chat(roped_mob, span_warning("The rope snaps.")) loc = roped_mob.loc reset_rope_state() forceMove(loc) @@ -416,7 +416,7 @@ GLOBAL_LIST_INIT(bondage_rope_slowdowns, list( /obj/item/restraints/bondage_rope/proc/customize_rope(mob/living/user) if(rope_state != ROPE_STATE_UNTIED) - to_chat(user, "You can only customize an untied rope.") + to_chat(user, span_warning("You can only customize an untied rope.")) return if(src && !user.incapacitated() && in_range(user, src)) diff --git a/modular_splurt/code/game/objects/items/lewd_items/strapon.dm b/modular_splurt/code/game/objects/items/lewd_items/strapon.dm index f21d3e3e5d..3385468c2d 100644 --- a/modular_splurt/code/game/objects/items/lewd_items/strapon.dm +++ b/modular_splurt/code/game/objects/items/lewd_items/strapon.dm @@ -7,7 +7,7 @@ /obj/item/strapon_strap/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/dildo)) - to_chat(user, "You attach the dildo to the strap.") + to_chat(user, span_userlove("You attach the dildo to the strap.")) var/obj/item/dildo/dildo = I var/obj/item/clothing/underwear/briefs/strapon/new_strapon = new /obj/item/clothing/underwear/briefs/strapon(user.loc) new_strapon.dildo_color = dildo.color @@ -48,10 +48,10 @@ /obj/item/clothing/underwear/briefs/strapon/examine(mob/user) . = ..() . += "There is a [GLOB.dildo_size_names[dildo_size]] [dildo_shape][dildo_can_customize ? " custom" : ""] dildo attached to it." - . += "Alt-Click \the [src.name] to separate the strap and dildo." + . += span_notice("Alt-Click \the [src.name] to separate the strap and dildo.") /obj/item/clothing/underwear/briefs/strapon/AltClick(mob/living/user, obj/item/I) - to_chat(user, "You separate the dildo from the strap.") + to_chat(user, span_userlove("You separate the dildo from the strap.")) var/obj/item/strapon_strap/new_strapon_strap = new /obj/item/strapon_strap(user.loc) var/obj/item/dildo/new_dildo if(dildo_can_customize) @@ -105,7 +105,7 @@ if(istype(user, /mob/living/carbon)) var/mob/living/carbon/C = user - to_chat(C, "You're now ready to bone someone!") + to_chat(C, span_userlove("You're now ready to bone someone!")) /obj/item/clothing/underwear/briefs/strapon/mob_can_equip(M, equipper, slot, disable_warning, bypass_equip_delay_self) if(!..()) @@ -114,7 +114,7 @@ if(istype(M, /mob/living)) var/mob/living/living = M if(living.has_penis(REQUIRE_ANY)) - to_chat(living, "\The [living] doesn't seem to need a strapon!") + to_chat(living, span_notice("\The [living] doesn't seem to need a strapon!")) return FALSE return TRUE diff --git a/modular_splurt/code/game/objects/items/lewd_items/vibrator.dm b/modular_splurt/code/game/objects/items/lewd_items/vibrator.dm index 6d8a813c00..95339ce1a4 100644 --- a/modular_splurt/code/game/objects/items/lewd_items/vibrator.dm +++ b/modular_splurt/code/game/objects/items/lewd_items/vibrator.dm @@ -48,15 +48,15 @@ Code: switch(mode) if(1) mode = 2 - to_chat(user, "You twist the bottom of [src], setting it to the medium setting.") + to_chat(user, span_notice("You twist the bottom of [src], setting it to the medium setting.")) return if(2) mode = 3 - to_chat(user, "You twist the bottom of [src], setting it to the high setting.") + to_chat(user, span_warning("You twist the bottom of [src], setting it to the high setting.")) return if(3) mode = 1 - to_chat(user, "You twist the bottom of [src], setting it to the low setting.") + to_chat(user, span_notice("You twist the bottom of [src], setting it to the low setting.")) return /* /obj/item/electropack/vibrator/attack(mob/living/carbon/C, mob/living/user) @@ -66,22 +66,22 @@ Code: var/mob/living/carbon/human/T = C picked_organ = S.pick_receiving_organ(T, HAS_EQUIPMENT, "Vibrator", "Where are you putting it in?") if(picked_organ) - C.visible_message("\The [user] is trying to attach [src] to \The [T]!",\ - "\The [user] is trying to put [src] on you!") + C.visible_message(span_warning("\The [user] is trying to attach [src] to \The [T]!"),\ + span_warning("\The [user] is trying to put [src] on you!")) if(!do_mob(user, C, 5 SECONDS))//warn them and have a delay of 5 seconds to apply. return if(style == "long" && !(picked_organ.type == /obj/item/organ/genital/vagina)) //long vibrators dont fit on anything but vaginas, but small ones fit everywhere - to_chat(user, "[src] is too big to fit there, use a smaller version.") + to_chat(user, span_warning("[src] is too big to fit there, use a smaller version.")) return if(!picked_organ.equipment[GENITAL_EQUIPMENT_VIBRATOR]) if(!(style == "long")) - to_chat(user, "You attach [src] to \The [T]'s [picked_organ.name].") + to_chat(user, span_love("You attach [src] to \The [T]'s [picked_organ.name].")) else - to_chat(user, "You insert [src] into \The [T]'s [picked_organ.name].") + to_chat(user, span_love("You insert [src] into \The [T]'s [picked_organ.name].")) else - to_chat(user, "They already have a [picked_organ.equipment[GENITAL_EQUIPMENT_VIBRATOR].name] there.") + to_chat(user, span_notice("They already have a [picked_organ.equipment[GENITAL_EQUIPMENT_VIBRATOR].name] there.")) return if(!user.transferItemToLoc(src, picked_organ)) //check if you can put it in @@ -89,10 +89,10 @@ Code: playsound(C, 'modular_sand/sound/lewd/champ_fingering.ogg', 50, 1, -1) inside = TRUE picked_organ.equipment[GENITAL_EQUIPMENT_VIBRATOR] = src - to_chat(user, "Done Done") //Will delete after testing + to_chat(user, span_warning("Done Done")) //Will delete after testing else - to_chat(user, "You don't see anywhere to attach this.") + to_chat(user, span_notice("You don't see anywhere to attach this.")) */ @@ -114,9 +114,9 @@ Code: if(G) switch(G.type) //just being fancy if(/obj/item/organ/genital/breasts) - to_chat(U, "[src] vibrates against your nipples!") + to_chat(U, span_love("[src] vibrates against your nipples!")) else - to_chat(U, "[src] vibrates against your [G.name]!") + to_chat(U, span_love("[src] vibrates against your [G.name]!")) var/intencity = 6*mode U.handle_post_sex(intencity, null, src) //give pleasure @@ -125,13 +125,13 @@ Code: switch(mode) if(1) //low, setting for RP, it wont force your character to do anything. - to_chat(U, "You feel pleasure surge through your [G.name]") + to_chat(U, span_love("You feel pleasure surge through your [G.name]")) U.do_jitter_animation() //do animation without heartbeat if(2) //med, can make you cum - to_chat(U, "You feel intense pleasure surge through your [G.name]") + to_chat(U, span_love("You feel intense pleasure surge through your [G.name]")) U.do_jitter_animation() if(3) //high, makes you stun - to_chat(U, "You feel overpowering pleasure surge through your [G.name]") + to_chat(U, span_userdanger("You feel overpowering pleasure surge through your [G.name]")) U.Jitter(3) U.Stun(30) if(prob(50)) diff --git a/modular_splurt/code/game/objects/items/manuals.dm b/modular_splurt/code/game/objects/items/manuals.dm index d0daae4424..b3e648bf97 100644 --- a/modular_splurt/code/game/objects/items/manuals.dm +++ b/modular_splurt/code/game/objects/items/manuals.dm @@ -95,5 +95,5 @@ "} /obj/item/book/manual/splurt_space_law/suicide_act(mob/living/user) - user.visible_message("[user] pretends to read \the [src] intently... then promptly dies of laughter!") + user.visible_message(span_suicide("[user] pretends to read \the [src] intently... then promptly dies of laughter!")) return OXYLOSS diff --git a/modular_splurt/code/game/objects/items/mesmetron.dm b/modular_splurt/code/game/objects/items/mesmetron.dm index d42913aa17..b156ee7c9e 100644 --- a/modular_splurt/code/game/objects/items/mesmetron.dm +++ b/modular_splurt/code/game/objects/items/mesmetron.dm @@ -21,7 +21,7 @@ to_chat(user, "You can't hypnotize [H] whilst they're asleep!") return - user.visible_message("[user] begins to mesmerizingly wave [src] like a pendulum before [H]'s very eyes!") + user.visible_message(span_warning("[user] begins to mesmerizingly wave [src] like a pendulum before [H]'s very eyes!")) if(!do_mob(user, H, 12 SECONDS)) return @@ -34,7 +34,7 @@ var/response = alert(H, "Do you wish to fall into a hypnotic sleep? (This will allow [user] to issue hypnotic suggestions)", "Hypnosis", "Yes", "No") if(response == "Yes") - H.visible_message("[H] falls into a deep slumber!", "Your eyelids gently shut as you fall into a deep slumber. All you can hear is [user]'s voice as you commit to following all of their suggestions") + H.visible_message(span_warning("[H] falls into a deep slumber!"), "Your eyelids gently shut as you fall into a deep slumber. All you can hear is [user]'s voice as you commit to following all of their suggestions") H.SetSleeping(1200) H.drowsyness = max(H.drowsyness, 40) @@ -42,7 +42,7 @@ return //No - H.visible_message("[H]'s attention breaks, despite your attempts to hypnotize them! They clearly don't want this", "Your concentration breaks as you realise you have no interest in following [user]'s words!") + H.visible_message(span_warning("[H]'s attention breaks, despite your attempts to hypnotize them! They clearly don't want this"), "Your concentration breaks as you realise you have no interest in following [user]'s words!") @@ -76,11 +76,11 @@ return to_chat(user, "You whisper your suggestion in a smooth calming voice to [subject]") - to_chat(subject, "...[text]...") + to_chat(subject, span_hypnophrase("...[text]...")) return //Release - subject.visible_message("[subject] wakes up from their deep slumber!", "Your eyelids gently open as you see [user]'s face staring back at you") + subject.visible_message(span_warning("[subject] wakes up from their deep slumber!"), "Your eyelids gently open as you see [user]'s face staring back at you") subject.SetSleeping(0) subject = null diff --git a/modular_splurt/code/game/objects/items/miscellaneous.dm b/modular_splurt/code/game/objects/items/miscellaneous.dm index d2eb377e0f..72cd6781e5 100644 --- a/modular_splurt/code/game/objects/items/miscellaneous.dm +++ b/modular_splurt/code/game/objects/items/miscellaneous.dm @@ -64,15 +64,15 @@ if(isnull(insults)) playsound(get_turf(src), 'modular_splurt/sound/voice/halt.ogg', 100, 1, vary = 0) - user.audible_message("[user]'s [name] rasps, \"[use_message]\"", "\The [user] holds up \the [name].") + user.audible_message(span_warning("[user]'s [name] rasps, \"[use_message]\""), span_warning("\The [user] holds up \the [name].")) else if(insults > 0) playsound(get_turf(src), 'sound/voice/beepsky/insult.ogg', 100, 1, vary = 0) // Yes, it used to show the transcription of the sound clip. That was a) inaccurate b) immature as shit. - user.audible_message("[user]'s [name] gurgles something indecipherable and deeply offensive.", "\The [user] holds up \the [name].") + user.audible_message(span_warning("[user]'s [name] gurgles something indecipherable and deeply offensive."), span_warning("\The [user] holds up \the [name].")) insults-- else - user << "*BZZZZZZZZT*" + user << span_danger("*BZZZZZZZZT*") spamcheck = 1 spawn(20) @@ -80,7 +80,7 @@ /obj/item/device/hailer/emag_act(remaining_charges, mob/user) if(isnull(insults)) - user << "You overload \the [src]'s voice synthesizer." + user << span_danger("You overload \the [src]'s voice synthesizer.") insults = rand(1, 3)//to prevent dickflooding return 1 else @@ -170,20 +170,20 @@ if(istype(C, /obj/item/card/id)) var/obj/item/card/id/idcard = C if(!idcard.registered_name) - to_chat(user, "\The [src] rejects the ID!") + to_chat(user, span_warning("\The [src] rejects the ID!")) return if(!owner) owner = idcard.registered_name ownjob = idcard.assignment update_label() - to_chat(user, "Badge updated.") + to_chat(user, span_notice("Badge updated.")) /obj/item/clothing/accessory/badge/attack_self(mob/user) if(Adjacent(user)) - user.visible_message("[user] shows you: [icon2html(src, viewers(user))] [src.name].", \ - "You show \the [src.name].") + user.visible_message(span_notice("[user] shows you: [icon2html(src, viewers(user))] [src.name]."), \ + span_notice("You show \the [src.name].")) add_fingerprint(user) /obj/item/clothing/accessory/badge/holo diff --git a/modular_splurt/code/game/objects/items/plushes.dm b/modular_splurt/code/game/objects/items/plushes.dm index 33a6a2f1f1..588e204edb 100644 --- a/modular_splurt/code/game/objects/items/plushes.dm +++ b/modular_splurt/code/game/objects/items/plushes.dm @@ -20,3 +20,11 @@ icon = 'modular_splurt/icons/obj/plushes.dmi' icon_state = "plushie_mal0" item_state = "plushie_mal0" + +/obj/item/toy/plush/nobl + name = "Nobl plushie" + desc = "It seems to be a small canine, not necessarily latex like you would suspect for some reason, but extremely squishy." + icon = 'modular_splurt/icons/obj/plushes.dmi' + icon_state = "nobl_plush" + item_state = "nobl_plush" + squeak_override = list('modular_splurt/sound/misc/dog_toy.ogg' = 1) diff --git a/modular_splurt/code/game/objects/items/robot/robot_items.dm b/modular_splurt/code/game/objects/items/robot/robot_items.dm index 9189c814e7..125f733903 100644 --- a/modular_splurt/code/game/objects/items/robot/robot_items.dm +++ b/modular_splurt/code/game/objects/items/robot/robot_items.dm @@ -79,3 +79,15 @@ source = /datum/robot_energy_storage/wrapping_paper /// End Cargo Borg Items /// + + +/obj/item/gripper/service + name = "service gripper" + desc = "A simple grasping tool for interacting with food and condiments." + can_hold = list( + /obj/item/reagent_containers/glass, + /obj/item/reagent_containers/food, + /obj/item/kitchen, + /obj/item/storage/bag/tray + ) + diff --git a/modular_splurt/code/game/objects/items/robot/robot_upgrades.dm b/modular_splurt/code/game/objects/items/robot/robot_upgrades.dm index cdee195096..4d1662b642 100644 --- a/modular_splurt/code/game/objects/items/robot/robot_upgrades.dm +++ b/modular_splurt/code/game/objects/items/robot/robot_upgrades.dm @@ -10,7 +10,7 @@ ExpandSize = 200 if(ExpandSize <= 0) ExpandSize = 200 - to_chat(user, "Expand set to [ExpandSize] %.") + to_chat(user, span_notice("Expand set to [ExpandSize] %.")) return ExpandSize /obj/item/borg/upgrade/shrink @@ -25,5 +25,5 @@ ShrinkSize = 50 if(ShrinkSize <= 0) ShrinkSize = 50 - to_chat(user, "Shrink set to [ShrinkSize] %.") + to_chat(user, span_notice("Shrink set to [ShrinkSize] %.")) return ShrinkSize diff --git a/modular_splurt/code/game/objects/items/storage/backpack.dm b/modular_splurt/code/game/objects/items/storage/backpack.dm index b612c32248..2592d3bc70 100644 --- a/modular_splurt/code/game/objects/items/storage/backpack.dm +++ b/modular_splurt/code/game/objects/items/storage/backpack.dm @@ -9,3 +9,11 @@ new /obj/item/grenade/chem_grenade/teargas(src) new /obj/item/grenade/chem_grenade/teargas(src) new /obj/item/grenade/chem_grenade/teargas(src) + +/obj/item/storage/backpack/sloogshell + name = "Sloog shell" + desc = "A large shell, belonging to probably a very large snail or slug... Wait... It can store things?" + icon = 'modular_splurt/icons/obj/storage.dmi' + icon_state = "sloog_backpack" + mob_overlay_icon = 'modular_splurt/icons/mob/clothing/64_back.dmi' + worn_x_dimension = 64 diff --git a/modular_splurt/code/game/objects/items/storage/boxes.dm b/modular_splurt/code/game/objects/items/storage/boxes.dm index 08e2b03e48..34d085605d 100644 --- a/modular_splurt/code/game/objects/items/storage/boxes.dm +++ b/modular_splurt/code/game/objects/items/storage/boxes.dm @@ -14,3 +14,65 @@ new /obj/item/reagent_containers/hypospray/medipen/bellygrowth(src) new /obj/item/reagent_containers/hypospray/medipen/prospacillin(src) new /obj/item/reagent_containers/hypospray/medipen/lewdbomb(src) + +// Kinkmate listing for the rapid disrobe implant +/obj/item/storage/box/implant_disrobe + name = "rapid disrobe implant box" + desc = "Comes with an implanter and an implant case for quick application!" + icon = 'modular_sand/icons/obj/fleshlight.dmi' + icon_state = "box" + +/obj/item/storage/box/implant_disrobe/ComponentInitialize() + . = ..() + var/datum/component/storage/str = GetComponent(/datum/component/storage) + str.max_items = 2 + +/obj/item/storage/box/implant_disrobe/PopulateContents() + new /obj/item/implanter(src) + new /obj/item/implantcase/disrobe(src) + +// Shipment box for Plushmium +/obj/item/storage/box/shipment_plushmium + name = "plushmium backer rewards box" + desc = "Comes with a spray bottle quick application!" + icon = 'modular_sand/icons/obj/fleshlight.dmi' + icon_state = "box" + +/obj/item/storage/box/shipment_plushmium/ComponentInitialize() + . = ..() + var/datum/component/storage/str = GetComponent(/datum/component/storage) + str.max_items = 2 + +/obj/item/storage/box/shipment_plushmium/PopulateContents() + new /obj/item/reagent_containers/spray/plushmium(src) + new /obj/item/paper/fluff/shipment_plushmium(src) + +// Plushmium box's note +/obj/item/paper/fluff/shipment_plushmium + name = "plushmium backer note" + info = "

Plushmium Instructions

Dear esteemed customer,

Thank for backing the Stuffing For Spessmen© crowd funding initiative. We at Donk Co. pride ourselves on making a wide variety of engaging toys for our loyal customers to enjoy. Now, we're bringing the toy making process directly to your home or workplace! Included in this box is:
  • A spray bottle of Love to Lifeâ„¢ solution
  • A carefully packaged plushie
To begin enjoying your new friend, start by unpacking the included plushie. Our selection process goes through rigorous quality testing to ensure you'll always get the best toy for the job. With so many choices, you'll want to get the whole family in on the action.

Once you have everything ready, it's time to make the patented Donk Co. magic happen! Spray your new best friend with Love to Lifeâ„¢ solution, included in the complimentary spray bottle, and watch the stunning transformation!

But don't leave your new best friend hanging! Give them a big warm hug to celebrate the long and intimate friendship you'll be sharing.


Donk Co. is not responsible for any injury or loss of life that may occur while using the Love to Lifeâ„¢ solution. Do not allow access to children or adults without supervision by a chemist.

Do not drink, splash, inject, or otherwise handle the solution. Do not come into direct physical contact with the solution, or any object the solution has been applied to, under any circumstances." + +// Kinkmate listing for condom box +/obj/item/storage/box/bulk_condoms + name = "surplus condom box" + desc = "A large collection of condoms, suitable for the safest of sluts!" + icon = 'modular_sand/icons/obj/fleshlight.dmi' + icon_state = "box" + custom_price = PRICE_ALMOST_EXPENSIVE // Half the price of buying individually + +/obj/item/storage/box/bulk_condoms/ComponentInitialize() + . = ..() + + // Define storage component + var/datum/component/storage/str = GetComponent(/datum/component/storage) + + // Set max items to 10 + str.max_items = 10 + + // Restrict contents to only condoms + str.can_hold = typecacheof(list(/obj/item/genital_equipment/condom)) + +/obj/item/storage/box/bulk_condoms/PopulateContents() + // Add maximum amount + for(var/i in 1 to 10) + new /obj/item/genital_equipment/condom(src) diff --git a/modular_splurt/code/game/objects/items/storage/wallets.dm b/modular_splurt/code/game/objects/items/storage/wallets.dm new file mode 100644 index 0000000000..8e08e7b456 --- /dev/null +++ b/modular_splurt/code/game/objects/items/storage/wallets.dm @@ -0,0 +1,20 @@ +// Bluespace wallet +/obj/item/storage/wallet/bluespace + name = "\improper wallet of holding" + desc = "A testament to science's hubris. It holds thrice as many stolen ID cards." + icon = 'modular_splurt/icons/obj/storage.dmi' + icon_state = "wallet_bluespace" + + // Copied from bag of holding + resistance_flags = FIRE_PROOF + item_flags = NO_MAT_REDEMPTION + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE + +/obj/item/storage/wallet/bluespace/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 12 + +/obj/item/storage/wallet/bluespace/update_icon_state() + // Don't update icons + return diff --git a/modular_splurt/code/game/objects/items/weaponry.dm b/modular_splurt/code/game/objects/items/weaponry.dm index 6490b81444..522326cad1 100644 --- a/modular_splurt/code/game/objects/items/weaponry.dm +++ b/modular_splurt/code/game/objects/items/weaponry.dm @@ -22,13 +22,13 @@ force = 10 /obj/item/bdsm_whip/suicide_act(mob/user) - user.visible_message("[user] is getting just a little too kinky!") + user.visible_message(span_suicide("[user] is getting just a little too kinky!")) return (OXYLOSS) /obj/item/bdsm_whip/attack(mob/M, mob/user) if(user.zone_selected == BODY_ZONE_PRECISE_GROIN) playsound(loc, 'sound/weapons/whip.ogg', 30) - M.visible_message("[user] has [pick(attack_verb)] [M] on the ass!") + M.visible_message(span_userdanger("[user] has [pick(attack_verb)] [M] on the ass!")) else return ..(M, user) @@ -54,5 +54,5 @@ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON /obj/item/khopesh/suicide_act(mob/user) - user.visible_message("[user] is falling on [src]! It looks like [user.p_theyre()] trying to commit suicide!") + user.visible_message(span_suicide("[user] is falling on [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return(BRUTELOSS) diff --git a/modular_splurt/code/game/objects/items/weaponry/armyknife.dm b/modular_splurt/code/game/objects/items/weaponry/armyknife.dm index 268ad386aa..a7274198d9 100644 --- a/modular_splurt/code/game/objects/items/weaponry/armyknife.dm +++ b/modular_splurt/code/game/objects/items/weaponry/armyknife.dm @@ -16,7 +16,7 @@ /obj/item/armyknife/attack_self(mob/user) playsound(get_turf(user),'sound/weapons/batonextend.ogg',50,1) var/obj/item/armyknife/ak_screw = new /obj/item/armyknife/screw(drop_location()) - to_chat(user, "You unfold the screwdriver.") + to_chat(user, span_notice("You unfold the screwdriver.")) qdel(src) user.put_in_active_hand(ak_screw) @@ -42,7 +42,7 @@ /obj/item/armyknife/screw/attack_self(mob/user) playsound(get_turf(user),'sound/weapons/batonextend.ogg',50,1) var/obj/item/armyknife/ak_cut = new /obj/item/armyknife/cutter(drop_location()) - to_chat(user, "You fold the screwdriver and unfold the wirecutters.") + to_chat(user, span_notice("You fold the screwdriver and unfold the wirecutters.")) qdel(src) user.put_in_active_hand(ak_cut) @@ -70,7 +70,7 @@ /obj/item/armyknife/cutter/attack_self(mob/user) playsound(get_turf(user), 'sound/weapons/batonextend.ogg', 50, 1) var/obj/item/armyknife/ak_knife = new /obj/item/armyknife/blade(drop_location()) - to_chat(user, "You fold the wirecutters and unfold the knife.") + to_chat(user, span_notice("You fold the wirecutters and unfold the knife.")) qdel(src) user.put_in_active_hand(ak_knife) @@ -94,7 +94,7 @@ /obj/item/armyknife/blade/attack_self(mob/user) playsound(get_turf(user), 'sound/weapons/batonextend.ogg', 50, 1) var/obj/item/armyknife/ak_fold = new /obj/item/armyknife(drop_location()) - to_chat(user, "You fold the knife.") + to_chat(user, span_notice("You fold the knife.")) qdel(src) user.put_in_active_hand(ak_fold) diff --git a/modular_splurt/code/game/objects/items/weaponry/melee.dm b/modular_splurt/code/game/objects/items/weaponry/melee.dm index 2ad3ab7506..6750b10e31 100644 --- a/modular_splurt/code/game/objects/items/weaponry/melee.dm +++ b/modular_splurt/code/game/objects/items/weaponry/melee.dm @@ -3,7 +3,7 @@ /obj/item/melee/baseball_bat/AltClick(mob/living/carbon/human/user as mob) hole = hole == CUM_TARGET_VAGINA ? CUM_TARGET_ANUS : CUM_TARGET_VAGINA - to_chat(user, "Now targetting \the [hole].") + to_chat(user, span_notice("Now targetting \the [hole].")) /obj/item/melee/baseball_bat/attack(mob/living/target, mob/living/user) if (BODY_ZONE_PRECISE_GROIN && user.a_intent != INTENT_HARM) //ROUGH PRISON HUMILATION YAY @@ -22,7 +22,7 @@ message = (user == target) ? pick("fucks [possessive_verb] own ass with \the [src]","shoves \the [src] into [possessive_verb] ass", "jams \the [src] into [possessive_verb] ass") : pick("fucks [target]'s asshole with \the [src]", "jams \the [src] into [target]'s ass") lust_amt = NORMAL_LUST if(message) - user.visible_message("[user] [message].") + user.visible_message(span_lewd("[user] [message].")) target.handle_post_sex(lust_amt, null, user) playsound(loc, pick('modular_sand/sound/interactions/bang4.ogg', 'modular_sand/sound/interactions/bang5.ogg', @@ -33,7 +33,7 @@ return var/atom/throw_target = get_edge_target_turf(target, user.dir) if(homerun_ready) - user.visible_message("It's a home run!") + user.visible_message(span_userdanger("It's a home run!")) target.throw_at(throw_target, rand(8,10), 14, user) target.ex_act(EXPLODE_HEAVY) playsound(get_turf(src), 'sound/weapons/homerun.ogg', 100, TRUE) diff --git a/modular_splurt/code/game/objects/structures/bathroom.dm b/modular_splurt/code/game/objects/structures/bathroom.dm index 8ba710f406..d43c5597a3 100644 --- a/modular_splurt/code/game/objects/structures/bathroom.dm +++ b/modular_splurt/code/game/objects/structures/bathroom.dm @@ -21,17 +21,17 @@ var/mob/living/carbon/human/H = user if(istype(I, /obj/item/soap)) if(!istype(H.gloves, /obj/item/clothing/gloves/color/latex)) - to_chat(H, "No! No fucking way I'm touching this shit without at LEAST latex gloves!") + to_chat(H, span_warning("No! No fucking way I'm touching this shit without at LEAST latex gloves!")) return if(!istype(H.get_inactive_held_item(), /obj/item/storage/bag/trash)) - to_chat(H, "I'd.. need a trashbag or similar to stash all this shit.") + to_chat(H, span_warning("I'd.. need a trashbag or similar to stash all this shit.")) return - H.visible_message("[H] starts cleaning \the [src]![prob(0.1) ? " All for free.." : ""]", "You start.. scooping all the shit into the trash bag.. Eugh.") + H.visible_message(span_notice("[H] starts cleaning \the [src]![prob(0.1) ? " All for free.." : ""]"), span_notice("You start.. scooping all the shit into the trash bag.. Eugh.")) if(!do_after(H, 130, target = src)) - H.visible_message("[H] gives up!", "Fuck this shit.") + H.visible_message(span_notice("[H] gives up!"), span_warning("Fuck this shit.")) return - H.visible_message("[H] finishes cleaning \the [src]!", "You're finally done. Thank fuck.'") + H.visible_message(span_notice("[H] finishes cleaning \the [src]!"), span_notice("You're finally done. Thank fuck.'")) new /obj/structure/urinal(loc, dir, TRUE) return return ..() diff --git a/modular_splurt/code/game/objects/structures/cannons/cannon.dm b/modular_splurt/code/game/objects/structures/cannons/cannon.dm index ff31f69626..a4e01395da 100644 --- a/modular_splurt/code/game/objects/structures/cannons/cannon.dm +++ b/modular_splurt/code/game/objects/structures/cannons/cannon.dm @@ -25,8 +25,8 @@ /obj/structure/cannon/examine(mob/user) . = ..() - . += "[src] accepts gunpowder or welding fuel." - . += "Using welding fuel will weaken the force of the projectile fired." + . += span_notice("[src] accepts gunpowder or welding fuel.") + . += span_warning("Using welding fuel will weaken the force of the projectile fired.") /obj/structure/cannon/proc/fire() for(var/mob/shaken_mob in urange(10, src)) @@ -48,24 +48,24 @@ /obj/structure/cannon/attackby(obj/item/used_item, mob/user, params) if(charge_ignited) - to_chat(user, "It's gonna fire!") + to_chat(user, span_warning("It's gonna fire!")) return var/ignition_message = used_item.ignition_effect(src, user) if(istype(used_item, /obj/item/stack/cannonball)) if(loaded_cannonball) - to_chat(user, "[src] is already loaded!") + to_chat(user, span_warning("[src] is already loaded!")) else var/obj/item/stack/cannonball/cannoneers_balls = used_item loaded_cannonball = new cannoneers_balls.type(src, 1) loaded_cannonball.copy_evidences(cannoneers_balls) - to_chat(user, "You load a [cannoneers_balls.singular_name] into \the [src].") + to_chat(user, span_notice("You load a [cannoneers_balls.singular_name] into \the [src].")) cannoneers_balls.use(1, transfer = TRUE) return else if(ignition_message) if(!reagents.has_reagent(/datum/reagent/blackpowder,charge_size) && !reagents.has_reagent(/datum/reagent/fuel,charge_size)) - to_chat(user, "[src] needs [reagents.maximum_volume]u of charge!") + to_chat(user, span_warning("[src] needs [reagents.maximum_volume]u of charge!")) return visible_message(ignition_message) log_game("Cannon fired by [key_name(user)] in [AREACOORD(src)]") @@ -81,7 +81,7 @@ return ..() if(!powder_keg.reagents.total_volume) - to_chat(user, "[powder_keg] is empty!") + to_chat(user, span_warning("[powder_keg] is empty!")) return if(reagents.total_volume >= reagents.maximum_volume) to_chat(user, "") @@ -89,15 +89,15 @@ var/has_enough_gunpowder = powder_keg.reagents.has_reagent(/datum/reagent/blackpowder, charge_size) var/has_enough_alt_fuel = powder_keg.reagents.has_reagent(/datum/reagent/fuel, charge_size) if(!has_enough_gunpowder && !has_enough_alt_fuel) - to_chat(user, "[powder_keg] doesn't have at least 15u of fuel to fill [src]!") + to_chat(user, span_warning("[powder_keg] doesn't have at least 15u of fuel to fill [src]!")) return if(has_enough_gunpowder) powder_keg.reagents.trans_id_to(src, /datum/reagent/blackpowder, amount = charge_size) - to_chat(user, "You load [src] with gunpowder.") + to_chat(user, span_notice("You load [src] with gunpowder.")) return if(has_enough_alt_fuel) powder_keg.reagents.trans_id_to(src, /datum/reagent/fuel, amount = charge_size) - to_chat(user, "You load [src] with welding fuel.") + to_chat(user, span_notice("You load [src] with welding fuel.")) return if(anchorable_cannon && used_item.tool_behaviour == TOOL_WRENCH) if(default_unfasten_wrench(user, used_item, time = 2 SECONDS)) @@ -122,11 +122,11 @@ if(used_alt_fuel) fires_before_deconstruction-- if(prob(explode_chance)) - visible_message("[src] explodes!") + visible_message(span_warning("[src] explodes!")) explosion(src, heavy_impact_range = 1, light_impact_range = 5, flame_range = 5) return if(fires_before_deconstruction <= 0) - visible_message("[src] falls apart from operation!") + visible_message(span_warning("[src] falls apart from operation!")) qdel(src) /obj/structure/cannon/trash/Destroy() diff --git a/modular_splurt/code/game/objects/structures/fence.dm b/modular_splurt/code/game/objects/structures/fence.dm index 0ad3ea5f90..b0b679c7a9 100644 --- a/modular_splurt/code/game/objects/structures/fence.dm +++ b/modular_splurt/code/game/objects/structures/fence.dm @@ -32,16 +32,16 @@ if(health < maxhealth) switch(health / maxhealth) if(0.0 to 0.5) - . += "It looks severely damaged!" + . += span_warning("It looks severely damaged!") if(0.25 to 0.5) - . += "It looks damaged!" + . += span_warning("It looks damaged!") if(0.5 to 1.0) - . += "It has a few scrapes and dents." + . += span_notice("It has a few scrapes and dents.") /obj/structure/fence/handrail/take_damage(amount) health -= amount if(health <= 0) - visible_message("\The [src] breaks down!") + visible_message(span_warning("\The [src] breaks down!")) playsound(src, 'sound/effects/grillehit.ogg', 50, 1) new /obj/item/stack/rods(get_turf(src)) qdel(src) diff --git a/modular_splurt/code/game/objects/structures/micro_bricks.dm b/modular_splurt/code/game/objects/structures/micro_bricks.dm index 0c167c87bd..bbd5ad77f6 100644 --- a/modular_splurt/code/game/objects/structures/micro_bricks.dm +++ b/modular_splurt/code/game/objects/structures/micro_bricks.dm @@ -17,12 +17,12 @@ return TRUE if(istype(item, /obj/item/carpentry/glue)) - to_chat(user,"You glue the bricks to the floor.") + to_chat(user,span_notice("You glue the bricks to the floor.")) anchored = TRUE return TRUE if(istype(item, /obj/item/crowbar)) - to_chat(user,"You pry the bricks from the floor.") + to_chat(user,span_notice("You pry the bricks from the floor.")) anchored = FALSE return TRUE diff --git a/modular_splurt/code/game/objects/structures/pole.dm b/modular_splurt/code/game/objects/structures/pole.dm index 9d8a96456f..21442124bd 100644 --- a/modular_splurt/code/game/objects/structures/pole.dm +++ b/modular_splurt/code/game/objects/structures/pole.dm @@ -16,6 +16,11 @@ . = ..() if(.) return + + // Don't teleport telekinetic users to the pole. + if (get_dist(src,user) > 1) + return + if(obj_flags & IN_USE) to_chat(user, "It's already in use - wait a bit.") return @@ -73,9 +78,9 @@ add_fingerprint(user) if(istype(P, /obj/item/wrench)) if (!(item_flags & IN_INVENTORY)) - to_chat(user, "You start to fasten the frame to the floor and celing...") + to_chat(user, span_notice("You start to fasten the frame to the floor and celing...")) if(P.use_tool(src, user, 8 SECONDS, volume=50)) - to_chat(user, "You construct the stripper pole!") + to_chat(user, span_notice("You construct the stripper pole!")) var/obj/structure/pole/C = new C.loc = loc del(src) @@ -84,9 +89,9 @@ /obj/structure/pole/attackby(obj/item/P, mob/user, params) //un-erecting a pole. :( add_fingerprint(user) if(istype(P, /obj/item/wrench)) - to_chat(user, "You start to unfastening the frame...") + to_chat(user, span_notice("You start to unfastening the frame...")) if(P.use_tool(src, user, 8 SECONDS, volume=50)) - to_chat(user, "You take down the stripper pole!") + to_chat(user, span_notice("You take down the stripper pole!")) var/obj/item/polepack/C = new C.loc = loc del(src) diff --git a/modular_splurt/code/game/objects/structures/statues.dm b/modular_splurt/code/game/objects/structures/statues.dm index d313578f0d..865929ed5a 100644 --- a/modular_splurt/code/game/objects/structures/statues.dm +++ b/modular_splurt/code/game/objects/structures/statues.dm @@ -13,3 +13,134 @@ desc = "A statue honoring Owia-Akeshi, a brave ashwalker that perished while defending the nest from a wild ash drake. May his soul rest in peace." impressiveness = 25 +/obj/structure/statue/gargoyle + name = "statue" + desc = "An incredibly intricate statue, which... almost seems alive!" + icon = 'modular_splurt/icons/obj/structures/statue.dmi' + icon_state = "gargoyle" //empty sprite because it's supposed to copy over the overlays anyway, and otherwise, you end up with a white human male underlay beneath the statue. + density = TRUE + anchored = TRUE + flags_1 = PREVENT_CONTENTS_EXPLOSION_1 + max_integrity = 200 + var/mob/living/petrified_mob + var/old_max_health + var/old_size + var/was_tilted + var/was_lying + var/was_lying_prev + var/deconstructed = FALSE + +/obj/structure/statue/gargoyle/Initialize(mapload, mob/living/L) + . = ..() + if(L) + petrified_mob = L + if(L.buckled) + L.buckled.unbuckle_mob(L,force=1) + L.visible_message(span_warning("[L]'s skin rapidly turns to stone!"), span_warning("Your skin abruptly hardens as you turn to stone once more!")) + dir = L.dir + transform = L.transform + pixel_x = L.pixel_x + pixel_y = L.pixel_y + layer = L.layer + was_tilted = L.is_tilted + was_lying = L.lying + was_lying_prev = L.lying_prev + L.forceMove(src) + ADD_TRAIT(L, TRAIT_MUTE, STATUE_TRAIT) + ADD_TRAIT(L, TRAIT_MOBILITY_NOMOVE, STATUE_TRAIT) + ADD_TRAIT(L, TRAIT_MOBILITY_NOPICKUP, STATUE_TRAIT) + ADD_TRAIT(L, TRAIT_MOBILITY_NOUSE, STATUE_TRAIT) + ADD_TRAIT(L, TRAIT_NOBREATH, STATUE_TRAIT) + ADD_TRAIT(L, TRAIT_NOHUNGER, STATUE_TRAIT) + ADD_TRAIT(L, TRAIT_NOTHIRST, STATUE_TRAIT) + ADD_TRAIT(L, TRAIT_NOFIRE, STATUE_TRAIT) //OH GOD HELP I'M ON FIRE INSIDE THE STATUE I CAN'T MOVE AND I CAN'T STOP IT HAAAAALP - person who experienced this + L.click_intercept = src + L.faction += "mimic" //Stops mimics from instaqdeling people in statues + L.status_flags |= GODMODE + old_max_health = L.maxHealth + old_size = get_size(L) + obj_integrity = L.health + 100 //stoning damaged mobs will result in easier to shatter statues + max_integrity = obj_integrity + +/obj/structure/statue/gargoyle/proc/InterceptClickOn(mob/living/caller, params, atom/A) //technically could be bypassed by doing something that also uses click intercept but shrug + var/atom/movable/screen/movable/action_button/ab = A + if (istype(ab)) + if (istype(ab.linked_action, /datum/action/gargoyle)) + return FALSE + var/list/modifiers = params2list(params) + if (modifiers["shift"] && !modifiers["ctrl"] && !modifiers["middle"]) + return FALSE + return TRUE + +/obj/structure/statue/gargoyle/examine_more(mob/user) //something about the funny signals doesn't work here no matter how much I fucked around with it (ie registering to COMSIG_PARENT_EXAMINE_MORE doesn't do anything), so we have to overwrite the proc + . = ..() + if (petrified_mob) + SEND_SIGNAL(petrified_mob, COMSIG_PARENT_EXAMINE, user, .) + . -= span_notice("You examine [src] closer, but find nothing of interest...") + +/obj/structure/statue/gargoyle/handle_atom_del(atom/A) + if(A == petrified_mob) + petrified_mob = null + +/obj/structure/statue/gargoyle/Destroy() + if(petrified_mob) + petrified_mob.status_flags &= ~GODMODE + petrified_mob.forceMove(loc) + REMOVE_TRAIT(petrified_mob, TRAIT_MUTE, STATUE_TRAIT) + REMOVE_TRAIT(petrified_mob, TRAIT_MOBILITY_NOMOVE, STATUE_TRAIT) + REMOVE_TRAIT(petrified_mob, TRAIT_MOBILITY_NOPICKUP, STATUE_TRAIT) + REMOVE_TRAIT(petrified_mob, TRAIT_MOBILITY_NOUSE, STATUE_TRAIT) + REMOVE_TRAIT(petrified_mob, TRAIT_NOBREATH, STATUE_TRAIT) + REMOVE_TRAIT(petrified_mob, TRAIT_NOHUNGER, STATUE_TRAIT) + REMOVE_TRAIT(petrified_mob, TRAIT_NOTHIRST, STATUE_TRAIT) + REMOVE_TRAIT(petrified_mob, TRAIT_NOFIRE, STATUE_TRAIT) + petrified_mob.faction -= "mimic" + petrified_mob.click_intercept = null + petrified_mob.dir = dir + petrified_mob.update_size(old_size) + var/damage = deconstructed ? petrified_mob.health : petrified_mob.health*(old_max_health/petrified_mob.maxHealth) - obj_integrity + 100 + petrified_mob.take_overall_damage(damage) //any new damage the statue incurred is transfered to the mob + petrified_mob.transform = transform + petrified_mob.lying = was_lying + petrified_mob.lying_prev = was_lying_prev + petrified_mob.update_mobility() + petrified_mob.pixel_x = pixel_x + petrified_mob.pixel_y = pixel_y + petrified_mob.layer = layer + petrified_mob.is_shifted = TRUE //just prevents bad things tbh + petrified_mob.is_tilted = was_tilted + if (pulledby && pulledby.pulling == src) //gotta checked just in case + pulledby.start_pulling(petrified_mob, supress_message = TRUE) + var/datum/quirk/gargoyle/T = locate() in petrified_mob.roundstart_quirks + if (T) + T.transformed = 0 + petrified_mob = null + return ..() + +/obj/structure/statue/gargoyle/deconstruct(disassembled = TRUE) + deconstructed = TRUE + visible_message(span_danger("[src] shatters!")) + qdel(src) + +/obj/structure/statue/gargoyle/attackby(obj/item/W, mob/living/user, params) + add_fingerprint(user) + if(!(flags_1 & NODECONSTRUCT_1)) + if(default_unfasten_wrench(user, W)) + return + if(W.tool_behaviour == TOOL_WELDER) + if(!W.tool_start_check(user, amount=0)) + return FALSE + + if (petrified_mob && alert(user, "You are slicing apart a gargoyle! Are you sure you want to continue? This will severely harm them, if not outright kill them.",, "Continue", "Cancel") == "Cancel") + return + + user.visible_message(span_notice("[user] is slicing apart the [name]."), \ + span_notice("You are slicing apart the [name]...")) + if (petrified_mob) + to_chat(petrified_mob, span_userdanger("You are being sliced apart by [user]!")) + if(W.use_tool(src, user, 40, volume=50)) + user.visible_message(span_notice("[user] slices apart the [name]."), \ + span_notice("You slice apart the [name]!")) + deconstruct(TRUE) + return + return ..() diff --git a/modular_splurt/code/game/objects/structures/table_frames.dm b/modular_splurt/code/game/objects/structures/table_frames.dm index 2cae0e49c1..6150d8c221 100644 --- a/modular_splurt/code/game/objects/structures/table_frames.dm +++ b/modular_splurt/code/game/objects/structures/table_frames.dm @@ -22,9 +22,9 @@ if (toConstruct) if(material.get_amount() < 1) - to_chat(user, "You need one [material.name] sheet to do this!") + to_chat(user, span_warning("You need one [material.name] sheet to do this!")) return - to_chat(user, "You start adding [material] to [src]...") + to_chat(user, span_notice("You start adding [material] to [src]...")) if(do_after(user, 20, target = src) && material.use(1)) make_new_table(toConstruct) else @@ -54,9 +54,9 @@ if (toConstruct) if(material.get_amount() < 1) - to_chat(user, "You need one [material.name] sheet to do this!") + to_chat(user, span_warning("You need one [material.name] sheet to do this!")) return - to_chat(user, "You start adding [material] to [src]...") + to_chat(user, span_notice("You start adding [material] to [src]...")) if(do_after(user, 20, target = src) && material.use(1)) make_new_table(toConstruct) else diff --git a/modular_splurt/code/modules/admin/JobBan.dm b/modular_splurt/code/modules/admin/JobBan.dm index 98b2fe27d2..ba4e107cff 100644 --- a/modular_splurt/code/modules/admin/JobBan.dm +++ b/modular_splurt/code/modules/admin/JobBan.dm @@ -100,7 +100,7 @@ GLOBAL_LIST_INIT(jobban_panel_data, list( if("Temporary") var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null if(mins <= 0) - to_chat(usr, "[mins] is not a valid duration.") + to_chat(usr, span_danger("[mins] is not a valid duration.")) return reason = input(usr,"Please State Reason For Banning [M.key].","Reason") as message|null if(!reason) @@ -111,7 +111,7 @@ GLOBAL_LIST_INIT(jobban_panel_data, list( var/msg for(var/job in notbannedlist) if(!DB_ban_record(BANTYPE_JOB_TEMP, M, mins, reason, job)) - to_chat(usr, "Failed to apply ban.") + to_chat(usr, span_danger("Failed to apply ban.")) return if(M.client) jobban_buildcache(M.client) @@ -122,10 +122,10 @@ GLOBAL_LIST_INIT(jobban_panel_data, list( else msg += ", [job]" create_message("note", M.key, null, "Banned from [msg] - [reason]", null, null, 0, 0, null, 0, severity) - message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes.") - to_chat(M, "You have been [((msg == "ooc") || (msg == "appearance") || (msg == "pacifist")) ? "banned" : "jobbanned"] by [usr.client.key] from: [msg == "pacifist" ? "using violence" : msg].") - to_chat(M, "The reason is: [reason]") - to_chat(M, "This jobban will be lifted in [mins] minutes.") + message_admins(span_adminnotice("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes.")) + to_chat(M, span_boldannounce("You have been [((msg == "ooc") || (msg == "appearance") || (msg == "pacifist")) ? "banned" : "jobbanned"] by [usr.client.key] from: [msg == "pacifist" ? "using violence" : msg].")) + to_chat(M, span_boldannounce("The reason is: [reason]")) + to_chat(M, span_danger("This jobban will be lifted in [mins] minutes.")) if("Permanent") reason = input(usr,"Please State Reason For Banning [M.key].","Reason") as message|null @@ -138,7 +138,7 @@ GLOBAL_LIST_INIT(jobban_panel_data, list( var/msg for(var/job in notbannedlist) if(!DB_ban_record(BANTYPE_JOB_PERMA, M, -1, reason, job)) - to_chat(usr, "Failed to apply ban.") + to_chat(usr, span_danger("Failed to apply ban.")) return if(M.client) jobban_buildcache(M.client) @@ -149,10 +149,10 @@ GLOBAL_LIST_INIT(jobban_panel_data, list( else msg += ", [job]" create_message("note", M.key, null, "Banned from [msg] - [reason]", null, null, 0, 0, null, 0, severity) - message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg].") - to_chat(M, "You have been [((msg == "ooc") || (msg == "appearance") || (msg == "pacifist")) ? "banned" : "jobbanned"] by [usr.client.key] from: [msg == "pacifist" ? "using violence" : msg].") - to_chat(M, "The reason is: [reason]") - to_chat(M, "This jobban can be lifted only upon request.") + message_admins(span_adminnotice("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg].")) + to_chat(M, span_boldannounce("You have been [((msg == "ooc") || (msg == "appearance") || (msg == "pacifist")) ? "banned" : "jobbanned"] by [usr.client.key] from: [msg == "pacifist" ? "using violence" : msg].")) + to_chat(M, span_boldannounce("The reason is: [reason]")) + to_chat(M, span_danger("This jobban can be lifted only upon request.")) // notbannedlist is just a list of strings of the job titles you want to unban. /datum/admins/proc/UnJobban(mob/M, list/bannedlist) @@ -175,5 +175,5 @@ GLOBAL_LIST_INIT(jobban_panel_data, list( else msg += ", [job]" if(msg) - message_admins("[key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg].") - to_chat(M, "You have been un-jobbanned by [usr.client.key] from [msg].") + message_admins(span_adminnotice("[key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg].")) + to_chat(M, span_boldannounce("You have been un-jobbanned by [usr.client.key] from [msg].")) diff --git a/modular_splurt/code/modules/admin/Kick.dm b/modular_splurt/code/modules/admin/Kick.dm index 19c0f77de2..12bda65b2c 100644 --- a/modular_splurt/code/modules/admin/Kick.dm +++ b/modular_splurt/code/modules/admin/Kick.dm @@ -1,13 +1,13 @@ /datum/admins/proc/kick(mob/M) if (!ismob(M) || !M.client) - to_chat(usr, "Error: [M] has no client!") + to_chat(usr, span_danger("Error: [M] has no client!")) return if(!check_if_greater_rights_than(M.client)) - to_chat(usr, "Error: They have more rights than you do.") + to_chat(usr, span_danger("Error: They have more rights than you do.")) return - to_chat(M, "You have been kicked from the server by [usr.client.holder.fakekey ? "an Administrator" : "[usr.client.key]"].") + to_chat(M, span_danger("You have been kicked from the server by [usr.client.holder.fakekey ? "an Administrator" : "[usr.client.key]"].")) log_admin("[key_name(usr)] kicked [key_name(M)].") - message_admins("[key_name_admin(usr)] kicked [key_name_admin(M)].") + message_admins(span_adminnotice("[key_name_admin(usr)] kicked [key_name_admin(M)].")) qdel(M.client) diff --git a/modular_splurt/code/modules/admin/NewBan.dm b/modular_splurt/code/modules/admin/NewBan.dm index 9a42461c34..709d6cc095 100644 --- a/modular_splurt/code/modules/admin/NewBan.dm +++ b/modular_splurt/code/modules/admin/NewBan.dm @@ -4,36 +4,36 @@ // var/mob/M = mob_to_ban if(!ismob(M) || !M.client) - to_chat(usr, "Error: [M] has no client!") + to_chat(usr, span_danger("Error: [M] has no client!")) return if(M.client && M.client.holder) - to_chat(usr, "Error: You cannot ban admins!") + to_chat(usr, span_danger("Error: You cannot ban admins!")) return //admins cannot be banned. Even if they could, the ban doesn't affect them anyway switch(tgui_alert(usr, "Ban type", buttons = list("Temporary", "Permanent", "Cancel"))) if("Temporary") var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null if(mins <= 0) - to_chat(usr, "[mins] is not a valid duration.") + to_chat(usr, span_danger("[mins] is not a valid duration.")) return var/reason = input(usr,"Please State Reason For Banning [M.key].","Reason") as message|null if(!reason) return if(!DB_ban_record(BANTYPE_TEMP, M, mins, reason)) - to_chat(usr, "Failed to apply ban.") + to_chat(usr, span_danger("Failed to apply ban.")) return AddBan(M.ckey, M.computer_id, reason, usr.ckey, 1, mins) ban_unban_log_save("[key_name(usr)] has banned [key_name(M)]. - Reason: [reason] - This will be removed in [mins] minutes.") - to_chat(M, "You have been banned by [usr.client.key].\nReason: [reason]") - to_chat(M, "This is a temporary ban, it will be removed in [mins] minutes. The round ID is [GLOB.round_id].") + to_chat(M, span_boldannounce("You have been banned by [usr.client.key].\nReason: [reason]")) + to_chat(M, span_danger("This is a temporary ban, it will be removed in [mins] minutes. The round ID is [GLOB.round_id].")) var/bran = CONFIG_GET(string/banappeals) if(bran) - to_chat(M, "To try to resolve this matter head to [bran]") + to_chat(M, span_danger("To try to resolve this matter head to [bran]")) else - to_chat(M, "No ban appeals URL has been set.") + to_chat(M, span_danger("No ban appeals URL has been set.")) log_admin_private("[key_name(usr)] has banned [key_name(M)].\nReason: [key_name(M)]\nThis will be removed in [mins] minutes.") - var/msg = "[key_name_admin(usr)] has banned [key_name_admin(M)].\nReason: [reason]\nThis will be removed in [mins] minutes." + var/msg = span_adminnotice("[key_name_admin(usr)] has banned [key_name_admin(M)].\nReason: [reason]\nThis will be removed in [mins] minutes.") message_admins(msg) var/datum/admin_help/AH = M.client ? M.client.current_ticket : null if(AH) @@ -50,19 +50,19 @@ AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0, M.lastKnownIP) if("No") AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0) - to_chat(M, "You have been banned by [usr.client.key].\nReason: [reason]") - to_chat(M, "This is a permanent ban. The round ID is [GLOB.round_id].") + to_chat(M, span_boldannounce("You have been banned by [usr.client.key].\nReason: [reason]")) + to_chat(M, span_danger("This is a permanent ban. The round ID is [GLOB.round_id].")) var/bran = CONFIG_GET(string/banappeals) if(bran) - to_chat(M, "To try to resolve this matter head to [bran]") + to_chat(M, span_danger("To try to resolve this matter head to [bran]")) else - to_chat(M, "No ban appeals URL has been set.") + to_chat(M, span_danger("No ban appeals URL has been set.")) if(!DB_ban_record(BANTYPE_PERMA, M, -1, reason)) - to_chat(usr, "Failed to apply ban.") + to_chat(usr, span_danger("Failed to apply ban.")) return ban_unban_log_save("[key_name(usr)] has permabanned [key_name(M)]. - Reason: [reason] - This is a permanent ban.") log_admin_private("[key_name(usr)] has banned [key_name(M)].\nReason: [reason]\nThis is a permanent ban.") - var/msg = "[key_name_admin(usr)] has banned [key_name_admin(M)].\nReason: [reason]\nThis is a permanent ban." + var/msg = span_adminnotice("[key_name_admin(usr)] has banned [key_name_admin(M)].\nReason: [reason]\nThis is a permanent ban.") message_admins(msg) var/datum/admin_help/AH = M.client ? M.client.current_ticket : null if(AH) diff --git a/modular_splurt/code/modules/admin/Transform.dm b/modular_splurt/code/modules/admin/Transform.dm index 5fbc48be22..239d17f774 100644 --- a/modular_splurt/code/modules/admin/Transform.dm +++ b/modular_splurt/code/modules/admin/Transform.dm @@ -118,7 +118,7 @@ GLOBAL_LIST_INIT(pp_transformables, list( newTypeName = newType log_admin("[key_name(usr)] transformed [key_name(M)] into a [newTypeName].") - message_admins("[key_name_admin(usr)] transformed [key_name_admin(M)] into a [newTypeName].") + message_admins(span_adminnotice("[key_name_admin(usr)] transformed [key_name_admin(M)] into a [newTypeName].")) var/mob/newMob = M.change_mob_type(newType, delete_old_mob = TRUE) diff --git a/modular_splurt/code/modules/admin/centcom_communications.dm b/modular_splurt/code/modules/admin/centcom_communications.dm index 3a172a4725..2c99fe9b0e 100644 --- a/modular_splurt/code/modules/admin/centcom_communications.dm +++ b/modular_splurt/code/modules/admin/centcom_communications.dm @@ -35,7 +35,7 @@ GLOBAL_VAR_INIT(next_command_message_id, 1) if ("orbit_sender") var/atom/movable/sender = get_mob_by_key(params["sender_ckey"]) if(!sender) - to_chat(usr, "This player cannot be observed.") + to_chat(usr, span_notice("This player cannot be observed.")) return if(!isobserver(admin.mob)) diff --git a/modular_splurt/code/modules/admin/playtimes.dm b/modular_splurt/code/modules/admin/playtimes.dm index 8dbdf7b22e..bcf3e0fee6 100644 --- a/modular_splurt/code/modules/admin/playtimes.dm +++ b/modular_splurt/code/modules/admin/playtimes.dm @@ -22,7 +22,7 @@ return if(!CONFIG_GET(flag/use_exp_tracking)) - to_chat(usr, "Tracking is disabled in the server configuration file.") + to_chat(usr, span_warning("Tracking is disabled in the server configuration file.")) return if(!playtime_menu) @@ -120,7 +120,7 @@ var/atom/movable/target = get_mob_by_key(params["ckey"]) if(!target) - to_chat(usr, "This player cannot be observed.") + to_chat(usr, span_notice("This player cannot be observed.")) return var/client/C = usr.client diff --git a/modular_splurt/code/modules/admin/verbs/discordbunker.dm b/modular_splurt/code/modules/admin/verbs/discordbunker.dm index 149479289a..446520aeec 100644 --- a/modular_splurt/code/modules/admin/verbs/discordbunker.dm +++ b/modular_splurt/code/modules/admin/verbs/discordbunker.dm @@ -2,7 +2,7 @@ set category = "Server" set name = "Toggle Discord Bunker" if(!SSdbcore.IsConnected()) - to_chat(usr, "The Database is not connected/enabled!") + to_chat(usr, span_adminnotice("The Database is not connected/enabled!")) return var/new_dbun = !CONFIG_GET(flag/need_discord_to_join) @@ -18,13 +18,13 @@ set name = "Add Discord Bypass" set desc = "Allows a given ckey to connect through the discord bunker for the round even if they haven't verified yet." if(!SSdbcore.IsConnected()) - to_chat(usr, "The Database is not connected!") + to_chat(usr, span_adminnotice("The Database is not connected!")) return if(!SSdiscord) - to_chat(usr, "The discord subsystem hasn't initialized yet!") + to_chat(usr, span_adminnotice("The discord subsystem hasn't initialized yet!")) return if(!CONFIG_GET(flag/need_discord_to_join)) - to_chat(usr, "The Discord Bunker is deactivated!") + to_chat(usr, span_adminnotice("The Discord Bunker is deactivated!")) return GLOB.discord_passthrough |= ckey(ckeytobypass) @@ -38,13 +38,13 @@ set name = "Revoke Discord Bypass" set desc = "Revoke's a ckey's permission to bypass the discord bunker for a given round." if(!SSdbcore.IsConnected()) - to_chat(usr, "The Database is not connected!") + to_chat(usr, span_adminnotice("The Database is not connected!")) return if(!SSdiscord) - to_chat(usr, "The discord subsystem hasn't initialized yet!") + to_chat(usr, span_adminnotice("The discord subsystem hasn't initialized yet!")) return if(!CONFIG_GET(flag/need_discord_to_join)) - to_chat(usr, "The Discord Bunker is deactivated!") + to_chat(usr, span_adminnotice("The Discord Bunker is deactivated!")) return GLOB.discord_passthrough -= ckey(ckeytobypass) diff --git a/modular_splurt/code/modules/admin/verbs/randomverbs.dm b/modular_splurt/code/modules/admin/verbs/randomverbs.dm index 00c97dddcf..a0c81e3f19 100644 --- a/modular_splurt/code/modules/admin/verbs/randomverbs.dm +++ b/modular_splurt/code/modules/admin/verbs/randomverbs.dm @@ -42,7 +42,7 @@ log_admin("SubtlePM ([sender]): [key_name(usr)] -> [key_name(M)] : [msg]") - msg = " SubtleMessage ([sender]): [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]" + msg = span_adminnotice(" SubtleMessage ([sender]): [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]") message_admins(msg) admin_ticket_log(M, msg) SSblackbox.record_feedback("tally", "admin_verb", 1, "Subtle Message") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/modular_splurt/code/modules/antagonists/_common/antag_spawner.dm b/modular_splurt/code/modules/antagonists/_common/antag_spawner.dm index ebb077ff11..b7d76290db 100644 --- a/modular_splurt/code/modules/antagonists/_common/antag_spawner.dm +++ b/modular_splurt/code/modules/antagonists/_common/antag_spawner.dm @@ -13,14 +13,14 @@ /obj/item/antag_spawner/slaver_borg/proc/check_usability(mob/user) if(used) - to_chat(user, "[src] is out of power!") + to_chat(user, span_warning("[src] is out of power!")) return FALSE if(!user.mind.has_antag_datum(/datum/antagonist/slaver,TRUE)) - to_chat(user, "AUTHENTICATION FAILURE. ACCESS DENIED.") + to_chat(user, span_danger("AUTHENTICATION FAILURE. ACCESS DENIED.")) return FALSE var/area/A = get_area(get_turf(user)) if (!istype(A, /area/slavers)) - to_chat(user, "[src] is out of range! It can only be used at your hideout!") + to_chat(user, span_warning("[src] is out of range! It can only be used at your hideout!")) return FALSE return TRUE @@ -30,11 +30,11 @@ return if(!(next_attempt_allowed < world.time)) - to_chat(user, "A request has already been sent! Wait 1 minute.") + to_chat(user, span_warning("A request has already been sent! Wait 1 minute.")) return next_attempt_allowed = world.time + 1 MINUTES - to_chat(user, "You activate [src] and wait for confirmation.") + to_chat(user, span_notice("You activate [src] and wait for confirmation.")) var/list/borg_candidates = pollGhostCandidates("Do you want to play as a slaver [lowertext(borg_to_spawn)] cyborg?", ROLE_SLAVER, null, ROLE_SLAVER, 150, POLL_IGNORE_SLAVER) if(LAZYLEN(borg_candidates)) if(QDELETED(src) || !check_usability(user)) @@ -45,7 +45,7 @@ do_sparks(4, TRUE, src) qdel(src) else - to_chat(user, "Unable to connect to Slaver command. Please wait and try again later.") + to_chat(user, span_warning("Unable to connect to Slaver command. Please wait and try again later.")) /obj/item/antag_spawner/slaver_borg/spawn_antag(client/C, turf/T, kind, datum/mind/user) var/mob/living/silicon/robot/R diff --git a/modular_splurt/code/modules/antagonists/qareen/qareen.dm b/modular_splurt/code/modules/antagonists/qareen/qareen.dm index 24110b2f44..77189708d9 100644 --- a/modular_splurt/code/modules/antagonists/qareen/qareen.dm +++ b/modular_splurt/code/modules/antagonists/qareen/qareen.dm @@ -100,7 +100,7 @@ /mob/living/simple_animal/qareen/Login() ..() var/qareen_greet - qareen_greet += "You are a qareen." + qareen_greet += span_deadsay("You are a qareen.") qareen_greet += "Your formerly mundane spirit has been infused with alien energies and empowered into a qareen." qareen_greet += "You are not dead, not alive, but somewhere in between. You are capable of limited interaction with both worlds." qareen_greet += "You are invincible and invisible to everyone but other ghosts. Most abilities will reveal you, rendering you vulnerable." @@ -128,11 +128,11 @@ revealed = FALSE incorporeal_move = INCORPOREAL_MOVE_JAUNT invisibility = INVISIBILITY_QAREEN - to_chat(src, "You are once more concealed.") + to_chat(src, span_revenboldnotice("You are once more concealed.")) if(unstun_time && world.time >= unstun_time) unstun_time = 0 mob_transforming = FALSE - to_chat(src, "You can move again!") + to_chat(src, span_revenboldnotice("You can move again!")) if(essence_regenerating && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate essence = min(essence_regen_cap, essence+essence_regen_amount) update_action_buttons_icon() //because we update something required by our spells in life, we need to update our buttons @@ -165,7 +165,7 @@ if(!message) return src.log_talk(message, LOG_SAY) - var/rendered = "[src] says, \"[message]\"" + var/rendered = span_revennotice("[src] says, \"[message]\"") for(var/mob/M in GLOB.mob_list) if(isqareen(M)) to_chat(M, rendered) @@ -199,8 +199,8 @@ /mob/living/simple_animal/qareen/attackby(obj/item/W, mob/living/user, params) . = ..() if(istype(W, /obj/item/nullrod)) - visible_message("[src] violently flinches!", \ - "As \the [W] passes through you, you feel your essence draining away!") + visible_message(span_warning("[src] violently flinches!"), \ + span_revendanger("As \the [W] passes through you, you feel your essence draining away!")) adjustBruteLoss(25) //hella effective inhibited = TRUE update_action_buttons_icon() @@ -230,17 +230,17 @@ if(!revealed || stasis) //qareens cannot die if they aren't revealed //or are already dead return 0 stasis = TRUE - to_chat(src, "NO! No... it's too late, you can feel your essence [pick("spewing out", "bursting out")]...") + to_chat(src, span_revendanger("NO! No... it's too late, you can feel your essence [pick("spewing out", "bursting out")]...")) mob_transforming = TRUE revealed = TRUE invisibility = 0 playsound(src, 'sound/effects/screech.ogg', 100, 1) - visible_message("[src] lets out a waning screech as violet mist swirls around its dissolving body!") + visible_message(span_warning("[src] lets out a waning screech as violet mist swirls around its dissolving body!")) icon_state = icon_drain for(var/i = alpha, i > 0, i -= 10) stoplag() alpha = i - visible_message("[src]'s body breaks apart into a fine pile of blue dust.") + visible_message(span_danger("[src]'s body breaks apart into a fine pile of blue dust.")) var/reforming_essence = essence_regen_cap //retain the gained essence capacity var/obj/item/ectoplasm/qareen/R = new(get_turf(src)) R.essence = max(reforming_essence - 15 * perfectsouls, 75) //minus any perfect souls @@ -261,10 +261,10 @@ invisibility = 0 incorporeal_move = FALSE if(!unreveal_time) - to_chat(src, "You have been revealed!") + to_chat(src, span_revendanger("You have been revealed!")) unreveal_time = world.time + time else - to_chat(src, "You have been revealed!") + to_chat(src, span_revenwarning("You have been revealed!")) unreveal_time = unreveal_time + time update_spooky_icon() @@ -275,10 +275,10 @@ return mob_transforming = TRUE if(!unstun_time) - to_chat(src, "You cannot move!") + to_chat(src, span_revendanger("You cannot move!")) unstun_time = world.time + time else - to_chat(src, "You cannot move!") + to_chat(src, span_revenwarning("You cannot move!")) unstun_time = unstun_time + time update_spooky_icon() @@ -299,17 +299,17 @@ return var/turf/T = get_turf(src) if(isclosedturf(T)) - to_chat(src, "You cannot use abilities from inside of a wall.") + to_chat(src, span_revenwarning("You cannot use abilities from inside of a wall.")) return FALSE for(var/obj/O in T) if(O.density && !O.CanPass(src, T)) - to_chat(src, "You cannot use abilities inside of a dense object.") + to_chat(src, span_revenwarning("You cannot use abilities inside of a dense object.")) return FALSE if(inhibited) - to_chat(src, "Your powers have been suppressed by nulling energy!") + to_chat(src, span_revenwarning("Your powers have been suppressed by nulling energy!")) return FALSE if(!change_essence_amount(essence_cost, TRUE)) - to_chat(src, "You lack the essence to use that ability.") + to_chat(src, span_revenwarning("You lack the essence to use that ability.")) return FALSE return TRUE @@ -333,9 +333,9 @@ update_action_buttons_icon() if(!silent) if(essence_amt > 0) - to_chat(src, "Gained [essence_amt]E[source ? " from [source]":""].") + to_chat(src, span_revennotice("Gained [essence_amt]E[source ? " from [source]":""].")) else - to_chat(src, "Lost [essence_amt]E[source ? " from [source]":""].") + to_chat(src, span_revenminor("Lost [essence_amt]E[source ? " from [source]":""].")) return 1 /mob/living/simple_animal/qareen/proc/telekinesis_cooldown_end() @@ -383,13 +383,13 @@ reform() else inert = TRUE - visible_message("[src] settles down and seems lifeless.") + visible_message(span_warning("[src] settles down and seems lifeless.")) /obj/item/ectoplasm/qareen/attack_self(mob/user) if(!reforming || inert) return ..() - user.visible_message("[user] scatters [src] in all directions.", \ - "You scatter [src] across the area. The particles slowly fade away.") + user.visible_message(span_notice("[user] scatters [src] in all directions."), \ + span_notice("You scatter [src] across the area. The particles slowly fade away.")) user.dropItemToGround(src) scatter() @@ -397,15 +397,15 @@ ..() if(inert) return - visible_message("[src] breaks into particles upon impact, which fade away to nothingness.") + visible_message(span_notice("[src] breaks into particles upon impact, which fade away to nothingness.")) scatter() /obj/item/ectoplasm/qareen/examine(mob/user) . = ..() if(inert) - . += "It seems inert." + . += span_revennotice("It seems inert.") else if(reforming) - . += "It is shifting and distorted. It would be wise to destroy this." + . += span_revenwarning("It is shifting and distorted. It would be wise to destroy this.") /obj/item/ectoplasm/qareen/proc/reform() if(QDELETED(src) || QDELETED(qareen) || inert) @@ -427,7 +427,7 @@ qdel(qareen) message_admins("No candidates were found for the new qareen. Oh well!") inert = TRUE - visible_message("[src] settles down and seems lifeless.") + visible_message(span_revenwarning("[src] settles down and seems lifeless.")) return var/mob/C = pick(candidates) C.transfer_ckey(qareen, FALSE) @@ -435,12 +435,12 @@ qdel(qareen) message_admins("No ckey was found for the new qareen. Oh well!") inert = TRUE - visible_message("[src] settles down and seems lifeless.") + visible_message(span_revenwarning("[src] settles down and seems lifeless.")) return message_admins("[qareen.key] has been [old_key == qareen.key ? "re":""]made into a qareen by reforming ectoplasm.") log_game("[qareen.key] was [old_key == qareen.key ? "re":""]made as a qareen by reforming ectoplasm.") - visible_message("[src] suddenly rises into the air before fading away.") + visible_message(span_revenboldnotice("[src] suddenly rises into the air before fading away.")) qareen.essence = essence qareen.essence_regen_cap = essence @@ -449,7 +449,7 @@ qdel(src) /obj/item/ectoplasm/qareen/suicide_act(mob/user) - user.visible_message("[user] is inhaling [src]! It looks like [user.p_theyre()] trying to visit the shadow realm!") + user.visible_message(span_suicide("[user] is inhaling [src]! It looks like [user.p_theyre()] trying to visit the shadow realm!")) scatter() return (OXYLOSS) diff --git a/modular_splurt/code/modules/antagonists/qareen/qareen_abilities.dm b/modular_splurt/code/modules/antagonists/qareen/qareen_abilities.dm index d3080936a7..8963ea6379 100644 --- a/modular_splurt/code/modules/antagonists/qareen/qareen_abilities.dm +++ b/modular_splurt/code/modules/antagonists/qareen/qareen_abilities.dm @@ -9,7 +9,7 @@ if(ishuman(A)) if(A in drained_mobs) - to_chat(src, "[A]'s fluids are almost devoid of any essence, also very bland.. almost tasteless... but beggars can't be choosers." ) + to_chat(src, span_revenwarning("[A]'s fluids are almost devoid of any essence, also very bland.. almost tasteless... but beggars can't be choosers.") ) if(in_range(src, A)) Harvest(A) @@ -20,19 +20,19 @@ if(!castcheck(0)) return if(draining) - to_chat(src, "You are already sucking up the essence!") + to_chat(src, span_revenwarning("You are already sucking up the essence!")) return if(target.stat) - to_chat(src, "[target.p_their(TRUE)] essence is too faded to harvest.") + to_chat(src, span_revennotice("[target.p_their(TRUE)] essence is too faded to harvest.")) return if(!target.ckey) - to_chat(src, "[target.p_their(TRUE)] essence is lacking .. worthless.") + to_chat(src, span_revennotice("[target.p_their(TRUE)] essence is lacking .. worthless.")) // return if(prob(10)) to_chat(target, "You feel as if you are being watched.") face_atom(target) draining = TRUE - to_chat(src, "You search for the lifespring of [target].") + to_chat(src, span_revennotice("You search for the lifespring of [target].")) if(do_after(src, rand(10, 20), 0, target)) //did they get deleted in that second? for(var/obj/item/organ/genital/G in target.internal_organs) if(!(G.genital_flags & GENITAL_FUID_PRODUCTION)) @@ -43,9 +43,9 @@ var/main_fluid = G.get_fluid_name() var/fluid_ammount = clamp((G.fluid_rate * ((world.time - G.last_orgasmed) / (10 SECONDS)) * G.fluid_mult),0,G.fluid_max_volume) if (fluid_ammount <= 2) - to_chat(src, "[target.p_their(TRUE)] [G.name] spasms pitifully, almost nothing will come out.") + to_chat(src, span_revennotice("[target.p_their(TRUE)] [G.name] spasms pitifully, almost nothing will come out.")) else - to_chat(src, "[target.p_their(TRUE)] [G.name] are brimming with [main_fluid].") + to_chat(src, span_revennotice("[target.p_their(TRUE)] [G.name] are brimming with [main_fluid].")) if (fluid_ammount > 5) fluid_ammount = 5 // For balancing reasons if ((target in drained_mobs) || !target.ckey) @@ -60,33 +60,33 @@ if(do_after(src, rand(15, 20), 0, target)) //did they get deleted NOW? switch(essence_drained) if(0 to 4) - to_chat(src, "[target] is almost barren of essence. Still, every bit counts.") + to_chat(src, span_revennotice("[target] is almost barren of essence. Still, every bit counts.")) if(5 to 10) - to_chat(src, "[target] will yield an average amount of essence.") + to_chat(src, span_revennotice("[target] will yield an average amount of essence.")) if(11 to 20) - to_chat(src, "Such a feast! [target] will yield much essence to you.") + to_chat(src, span_revenboldnotice("Such a feast! [target] will yield much essence to you.")) if(30 to INFINITY) - to_chat(src, "Ah, a sexually furstrated person. [target] will yield massive amounts of essence to you.") + to_chat(src, span_revenbignotice("Ah, a sexually furstrated person. [target] will yield massive amounts of essence to you.")) if(do_after(src, rand(15, 25), 0, target)) //how about now if(target.stat) - to_chat(src, "[target.p_theyre(TRUE)] now too weak to provide anything of worth.") - to_chat(target, "You feel something tugging across your body before subsiding.") + to_chat(src, span_revenwarning("[target.p_theyre(TRUE)] now too weak to provide anything of worth.")) + to_chat(target, span_boldannounce("You feel something tugging across your body before subsiding.")) draining = 0 essence_drained = 0 return //hey, wait a minute... - to_chat(src, "You begin sucking up essence from [target]'s genitals and body.") + to_chat(src, span_revenminor("You begin sucking up essence from [target]'s genitals and body.")) if(target.stat != DEAD) - to_chat(target, "You feel an unholy euphoria as as something sucks at every part your body, your fluids flowing out...") + to_chat(target, span_warning("You feel an unholy euphoria as as something sucks at every part your body, your fluids flowing out...")) if(target.stat == SOFT_CRIT) target.Stun(150) reveal(46) stun(100) - target.visible_message("[target] suddenly rises slightly into the air, [target.p_their()] skin turning an ashy gray.") + target.visible_message(span_warning("[target] suddenly rises slightly into the air, [target.p_their()] skin turning an ashy gray.")) if(target.anti_magic_check(FALSE, TRUE)) - to_chat(src, "Something's wrong! [target] seems to be resisting the sucking, leaving you vulnerable!") + to_chat(src, span_revenminor("Something's wrong! [target] seems to be resisting the sucking, leaving you vulnerable!")) target.set_resting(TRUE,TRUE) - target.visible_message("[target] slumps onto the ground.", \ - "Violet lights, dancing in your vision, receding--") + target.visible_message(span_warning("[target] slumps onto the ground."), \ + span_revenwarning("Violet lights, dancing in your vision, receding--")) draining = FALSE return var/datum/beam/B = Beam(target,icon_state="drain_life",time=INFINITY) @@ -100,25 +100,25 @@ if(essence_drained > 30) essence_regen_cap += 15 perfectsouls++ - to_chat(src, "The ammount of [target]'s fluids has increased your maximum essence level. Your new maximum essence is [essence_regen_cap].") + to_chat(src, span_revenboldnotice("The ammount of [target]'s fluids has increased your maximum essence level. Your new maximum essence is [essence_regen_cap].")) else if(essence_drained >= 5) essence_regen_cap += 5 - to_chat(src, "The absorption of [target]'s fluids has increased your maximum essence level. Your new maximum essence is [essence_regen_cap].") + to_chat(src, span_revenboldnotice("The absorption of [target]'s fluids has increased your maximum essence level. Your new maximum essence is [essence_regen_cap].")) target.set_resting(TRUE,TRUE) - target.visible_message("[target] slumps onto the ground.", \ - "Violets lights, dancing in your vision, getting clo--") + target.visible_message(span_warning("[target] slumps onto the ground."), \ + span_revenwarning("Violets lights, dancing in your vision, getting clo--")) drained_mobs.Add(target) target.setStaminaLoss(150) // target.death(0) else - to_chat(src, "[target ? "[target] has":"[target.p_theyve(TRUE)]"] been drawn out of your grasp. The link has been broken.") + to_chat(src, span_revenwarning("[target ? "[target] has":"[target.p_theyve(TRUE)]"] been drawn out of your grasp. The link has been broken.")) if(target) //Wait, target is WHERE NOW? target.set_resting(TRUE,TRUE) - target.visible_message("[target] slumps onto the ground.", \ - "Violets lights, dancing in your vision, receding--") + target.visible_message(span_warning("[target] slumps onto the ground."), \ + span_revenwarning("Violets lights, dancing in your vision, receding--")) qdel(B) else - to_chat(src, "You are not close enough to suck on [target ? "[target]'s":"[target.p_their()]"] fluids. The link has been broken.") + to_chat(src, span_revenwarning("You are not close enough to suck on [target ? "[target]'s":"[target.p_their()]"] fluids. The link has been broken.")) draining = FALSE essence_drained = 0 @@ -126,7 +126,7 @@ /obj/effect/proc_holder/spell/targeted/night_vision/qareen charge_max = 0 panel = "Qareen Abilities" - message = "You toggle your night vision." + message = span_revennotice("You toggle your night vision.") action_icon = 'icons/mob/actions/actions_revenant.dmi' action_icon_state = "r_nightvision" action_background_icon_state = "bg_qareen" @@ -188,7 +188,7 @@ charge_counter = charge_max return FALSE name = "[initial(name)] ([cast_amount]E)" - to_chat(user, "You have unlocked [initial(name)]!") + to_chat(user, span_revennotice("You have unlocked [initial(name)]!")) panel = "Qareen Abilities" locked = FALSE charge_counter = charge_max @@ -227,7 +227,7 @@ L.flicker(20) //spooky continue L.flicker(20) //spooky - L.visible_message("\The [L] suddenly flares brightly and begins to spark!") + L.visible_message(span_warning("\The [L] suddenly flares brightly and begins to spark!")) var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(4, 0, L) s.start() @@ -335,7 +335,7 @@ continue if(human.anti_magic_check(FALSE, TRUE)) continue - to_chat(human, "You feel [pick("your sense of direction flicker out", "a stabbing pain in your head", "your mind fill with thought of servitude for a brief moment")].") + to_chat(human, span_revenwarning("You feel [pick("your sense of direction flicker out", "a stabbing pain in your head", "your mind fill with thought of servitude for a brief moment")].")) new /obj/effect/temp_visual/revenant(human.loc) // human.emp_act(80) // for(var/obj/thing in T) @@ -394,7 +394,7 @@ if(!blissfound) H.ForceContractDisease(new /datum/disease/qarbliss(), FALSE, TRUE) mob.adjust_bodytemperature(5) - to_chat(H, "You feel [pick("suddenly hot", "a surge of warmth", "like your crotch is tingling")].") + to_chat(H, span_revenminor("You feel [pick("suddenly hot", "a surge of warmth", "like your crotch is tingling")].")) mob.reagents.add_reagent(/datum/reagent/drug/aphrodisiac, 5) else mob.adjust_bodytemperature(5) diff --git a/modular_splurt/code/modules/antagonists/qareen/qareen_bliss.dm b/modular_splurt/code/modules/antagonists/qareen/qareen_bliss.dm index 5a0a657ea5..4b9fd83cd6 100644 --- a/modular_splurt/code/modules/antagonists/qareen/qareen_bliss.dm +++ b/modular_splurt/code/modules/antagonists/qareen/qareen_bliss.dm @@ -27,7 +27,7 @@ /datum/disease/qarbliss/stage_act() if(prob(stage*2)) if(prob(5)) - to_chat(affected_mob, "You feel [pick("hot and bothered", "horny", "lusty", "like you're in a rut", "the need to breed", "breedable", "slimy")]...") + to_chat(affected_mob, span_revennotice("You feel [pick("hot and bothered", "horny", "lusty", "like you're in a rut", "the need to breed", "breedable", "slimy")]...")) if(stage > 1 && prob(20)) affected_mob.confused += 5 if(stage > 2 && prob(20)) @@ -56,14 +56,14 @@ if(5) if (bliss_stage_2 == FALSE) bliss_stage_2 = TRUE - to_chat(affected_mob, "It's too much! Brain.. fried..") + to_chat(affected_mob, span_revenbignotice("It's too much! Brain.. fried..")) if (ishuman(affected_mob)) var/mob/living/carbon/human/H = affected_mob H.mob_climax(TRUE,"Bliss",src,TRUE) if(affected_mob.dna?.species) affected_mob.dna.species.handle_mutant_bodyparts(affected_mob,"#fff0ff") affected_mob.dna.species.handle_hair(affected_mob,"#da6eda") - affected_mob.visible_message("[affected_mob] looks utterly depraved.", "You suddenly feel like your skin is tingling...") + affected_mob.visible_message(span_warning("[affected_mob] looks utterly depraved."), span_revennotice("You suddenly feel like your skin is tingling...")) affected_mob.add_atom_colour("#ffdaf3", TEMPORARY_COLOUR_PRIORITY) new /obj/effect/temp_visual/revenant(affected_mob.loc) // addtimer(CALLBACK(src, .proc/blessings), 150) @@ -79,4 +79,4 @@ if(QDELETED(affected_mob)) return affected_mob.playsound_local(affected_mob, 'sound/effects/gib_step.ogg', 40, 1, -1) - to_chat(affected_mob, "You sense the curse of a lustful ghost befall you...") + to_chat(affected_mob, span_revendanger("You sense the curse of a lustful ghost befall you...")) diff --git a/modular_splurt/code/modules/antagonists/slaver/equipment/slaver_items.dm b/modular_splurt/code/modules/antagonists/slaver/equipment/slaver_items.dm index 76c1810a9e..d3880bda09 100644 --- a/modular_splurt/code/modules/antagonists/slaver/equipment/slaver_items.dm +++ b/modular_splurt/code/modules/antagonists/slaver/equipment/slaver_items.dm @@ -13,11 +13,11 @@ /obj/item/slaver/gizmo/attack(mob/living/M, mob/user) var/datum/antagonist/slaver/S = locate() in user.mind.antag_datums if(!S) // Is not a slaver antag. - to_chat(user, "You aren't sure how to use this tech!") + to_chat(user, span_warning("You aren't sure how to use this tech!")) return if(user == M) - to_chat(user, "You can't teleport yourself!") + to_chat(user, span_warning("You can't teleport yourself!")) return // Find a location to teleport to @@ -32,19 +32,19 @@ // Check we are in range of the destination if(!mobLocation || mobLocation.z != teleportDestination.z) - to_chat(user, "The mothership is out of range, you need to be on the same z-level!") + to_chat(user, span_warning("The mothership is out of range, you need to be on the same z-level!")) return - user.visible_message("[user] begins scanning [M] with [src].", "You begin scanning [M] with [src].") + user.visible_message(span_notice("[user] begins scanning [M] with [src]."), span_notice("You begin scanning [M] with [src].")) if(do_mob(user, M, 15 SECONDS)) // Teleport! playsound(get_turf(M.loc), 'sound/magic/blink.ogg', 50, 1) - M.visible_message("[M] vanishes from sight!", \ - "You feel a rush of energy as you are beamed to the slaver mothership!") + M.visible_message(span_notice("[M] vanishes from sight!"), \ + span_notice("You feel a rush of energy as you are beamed to the slaver mothership!")) new /obj/effect/temp_visual/dir_setting/ninja(get_turf(M), M.dir) M.forceMove(teleportDestination) else - to_chat(user, "You need to stand still and uninterrupted for 15 seconds!") + to_chat(user, span_warning("You need to stand still and uninterrupted for 15 seconds!")) // Buyable gear kits at the slaver console /obj/item/storage/box/slaver_teleport diff --git a/modular_splurt/code/modules/antagonists/slaver/slaver.dm b/modular_splurt/code/modules/antagonists/slaver/slaver.dm index 975a240520..7638cc11f3 100644 --- a/modular_splurt/code/modules/antagonists/slaver/slaver.dm +++ b/modular_splurt/code/modules/antagonists/slaver/slaver.dm @@ -200,7 +200,7 @@ GLOBAL_LIST_INIT(slavers_ransom_values, list( /datum/team/slavers/roundend_report() var/list/parts = list() - parts += "Slave Traders:" + parts += span_header("Slave Traders:") var/text = "
The crew were:" var/slavesSold = GLOB.slavers_slaves_sold @@ -225,9 +225,9 @@ GLOBAL_LIST_INIT(slavers_ransom_values, list( // var/datum/objective/slaver/O = locate() in objectives if(GLOB.slavers_credits_total >= 200000 && !all_dead) - parts += "The slaver crew were successful!" + parts += span_greentext("The slaver crew were successful!") else - parts += "The slaver crew have failed." + parts += span_redtext("The slaver crew have failed.") parts += text diff --git a/modular_splurt/code/modules/antagonists/wendigo/mob/_on_click.dm b/modular_splurt/code/modules/antagonists/wendigo/mob/_on_click.dm index 13257de9e9..f5cccf49d8 100644 --- a/modular_splurt/code/modules/antagonists/wendigo/mob/_on_click.dm +++ b/modular_splurt/code/modules/antagonists/wendigo/mob/_on_click.dm @@ -3,9 +3,9 @@ /mob/living/carbon/wendigo/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) if(incapacitated() || lying) - to_chat(src, "You can't do that right now!") + to_chat(src, span_warning("You can't do that right now!")) return FALSE if(be_close && !in_range(M, src)) - to_chat(src, "You are too far away!") + to_chat(src, span_warning("You are too far away!")) return FALSE return TRUE diff --git a/modular_splurt/code/modules/antagonists/wendigo/mob/examine.dm b/modular_splurt/code/modules/antagonists/wendigo/mob/examine.dm index c3d1fe26e9..9427a91018 100644 --- a/modular_splurt/code/modules/antagonists/wendigo/mob/examine.dm +++ b/modular_splurt/code/modules/antagonists/wendigo/mob/examine.dm @@ -7,9 +7,9 @@ . = list("*---------*\nThis is [icon2html(src, user)] \a [src]!") if(handcuffed) - . += "[t_He] is [icon2html(handcuffed, user)] handcuffed!" + . += span_warning("[t_He] is [icon2html(handcuffed, user)] handcuffed!") if(legcuffed) - . += "[t_He] has [icon2html(legcuffed, user)] leg cuffs!" + . += span_warning("[t_He] has [icon2html(legcuffed, user)] leg cuffs!") if(head) . += "[t_He] is wearing [head.get_examine_string(user)] on [t_his] head." if(wear_neck) @@ -23,7 +23,7 @@ . += "[t_He] has [back.get_examine_string(user)] on [t_his] back." if(stat == DEAD) - . += "[t_He] is limp and unresponsive, with no signs of life." + . += span_deadsay("[t_He] is limp and unresponsive, with no signs of life.") var/list/msg = ("") var/temp_hp = getBruteLoss() @@ -66,7 +66,7 @@ if(connected_link) if(connected_link.souls.len > 5) - . += "[t_His] eyes are glowing a deadly red." + . += span_warning("[t_His] eyes are glowing a deadly red.") else var/A = "" switch(connected_link.souls.len) @@ -80,7 +80,7 @@ A += "[t_His] eyes are glowing red." . += "[A]" else - . += "[t_He] looks lost." + . += span_deadsay("[t_He] looks lost.") SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, .) . += "*---------*" diff --git a/modular_splurt/code/modules/antagonists/wendigo/mob/metabolization.dm b/modular_splurt/code/modules/antagonists/wendigo/mob/metabolization.dm index 33a2869bdc..7293047456 100644 --- a/modular_splurt/code/modules/antagonists/wendigo/mob/metabolization.dm +++ b/modular_splurt/code/modules/antagonists/wendigo/mob/metabolization.dm @@ -42,15 +42,15 @@ if(round(fake_penis_size, 1) == fake_penis_size && fake_penis_size) switch(had_changed) if("penis_enlarger") - to_chat(src, "Your [pick(GLOB.dick_nouns)] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [fake_penis_size] inch penis.
") + to_chat(src, span_warning("Your [pick(GLOB.dick_nouns)] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [fake_penis_size] inch penis.")) if("PEsmaller") if(fake_penis_size > 0) - to_chat(src, "Your [pick(GLOB.dick_nouns)] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [fake_penis_size] inch penis.") + to_chat(src, span_warning("Your [pick(GLOB.dick_nouns)] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [fake_penis_size] inch penis.
")) else if(round(fake_breast_size, 1) == fake_breast_size && fake_breast_size) switch(had_changed) if("breast_enlarger") - to_chat(src, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [ascii2text(round(fake_breast_size)+63)]-cup.") + to_chat(src, span_warning("Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [ascii2text(round(fake_breast_size)+63)]-cup.
")) if("BEsmaller)") if(fake_breast_size > 0) - to_chat(src, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "contracts into")] a [ascii2text(round(fake_breast_size)+63)]-cup.") + to_chat(src, span_warning("Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "contracts into")] a [ascii2text(round(fake_breast_size)+63)]-cup.")) return TRUE diff --git a/modular_splurt/code/modules/arousal/arousal.dm b/modular_splurt/code/modules/arousal/arousal.dm index aaee27e37b..b60b8e95e1 100644 --- a/modular_splurt/code/modules/arousal/arousal.dm +++ b/modular_splurt/code/modules/arousal/arousal.dm @@ -60,7 +60,7 @@ var/obj/item/organ/genital/penis/bepis = sender if(locate(/obj/item/genital_equipment/sounding) in bepis.contents) spill = TRUE - to_chat(src, "You feel your sounding rod being pushed out of your cockhole with the burst of jizz!") + to_chat(src, span_userlove("You feel your sounding rod being pushed out of your cockhole with the burst of jizz!")) var/obj/item/genital_equipment/sounding/rod = locate(/obj/item/genital_equipment/sounding) in bepis.contents rod.forceMove(get_turf(src)) @@ -81,14 +81,14 @@ return var/main_fluid = lowertext(fluid_source.get_master_reagent_name()) if(mb_time) - visible_message("You hear a strong suction sound coming from the [M.name] on [src]'s [G.name].", \ - "The [M.name] pumps faster, trying to get you over the edge.", \ - "Something vacuums your [G.name] with a quiet but powerfull vrrrr.") + visible_message(span_love("You hear a strong suction sound coming from the [M.name] on [src]'s [G.name]."), \ + span_userlove("The [M.name] pumps faster, trying to get you over the edge."), \ + span_userlove("Something vacuums your [G.name] with a quiet but powerfull vrrrr.")) if(!do_after(src, mb_time, target = src) || !in_range(src, container) || !G.climaxable(src, TRUE)) return - visible_message("[src] twitches as [p_their()] [main_fluid] trickles into [container].", \ - "[M] sucks out all the [main_fluid] you had been saving up into [container].", \ - "You feel a vacuum sucking on your [G.name] as you climax!") + visible_message(span_love("[src] twitches as [p_their()] [main_fluid] trickles into [container]."), \ + span_userlove("[M] sucks out all the [main_fluid] you had been saving up into [container]."), \ + span_userlove("You feel a vacuum sucking on your [G.name] as you climax!")) do_climax(fluid_source, container, G, FALSE, cover = TRUE) emote("moan") @@ -97,12 +97,12 @@ if(!fluid_source) return if(mb_time) //Skip warning if this is an instant climax. - to_chat(src,"You're about to climax over [L]!") - to_chat(L,"[src] is about to climax over you!") + to_chat(src,span_userlove("You're about to climax over [L]!")) + to_chat(L,span_userlove("[src] is about to climax over you!")) if(!do_after(src, mb_time, target = src) || !in_range(src, L) || !G.climaxable(src, TRUE)) return - to_chat(src,"You climax all over [L] using your [G.name]!") - to_chat(L, "[src] climaxes all over you using [p_their()] [G.name]!") + to_chat(src,span_userlove("You climax all over [L] using your [G.name]!")) + to_chat(L, span_userlove("[src] climaxes all over you using [p_their()] [G.name]!")) do_climax(fluid_source, L, G, spillage, cover = TRUE) /atom/proc/add_cum_overlay() //This can go in a better spot, for now its here. diff --git a/modular_splurt/code/modules/arousal/genitals.dm b/modular_splurt/code/modules/arousal/genitals.dm index 0b639672c0..2305968913 100644 --- a/modular_splurt/code/modules/arousal/genitals.dm +++ b/modular_splurt/code/modules/arousal/genitals.dm @@ -49,23 +49,23 @@ /obj/item/organ/genital/proc/remove_equipment(mob/living/carbon/remover, selection) var/obj/item/selected = equipment[selection] if(!selected) - to_chat(remover, "[remover != owner ? owner.p_their() : "Your"] [name] doesn't have that equipped") + to_chat(remover, span_warning("[remover != owner ? owner.p_their() : "Your"] [name] doesn't have that equipped")) return if(remover == owner) - owner.visible_message(message = "\The [owner] slides the [selected] out of [owner.p_their()] [name]", - self_message = "You feel the [selected] slide out of your [name]", + owner.visible_message(message = span_lewd("\The [owner] slides the [selected] out of [owner.p_their()] [name]"), + self_message = span_lewd("You feel the [selected] slide out of your [name]"), ignored_mobs = owner.get_unconsenting() ) else owner.visible_message(message = "\The [remover] tries to remove the [selected] out of [owner]'s [name]", - self_message = "\The [remover] gently takes your [name] and starts sliding the [selected] out of it", + self_message = span_lewd("\The [remover] gently takes your [name] and starts sliding the [selected] out of it"), ignored_mobs = owner.get_unconsenting() ) if(!do_mob(remover, owner, 4 SECONDS)) return - owner.visible_message(message = "\The [remover] slides the [selected] out of [owner]'s [name]!", - self_message = "You feel [remover]'s warm hand slide the [selected] out of your [name]", + owner.visible_message(message = span_lewd("\The [remover] slides the [selected] out of [owner]'s [name]!"), + self_message = span_lewd("You feel [remover]'s warm hand slide the [selected] out of your [name]
"), ignored_mobs = owner.get_unconsenting() ) switch(selected.type) diff --git a/modular_splurt/code/modules/arousal/organs/belly.dm b/modular_splurt/code/modules/arousal/organs/belly.dm index ffcd3e3661..44ae1ffafa 100644 --- a/modular_splurt/code/modules/arousal/organs/belly.dm +++ b/modular_splurt/code/modules/arousal/organs/belly.dm @@ -40,7 +40,7 @@ var/list/belly_names = list("stomach", "belly", "gut", "midsection", "rolls") if(size < 0)//I don't actually know what round() does to negative numbers, so to be safe!!fixed if(owner) - to_chat(owner, "You feel your [pick(belly_names)] go completely flat.") + to_chat(owner, span_warning("You feel your [pick(belly_names)] go completely flat.")) QDEL_IN(src, 1) return @@ -48,9 +48,9 @@ var/mob/living/carbon/human/H = owner var/r_prev_size = round(prev_size) if (rounded_size > r_prev_size) - to_chat(H, "Your guts [pick("swell up to", "gurgle into", "expand into", "plump up into", "grow eagerly into", "fatten up into", "distend into")] a larger midsection.") + to_chat(H, span_warning("Your guts [pick("swell up to", "gurgle into", "expand into", "plump up into", "grow eagerly into", "fatten up into", "distend into")] a larger midsection.")) else if (rounded_size < r_prev_size) - to_chat(H, "Your guts [pick("shrink down to", "decrease into", "wobble down into", "diminish into", "deflate into", "contracts into")] a smaller midsection.") + to_chat(H, span_warning("Your guts [pick("shrink down to", "decrease into", "wobble down into", "diminish into", "deflate into", "contracts into")] a smaller midsection.")) /obj/item/organ/genital/belly/update_appearance() var/lowershape = lowertext(shape) @@ -130,7 +130,7 @@ var/growth_amount = climax_fluids.total_volume / (fluid_max_volume * GENITAL_INFLATION_THRESHOLD) modify_size(growth_amount) if(size > round(previous)) - owner.visible_message("\The [owner]'s belly bloats outwards as it gets pumped full of[pick(" sweet", "")] [lowertext(source_gen.get_fluid_name())]!", ignored_mobs = owner.get_unconsenting()) + owner.visible_message(span_lewd("\The [owner]'s belly bloats outwards as it gets pumped full of[pick(" sweet", "")] [lowertext(source_gen.get_fluid_name())]!"), ignored_mobs = owner.get_unconsenting()) fluid_id = source_gen.get_fluid_id() if((growth_amount >= 3 || size >= 3) && (owner.client?.prefs.cit_toggles & BUTT_ENLARGEMENT)) var/obj/item/organ/genital/butt/ass = owner.getorganslot(ORGAN_SLOT_BUTT) diff --git a/modular_splurt/code/modules/arousal/organs/butt.dm b/modular_splurt/code/modules/arousal/organs/butt.dm index bc37f4aef2..45622e77e1 100644 --- a/modular_splurt/code/modules/arousal/organs/butt.dm +++ b/modular_splurt/code/modules/arousal/organs/butt.dm @@ -45,6 +45,6 @@ var/list/asscheeks = list("asscheeks", "buttcheeks", "ass buns", "booty pillows", "dumptruck spheres", "[pick(list("jiggly", "bouncy", "wobbly"))] buttocks") modify_size(growth_amount) if(size != previous) - owner.visible_message("\The [owner]'s [pick(GLOB.butt_nouns + asscheeks)] bounce\s outwards lewdly as [owner.p_they()] get[owner.p_s()] pumped full of [lowertext(source_gen.get_fluid_name())] from behind!", ignored_mobs = owner.get_unconsenting()) + owner.visible_message(span_lewd("\The [owner]'s [pick(GLOB.butt_nouns + asscheeks)] bounce\s outwards lewdly as [owner.p_they()] get[owner.p_s()] pumped full of [lowertext(source_gen.get_fluid_name())] from behind!"), ignored_mobs = owner.get_unconsenting()) fluid_id = source_gen.get_fluid_id() climax_fluids.clear_reagents() diff --git a/modular_splurt/code/modules/arousal/organs/penis.dm b/modular_splurt/code/modules/arousal/organs/penis.dm index d09680b312..78e015ea0b 100644 --- a/modular_splurt/code/modules/arousal/organs/penis.dm +++ b/modular_splurt/code/modules/arousal/organs/penis.dm @@ -31,7 +31,7 @@ var/previous = size modify_size(target.total_volume / (fluid_max_volume * GENITAL_INFLATION_THRESHOLD)) if(size != previous) - owner.visible_message("\The [owner]'s [pick(GLOB.dick_nouns)][linked_organ ? " and [pick(list("nuts", "balls", "testicles", "ballsack", "sack"))]" : ""] swell and grow bigger as they get pumped full of \the [partner]'s [lowertext(source_gen.get_fluid_name())]!", ignored_mobs = owner.get_unconsenting()) + owner.visible_message(span_lewd("\The [owner]'s [pick(GLOB.dick_nouns)][linked_organ ? " and [pick(list("nuts", "balls", "testicles", "ballsack", "sack"))]" : ""] swell and grow bigger as they get pumped full of \the [partner]'s [lowertext(source_gen.get_fluid_name())]!"), ignored_mobs = owner.get_unconsenting()) if(linked_organ) linked_organ.fluid_id = source_gen.get_fluid_id() target.clear_reagents() diff --git a/modular_splurt/code/modules/arousal/toys/dildos.dm b/modular_splurt/code/modules/arousal/toys/dildos.dm index 7c12e5ab64..0dd77f4583 100644 --- a/modular_splurt/code/modules/arousal/toys/dildos.dm +++ b/modular_splurt/code/modules/arousal/toys/dildos.dm @@ -6,7 +6,7 @@ /obj/item/dildo/flared/gigantic/suicide_act(mob/living/user) if(do_after(user,45,target=src)) - user.visible_message("[user] tears-up and gags as they try to deepthroat the [src]! WHY WOULD THEY DO THAT? It looks like [user.p_theyre()] trying to commit suicide!!") + user.visible_message(span_suicide("[user] tears-up and gags as they try to deepthroat the [src]! WHY WOULD THEY DO THAT? It looks like [user.p_theyre()] trying to commit suicide!!")) playsound(loc, 'sound/weapons/gagging.ogg', 50, 2, -1) user.Stun(400) user.adjust_blurriness(24) diff --git a/modular_splurt/code/modules/awaymissions/mission_code/academy.dm b/modular_splurt/code/modules/awaymissions/mission_code/academy.dm new file mode 100644 index 0000000000..b29a64d948 --- /dev/null +++ b/modular_splurt/code/modules/awaymissions/mission_code/academy.dm @@ -0,0 +1,21 @@ +//Academy Items + +/obj/item/dice/d20/fate + var/list/used_fingerprints = null // Used to track who used the one_use die + +/obj/item/dice/d20/fate/one_use + reusable = 1 // Obsolete by the used_fingerprints list + +/obj/item/dice/d20/fate/effect(var/mob/living/carbon/human/user,roll) + // This override checks if a user has rolled the dice + // If true; Reject them and abort + if (user in used_fingerprints) + // Send a message implying someone else should roll + visible_message(span_notice("[user] rolls the dice, but it doesn't respond to [user.p_them()] again.")) + return + // If false; Add them to the user list and continue + else + LAZYADD(used_fingerprints, user) + + // Run the function normally + ..() diff --git a/modular_splurt/code/modules/cargo/packs/misc.dm b/modular_splurt/code/modules/cargo/packs/misc.dm index 3211d7e085..bf5eec556d 100644 --- a/modular_splurt/code/modules/cargo/packs/misc.dm +++ b/modular_splurt/code/modules/cargo/packs/misc.dm @@ -215,6 +215,15 @@ cost = 100000 contains = list(/obj/item/reagent_containers/food/drinks/diminicillin) +/datum/supply_pack/misc/plushmium + name = "Plushmium Crate" + desc = "Surplus shipment of Stuffing For Spessmen backer rewards. Contains a pre-packaged spray bottle of Plushmium, and toy to use it on." + cost = 5000 // Cost of an expensive animal + contains = list( + /obj/item/storage/box/shipment_plushmium, + /obj/item/choice_beacon/box/plushie + ) + /datum/supply_pack/misc/microbricks name = "Microbricks Crate" desc = "Extremely bored? Recreate a downscale city and get upset when it all comes crumbling down!" diff --git a/modular_splurt/code/modules/cargo/sweatshop/sweatshop.dm b/modular_splurt/code/modules/cargo/sweatshop/sweatshop.dm index b3d6189391..09c40bfcfc 100644 --- a/modular_splurt/code/modules/cargo/sweatshop/sweatshop.dm +++ b/modular_splurt/code/modules/cargo/sweatshop/sweatshop.dm @@ -87,54 +87,54 @@ //saw a plank into two platforms /obj/item/processed/wood/plank/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/carpentry/handsaw)) - to_chat(user," You begin to saw [src] in half...") + to_chat(user,span_notice(" You begin to saw [src] in half...")) if(do_after(user, 40, target = src) && isturf(loc)) new src.sawobj(loc) new src.sawobj(loc) //send help i dont know how to make two in the same line lmfao - to_chat(user, " You saw [src] in half.") + to_chat(user, span_notice(" You saw [src] in half.")) qdel(src) else - to_chat(user, "You need to hold still to saw [src]!") + to_chat(user, span_warning("You need to hold still to saw [src]!")) else ..() //saw a platform into four blocks /obj/item/processed/wood/platform/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/carpentry/handsaw)) - to_chat(user," You begin cut [src] into smaller pieces...") + to_chat(user,span_notice(" You begin cut [src] into smaller pieces...")) if(do_after(user, 20, target = src) && isturf(loc)) new src.sawobj(loc) new src.sawobj(loc) new src.sawobj(loc) new src.sawobj(loc) - to_chat(user, " You cut [src] into four pieces.") + to_chat(user, span_notice(" You cut [src] into four pieces.")) qdel(src) else - to_chat(user, "You need to hold still to saw [src]!") + to_chat(user, span_warning("You need to hold still to saw [src]!")) else ..() //sand a block into a peg /obj/item/processed/wood/block/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/carpentry/sandpaper)) - to_chat(user," You carefully begin to sand down [src]...") + to_chat(user,span_notice(" You carefully begin to sand down [src]...")) if(do_after(user, 50, target = src) && isturf(loc)) new src.sandobj(loc) - to_chat(user, " You smooth [src] into a peg.") + to_chat(user, span_notice(" You smooth [src] into a peg.")) qdel(src) else - to_chat(user, "You need to hold still to sand [src]!") + to_chat(user, span_warning("You need to hold still to sand [src]!")) else ..() //cut heated metal into nails /obj/item/processed/metal/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/wirecutters)) - to_chat(user," You tediously begin to cut [src] into several nails...") + to_chat(user,span_notice(" You tediously begin to cut [src] into several nails...")) if(do_after(user, 80, target = src) && isturf(loc)) new /obj/item/nails(loc) new /obj/item/nails(loc) - to_chat(user, " You make some crude metal nails.") + to_chat(user, span_notice(" You make some crude metal nails.")) qdel(src) else - to_chat(user, "You need to hold still to process [src]!") + to_chat(user, span_warning("You need to hold still to process [src]!")) else ..() @@ -142,25 +142,25 @@ //cover a wooden block in glue /obj/item/processed/wood/block/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/carpentry/glue)) - to_chat(user," You begin to glue down one end of [src]...") + to_chat(user,span_notice(" You begin to glue down one end of [src]...")) if(do_after(user, 10, target = src) && isturf(loc)) new src.glueobj(loc) - to_chat(user, " You slap some glue onto [src].") + to_chat(user, span_notice(" You slap some glue onto [src].")) qdel(src) else - to_chat(user, "You need to hold still to glue [src]!") + to_chat(user, span_warning("You need to hold still to glue [src]!")) else ..() //cover a wooden peg in glue /obj/item/processed/wood/peg/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/carpentry/glue)) - to_chat(user," You begin to glue down one end of the [src]...") + to_chat(user,span_notice(" You begin to glue down one end of the [src]...")) if(do_after(user, 10, target = src) && isturf(loc)) new src.glueobj(loc) - to_chat(user, " You slap some glue onto [src].") + to_chat(user, span_notice(" You slap some glue onto [src].")) qdel(src) else - to_chat(user, "You need to hold still to glue [src]!") + to_chat(user, span_warning("You need to hold still to glue [src]!")) else ..() @@ -168,89 +168,89 @@ //bore a platform into a seat /obj/item/processed/wood/platform/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/carpentry/borer)) - to_chat(user," You begin to cut four holes into [src]...") + to_chat(user,span_notice(" You begin to cut four holes into [src]...")) if(do_after(user, 40, target = src) && isturf(loc)) new src.boreobj(loc) - to_chat(user, " You drill four holes into [src].") + to_chat(user, span_notice(" You drill four holes into [src].")) qdel(src) else - to_chat(user, "You need to hold still to refine [src]!") + to_chat(user, span_warning("You need to hold still to refine [src]!")) else ..() //Stools - Further crafting /obj/item/processed/wood/stool1/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/nails)) - to_chat(user," You place nails into [src]...") + to_chat(user,span_notice(" You place nails into [src]...")) if(do_after(user, 20, target = src) && isturf(loc)) new /obj/item/processed/wood/stool2(loc) - to_chat(user, " The nails are ready to be hammered.") + to_chat(user, span_notice(" The nails are ready to be hammered.")) qdel(src) qdel(I) else - to_chat(user, "You need to hold still to refine [src]!") + to_chat(user, span_warning("You need to hold still to refine [src]!")) else ..() /obj/item/processed/wood/stool2/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/carpentry/hammer)) - to_chat(user," You begin to hammer the [src]...") + to_chat(user,span_notice(" You begin to hammer the [src]...")) if(do_after(user, 30, target = src) && isturf(loc)) new /obj/item/processed/wood/stool3(loc) - to_chat(user, " The nails are hammered into place.") + to_chat(user, span_notice(" The nails are hammered into place.")) qdel(src) else - to_chat(user, "You need to hold still to refine [src]!") + to_chat(user, span_warning("You need to hold still to refine [src]!")) else ..() /obj/item/processed/wood/stool3/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/carpentry/sandpaper)) - to_chat(user," You begin to sand the [src]...") + to_chat(user,span_notice(" You begin to sand the [src]...")) if(do_after(user, 30, target = src) && isturf(loc)) new /obj/item/processed/wood/stool4(loc) - to_chat(user, " You sand down the [src].") + to_chat(user, span_notice(" You sand down the [src].")) qdel(src) else - to_chat(user, "You need to hold still to refine [src]!") + to_chat(user, span_warning("You need to hold still to refine [src]!")) else ..() /obj/item/processed/wood/stool4/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/processed/wood/glueblock)) - to_chat(user," You add some finishing touches to the [src]...") + to_chat(user,span_notice(" You add some finishing touches to the [src]...")) if(do_after(user, 30, target = src) && isturf(loc)) new /obj/item/processed/wood/stool(loc) - to_chat(user, " You complete the [src].") + to_chat(user, span_notice(" You complete the [src].")) qdel(src) qdel(I) else - to_chat(user, "You need to hold still to refine [src]!") + to_chat(user, span_warning("You need to hold still to refine [src]!")) else ..() /obj/item/processed/wood/stool/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/cushion)) - to_chat(user," You secure a cloth cushion to [src]...") + to_chat(user,span_notice(" You secure a cloth cushion to [src]...")) if(do_after(user, 30, target = src) && isturf(loc)) new /obj/item/processed/wood/stoolcloth(loc) - to_chat(user, " You add a cushion to [src].") + to_chat(user, span_notice(" You add a cushion to [src].")) qdel(src) qdel(I) else - to_chat(user, "You need to hold still to detail [src]!") + to_chat(user, span_warning("You need to hold still to detail [src]!")) else ..() /obj/item/processed/wood/stool/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/cushion/silk)) - to_chat(user," You secure a silk cushion to [src]...") + to_chat(user,span_notice(" You secure a silk cushion to [src]...")) if(do_after(user, 30, target = src) && isturf(loc)) new /obj/item/processed/wood/stoolsilk(loc) - to_chat(user, " You add a cushion to [src].") + to_chat(user, span_notice(" You add a cushion to [src].")) qdel(src) qdel(I) else - to_chat(user, "You need to hold still to detail [src]!") + to_chat(user, span_warning("You need to hold still to detail [src]!")) else ..() diff --git a/modular_splurt/code/modules/client/client_procs.dm b/modular_splurt/code/modules/client/client_procs.dm index 7f82c94449..d2e67c65bf 100644 --- a/modular_splurt/code/modules/client/client_procs.dm +++ b/modular_splurt/code/modules/client/client_procs.dm @@ -77,7 +77,7 @@ M.mind.AddSpell(new T) else M.AddSpell(new T) - message_admins("Spells given to mindless mobs will not be transferred in mindswap or cloning!") + message_admins(span_danger("Spells given to mindless mobs will not be transferred in mindswap or cloning!")) /client/proc/teach_martial_art(mob/living/carbon/C) if (!istype(C)) @@ -99,7 +99,7 @@ var/datum/martial_art/MA = new chosenart MA.teach(C) log_admin("[key_name(usr)] has taught [MA] to [key_name(C)].") - message_admins("[key_name_admin(usr)] has taught [MA] to [key_name_admin(C)].") + message_admins(span_notice("[key_name_admin(usr)] has taught [MA] to [key_name_admin(C)].")) /client/proc/set_species(mob/living/carbon/human/H) if (istype(H)) diff --git a/modular_splurt/code/modules/client/loadout/backpack.dm b/modular_splurt/code/modules/client/loadout/backpack.dm index 448bd8a68a..6ed7050e30 100644 --- a/modular_splurt/code/modules/client/loadout/backpack.dm +++ b/modular_splurt/code/modules/client/loadout/backpack.dm @@ -5,6 +5,11 @@ path = /obj/item/genital_equipment/condom cost = 1 +/datum/gear/backpack/condom_box + name = "Box of Condoms" + path = /obj/item/storage/box/bulk_condoms + cost = 2 + /datum/gear/backpack/sounding name = "Sounding rod" path = /obj/item/genital_equipment/sounding @@ -88,7 +93,7 @@ name = "Purple Nail Polish" path = /obj/item/nailpolish/purple -/datum/gear/backback/secbadge +/datum/gear/backpack/secbadge name = "Security Badge" path = /obj/item/clothing/accessory/badge restricted_roles = list("Security Officer", "Warden", "Detective", "Head of Security") diff --git a/modular_splurt/code/modules/clothing/clothing.dm b/modular_splurt/code/modules/clothing/clothing.dm new file mode 100644 index 0000000000..d006aa26f1 --- /dev/null +++ b/modular_splurt/code/modules/clothing/clothing.dm @@ -0,0 +1,43 @@ +/obj/item/clothing + var/last_bites = 3 //Once clothes is shredded, this determines how many more bites till its deleted. + var/is_edible = 0 //Controls what can or can't be eaten by Clothes Eaters/Insects + +//Cloth eaters get some nutrients. A Jumpsuit will roughly give back 50 Nutrition. IF eaten fully. +/obj/item/reagent_containers/food/snacks/clothing + list_reagents = list(/datum/reagent/consumable/nutriment = 3) + +//A call on attemp_forcefeed() without async to properly know if it worked or not. In theory this shouldn't cause any issues as only a small part of the population should ever run this.VS normal eating. +/obj/item/reagent_containers/food/snacks/clothing/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) + if(user.a_intent == INTENT_HARM) + return ..() + return attempt_forcefeed(M, user) + + +//As a bonus for having the Cloth Eater trait. You gain extra mood from eatin clothes, but damage them at the same time. +/obj/item/clothing/attack(mob/M, mob/user, def_zone) + if(user.a_intent != INTENT_HARM) + if(HAS_TRAIT(M,TRAIT_CLOTH_EATER) || isinsect(M)) + if(is_edible == 0) //This checks if an item can be shredded. + to_chat(M, "This item is too tough to eat.") + return FALSE //Return False to prevent the player smacking themselves with the item. Didn't want to risk a player accidently hurting themselves trying to eat anything. + var/obj/item/reagent_containers/food/snacks/clothing/clothing_as_food = new + clothing_as_food.name = name + var/mob/living/H = M + if(clothing_as_food.attack(M, user, def_zone)) //Staggered as calling it in the original IF will cause anyone who lacks either to eat. + if(damaged_clothes == CLOTHING_SHREDDED) //Check if we need to start breaking clothes + last_bites -= 1 + to_chat(M, "There isn't much of the [name] left to eat.") + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "cloth_consumed", /datum/mood_event/cloth_eaten, src) + take_damage(20, sound_effect=FALSE) + qdel(clothing_as_food) + if(last_bites <= 0) + user.visible_message("[user] finishes eating the [name].") + qdel(src) + return TRUE + return ..() + +// Set the clothing's integrity back to 100%, remove all damage to bodyparts, and generally fix it up +/obj/item/clothing/repair(mob/user, params) + .=..() + last_bites = 3 + diff --git a/modular_splurt/code/modules/clothing/glasses/_glasses.dm b/modular_splurt/code/modules/clothing/glasses/_glasses.dm index 6e356a528a..04d23745dc 100644 --- a/modular_splurt/code/modules/clothing/glasses/_glasses.dm +++ b/modular_splurt/code/modules/clothing/glasses/_glasses.dm @@ -1,6 +1,6 @@ /obj/item/clothing/glasses/aviators name = "aviators" - desc = "Strangely fasionable ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks flashes." + desc = "Strangely fashionable ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks flashes." icon = 'modular_splurt/icons/obj/clothing/glasses.dmi' icon_state = "aviator" mob_overlay_icon = 'modular_splurt/icons/mobs/eyes.dmi' @@ -8,3 +8,9 @@ flash_protect = 1 tint = 1 glass_colour_type = /datum/client_colour/glass_colour/gray + +/obj/item/clothing/glasses/eyepatch + is_edible = 1 + +/obj/item/clothing/glasses/sunglasses/blindfold + is_edible = 1 diff --git a/modular_splurt/code/modules/clothing/glasses/hud.dm b/modular_splurt/code/modules/clothing/glasses/hud.dm index 15cbf475b7..e6df06cf4a 100644 --- a/modular_splurt/code/modules/clothing/glasses/hud.dm +++ b/modular_splurt/code/modules/clothing/glasses/hud.dm @@ -2,7 +2,7 @@ /obj/item/clothing/glasses/hud/blueshield name = "blueshield HUD glasses" - desc = "A hud with multiple functions." + desc = "A HUD with multiple functions." actions_types = list(/datum/action/item_action/switch_hud) icon_state = "sunhudmed" icon = 'icons/obj/clothing/glasses.dmi' @@ -36,7 +36,7 @@ /obj/item/clothing/glasses/hud/blueshield/aviators name = "blueshield HUD Aviators" - desc = "A hud with multiple functions. More stylish." + desc = "A HUD with multiple functions. More stylish." actions_types = list(/datum/action/item_action/switch_hud) icon = 'modular_splurt/icons/obj/clothing/glasses.dmi' icon_state = "aviator_med" @@ -72,12 +72,12 @@ /obj/item/clothing/glasses/hud/blueshield/aviators/prescription name = "prescription blueshield HUD Aviators" - desc = "A hud with multiple functions. More stylish. Equipped with prescription lenses." + desc = "A HUD with multiple functions. More stylish. Equipped with prescription lenses." vision_correction = 1 /obj/item/clothing/glasses/hud/blueshield/prescription name = "prescription blueshield HUD" - desc = "A hud with multiple functions. Equipped with prescription lenses." + desc = "A HUD with multiple functions. Equipped with prescription lenses." vision_correction = 1 // Med HUDs @@ -97,14 +97,14 @@ // Sec HUDs /obj/item/clothing/glasses/hud/security/sunglasses/aviators - name = "secuirity HUD aviators" + name = "security HUD aviators" desc = "aviators with a security HUD." icon = 'modular_splurt/icons/obj/clothing/glasses.dmi' icon_state = "aviator_sec" mob_overlay_icon = 'modular_splurt/icons/mobs/eyes.dmi' /obj/item/clothing/glasses/hud/security/sunglasses/aviators/prescription - name = "prescription secuirity HUD aviators" + name = "prescription security HUD aviators" desc = "aviators with a security HUD with prescription lenses." vision_correction = 1 diff --git a/modular_splurt/code/modules/clothing/gloves.dm b/modular_splurt/code/modules/clothing/gloves.dm index cd62afea1b..74af3a9f02 100644 --- a/modular_splurt/code/modules/clothing/gloves.dm +++ b/modular_splurt/code/modules/clothing/gloves.dm @@ -1,6 +1,6 @@ /obj/item/clothing/gloves/cbrn name = "CBRN gloves" - desc = "Chemical, Biological, Radiological and Nuclear. Thick black gloves design for working in hazardus evniroments. Warning not shock proof." + desc = "Chemical, Biological, Radiological and Nuclear. Thick black gloves design for working in hazardous environments. Warning not shock proof." icon_state = "black" item_state = "blackgloves" siemens_coefficient = 1 @@ -14,21 +14,22 @@ rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE armor = list("melee" = 5, "bullet" = 0, "laser" = 5,"energy" = 5, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 40, "acid" = 100) strip_mod = 1.5 + is_edible = 0 /obj/item/clothing/gloves/cbrn/engineer name = "engineer CBRN gloves" siemens_coefficient = 0 - desc = "Chemical, Biological, Radiological and Nuclear. Thick black gloves design for working in hazardus evniroments. Improved for engineering hazards" + desc = "Chemical, Biological, Radiological and Nuclear. Thick black gloves design for working in hazardous environments. Improved for engineering hazards" /obj/item/clothing/gloves/cbrn/mopp name = "MOPP gloves" - desc = "Mission Oriented Protective Posture. Thick black gloves design for working in hazardus combat evniroments. Still not shock proof" + desc = "Mission Oriented Protective Posture. Thick black gloves design for working in hazardous combat environments. Still not shock proof" icon_state = "combat" armor = list("melee" = 10, "bullet" = 0, "laser" = 10,"energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 40, "acid" = 100) /obj/item/clothing/gloves/cbrn/mopp/advance name = "advance MOPP gloves" - desc = "Mission Oriented Protective Posture. Thick black gloves design for working in hazardus combat evniroments. Advance varaints for Central Command staff and ERT team. Insulated." + desc = "Mission Oriented Protective Posture. Thick black gloves design for working in hazardous combat environments. Advance variants for Central Command staff and ERT team. Insulated." icon_state = "combat" siemens_coefficient = 0 armor = list("melee" = 15, "bullet" = 0, "laser" = 15,"energy" = 15, "bomb" = 20, "bio" = 110, "rad" = 110, "fire" = 60, "acid" = 110) diff --git a/modular_splurt/code/modules/clothing/gloves/_gloves.dm b/modular_splurt/code/modules/clothing/gloves/_gloves.dm new file mode 100644 index 0000000000..22f54d4075 --- /dev/null +++ b/modular_splurt/code/modules/clothing/gloves/_gloves.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/gloves + is_edible = 1 diff --git a/modular_splurt/code/modules/clothing/head/_head.dm b/modular_splurt/code/modules/clothing/head/_head.dm new file mode 100644 index 0000000000..281c24b862 --- /dev/null +++ b/modular_splurt/code/modules/clothing/head/_head.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/head + is_edible = 1 //Helment and Hardhats + some Special misc are unedible diff --git a/modular_splurt/code/modules/clothing/head/hardhat.dm b/modular_splurt/code/modules/clothing/head/hardhat.dm new file mode 100644 index 0000000000..24c83f606d --- /dev/null +++ b/modular_splurt/code/modules/clothing/head/hardhat.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/head/hardhat + is_edible = 0 diff --git a/modular_splurt/code/modules/clothing/head/helmet.dm b/modular_splurt/code/modules/clothing/head/helmet.dm index f15a9368df..aaad3a6243 100644 --- a/modular_splurt/code/modules/clothing/head/helmet.dm +++ b/modular_splurt/code/modules/clothing/head/helmet.dm @@ -1,4 +1,7 @@ // GWTB-inspired stuff wooo +/obj/item/clothing/head/helmet + is_edible = 0 + /obj/item/clothing/head/helmet/goner name = "trencher helmet" desc = "A No Man's Land-type helmet with purple paint applied." @@ -15,7 +18,7 @@ /obj/item/clothing/head/helmet/goner/fake/poly name = "polychromic trencher helmet" - desc = "A plastic helmet with polychromatic spot." + desc = "A plastic helmet with polychromic spot." var/list/poly_colors = list("#D9D9D9") /obj/item/clothing/head/helmet/goner/fake/poly/ComponentInitialize() @@ -56,7 +59,7 @@ /obj/item/clothing/head/helmet/goner/officer/fake/poly name = "polychromic trencher officer cap" - desc = "A cheap officer cap with polychromatic pin." + desc = "A cheap officer cap with polychromic pin." var/list/poly_colors = list("#F2F2F2") /obj/item/clothing/head/helmet/goner/officer/fake/poly/ComponentInitialize() diff --git a/modular_splurt/code/modules/clothing/head/jobs.dm b/modular_splurt/code/modules/clothing/head/jobs.dm index cf5bc553b4..e989e5bc2d 100644 --- a/modular_splurt/code/modules/clothing/head/jobs.dm +++ b/modular_splurt/code/modules/clothing/head/jobs.dm @@ -15,7 +15,7 @@ /obj/item/clothing/head/blueshield/formal name = "blueshield formal beret" - desc = "The robust beret for the Blueshield. A formal varaint of the standard beret." + desc = "The robust beret for the Blueshield. A formal variant of the standard beret." icon_state = "blueshield" item_state = "blueshield" icon = 'modular_splurt/icons/obj/clothing/head.dmi' @@ -31,7 +31,7 @@ /obj/item/clothing/head/beret/sec/peacekeeper name = "peacekeeper beret" - desc = "A robust beret with a grey varaint of the security insignia emblazoned on it. This one is modeled is design to make people less scared of an officer." + desc = "A robust beret with a grey variant of the security insignia emblazoned on it. This one is modeled is design to make people less scared of an officer." icon_state = "policeberet" item_state = "policeberet" icon = 'modular_splurt/icons/obj/clothing/head.dmi' @@ -39,7 +39,7 @@ /obj/item/clothing/head/helmet/metrocop name = "civil protection helmet" - desc = "Saldy lacks a working voice encoder." + desc = "Sadly lacks a working voice encoder." icon_state = "metrocop_helmet" item_state = "metrocop_helmet" icon = 'modular_splurt/icons/obj/clothing/head.dmi' @@ -49,13 +49,13 @@ /obj/item/clothing/head/beret/sec/peacekeeper/warden name = "warden's peacekeeper beret" - desc = "A robust beret with a red varaint of the security insignia emblazoned on it. This one is issiued to wardens." + desc = "A robust beret with a red variant of the security insignia emblazoned on it. This one is issued to wardens." icon_state = "policeberetred" item_state = "policeberetred" /obj/item/clothing/head/beret/sec/peacekeeper/hos name = "head of security's peacekeeper beret" - desc = "A robust beret with a gold varaint of the security insignia emblazoned on it. This one is issiued to the Head of Security." + desc = "A robust beret with a gold variant of the security insignia emblazoned on it. This one is issued to the Head of Security." icon_state = "policeberetgold" item_state = "policeberetgold" diff --git a/modular_splurt/code/modules/clothing/head/misc.dm b/modular_splurt/code/modules/clothing/head/misc.dm index 6c5164be1e..eb14ad475d 100644 --- a/modular_splurt/code/modules/clothing/head/misc.dm +++ b/modular_splurt/code/modules/clothing/head/misc.dm @@ -26,7 +26,7 @@ name = "press helmet" icon_state = "press_helmet" item_state = "press_helmet" - desc = "A lightweight helmet for reporting on security. You swear up and down it is made of kevlar and not old cloth and plastic." + desc = "A lightweight helmet for reporting on security. You swear up and down it is made of Kevlar and not old cloth and plastic." icon = 'modular_splurt/icons/obj/clothing/head.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/head.dmi' flags_inv = HIDEHAIR @@ -51,6 +51,7 @@ flags_inv = HIDEHAIR|HIDEEARS resistance_flags = ACID_PROOF rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE + is_edible = 0 /obj/item/clothing/head/helmet/cbrn/mopp name = "MOPP hood" @@ -59,6 +60,7 @@ item_state = "mopphood" can_flashlight = 1 armor = list("melee" = 40, "bullet" = 30, "laser" = 30,"energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 40, "acid" = 100) + is_edible = 0 /obj/item/clothing/head/helmet/cbrn/mopp/advance name = "advance MOPP hood" @@ -66,6 +68,7 @@ can_flashlight = 1 armor = list("melee" = 50, "bullet" = 40, "laser" = 40,"energy" = 20, "bomb" = 35, "bio" = 110, "rad" = 110, "fire" = 50, "acid" = 110) clothing_flags = NONE + is_edible = 0 // research nods @@ -81,7 +84,7 @@ /datum/design/cbrn/mopphood name = "MOPP Hood" - desc = "A MOPP hood with an intergreted helmet" + desc = "A MOPP hood with an integrated helmet" id = "mopp_hood" build_type = PROTOLATHE materials = list(/datum/material/plastic = 200, /datum/material/uranium = 50, /datum/material/iron = 200) diff --git a/modular_splurt/code/modules/clothing/head/misc_special.dm b/modular_splurt/code/modules/clothing/head/misc_special.dm new file mode 100644 index 0000000000..9a86ddcb53 --- /dev/null +++ b/modular_splurt/code/modules/clothing/head/misc_special.dm @@ -0,0 +1,5 @@ +/obj/item/clothing/head/welding + is_edible = 0 + +/obj/item/clothing/head/hardhat/cakehat + is_edible = 1 diff --git a/modular_splurt/code/modules/clothing/kinkyclothes.dm b/modular_splurt/code/modules/clothing/kinkyclothes.dm index 98bbb21e4a..a2bcaee4f6 100644 --- a/modular_splurt/code/modules/clothing/kinkyclothes.dm +++ b/modular_splurt/code/modules/clothing/kinkyclothes.dm @@ -67,8 +67,8 @@ mutantrace_variation = NONE /obj/item/clothing/under/centcomdress - name = "Centcom Dress Uniform" - desc = "A stylish yet revealing dress uniform worn in extravagent black and gold, worthy of those who sit around and watch cameras all day in an office." + name = "CentCom Dress Uniform" + desc = "A stylish yet revealing dress uniform worn in extravagant black and gold, worthy of those who sit around and watch cameras all day in an office." icon = 'modular_splurt/icons/obj/clothing/suits.dmi' icon_state = "ccdress" mob_overlay_icon = 'modular_splurt/icons/mobs/suits.dmi' @@ -83,7 +83,7 @@ armor = list("melee" = 60, "bullet" = 80, "laser" = 80, "energy" = 90, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) /obj/item/clothing/under/centcomdress/vk - name = "Virginkiller Centcom Dress Uniform" + name = "Virginkiller CentCom Dress Uniform" desc = "This black and gold beauty does not help paperwork get done, it seems." icon_state = "ccdressvk" diff --git a/modular_splurt/code/modules/clothing/lewd_clothing/collar/kink_collars.dm b/modular_splurt/code/modules/clothing/lewd_clothing/collar/kink_collars.dm index d170e12dba..10e4c4ea6a 100644 --- a/modular_splurt/code/modules/clothing/lewd_clothing/collar/kink_collars.dm +++ b/modular_splurt/code/modules/clothing/lewd_clothing/collar/kink_collars.dm @@ -19,7 +19,7 @@ /obj/item/mind_controller/Initialize(mapload, collar) //Store the collar on creation. src.collar = collar - . = ..() //very important to call parent in Intialize + . = ..() //very important to call parent in Initialize /obj/item/mind_controller/attack_self(mob/user) if (collar) diff --git a/modular_splurt/code/modules/clothing/lewd_clothing/eyes/hypnogoggles.dm b/modular_splurt/code/modules/clothing/lewd_clothing/eyes/hypnogoggles.dm index 35f2b71b0b..9bc3ef1d7d 100644 --- a/modular_splurt/code/modules/clothing/lewd_clothing/eyes/hypnogoggles.dm +++ b/modular_splurt/code/modules/clothing/lewd_clothing/eyes/hypnogoggles.dm @@ -38,7 +38,7 @@ if(victim.glasses == src) victim.cure_trauma_type(/datum/brain_trauma/induced_hypnosis, TRAUMA_RESILIENCE_BASIC) -/obj/item/clothing/glasses/hypno/attack_self(mob/user) //Setting up hypnotising phrase +/obj/item/clothing/glasses/hypno/attack_self(mob/user) //Setting up hypnotizing phrase . = ..() codephrase = stripped_input(user, "Change the hypnotic phrase") // Notice to the user that this shouldn't be used outside of kink related purpose. @@ -114,7 +114,7 @@ /datum/brain_trauma/induced_hypnosis/on_gain() log_game("[key_name(owner)] was hypnogoggled'.") - to_chat(owner, "[hypnotic_phrase]") + to_chat(owner, span_reallybig_hypnophrase("[hypnotic_phrase]")) to_chat(owner, span_notice(pick("You feel your thoughts focusing on this phrase... you can't seem to get it out of your head.", "Your head hurts, but this is all you can think of. It must be vitally important.", "You feel a part of your mind repeating this over and over. You need to follow these words.", diff --git a/modular_splurt/code/modules/clothing/lewd_clothing/foot/lewd_shoes.dm b/modular_splurt/code/modules/clothing/lewd_clothing/foot/lewd_shoes.dm index 061a1c85b6..718c3d2974 100644 --- a/modular_splurt/code/modules/clothing/lewd_clothing/foot/lewd_shoes.dm +++ b/modular_splurt/code/modules/clothing/lewd_clothing/foot/lewd_shoes.dm @@ -19,7 +19,7 @@ var/mob/living/carbon/C = user if(iscarbon(user) && (user.get_item_by_slot(ITEM_SLOT_FEET) == src)) if(seamless) - to_chat(C, span_purple(pick("You slide your heels against eachother in a failed attempt at kicking them off.", + to_chat(C, span_purple(pick("You slide your heels against each other in a failed attempt at kicking them off.", "The heels refuse to budge no matter how much you tug.", "The heels are tight around your ankles and the laces refuse to loosen."))) return diff --git a/modular_splurt/code/modules/clothing/lewd_clothing/head/deprivation_helmet.dm b/modular_splurt/code/modules/clothing/lewd_clothing/head/deprivation_helmet.dm index 8dd3ca8717..4376d2c773 100644 --- a/modular_splurt/code/modules/clothing/lewd_clothing/head/deprivation_helmet.dm +++ b/modular_splurt/code/modules/clothing/lewd_clothing/head/deprivation_helmet.dm @@ -6,7 +6,7 @@ /obj/item/clothing/head/helmet/space/deprivation_helmet name = "deprivation helmet" - desc = "Сompletely cuts off the wearer from the outside world." + desc = "Completely cuts off the wearer from the outside world." icon_state = "dephelmet" item_state = "dephelmet" armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 25, "rad" = 0, "fire" = 20, "acid" = 15, "wound" = 0) diff --git a/modular_splurt/code/modules/clothing/lewd_clothing/head/hats.dm b/modular_splurt/code/modules/clothing/lewd_clothing/head/hats.dm index 5adac22edd..c44d4781f4 100644 --- a/modular_splurt/code/modules/clothing/lewd_clothing/head/hats.dm +++ b/modular_splurt/code/modules/clothing/lewd_clothing/head/hats.dm @@ -23,7 +23,7 @@ /obj/item/clothing/head/blueshield/officercap name = "blueshield officer cap" - desc = "A officer cap of the Blueshield. It makes you feel more important then you acutally are." + desc = "A officer cap of the Blueshield. It makes you feel more important then you actually are." icon_state = "blueshieldcap" item_state = "blueshieldcap" @@ -56,7 +56,7 @@ /obj/item/clothing/head/helmet/sec/blueshield name = "blueshield helmet" - desc = "Reenforced Blueshield Security gear. Protects the head from impacts. You where this because you are boring." + desc = "Reinforced Blueshield Security gear. Protects the head from impacts. You where this because you are boring." icon_state = "bluehelmet" item_state = "bluehelmet" icon = 'modular_splurt/icons/obj/clothing/head.dmi' diff --git a/modular_splurt/code/modules/clothing/masks/_mask.dm b/modular_splurt/code/modules/clothing/masks/_mask.dm new file mode 100644 index 0000000000..d5f6e0f180 --- /dev/null +++ b/modular_splurt/code/modules/clothing/masks/_mask.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/mask + is_edible = 1 diff --git a/modular_splurt/code/modules/clothing/masks/boxing.dm b/modular_splurt/code/modules/clothing/masks/boxing.dm new file mode 100644 index 0000000000..89015338f3 --- /dev/null +++ b/modular_splurt/code/modules/clothing/masks/boxing.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/mask/infiltrator + is_edible = 0 diff --git a/modular_splurt/code/modules/clothing/masks/gasmask.dm b/modular_splurt/code/modules/clothing/masks/gasmask.dm index 460d695571..7d7066ab86 100644 --- a/modular_splurt/code/modules/clothing/masks/gasmask.dm +++ b/modular_splurt/code/modules/clothing/masks/gasmask.dm @@ -1,6 +1,9 @@ +/obj/item/clothing/mask/gas + is_edible = 0 + /obj/item/clothing/mask/gas/radmask name = "radiation mask" - desc = "An mask that somewhat protects the user from ratiation. Not as effective like a radiation hood, but is better than nothing." + desc = "An mask that somewhat protects the user from radiation. Not as effective like a radiation hood, but is better than nothing." icon = 'modular_splurt/icons/obj/clothing/masks.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/mask.dmi' anthro_mob_worn_overlay = 'modular_splurt/icons/mob/clothing/mask_muzzle.dmi' diff --git a/modular_splurt/code/modules/clothing/masks/hailer.dm b/modular_splurt/code/modules/clothing/masks/hailer.dm index d1edb5c00b..2f32917196 100644 --- a/modular_splurt/code/modules/clothing/masks/hailer.dm +++ b/modular_splurt/code/modules/clothing/masks/hailer.dm @@ -15,6 +15,6 @@ if(iscarbon(user)) var/mob/living/carbon/C = user if(src == C.wear_mask) - to_chat(user, "The mask is fastened tight! You'll need help taking this off!") + to_chat(user, span_warning("The mask is fastened tight! You'll need help taking this off!")) return ..() diff --git a/modular_splurt/code/modules/clothing/masks/miscellaneous.dm b/modular_splurt/code/modules/clothing/masks/miscellaneous.dm index b253001735..865d5633ea 100644 --- a/modular_splurt/code/modules/clothing/masks/miscellaneous.dm +++ b/modular_splurt/code/modules/clothing/masks/miscellaneous.dm @@ -3,7 +3,7 @@ if(iscarbon(user)) var/mob/living/carbon/C = user if(src == C.wear_mask) - to_chat(user, "You need help taking this off!") + to_chat(user, span_warning("You need help taking this off!")) return ..() @@ -20,7 +20,7 @@ /obj/item/clothing/mask/gas/cbrn name = "CBRN gas mask" - desc = "Chemical, Biological, Radiological and Nuclear. A heavy duty gas mask design to be worn in hazardus enviorments. Acutally works like a gas mask as well as can be connected to intenral air supply." + desc = "Chemical, Biological, Radiological and Nuclear. A heavy duty gas mask design to be worn in hazardous environments. Actually works like a gas mask as well as can be connected to internal air supply." item_state = "gas_cbrn" icon_state = "gas_cbrn" icon = 'modular_splurt/icons/obj/clothing/masks.dmi' @@ -35,17 +35,18 @@ visor_flags_inv = 0 flavor_adjust = FALSE armor = list("melee" = 5, "bullet" = 0, "laser" = 5,"energy" = 5, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 40, "acid" = 100) + is_edible = 0 /obj/item/clothing/mask/gas/cbrn/mopp name = "MOPP gas mask" - desc = "Mission Oriented Protective Posture. A heavy duty gas mask design to be worn in hazardus combat enviorments. Acutally works like a gas mask as well as can be connected to intenral air supply." + desc = "Mission Oriented Protective Posture. A heavy duty gas mask design to be worn in hazardous combat environments. Actually works like a gas mask as well as can be connected to internal air supply." item_state = "gas_mopp" icon_state = "gas_mopp" armor = list("melee" = 10, "bullet" = 5, "laser" = 10,"energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 40, "acid" = 100) /obj/item/clothing/mask/gas/cbrn/mopp/advance name = "advance MOPP gas mask" - desc = "Mission Oriented Protective Posture. A heavy duty gas mask design to be worn in hazardus combat enviorments. Acutally works like a gas mask as well as can be connected to intenral air supply. Used by Centcom Staff and ERT teams." + desc = "Mission Oriented Protective Posture. A heavy duty gas mask design to be worn in hazardous combat environments. Actually works like a gas mask as well as can be connected to internal air supply. Used by CentCom Staff and ERT teams." armor = list("melee" = 20, "bullet" = 10, "laser" = 20,"energy" = 20, "bomb" = 20, "bio" = 110, "rad" = 110, "fire" = 50, "acid" = 110) //broken huds for loot @@ -77,7 +78,7 @@ /obj/item/clothing/glasses/brokenhud/health/night name = "broken night vision health scanner HUD" - desc = "An advanced medical heads-up display that allows doctors to find patients in complete darkness. However the eletronics seem to no longer work" + desc = "An advanced medical heads-up display that allows doctors to find patients in complete darkness. However the electronics seem to no longer work" icon_state = "healthhudnight" item_state = "glasses" glass_colour_type = /datum/client_colour/glass_colour/green diff --git a/modular_splurt/code/modules/clothing/neck/_neck.dm b/modular_splurt/code/modules/clothing/neck/_neck.dm index f17afa4e9f..40ae719af7 100644 --- a/modular_splurt/code/modules/clothing/neck/_neck.dm +++ b/modular_splurt/code/modules/clothing/neck/_neck.dm @@ -1,9 +1,16 @@ +/obj/item/clothing/neck + is_edible = 1 + +/obj/item/clothing/neck/stethoscope + is_edible = 2 + /obj/item/clothing/neck/petcollar/locked/security name = "security collar" desc = "For when you need to show everyone who your pet belongs to." icon = 'modular_splurt/icons/obj/clothing/neck.dmi' icon_state = "seccollar" poly_states = 0 + is_edible = 0 /obj/item/clothing/neck/petcollar/spike name = "Spiked Pet Collar" @@ -12,6 +19,7 @@ mob_overlay_icon = 'modular_splurt/icons/mob/clothing/neck.dmi' icon_state = "collar_spik" poly_states = 0 + is_edible = 0 /obj/item/clothing/neck/petcollar/locked/spike name = "Spiked Pet Collar" @@ -36,6 +44,7 @@ mob_overlay_icon = 'modular_splurt/icons/mob/clothing/neck.dmi' icon_state = "collar_holo" poly_states = 0 + is_edible = 0 /obj/item/clothing/neck/petcollar/casino name = "Casino Collar" @@ -52,6 +61,7 @@ mob_overlay_icon = 'modular_splurt/icons/mob/clothing/neck.dmi' icon_state = "casinoslave_available" poly_states = 0 + is_edible = 0 /obj/item/clothing/neck/petcollar/locked/casino/attackby(obj/item/K, mob/user, params) . = ..() diff --git a/modular_splurt/code/modules/clothing/shoes/_shoes.dm b/modular_splurt/code/modules/clothing/shoes/_shoes.dm new file mode 100644 index 0000000000..bc1fb9812f --- /dev/null +++ b/modular_splurt/code/modules/clothing/shoes/_shoes.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/shoes + is_edible = 1 diff --git a/modular_splurt/code/modules/clothing/shoes/magboots.dm b/modular_splurt/code/modules/clothing/shoes/magboots.dm new file mode 100644 index 0000000000..b3c8d6dff8 --- /dev/null +++ b/modular_splurt/code/modules/clothing/shoes/magboots.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/shoes/magboots + is_edible = 0 diff --git a/modular_splurt/code/modules/clothing/shoes/miscellaneous.dm b/modular_splurt/code/modules/clothing/shoes/miscellaneous.dm index 80e04717e6..f5a8fac735 100644 --- a/modular_splurt/code/modules/clothing/shoes/miscellaneous.dm +++ b/modular_splurt/code/modules/clothing/shoes/miscellaneous.dm @@ -35,7 +35,7 @@ /obj/item/clothing/shoes/workboots/toeless name = "toe-less workboots" - desc = "A pair of toeless work boots designed for use in industrial settings. Modified for species whose toes have claws." + desc = "A pair of toe-less work boots designed for use in industrial settings. Modified for species whose toes have claws." icon = 'modular_splurt/icons/obj/clothing/shoes.dmi' icon_state = "workboots-toeless" mob_overlay_icon = 'modular_splurt/icons/mob/clothing/shoes.dmi' @@ -43,7 +43,7 @@ /obj/item/clothing/shoes/jackboots/cbrn name = "CBRN boots" - desc = "Chemical, Biological, Radiological and Nuclear. Thick black boots design for working in hazardus evniroments." + desc = "Chemical, Biological, Radiological and Nuclear. Thick black boots design for working in hazardous environments." icon = 'modular_splurt/icons/obj/clothing/shoes.dmi' icon_state = "cbrnboots" mob_overlay_icon = 'modular_splurt/icons/mob/clothing/shoes.dmi' @@ -51,15 +51,16 @@ resistance_flags = ACID_PROOF rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE armor = list("melee" = 5, "bullet" = 0, "laser" = 5,"energy" = 5, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 40, "acid" = 100) + is_edible = 0 /obj/item/clothing/shoes/jackboots/cbrn/mopp name = "MOPP boots" - desc = "Mission Oriented Protective Posture. Thick black boots design for working in hazardus combat evniroments." + desc = "Mission Oriented Protective Posture. Thick black boots design for working in hazardous combat environments." armor = list("melee" = 10, "bullet" = 0, "laser" = 10,"energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 40, "acid" = 100) /obj/item/clothing/shoes/jackboots/cbrn/mopp/advance name = "advance MOPP boots" - desc = "Mission Oriented Protective Posture. Thick black boots design for working in hazardus combat evniroments. Used by Centcom Officer and ERT staff." + desc = "Mission Oriented Protective Posture. Thick black boots design for working in hazardous combat environments. Used by CentCom Officer and ERT staff." armor = list("melee" = 10, "bullet" = 0, "laser" = 10,"energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 40, "acid" = 100) clothing_flags = NOSLIP diff --git a/modular_splurt/code/modules/clothing/sizeaccessories.dm b/modular_splurt/code/modules/clothing/sizeaccessories.dm index 2161ee92ba..4fefb9e277 100644 --- a/modular_splurt/code/modules/clothing/sizeaccessories.dm +++ b/modular_splurt/code/modules/clothing/sizeaccessories.dm @@ -18,7 +18,7 @@ return ..() if(user.GetComponent(/datum/component/size_normalized)) - to_chat(user, "\The [src] buzzes, being overwritten by another accessory.") + to_chat(user, span_warning("\The [src] buzzes, being overwritten by another accessory.")) playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) else user.AddComponent(/datum/component/size_normalized, wear=src) @@ -44,7 +44,7 @@ return ..() if(user.GetComponent(/datum/component/size_normalized)) - to_chat(user, "\The [src] buzzes, being overwritten by another accessory.") + to_chat(user, span_warning("\The [src] buzzes, being overwritten by another accessory.")) playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) else user.AddComponent(/datum/component/size_normalized, wear=src) @@ -72,7 +72,7 @@ return ..() if(user.GetComponent(/datum/component/size_normalized)) - to_chat(user, "\The [src] buzzes, being overwritten by another accessory.") + to_chat(user, span_warning("\The [src] buzzes, being overwritten by another accessory.")) playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) else user.AddComponent(/datum/component/size_normalized, wear=src) diff --git a/modular_splurt/code/modules/clothing/spacesuits/hardsuit.dm b/modular_splurt/code/modules/clothing/spacesuits/hardsuit.dm index daebd17455..d56d5a7e45 100644 --- a/modular_splurt/code/modules/clothing/spacesuits/hardsuit.dm +++ b/modular_splurt/code/modules/clothing/spacesuits/hardsuit.dm @@ -22,7 +22,7 @@ //Own stuff /obj/item/clothing/head/helmet/space/hardsuit/rd/hev name = "HEV Suit helmet" - desc = "A Hazardous Environment Helmet. It fits snug over the suit and has a heads-up display for researchers. The flashlight seems broken, fitting considering this was made before the start of the milennium." + desc = "A Hazardous Environment Helmet. It fits snug over the suit and has a heads-up display for researchers. The flashlight seems broken, fitting considering this was made before the start of the millennium." icon = 'modular_splurt/icons/obj/clothing/hats.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/head.dmi' anthro_mob_worn_overlay = 'modular_splurt/icons/mob/clothing/head_muzzled.dmi' @@ -38,7 +38,7 @@ /obj/item/clothing/suit/space/hardsuit/rd/hev name = "HEV Suit" - desc = "The hazard suit. It was designed to protect scientists from the blunt trauma, radiation, energy discharge that hazardous materials might produce or entail. Fits you like a glove. The automatic medical system seems broken... They're waiting for you, Gordon. In the test chamberrrrrr." + desc = "The hazard suit. It was designed to protect scientists from the blunt trauma, radiation, energy discharge that hazardous materials might produce or entail. Fits you like a glove. The automatic medical system seems broken... They're waiting for you, Gordon. In the test chamber." icon = 'modular_splurt/icons/obj/clothing/suits.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi' anthro_mob_worn_overlay = 'modular_splurt/icons/mob/clothing/suit_digi.dmi' @@ -157,9 +157,9 @@ var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread sparks.set_up(1, 1, src) sparks.start() - owner.visible_message("The tesla capacitors on [owner]'s Tesla Power Armor are still recharging! The armor merely emits some sparks.") + owner.visible_message(span_danger("The tesla capacitors on [owner]'s Tesla Power Armor are still recharging! The armor merely emits some sparks.")) return - owner.visible_message("[src] blocks [attack_text], sending out arcs of lightning!") + owner.visible_message(span_danger("[src] blocks [attack_text], sending out arcs of lightning!")) if(!legacy) tesla_zap(owner, tesla_range, tesla_power, tesla_flags) else diff --git a/modular_splurt/code/modules/clothing/suits/armor.dm b/modular_splurt/code/modules/clothing/suits/armor.dm index 78e49153e2..c4e52bc605 100644 --- a/modular_splurt/code/modules/clothing/suits/armor.dm +++ b/modular_splurt/code/modules/clothing/suits/armor.dm @@ -2,7 +2,7 @@ name = "stripper armor" desc = "Talk about lightweight." icon = 'modular_splurt/icons/obj/clothing/suits.dmi' - mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi' //null I know you're reading this, you couldn't even edit the right file you absolute buffon + mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi' //null I know you're reading this, you couldn't even edit the right file you absolute buffoon mutantrace_variation = NONE icon_state = "armorstripper" item_state = "armorstripper" diff --git a/modular_splurt/code/modules/clothing/suits/cloaks.dm b/modular_splurt/code/modules/clothing/suits/cloaks.dm index 8de8a40071..bbbf127829 100644 --- a/modular_splurt/code/modules/clothing/suits/cloaks.dm +++ b/modular_splurt/code/modules/clothing/suits/cloaks.dm @@ -31,6 +31,7 @@ mob_overlay_icon = 'modular_splurt/icons/mob/clothing/neck.dmi' armor = list(MELEE = 35, BULLET = 40, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 20, RAD = 20, FIRE = 60, ACID = 60) body_parts_covered = CHEST|GROIN|ARMS + is_edible = 0 /obj/item/clothing/neck/cloak/binary name = "Binary cloak" diff --git a/modular_splurt/code/modules/clothing/suits/heavy.dm b/modular_splurt/code/modules/clothing/suits/heavy.dm index 435d890f44..4c6199b1ec 100644 --- a/modular_splurt/code/modules/clothing/suits/heavy.dm +++ b/modular_splurt/code/modules/clothing/suits/heavy.dm @@ -2,7 +2,7 @@ /obj/item/clothing/suit/cbrn name = "civilian CBRN suit" - desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has civilian colors" + desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has civilian colors." icon_state = "cbrnsuitciv" item_state = "cbrnsuitciv" icon = 'modular_splurt/icons/obj/clothing/suits.dmi' @@ -25,37 +25,37 @@ /obj/item/clothing/suit/cbrn/engineering name = "engineering CBRN suit" - desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has engineering colors" + desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has engineering colors." icon_state = "cbrnsuiteng" item_state = "cbrnsuiteng" /obj/item/clothing/suit/cbrn/security name = "engineering CBRN suit" - desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has security colors" + desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has security colors." icon_state = "cbrnsuitsec" item_state = "cbrnsuitsec" /obj/item/clothing/suit/cbrn/medical name = "medical CBRN suit" - desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has medical colors" + desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has medical colors." icon_state = "cbrnsuitmed" item_state = "cbrnsuitmed" /obj/item/clothing/suit/cbrn/cargo name = "cargo CBRN suit" - desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has cargo colors" + desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has cargo colors." icon_state = "cbrnsuitcargo" item_state = "cbrnsuitcargo" /obj/item/clothing/suit/cbrn/science name = "science CBRN suit" - desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has science colors" + desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has science colors." icon_state = "cbrnsuitsci" item_state = "cbrnsuitsci" /obj/item/clothing/suit/cbrn/service name = "service CBRN suit" - desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has service colors" + desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has service colors." icon_state = "cbrnsuitserv" item_state = "cbrnsuitserv" @@ -72,32 +72,32 @@ /obj/item/clothing/suit/cbrn/mopp/advance name = "advance MOPP suit" - desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance versoin for Non-ERT Central Command Staff." - slowdown = 0 // This is suppose to be advance, hopfully not too OP + desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance version for Non-ERT Central Command Staff." + slowdown = 0 // This is suppose to be advance, hopefully not too OP armor = list("melee" = 40, "bullet" = 60, "laser" = 40,"energy" = 30, "bomb" = 20, "bio" = 110, "rad" = 110, "fire" = 50, "acid" = 110) //Scale with standard MOPP suits as this effects all ERT suits clothing_flags = NONE /obj/item/clothing/suit/cbrn/mopp/advance/commander name = "advance MOPP suit 'Commander'" - desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance versoin for ERT Commanders." + desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance version for ERT Commanders." icon_state = "moppsuitertcom" item_state = "moppsuitertcom" /obj/item/clothing/suit/cbrn/mopp/advance/security name = "advance MOPP suit 'Security'" - desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance versoin for ERT Security members." + desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance version for ERT Security members." icon_state = "moppsuitertsec" item_state = "moppsuitertsec" /obj/item/clothing/suit/cbrn/mopp/advance/medical name = "advance MOPP suit 'Medical'" - desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance versoin for ERT Medical members." + desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance version for ERT Medical members." icon_state = "moppsuitertmed" item_state = "moppsuitertmed" /obj/item/clothing/suit/cbrn/mopp/advance/engi name = "advance MOPP suit 'Engineer'" - desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance versoin for ERT Engineering members." + desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance version for ERT Engineering members." icon_state = "moppsuiterteng" item_state = "moppsuiterteng" @@ -140,8 +140,8 @@ //research nods /datum/design/cbrn/cbrncivi - name = "Civlian CBRN Suit" - desc = "A civlian CBRN suit." + name = "Civilian CBRN Suit" + desc = "A civilian CBRN suit." id = "cbrn_civi" build_type = PROTOLATHE materials = list(/datum/material/plastic = 600, /datum/material/uranium = 500, /datum/material/iron = 600) diff --git a/modular_splurt/code/modules/clothing/suits/jobs.dm b/modular_splurt/code/modules/clothing/suits/jobs.dm index b62195363b..831c54ec87 100644 --- a/modular_splurt/code/modules/clothing/suits/jobs.dm +++ b/modular_splurt/code/modules/clothing/suits/jobs.dm @@ -1,6 +1,6 @@ /obj/item/clothing/suit/det_suit/lanyard - name = "trenchcoat" - desc = "An 18th-century multi-purpose trenchcoat. This one has a lanyard around the neck." + name = "trench coat" + desc = "An 18th-century multi-purpose trench coat. This one has a lanyard around the neck." icon = 'modular_splurt/icons/obj/clothing/suits.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi' icon_state = "detective_lanyard" diff --git a/modular_splurt/code/modules/clothing/suits/miscellaneous.dm b/modular_splurt/code/modules/clothing/suits/miscellaneous.dm index 2d01bd9325..7a14c9ff14 100644 --- a/modular_splurt/code/modules/clothing/suits/miscellaneous.dm +++ b/modular_splurt/code/modules/clothing/suits/miscellaneous.dm @@ -115,7 +115,7 @@ item_state = "armor" body_parts_covered = CHEST|GROIN|LEGS|ARMS|FEET|HANDS hoodtype = /obj/item/clothing/head/hooded/corpus - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT //"Hide shoes" but digi shoes dont get hidden, too bad! + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT //"Hide shoes" but digi shoes don't get hidden, too bad! min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT mutantrace_variation = NONE //There is no need for a digi variant, it's a costume @@ -187,7 +187,7 @@ // GWTB-inspired stuff wooo /obj/item/clothing/suit/goner name = "trencher coat" - desc = "A generic trenchcoat of the boring wars. This one have purple, corporate insignias." + desc = "A generic trench coat of the boring wars. This one have purple, corporate insignias." icon = 'modular_splurt/icons/obj/clothing/suits.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi' anthro_mob_worn_overlay = 'modular_splurt/icons/mob/clothing/suit_digi.dmi' @@ -208,7 +208,7 @@ /obj/item/clothing/suit/goner/fake/poly name = "polychromic trencher coat" - desc = "A generic, drab olive trenchcoat with polychromatic spots." + desc = "A generic, drab olive trench coat with polychromic spots." var/list/poly_colors = list("#E6E6E6", "#D6D6D6", "#D6D6D6") /obj/item/clothing/suit/goner/fake/poly/ComponentInitialize() @@ -218,26 +218,26 @@ /obj/item/clothing/suit/goner/fake/poly/classic name = "classic trencher coat" icon_state = "goner_suit_classic" - desc = "A generic, grey coat with polychromatic spots." + desc = "A generic, grey coat with polychromic spots." /obj/item/clothing/suit/goner/red name = "red trencher coat" - desc = "A trenchcoat of the boring wars. This one have red insignias." + desc = "A trench coat of the boring wars. This one have red insignias." icon_state = "goner_suit_r" /obj/item/clothing/suit/goner/green name = "green trencher coat" - desc = "A trenchcoat of the boring wars. This one have green insignias." + desc = "A trench coat of the boring wars. This one have green insignias." icon_state = "goner_suit_g" /obj/item/clothing/suit/goner/blue name = "blue trencher coat" - desc = "A trenchcoat of the boring wars. This one have blue insignias." + desc = "A trench coat of the boring wars. This one have blue insignias." icon_state = "goner_suit_b" /obj/item/clothing/suit/goner/yellow name = "yellow trencher coat" - desc = "A trenchcoat of the boring wars. This one have yellow insignias." + desc = "A trench coat of the boring wars. This one have yellow insignias." icon_state = "goner_suit_y" /obj/item/clothing/suit/hooded/corpus/jp //It's him! John Prodman! diff --git a/modular_splurt/code/modules/clothing/suits/utility.dm b/modular_splurt/code/modules/clothing/suits/utility.dm new file mode 100644 index 0000000000..8f7077a3c4 --- /dev/null +++ b/modular_splurt/code/modules/clothing/suits/utility.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/head/radiation + is_edible = 0 diff --git a/modular_splurt/code/modules/clothing/suits/vest.dm b/modular_splurt/code/modules/clothing/suits/vest.dm index 1f406d49d0..20117298cf 100644 --- a/modular_splurt/code/modules/clothing/suits/vest.dm +++ b/modular_splurt/code/modules/clothing/suits/vest.dm @@ -11,14 +11,14 @@ /obj/item/clothing/suit/brigdoc/labcoat name = "brig physician lab coat" - desc = "A dark red labcoat for brig physicians." + desc = "A dark red lab coat for brig physicians." icon_state = "secmed_labcoat" item_state = "secmed_labcoat" - mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi' //its in a seperate file + mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi' //its in a separate file /obj/item/clothing/suit/brigdoc/armor name = "brig physician armored coat" - desc = "A dark red labcoat with armored vest for brig physicians. Used for hostile work enviroments." + desc = "A dark red lab coat with armored vest for brig physicians. Used for hostile work environments." icon_state = "secmed_armor" item_state = "secmed_armor" mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi' @@ -36,7 +36,7 @@ /obj/item/clothing/suit/armor/vest/bluesheid/coat name = "blueshield armored coat" - desc = "A fastional piece of armored style." + desc = "A fashionable piece of armored style." icon_state = "blueshieldcoat" item_state = "blueshieldcoat" @@ -62,7 +62,7 @@ /obj/item/clothing/suit/armor/vest/metrocop name = "civil protection armored vest" - desc = "You feel like this may not stop a scienctist armed with nothing but a crowbar." + desc = "You feel like this may not stop a scientist armed with nothing but a crowbar." icon_state = "metrocop_armor" item_state = "metrocop_armor" icon = 'modular_splurt/icons/obj/clothing/suits.dmi' @@ -70,7 +70,7 @@ dog_fashion = null /obj/item/clothing/suit/armor/vest/warden/peacekeeper - name = "warden's peacekeeper armored trenchcoat" + name = "warden's peacekeeper armored trench coat" desc = "A heavy trench coat with a armored vest sown into it. Used by the peace minded warden" icon_state = "peacekeeper_trench_warden" item_state = "peacekeeper_trench_warden" @@ -78,8 +78,8 @@ mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi' /obj/item/clothing/suit/armor/hos/peacekeeper - name = "head of secuirty's peacekeeper armored trenchcoat" - desc = "A heavy trench coat with a armored vest sown into it. Used by the peace minded head of secuirty" + name = "head of security's peacekeeper armored trench coat" + desc = "A heavy trench coat with a armored vest sown into it. Used by the peace minded head of security" icon_state = "peacekeeper_trench_hos" item_state = "peacekeeper_trench_hos" icon = 'modular_splurt/icons/obj/clothing/suits.dmi' diff --git a/modular_splurt/code/modules/clothing/under/_under.dm b/modular_splurt/code/modules/clothing/under/_under.dm index 5dedecd802..b9b28a778e 100644 --- a/modular_splurt/code/modules/clothing/under/_under.dm +++ b/modular_splurt/code/modules/clothing/under/_under.dm @@ -1,3 +1,11 @@ +/obj/item/clothing/under + is_edible = 1 //Most jumpsuits are made of cloth so this is a safe bet. + +/obj/item/clothing/under/Initialize(mapload) + . = ..() + if(!is_type_in_typecache(type, GLOB.skirt_peekable)) + LAZYSET(GLOB.skirt_peekable, type, TRUE) + /obj/item/clothing/under/Destroy() QDEL_LIST(attached_accessories) return ..() diff --git a/modular_splurt/code/modules/clothing/under/jobs/civilian/civilian.dm b/modular_splurt/code/modules/clothing/under/jobs/civilian/civilian.dm index 9b577874e6..2ab2219847 100644 --- a/modular_splurt/code/modules/clothing/under/jobs/civilian/civilian.dm +++ b/modular_splurt/code/modules/clothing/under/jobs/civilian/civilian.dm @@ -17,7 +17,7 @@ /obj/item/clothing/under/rank/civilian/lawyer/galaxy_blue name = "\improper De Void of Soul" - desc = "A suit of stars and high-V gas. One that screams the cosmos and unfathomnable vastness. Earned by only the best of the best." + desc = "A suit of stars and high-V gas. One that screams the cosmos and unfathomable vastness. Earned by only the best of the best." icon_state = "galaxy_blue" icon = 'modular_splurt/icons/obj/clothing/uniforms.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi' diff --git a/modular_splurt/code/modules/clothing/under/miscellaneous.dm b/modular_splurt/code/modules/clothing/under/miscellaneous.dm index dc4696af4e..3f6b806260 100644 --- a/modular_splurt/code/modules/clothing/under/miscellaneous.dm +++ b/modular_splurt/code/modules/clothing/under/miscellaneous.dm @@ -37,7 +37,7 @@ /obj/item/clothing/under/lumberjack name = "lumberjack outfit" - desc = "I am a lumberjack and I am ok, I sleep all night and I work all day." + desc = "I am a lumberjack and I am okay, I sleep all night and I work all day." icon = 'modular_splurt/icons/obj/clothing/uniforms.dmi' icon_state = "lumberjack" mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi' @@ -46,7 +46,7 @@ /obj/item/clothing/under/bunnysuit name = "bunny outfit" - desc = "A simple black bunnt outfit." + desc = "A simple black bunny outfit." icon = 'modular_splurt/icons/obj/clothing/uniforms.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi' icon_state = "bunnysuit" @@ -89,7 +89,7 @@ /obj/item/clothing/under/bunnysuit/white name = "white bunny outfit" - desc = "A simple white bunnt outfit." + desc = "A simple white bunny outfit." icon = 'modular_splurt/icons/obj/clothing/uniforms.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi' icon_state = "whitebunnysuit" @@ -194,7 +194,7 @@ /obj/item/clothing/head/helmet/space/plasmaman/security/blueshield name = "head of security's plasma envirosuit helmet" - desc = "A plasmaman containment helmet designed for the Bluesheidl, manacing black with blue stripes." + desc = "A plasmaman containment helmet designed for the Blueshield, menacing black with blue stripes." icon_state = "bs_envirohelm" item_state = "bs_envirohelm" icon = 'modular_splurt/icons/obj/clothing/head.dmi' @@ -203,7 +203,7 @@ /obj/item/clothing/under/rank/bridgeofficer name = "bridge officer outfit" - desc = "The uniform of a bridge officer. It makes you feel extremly importnant, even if you are not." + desc = "The uniform of a bridge officer. It makes you feel extremely important, even if you are not." icon = 'modular_splurt/icons/obj/clothing/uniforms.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi' icon_state = "bridgesec" @@ -225,7 +225,7 @@ /obj/item/clothing/under/rank/bridgeofficer/formal name = "bridge officer formal outfit" - desc = "The uniform of a bridge officer. Its a formal varaint." + desc = "The uniform of a bridge officer. Its a formal variant." icon = 'modular_splurt/icons/obj/clothing/uniforms.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi' icon_state = "bridgesecformal" @@ -281,7 +281,7 @@ /obj/item/clothing/under/goner/fake/poly name = "polychromic trencher uniform" - desc = "An utilitarian uniform with polychromatic spots." + desc = "An utilitarian uniform with polychromic spots." var/list/poly_colors = list("#E6E6E6") /obj/item/clothing/under/goner/fake/poly/ComponentInitialize() diff --git a/modular_splurt/code/modules/clothing/underwear/_underwear.dm b/modular_splurt/code/modules/clothing/underwear/_underwear.dm new file mode 100644 index 0000000000..045d1f8ce7 --- /dev/null +++ b/modular_splurt/code/modules/clothing/underwear/_underwear.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/underwear/ + is_edible = 1 diff --git a/modular_splurt/code/modules/events/crystalline_reentry.dm b/modular_splurt/code/modules/events/crystalline_reentry.dm index 97378c781a..02f8ff68ae 100644 --- a/modular_splurt/code/modules/events/crystalline_reentry.dm +++ b/modular_splurt/code/modules/events/crystalline_reentry.dm @@ -149,7 +149,7 @@ if(prob(10)) playsound(src, 'sound/effects/bang.ogg', 50, 1) - audible_message("You hear a BONK!") + audible_message(span_danger("You hear a BONK!")) if(clong && prob(25)) x = clong.x @@ -179,7 +179,7 @@ atmos_spawn_air("water_vapor=75;TEMP=0") //brr /obj/effect/crystalline_reentry/proc/penetrate(mob/living/L) - L.visible_message("[L] is smashed by a crystalline asteroid!" , "The crystalline asteroid smashes you!" , "You hear a BONK!") + L.visible_message(span_danger("[L] is smashed by a crystalline asteroid!") , span_userdanger("The crystalline asteroid smashes you!") , "You hear a BONK!") if(ishuman(L)) var/mob/living/carbon/human/H = L H.adjustBruteLoss(160) @@ -209,14 +209,14 @@ switch(rand(1,100)) if(1 to 30) var/obj/structure/spawner/crystalline/M = new(src.loc) - visible_message("A [M] emerges from the asteroid's rubble!") + visible_message(span_danger("A [M] emerges from the asteroid's rubble!")) if(prob(50) && tendrilnotify) priority_announce("Unknown organic entities have been detected in the vincinity of [station_name()]. General caution is advised.", "General Alert") if(31 to 99) visible_message("The asteroid collapses into nothing...") if(100) var/mob/living/simple_animal/bot/hugbot/M = new(src.loc) - visible_message("A [M] emerges from the asteroid's rubble! Wait... What?") + visible_message(span_danger("A [M] emerges from the asteroid's rubble! Wait... What?")) qdel(src) /obj/effect/crystalline_reentry/notendrilalert @@ -289,8 +289,8 @@ /obj/effect/cloud_collapse/Initialize() . = ..() emitted_light = new(loc) - visible_message("The tendril writhes in fury as the earth around it begins to crack and break apart! Get back!") - visible_message("Something falls free of the tendril!") + visible_message(span_boldannounce("The tendril writhes in fury as the earth around it begins to crack and break apart! Get back!")) + visible_message(span_warning("Something falls free of the tendril!")) playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, 0, 50, 1, 1) addtimer(CALLBACK(src, .proc/collapse), 50) @@ -302,7 +302,7 @@ for(var/mob/M in range(7,src)) shake_camera(M, 15, 1) playsound(get_turf(src),'sound/effects/explosionfar.ogg', 200, 1) - visible_message("The tendril falls into the clouds below!") + visible_message(span_boldannounce("The tendril falls into the clouds below!")) for(var/turf/T in range(1,src)) if(!T.density) T.TerraformTurf(/turf/open/chasm/cloud, /turf/open/chasm/cloud) diff --git a/modular_splurt/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/modular_splurt/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 253eb2d300..436ab349f3 100644 --- a/modular_splurt/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/modular_splurt/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -2,14 +2,12 @@ /obj/item/reagent_containers/food/drinks/bottle/bitters name = "Andromeda Bitters" desc = "An aromatic addition to any drink. Made in New Trinidad, now and forever." - icon = 'modular_splurt/icons/obj/drinks.dmi' icon_state = "bitters_bottle" list_reagents = list(/datum/reagent/consumable/ethanol/bitters = 30) /obj/item/reagent_containers/food/drinks/bottle/curacao name = "Beekhof Blauw Curaçao" desc = "Still produced on the island of Curaçao, after all these years." - icon = 'modular_splurt/icons/obj/drinks.dmi' icon_state = "curacao_bottle" volume = 100 list_reagents = list(/datum/reagent/consumable/ethanol/curacao = 100) @@ -17,7 +15,6 @@ /obj/item/reagent_containers/food/drinks/bottle/navy_rum name = "Pride of the Union Navy-Strength Rum" desc = "Ironically named, given it's made in Bermuda." - icon = 'modular_splurt/icons/obj/drinks.dmi' icon_state = "navy_rum_bottle" volume = 100 list_reagents = list(/datum/reagent/consumable/ethanol/navy_rum = 100) diff --git a/modular_splurt/code/modules/food_and_drinks/food/snacks_other.dm b/modular_splurt/code/modules/food_and_drinks/food/snacks_other.dm index d04a6eca55..7e15394479 100644 --- a/modular_splurt/code/modules/food_and_drinks/food/snacks_other.dm +++ b/modular_splurt/code/modules/food_and_drinks/food/snacks_other.dm @@ -15,7 +15,7 @@ cheeseoverlay.icon_state = "cheesed_snout" else cheeseoverlay.icon_state = "cheesed_human" - H.visible_message("[H] is cheesed by [src]!", "You've been cheesed by [src]!") + H.visible_message(span_warning("[H] is cheesed by [src]!"), span_userdanger("You've been cheesed by [src]!")) playsound(H, 'modular_splurt/sound/effects/slap.ogg') if(!H.is_mouth_covered()) reagents.trans_to(H, 15, log = "cheesed hit") //Cream pie combat diff --git a/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm b/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm index 87a11eee76..a587e9fc71 100644 --- a/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm +++ b/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm @@ -86,11 +86,12 @@ /datum/chemical_reaction/moth_in_chief name = "Moth in Chief" id = /datum/reagent/consumable/ethanol/moth_in_chief - results = list(/datum/reagent/consumable/ethanol/moth_in_chief = 3) + results = list(/datum/reagent/consumable/ethanol/moth_in_chief = 4) required_reagents = list( /datum/reagent/consumable/ethanol/commander_and_chief = 1, /datum/reagent/mutationtoxin/insect = 1, - /datum/reagent/drug/copium = 1 + /datum/reagent/drug/copium = 1, + /datum/reagent/medicine/stimulants = 1 ) @@ -116,7 +117,7 @@ /datum/chemical_reaction/long_john_silver name = "Long John Silver" - id = /datum/chemical_reaction/long_john_silver + id = /datum/reagent/consumable/ethanol/long_john_silver results = list(/datum/reagent/consumable/ethanol/long_john_silver = 10) required_reagents = list( /datum/reagent/consumable/ethanol/navy_rum = 4, @@ -126,7 +127,7 @@ /datum/chemical_reaction/long_haul name = "Long Haul" - id = /datum/chemical_reaction/long_haul + id = /datum/reagent/consumable/ethanol/long_haul results = list(/datum/reagent/consumable/ethanol/long_haul = 25) required_reagents = list( /datum/reagent/consumable/ethanol/navy_rum = 4, @@ -138,7 +139,7 @@ /datum/chemical_reaction/salt_and_swell name = "Salt and Swell" - id = /datum/chemical_reaction/salt_and_swell + id = /datum/reagent/consumable/ethanol/salt_and_swell results = list(/datum/reagent/consumable/ethanol/salt_and_swell = 10) required_reagents = list( /datum/reagent/consumable/ethanol/navy_rum = 4, @@ -149,7 +150,7 @@ /datum/chemical_reaction/tich_toch name = "Tich Toch" - id = /datum/chemical_reaction/tich_toch + id = /datum/reagent/consumable/ethanol/tich_toch results = list(/datum/reagent/consumable/ethanol/tich_toch = 10) required_reagents = list( /datum/reagent/consumable/ethanol/tiltaellen = 6, @@ -159,7 +160,7 @@ /datum/chemical_reaction/tiltaellen name = "Tiltällen" - id = /datum/chemical_reaction/tiltaellen + id = /datum/reagent/consumable/ethanol/tiltaellen results = list(/datum/reagent/consumable/ethanol/tiltaellen = 10) required_reagents = list( /datum/reagent/consumable/yoghurt = 8, @@ -169,8 +170,8 @@ mix_message = "The mixture curdles and thickens." /datum/chemical_reaction/tropical_storm - name = "" - id = /datum/chemical_reaction/ + name = "Tropical Storm" + id = /datum/reagent/consumable/ethanol/tropical_storm results = list(/datum/reagent/consumable/ethanol/tropical_storm = 10) required_reagents = list( /datum/reagent/consumable/ethanol/rum = 2, @@ -179,3 +180,12 @@ /datum/reagent/consumable/pineapplejuice = 2 ) +/datum/chemical_reaction/skullfucker_deluxe + name = "Skullfucker Deluxe" + id = /datum/reagent/consumable/ethanol/skullfucker_deluxe + results = list(/datum/reagent/consumable/ethanol/skullfucker_deluxe = 5) + required_reagents = list( + /datum/reagent/consumable/ethanol/sugar_rush = 2, + /datum/reagent/consumable/ethanol/moonshine = 2, + /datum/reagent/consumable/ethanol/brave_bull = 1 + ) diff --git a/modular_splurt/code/modules/holodeck/holo_effect.dm b/modular_splurt/code/modules/holodeck/holo_effect.dm new file mode 100644 index 0000000000..349ca781f1 --- /dev/null +++ b/modular_splurt/code/modules/holodeck/holo_effect.dm @@ -0,0 +1,7 @@ +// Holodeck mob: Funclaw +/obj/effect/holodeck_effect/mobspawner/funclaw + mobtype = /mob/living/simple_animal/hostile/deathclaw/funclaw/gentle + +// Holodeck mob: Friendly Bee +/obj/effect/holodeck_effect/mobspawner/bumbles + mobtype = /mob/living/simple_animal/pet/bumbles diff --git a/modular_splurt/code/modules/jobs/job_types/peacekeeper.dm b/modular_splurt/code/modules/jobs/job_types/peacekeeper.dm index d2b1c4b206..0936c46c12 100644 --- a/modular_splurt/code/modules/jobs/job_types/peacekeeper.dm +++ b/modular_splurt/code/modules/jobs/job_types/peacekeeper.dm @@ -151,7 +151,7 @@ Peacekeeper Hypospray /obj/item/reagent_containers/peacehypo/attack(mob/living/carbon/M, mob/user) var/datum/reagents/R = reagent_list[mode] if(!R.total_volume) - to_chat(user, "The injector is empty.") + to_chat(user, span_notice("The injector is empty.")) return if(!istype(M)) return @@ -160,15 +160,15 @@ Peacekeeper Hypospray for(var/datum/reagent/RG in R.reagent_list) if(M.reagents.has_reagent(RG.type) && !RG.overdose_threshold == 0) if(((M.reagents.get_reagent_amount(RG.type)) + amount_per_transfer_from_this > RG.overdose_threshold)) - to_chat(user, "Injecting [M] with more [RG] would overdose them.") + to_chat(user, span_warning("Injecting [M] with more [RG] would overdose them.")) return - to_chat(M, "You feel a tiny prick!") - to_chat(user, "You inject [M] with the injector.") + to_chat(M, span_warning("You feel a tiny prick!")) + to_chat(user, span_notice("You inject [M] with the injector.")) var/fraction = min(amount_per_transfer_from_this/R.total_volume, 1) R.reaction(M, INJECT, fraction) if(M.reagents) var/trans = R.trans_to(M, amount_per_transfer_from_this) - to_chat(user, "[trans] unit\s injected. [R.total_volume] unit\s remaining.") + to_chat(user, span_notice("[trans] unit\s injected. [R.total_volume] unit\s remaining.")) var/list/injected = list() for(var/datum/reagent/RG in R.reagent_list) @@ -182,7 +182,7 @@ Peacekeeper Hypospray mode = chosen_reagent playsound(loc, 'sound/effects/pop.ogg', 50, 0) var/datum/reagent/R = GLOB.chemical_reagents_list[reagent_ids[mode]] - to_chat(user, "[src] is now dispensing '[R.name]'.") + to_chat(user, span_notice("[src] is now dispensing '[R.name]'.")) return /obj/item/reagent_containers/peacehypo/examine(mob/user) @@ -195,11 +195,11 @@ Peacekeeper Hypospray for(var/datum/reagents/RS in reagent_list) var/datum/reagent/R = locate() in RS.reagent_list if(R) - . += "It currently has [R.volume] unit\s of [R.name] stored." + . += span_notice("It currently has [R.volume] unit\s of [R.name] stored.") empty = 0 if(empty) - . += "It is currently empty! Allow some time for the internal syntheszier to produce more." + . += span_warning("It is currently empty! Allow some time for the internal syntheszier to produce more.") /* End Peacekeeper Hypo */ diff --git a/modular_splurt/code/modules/keybindings/keybind/human.dm b/modular_splurt/code/modules/keybindings/keybind/human.dm new file mode 100644 index 0000000000..951ce686e2 --- /dev/null +++ b/modular_splurt/code/modules/keybindings/keybind/human.dm @@ -0,0 +1,32 @@ +/datum/keybinding/human/quick_equip_suitstorage + hotkey_keys = list("ShiftQ") + name = "quick_equipsuitstorage" + full_name = "Quick suit storage" + description = "Put held thing in suit storage or take the item from it" + +/datum/keybinding/human/quick_equip_suitstorage/down(client/user) + var/mob/living/carbon/human/H = user.mob + H.smart_equip_suitstorage() + return TRUE + +/datum/keybinding/human/quick_equip_lpocket + hotkey_keys = list("Unbound") + name = "quick_equip_lpocket" + full_name = "Quick left pocket" + description = "Put held thing in left pocket or take the item from it" + +/datum/keybinding/human/quick_equip_lpocket/down(client/user) + var/mob/living/carbon/human/H = user.mob + H.smart_equip_lpocket() + return TRUE + +/datum/keybinding/human/quick_equip_rpocket + hotkey_keys = list("Unbound") + name = "quick_equip_rpocket" + full_name = "Quick right pocket" + description = "Put held thing in right pocket or take the item from it" + +/datum/keybinding/human/quick_equip_rpocket/down(client/user) + var/mob/living/carbon/human/H = user.mob + H.smart_equip_rpocket() + return TRUE diff --git a/modular_splurt/code/modules/mob/dead/dead.dm b/modular_splurt/code/modules/mob/dead/dead.dm index f314076f72..f3fcd1d528 100644 --- a/modular_splurt/code/modules/mob/dead/dead.dm +++ b/modular_splurt/code/modules/mob/dead/dead.dm @@ -1,5 +1,5 @@ /mob/dead/check_out(atom/A) if (!CONFIG_GET(flag/ghost_interaction)) - to_chat(usr, "You cannot check out people when dead!") + to_chat(usr, span_notice("You cannot check out people when dead!")) return . = ..() diff --git a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/body_markings.dm b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/body_markings.dm index 33c377eabb..1d38f77db0 100644 --- a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/body_markings.dm +++ b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/body_markings.dm @@ -107,6 +107,24 @@ icon_state = "deoxys" covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) +/datum/sprite_accessory/mam_body_markings/sloog + name = "Sloog" + icon = 'modular_splurt/icons/mob/mam_markings.dmi' + icon_state = "sloog" + covered_limbs = list("Chest" = MATRIX_RED_GREEN) + +/datum/sprite_accessory/mam_body_markings/pilot + name = "Pilot" + icon = 'modular_splurt/icons/mob/mam_markings.dmi' + icon_state = "pilot" + covered_limbs = list("Head" = MATRIX_ALL) + +/datum/sprite_accessory/mam_body_markings/pilot_jaw + name = "Pilot Jaw" + icon = 'modular_splurt/icons/mob/mam_markings.dmi' + icon_state = "pilotjaw" + covered_limbs = list("Head" = MATRIX_RED_BLUE) + /****************************************** ************* Insect Markings ************* *******************************************/ diff --git a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/horns.dm b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/horns.dm index 56ba9fdbba..4454dd0283 100644 --- a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/horns.dm +++ b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/horns.dm @@ -41,3 +41,12 @@ name = "Alien Bobbers" icon = 'modular_splurt/icons/mob/mutant_bodyparts.dmi' icon_state = "alienbobbers" + +/datum/sprite_accessory/horns/sloogbobbers + name = "Sloog Bobbers" + icon = 'modular_splurt/icons/mob/64_mutant_bodyparts.dmi' + icon_state = "sloogbobbers" + dimension_x = 64 + center = TRUE + color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN diff --git a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/legs_and_taurs.dm b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/legs_and_taurs.dm index d43c091c6a..d2df178b71 100644 --- a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/legs_and_taurs.dm +++ b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/legs_and_taurs.dm @@ -51,3 +51,11 @@ taur_mode = STYLE_PAW_TAURIC //it is what it is hide_legs = USE_QUADRUPED_CLIP_MASK matrixed_sections = MATRIX_RED_GREEN + +/datum/sprite_accessory/taur/sloog + name = "Sloog" + icon_state = "sloog" + icon = 'modular_splurt/icons/mob/mam_taur.dmi' + taur_mode = STYLE_PAW_TAURIC + hide_legs = USE_QUADRUPED_CLIP_MASK + matrixed_sections = MATRIX_RED_GREEN diff --git a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/snouts.dm b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/snouts.dm index 927240b7ea..549793e24f 100644 --- a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/snouts.dm +++ b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/snouts.dm @@ -221,8 +221,25 @@ icon = 'modular_splurt/icons/mob/mam_snouts.dmi' color_src = MUTCOLORS +/datum/sprite_accessory/snouts/mam_snouts/corvidbeak + name = "Corvid Beak" + icon_state = "corvidbeak" + icon = 'modular_splurt/icons/mob/mam_snouts.dmi' + matrixed_sections = MATRIX_GREEN + /datum/sprite_accessory/snouts/mam_snouts/deoxys name = "Deoxys" icon_state = "deoxys" icon = 'modular_splurt/icons/mob/mam_snouts.dmi' matrixed_sections = MATRIX_ALL + +/datum/sprite_accessory/snouts/mam_snouts/sloog + name = "Sloog" + icon_state = "sloog" + icon = 'modular_splurt/icons/mob/mam_snouts.dmi' + matrixed_sections = MATRIX_RED + +/datum/sprite_accessory/snouts/mam_snouts/sloog/lips + name = "Sloog (lips)" + icon_state = "slooglips" + matrixed_sections = MATRIX_RED_GREEN diff --git a/modular_splurt/code/modules/mob/living/carbon/carbon.dm b/modular_splurt/code/modules/mob/living/carbon/carbon.dm index d2a7d7a875..aae89ee26f 100644 --- a/modular_splurt/code/modules/mob/living/carbon/carbon.dm +++ b/modular_splurt/code/modules/mob/living/carbon/carbon.dm @@ -6,7 +6,7 @@ var/obj/item/restraints/bondage_rope/rope = I cuff_break = rope.prepare_resist(src) if(cuff_break == -1) - to_chat(src, "You are not able to reach the rope.") + to_chat(src, span_danger("You are not able to reach the rope.")) return . = ..() @@ -14,11 +14,48 @@ if(istype(I, /obj/item/restraints/bondage_rope)) var/obj/item/restraints/bondage_rope/rope = I if(LAZYLEN(rope.rope_stack) > 1) - visible_message("[src] manages to loosen up their rope!") - to_chat(src, "You successfully loosen up your rope.") + visible_message(span_danger("[src] manages to loosen up their rope!")) + to_chat(src, span_notice("You successfully loosen up your rope.")) var/obj/item/restraints/bondage_rope/new_rope = new rope.type() new_rope.color = pop(rope.rope_stack) new_rope.forceMove(src.loc) return . = ..() + +// Liquid Panty Dropper effect +/mob/living/carbon/proc/clothing_burst(mob/living/carbon/target_user) + // Variable for if the action succeeded + var/user_disrobed = FALSE + + // Get worn items + var/items = target_user.get_contents() + + // Iterate over worn items + for(var/obj/item/item_worn in items) + // Ignore non-mob (storage) + if(!ismob(item_worn.loc)) + continue + + // Ignore held items + if(target_user.is_holding(item_worn)) + continue + + // Check for anything covering a body part + if(item_worn.body_parts_covered) + // Set the success variable + user_disrobed = TRUE + + // Drop the target item + target_user.dropItemToGround(item_worn, TRUE) + + // Throw item to a random spot + item_worn.throw_at(pick(oview(7,get_turf(src))),10,1) + + // When successfully disrobing a target + if(user_disrobed) + // Display a chat message + target_user.visible_message(span_userlove("[target_user] suddenly bursts out of [target_user.p_their()] clothes!"), span_userlove("You suddenly burst out of your clothes!")) + + // Play the ripped poster sound + playsound(target_user.loc, 'sound/items/poster_ripped.ogg', 50, 1) diff --git a/modular_splurt/code/modules/mob/living/carbon/human/inventory.dm b/modular_splurt/code/modules/mob/living/carbon/human/inventory.dm new file mode 100644 index 0000000000..ffc8a50b73 --- /dev/null +++ b/modular_splurt/code/modules/mob/living/carbon/human/inventory.dm @@ -0,0 +1,92 @@ +/mob/living/carbon/human/proc/smart_equip_suitstorage() // put held thing in suit storage or take the item from it + if(incapacitated()) + return + var/obj/item/thing = get_active_held_item() + var/obj/item/equipped_suitstorage = get_item_by_slot(ITEM_SLOT_SUITSTORE) + if(!equipped_suitstorage) // We also let you equip another storage like this + if(!thing) + to_chat(src, "You haven't anything on your suit!") + return + if(equip_to_slot_if_possible(thing, ITEM_SLOT_SUITSTORE)) + update_inv_hands() + return + if(!SEND_SIGNAL(equipped_suitstorage, COMSIG_CONTAINS_STORAGE)) // not a storage item + if(!thing) + equipped_suitstorage.attack_hand(src) + else + to_chat(src, "You can't fit anything in!") + return + if(thing) // put thing in suit storage + if(!SEND_SIGNAL(equipped_suitstorage, COMSIG_TRY_STORAGE_INSERT, thing, src)) + to_chat(src, "You can't fit anything in!") + return + if(!equipped_suitstorage.contents.len) // nothing to take out + to_chat(src, "There's nothing in your belt to take out!") + return + var/obj/item/stored = equipped_suitstorage.contents[equipped_suitstorage.contents.len] + if(!stored || stored.on_found(src)) + return + stored.attack_hand(src) // take out thing from suit storage + return + +/mob/living/carbon/human/proc/smart_equip_rpocket() // put held thing in right pocket or take the item from it + if(incapacitated()) + return + var/obj/item/thing = get_active_held_item() + var/obj/item/equipped_rpocket = get_item_by_slot(ITEM_SLOT_RPOCKET) + if(!equipped_rpocket) // We also let you equip another storage like this + if(!thing) + to_chat(src, "You haven't anything on your suit!") + return + if(equip_to_slot_if_possible(thing, ITEM_SLOT_RPOCKET)) + update_inv_hands() + return + if(!SEND_SIGNAL(equipped_rpocket, COMSIG_CONTAINS_STORAGE)) // not a storage item + if(!thing) + equipped_rpocket.attack_hand(src) + else + to_chat(src, "You can't fit anything in!") + return + if(thing) // put thing in suit storage + if(!SEND_SIGNAL(equipped_rpocket, COMSIG_TRY_STORAGE_INSERT, thing, src)) + to_chat(src, "You can't fit anything in!") + return + if(!equipped_rpocket.contents.len) // nothing to take out + to_chat(src, "There's nothing in your belt to take out!") + return + var/obj/item/stored = equipped_rpocket.contents[equipped_rpocket.contents.len] + if(!stored || stored.on_found(src)) + return + stored.attack_hand(src) // take out thing from right pocket + return + +/mob/living/carbon/human/proc/smart_equip_lpocket() // put held thing in left pocket or take the item from it + if(incapacitated()) + return + var/obj/item/thing = get_active_held_item() + var/obj/item/equipped_lpocket = get_item_by_slot(ITEM_SLOT_LPOCKET) + if(!equipped_lpocket) // We also let you equip another storage like this + if(!thing) + to_chat(src, "You haven't anything on your suit!") + return + if(equip_to_slot_if_possible(thing, ITEM_SLOT_LPOCKET)) + update_inv_hands() + return + if(!SEND_SIGNAL(equipped_lpocket, COMSIG_CONTAINS_STORAGE)) // not a storage item + if(!thing) + equipped_lpocket.attack_hand(src) + else + to_chat(src, "You can't fit anything in!") + return + if(thing) // put thing in + if(!SEND_SIGNAL(equipped_lpocket, COMSIG_TRY_STORAGE_INSERT, thing, src)) + to_chat(src, "You can't fit anything in!") + return + if(!equipped_lpocket.contents.len) // nothing to take out + to_chat(src, "There's nothing in your belt to take out!") + return + var/obj/item/stored = equipped_lpocket.contents[equipped_lpocket.contents.len] + if(!stored || stored.on_found(src)) + return + stored.attack_hand(src) // take out thing from left pocket + return diff --git a/modular_splurt/code/modules/mob/living/carbon/human/simple_animal/hostile/deathclaw/deathclaw.dm b/modular_splurt/code/modules/mob/living/carbon/human/simple_animal/hostile/deathclaw/deathclaw.dm index a4f1ff53d4..d2afb4f5af 100644 --- a/modular_splurt/code/modules/mob/living/carbon/human/simple_animal/hostile/deathclaw/deathclaw.dm +++ b/modular_splurt/code/modules/mob/living/carbon/human/simple_animal/hostile/deathclaw/deathclaw.dm @@ -53,13 +53,13 @@ if(!Proj) return if(prob(10)) - visible_message("\The [src] growls, enraged!") + visible_message(span_danger("\The [src] growls, enraged!")) sleep(3) Charge() if(prob(85) || Proj.damage > 26) //prob(x) = chance for proj to actually do something, adjust depending on how OP you want deathclaws to be return ..() else - visible_message("\The [Proj] bounces off \the [src]'s thick hide!") + visible_message(span_danger("\The [Proj] bounces off \the [src]'s thick hide!")) return 0 /mob/living/simple_animal/hostile/deathclaw/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) @@ -90,7 +90,7 @@ if(!T || T == loc) return charging = TRUE - visible_message("[src] charges!") + visible_message(span_danger("[src] charges!")) DestroySurroundings() walk(src, 0) setDir(get_dir(src, T)) @@ -117,7 +117,7 @@ else if(isliving(A)) var/mob/living/L = A - L.visible_message("[src] slams into [L]!", "[src] slams into you!") + L.visible_message(span_danger("[src] slams into [L]!"), span_userdanger("[src] slams into you!")) L.apply_damage(melee_damage_lower/2, BRUTE) playsound(get_turf(L), 'sound/effects/meteorimpact.ogg', 100, 1) shake_camera(L, 4, 3) diff --git a/modular_splurt/code/modules/mob/living/carbon/human/simple_animal/hostile/deathclaw/funclaw.dm b/modular_splurt/code/modules/mob/living/carbon/human/simple_animal/hostile/deathclaw/funclaw.dm index 2ec84e7cd7..7c1738ae95 100644 --- a/modular_splurt/code/modules/mob/living/carbon/human/simple_animal/hostile/deathclaw/funclaw.dm +++ b/modular_splurt/code/modules/mob/living/carbon/human/simple_animal/hostile/deathclaw/funclaw.dm @@ -46,8 +46,8 @@ start_pulling(M, supress_message = TRUE) log_combat(src, M, "grabbed") - M.visible_message("[src] violently grabs [M]!", \ - "[src] violently grabs you!") + M.visible_message(span_warning("[src] violently grabs [M]!"), \ + span_userdanger("[src] violently grabs you!")) setGrabState(GRAB_NECK) //Instant neck grab return @@ -191,15 +191,15 @@ /mob/living/simple_animal/hostile/deathclaw/funclaw/proc/slap(mob/living/M) playsound(loc, "modular_sand/sound/interactions/slap.ogg", 30, 1, -1) - visible_message("\The [src] slaps \the [M] right on the ass!", \ - "\The [src] slaps \the [M] right on the ass!", null, COMBAT_MESSAGE_RANGE) + visible_message(span_danger("\The [src] slaps \the [M] right on the ass!"), \ + span_userdanger("\The [src] slaps \the [M] right on the ass!"), null, COMBAT_MESSAGE_RANGE) /mob/living/simple_animal/hostile/deathclaw/funclaw/proc/tearSlot(mob/living/M, slot) var/obj/item/W = M.get_item_by_slot(slot) if(W) M.dropItemToGround(W) playsound(loc, "sound/items/poster_ripped.ogg", 30, 1, -1) - visible_message("\The [src] tears off \the [M]'s clothes!", \ - "\The [src] tears off \the [M]'s clothes!", null, COMBAT_MESSAGE_RANGE) + visible_message(span_danger("\The [src] tears off \the [M]'s clothes!"), \ + span_userdanger("\The [src] tears off \the [M]'s clothes!"), null, COMBAT_MESSAGE_RANGE) return TRUE return FALSE diff --git a/modular_splurt/code/modules/mob/living/carbon/human/species.dm b/modular_splurt/code/modules/mob/living/carbon/human/species.dm index 3ffad4c2b4..5fec507149 100644 --- a/modular_splurt/code/modules/mob/living/carbon/human/species.dm +++ b/modular_splurt/code/modules/mob/living/carbon/human/species.dm @@ -1,7 +1,7 @@ /datum/species/althelp(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) if(user == target && istype(user)) if(HAS_TRAIT(user, TRAIT_FLOORED)) - to_chat(user, "You can't seem to force yourself up right now!") + to_chat(user, span_warning("You can't seem to force yourself up right now!")) return . = ..() diff --git a/modular_splurt/code/modules/mob/living/carbon/human/species_types/arachnid.dm b/modular_splurt/code/modules/mob/living/carbon/human/species_types/arachnid.dm index 3cc48b3236..e3553f13c8 100644 --- a/modular_splurt/code/modules/mob/living/carbon/human/species_types/arachnid.dm +++ b/modular_splurt/code/modules/mob/living/carbon/human/species_types/arachnid.dm @@ -13,23 +13,23 @@ if(H.stat == "DEAD") return if(web_ready == FALSE) - to_chat(H, "You need to wait a while to regenerate web fluid.") + to_chat(H, span_warning("You need to wait a while to regenerate web fluid.")) return var/turf/T = get_turf(H) if(!T) - to_chat(H, "There's no room to spin your web here!") + to_chat(H, span_warning("There's no room to spin your web here!")) return var/obj/structure/spider/stickyweb/W = locate() in T var/obj/structure/arachnid/W2 = locate() in T if(W || W2) - to_chat(H, "There's already a web here!") + to_chat(H, span_warning("There's already a web here!")) return // Should have some minimum amount of food before trying to activate var/nutrition_threshold = NUTRITION_LEVEL_FED if (H.nutrition >= nutrition_threshold) to_chat(H, "You begin spinning some web...") if(!do_after(H, 10 SECONDS, 1, T)) - to_chat(H, "Your web spinning was interrupted!") + to_chat(H, span_warning("Your web spinning was interrupted!")) return H.adjust_nutrition(-spinner_rate) addtimer(VARSET_CALLBACK(src, web_ready, TRUE), web_cooldown) @@ -37,7 +37,7 @@ new /obj/structure/arachnid(T, owner) else - to_chat(H, "You're too hungry to spin web right now, eat something first!") + to_chat(H, span_warning("You're too hungry to spin web right now, eat something first!")) return /datum/action/innate/spin_cocoon/Activate() @@ -45,17 +45,17 @@ if(H.stat == "DEAD") return if(web_ready == FALSE) - to_chat(H, "You need to wait awhile to regenerate web fluid.") + to_chat(H, span_warning("You need to wait awhile to regenerate web fluid.")) return var/nutrition_threshold = NUTRITION_LEVEL_FED if (H.nutrition >= nutrition_threshold) - to_chat(H, "You pull out a strand from your spinneret, ready to wrap a target. (Press ALT+CLICK on the target to start wrapping.)") + to_chat(H, span_warning("You pull out a strand from your spinneret, ready to wrap a target. (Press ALT+CLICK on the target to start wrapping.)")) H.adjust_nutrition(spinner_rate * -0.5) addtimer(VARSET_CALLBACK(src, web_ready, TRUE), web_cooldown) RegisterSignal(H, list(COMSIG_MOB_ALTCLICKON), .proc/cocoonAtom) return else - to_chat(H, "You're too hungry to spin web right now, eat something first!") + to_chat(H, span_warning("You're too hungry to spin web right now, eat something first!")) return /datum/action/innate/spin_cocoon/cocoonAtom(mob/living/carbon/human/H, atom/movable/A) @@ -64,39 +64,39 @@ return COMSIG_MOB_CANCEL_CLICKON else if(web_ready == FALSE) - to_chat(H, "You need to wait awhile to regenerate web fluid.") + to_chat(H, span_warning("You need to wait awhile to regenerate web fluid.")) return if(!H.Adjacent(A)) //No. return if(!isliving(A) && A.anchored) - to_chat(H, "[A] is bolted to the floor!") + to_chat(H, span_warning("[A] is bolted to the floor!")) return if(istype(A, /obj/structure/arachnid)) - to_chat(H, "No double wrapping.") + to_chat(H, span_warning("No double wrapping.")) return if(istype(A, /obj/effect)) - to_chat(H, "You cannot wrap this.") + to_chat(H, span_warning("You cannot wrap this.")) return if(isliving(A)) var/mob/living/L = A if(L.key) - to_chat(H, "You prepare to wrap [L] in a cocoon...") + to_chat(H, span_warning("You prepare to wrap [L] in a cocoon...")) var/response = alert(L, "Do you wish to be wrapped in a cocoon?", "Cocooning", "No", "Yes") if(response == "No") - to_chat(H, "[L] resists your attempts to wrap [L.p_them()]!") + to_chat(H, span_warning("[L] resists your attempts to wrap [L.p_them()]!")) return - H.visible_message("[H] starts to wrap [A] into a cocoon!","You start to wrap [A] into a cocoon.") + H.visible_message(span_danger("[H] starts to wrap [A] into a cocoon!"),span_warning("You start to wrap [A] into a cocoon.")) if(!do_after(H, 10 SECONDS, 1, A)) - to_chat(H, "Your web spinning was interrupted!") + to_chat(H, span_warning("Your web spinning was interrupted!")) return H.adjust_nutrition(spinner_rate * -3) var/obj/structure/arachnid/cocoon/C = new(A.loc) if(isliving(A)) C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3") A.forceMove(C) - H.visible_message("[H] wraps [A] into a large cocoon!") + H.visible_message(span_danger("[H] wraps [A] into a large cocoon!")) return else A.forceMove(C) - H.visible_message("[H] wraps [A] into a cocoon!") + H.visible_message(span_danger("[H] wraps [A] into a cocoon!")) return diff --git a/modular_splurt/code/modules/mob/living/carbon/human/species_types/zombies2.dm b/modular_splurt/code/modules/mob/living/carbon/human/species_types/zombies2.dm index 9d1f04d453..53e887e98c 100644 --- a/modular_splurt/code/modules/mob/living/carbon/human/species_types/zombies2.dm +++ b/modular_splurt/code/modules/mob/living/carbon/human/species_types/zombies2.dm @@ -177,10 +177,10 @@ desc = "A rotting mass of twisted viscera." organ_flags = ORGAN_EXTERNAL - low_threshold_passed = "Something forgotten weakens within your chest." - high_threshold_passed = "A chill of death stalks you." - now_fixed = "It comforts you once more." - high_threshold_cleared = "The ghastly cold crawls back." + low_threshold_passed = span_info("Something forgotten weakens within your chest.") + high_threshold_passed = span_warning("A chill of death stalks you.") + now_fixed = span_cult("It comforts you once more.") + high_threshold_cleared = span_info("The ghastly cold crawls back.") beating = FALSE var/reviving = FALSE @@ -224,7 +224,7 @@ if(owner.health >= HEALTH_THRESHOLD_FULLCRIT) owner.revive() if(owner.stat == !DEAD) // incase any weird shit where they can't revive - owner.visible_message("[owner] suddenly convulses back to life!") + owner.visible_message(span_danger("[owner] suddenly convulses back to life!")) owner.update_stat() owner.update_health_hud() if(owner.blood_volume <= BLOOD_VOLUME_SURVIVE) @@ -232,7 +232,7 @@ return if(owner?.health <= HEALTH_THRESHOLD_DEAD && owner?.blood_volume >= BLOOD_VOLUME_SURVIVE) reviving = TRUE - to_chat(owner, "Your broken shell is stitching itself back together...") + to_chat(owner, span_alertwarning("Your broken shell is stitching itself back together...")) /obj/item/organ/undead_infection name = "festering ooze" @@ -289,7 +289,7 @@ if (causes_damage && !iszombie(owner) && owner.stat != DEAD) owner.adjustToxLoss(1) if (prob(10)) - to_chat(owner, "You feel sick...") + to_chat(owner, span_danger("You feel sick...")) if(timer_id) return if(owner.suiciding) @@ -335,12 +335,12 @@ return owner.grab_ghost() - owner.visible_message("[owner] suddenly convulses, as [owner.p_they()][stand_up ? " stagger to [owner.p_their()] feet and" : ""] gain a ravenous hunger in [owner.p_their()] eyes!", "* But it refused") + owner.visible_message(span_danger("[owner] suddenly convulses, as [owner.p_they()][stand_up ? " stagger to [owner.p_their()] feet and" : ""] gain a ravenous hunger in [owner.p_their()] eyes!"), span_cultlarge("* But it refused")) playsound(owner.loc, 'sound/hallucinations/far_noise.ogg', 50, 1) owner.do_jitter_animation(living_transformation_time) owner.Stun(living_transformation_time) -// to_chat(owner, "You are now a zombie! You claw and bite, turning your fellow crewmembers into friends that help spread the plague.") -// to_chat(owner, "You are a zombie. Please act like one. Letting the crew remove the tumor inside your brain is a dick move to whoever infected you. Please do not do it.") +// to_chat(owner, span_alertalien("You are now a zombie! You claw and bite, turning your fellow crewmembers into friends that help spread the plague.")) +// to_chat(owner, span_alertwarning("You are a zombie. Please act like one. Letting the crew remove the tumor inside your brain is a dick move to whoever infected you. Please do not do it.")) /obj/item/organ/undead_infection/mammal old_species = /datum/species/mammal @@ -381,7 +381,7 @@ infection = new() infection.Insert(H) - to_chat(H, "mors tua, vita mea.") + to_chat(H, span_cult("mors tua, vita mea.")) H.playsound_local(H, 'sound/effects/singlebeat.ogg', 100, 0) return diff --git a/modular_splurt/code/modules/mob/living/carbon/human/update_icons.dm b/modular_splurt/code/modules/mob/living/carbon/human/update_icons.dm new file mode 100644 index 0000000000..7274e95154 --- /dev/null +++ b/modular_splurt/code/modules/mob/living/carbon/human/update_icons.dm @@ -0,0 +1,13 @@ +// Function for updating back sprites +/mob/living/carbon/human/update_inv_back() + . = ..() + + // Check for hidden backpack trait + if(HAS_TRAIT(src, TRAIT_HIDE_BACKPACK)) + // Define back overlays + var/mutable_appearance/back_overlay = overlays_standing[BACK_LAYER] + + // Check for existing overlay + if(back_overlay) + // Remove overlays + remove_overlay(BACK_LAYER) diff --git a/modular_splurt/code/modules/mob/living/living.dm b/modular_splurt/code/modules/mob/living/living.dm index be2bb9949e..c2b04a0d84 100644 --- a/modular_splurt/code/modules/mob/living/living.dm +++ b/modular_splurt/code/modules/mob/living/living.dm @@ -6,7 +6,7 @@ // There's probably better way to do this but I am terrible at it --Nopeman /mob/living/proc/change_gender() if(stat != CONSCIOUS) - to_chat(usr, "You cannot toggle your gender while unconcious!") + to_chat(usr, span_warning("You cannot toggle your gender while unconcious!")) return var/choice = tgui_alert(usr, "Select Gender.", "Gender", list("Both", "Male", "Female", "None", "Toggle Breasts")) @@ -40,7 +40,7 @@ SetStun(0, ignore_canstun = TRUE) if(client && admin) - to_chat(src, "An admin has [!admin_frozen ? "un" : ""]frozen you.") + to_chat(src, span_userdanger("An admin has [!admin_frozen ? "un" : ""]frozen you.")) log_admin("[key_name(admin)] toggled admin-freeze on [key_name(src)].") message_admins("[key_name_admin(admin)] toggled admin-freeze on [key_name_admin(src)].") @@ -54,7 +54,7 @@ SetSleeping(0, ignore_canstun = TRUE) if(client && admin) - to_chat(src, "An admin has [!admin_sleeping ? "un": ""]slept you.") + to_chat(src, span_userdanger("An admin has [!admin_sleeping ? "un": ""]slept you.")) log_admin("[key_name(admin)] toggled admin-sleep on [key_name(src)].") message_admins("[key_name_admin(admin)] toggled admin-sleep on [key_name_admin(src)].") diff --git a/modular_splurt/code/modules/mob/living/silicon/robot/dogborg_equipment.dm b/modular_splurt/code/modules/mob/living/silicon/robot/dogborg_equipment.dm index 1e361c362a..ca571dbae6 100644 --- a/modular_splurt/code/modules/mob/living/silicon/robot/dogborg_equipment.dm +++ b/modular_splurt/code/modules/mob/living/silicon/robot/dogborg_equipment.dm @@ -43,7 +43,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! force = 12 attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") status = 1 - to_chat(user, "Your jaws are now [status ? "Combat" : "Pup'd"].") + to_chat(user, span_notice("Your jaws are now [status ? "Combat" : "Pup'd"].")) else name = "puppy jaws" icon_state = "smalljaws" @@ -52,7 +52,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") status = 0 if(R.emagged) - to_chat(user, "Your jaws are now [status ? "Combat" : "Pup'd"].") + to_chat(user, span_notice("Your jaws are now [status ? "Combat" : "Pup'd"].")) update_icon() //Boop @@ -69,7 +69,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! w_class = 1 /obj/item/analyzer/nose/attack_self(mob/user) - user.visible_message("[user] sniffs around the air.", "You sniff the air for gas traces.") + user.visible_message("[user] sniffs around the air.", span_warning("You sniff the air for gas traces.")) var/turf/location = user.loc if(!istype(location)) @@ -80,11 +80,11 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! var/pressure = environment.return_pressure() var/total_moles = environment.total_moles() - to_chat(user, "Results:") + to_chat(user, span_info("Results:")) if(abs(pressure - ONE_ATMOSPHERE) < 10) - to_chat(user, "Pressure: [round(pressure,0.1)] kPa") + to_chat(user, span_info("Pressure: [round(pressure,0.1)] kPa")) else - to_chat(user, "Pressure: [round(pressure,0.1)] kPa") + to_chat(user, span_alert("Pressure: [round(pressure,0.1)] kPa")) if(total_moles) var/list/env_gases = environment.get_gases() @@ -95,39 +95,39 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! GAS_GARBAGE_COLLECT(environment.get_gases()) if(abs(n2_concentration - N2STANDARD) < 20) - to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] %") + to_chat(user, span_info("Nitrogen: [round(n2_concentration*100, 0.01)] %")) else - to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] %") + to_chat(user, span_alert("Nitrogen: [round(n2_concentration*100, 0.01)] %")) if(abs(o2_concentration - O2STANDARD) < 2) - to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] %") + to_chat(user, span_info("Oxygen: [round(o2_concentration*100, 0.01)] %")) else - to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] %") + to_chat(user, span_alert("Oxygen: [round(o2_concentration*100, 0.01)] %")) if(co2_concentration > 0.01) - to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] %") + to_chat(user, span_alert("CO2: [round(co2_concentration*100, 0.01)] %")) else - to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] %") + to_chat(user, span_info("CO2: [round(co2_concentration*100, 0.01)] %")) if(plasma_concentration > 0.005) - to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] %") + to_chat(user, span_alert("Plasma: [round(plasma_concentration*100, 0.01)] %")) else - to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] %") + to_chat(user, span_info("Plasma: [round(plasma_concentration*100, 0.01)] %")) for(var/id in env_gases) if(id in GLOB.hardcoded_gases) continue var/gas_concentration = env_gases[id]/total_moles - to_chat(user, "[GLOB.gas_data.names[id]]: [round(gas_concentration*100, 0.01)] %") - to_chat(user, "Temperature: [round(environment.return_temperature()-T0C)] °C") + to_chat(user, span_alert("[GLOB.gas_data.names[id]]: [round(gas_concentration*100, 0.01)] %")) + to_chat(user, span_info("Temperature: [round(environment.return_temperature()-T0C)] °C")) /obj/item/analyzer/nose/afterattack(atom/target, mob/user, proximity) . = ..() if(!proximity) return do_attack_animation(target, null, src) - user.visible_message("[user] [pick(attack_verb)] \the [target.name] with their nose!") + user.visible_message(span_notice("[user] [pick(attack_verb)] \the [target.name] with their nose!")) //Delivery /obj/item/storage/bag/borgdelivery @@ -170,7 +170,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! name = "energized tongue" desc = "Your tongue is energized for dangerously maximum efficency." icon_state = "syndietongue" - to_chat(user, "Your tongue is now [status ? "Energized" : "Normal"].") + to_chat(user, span_notice("Your tongue is now [status ? "Energized" : "Normal"].")) cleanspeed = 10 //(nerf'd)tator soap stat else status = 0 @@ -179,7 +179,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! icon_state = "synthtongue" cleanspeed = initial(cleanspeed) if(R.emagged) - to_chat(user, "Your tongue is now [status ? "Energized" : "Normal"].") + to_chat(user, span_notice("Your tongue is now [status ? "Energized" : "Normal"].")) update_icon() /obj/item/soap/tongue/afterattack(atom/target, mob/user, proximity) @@ -187,54 +187,54 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! if(!proximity || !check_allowed_items(target)) return if(R.client && (target in R.client.screen)) - to_chat(R, "You need to take that [target.name] off before cleaning it!") + to_chat(R, span_warning("You need to take that [target.name] off before cleaning it!")) else if(is_cleanable(target)) - R.visible_message("[R] begins to lick off \the [target.name].", "You begin to lick off \the [target.name]...") + R.visible_message("[R] begins to lick off \the [target.name].", span_warning("You begin to lick off \the [target.name]...")) if(do_after(R, src.cleanspeed, target = target)) if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. return //If they moved away, you can't eat them. - to_chat(R, "You finish licking off \the [target.name].") + to_chat(R, span_notice("You finish licking off \the [target.name].")) qdel(target) R.cell.give(50) else if(isobj(target)) //hoo boy. danger zone man if(istype(target,/obj/item/trash)) - R.visible_message("[R] nibbles away at \the [target.name].", "You begin to nibble away at \the [target.name]...") + R.visible_message("[R] nibbles away at \the [target.name].", span_warning("You begin to nibble away at \the [target.name]...")) if(!do_after(R, src.cleanspeed, target = target)) return //If they moved away, you can't eat them. - to_chat(R, "You finish off \the [target.name].") + to_chat(R, span_notice("You finish off \the [target.name].")) qdel(target) R.cell.give(250) return if(istype(target,/obj/item/stock_parts/cell)) - R.visible_message("[R] begins cramming \the [target.name] down its throat.", "You begin cramming \the [target.name] down your throat...") + R.visible_message("[R] begins cramming \the [target.name] down its throat.", span_warning("You begin cramming \the [target.name] down your throat...")) if(!do_after(R, 50, target = target)) return //If they moved away, you can't eat them. - to_chat(R, "You finish off \the [target.name].") + to_chat(R, span_notice("You finish off \the [target.name].")) var/obj/item/stock_parts/cell/C = target R.cell.charge = R.cell.charge + (C.charge / 3) //Instant full cell upgrades op idgaf qdel(target) return var/obj/item/I = target //HAHA FUCK IT, NOT LIKE WE ALREADY HAVE A SHITTON OF WAYS TO REMOVE SHIT if(!I.anchored && R.emagged) - R.visible_message("[R] begins chewing up \the [target.name]. Looks like it's trying to loophole around its diet restriction!", "You begin chewing up \the [target.name]...") + R.visible_message("[R] begins chewing up \the [target.name]. Looks like it's trying to loophole around its diet restriction!", span_warning("You begin chewing up \the [target.name]...")) if(!do_after(R, 100, target = I)) //Nerf dat time yo return //If they moved away, you can't eat them. - visible_message("[R] chews up \the [target.name] and cleans off the debris!") - to_chat(R, "You finish off \the [target.name].") + visible_message(span_warning("[R] chews up \the [target.name] and cleans off the debris!")) + to_chat(R, span_notice("You finish off \the [target.name].")) qdel(I) R.cell.give(500) return - R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") + R.visible_message("[R] begins to lick \the [target.name] clean...", span_notice("You begin to lick \the [target.name] clean...")) else if(ishuman(target)) var/mob/living/L = target if(status == 0 && check_zone(R.zone_selected) == "head") - R.visible_message("\the [R] affectionally licks \the [L]'s face!", "You affectionally lick \the [L]'s face!") + R.visible_message(span_warning("\the [R] affectionally licks \the [L]'s face!"), span_notice("You affectionally lick \the [L]'s face!")) playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1) if(istype(L) && L.fire_stacks > 0) L.adjust_fire_stacks(-10) return else if(status == 0) - R.visible_message("\the [R] affectionally licks \the [L]!", "You affectionally lick \the [L]!") + R.visible_message(span_warning("\the [R] affectionally licks \the [L]!"), span_notice("You affectionally lick \the [L]!")) playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1) if(istype(L) && L.fire_stacks > 0) L.adjust_fire_stacks(-10) @@ -246,22 +246,22 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! L.Stun(4) // normal stunbaton is force 7 gimme a break good sir! L.Knockdown(80) L.apply_effect(EFFECT_STUTTER, 4) - L.visible_message("[R] has shocked [L] with its tongue!", \ - "[R] has shocked you with its tongue!") + L.visible_message(span_danger("[R] has shocked [L] with its tongue!"), \ + span_userdanger("[R] has shocked you with its tongue!")) playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) R.cell.use(666) log_combat(R, L, "tongue stunned") else if(istype(target, /obj/structure/window)) - R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") + R.visible_message("[R] begins to lick \the [target.name] clean...", span_notice("You begin to lick \the [target.name] clean...")) if(do_after(user, src.cleanspeed, target = target)) - to_chat(user, "You clean \the [target.name].") + to_chat(user, span_notice("You clean \the [target.name].")) target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) target.set_opacity(initial(target.opacity)) else - R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") + R.visible_message("[R] begins to lick \the [target.name] clean...", span_notice("You begin to lick \the [target.name] clean...")) if(do_after(user, src.cleanspeed, target = target)) - to_chat(user, "You clean \the [target.name].") + to_chat(user, span_notice("You clean \the [target.name].")) var/obj/effect/decal/cleanable/C = locate() in target qdel(C) target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) @@ -323,19 +323,19 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! spawn(R.pounce_cooldown_time) R.pounce_cooldown = !R.pounce_cooldown else if(R && R.pounce_cooldown) - to_chat(R, "Your leg actuators are still recharging!") + to_chat(R, span_danger("Your leg actuators are still recharging!")) /mob/living/silicon/robot/proc/leap_at(atom/A) if(leaping || stat || buckled || lying) return if(!has_gravity(src) || !has_gravity(A)) - to_chat(src,"It is unsafe to leap without gravity!") + to_chat(src,span_danger("It is unsafe to leap without gravity!")) //It's also extremely buggy visually, so it's balance+bugfix return if(cell.charge <= 750) - to_chat(src,"Insufficent reserves for jump actuators!") + to_chat(src,span_danger("Insufficent reserves for jump actuators!")) return else @@ -408,12 +408,12 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! //start processing the regents in the container - and slowly use em up to create power toggle_process_regents = !toggle_process_regents if (toggle_process_regents) - to_chat(user, "You start churning the sexual fluids from your [inserted_item.name] into energy.") + to_chat(user, span_notice("You start churning the sexual fluids from your [inserted_item.name] into energy.")) borg_self = user START_PROCESSING(SSobj, src) else STOP_PROCESSING(SSobj, src) - to_chat(user, "You stop processing the fluids from the [inserted_item.name].") + to_chat(user, span_notice("You stop processing the fluids from the [inserted_item.name].")) return /obj/item/milking_machine/pleasuremaw/process() diff --git a/modular_splurt/code/modules/mob/living/silicon/robot/robot.dm b/modular_splurt/code/modules/mob/living/silicon/robot/robot.dm index 7532f3a8f7..fa00e0ff44 100644 --- a/modular_splurt/code/modules/mob/living/silicon/robot/robot.dm +++ b/modular_splurt/code/modules/mob/living/silicon/robot/robot.dm @@ -41,3 +41,15 @@ laws = new /datum/ai_laws/slaver_override laws.associate(src) update_icons() + +/mob/living/silicon/robot/Initialize(mapload) + .=..() + AddComponent(/datum/component/personal_crafting) + + +/mob/living/silicon/robot/pick_module() + .=..() + var/datum/hud/R = hud_used + var/atom/movable/screen/craft/C = locate() in R.static_inventory + C.icon = 'icons/mob/screen_midnight.dmi' + C.screen_loc = "CENTER+5:5,SOUTH+1:5" diff --git a/modular_splurt/code/modules/mob/living/silicon/robot/robot_modules.dm b/modular_splurt/code/modules/mob/living/silicon/robot/robot_modules.dm index 16ddbdc8f5..710f4d4745 100644 --- a/modular_splurt/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/modular_splurt/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -265,7 +265,13 @@ var/list/extra = list( /obj/item/dogborg/jaws/small, /obj/item/analyzer/nose, - /obj/item/soap/tongue/scrubpup + /obj/item/soap/tongue/scrubpup, + /obj/item/gripper/service, + /obj/item/kitchen/rollingpin, + /obj/item/kitchen/unrollingpin, + /obj/item/kitchen/knife/butcher, + /obj/item/kitchen/efink, + /obj/item/kitchen/knife ) LAZYADD(basic_modules, extra) . = ..() diff --git a/modular_splurt/code/modules/mob/living/simple_animal/friendly/mouse.dm b/modular_splurt/code/modules/mob/living/simple_animal/friendly/mouse.dm index 509129a1ad..27129ba0db 100644 --- a/modular_splurt/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/modular_splurt/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -21,7 +21,7 @@ /mob/living/simple_animal/mouse/boommouse/death(gibbed, toast) var/turf/T = get_turf(src) message_admins("A boommouse explosion was triggered at [ADMIN_VERBOSEJMP(T)].") - visible_message("The boommouse violently explodes!") + visible_message(span_danger("The boommouse violently explodes!")) atmos_spawn_air("plasma=15;TEMP=750") explosion(src.loc, 0, 0, 2, 0, 1, 0, 2, 0, 0) qdel(src) @@ -32,7 +32,7 @@ if(istype(I, /obj/item/weldingtool)) var/obj/item/weldingtool/W = I if(W.welding) - user.visible_message("[user] burns the boommouse with [user.p_their()] [W.name]!", "That was stupid of you.") + user.visible_message(span_warning("[user] burns the boommouse with [user.p_their()] [W.name]!"), span_userdanger("That was stupid of you.")) var/message_admins = "[ADMIN_LOOKUPFLW(user)] triggered a boommouse explosion at [ADMIN_VERBOSEJMP(T)]." GLOB.bombers += message_admins message_admins(message_admins) diff --git a/modular_splurt/code/modules/mob/living/simple_animal/hostile/megafauna/sand.dm b/modular_splurt/code/modules/mob/living/simple_animal/hostile/megafauna/sand.dm new file mode 100644 index 0000000000..32c51c16a1 --- /dev/null +++ b/modular_splurt/code/modules/mob/living/simple_animal/hostile/megafauna/sand.dm @@ -0,0 +1,7 @@ +/mob/living/simple_animal/hostile/megafauna/sand + name = "Corrupted Mayhem" + desc = "The longer you look at this creature the more you feel your gut twist and you begin to feel sick..." + icon = 'modular_splurt/icons/mob/lavaland/mayhem_mega.dmi' + icon_state = "eva" + icon_living = "eva" + attack_sound = 'modular_splurt/sound/voice/ara-ara2.ogg' diff --git a/modular_splurt/code/modules/mob/mob.dm b/modular_splurt/code/modules/mob/mob.dm index c9a70933d3..2621165e97 100644 --- a/modular_splurt/code/modules/mob/mob.dm +++ b/modular_splurt/code/modules/mob/mob.dm @@ -40,4 +40,4 @@ . = examinate(A) if (.) return - to_chat(A, "[src] seems to be checking you out.") + to_chat(A, span_notice("[src] seems to be checking you out.")) diff --git a/modular_splurt/code/modules/mob/mob_helpers.dm b/modular_splurt/code/modules/mob/mob_helpers.dm index 111f9c35b7..f486b3a24c 100644 --- a/modular_splurt/code/modules/mob/mob_helpers.dm +++ b/modular_splurt/code/modules/mob/mob_helpers.dm @@ -16,7 +16,7 @@ // Check for Distant (no touch head!) if(HAS_TRAIT(src, TRAIT_DISTANT)) - . += "You sense [t_He] might be disturbed by physical affection.\n" + . += span_warning("You sense [t_He] might be disturbed by physical affection.") // Check for Heatpat Slut (pls touch head!) if(HAS_TRAIT(src, TRAIT_HEADPAT_SLUT)) - . += "You sense [t_He] appreciates receiving physical affection more than normal.\n" + . += span_info("You sense [t_He] appreciates receiving physical affection more than normal.") diff --git a/modular_splurt/code/modules/mob/say_vr.dm b/modular_splurt/code/modules/mob/say_vr.dm index cd49dd200c..56be623e0f 100644 --- a/modular_splurt/code/modules/mob/say_vr.dm +++ b/modular_splurt/code/modules/mob/say_vr.dm @@ -7,7 +7,7 @@ /datum/emote/living/narrate/proc/check_invalid(mob/user, input) if(stop_bad_mime.Find(input, 1, 1)) - to_chat(user, "Invalid emote.") + to_chat(user, span_danger("Invalid emote.")) return TRUE return FALSE @@ -28,7 +28,7 @@ return FALSE user.log_message(message, LOG_EMOTE) - message = "([user]) [message]" + message = span_name("([user]) [message]") for(var/mob/M in GLOB.dead_mob_list) if(!M.client || isnewplayer(M)) @@ -44,7 +44,7 @@ set name = "Narrate (Player)" set desc = "Narrate an action or event! An alternative to emoting, for when your emote shouldn't start with your name!" if(GLOB.say_disabled) - to_chat(usr, "Speech is currently admin-disabled.") + to_chat(usr, span_danger("Speech is currently admin-disabled.")) return message = trim(html_encode(message), MAX_MESSAGE_LEN) emote("narrate", message=message) diff --git a/modular_splurt/code/modules/mob/splurt_emotes.dm b/modular_splurt/code/modules/mob/splurt_emotes.dm index e7984093f1..7dc25f9c5d 100644 --- a/modular_splurt/code/modules/mob/splurt_emotes.dm +++ b/modular_splurt/code/modules/mob/splurt_emotes.dm @@ -30,7 +30,7 @@ /datum/emote/living/fart/run_emote(mob/living/user, params, type_override, intentional) if(TIMER_COOLDOWN_CHECK(user, COOLDOWN_EMOTE_FART)) - to_chat(user, "You try your hardest, but no shart comes out.") + to_chat(user, span_warning("You try your hardest, but no shart comes out.")) return var/list/fart_emotes = list( //cope goonies "lets out a girly little 'toot' from [user.p_their()] butt.", @@ -212,8 +212,8 @@ /datum/emote/living/bruh key = "bruh" - key_third_person = "thinks this is a bruh moment" - message = "thinks this is a bruh moment" + key_third_person = "bruhs" + message = "thinks this is a bruh moment." emote_type = EMOTE_AUDIBLE muzzle_ignore = FALSE restraint_check = FALSE @@ -378,7 +378,7 @@ /datum/emote/living/swaos key = "swaos" key_third_person = "swaos" - message = "mutters swaos" + message = "mutters swaos." emote_type = EMOTE_AUDIBLE muzzle_ignore = FALSE @@ -411,7 +411,7 @@ /datum/emote/living/eyebrow3 key = "eyebrow3" key_third_person = "eyebrows3" - message = "raises an eyebrow quizzaciously." + message = "raises an eyebrow quizzaciously." /datum/emote/living/eyebrow3/run_emote(mob/user, params, type_override, intentional) if(!(. = ..())) @@ -467,7 +467,7 @@ /datum/emote/living/laugh4 key = "laugh4" key_third_person = "laughs4" - message = "burst out a laugh." + message = "burst into laughter!" emote_type = EMOTE_AUDIBLE muzzle_ignore = FALSE @@ -497,7 +497,7 @@ /datum/emote/living/laugh6 key = "laugh6" key_third_person = "laughs6" - message = "sounds like a tea kettle." + message = "laughs like a kettle!" emote_type = EMOTE_AUDIBLE muzzle_ignore = FALSE @@ -553,7 +553,7 @@ /datum/emote/living/spoonful key = "spoonful" key_third_person = "spoonfuls" - message = "draws a comically large spoon." + message = "asks for a spoonful." emote_type = EMOTE_AUDIBLE muzzle_ignore = TRUE @@ -583,7 +583,7 @@ /datum/emote/living/whatthehell key = "wth" key_third_person = "wths" - message = "condemns the abysses of hell." + message = "condemns the abysses of hell!" emote_type = EMOTE_AUDIBLE muzzle_ignore = TRUE @@ -637,7 +637,7 @@ /datum/emote/living/illuminati key = "illuminati" key_third_person = "illuminatis" - message = "emits some X-files vibe" + message = "exudes a mysterious aura!" /datum/emote/living/illuminati/run_emote(mob/user, params, type_override, intentional) if(!(. = ..())) @@ -650,7 +650,7 @@ /datum/emote/living/bonerif key = "bonerif" key_third_person = "bonerifs" - message = "riffs" + message = "riffs!" /datum/emote/living/bonerif/run_emote(mob/user, params, type_override, intentional) if(!(. = ..())) @@ -679,7 +679,7 @@ /datum/emote/living/choir key = "choir" key_third_person = "choirs" - message = "let out a choir." + message = "let out a choir!" emote_type = EMOTE_AUDIBLE muzzle_ignore = FALSE @@ -694,7 +694,7 @@ /datum/emote/living/sicko key = "sicko" key_third_person = "sickos" - message = "briefly goes sicko mode." + message = "briefly goes sicko mode!" emote_type = EMOTE_AUDIBLE muzzle_ignore = FALSE @@ -709,7 +709,7 @@ /datum/emote/living/chill key = "chill" key_third_person = "chills" - message = "felt a chill running down their spine..." + message = "feels a chill running down their spine..." /datum/emote/living/chill/run_emote(mob/user, params, type_override, intentional) if(!(. = ..())) @@ -766,7 +766,7 @@ /datum/emote/living/snore/snore2 key = "snore2" - key_third_person = "snores" + key_third_person = "snores2" message = "lets out an earthshaking snore" /datum/emote/living/snore/snore2/run_emote(mob/user, params, type_override, intentional) @@ -836,7 +836,7 @@ /datum/emote/living/ara_ara key = "ara" key_third_person = "aras" - message = "seems sultrily surprised~" + message = "coos with sultry surprise~..." emote_type = EMOTE_AUDIBLE muzzle_ignore = FALSE var/voicesound = 'modular_splurt/sound/voice/ara-ara.ogg' @@ -857,7 +857,7 @@ /datum/emote/living/missouri key = "missouri" key_third_person = "missouris" - message = "appears to believe %THEYRE in Missouri" + message = "appears to believe %THEYRE in Missouri." emote_type = EMOTE_AUDIBLE muzzle_ignore = FALSE @@ -911,3 +911,21 @@ key = "facehoof" // For horse enthusiasts key_third_person = "facehoofs" metacarpus_type = "hoof" + +/datum/emote/living/poyo + key = "poyo" + key_third_person = "poyos" + message = "%SAYS, \"Poyo!\"" + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/poyo/run_emote(mob/user, params, type_override, intentional) + var/datum/dna/D = user.has_dna() + var/say_mod = (D ? D.species.say_mod : "says") + message = replacetextEx(message, "%SAYS", say_mod) + . = ..() + if(!.) + return + if(user.nextsoundemote >= world.time) + return + user.nextsoundemote = world.time + 1 SECONDS + playsound(user, 'modular_splurt/sound/voice/barks/poyo.ogg', 50, 1, -1) diff --git a/modular_splurt/code/modules/paperwork/pen.dm b/modular_splurt/code/modules/paperwork/pen.dm index e9e4d7c435..9176c4503c 100644 --- a/modular_splurt/code/modules/paperwork/pen.dm +++ b/modular_splurt/code/modules/paperwork/pen.dm @@ -12,7 +12,7 @@ if(!iscarbon(T)) //not carbon. return if(!T.is_chest_exposed()) - to_chat(user, "You cannot write on someone with their clothes on.") + to_chat(user, span_warning("You cannot write on someone with their clothes on.")) return var/obj/item/G = user:pick_receiving_organ(T, NONE, "Pick a genital to write on", "Cancel to write on the targeted body part") @@ -27,20 +27,20 @@ return if(!(user==T)) - src.visible_message("[user] begins to write on [T]'s [BP:name].") + src.visible_message(span_notice("[user] begins to write on [T]'s [BP:name].")) else - to_chat(user, "You begin to write on your [BP:name].") + to_chat(user, span_notice("You begin to write on your [BP:name].")) if(do_mob(user, T, 4 SECONDS)) if((length(BP:writtentext))+(length(writting)) < 100) //100 character limmit to stop spamming. BP:writtentext += html_encode(writting) //you can add to text, not remove it. else - to_chat(user, "There isnt enough space to write that on [T]'s [BP:name].") + to_chat(user, span_notice("There isnt enough space to write that on [T]'s [BP:name].")) return if(!(user==T)) - to_chat(user, "You write on [T]'s [BP:name].") + to_chat(user, span_notice("You write on [T]'s [BP:name].")) else - to_chat(user, "You write on your [BP:name].") + to_chat(user, span_notice("You write on your [BP:name].")) else . = ..() diff --git a/modular_splurt/code/modules/projectiles/guns/ballistic/automatic.dm b/modular_splurt/code/modules/projectiles/guns/ballistic/automatic.dm index 661f589d78..4ddd1b861e 100644 --- a/modular_splurt/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/modular_splurt/code/modules/projectiles/guns/ballistic/automatic.dm @@ -35,11 +35,11 @@ /obj/item/gun/ballistic/automatic/m2a1/examine(mob/user) . = ..() if(cover_open && magazine) - . += "It seems like you could use an empty hand to remove the magazine." + . += span_notice("It seems like you could use an empty hand to remove the magazine.") /obj/item/gun/ballistic/automatic/m2a1/attack_self(mob/user) cover_open = !cover_open - to_chat(user, "You [cover_open ? "open" : "close"] [src]'s cover.") + to_chat(user, span_notice("You [cover_open ? "open" : "close"] [src]'s cover.")) if(cover_open) playsound(user, 'sound/weapons/sawopen.ogg', 60, 1) else @@ -52,7 +52,7 @@ /obj/item/gun/ballistic/automatic/m2a1/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) if(cover_open) - to_chat(user, "[src]'s cover is open! Close it before firing!") + to_chat(user, span_warning("[src]'s cover is open! Close it before firing!")) else . = ..() update_icon() @@ -70,12 +70,12 @@ user.put_in_hands(magazine) magazine = null update_icon() - to_chat(user, "You remove the magazine from [src].") + to_chat(user, span_notice("You remove the magazine from [src].")) playsound(user, 'sound/weapons/magout.ogg', 60, 1) /obj/item/gun/ballistic/automatic/m2a1/attackby(obj/item/A, mob/user, params) if(!cover_open && istype(A, mag_type)) - to_chat(user, "[src]'s cover is closed! You can't insert a new mag.") + to_chat(user, span_warning("[src]'s cover is closed! You can't insert a new mag.")) return ..() @@ -108,7 +108,7 @@ if(auto_eject && magazine && magazine.stored_ammo && !magazine.stored_ammo.len && !chambered) magazine.dropped() user.visible_message( - "[magazine] flies out and clatters on the floor!", + span_warning("[magazine] flies out and clatters on the floor!"), to_chat("[magazine] flies out and clatters on the floor!") ) if(auto_eject_sound) diff --git a/modular_splurt/code/modules/projectiles/guns/ballistic/pistol.dm b/modular_splurt/code/modules/projectiles/guns/ballistic/pistol.dm index 7f1b75d548..dbfdae1d65 100644 --- a/modular_splurt/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/modular_splurt/code/modules/projectiles/guns/ballistic/pistol.dm @@ -21,16 +21,17 @@ flight_y_offset = 14 obj_flags = UNIQUE_RENAME - unique_reskin = list("Default" = "enforcer_black", - "M2611 Enforcer" = "cde", - "M1911 Enforcer" = "m1911", - "VP78 Enforcer" = "vp78", - "USP Enforcer" = "usp-m" - ) + unique_reskin = list( + "Default" = list("icon_state" = "enforcer_black"), + "M2611 Enforcer" = list("icon_state" = "cde"), + "M1911 Enforcer" = list("icon_state" = "m1911"), + "VP78 Enforcer" = list("icon_state" = "vp78"), + "USP Enforcer" = list("icon_state" = "usp-m") + ) /obj/item/gun/ballistic/automatic/pistol/enforcer/update_icon_state() if(current_skin) - icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"]" + icon_state = "[unique_reskin[current_skin]["icon_state"]][chambered ? "" : "-e"]" else icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" @@ -77,13 +78,14 @@ mag_type = /obj/item/ammo_box/magazine/m9 can_suppress = FALSE obj_flags = UNIQUE_RENAME - unique_reskin = list("Default" = "ninemil", - "Maria" = "maria" - ) + unique_reskin = list( + "Default" = list("icon_state" = "ninemil"), + "Maria" = list("icon_state" = "maria") + ) /obj/item/gun/ballistic/automatic/pistol/m9mmpistol/update_icon_state() if(current_skin) - icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"]" + icon_state = "[unique_reskin[current_skin]["icon_state"]][chambered ? "" : "-e"]" else icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" @@ -117,10 +119,11 @@ automatic_burst_overlay = FALSE obj_flags = UNIQUE_RENAME - unique_reskin = list("Default" = "deagle", - "Desert Eagle Gold" = "deagleg", - "Desert Eagle Camo" = "deaglecamo" - ) + unique_reskin = list( + "Default" = list("icon_state" = "deagle"), + "Desert Eagle Gold" = list("icon_state" = "deagleg"), + "Desert Eagle Camo" = list("icon_state" = "deaglecamo") + ) /obj/item/gun/ballistic/automatic/pistol/deagle2/update_overlays() . = ..() @@ -129,7 +132,7 @@ /obj/item/gun/ballistic/automatic/pistol/deagle2/update_icon_state() if(current_skin) - icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"]" + icon_state = "[unique_reskin[current_skin]["icon_state"]][chambered ? "" : "-e"]" else icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" diff --git a/modular_splurt/code/modules/projectiles/guns/ballistic/revolver.dm b/modular_splurt/code/modules/projectiles/guns/ballistic/revolver.dm index 26f5fa16fa..72e43741f7 100644 --- a/modular_splurt/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/modular_splurt/code/modules/projectiles/guns/ballistic/revolver.dm @@ -6,12 +6,12 @@ /obj/item/gun/ballistic/revolver/detective/Initialize() var/list/extra_reskin = list( - "Fitz Special" = "detective_fitz", - "Police Positive Special" = "detective_police", - "Blued Steel" = "detective_blued", - "Stainless Steel" = "detective_stainless", - "Deckard Revolver" = "detective_bladerunner" - ) + "Fitz Special" = list("icon_state" = "detective_fitz"), + "Police Positive Special" = list("icon_state" = "detective_police"), + "Blued Steel" = list("icon_state" = "detective_blued"), + "Stainless Steel" = list("icon_state" = "detective_stainless"), + "Deckard Revolver" = list("icon_state" = "detective_bladerunner") + ) LAZYADD(unique_reskin, extra_reskin) . = ..() @@ -30,10 +30,11 @@ mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev45l obj_flags = UNIQUE_RENAME - unique_reskin = list("Default" = "45revolver", - "Cowboy" = "357colt", - "Lucky" = "lucky" //Well do ya? - ) + unique_reskin = list( + "Default" = list("icon_state" = "45revolver"), + "Cowboy" = list("icon_state" = "357colt"), + "Lucky" = list("icon_state" = "lucky") //Well do ya? + ) /obj/item/gunpart/revolver22frame name = ".22 revolver frame" diff --git a/modular_splurt/code/modules/projectiles/guns/ballistic/shotgun.dm b/modular_splurt/code/modules/projectiles/guns/ballistic/shotgun.dm index 7a80a74759..480051c15a 100644 --- a/modular_splurt/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/modular_splurt/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -24,13 +24,14 @@ slot_flags = ITEM_SLOT_BELT mag_type = /obj/item/ammo_box/magazine/internal/shot/dual obj_flags = UNIQUE_RENAME - unique_reskin = list("Default" = "sawnshotgun", - "Dark Red Finish" = "sawnshotgun-d", - "Ash" = "sawnshotgun-f", - "Faded Grey" = "sawnshotgun-g", - "Maple" = "sawnshotgun-l", - "Rosewood" = "sawnshotgun-p" - ) + unique_reskin = list( + "Default" = list("icon_state" = "sawnshotgun"), + "Dark Red Finish" = list("icon_state" = "sawnshotgun-d"), + "Ash" = list("icon_state" = "sawnshotgun-f"), + "Faded Grey" = list("icon_state" = "sawnshotgun-g"), + "Maple" = list("icon_state" = "sawnshotgun-l"), + "Rosewood" = list("icon_state" = "sawnshotgun-p") + ) // Rifles @@ -103,7 +104,7 @@ if(recentpump > world.time) return if(IS_STAMCRIT(user))//CIT CHANGE - makes pumping shotguns impossible in stamina softcrit - to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto + to_chat(user, span_warning("You're too exhausted for that."))//CIT CHANGE - ditto return//CIT CHANGE - ditto pump(user, TRUE) if(HAS_TRAIT(user, TRAIT_FAST_PUMP)) diff --git a/modular_splurt/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/modular_splurt/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 7a2fbfa79b..0b7fc6f662 100644 --- a/modular_splurt/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/modular_splurt/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -11,18 +11,25 @@ glass_desc = "You feel it's not named like that for no reason." value = 6 +// Liquid Panty Dropper drink effect /datum/reagent/consumable/ethanol/panty_dropper/on_mob_life(mob/living/carbon/C) - var/mob/living/carbon/human/M = C - var/anyclothes = FALSE - var/items = M.get_contents() - for(var/obj/item/W in items) - if(W.body_parts_covered && ismob(W.loc)) - anyclothes = TRUE - M.dropItemToGround(W, TRUE) - playsound(M.loc, 'sound/items/poster_ripped.ogg', 50, 1) - if(anyclothes) - M.visible_message("[M] suddenly bursts out of [M.p_their()] clothes!") - return ..() + // Praise the funny BYOND dots + . = ..() + + // Check for client + if(C.client) + // Check target pref for ERP + if(C.client?.prefs.erppref == "No") + // Return without triggering + return + + // Check target pref for aphrodisiacs + if(C.client?.prefs.cit_toggles & NO_APHRO) + // Return without triggering + return + + // Perform drink effect + C.clothing_burst(C) /datum/reagent/consumable/ethanol/lean name = "Lean" @@ -54,7 +61,7 @@ if(!M.undergoing_cardiac_arrest() && M.can_heartattack() && prob(1)) M.set_heartattack(TRUE) if(M.stat == CONSCIOUS) - M.visible_message("[M] clutches at [M.p_their()] chest as if [M.p_their()] heart stopped!") // too much lean :( + M.visible_message(span_userdanger("[M] clutches at [M.p_their()] chest as if [M.p_their()] heart stopped!")) // too much lean :( ..() /datum/reagent/consumable/ethanol/cum_in_a_hot_tub @@ -147,12 +154,49 @@ boozepwr = 50 color = "#0919be" quality = DRINK_FANTASTIC + value = REAGENT_VALUE_AMAZING taste_description = "fuzz, warmth and comfort" glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "mothinchief" glass_name = "Moth in Chief" glass_desc = "A simple yet elegant drink, inspires confidence in even the most pessimistic of men. The mantle rests well upon your shoulders." + can_synth = FALSE; +//This drink gives the combined benefits of Stimulants, Regenerative Jelly, and Commander and Chief, and a mood buff similar to Copium; at least to an extent. +/datum/reagent/consumable/ethanol/commander_and_chief/on_mob_life(mob/living/carbon/M) + if(M.mind && HAS_TRAIT(M.mind, TRAIT_CAPTAIN_METABOLISM)) + M.heal_bodypart_damage(2,2,2) + M.adjustBruteLoss(-5,0) + M.adjustOxyLoss(-5,0) + M.adjustFireLoss(-5,0) + M.adjustToxLoss(-5,0,TRUE) //Heals Toxin Lovers + M.radiation = max(M.radiation - 25, 0) + . = 1 + else + //Commander and Chief Effects, no need to be captain to receive the effect + M.heal_bodypart_damage(2,2,2) + M.adjustBruteLoss(-3.5,0) + M.adjustOxyLoss(-3.5,0) + M.adjustFireLoss(-3.5,0) + M.adjustToxLoss(-3.5,0,TRUE) //Heals Toxin Lovers + M.radiation = max(M.radiation - 25, 0) + + //Stimulant Effects + M.AdjustAllImmobility(-60, FALSE) + M.AdjustUnconscious(-60, FALSE) + M.adjustStaminaLoss(-20*REAGENTS_EFFECT_MULTIPLIER, FALSE) + ..() + . = 1 + +/datum/reagent/medicine/stimulants/on_mob_metabolize(mob/living/L) + ..() + L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants) + ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type) + +/datum/reagent/medicine/stimulants/on_mob_end_metabolize(mob/living/L) + L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants) + REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type) + ..() // ~( Ported from TG )~ /datum/reagent/consumable/ethanol/curacao @@ -162,7 +206,6 @@ color = "#1a5fa1" quality = DRINK_NICE taste_description = "blue orange" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "curacao" glass_name = "glass of curaçao" glass_desc = "It's blue, da ba dee." @@ -185,7 +228,6 @@ color = "#1c0000" quality = DRINK_NICE taste_description = "spiced alcohol" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "bitters" glass_name = "glass of bitters" glass_desc = "Typically you'd want to mix this with something- but you do you." @@ -197,7 +239,6 @@ color = "#1F0001" quality = DRINK_VERYGOOD taste_description = "haughty arrogance" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "admiralty" glass_name = "Admiralty" glass_desc = "Hail to the Admiral, for he brings fair tidings, and rum too." @@ -209,7 +250,6 @@ color = "#8c5046" quality = DRINK_GOOD taste_description = "ginger and rum" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "dark_and_stormy" glass_name = "Dark and Stormy" glass_desc = "Thunder and lightning, very very frightening." @@ -221,7 +261,6 @@ color = "#c4b35c" quality = DRINK_VERYGOOD taste_description = "rum and spices" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "long_john_silver" glass_name = "Long John Silver" glass_desc = "Named for a famous pirate, who may or may not have been fictional. But hey, why let the truth get in the way of a good yarn?" @@ -233,7 +272,6 @@ color = "#003153" quality = DRINK_VERYGOOD taste_description = "companionship" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "long_haul" glass_name = "Long Haul" glass_desc = "A perfect companion for a lonely long haul flight." @@ -245,7 +283,6 @@ color = "#b4abd0" quality = DRINK_FANTASTIC taste_description = "salt and spice" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "salt_and_swell" glass_name = "Salt and Swell" glass_desc = "Ah, I do like to be beside the seaside." @@ -257,7 +294,6 @@ color = "#b4abd0" quality = DRINK_VERYGOOD taste_description = "spicy sour cheesy yoghurt" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "tich_toch" glass_name = "Tich Toch" glass_desc = "Oh god." @@ -269,7 +305,6 @@ color = "#F4EFE2" quality = DRINK_NICE taste_description = "sour cheesy yoghurt" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "tiltaellen" glass_name = "glass of tiltällen" glass_desc = "Eww... it's curdled." @@ -281,8 +316,45 @@ color = "#00bfa3" quality = DRINK_VERYGOOD taste_description = "the tropics" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "tropical_storm" glass_name = "Tropical Storm" glass_desc = "Less destructive than the real thing." +/datum/reagent/consumable/ethanol/skullfucker_deluxe + name = "Skullfucker Deluxe" + description = "The Rosewater secret to becoming psychotically retarded. It has many warning labels." + boozepwr = 75 + color = "#cb4d8b" + quality = DRINK_VERYGOOD + taste_description = "being violated by a tiny fish with crayons" + glass_icon = 'modular_splurt/icons/obj/drinks.dmi' + glass_icon_state = "skullfucker" + glass_name = "Skullfucker Deluxe" + glass_desc = "It has many warning labels, you might want to read them." + overdose_threshold = 25 + +/datum/reagent/consumable/ethanol/skullfucker_deluxe/on_mob_life(mob/living/carbon/C) + . = ..() + //Do nothing if they haven't metabolized enough + if(!current_cycle >= 15) + return + //Make them giggle + if(prob(40)) + C.emote("giggle") + //Make them jitter + if(prob(20)) + C.jitteriness = max(C.jitteriness, 30) + +/datum/reagent/consumable/ethanol/skullfucker_deluxe/overdose_process(mob/living/M) + . = ..() + //Do nothing if they're already fwuffy OwO + var/obj/item/organ/tongue/T = M.getorganslot(ORGAN_SLOT_TONGUE) + if(istype(T, /obj/item/organ/tongue/fluffy)) + return + + //Replace their tongue with a fwuffy one + var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/fluffy + T.Remove() + nT.Insert(M) + T.moveToNullspace()//To valhalla + to_chat(M, span_big_warning("Your tongue feels... weally fwuffy!!")) diff --git a/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 2eae220ba9..f483f1ec83 100644 --- a/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -2,7 +2,7 @@ /datum/reagent/drug/aphrodisiacplus/overdose_process(mob/living/M) if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO)) if(!HAS_TRAIT(M, TRAIT_IN_HEAT)) - to_chat(M, "Your need for sex is overpowering!") + to_chat(M, span_userlove("Your need for sex is overpowering!")) M.log_message("Made In Heat by hexacrocin.", LOG_EMOTE) ADD_TRAIT(M, TRAIT_IN_HEAT, APHRO_TRAIT) . = ..() @@ -47,20 +47,20 @@ return var/mob/living/carbon/human/H = M if (prob(10)) - to_chat(H, "You feel like you can cope!") + to_chat(H, span_notice("You feel like you can cope!")) H.adjust_disgust(-10) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "copium", /datum/mood_event/cope, name) . = 1 /datum/reagent/drug/copium/overdose_start(mob/living/M) - to_chat(M, "What the fuck.") + to_chat(M, span_userdanger("What the fuck.")) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/overdose, name) /datum/reagent/drug/copium/overdose_process(mob/living/M) var/mob/living/carbon/human/H = M if (prob(5)) H.adjust_disgust(20) - to_chat(H, "I can't stand it anymore!") + to_chat(H, span_warning("I can't stand it anymore!")) ..() /datum/reagent/drug/copium/reaction_obj(obj/O, volume) diff --git a/modular_splurt/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_splurt/code/modules/reagents/chemistry/reagents/enlargement.dm index e0bca79db0..863f93f7a8 100644 --- a/modular_splurt/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_splurt/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -68,7 +68,7 @@ B.color = SKINTONE2HEX(H.skin_tone) B.size = 1 B.size_cached = B.size - to_chat(M, "You feel your midsection get warmer... bubbling softly as it seems to start distending") + to_chat(M, span_warning("You feel your midsection get warmer... bubbling softly as it seems to start distending")) M.reagents.remove_reagent(type, 5) //If they have, increase size. if(B.size_cached < BELLY_SIZE_MAX) //just in case diff --git a/modular_splurt/code/modules/reagents/chemistry/reagents/other_reagents.dm b/modular_splurt/code/modules/reagents/chemistry/reagents/other_reagents.dm index f8d456ef05..e327fc1409 100644 --- a/modular_splurt/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/modular_splurt/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -28,16 +28,18 @@ /datum/reagent/blood/on_mob_life(mob/living/carbon/C) . = ..() - if(HAS_TRAIT(C,BLOODFLEDGE)) - C.adjust_nutrition(6) //3/4ed this, felt it was a bit too much - C.adjust_disgust(-3) //makes the churches effects easily negated + if(HAS_TRAIT(C,TRAIT_BLOODFLEDGE)) + C.adjust_nutrition(6) + C.adjust_disgust(-2) // Negates the chapel's disgust effect + C.adjustStaminaLoss(1) // Mitigates the chapel's stamina effect /datum/reagent/water/holywater/on_mob_life(mob/living/carbon/M) . = ..() - //makes holy water slightly disgusting and hungering for vampires - if(HAS_TRAIT(M,BLOODFLEDGE)) - M.adjust_disgust(1) - M.adjust_nutrition(-0.1) + // Makes holy water disgusting and hungering for bloodfledges + // Directly antithetic to the effects of blood + if(HAS_TRAIT(M,TRAIT_BLOODFLEDGE)) + M.adjust_disgust(2) + M.adjust_nutrition(-6) // Cursed blood effect moved here if(HAS_TRAIT(M, TRAIT_CURSED_BLOOD)) @@ -57,7 +59,7 @@ return // Character has a seisure - M.visible_message("[M] starts having a seizure!", "You have a seizure!") + M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!")) M.Unconscious(120) to_chat(M, "[pick("The moon is close. It will be a long hunt tonight.", "Ludwig, why have you forsaken me?", \ "The night is near its end...", "Fear the blood...")]") diff --git a/modular_splurt/code/modules/reagents/reagent_containers/borghydro.dm b/modular_splurt/code/modules/reagents/reagent_containers/borghydro.dm new file mode 100644 index 0000000000..3c3e062b0e --- /dev/null +++ b/modular_splurt/code/modules/reagents/reagent_containers/borghydro.dm @@ -0,0 +1,12 @@ +/obj/item/reagent_containers/borghypo/borgshaker/beershaker/Initialize() + var/list/extra_reagents = list( + /datum/reagent/consumable/ethanol/amaretto, + /datum/reagent/consumable/ethanol/applejack, + /datum/reagent/consumable/ethanol/curacao, + /datum/reagent/consumable/ethanol/hcider, + /datum/reagent/consumable/ethanol/navy_rum, + /datum/reagent/consumable/ethanol/sake, + /datum/reagent/consumable/ethanol + ) + LAZYADD(reagent_ids, extra_reagents) + . = ..() diff --git a/modular_splurt/code/modules/reagents/reagent_containers/bottle.dm b/modular_splurt/code/modules/reagents/reagent_containers/bottle.dm index 957cdb52e0..0aab11e5ec 100644 --- a/modular_splurt/code/modules/reagents/reagent_containers/bottle.dm +++ b/modular_splurt/code/modules/reagents/reagent_containers/bottle.dm @@ -3,3 +3,11 @@ desc = "A small bottle of Mute Toxin. It stops the user from speaking." icon_state = "bottle20" list_reagents = list(/datum/reagent/toxin/mutetoxin = 30) + +/obj/item/reagent_containers/glass/bottle/plushmium + name = "\improper Plushmium Bottle" + desc = "A small bottle of Plushmium. Seems almost fluffy, if not for it being a liquid." + icon_state = "bottle20" + list_reagents = list(/datum/reagent/fermi/plushmium = 5) + possible_transfer_amounts = list(5) + volume = 5 diff --git a/modular_splurt/code/modules/reagents/reagent_containers/spray.dm b/modular_splurt/code/modules/reagents/reagent_containers/spray.dm index df8895c430..01d0dbf5fc 100644 --- a/modular_splurt/code/modules/reagents/reagent_containers/spray.dm +++ b/modular_splurt/code/modules/reagents/reagent_containers/spray.dm @@ -1,2 +1,25 @@ /obj/item/reagent_containers/spray/chemsprayer/sleeper list_reagents = list(/datum/reagent/toxin/sodium_thiopental = 100, /datum/reagent/consumable/condensedcapsaicin = 100, /datum/reagent/toxin/chloralhydrate = 100) + +/obj/item/reagent_containers/spray/plushmium + name = "\improper Love to Life spray bottle" + desc = "A toy spray bottle marked with the Donk Co. Stuffing For Spessmen branding. Must be applied directly to a plush, and only contains enough for one." + icon_state = "cleaner_drying" + // Single use item! + volume = 5 + spray_range = 1 + can_fill_from_container = FALSE + amount_per_transfer_from_this = 5 + possible_transfer_amounts = list(5) + list_reagents = list(/datum/reagent/fermi/plushmium = 5) + +// Custom interaction to prevent wasting the item +/obj/item/reagent_containers/spray/plushmium/afterattack(atom/target, mob/user) + // Check for plush toy + if(!istype(target, /obj/item/toy/plush)) + // Alert user and return + to_chat(user, span_warning("You don't want to waste the solution on a non-plushie.")) + return + + // Return normally + . = ..() diff --git a/modular_splurt/code/modules/research/designs/bluespace_designs.dm b/modular_splurt/code/modules/research/designs/bluespace_designs.dm new file mode 100644 index 0000000000..e44e566a18 --- /dev/null +++ b/modular_splurt/code/modules/research/designs/bluespace_designs.dm @@ -0,0 +1,9 @@ +/datum/design/wallet_holding + name = "Wallet of Holding" + desc = "A wallet that opens into a tiny bluespace pocket." + id = "wallet_holding" + build_type = PROTOLATHE + materials = list(/datum/material/gold = 300, /datum/material/diamond = 100, /datum/material/bluespace = 200) + build_path = /obj/item/storage/wallet/bluespace + category = list("Bluespace Designs") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE diff --git a/modular_splurt/code/modules/research/designs/medical_designs.dm b/modular_splurt/code/modules/research/designs/medical_designs.dm index 225e9a88cf..e5228d97ec 100644 --- a/modular_splurt/code/modules/research/designs/medical_designs.dm +++ b/modular_splurt/code/modules/research/designs/medical_designs.dm @@ -18,6 +18,16 @@ category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_MEDICAL +/datum/design/implant_hide_backpack + name = "Storage Concealment Implant Case" + desc = "A glass case containing an implant" + id = "implant_hide_backpack" + build_type = PROTOLATHE + materials = list(/datum/material/glass = 500) + build_path = /obj/item/implantcase/hide_backpack + category = list("Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_MEDICAL + /datum/design/board/implantradio name = "Radio Implant Case" desc = "A glass case containing an implant" diff --git a/modular_splurt/code/modules/research/techweb/nodes/misc_nodes.dm b/modular_splurt/code/modules/research/techweb/nodes/biotech_nodes.dm similarity index 51% rename from modular_splurt/code/modules/research/techweb/nodes/misc_nodes.dm rename to modular_splurt/code/modules/research/techweb/nodes/biotech_nodes.dm index 7db0714874..ff81163de3 100644 --- a/modular_splurt/code/modules/research/techweb/nodes/misc_nodes.dm +++ b/modular_splurt/code/modules/research/techweb/nodes/biotech_nodes.dm @@ -1,3 +1,3 @@ -/datum/techweb_node/datatheory/New() +/datum/techweb_node/biotech/New() design_ids += "sex_research" . = ..() diff --git a/modular_splurt/code/modules/research/techweb/nodes/bluespace_nodes.dm b/modular_splurt/code/modules/research/techweb/nodes/bluespace_nodes.dm index f623c07465..e31c788453 100644 --- a/modular_splurt/code/modules/research/techweb/nodes/bluespace_nodes.dm +++ b/modular_splurt/code/modules/research/techweb/nodes/bluespace_nodes.dm @@ -6,3 +6,16 @@ prereq_ids = list("adv_power", "adv_bluespace","bluespace_power") design_ids = list("bluespace_cell_reactor") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + +// Bags of holding node +/datum/techweb_node/bluespace_holding/New() + // Define extra designs + var/list/added_designs = list( + "wallet_holding" + ) + + // Add designs to the list + LAZYADD(design_ids, added_designs) + + // Return + . = ..() diff --git a/modular_splurt/code/modules/research/techweb/nodes/medical_nodes.dm b/modular_splurt/code/modules/research/techweb/nodes/medical_nodes.dm index 055abbde37..eeb846271f 100644 --- a/modular_splurt/code/modules/research/techweb/nodes/medical_nodes.dm +++ b/modular_splurt/code/modules/research/techweb/nodes/medical_nodes.dm @@ -1,7 +1,8 @@ /datum/techweb_node/subdermal_implants/New() var/list/extra_designs = list( "implant_gfluid", - "implant_slave" + "implant_slave", + "implant_hide_backpack" ) LAZYADD(design_ids, extra_designs) . = ..() diff --git a/modular_splurt/code/modules/ruins/objects_and_mobs/ash_walker_den.dm b/modular_splurt/code/modules/ruins/objects_and_mobs/ash_walker_den.dm index 8db7b84798..4222037096 100644 --- a/modular_splurt/code/modules/ruins/objects_and_mobs/ash_walker_den.dm +++ b/modular_splurt/code/modules/ruins/objects_and_mobs/ash_walker_den.dm @@ -8,7 +8,7 @@ if(meat_counter < ASH_WALKER_SPAWN_THRESHOLD) return new spawned_obj(get_step(loc, pick(GLOB.alldirs)), ashies) - visible_message("One of the eggs swells to an unnatural size and tumbles free. It's ready to hatch!") + visible_message(span_danger("One of the eggs swells to an unnatural size and tumbles free. It's ready to hatch!")) meat_counter -= ASH_WALKER_SPAWN_THRESHOLD /obj/structure/lavaland/ash_walker/western diff --git a/modular_splurt/code/modules/smithing/anvil.dm b/modular_splurt/code/modules/smithing/anvil.dm index 60d323f7b8..497fb9db51 100644 --- a/modular_splurt/code/modules/smithing/anvil.dm +++ b/modular_splurt/code/modules/smithing/anvil.dm @@ -11,4 +11,4 @@ if(isdwarf(user)) return ..() else - to_chat(user, "Ugh! This anvil smells of mushroom beer, and the design is weird. It is inconvenient to use it!") + to_chat(user, span_warning("Ugh! This anvil smells of mushroom beer, and the design is weird. It is inconvenient to use it!")) diff --git a/modular_splurt/code/modules/surgery/organs/augments_arms.dm b/modular_splurt/code/modules/surgery/organs/augments_arms.dm index d49fe172f5..aa7db49438 100644 --- a/modular_splurt/code/modules/surgery/organs/augments_arms.dm +++ b/modular_splurt/code/modules/surgery/organs/augments_arms.dm @@ -24,3 +24,17 @@ w_class = WEIGHT_CLASS_BULKY sharpness = SHARP_POINTY attack_verb = list("slashed", "cut") + +// Synth power cord interaction override +/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + // Define user + var/mob/living/carbon/human/cord_user = user + + // Check for bloodfledge + if(HAS_TRAIT(cord_user, TRAIT_BLOODFLEDGE)) + // Warn user and return + to_chat(cord_user, span_warning("You try to siphon energy from [target], but a sanguine force prevents you from absorbing any charge!")) + return + + // Return normally + . = ..() diff --git a/modular_splurt/code/modules/toys/cards.dm b/modular_splurt/code/modules/toys/cards.dm index 83796639e5..2a0d13b780 100644 --- a/modular_splurt/code/modules/toys/cards.dm +++ b/modular_splurt/code/modules/toys/cards.dm @@ -4,7 +4,7 @@ /obj/item/toy/cards/deck/examine() . = ..() - . += "Alt-click [src] to remove joker cards." + . += span_notice("Alt-click [src] to remove joker cards.") /obj/item/toy/cards/deck/populate_deck() . = ..() @@ -16,9 +16,9 @@ return var/jokermono = cards.Remove("Monochrome Joker") var/jokercolor = cards.Remove("Colorful Joker") - user.visible_message("[user] searches through the deck to remove joker cards.", "You search through the deck to remove joker cards.") + user.visible_message("[user] searches through the deck to remove joker cards.", span_notice("You search through the deck to remove joker cards.")) if(!(jokermono || jokercolor)) - to_chat(user, "There are no joker cards to remove!") + to_chat(user, span_warning("There are no joker cards to remove!")) return if(jokermono && jokercolor) var/obj/item/toy/cards/singlecard/H1 = new/obj/item/toy/cards/singlecard(user.loc) diff --git a/modular_splurt/code/modules/vehicles/mecha/mecha_construction_paths.dm b/modular_splurt/code/modules/vehicles/mecha/mecha_construction_paths.dm index 62fda40862..4892cc940a 100644 --- a/modular_splurt/code/modules/vehicles/mecha/mecha_construction_paths.dm +++ b/modular_splurt/code/modules/vehicles/mecha/mecha_construction_paths.dm @@ -33,100 +33,100 @@ //TODO: better messages. switch(index) if(1) - user.visible_message("[user] connects [parent] hydraulic systems.", "You connect [parent] hydraulic systems.") + user.visible_message(span_notice("[user] connects [parent] hydraulic systems."), span_notice("You connect [parent] hydraulic systems.")) if(2) if(diff==FORWARD) - user.visible_message("[user] activates [parent] hydraulic systems.", "You activate [parent] hydraulic systems.") + user.visible_message(span_notice("[user] activates [parent] hydraulic systems."), span_notice("You activate [parent] hydraulic systems.")) else - user.visible_message("[user] disconnects [parent] hydraulic systems.", "You disconnect [parent] hydraulic systems.") + user.visible_message(span_notice("[user] disconnects [parent] hydraulic systems."), span_notice("You disconnect [parent] hydraulic systems.")) if(3) if(diff==FORWARD) - user.visible_message("[user] adds the wiring to [parent].", "You add the wiring to [parent].") + user.visible_message(span_notice("[user] adds the wiring to [parent]."), span_notice("You add the wiring to [parent].")) else - user.visible_message("[user] deactivates [parent] hydraulic systems.", "You deactivate [parent] hydraulic systems.") + user.visible_message(span_notice("[user] deactivates [parent] hydraulic systems."), span_notice("You deactivate [parent] hydraulic systems.")) if(4) if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of [parent].", "You adjust the wiring of [parent].") + user.visible_message(span_notice("[user] adjusts the wiring of [parent]."), span_notice("You adjust the wiring of [parent].")) else - user.visible_message("[user] removes the wiring from [parent].", "You remove the wiring from [parent].") + user.visible_message(span_notice("[user] removes the wiring from [parent]."), span_notice("You remove the wiring from [parent].")) if(5) if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) else - user.visible_message("[user] disconnects the wiring of [parent].", "You disconnect the wiring of [parent].") + user.visible_message(span_notice("[user] disconnects the wiring of [parent]."), span_notice("You disconnect the wiring of [parent].")) if(6) if(diff==FORWARD) - user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + user.visible_message(span_notice("[user] secures the mainboard."), span_notice("You secure the mainboard.")) else - user.visible_message("[user] removes the central control module from [parent].", "You remove the central computer mainboard from [parent].") + user.visible_message(span_notice("[user] removes the central control module from [parent]."), span_notice("You remove the central computer mainboard from [parent].")) if(7) if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) else - user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + user.visible_message(span_notice("[user] unfastens the mainboard."), span_notice("You unfasten the mainboard.")) if(8) if(diff==FORWARD) - user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + user.visible_message(span_notice("[user] secures the peripherals control module."), span_notice("You secure the peripherals control module.")) else - user.visible_message("[user] removes the peripherals control module from [parent].", "You remove the peripherals control module from [parent].") + user.visible_message(span_notice("[user] removes the peripherals control module from [parent]."), span_notice("You remove the peripherals control module from [parent].")) if(9) if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) else - user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + user.visible_message(span_notice("[user] unfastens the peripherals control module."), span_notice("You unfasten the peripherals control module.")) if(10) if(diff==FORWARD) - user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") + user.visible_message(span_notice("[user] secures the scanner module."), span_notice("You secure the scanner module.")) else - user.visible_message("[user] removes the scanner module from [parent].", "You remove the scanner module from [parent].") + user.visible_message(span_notice("[user] removes the scanner module from [parent]."), span_notice("You remove the scanner module from [parent].")) if(11) if(diff==FORWARD) - user.visible_message("[user] installs [I] to [parent].", "You install [I] to [parent].") + user.visible_message(span_notice("[user] installs [I] to [parent]."), span_notice("You install [I] to [parent].")) else - user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") + user.visible_message(span_notice("[user] unfastens the scanner module."), span_notice("You unfasten the scanner module.")) if(12) if(diff==FORWARD) - user.visible_message("[user] secures the capacitor.", "You secure the capacitor.") + user.visible_message(span_notice("[user] secures the capacitor."), span_notice("You secure the capacitor.")) else - user.visible_message("[user] removes the capacitor from [parent].", "You remove the capacitor from [parent].") + user.visible_message(span_notice("[user] removes the capacitor from [parent]."), span_notice("You remove the capacitor from [parent].")) if(13) if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", "You install [I] into [parent].") + user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) else - user.visible_message("[user] unfastens the capacitor.", "You unfasten the capacitor.") + user.visible_message(span_notice("[user] unfastens the capacitor."), span_notice("You unfasten the capacitor.")) if(14) if(diff==FORWARD) - user.visible_message("[user] secures the power cell.", "You secure the power cell.") + user.visible_message(span_notice("[user] secures the power cell."), span_notice("You secure the power cell.")) else - user.visible_message("[user] pries the power cell from [parent].", "You pry the power cell from [parent].") + user.visible_message(span_notice("[user] pries the power cell from [parent]."), span_notice("You pry the power cell from [parent].")) if(15) if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to [parent].", "You install the internal armor layer to [parent].") + user.visible_message(span_notice("[user] installs the internal armor layer to [parent]."), span_notice("You install the internal armor layer to [parent].")) else - user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") + user.visible_message(span_notice("[user] unfastens the power cell."), span_notice("You unfasten the power cell.")) if(16) if(diff==FORWARD) - user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") + user.visible_message(span_notice("[user] secures the internal armor layer."), span_notice("You secure the internal armor layer.")) else - user.visible_message("[user] pries internal armor layer from [parent].", "You pry internal armor layer from [parent].") + user.visible_message(span_notice("[user] pries internal armor layer from [parent]."), span_notice("You pry internal armor layer from [parent].")) if(17) if(diff==FORWARD) - user.visible_message("[user] welds the internal armor layer to [parent].", "You weld the internal armor layer to [parent].") + user.visible_message(span_notice("[user] welds the internal armor layer to [parent]."), span_notice("You weld the internal armor layer to [parent].")) else - user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") + user.visible_message(span_notice("[user] unfastens the internal armor layer."), span_notice("You unfasten the internal armor layer.")) if(18) if(diff==FORWARD) - user.visible_message("[user] installs the external armor layer to [parent].", "You install the external reinforced armor layer to [parent].") + user.visible_message(span_notice("[user] installs the external armor layer to [parent]."), span_notice("You install the external reinforced armor layer to [parent].")) else - user.visible_message("[user] cuts the internal armor layer from [parent].", "You cut the internal armor layer from [parent].") + user.visible_message(span_notice("[user] cuts the internal armor layer from [parent]."), span_notice("You cut the internal armor layer from [parent].")) if(19) if(diff==FORWARD) - user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") + user.visible_message(span_notice("[user] secures the external armor layer."), span_notice("You secure the external reinforced armor layer.")) else - user.visible_message("[user] pries the external armor layer from [parent].", "You pry the external armor layer from [parent].") + user.visible_message(span_notice("[user] pries the external armor layer from [parent]."), span_notice("You pry the external armor layer from [parent].")) if(20) if(diff==FORWARD) - user.visible_message("[user] welds the external armor layer to [parent].", "You weld the external armor layer to [parent].") + user.visible_message(span_notice("[user] welds the external armor layer to [parent]."), span_notice("You weld the external armor layer to [parent].")) else - user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") + user.visible_message(span_notice("[user] unfastens the external armor layer."), span_notice("You unfasten the external armor layer.")) return TRUE diff --git a/modular_splurt/code/modules/vending/kinkmate.dm b/modular_splurt/code/modules/vending/kinkmate.dm index 69c67b15cc..1d2f3c5a94 100644 --- a/modular_splurt/code/modules/vending/kinkmate.dm +++ b/modular_splurt/code/modules/vending/kinkmate.dm @@ -24,6 +24,7 @@ /obj/item/clothing/neck/syntech/collar = 4, /obj/item/storage/fancy/jellybean_pack = 5, /obj/item/storage/box/aphrodisiac_pump = 5, + /obj/item/storage/box/bulk_condoms = 10, /obj/item/strapon_strap = 5, /obj/item/restraints/bondage_rope = 5, /obj/item/clothing/under/domina = 5, @@ -40,7 +41,8 @@ /obj/item/mesmetron = 3, /obj/item/dildo/flared/huge = 3, /obj/item/clothing/neck/petcollar/locked/holo = 2, - /obj/item/storage/box/aphrodisiac_pump/plus = 3 + /obj/item/storage/box/aphrodisiac_pump/plus = 3, + /obj/item/storage/box/implant_disrobe = 3 ) var/list/extra_premium = list( /obj/item/clothing/mask/muzzle/ballgag = 3 diff --git a/modular_splurt/code/modules/vending/security.dm b/modular_splurt/code/modules/vending/security.dm index 8d088e9adb..e6d78f958f 100644 --- a/modular_splurt/code/modules/vending/security.dm +++ b/modular_splurt/code/modules/vending/security.dm @@ -5,7 +5,10 @@ /obj/item/clothing/suit/armor/vest/peacekeeper = 5, /obj/item/clothing/suit/armor/vest/metrocop = 2, /obj/item/clothing/head/helmet/metrocop = 2, - /obj/item/storage/bag/security = 5 + /obj/item/storage/bag/security = 5, + /obj/item/clothing/head/helmet/blueshirt = 5, + /obj/item/clothing/under/rank/security/officer/blueshirt = 5, + /obj/item/clothing/suit/armor/vest/blueshirt = 5 ) var/list/extra_contraband = list( /obj/item/storage/belt/slut = 5, @@ -20,6 +23,13 @@ ) LAZYADD(products, extra_products) LAZYADD(contraband, extra_contraband) + + var/list/rem_premium = list( + /obj/item/clothing/head/helmet/blueshirt, + /obj/item/clothing/under/rank/security/officer/blueshirt, + /obj/item/clothing/suit/armor/vest/blueshirt + ) + LAZYREMOVE(premium, rem_premium) . = ..() /obj/machinery/vending/wardrobe/sec_wardrobe/Initialize() diff --git a/modular_splurt/icons/mob/64_mutant_bodyparts.dmi b/modular_splurt/icons/mob/64_mutant_bodyparts.dmi new file mode 100644 index 0000000000..d90167d4ef Binary files /dev/null and b/modular_splurt/icons/mob/64_mutant_bodyparts.dmi differ diff --git a/modular_splurt/icons/mob/actions/misc_actions.dmi b/modular_splurt/icons/mob/actions/misc_actions.dmi index 17b53a319a..dc254301e7 100644 Binary files a/modular_splurt/icons/mob/actions/misc_actions.dmi and b/modular_splurt/icons/mob/actions/misc_actions.dmi differ diff --git a/modular_splurt/icons/mob/clothing/32x48_head.dmi b/modular_splurt/icons/mob/clothing/32x48_head.dmi new file mode 100644 index 0000000000..d34f1f1e0c Binary files /dev/null and b/modular_splurt/icons/mob/clothing/32x48_head.dmi differ diff --git a/modular_splurt/icons/mob/clothing/64_back.dmi b/modular_splurt/icons/mob/clothing/64_back.dmi new file mode 100644 index 0000000000..89f7890040 Binary files /dev/null and b/modular_splurt/icons/mob/clothing/64_back.dmi differ diff --git a/modular_splurt/icons/mob/inhands/weapons/melee_lefthand.dmi b/modular_splurt/icons/mob/inhands/weapons/melee_lefthand.dmi index 93508f584a..751e41c260 100644 Binary files a/modular_splurt/icons/mob/inhands/weapons/melee_lefthand.dmi and b/modular_splurt/icons/mob/inhands/weapons/melee_lefthand.dmi differ diff --git a/modular_splurt/icons/mob/inhands/weapons/melee_righthand.dmi b/modular_splurt/icons/mob/inhands/weapons/melee_righthand.dmi index 71d886823e..da23681d2a 100644 Binary files a/modular_splurt/icons/mob/inhands/weapons/melee_righthand.dmi and b/modular_splurt/icons/mob/inhands/weapons/melee_righthand.dmi differ diff --git a/modular_splurt/icons/mob/lavaland/mayhem_mega.dmi b/modular_splurt/icons/mob/lavaland/mayhem_mega.dmi new file mode 100644 index 0000000000..9179698a8e Binary files /dev/null and b/modular_splurt/icons/mob/lavaland/mayhem_mega.dmi differ diff --git a/modular_splurt/icons/mob/mam_markings.dmi b/modular_splurt/icons/mob/mam_markings.dmi index 0ce5f4c425..8d2ca68181 100644 Binary files a/modular_splurt/icons/mob/mam_markings.dmi and b/modular_splurt/icons/mob/mam_markings.dmi differ diff --git a/modular_splurt/icons/mob/mam_snouts.dmi b/modular_splurt/icons/mob/mam_snouts.dmi index 3b4850f4ca..fb6071b8c2 100644 Binary files a/modular_splurt/icons/mob/mam_snouts.dmi and b/modular_splurt/icons/mob/mam_snouts.dmi differ diff --git a/modular_splurt/icons/mob/mam_taur.dmi b/modular_splurt/icons/mob/mam_taur.dmi index ba18519f8d..009148695d 100644 Binary files a/modular_splurt/icons/mob/mam_taur.dmi and b/modular_splurt/icons/mob/mam_taur.dmi differ diff --git a/modular_splurt/icons/mobs/suits.dmi b/modular_splurt/icons/mobs/suits.dmi index 1369bc912a..57f709fdbb 100644 Binary files a/modular_splurt/icons/mobs/suits.dmi and b/modular_splurt/icons/mobs/suits.dmi differ diff --git a/modular_splurt/icons/obj/card.dmi b/modular_splurt/icons/obj/card.dmi new file mode 100644 index 0000000000..6c7eaeb624 Binary files /dev/null and b/modular_splurt/icons/obj/card.dmi differ diff --git a/modular_splurt/icons/obj/clothing/hats.dmi b/modular_splurt/icons/obj/clothing/hats.dmi index 472ff0cb1b..7af75114a5 100644 Binary files a/modular_splurt/icons/obj/clothing/hats.dmi and b/modular_splurt/icons/obj/clothing/hats.dmi differ diff --git a/modular_splurt/icons/obj/clothing/suits.dmi b/modular_splurt/icons/obj/clothing/suits.dmi index 418f999575..de921cc6bd 100644 Binary files a/modular_splurt/icons/obj/clothing/suits.dmi and b/modular_splurt/icons/obj/clothing/suits.dmi differ diff --git a/modular_splurt/icons/obj/drinks.dmi b/modular_splurt/icons/obj/drinks.dmi index 91ad1df14e..a1541fddb1 100644 Binary files a/modular_splurt/icons/obj/drinks.dmi and b/modular_splurt/icons/obj/drinks.dmi differ diff --git a/modular_splurt/icons/obj/genitals/butt_onmob.dmi b/modular_splurt/icons/obj/genitals/butt_onmob.dmi index 3dfc27316a..4cf7ee313e 100644 Binary files a/modular_splurt/icons/obj/genitals/butt_onmob.dmi and b/modular_splurt/icons/obj/genitals/butt_onmob.dmi differ diff --git a/modular_splurt/icons/obj/items_and_weapons.dmi b/modular_splurt/icons/obj/items_and_weapons.dmi index b0c383513b..0dd0e88c6a 100644 Binary files a/modular_splurt/icons/obj/items_and_weapons.dmi and b/modular_splurt/icons/obj/items_and_weapons.dmi differ diff --git a/modular_splurt/icons/obj/plushes.dmi b/modular_splurt/icons/obj/plushes.dmi index fce9b88804..a8ce5f21fd 100644 Binary files a/modular_splurt/icons/obj/plushes.dmi and b/modular_splurt/icons/obj/plushes.dmi differ diff --git a/modular_splurt/icons/obj/storage.dmi b/modular_splurt/icons/obj/storage.dmi index 1b8f40e8a0..6ff028b18c 100644 Binary files a/modular_splurt/icons/obj/storage.dmi and b/modular_splurt/icons/obj/storage.dmi differ diff --git a/modular_splurt/icons/obj/structures/statue.dmi b/modular_splurt/icons/obj/structures/statue.dmi index d933259adc..358c6c21ed 100644 Binary files a/modular_splurt/icons/obj/structures/statue.dmi and b/modular_splurt/icons/obj/structures/statue.dmi differ diff --git a/modular_splurt/sound/misc/dog_toy.ogg b/modular_splurt/sound/misc/dog_toy.ogg new file mode 100644 index 0000000000..de295dc148 Binary files /dev/null and b/modular_splurt/sound/misc/dog_toy.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 1b2fad4126..2934a0f4e0 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -156,6 +156,7 @@ #include "code\__DEFINES\dcs\flags.dm" #include "code\__DEFINES\dcs\helpers.dm" #include "code\__DEFINES\dcs\signals.dm" +#include "code\__DEFINES\dcs\signals\signals_movable.dm" #include "code\__DEFINES\dcs\signals\signals_subsystem.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_movement.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_living.dm" @@ -240,6 +241,7 @@ #include "code\__SANDCODE\DEFINES\runechat_defines.dm" #include "code\__SANDCODE\DEFINES\signals.dm" #include "code\__SANDCODE\DEFINES\sizecode.dm" +#include "code\__SANDCODE\DEFINES\spans.dm" #include "code\__SANDCODE\DEFINES\status_effects.dm" #include "code\__SANDCODE\DEFINES\strippable.dm" #include "code\__SANDCODE\DEFINES\subsystems.dm" @@ -728,6 +730,7 @@ #include "code\datums\elements\bed_tucking.dm" #include "code\datums\elements\bsa_blocker.dm" #include "code\datums\elements\cleaning.dm" +#include "code\datums\elements\connect_loc.dm" #include "code\datums\elements\decal.dm" #include "code\datums\elements\dusts_on_catatonia.dm" #include "code\datums\elements\dusts_on_leaving_area.dm" @@ -740,6 +743,7 @@ #include "code\datums\elements\forced_gravity.dm" #include "code\datums\elements\ghost_role_eligibility.dm" #include "code\datums\elements\mob_holder.dm" +#include "code\datums\elements\object_reskinning.dm" #include "code\datums\elements\photosynthesis.dm" #include "code\datums\elements\polychromic.dm" #include "code\datums\elements\scavenging.dm" @@ -2078,6 +2082,7 @@ #include "code\modules\clothing\glasses\engine_goggles.dm" #include "code\modules\clothing\glasses\hud.dm" #include "code\modules\clothing\glasses\phantomthief.dm" +#include "code\modules\clothing\glasses\prescription_kit.dm" #include "code\modules\clothing\gloves\_gloves.dm" #include "code\modules\clothing\gloves\boxing.dm" #include "code\modules\clothing\gloves\color.dm" @@ -3367,6 +3372,7 @@ #include "code\modules\reagents\reagent_containers\spray.dm" #include "code\modules\reagents\reagent_containers\syringes.dm" #include "code\modules\recycling\conveyor2.dm" +#include "code\modules\recycling\conveyor_sorter.dm" #include "code\modules\recycling\sortingmachinery.dm" #include "code\modules\recycling\disposal\bin.dm" #include "code\modules\recycling\disposal\construction.dm" @@ -3921,6 +3927,7 @@ #include "modular_citadel\code\modules\vectorcrafts\vectortruck.dm" #include "modular_citadel\code\modules\vectorcrafts\vectorvariants.dm" #include "modular_sand\code\_globalvars\bitfields.dm" +#include "modular_sand\code\_globalvars\lists\lewd_content.dm" #include "modular_sand\code\_globalvars\lists\misc.dm" #include "modular_sand\code\_globalvars\lists\objects.dm" #include "modular_sand\code\_onclick\hud\hud.dm" @@ -3940,6 +3947,7 @@ #include "modular_sand\code\datums\components\storage\concrete\dresser.dm" #include "modular_sand\code\datums\diseases\advance\symptoms\species.dm" #include "modular_sand\code\datums\elements\holder_micro.dm" +#include "modular_sand\code\datums\elements\skirt_peeking.dm" #include "modular_sand\code\datums\interactions\_interaction.dm" #include "modular_sand\code\datums\interactions\interaction_interface.dm" #include "modular_sand\code\datums\interactions\interaction_mob.dm" @@ -3983,6 +3991,7 @@ #include "modular_sand\code\game\machinery\cryopod.dm" #include "modular_sand\code\game\machinery\cryptominers.dm" #include "modular_sand\code\game\machinery\Sleeper.dm" +#include "modular_sand\code\game\machinery\computer\cloning.dm" #include "modular_sand\code\game\machinery\computer\arcade\tetris.dm" #include "modular_sand\code\game\machinery\pipe\construction.dm" #include "modular_sand\code\game\machinery\telecomms\machine_interactions.dm" @@ -4002,6 +4011,7 @@ #include "modular_sand\code\game\objects\items\extinguisher.dm" #include "modular_sand\code\game\objects\items\fleshlight.dm" #include "modular_sand\code\game\objects\items\miscellaneous.dm" +#include "modular_sand\code\game\objects\items\plushes.dm" #include "modular_sand\code\game\objects\items\circuitboards\computer_circuitboards.dm" #include "modular_sand\code\game\objects\items\circuitboards\machine_circuitboards.dm" #include "modular_sand\code\game\objects\items\devices\dogborg_sleeper.dm" @@ -4054,6 +4064,7 @@ #include "modular_sand\code\modules\arousal\arousal.dm" #include "modular_sand\code\modules\arousal\creampie.dm" #include "modular_sand\code\modules\arousal\genital_sprite_accessories.dm" +#include "modular_sand\code\modules\arousal\genitals.dm" #include "modular_sand\code\modules\arousal\organs\breasts.dm" #include "modular_sand\code\modules\arousal\organs\womb.dm" #include "modular_sand\code\modules\atmospherics\machinery\pipes\bluespace.dm" @@ -4072,6 +4083,7 @@ #include "modular_sand\code\modules\client\preferences_savefile.dm" #include "modular_sand\code\modules\client\loadout\_security.dm" #include "modular_sand\code\modules\client\loadout\accessories.dm" +#include "modular_sand\code\modules\client\loadout\backpack.dm" #include "modular_sand\code\modules\client\loadout\boxers.dm" #include "modular_sand\code\modules\client\loadout\hands.dm" #include "modular_sand\code\modules\client\loadout\head.dm" @@ -4092,22 +4104,9 @@ #include "modular_sand\code\modules\clothing\spacesuits\chronosuit.dm" #include "modular_sand\code\modules\clothing\spacesuits\hardsuit.dm" #include "modular_sand\code\modules\clothing\suits\miscellaneous.dm" -#include "modular_sand\code\modules\clothing\under\color.dm" +#include "modular_sand\code\modules\clothing\under\_under.dm" #include "modular_sand\code\modules\clothing\under\costumes.dm" -#include "modular_sand\code\modules\clothing\under\misc.dm" -#include "modular_sand\code\modules\clothing\under\skirt_dress.dm" -#include "modular_sand\code\modules\clothing\under\suits.dm" -#include "modular_sand\code\modules\clothing\under\syndicate.dm" #include "modular_sand\code\modules\clothing\under\uniform.dm" -#include "modular_sand\code\modules\clothing\under\jobs\cargo.dm" -#include "modular_sand\code\modules\clothing\under\jobs\civilian.dm" -#include "modular_sand\code\modules\clothing\under\jobs\command.dm" -#include "modular_sand\code\modules\clothing\under\jobs\curator.dm" -#include "modular_sand\code\modules\clothing\under\jobs\engineering.dm" -#include "modular_sand\code\modules\clothing\under\jobs\medical.dm" -#include "modular_sand\code\modules\clothing\under\jobs\research.dm" -#include "modular_sand\code\modules\clothing\under\jobs\security.dm" -#include "modular_sand\code\modules\clothing\under\jobs\theater.dm" #include "modular_sand\code\modules\clothing\underwear\_underwear.dm" #include "modular_sand\code\modules\clothing\underwear\boxers.dm" #include "modular_sand\code\modules\clothing\underwear\shirts.dm" @@ -4150,13 +4149,15 @@ #include "modular_sand\code\modules\mob\living\carbon\carbon.dm" #include "modular_sand\code\modules\mob\living\carbon\life.dm" #include "modular_sand\code\modules\mob\living\carbon\show.dm" -#include "modular_sand\code\modules\mob\living\carbon\human\examine.dm" #include "modular_sand\code\modules\mob\living\carbon\human\human.dm" #include "modular_sand\code\modules\mob\living\carbon\human\human_defines.dm" #include "modular_sand\code\modules\mob\living\carbon\human\human_stripping.dm" #include "modular_sand\code\modules\mob\living\carbon\human\life.dm" #include "modular_sand\code\modules\mob\living\carbon\human\species.dm" +#include "modular_sand\code\modules\mob\living\carbon\human\species_types\anthropomorph.dm" +#include "modular_sand\code\modules\mob\living\carbon\human\species_types\ipc.dm" #include "modular_sand\code\modules\mob\living\carbon\human\species_types\lizardpeople.dm" +#include "modular_sand\code\modules\mob\living\carbon\human\species_types\synthliz.dm" #include "modular_sand\code\modules\mob\living\silicon\silicon.dm" #include "modular_sand\code\modules\mob\living\silicon\ai\ai.dm" #include "modular_sand\code\modules\mob\living\silicon\ai\vox_sounds.dm" @@ -4204,6 +4205,7 @@ #include "modular_sand\code\modules\reagents\chemistry\reagents\alcohol_reagents.dm" #include "modular_sand\code\modules\reagents\chemistry\reagents\cit_reagents.dm" #include "modular_sand\code\modules\reagents\chemistry\reagents\drink_reagents.dm" +#include "modular_sand\code\modules\reagents\chemistry\reagents\fermi_reagents.dm" #include "modular_sand\code\modules\reagents\chemistry\reagents\medicine_reagents.dm" #include "modular_sand\code\modules\reagents\chemistry\reagents\other_reagents.dm" #include "modular_sand\code\modules\reagents\chemistry\recipes\others.dm" @@ -4309,6 +4311,7 @@ #include "modular_splurt\code\datums\components\crafting\recipes\recipes_robot.dm" #include "modular_splurt\code\datums\components\storage\concrete\pockets.dm" #include "modular_splurt\code\datums\elements\crawl_under.dm" +#include "modular_splurt\code\datums\elements\mob_holder.dm" #include "modular_splurt\code\datums\elements\smalltalk.dm" #include "modular_splurt\code\datums\elements\spooky.dm" #include "modular_splurt\code\datums\elements\wuv.dm" @@ -4332,12 +4335,14 @@ #include "modular_splurt\code\datums\traits\good.dm" #include "modular_splurt\code\datums\traits\negative.dm" #include "modular_splurt\code\datums\traits\neutral.dm" +#include "modular_splurt\code\datums\traits\trait_actions.dm" #include "modular_splurt\code\game\atoms.dm" #include "modular_splurt\code\game\atoms_movable.dm" #include "modular_splurt\code\game\data_huds.dm" #include "modular_splurt\code\game\say.dm" #include "modular_splurt\code\game\area\areas\centcom.dm" #include "modular_splurt\code\game\area\areas\commons.dm" +#include "modular_splurt\code\game\area\areas\holodeck.dm" #include "modular_splurt\code\game\area\areas\layenia.dm" #include "modular_splurt\code\game\area\areas\maintenance.dm" #include "modular_splurt\code\game\area\areas\shuttles.dm" @@ -4380,10 +4385,13 @@ #include "modular_splurt\code\game\objects\items\circuitboards\computer_circuitboards.dm" #include "modular_splurt\code\game\objects\items\circuitboards\machine_circuitboards.dm" #include "modular_splurt\code\game\objects\items\circuitboards\miner_circuitboards.dm" +#include "modular_splurt\code\game\objects\items\devices\PDA\radio.dm" #include "modular_splurt\code\game\objects\items\devices\radio\electropack.dm" #include "modular_splurt\code\game\objects\items\devices\radio\headset.dm" #include "modular_splurt\code\game\objects\items\implants\implant_aphropumps.dm" +#include "modular_splurt\code\game\objects\items\implants\implant_disrobe.dm" #include "modular_splurt\code\game\objects\items\implants\implant_gfluid.dm" +#include "modular_splurt\code\game\objects\items\implants\implant_hide_backpack.dm" #include "modular_splurt\code\game\objects\items\implants\implant_slave.dm" #include "modular_splurt\code\game\objects\items\implants\implant_slaver.dm" #include "modular_splurt\code\game\objects\items\implants\implantcase.dm" @@ -4408,6 +4416,7 @@ #include "modular_splurt\code\game\objects\items\storage\boxes.dm" #include "modular_splurt\code\game\objects\items\storage\firstaid.dm" #include "modular_splurt\code\game\objects\items\storage\secure.dm" +#include "modular_splurt\code\game\objects\items\storage\wallets.dm" #include "modular_splurt\code\game\objects\items\weaponry\armyknife.dm" #include "modular_splurt\code\game\objects\items\weaponry\melee.dm" #include "modular_splurt\code\game\objects\structures\barricades.dm" @@ -4494,6 +4503,7 @@ #include "modular_splurt\code\modules\atmospherics\machinery\components\unary_devices\vent_pump.dm" #include "modular_splurt\code\modules\atmospherics\machinery\components\unary_devices\vent_scrubber.dm" #include "modular_splurt\code\modules\atmospherics\machinery\other\miner.dm" +#include "modular_splurt\code\modules\awaymissions\mission_code\academy.dm" #include "modular_splurt\code\modules\cargo\supplypod.dm" #include "modular_splurt\code\modules\cargo\blackmarket\clothing.dm" #include "modular_splurt\code\modules\cargo\blackmarket\misc.dm" @@ -4538,14 +4548,19 @@ #include "modular_splurt\code\modules\client\verbs\looc.dm" #include "modular_splurt\code\modules\client\verbs\ooc.dm" #include "modular_splurt\code\modules\clothing\back.dm" +#include "modular_splurt\code\modules\clothing\clothing.dm" #include "modular_splurt\code\modules\clothing\gloves.dm" #include "modular_splurt\code\modules\clothing\kinkyclothes.dm" #include "modular_splurt\code\modules\clothing\sizeaccessories.dm" #include "modular_splurt\code\modules\clothing\glasses\_glasses.dm" #include "modular_splurt\code\modules\clothing\glasses\hud.dm" +#include "modular_splurt\code\modules\clothing\gloves\_gloves.dm" +#include "modular_splurt\code\modules\clothing\head\_head.dm" +#include "modular_splurt\code\modules\clothing\head\hardhat.dm" #include "modular_splurt\code\modules\clothing\head\helmet.dm" #include "modular_splurt\code\modules\clothing\head\jobs.dm" #include "modular_splurt\code\modules\clothing\head\misc.dm" +#include "modular_splurt\code\modules\clothing\head\misc_special.dm" #include "modular_splurt\code\modules\clothing\lewd_clothing\collar\kink_collars.dm" #include "modular_splurt\code\modules\clothing\lewd_clothing\eyes\hypnogoggles.dm" #include "modular_splurt\code\modules\clothing\lewd_clothing\foot\lewd_shoes.dm" @@ -4553,11 +4568,15 @@ #include "modular_splurt\code\modules\clothing\lewd_clothing\head\deprivation_helmet.dm" #include "modular_splurt\code\modules\clothing\lewd_clothing\head\hats.dm" #include "modular_splurt\code\modules\clothing\lewd_clothing\uniform\latex_catsuit.dm" +#include "modular_splurt\code\modules\clothing\masks\_mask.dm" +#include "modular_splurt\code\modules\clothing\masks\boxing.dm" #include "modular_splurt\code\modules\clothing\masks\gasmask.dm" #include "modular_splurt\code\modules\clothing\masks\hailer.dm" #include "modular_splurt\code\modules\clothing\masks\miscellaneous.dm" #include "modular_splurt\code\modules\clothing\neck\_neck.dm" #include "modular_splurt\code\modules\clothing\outfits\ert.dm" +#include "modular_splurt\code\modules\clothing\shoes\_shoes.dm" +#include "modular_splurt\code\modules\clothing\shoes\magboots.dm" #include "modular_splurt\code\modules\clothing\shoes\miscellaneous.dm" #include "modular_splurt\code\modules\clothing\spacesuits\hardsuit.dm" #include "modular_splurt\code\modules\clothing\suits\armor.dm" @@ -4565,6 +4584,7 @@ #include "modular_splurt\code\modules\clothing\suits\heavy.dm" #include "modular_splurt\code\modules\clothing\suits\jobs.dm" #include "modular_splurt\code\modules\clothing\suits\miscellaneous.dm" +#include "modular_splurt\code\modules\clothing\suits\utility.dm" #include "modular_splurt\code\modules\clothing\suits\vest.dm" #include "modular_splurt\code\modules\clothing\under\_under.dm" #include "modular_splurt\code\modules\clothing\under\miscellaneous.dm" @@ -4573,6 +4593,7 @@ #include "modular_splurt\code\modules\clothing\under\jobs\engineering.dm" #include "modular_splurt\code\modules\clothing\under\jobs\security.dm" #include "modular_splurt\code\modules\clothing\under\jobs\civilian\civilian.dm" +#include "modular_splurt\code\modules\clothing\underwear\_underwear.dm" #include "modular_splurt\code\modules\clothing\underwear\boxers.dm" #include "modular_splurt\code\modules\clothing\underwear\shirts.dm" #include "modular_splurt\code\modules\clothing\underwear\socks.dm" @@ -4595,6 +4616,7 @@ #include "modular_splurt\code\modules\food_and_drinks\recipes\tablecraft\recipes_burger.dm" #include "modular_splurt\code\modules\food_and_drinks\recipes\tablecraft\recipes_donut.dm" #include "modular_splurt\code\modules\holiday\holidays.dm" +#include "modular_splurt\code\modules\holodeck\holo_effect.dm" #include "modular_splurt\code\modules\hydroponics\grown\towercap.dm" #include "modular_splurt\code\modules\jobs\job_types\_job_alt_titles.dm" #include "modular_splurt\code\modules\jobs\job_types\atmospheric_technician.dm" @@ -4617,6 +4639,7 @@ #include "modular_splurt\code\modules\jobs\job_types\service.dm" #include "modular_splurt\code\modules\jobs\job_types\station_engineer.dm" #include "modular_splurt\code\modules\jobs\job_types\stowaway.dm" +#include "modular_splurt\code\modules\keybindings\keybind\human.dm" #include "modular_splurt\code\modules\keybindings\keybind\movement.dm" #include "modular_splurt\code\modules\language\xenocommon.dm" #include "modular_splurt\code\modules\mapping\mapping_helpers\baseturf.dm" @@ -4656,8 +4679,10 @@ #include "modular_splurt\code\modules\mob\living\carbon\carbon.dm" #include "modular_splurt\code\modules\mob\living\carbon\human\human.dm" #include "modular_splurt\code\modules\mob\living\carbon\human\human_defines.dm" +#include "modular_splurt\code\modules\mob\living\carbon\human\inventory.dm" #include "modular_splurt\code\modules\mob\living\carbon\human\physiology.dm" #include "modular_splurt\code\modules\mob\living\carbon\human\species.dm" +#include "modular_splurt\code\modules\mob\living\carbon\human\update_icons.dm" #include "modular_splurt\code\modules\mob\living\carbon\human\simple_animal\hostile\deathclaw\deathclaw.dm" #include "modular_splurt\code\modules\mob\living\carbon\human\simple_animal\hostile\deathclaw\funclaw.dm" #include "modular_splurt\code\modules\mob\living\carbon\human\species_types\arachnid.dm" @@ -4682,6 +4707,7 @@ #include "modular_splurt\code\modules\mob\living\simple_animal\hostile\dancer.dm" #include "modular_splurt\code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm" #include "modular_splurt\code\modules\mob\living\simple_animal\hostile\megafauna\king_of_goats.dm" +#include "modular_splurt\code\modules\mob\living\simple_animal\hostile\megafauna\sand.dm" #include "modular_splurt\code\modules\paperwork\pen.dm" #include "modular_splurt\code\modules\power\cell.dm" #include "modular_splurt\code\modules\power\reactor\fluffed.dm" @@ -4715,6 +4741,7 @@ #include "modular_splurt\code\modules\reagents\chemistry\reagents\other_reagents.dm" #include "modular_splurt\code\modules\reagents\chemistry\recipes\drugs.dm" #include "modular_splurt\code\modules\reagents\chemistry\recipes\lewd.dm" +#include "modular_splurt\code\modules\reagents\reagent_containers\borghydro.dm" #include "modular_splurt\code\modules\reagents\reagent_containers\bottle.dm" #include "modular_splurt\code\modules\reagents\reagent_containers\hypospray.dm" #include "modular_splurt\code\modules\reagents\reagent_containers\hypovial.dm" @@ -4723,6 +4750,7 @@ #include "modular_splurt\code\modules\research\designs\AI_module_designs.dm" #include "modular_splurt\code\modules\research\designs\autoylathe_designs.dm" #include "modular_splurt\code\modules\research\designs\biogenerator_designs.dm" +#include "modular_splurt\code\modules\research\designs\bluespace_designs.dm" #include "modular_splurt\code\modules\research\designs\limbgrower_designs.dm" #include "modular_splurt\code\modules\research\designs\mecha_designs.dm" #include "modular_splurt\code\modules\research\designs\mechfabricator_designs.dm" @@ -4732,10 +4760,10 @@ #include "modular_splurt\code\modules\research\designs\tool_designs.dm" #include "modular_splurt\code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm" #include "modular_splurt\code\modules\research\designs\machine_designs\machine_designs_all_misc.dm" +#include "modular_splurt\code\modules\research\techweb\nodes\biotech_nodes.dm" #include "modular_splurt\code\modules\research\techweb\nodes\bluespace_nodes.dm" #include "modular_splurt\code\modules\research\techweb\nodes\mecha_nodes.dm" #include "modular_splurt\code\modules\research\techweb\nodes\medical_nodes.dm" -#include "modular_splurt\code\modules\research\techweb\nodes\misc_nodes.dm" #include "modular_splurt\code\modules\research\techweb\nodes\robotic_nodes.dm" #include "modular_splurt\code\modules\resize\smallsprite_action.dm" #include "modular_splurt\code\modules\ruins\objects_and_mobs\ash_walker_den.dm" diff --git a/tgui/packages/tgui/interfaces/MobInteraction.tsx b/tgui/packages/tgui/interfaces/MobInteraction.tsx index a1db0d6efd..3aba47c5fc 100644 --- a/tgui/packages/tgui/interfaces/MobInteraction.tsx +++ b/tgui/packages/tgui/interfaces/MobInteraction.tsx @@ -36,6 +36,7 @@ type GenitalData = { possible_choices: string[], can_arouse: boolean, arousal_state: boolean, + always_accessible: boolean, } type GenitalManagerInfo = { @@ -283,12 +284,12 @@ const GenitalTab = (props, context) => { Actions