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