diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm
index daf02d38a2..c0b6bd5001 100644
--- a/code/_helpers/text.dm
+++ b/code/_helpers/text.dm
@@ -52,7 +52,9 @@
input = copytext(input,1,max_length)
if(extra)
- input = replace_characters(input, list("\n"=" ","\t"=" "))
+ var/temp_input = replace_characters(input, list("\n"=" ","\t"=" "))//one character is replaced by two
+ if(length(input) < (length(temp_input) - 6))//6 is the number of linebreaks allowed per message
+ input = replace_characters(temp_input,list(" "=" "))//replace again, this time the double spaces with single ones
if(encode)
// The below \ escapes have a space inserted to attempt to enable CI auto-checking of span class usage. Please do not remove the space.
diff --git a/code/game/objects/effects/bump_teleporter.dm b/code/game/objects/effects/bump_teleporter.dm
index 0286622705..581aeea16f 100644
--- a/code/game/objects/effects/bump_teleporter.dm
+++ b/code/game/objects/effects/bump_teleporter.dm
@@ -23,12 +23,12 @@ var/list/obj/effect/bump_teleporter/BUMP_TELEPORTERS = list()
if(!ismob(user))
//user.loc = src.loc //Stop at teleporter location
return
-
+ var/mob/M = user //VOREStation edit
if(!id_target)
//user.loc = src.loc //Stop at teleporter location, there is nowhere to teleport to.
return
for(var/obj/effect/bump_teleporter/BT in BUMP_TELEPORTERS)
if(BT.id == src.id_target)
- usr.loc = BT.loc //Teleport to location with correct id.
- return
\ No newline at end of file
+ M.forceMove(BT.loc) //Teleport to location with correct id. //VOREStation Edit
+ return
diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm
index 29159503ab..7234baf50e 100644
--- a/code/game/objects/structures/fireaxe.dm
+++ b/code/game/objects/structures/fireaxe.dm
@@ -12,10 +12,13 @@
var/hitstaken = 0
var/locked = 1
var/smashed = 0
+ var/starts_with_axe = TRUE
/obj/structure/fireaxecabinet/Initialize()
. = ..()
- fireaxe = new /obj/item/weapon/material/twohanded/fireaxe()
+ if(starts_with_axe)
+ fireaxe = new /obj/item/weapon/material/twohanded/fireaxe()
+ update_icon()
/obj/structure/fireaxecabinet/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
//..() //That's very useful, Erro
@@ -184,3 +187,7 @@
if(fireaxe)
hasaxe = 1
icon_state = text("fireaxe[][][][]",hasaxe,open,hitstaken,smashed)
+
+
+/obj/structure/fireaxecabinet/empty
+ starts_with_axe = FALSE
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index c069d7379d..a5364f214a 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -207,7 +207,10 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
/datum/admin_help/proc/FullMonty(ref_src)
if(!ref_src)
ref_src = "\ref[src]"
- . = ADMIN_FULLMONTY_NONAME(initiator.mob)
+ if(initiator && initiator.mob)
+ . = ADMIN_FULLMONTY_NONAME(initiator.mob)
+ else
+ . = "Initiator disconnected."
if(state == AHELP_ACTIVE)
. += ClosureLinks(ref_src)
diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
index 0baf1d2d19..4461dfbae8 100644
--- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
@@ -1066,6 +1066,18 @@
character_name = list("Cerise Duelliste")
allowed_roles = list("Security Officer", "Warden", "Head of Security", "Detective")
+/datum/gear/fluff/sidona_robes
+ path = /obj/item/clothing/under/fluff/gildedrobe_perrin
+ display_name = "Sidona's Robes"
+ ckeywhitelist = list("siennaathens ")
+ character_name = list("Sidona Kaal")
+
+/datum/gear/fluff/sidona_shoes
+ path = /obj/item/clothing/shoes/fluff/gildedshoes_perrin
+ display_name = "Sidona's Shoes"
+ ckeywhitelist = list("siennaathens")
+ character_name = list("Sidona Kaal")
+
/datum/gear/fluff/nthasd_modkit //Converts a Security suit's sprite
path = /obj/item/device/modkit_conversion/hasd
display_name = "NT-HASD 556's Modkit"
diff --git a/code/modules/clothing/under/accessories/holster_vr.dm b/code/modules/clothing/under/accessories/holster_vr.dm
index db610037d6..5032134302 100644
--- a/code/modules/clothing/under/accessories/holster_vr.dm
+++ b/code/modules/clothing/under/accessories/holster_vr.dm
@@ -3,6 +3,17 @@
desc = "A specialized holster, made specifically for Kinetic Accelerators."
can_hold = list(/obj/item/weapon/gun/energy/kinetic_accelerator)
+/obj/item/clothing/accessory/holster/waist/lanyard
+ name = "baton lanyard"
+ desc = "A sturdy tether with quick-release carabiner that can keep several patterns of standard-issue security baton ready for quick usage."
+ icon_state = "holster_lanyard"
+ overlay_state = "holster_lanyard"
+ can_hold = list(
+ /obj/item/weapon/melee/baton,
+ /obj/item/weapon/melee/classic_baton,
+ /obj/item/weapon/melee/telebaton
+ )
+
/obj/item/clothing/accessory/holster/machete/rapier
name = "rapier sheath"
desc = "A beautiful red sheath, probably for a beautiful blade."
diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm
index 8807e9eeb8..764fbc56ae 100644
--- a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm
+++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm
@@ -49,9 +49,6 @@
new /datum/data/mining_equipment("Industrial Equipment - Sheet-Snatcher",/obj/item/weapon/storage/bag/sheetsnatcher, 500),
new /datum/data/mining_equipment("Digital Tablet - Standard", /obj/item/modular_computer/tablet/preset/custom_loadout/standard, 500),
new /datum/data/mining_equipment("Digital Tablet - Advanced", /obj/item/modular_computer/tablet/preset/custom_loadout/advanced, 1000),
- new /datum/data/mining_equipment("Fine Excavation Kit - Chisels",/obj/item/weapon/storage/excavation, 500),
- new /datum/data/mining_equipment("Fine Excavation Kit - Measuring Tape",/obj/item/device/measuring_tape, 125),
- new /datum/data/mining_equipment("Fine Excavation Kit - Hand Pick",/obj/item/weapon/pickaxe/hand, 375),
new /datum/data/mining_equipment("Explosive Excavation Kit - Plastic Charge",/obj/item/weapon/plastique/seismic, 1500),
new /datum/data/mining_equipment("Injector (L) - Glucose",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose, 500),
new /datum/data/mining_equipment("Injector (L) - Panacea",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity, 500),
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 1d3a36bd94..9f558dde6c 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -76,9 +76,9 @@
BP_L_LEG = skip_body & EXAMINE_SKIPLEGS,
BP_R_LEG = skip_body & EXAMINE_SKIPLEGS)
+
var/gender_hidden = (skip_gear & EXAMINE_SKIPJUMPSUIT) && (skip_body & EXAMINE_SKIPFACE)
var/gender_key = get_visible_gender(user, gender_hidden)
-
var/datum/gender/T = gender_datums[gender_key]
if (!T)
CRASH({"Null gender datum on examine: mob="[src]",hidden="[gender_hidden]",key="[gender_key]",bio="[gender]",id="[identifying_gender]""})
@@ -107,93 +107,88 @@
if(w_uniform && !(skip_gear & EXAMINE_SKIPJUMPSUIT) && w_uniform.show_examine)
//Ties
var/tie_msg
+ var/tie_msg_warn
if(istype(w_uniform,/obj/item/clothing/under) && !(skip_gear & EXAMINE_SKIPTIE))
var/obj/item/clothing/under/U = w_uniform
if(LAZYLEN(U.accessories))
- var/list/accessories_visible = list() //please let this fix the stupid fucking runtimes
+ tie_msg += ". Attached to it is"
+ tie_msg_warn += "! Attached to it is"
+ var/list/accessory_descs = list()
if(skip_gear & EXAMINE_SKIPHOLSTER)
for(var/obj/item/clothing/accessory/A in U.accessories)
if(A.show_examine && !istype(A, /obj/item/clothing/accessory/holster)) // If we're supposed to skip holsters, actually skip them
- accessories_visible.Add(A)
+ accessory_descs += "\a [A]"
else
for(var/obj/item/clothing/accessory/A in U.accessories)
if(A.concealed_holster == 0 && A.show_examine)
- accessories_visible.Add(A)
-
- if(accessories_visible.len)
- tie_msg += " Attached to it is [english_list(accessories_visible)]."
-
- var/list/pocket_msg
- if(l_store)
- var/l_store_message = l_store.pocket_description(src, user)
- if(l_store_message)
- LAZYADD(pocket_msg, l_store_message)
- if(r_store)
- var/r_store_message = r_store.pocket_description(src, user)
- if(r_store_message)
- LAZYADD(pocket_msg, r_store_message)
- if(LAZYLEN(pocket_msg))
- tie_msg += " Near the waist it has [english_list(pocket_msg)]."
+ accessory_descs += "\a [A]"
+ tie_msg += " [lowertext(english_list(accessory_descs))]."
if(w_uniform.blood_DNA)
- msg += "[T.He] [T.is] wearing \icon[w_uniform][bicon(w_uniform)] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [w_uniform.name]![tie_msg]"
+ msg += "[T.He] [T.is] wearing [bicon(w_uniform)] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != "#030303") ? "blood" : "oil"]-stained [w_uniform.name]![tie_msg]"
else
- msg += "[T.He] [T.is] wearing \icon[w_uniform][bicon(w_uniform)] \a [w_uniform].[tie_msg]"
+ msg += "[T.He] [T.is] wearing [bicon(w_uniform)] \a [w_uniform].[tie_msg]"
//head
if(head && !(skip_gear & EXAMINE_SKIPHELMET) && head.show_examine)
if(head.blood_DNA)
- msg += "[T.He] [T.is] wearing \icon[head][bicon(head)] [head.gender==PLURAL?"some":"a"] [(head.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [head.name] on [T.his] head!"
+ msg += "[T.He] [T.is] wearing [bicon(head)] [head.gender==PLURAL?"some":"a"] [(head.blood_color != "#030303") ? "blood" : "oil"]-stained [head.name] on [T.his] head!"
else
- msg += "[T.He] [T.is] wearing \icon[head][bicon(head)] \a [head] on [T.his] head."
+ msg += "[T.He] [T.is] wearing [bicon(head)] \a [head] on [T.his] head."
//suit/armour
if(wear_suit)
var/tie_msg
+ var/tie_msg_warn
if(istype(wear_suit,/obj/item/clothing/suit))
var/obj/item/clothing/suit/U = wear_suit
if(LAZYLEN(U.accessories))
- tie_msg += " Attached to it is [english_list(U.accessories)]."
+ tie_msg += ". Attached to it is"
+ tie_msg_warn += "! Attached to it is"
+ var/list/accessory_descs = list()
+ for(var/accessory in U.accessories)
+ accessory_descs += "\a [accessory]"
+ tie_msg += " [lowertext(english_list(accessory_descs))]."
if(wear_suit.blood_DNA)
- msg += "[T.He] [T.is] wearing \icon[wear_suit][bicon(wear_suit)] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [wear_suit.name][tie_msg]!"
+ msg += "[T.He] [T.is] wearing [bicon(wear_suit)] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_suit.name]![tie_msg]"
else
- msg += "[T.He] [T.is] wearing \icon[wear_suit][bicon(wear_suit)] \a [wear_suit].[tie_msg]"
+ msg += "[T.He] [T.is] wearing [bicon(wear_suit)] \a [wear_suit].[tie_msg]"
//suit/armour storage
if(s_store && !(skip_gear & EXAMINE_SKIPSUITSTORAGE) && s_store.show_examine)
if(s_store.blood_DNA)
- msg += "[T.He] [T.is] carrying \icon[s_store][bicon(s_store)] [s_store.gender==PLURAL?"some":"a"] [(s_store.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [s_store.name] on [T.his] [wear_suit.name]!"
+ msg += "[T.He] [T.is] carrying [bicon(s_store)] [s_store.gender==PLURAL?"some":"a"] [(s_store.blood_color != "#030303") ? "blood" : "oil"]-stained [s_store.name] on [T.his] [wear_suit.name]!"
else
- msg += "[T.He] [T.is] carrying \icon[s_store][bicon(s_store)] \a [s_store] on [T.his] [wear_suit.name]."
+ msg += "[T.He] [T.is] carrying [bicon(s_store)] \a [s_store] on [T.his] [wear_suit.name]."
//back
if(back && !(skip_gear & EXAMINE_SKIPBACKPACK) && back.show_examine)
if(back.blood_DNA)
- msg += "[T.He] [T.has] \icon[back][bicon(back)] [back.gender==PLURAL?"some":"a"] [(back.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [back] on [T.his] back."
+ msg += "[T.He] [T.has] [bicon(back)] [back.gender==PLURAL?"some":"a"] [(back.blood_color != "#030303") ? "blood" : "oil"]-stained [back] on [T.his] back."
else
- msg += "[T.He] [T.has] \icon[back][bicon(back)] \a [back] on [T.his] back."
+ msg += "[T.He] [T.has] [bicon(back)] \a [back] on [T.his] back."
//left hand
if(l_hand && l_hand.show_examine)
if(l_hand.blood_DNA)
- msg += "[T.He] [T.is] holding \icon[l_hand][bicon(l_hand)] [l_hand.gender==PLURAL?"some":"a"] [(l_hand.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [l_hand.name] in [T.his] left hand!"
+ msg += "[T.He] [T.is] holding [bicon(l_hand)] [l_hand.gender==PLURAL?"some":"a"] [(l_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [l_hand.name] in [T.his] left hand!"
else
- msg += "[T.He] [T.is] holding \icon[l_hand][bicon(l_hand)] \a [l_hand] in [T.his] left hand."
+ msg += "[T.He] [T.is] holding [bicon(l_hand)] \a [l_hand] in [T.his] left hand."
//right hand
if(r_hand && r_hand.show_examine)
if(r_hand.blood_DNA)
- msg += "[T.He] [T.is] holding \icon[r_hand][bicon(r_hand)] [r_hand.gender==PLURAL?"some":"a"] [(r_hand.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [r_hand.name] in [T.his] right hand!"
+ msg += "[T.He] [T.is] holding [bicon(r_hand)] [r_hand.gender==PLURAL?"some":"a"] [(r_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [r_hand.name] in [T.his] right hand!"
else
- msg += "[T.He] [T.is] holding \icon[r_hand][bicon(r_hand)] \a [r_hand] in [T.his] right hand."
+ msg += "[T.He] [T.is] holding [bicon(r_hand)] \a [r_hand] in [T.his] right hand."
//gloves
if(gloves && !(skip_gear & EXAMINE_SKIPGLOVES) && gloves.show_examine)
if(gloves.blood_DNA)
- msg += "[T.He] [T.has] \icon[gloves][bicon(gloves)] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [gloves.name] on [T.his] hands!"
+ msg += "[T.He] [T.has] [bicon(gloves)] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != "#030303") ? "blood" : "oil"]-stained [gloves.name] on [T.his] hands!"
else
- msg += "[T.He] [T.has] \icon[gloves][bicon(gloves)] \a [gloves] on [T.his] hands."
+ msg += "[T.He] [T.has] [bicon(gloves)] \a [gloves] on [T.his] hands."
else if(blood_DNA && !(skip_body & EXAMINE_SKIPHANDS))
msg += "[T.He] [T.has] [(hand_blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained hands!"
@@ -211,16 +206,16 @@
//belt
if(belt && !(skip_gear & EXAMINE_SKIPBELT) && belt.show_examine)
if(belt.blood_DNA)
- msg += "[T.He] [T.has] \icon[belt][bicon(belt)] [belt.gender==PLURAL?"some":"a"] [(belt.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [belt.name] about [T.his] waist!"
+ msg += "[T.He] [T.has] [bicon(belt)] [belt.gender==PLURAL?"some":"a"] [(belt.blood_color != "#030303") ? "blood" : "oil"]-stained [belt.name] about [T.his] waist!"
else
- msg += "[T.He] [T.has] \icon[belt][bicon(belt)] \a [belt] about [T.his] waist."
+ msg += "[T.He] [T.has] [bicon(belt)] \a [belt] about [T.his] waist."
//shoes
if(shoes && !(skip_gear & EXAMINE_SKIPSHOES) && shoes.show_examine)
if(shoes.blood_DNA)
- msg += "[T.He] [T.is] wearing \icon[shoes][bicon(shoes)] [shoes.gender==PLURAL?"some":"a"] [(shoes.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [shoes.name] on [T.his] feet!"
+ msg += "[T.He] [T.is] wearing [bicon(shoes)] [shoes.gender==PLURAL?"some":"a"] [(shoes.blood_color != "#030303") ? "blood" : "oil"]-stained [shoes.name] on [T.his] feet!"
else
- msg += "[T.He] [T.is] wearing \icon[shoes][bicon(shoes)] \a [shoes] on [T.his] feet."
+ msg += "[T.He] [T.is] wearing [bicon(shoes)] \a [shoes] on [T.his] feet."
else if(feet_blood_DNA && !(skip_body & EXAMINE_SKIPHANDS))
msg += "[T.He] [T.has] [(feet_blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained feet!"
@@ -231,38 +226,28 @@
descriptor = "in [T.his] mouth"
if(wear_mask.blood_DNA)
- msg += "[T.He] [T.has] \icon[wear_mask][bicon(wear_mask)] [wear_mask.gender==PLURAL?"some":"a"] [(wear_mask.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [wear_mask.name] [descriptor]!"
+ msg += "[T.He] [T.has] [bicon(wear_mask)] [wear_mask.gender==PLURAL?"some":"a"] [(wear_mask.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_mask.name] [descriptor]!"
else
- msg += "[T.He] [T.has] \icon[wear_mask][bicon(wear_mask)] \a [wear_mask] [descriptor]."
+ msg += "[T.He] [T.has] [bicon(wear_mask)] \a [wear_mask] [descriptor]."
//eyes
if(glasses && !(skip_gear & EXAMINE_SKIPEYEWEAR) && glasses.show_examine)
if(glasses.blood_DNA)
- msg += "[T.He] [T.has] \icon[glasses][bicon(glasses)] [glasses.gender==PLURAL?"some":"a"] [(glasses.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [glasses] covering [T.his] eyes!"
+ msg += "[T.He] [T.has] [bicon(glasses)] [glasses.gender==PLURAL?"some":"a"] [(glasses.blood_color != "#030303") ? "blood" : "oil"]-stained [glasses] covering [T.his] eyes!"
else
- msg += "[T.He] [T.has] \icon[glasses][bicon(glasses)] \a [glasses] covering [T.his] eyes."
+ msg += "[T.He] [T.has] [bicon(glasses)] \a [glasses] covering [T.his] eyes."
//left ear
if(l_ear && !(skip_gear & EXAMINE_SKIPEARS) && l_ear.show_examine)
- msg += "[T.He] [T.has] \icon[l_ear][bicon(l_ear)] \a [l_ear] on [T.his] left ear."
+ msg += "[T.He] [T.has] [bicon(l_ear)] \a [l_ear] on [T.his] left ear."
//right ear
if(r_ear && !(skip_gear & EXAMINE_SKIPEARS) && r_ear.show_examine)
- msg += "[T.He] [T.has] \icon[r_ear][bicon(r_ear)] \a [r_ear] on [T.his] right ear."
+ msg += "[T.He] [T.has] [bicon(r_ear)] \a [r_ear] on [T.his] right ear."
//ID
if(wear_id && wear_id.show_examine)
- /*var/id
- if(istype(wear_id, /obj/item/device/pda))
- var/obj/item/device/pda/pda = wear_id
- id = pda.owner
- else if(istype(wear_id, /obj/item/weapon/card/id)) //just in case something other than a PDA/ID card somehow gets in the ID slot :[
- var/obj/item/weapon/card/id/idcard = wear_id
- id = idcard.registered_name
- if(id && (id != real_name) && (get_dist(src, usr) <= 1) && prob(10))
- msg += "[T.He] [T.is] wearing \icon[wear_id][bicon(wear_id)] \a [wear_id] yet something doesn't seem right..."
- else*/
- msg += "[T.He] [T.is] wearing \icon[wear_id][bicon(wear_id)] \a [wear_id]."
+ msg += "[T.He] [T.is] wearing [bicon(wear_id)]\a [wear_id]."
//Jitters
if(is_jittery)
@@ -475,5 +460,3 @@
else if(istype(M, /mob/living/silicon/robot))
var/mob/living/silicon/robot/R = M
return R.sensor_type //VOREStation Add - Borgo sensors are now binary so just have them on or off
-
- return 0
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index b716183134..dd678816a5 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -572,6 +572,12 @@
var/obj/item/I = locate(href_list["lookitem"])
src.examinate(I)
+ if (href_list["lookitem_desc_only"])
+ var/obj/item/I = locate(href_list["lookitem_desc_only"])
+ if(!I)
+ return
+ usr.examinate(I, 1)
+
if (href_list["lookmob"])
var/mob/M = locate(href_list["lookmob"])
src.examinate(M)
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
index ae01db3716..8b955b7ebd 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
@@ -340,8 +340,75 @@ YW change end */
custom_only = FALSE
allergen = ALLERGEN_COFFEE
+/datum/trait/neutral/allergy_reaction
+ name = "Allergy Reaction: Disable Toxicity"
+ desc = "Take this trait to disable the toxic damage effect of being exposed to one of your allergens. Combine with the Disable Suffocation trait to have purely nonlethal reactions."
+ cost = 0
+ custom_only = FALSE
+ var/reaction = AG_TOX_DMG
+
+/datum/trait/neutral/allergy_reaction/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+ S.allergen_reaction ^= reaction
+ ..(S,H)
+
+/datum/trait/neutral/allergy_reaction/oxy
+ name = "Allergy Reaction: Disable Suffocation"
+ desc = "Take this trait to disable the oxygen deprivation damage effect of being exposed to one of your allergens. Combine with the Disable Toxicity trait to have purely nonlethal reactions."
+ cost = 0
+ custom_only = FALSE
+ reaction = AG_OXY_DMG
+
+/datum/trait/neutral/allergy_reaction/brute
+ name = "Allergy Reaction: Spontaneous Trauma"
+ desc = "When exposed to one of your allergens, your skin develops unnatural bruises and other 'stigmata'-like injuries. Be aware that untreated wounds may become infected."
+ cost = 0
+ custom_only = FALSE
+ reaction = AG_PHYS_DMG
+
+/datum/trait/neutral/allergy_reaction/burn
+ name = "Allergy Reaction: Blistering"
+ desc = "When exposed to one of your allergens, your skin develops unnatural blisters and burns, as if exposed to fire. Be aware that untreated burns are very susceptible to infection!"
+ cost = 0
+ custom_only = FALSE
+ reaction = AG_BURN_DMG
+
+/datum/trait/neutral/allergy_reaction/pain
+ name = "Allergy Reaction: Disable Pain"
+ desc = "Take this trait to disable experiencing pain after being exposed to one of your allergens."
+ cost = 0
+ custom_only = FALSE
+ reaction = AG_PAIN
+
+/datum/trait/neutral/allergy_reaction/weaken
+ name = "Allergy Reaction: Knockdown"
+ desc = "When exposed to one of your allergens, you will experience sudden and abrupt loss of muscle control and tension, resulting in immediate collapse and immobility. Does nothing if you have no allergens."
+ cost = 0
+ custom_only = FALSE
+ reaction = AG_WEAKEN
+
+/datum/trait/neutral/allergy_reaction/blurry
+ name = "Allergy Reaction: Disable Blurring"
+ desc = "Take this trait to disable the blurred/impeded vision effect of allergens."
+ cost = 0
+ custom_only = FALSE
+ reaction = AG_BLURRY
+
+/datum/trait/neutral/allergy_reaction/sleepy
+ name = "Allergy Reaction: Fatigue"
+ desc = "When exposed to one of your allergens, you will experience fatigue and tiredness, and may potentially pass out entirely. Does nothing if you have no allergens."
+ cost = 0
+ custom_only = FALSE
+ reaction = AG_SLEEPY
+
+/datum/trait/neutral/allergy_reaction/confusion
+ name = "Allergy Reaction: Disable Confusion"
+ desc = "Take this trait to disable the confusion/disorientation effect of allergens."
+ cost = 0
+ custom_only = FALSE
+ reaction = AG_CONFUSE
+
/datum/trait/neutral/allergen_reduced_effect
- name = "Reduced Allergen Reaction"
+ name = "Allergen Reaction: Reduced Intensity"
desc = "This trait drastically reduces the effects of allergen reactions. If you don't have any allergens set, it does nothing. It does not apply to special reactions (such as unathi drowsiness from sugars)."
cost = 0
custom_only = FALSE
@@ -349,7 +416,7 @@ YW change end */
excludes = list(/datum/trait/neutral/allergen_increased_effect)
/datum/trait/neutral/allergen_increased_effect
- name = "Increased Allergen Reaction"
+ name = "Allergen Reaction: Increased Intensity"
desc = "This trait drastically increases the effects of allergen reactions, enough that even a small dose can be lethal. If you don't have any allergens set, it does nothing. It does not apply to special reactions (such as unathi drowsiness from sugars)."
cost = 0
custom_only = FALSE
diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm
index 1f6db8ab00..098ac1023e 100644
--- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm
+++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm
@@ -53,6 +53,7 @@
can_be_drop_pred = TRUE // Mobs are pred by default.
var/damage_threshold = 0 //For some mobs, they have a damage threshold required to deal damage to them.
+ var/nom_mob = FALSE //If a mob is meant to be hostile for vore purposes but is otherwise not hostile, if true makes certain AI ignore the mob
// Release belly contents before being gc'd!
/mob/living/simple_mob/Destroy()
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm b/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm
index 57e861b863..a517ad82db 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm
@@ -191,6 +191,7 @@ I think I covered everything.
player_msg = "You're a variant of the large dragon stripped of its firebreath attack (harm intent). You can still charge (disarm) and tail sweep (grab). Rest to heal slowly. Check your abilities tab for functions."
norange = 1
noenrage = 1
+ nom_mob = TRUE
// Weakened variant for maintpreds
/mob/living/simple_mob/vore/bigdragon/friendly/maintpred
@@ -946,6 +947,17 @@ I think I covered everything.
if(L.stat)
if(L.stat == DEAD && !handle_corpse) // Leave dead things alone
return
+ if(isanimal(L)) //Don't attack simplemobs unless they are hostile.
+ var/mob/living/simple_mob/M = L
+ if(M.client) //Don't attack players for no reason even if they're a traditionally hostile mob
+ return 0
+ if(M.nom_mob) //Don't attack mobs that are hostile for their vore functions to work
+ return 0
+ if(M.ai_holder) //Don't attack non-hostile mobs
+ if(M.ai_holder.hostile)
+ return 1
+ else return 0
+ else return 0
if(holder.IIsAlly(L))
if(confirmPatient(L))
holder.a_intent = I_HELP
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm b/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm
index 2b32c50f29..4d1322ab85 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm
@@ -48,6 +48,8 @@
vore_bump_emote = "tries to snap up"
max_tox = 0 // for virgo3b survivability
+ nom_mob = TRUE
+
/datum/category_item/catalogue/fauna/leopardmander
name = "Sivian Fauna - Va'aen Drake"
desc = "Classification: S Draconis uncia\
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm b/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm
index baa9dd42bb..dcdaf87b6f 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm
@@ -52,6 +52,8 @@
var/extra_posessive = FALSE // Enable if you want their tummy hugs to be inescapable
var/autorest_cooldown = 100
+ nom_mob = TRUE
+
/mob/living/simple_mob/vore/pakkun/Life()
. = ..()
if(client)
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/types.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/types.dm
index d09e72aa97..7619cfdaf7 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/types.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/types.dm
@@ -167,6 +167,8 @@
area is very taxing on you, but you gain energy extremely fast in any very dark area. You're weaker than other \
shadekin, but your fast energy generation in the dark allows you to phase shift more often."
+ nom_mob = TRUE
+
/mob/living/simple_mob/shadekin/yellow
ai_holder_type = /datum/ai_holder/simple_mob/melee/hit_and_run
diff --git a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm
index c73d6e354e..919d2bedb0 100644
--- a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm
@@ -907,10 +907,3 @@
icon_state = "tesh-beak-alt"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
-
-/datum/sprite_accessory/marking/vr_crab_claws
- name = "Crab claws"
- icon = 'icons/mob/human_races/markings_vr.dmi'
- icon_state = "crabclaws"
- color_blend_mode = ICON_MULTIPLY
- body_parts = list(BP_L_HAND,BP_R_HAND)
diff --git a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
index bf8104862f..20c150fc90 100644
--- a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
@@ -1202,10 +1202,10 @@
color_blend_mode = ICON_MULTIPLY
/datum/sprite_accessory/tail/perrin_tentacles
- name = "octopus tentacles (Perrin Kade)"
+ name = "octopus tentacles"
desc = ""
icon_state = "perrintentacles"
- ckeys_allowed = list("codeme")
+ ckeys_allowed = list("codeme", "siennaathens")
//LONG TAILS ARE NOT TAUR BUTTS >:O
/datum/sprite_accessory/tail/longtail
diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm
index 7bfe1b201b..e0ebefb01d 100644
--- a/code/modules/mob/say_vr.dm
+++ b/code/modules/mob/say_vr.dm
@@ -61,6 +61,8 @@
var/list/vis_objs = vis["objs"]
for(var/mob/M as anything in vis_mobs)
+ if(isnewplayer(M))
+ continue
if(isobserver(M) && !is_preference_enabled(/datum/client_preference/whisubtle_vis) && !M.client?.holder)
spawn(0)
M.show_message(undisplayed_message, 2)
@@ -115,7 +117,7 @@
///// PSAY /////
-/mob/verb/psay(message as text|null)
+/mob/verb/psay(message as text)
set category = "IC"
set name = "Psay"
set desc = "Talk to people affected by complete absorbed or dominate predator/prey."
@@ -212,7 +214,7 @@
///// PME /////
-/mob/verb/pme(message as text|null)
+/mob/verb/pme(message as message)
set category = "IC"
set name = "Pme"
set desc = "Emote to people affected by complete absorbed or dominate predator/prey."
@@ -307,7 +309,7 @@
M.forced_psay = FALSE
M.me_verb(message)
-/mob/living/verb/player_narrate(message as text|null)
+/mob/living/verb/player_narrate(message as message)
set category = "IC"
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!"
@@ -348,6 +350,8 @@
if(M)
if(isobserver(M))
message = "[message] ([ghost_follow_link(src, M)])"
+ if(isnewplayer(M))
+ continue
if(M.stat == UNCONSCIOUS || M.sleeping > 0)
continue
to_chat(M, message)
diff --git a/code/modules/nifsoft/software/13_soulcatcher.dm b/code/modules/nifsoft/software/13_soulcatcher.dm
index 04766a51e4..6f5ca2edc2 100644
--- a/code/modules/nifsoft/software/13_soulcatcher.dm
+++ b/code/modules/nifsoft/software/13_soulcatcher.dm
@@ -469,17 +469,17 @@
///////////////////
//Verbs for humans
-/mob/proc/nsay(message as text|null)
+/mob/proc/nsay(message as text)
set name = "NSay"
set desc = "Speak into your NIF's Soulcatcher."
set category = "IC"
src.nsay_act(message)
-/mob/proc/nsay_act(message as text|null)
+/mob/proc/nsay_act(message as text)
to_chat(src, SPAN_WARNING("You must be a humanoid with a NIF implanted to use that."))
-/mob/living/carbon/human/nsay_act(message as text|null)
+/mob/living/carbon/human/nsay_act(message as text)
if(stat != CONSCIOUS)
to_chat(src,SPAN_WARNING("You can't use NSay while unconscious."))
return
@@ -499,17 +499,17 @@
var/sane_message = sanitize(message)
SC.say_into(sane_message,src)
-/mob/proc/nme(message as text|null)
+/mob/proc/nme(message as message)
set name = "NMe"
set desc = "Emote into your NIF's Soulcatcher."
set category = "IC"
src.nme_act(message)
-/mob/proc/nme_act(message as text|null)
+/mob/proc/nme_act(message as message)
to_chat(src, SPAN_WARNING("You must be a humanoid with a NIF implanted to use that."))
-/mob/living/carbon/human/nme_act(message as text|null)
+/mob/living/carbon/human/nme_act(message as message)
if(stat != CONSCIOUS)
to_chat(src,SPAN_WARNING("You can't use NMe while unconscious."))
return
@@ -574,7 +574,7 @@
QDEL_NULL(eyeobj)
soulcatcher.notify_into("[src] ended AR projection.")
-/mob/living/carbon/brain/caught_soul/verb/nsay_brain(message as text|null)
+/mob/living/carbon/brain/caught_soul/verb/nsay_brain(message as text)
set name = "NSay"
set desc = "Speak into the NIF's Soulcatcher (circumventing AR speaking)."
set category = "Soulcatcher"
@@ -585,7 +585,7 @@
var/sane_message = sanitize(message)
soulcatcher.say_into(sane_message,src,null)
-/mob/living/carbon/brain/caught_soul/verb/nme_brain(message as text|null)
+/mob/living/carbon/brain/caught_soul/verb/nme_brain(message as message)
set name = "NMe"
set desc = "Emote into the NIF's Soulcatcher (circumventing AR speaking)."
set category = "Soulcatcher"
diff --git a/icons/inventory/accessory/item.dmi b/icons/inventory/accessory/item.dmi
index 90eb88540a..254e388c57 100644
Binary files a/icons/inventory/accessory/item.dmi and b/icons/inventory/accessory/item.dmi differ
diff --git a/icons/inventory/accessory/mob.dmi b/icons/inventory/accessory/mob.dmi
index 6c2f202809..e6bac630bd 100644
Binary files a/icons/inventory/accessory/mob.dmi and b/icons/inventory/accessory/mob.dmi differ
diff --git a/icons/mob/human_races/markings.dmi b/icons/mob/human_races/markings.dmi
index 4aa72bc137..08a8e126c8 100644
Binary files a/icons/mob/human_races/markings.dmi and b/icons/mob/human_races/markings.dmi differ
diff --git a/icons/mob/human_races/markings_vr.dmi b/icons/mob/human_races/markings_vr.dmi
index fb79d4e785..b2b50f1d69 100644
Binary files a/icons/mob/human_races/markings_vr.dmi and b/icons/mob/human_races/markings_vr.dmi differ
diff --git a/maps/groundbase/gb-z1.dmm b/maps/groundbase/gb-z1.dmm
index 1dd654eac8..eaf8506958 100644
--- a/maps/groundbase/gb-z1.dmm
+++ b/maps/groundbase/gb-z1.dmm
@@ -539,9 +539,6 @@
"bq" = (
/obj/machinery/vending/wardrobe/atmosdrobe,
/obj/machinery/atmospherics/unary/vent_pump/on,
-/obj/structure/sign/scenery/fakefireaxe{
- pixel_y = 32
- },
/turf/simulated/floor/tiled,
/area/groundbase/engineering/atmos/monitoring)
"br" = (
diff --git a/maps/groundbase/gb-z3.dmm b/maps/groundbase/gb-z3.dmm
index 43ec24f24c..5284e42d07 100644
--- a/maps/groundbase/gb-z3.dmm
+++ b/maps/groundbase/gb-z3.dmm
@@ -4,9 +4,6 @@
/area/groundbase/exploration/equipment)
"ab" = (
/obj/machinery/suit_cycler/medical,
-/obj/structure/sign/scenery/fakefireaxe{
- pixel_y = 32
- },
/turf/simulated/floor/tiled/white,
/area/groundbase/medical/paramedic)
"ac" = (
diff --git a/maps/groundbase/groundbase_things.dm b/maps/groundbase/groundbase_things.dm
index f1a1dfb8a0..9bcd693cc6 100644
--- a/maps/groundbase/groundbase_things.dm
+++ b/maps/groundbase/groundbase_things.dm
@@ -97,3 +97,8 @@ VIRGO3B_TURF_CREATE(/turf/simulated/floor/outdoors/rocks)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
+
+// Shelter Capsule extra restrictions
+/datum/map_template/shelter/New()
+ ..()
+ banned_areas += list(/area/groundbase/level3/escapepad)
\ No newline at end of file
diff --git a/maps/stellar_delight/stellar_delight1.dmm b/maps/stellar_delight/stellar_delight1.dmm
index 4fcbbdcde0..8c2fe66caf 100644
--- a/maps/stellar_delight/stellar_delight1.dmm
+++ b/maps/stellar_delight/stellar_delight1.dmm
@@ -19580,9 +19580,6 @@
/area/security/detectives_office)
"Pz" = (
/obj/structure/table/bench/marble,
-/obj/structure/fireaxecabinet{
- pixel_y = -32
- },
/obj/effect/landmark/start/paramedic,
/turf/simulated/floor/tiled/eris/white/bluecorner,
/area/stellardelight/deck1/paramedic)
diff --git a/maps/stellar_delight/stellar_delight2.dmm b/maps/stellar_delight/stellar_delight2.dmm
index dfdb9fa4a6..6b278aa92c 100644
--- a/maps/stellar_delight/stellar_delight2.dmm
+++ b/maps/stellar_delight/stellar_delight2.dmm
@@ -1903,9 +1903,6 @@
/obj/machinery/camera/network/engineering{
dir = 4
},
-/obj/structure/sign/scenery/fakefireaxe{
- pixel_x = -32
- },
/turf/simulated/floor/tiled/techfloor,
/area/engineering/atmos/monitoring)
"dU" = (
@@ -18682,9 +18679,6 @@
/obj/structure/flora/pottedplant/smallcactus{
pixel_y = 14
},
-/obj/structure/fireaxecabinet{
- pixel_y = 28
- },
/turf/simulated/floor/wood,
/area/stellardelight/deck2/briefingroom)
"Pm" = (
diff --git a/maps/tether/tether-03-surface3.dmm b/maps/tether/tether-03-surface3.dmm
index cf3d07ebaa..aa820929d4 100644
--- a/maps/tether/tether-03-surface3.dmm
+++ b/maps/tether/tether-03-surface3.dmm
@@ -6527,9 +6527,6 @@
/area/tether/surfacebase/outside/outside3)
"ajH" = (
/obj/machinery/computer/secure_data,
-/obj/structure/fireaxecabinet{
- pixel_y = 30
- },
/turf/simulated/floor/tiled/dark,
/area/bridge)
"ajI" = (
diff --git a/maps/tether/tether_things.dm b/maps/tether/tether_things.dm
index 476c9b6ed1..13c1b6cec0 100644
--- a/maps/tether/tether_things.dm
+++ b/maps/tether/tether_things.dm
@@ -282,6 +282,12 @@
/obj/machinery/camera/network/outside
network = list(NETWORK_OUTSIDE)
+
+// Shelter Capsule extra restrictions
+/datum/map_template/shelter/New()
+ ..()
+ banned_areas += list(/area/tether/surfacebase/fish_farm, /area/tether/surfacebase/public_garden, /area/tether/surfacebase/tram)
+
//
// ### Wall Machines On Full Windows ###
// To make sure wall-mounted machines placed on full-tile windows are clickable they must be above the window
diff --git a/tgui/yarn.lock b/tgui/yarn.lock
index 4487c047d5..79a1a207f9 100644
--- a/tgui/yarn.lock
+++ b/tgui/yarn.lock
@@ -2451,9 +2451,9 @@ __metadata:
linkType: hard
"@xmldom/xmldom@npm:^0.7.2":
- version: 0.7.5
- resolution: "@xmldom/xmldom@npm:0.7.5"
- checksum: 8d7ec35c1ef6183b4f621df08e01d7e61f244fb964a4719025e65fe6ac06fac418919be64fb40fe5908e69158ef728f2d936daa082db326fe04603012b5f2a84
+ version: 0.7.8
+ resolution: "@xmldom/xmldom@npm:0.7.8"
+ checksum: 3bae232f9e6e8218a2c4ab4baa0e2afd5d15d070236cd14b36a59261e5bc9ab26ddf919671fd3ed7474552c7528cf659f14993fdb12f26418f568121f8f4385f
languageName: node
linkType: hard