diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index bbe2db385a0..4aa30657778 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -42,11 +42,6 @@ SUBSYSTEM_DEF(ticker)
'sound/music/title1.ogg',\
'sound/music/title2.ogg',\
'sound/music/title3.ogg',)
- // Setup codephrase
- if(!GLOB.syndicate_code_phrase)
- GLOB.syndicate_code_phrase = generate_code_phrase()
- if(!GLOB.syndicate_code_response)
- GLOB.syndicate_code_response = generate_code_phrase()
// Map name
if(using_map && using_map.name)
@@ -197,6 +192,10 @@ SUBSYSTEM_DEF(ticker)
//shuttle_controller.setup_shuttle_docks()
spawn(0)//Forking here so we dont have to wait for this to finish
+ if(!GLOB.syndicate_code_phrase)
+ GLOB.syndicate_code_phrase = generate_code_phrase()
+ if(!GLOB.syndicate_code_response)
+ GLOB.syndicate_code_response = generate_code_phrase()
mode.post_setup()
//Cleanup some stuff
for(var/obj/effect/landmark/start/S in GLOB.landmarks_list)
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index fe0e2e357ad..7a63fa1571f 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -1366,7 +1366,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
name = "Shaft Miner Starter Kit"
cost = 30
access = access_qm
- contains = list(/obj/item/storage/backpack/duffel/mining_conscript)
+ contains = list(/obj/item/storage/backpack/duffel/mining_conscript/noid)
containertype = /obj/structure/closet/crate/secure
containername = "shaft miner starter kit"
diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm
index 2dd6a3d7c5b..0e74e601957 100644
--- a/code/game/gamemodes/blob/blobs/shield.dm
+++ b/code/game/gamemodes/blob/blobs/shield.dm
@@ -36,7 +36,7 @@
var/reflect_chance = 80 //80% chance to reflect
/obj/structure/blob/shield/reflective/handle_ricochet(obj/item/projectile/P)
- if(P.is_reflectable && prob(reflect_chance))
+ if(P.is_reflectable && prob(reflect_chance) && !P.legacy)
var/P_turf = get_turf(P)
var/face_direction = get_dir(src, P_turf)
var/face_angle = dir2angle(face_direction)
@@ -48,6 +48,9 @@
P.firer = src //so people who fired the lasers are not immune to them when it reflects
visible_message("[P] reflects off [src]!")
return -1// complete projectile permutation
+ else if(P.is_reflectable && P.legacy) //to stop legacy projectile exploits
+ visible_message("[P] disperses into energy from [src]!")
+ qdel(P)
else
playsound(src, P.hitsound, 50, 1)
visible_message("[src] is hit by \a [P]!")
diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm
index d221c94d39f..bfc30780b81 100644
--- a/code/game/gamemodes/nuclear/pinpointer.dm
+++ b/code/game/gamemodes/nuclear/pinpointer.dm
@@ -165,7 +165,10 @@
var/targetitem = input("Select item to search for.", "Item Mode Select","") as null|anything in item_names
if(!targetitem)
return
- target = locate(item_paths[targetitem])
+ var/list/obj/item/target_candidates = get_all_of_type(item_paths[targetitem], subtypes = TRUE)
+ for(var/obj/item/candidate in target_candidates)
+ if(!is_admin_level(candidate.loc.z))
+ target = candidate
if(!target)
to_chat(usr, "Failed to locate [targetitem]!")
return
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index ef68117e1c4..2d1b55c5b99 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -344,11 +344,14 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
var/theft_area
/datum/objective/steal/proc/get_location()
- if(steal_target.location_override)
- return steal_target.location_override
- var/obj/item/T = locate(steal_target.typepath)
- theft_area = get_area(T.loc)
- return "[theft_area]"
+ if(steal_target.location_override)
+ return steal_target.location_override
+ var/list/obj/item/steal_candidates = get_all_of_type(steal_target.typepath, subtypes = TRUE)
+ for(var/obj/item/candidate in steal_candidates)
+ if(!is_admin_level(candidate.loc.z))
+ theft_area = get_area(candidate.loc)
+ return "[theft_area]"
+ return "an unknown area"
/datum/objective/steal/find_target()
var/loop=50
diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm
index 48b64e8c589..71202f8c536 100644
--- a/code/game/machinery/ai_slipper.dm
+++ b/code/game/machinery/ai_slipper.dm
@@ -1,7 +1,7 @@
/obj/machinery/ai_slipper
name = "\improper AI liquid dispenser"
icon = 'icons/obj/device.dmi'
- icon_state = "motion3"
+ icon_state = "liquid_dispenser"
layer = 3
plane = FLOOR_PLANE
anchored = 1.0
@@ -17,14 +17,14 @@
/obj/machinery/ai_slipper/power_change()
if(stat & BROKEN)
- return
+ update_icon()
else
if( powered() )
stat &= ~NOPOWER
else
- icon_state = "motion0"
stat |= NOPOWER
disabled = TRUE
+ update_icon()
/obj/machinery/ai_slipper/proc/setState(var/enabled, var/uses)
disabled = disabled
@@ -56,7 +56,7 @@
if(stat & (NOPOWER|BROKEN))
return
disabled = !disabled
- icon_state = disabled? "motion0":"motion3"
+ update_icon()
/obj/machinery/ai_slipper/proc/Activate()
if(stat & (NOPOWER|BROKEN))
@@ -70,6 +70,12 @@
cooldown_time = world.timeofday + 100
slip_process()
+/obj/machinery/ai_slipper/update_icon()
+ if(stat & (NOPOWER|BROKEN) || disabled)
+ icon_state = "liquid_dispenser"
+ else
+ icon_state = "liquid_dispenser_on"
+
/obj/machinery/ai_slipper/attack_ai(mob/user)
return attack_hand(user)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index adf22a06850..0dd301d5542 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -134,8 +134,6 @@
if(operating)
return
add_fingerprint(user)
- if(!requiresID())
- user = null
if(density && !emagged)
if(allowed(user))
@@ -157,7 +155,7 @@
return try_to_activate_door(user)
/obj/machinery/door/attack_tk(mob/user)
- if(requiresID() && !allowed(null))
+ if(!allowed(null))
return
..()
@@ -165,9 +163,7 @@
add_fingerprint(user)
if(operating || emagged)
return
- if(!requiresID())
- user = null //so allowed(user) always succeeds
- if(allowed(user) || user.can_advanced_admin_interact())
+ if(requiresID() && (allowed(user) || user.can_advanced_admin_interact()))
if(density)
open()
else
@@ -179,6 +175,8 @@
/obj/machinery/door/allowed(mob/M)
if(emergency)
return TRUE
+ if(!requiresID())
+ return FALSE // Intentional. machinery/door/requiresID() always == 1. airlocks, however, == 0 if ID scan is disabled. Yes, this var is poorly named.
return ..()
/obj/machinery/door/proc/try_to_weld(obj/item/weldingtool/W, mob/user)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index a96a1c0d518..6dbafe2534f 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -1292,7 +1292,8 @@
/obj/item/clothing/head/cueball = 1,/obj/item/clothing/under/scratch = 1,
/obj/item/clothing/under/victdress = 1, /obj/item/clothing/under/victdress/red = 1, /obj/item/clothing/suit/victcoat = 1, /obj/item/clothing/suit/victcoat/red = 1,
/obj/item/clothing/under/victsuit = 1, /obj/item/clothing/under/victsuit/redblk = 1, /obj/item/clothing/under/victsuit/red = 1, /obj/item/clothing/suit/tailcoat = 1,
- /obj/item/clothing/suit/draculacoat = 1, /obj/item/clothing/head/zepelli = 1)
+ /obj/item/clothing/suit/draculacoat = 1, /obj/item/clothing/head/zepelli = 1,
+ /obj/item/clothing/under/redhawaiianshirt = 1, /obj/item/clothing/under/pinkhawaiianshirt = 1, /obj/item/clothing/under/bluehawaiianshirt = 1, /obj/item/clothing/under/orangehawaiianshirt = 1)
contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/gun/magic/wand = 1, /obj/item/clothing/mask/balaclava=1, /obj/item/clothing/mask/horsehead = 2)
premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, /obj/item/shield/riot/roman = 1)
refill_canister = /obj/item/vending_refill/autodrobe
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 3db9272cce8..fc8d8b1e83d 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -33,6 +33,7 @@
"Phazon",
"Exosuit Equipment",
"Cyborg Upgrade Modules",
+ "Medical",
"Misc"
)
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 83e6f8e95f8..713259e081c 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -357,6 +357,21 @@
new /obj/item/ammo_box/magazine/m12g/buckshot(src)
new /obj/item/ammo_box/magazine/m12g/dragon(src)
+/obj/item/storage/backpack/duffel/mining_conscript/noid
+ name = "mining conscription kit"
+ desc = "A kit containing everything a crewmember needs to support a shaft miner in the field."
+
+/obj/item/storage/backpack/duffel/mining_conscript/noid/New()
+ ..()
+ new /obj/item/pickaxe(src)
+ new /obj/item/clothing/glasses/meson(src)
+ new /obj/item/t_scanner/adv_mining_scanner/lesser(src)
+ new /obj/item/storage/bag/ore(src)
+ new /obj/item/clothing/under/rank/miner/lavaland(src)
+ new /obj/item/encryptionkey/headset_cargo(src)
+ new /obj/item/clothing/mask/gas(src)
+
+
/obj/item/storage/backpack/duffel/syndie/ammo/smg
desc = "A large duffel bag, packed to the brim with C-20r magazines."
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 224f07d4277..ffa33df033f 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -169,6 +169,14 @@
message_admins("Ban process: A mob matching [playermob.ckey] was found at location [playermob.x], [playermob.y], [playermob.z]. Custom IP and computer id fields replaced with the IP and computer id from the located mob")
DB_ban_record(bantype, playermob, banduration, banreason, banjob, null, banckey, banip, bancid )
+ if(BANTYPE_PERMA)
+ add_note(banckey, "Permanently Banned - [banreason]", null, usr.ckey, 0)
+ else if(BANTYPE_TEMP)
+ add_note(banckey, "Banned for [banduration] minutes - [banreason]", null, usr.ckey, 0)
+ else if(BANTYPE_JOB_PERMA)
+ add_note(banckey, "Banned from [banjob] - [banreason]", null, usr.ckey, 0)
+ else
+ add_note(banckey, "[banreason]", null, usr.ckey, 0)
else if(href_list["editrights"])
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index adcb1639c12..91527f2dd19 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -857,3 +857,36 @@
icon_state = "burial"
item_state = "burial"
item_color = "burial"
+
+/obj/item/clothing/under/redhawaiianshirt
+ name = "red hawaiian shirt"
+ desc = "a floral shirt worn to most vacation destinations."
+ icon_state = "hawaiianred"
+ item_state = "hawaiianred"
+ item_color = "hawaiianred"
+ flags_size = ONESIZEFITSALL
+
+/obj/item/clothing/under/pinkhawaiianshirt
+ name = "pink hawaiian shirt"
+ desc = "a pink floral shirt the material feels cool and comfy."
+ icon_state = "hawaiianpink"
+ item_state = "hawaiianpink"
+ item_color = "hawaiianpink"
+ flags_size = ONESIZEFITSALL
+
+/obj/item/clothing/under/orangehawaiianshirt
+ name = "orange hawaiian shirt"
+ desc = "a orange floral shirt for a relaxing day in space."
+ icon_state = "hawaiianorange"
+ item_state = "hawaiianorange"
+ item_color = "hawaiianorange"
+ flags_size = ONESIZEFITSALL
+
+/obj/item/clothing/under/bluehawaiianshirt
+ name = "blue hawaiian shirt"
+ desc = "a blue floral shirt it has a oddly colored pink flower on it."
+ icon_state = "hawaiianblue"
+ item_state = "hawaiianblue"
+ item_color = "hawaiianblue"
+ flags_size = ONESIZEFITSALL
+
diff --git a/code/modules/mob/dead/observer/spells.dm b/code/modules/mob/dead/observer/spells.dm
index 916ff9aa9b8..e890098b29b 100644
--- a/code/modules/mob/dead/observer/spells.dm
+++ b/code/modules/mob/dead/observer/spells.dm
@@ -15,6 +15,7 @@ GLOBAL_LIST_INIT(boo_phrases, list(
ghost = TRUE
+ action_icon_state = "boo"
school = "transmutation"
charge_max = 600
starts_charged = FALSE
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 52636efb896..c0e8badf35d 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -106,6 +106,12 @@
else //Everyone else fails, skip the emote attempt
return
+ if("warble", "warbles")
+ if(isskrell(src)) //Only Skrell can warble.
+ on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
+ else //Everyone else fails, skip the emote attempt
+ return
+
if("scream", "screams")
on_CD = handle_emote_CD(50) //longer cooldown
if("fart", "farts", "flip", "flips", "snap", "snaps")
@@ -221,6 +227,13 @@
playsound(loc, 'sound/effects/voxrustle.ogg', 50, 0) //Credit to sound-ideas (freesfx.co.uk) for the sound.
m_type = 2
+ if("warble", "warbles")
+ var/M = handle_emote_param(param)
+
+ message = "[src] warbles[M ? " at [M]" : ""]."
+ playsound(loc, 'sound/effects/warble.ogg', 50, 0) // Copyright CC BY 3.0 alienistcog (freesound.org) for the sound.
+ m_type = 2
+
if("yes")
var/M = handle_emote_param(param)
@@ -904,6 +917,8 @@
emotelist += "\nVox specific emotes :- quill(s)"
if("Diona")
emotelist += "\nDiona specific emotes :- creak(s)"
+ if("Skrell")
+ emotelist += "\nSkrell specific emotes :- warble(s)"
if(ismachine(src))
emotelist += "\nMachine specific emotes :- beep(s)-(none)/mob, buzz(es)-none/mob, no-(none)/mob, ping(s)-(none)/mob, yes-(none)/mob, buzz2-(none)/mob"
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
index f73ee07441a..5b82f8d35dd 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
@@ -202,7 +202,7 @@ var/global/list/ts_spiderling_list = list()
var/obj/machinery/door/airlock/A = target
if(A.density)
try_open_airlock(A)
- else if(isliving(target))
+ else if(isliving(target) && (!client || a_intent == INTENT_HARM))
var/mob/living/G = target
if(issilicon(G))
G.attack_animal(src)
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 4c9ca937409..f7719c4fd54 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -692,11 +692,9 @@
// pipe is deleted
// ensure if holder is present, it is expelled
/obj/structure/disposalpipe/Destroy()
- var/obj/structure/disposalholder/H = locate() in src
- if(H)
- // holder was present
+ for(var/obj/structure/disposalholder/H in contents)
H.active = 0
- var/turf/T = src.loc
+ var/turf/T = loc
if(T.density)
// deleting pipe is inside a dense turf (wall)
// this is unlikely, but just dump out everything into the turf in case
@@ -709,8 +707,7 @@
return
// otherwise, do normal expel from turf
- if(H)
- expel(H, T, 0)
+ expel(H, T, 0)
return ..()
/obj/structure/disposalpipe/singularity_pull(S, current_size)
diff --git a/code/modules/research/designs/equipment_designs.dm b/code/modules/research/designs/equipment_designs.dm
index 6e485040715..eb0901b71e2 100644
--- a/code/modules/research/designs/equipment_designs.dm
+++ b/code/modules/research/designs/equipment_designs.dm
@@ -125,6 +125,7 @@
name = "Portable Seed Extractor"
desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant."
build_type = PROTOLATHE
+ id = "portaseeder"
req_tech = list("biotech" = 3, "engineering" = 2)
materials = list(MAT_METAL = 1000, MAT_GLASS = 400)
build_path = /obj/item/storage/bag/plants/portaseeder
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index d945722770e..98a181bcdf8 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -101,7 +101,7 @@
materials = list(MAT_METAL = 1000, MAT_GLASS = 500)
construction_time = 75
build_path = /obj/item/mmi
- category = list("Misc","Medical")
+ category = list("Medical")
/datum/design/robotic_brain
name = "Robotic Brain"
@@ -112,7 +112,7 @@
materials = list(MAT_METAL = 1700, MAT_GLASS = 1350, MAT_GOLD = 500) //Gold, because SWAG.
construction_time = 75
build_path = /obj/item/mmi/robotic_brain
- category = list("Misc","Medical")
+ category = list("Medical")
/datum/design/mmi_radio_upgrade
name = "Man-Machine Interface Radio Upgrade"
@@ -123,7 +123,7 @@
materials = list(MAT_METAL = 200)
construction_time = 50
build_path = /obj/item/mmi_radio_upgrade
- category = list("Misc","Medical")
+ category = list("Medical")
/datum/design/nanopaste
name = "Nanopaste"
@@ -288,7 +288,7 @@
construction_time = 40
materials = list(MAT_METAL = 600, MAT_GLASS = 400)
build_path = /obj/item/organ/internal/cyberimp/eyes/shield
- category = list("Misc", "Medical")
+ category = list("Medical")
/datum/design/cyberimp_breather
name = "Breathing Tube Implant"
@@ -299,7 +299,7 @@
construction_time = 35
materials = list(MAT_METAL = 600, MAT_GLASS = 250)
build_path = /obj/item/organ/internal/cyberimp/mouth/breathing_tube
- category = list("Misc", "Medical")
+ category = list("Medical")
/datum/design/cyberimp_surgical
name = "Surgical Arm Implant"
@@ -310,7 +310,7 @@
materials = list(MAT_METAL = 2500, MAT_GLASS = 1500, MAT_SILVER = 1500)
construction_time = 200
build_path = /obj/item/organ/internal/cyberimp/arm/surgery
- category = list("Misc", "Medical")
+ category = list("Medical")
/datum/design/cyberimp_toolset
name = "Toolset Arm Implant"
@@ -321,7 +321,7 @@
materials = list(MAT_METAL = 2500, MAT_GLASS = 1500, MAT_SILVER = 1500)
construction_time = 200
build_path = /obj/item/organ/internal/cyberimp/arm/toolset
- category = list("Misc", "Medical")
+ category = list("Medical")
/datum/design/cyberimp_diagnostic_hud
name = "Diagnostic HUD implant"
@@ -332,7 +332,7 @@
construction_time = 50
materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 500, MAT_GOLD = 500)
build_path = /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic
- category = list("Misc", "Medical")
+ category = list("Medical")
/datum/design/cyberimp_medical_hud
name = "Medical HUD implant"
@@ -343,7 +343,7 @@
construction_time = 50
materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 500, MAT_GOLD = 500)
build_path = /obj/item/organ/internal/cyberimp/eyes/hud/medical
- category = list("Misc", "Medical")
+ category = list("Medical")
/datum/design/cyberimp_security_hud
name = "Security HUD implant"
@@ -354,7 +354,7 @@
construction_time = 50
materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 750, MAT_GOLD = 750)
build_path = /obj/item/organ/internal/cyberimp/eyes/hud/security
- category = list("Misc", "Medical")
+ category = list("Medical")
/datum/design/cyberimp_meson
name = "Meson scanner implant"
@@ -365,7 +365,7 @@
construction_time = 50
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500, MAT_GOLD = 300)
build_path = /obj/item/organ/internal/cyberimp/eyes/meson
- category = list("Misc", "Medical")
+ category = list("Medical")
/datum/design/cyberimp_xray
name = "X-Ray implant"
@@ -376,7 +376,7 @@
construction_time = 60
materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 600, MAT_GOLD = 600, MAT_PLASMA = 1000, MAT_URANIUM = 1000, MAT_DIAMOND = 1000, MAT_BLUESPACE = 1000)
build_path = /obj/item/organ/internal/cyberimp/eyes/xray
- category = list("Misc", "Medical")
+ category = list("Medical")
/datum/design/cyberimp_thermals
name = "Thermals implant"
@@ -387,7 +387,7 @@
construction_time = 60
materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 600, MAT_GOLD = 600, MAT_PLASMA = 1000, MAT_DIAMOND = 2000)
build_path = /obj/item/organ/internal/cyberimp/eyes/thermals
- category = list("Misc", "Medical")
+ category = list("Medical")
/datum/design/cyberimp_antidrop
name = "Anti-Drop implant"
@@ -398,7 +398,7 @@
construction_time = 60
materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 400, MAT_GOLD = 400)
build_path = /obj/item/organ/internal/cyberimp/brain/anti_drop
- category = list("Misc", "Medical")
+ category = list("Medical")
/datum/design/cyberimp_antistun
name = "CNS Rebooter implant"
@@ -409,7 +409,7 @@
construction_time = 60
materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 500, MAT_GOLD = 1000)
build_path = /obj/item/organ/internal/cyberimp/brain/anti_stun
- category = list("Misc", "Medical")
+ category = list("Medical")
/datum/design/cyberimp_clownvoice
name = "Comical implant"
@@ -420,7 +420,7 @@
construction_time = 60
materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_BANANIUM = 200)
build_path = /obj/item/organ/internal/cyberimp/brain/clown_voice
- category = list("Misc", "Medical")
+ category = list("Medical")
/datum/design/cyberimp_nutriment
name = "Nutriment pump implant"
@@ -431,7 +431,7 @@
construction_time = 40
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_GOLD = 500)
build_path = /obj/item/organ/internal/cyberimp/chest/nutriment
- category = list("Misc", "Medical")
+ category = list("Medical")
/datum/design/cyberimp_nutriment_plus
name = "Nutriment pump implant PLUS"
@@ -442,7 +442,7 @@
construction_time = 50
materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_GOLD = 500, MAT_URANIUM = 750)
build_path = /obj/item/organ/internal/cyberimp/chest/nutriment/plus
- category = list("Misc", "Medical")
+ category = list("Medical")
/datum/design/cyberimp_reviver
name = "Reviver implant"
@@ -453,7 +453,7 @@
construction_time = 60
materials = list(MAT_METAL = 800, MAT_GLASS = 800, MAT_GOLD = 300, MAT_URANIUM = 500)
build_path = /obj/item/organ/internal/cyberimp/chest/reviver
- category = list("Misc", "Medical")
+ category = list("Medical")
/////////////////////////////////////////
////////////Regular Implants/////////////
@@ -508,6 +508,7 @@
req_tech = list("biotech" = 4, "materials" = 4)
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 500, MAT_GLASS = 500)
+ construction_time = 60
build_path = /obj/item/organ/internal/eyes/cybernetic
category = list("Medical")
@@ -518,6 +519,7 @@
req_tech = list("biotech" = 4, "materials" = 4)
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 500, MAT_GLASS = 500)
+ construction_time = 60
build_path = /obj/item/organ/internal/liver/cybernetic
category = list("Medical")
@@ -528,6 +530,7 @@
req_tech = list("biotech" = 4, "materials" = 4)
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 500, MAT_GLASS = 500)
+ construction_time = 60
build_path = /obj/item/organ/internal/kidneys/cybernetic
category = list("Medical")
@@ -538,6 +541,7 @@
req_tech = list("biotech" = 4, "materials" = 4)
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 500, MAT_GLASS = 500)
+ construction_time = 60
build_path = /obj/item/organ/internal/heart/cybernetic
category = list("Medical")
@@ -548,6 +552,7 @@
req_tech = list("biotech" = 5, "materials" = 5, "engineering" = 5)
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500)
+ construction_time = 60
build_path = /obj/item/organ/internal/heart/cybernetic/upgraded
category = list("Medical")
@@ -558,6 +563,7 @@
req_tech = list("biotech" = 4, "materials" = 4)
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 500, MAT_GLASS = 500)
+ construction_time = 60
build_path = /obj/item/organ/internal/lungs/cybernetic
category = list("Medical")
@@ -568,5 +574,6 @@
req_tech = list("biotech" = 5, "materials" = 5, "engineering" = 5)
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500)
+ construction_time = 60
build_path = /obj/item/organ/internal/lungs/cybernetic/upgraded
category = list("Medical")
diff --git a/html/changelogs/AutoChangeLog-pr-11166.yml b/html/changelogs/AutoChangeLog-pr-11166.yml
new file mode 100644
index 00000000000..c22380edf97
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11166.yml
@@ -0,0 +1,5 @@
+author: "craftxbox"
+delete-after: True
+changes:
+ - tweak: "Highlight string uses regex"
+ - rscdel: "Removed jquery mark"
diff --git a/html/changelogs/AutoChangeLog-pr-11447.yml b/html/changelogs/AutoChangeLog-pr-11447.yml
new file mode 100644
index 00000000000..c1376becfc4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11447.yml
@@ -0,0 +1,4 @@
+author: "Kyep"
+delete-after: True
+changes:
+ - bugfix: "Disarming/grabbing a door with IDSCAN disabled no longer results in a can_admin_interact runtime error."
diff --git a/html/changelogs/AutoChangeLog-pr-11522.yml b/html/changelogs/AutoChangeLog-pr-11522.yml
new file mode 100644
index 00000000000..736de7a16ec
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11522.yml
@@ -0,0 +1,4 @@
+author: "Couls"
+delete-after: True
+changes:
+ - rscadd: "Medical category to exosuit fabricator with implants and cybernetics"
diff --git a/html/changelogs/AutoChangeLog-pr-11581.yml b/html/changelogs/AutoChangeLog-pr-11581.yml
new file mode 100644
index 00000000000..0610a90a465
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11581.yml
@@ -0,0 +1,5 @@
+author: "uc_guy"
+delete-after: True
+changes:
+ - bugfix: "Theft objective locations hints now ignore the Centcomm Z level."
+ - bugfix: "Adv. Pinpointer no longer targets items in Centcom Z level."
diff --git a/html/changelogs/AutoChangeLog-pr-11586.yml b/html/changelogs/AutoChangeLog-pr-11586.yml
new file mode 100644
index 00000000000..871d5cf3d31
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11586.yml
@@ -0,0 +1,4 @@
+author: "iantine"
+delete-after: True
+changes:
+ - rscadd: "Skrell *warble emote"
diff --git a/html/changelogs/AutoChangeLog-pr-11591.yml b/html/changelogs/AutoChangeLog-pr-11591.yml
new file mode 100644
index 00000000000..6b87eda36f7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11591.yml
@@ -0,0 +1,4 @@
+author: "Citinited"
+delete-after: True
+changes:
+ - bugfix: "Destroying a disposals trunk should no longer occasionally delete things held inside it."
diff --git a/html/changelogs/AutoChangeLog-pr-11610.yml b/html/changelogs/AutoChangeLog-pr-11610.yml
new file mode 100644
index 00000000000..a8b120b5cb3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11610.yml
@@ -0,0 +1,4 @@
+author: "Arkatos"
+delete-after: True
+changes:
+ - imageadd: "Added new Boo! spell icon"
diff --git a/html/changelogs/AutoChangeLog-pr-11681.yml b/html/changelogs/AutoChangeLog-pr-11681.yml
new file mode 100644
index 00000000000..1f3cd52eecf
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11681.yml
@@ -0,0 +1,4 @@
+author: "Couls"
+delete-after: True
+changes:
+ - bugfix: "codephrase names no longer appear blank"
diff --git a/html/changelogs/AutoChangeLog-pr-11715.yml b/html/changelogs/AutoChangeLog-pr-11715.yml
new file mode 100644
index 00000000000..bba6cb85647
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11715.yml
@@ -0,0 +1,4 @@
+author: "Improvedname"
+delete-after: True
+changes:
+ - tweak: "Cargo miner starter kit crate will no longer include a ID"
diff --git a/html/changelogs/AutoChangeLog-pr-11724.yml b/html/changelogs/AutoChangeLog-pr-11724.yml
new file mode 100644
index 00000000000..4e16f5bf117
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11724.yml
@@ -0,0 +1,4 @@
+author: "Kyep"
+delete-after: True
+changes:
+ - bugfix: "Terror Spiders no longer trigger their special attack when nuzzling someone on help intent."
diff --git a/html/changelogs/AutoChangeLog-pr-11728.yml b/html/changelogs/AutoChangeLog-pr-11728.yml
new file mode 100644
index 00000000000..39e13e545c3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11728.yml
@@ -0,0 +1,4 @@
+author: "Citinited"
+delete-after: True
+changes:
+ - imageadd: "Ports liquid dispenser sprites from tgstation."
diff --git a/html/changelogs/AutoChangeLog-pr-11733.yml b/html/changelogs/AutoChangeLog-pr-11733.yml
new file mode 100644
index 00000000000..da551ed3006
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11733.yml
@@ -0,0 +1,4 @@
+author: "Ty-Omaha"
+delete-after: True
+changes:
+ - bugfix: "Manual bans now auto-note"
diff --git a/html/changelogs/AutoChangeLog-pr-11738.yml b/html/changelogs/AutoChangeLog-pr-11738.yml
new file mode 100644
index 00000000000..7fdeaa831d7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11738.yml
@@ -0,0 +1,4 @@
+author: "Evankhell561"
+delete-after: True
+changes:
+ - bugfix: "Portable Seed Extractor designon the protolathe."
diff --git a/html/changelogs/AutoChangeLog-pr-11748.yml b/html/changelogs/AutoChangeLog-pr-11748.yml
new file mode 100644
index 00000000000..8cbe2ed5e82
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11748.yml
@@ -0,0 +1,4 @@
+author: "Ty-Omaha"
+delete-after: True
+changes:
+ - bugfix: "Stops projectiles using the legacy system such as emitters from hurting shield blobs due to an exploit where it would always hit or go through."
diff --git a/html/changelogs/AutoChangeLog-pr-11756.yml b/html/changelogs/AutoChangeLog-pr-11756.yml
new file mode 100644
index 00000000000..4b65117170e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11756.yml
@@ -0,0 +1,4 @@
+author: "farie82"
+delete-after: True
+changes:
+ - rscdel: "Reverts the string highlighting done by regex"
diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi
index ea66e024a19..d3976bfff61 100644
Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ
diff --git a/icons/mob/species/drask/uniform.dmi b/icons/mob/species/drask/uniform.dmi
index d29b598dec3..ab315263ed9 100644
Binary files a/icons/mob/species/drask/uniform.dmi and b/icons/mob/species/drask/uniform.dmi differ
diff --git a/icons/mob/species/grey/uniform.dmi b/icons/mob/species/grey/uniform.dmi
index e71e020ff4a..ddf0250fdc5 100644
Binary files a/icons/mob/species/grey/uniform.dmi and b/icons/mob/species/grey/uniform.dmi differ
diff --git a/icons/mob/species/vox/uniform.dmi b/icons/mob/species/vox/uniform.dmi
index b8169f9bd51..18a3e07ce76 100644
Binary files a/icons/mob/species/vox/uniform.dmi and b/icons/mob/species/vox/uniform.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index e5102b7eee9..69f9e04895e 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index c39331ce8d4..78586b72dfc 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 469934ca932..f48f0e9f07a 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/sound/effects/warble.ogg b/sound/effects/warble.ogg
new file mode 100644
index 00000000000..420ae974c83
Binary files /dev/null and b/sound/effects/warble.ogg differ