diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm
index 1a482e6d24..63c9c1a24e 100644
--- a/code/_helpers/global_lists.dm
+++ b/code/_helpers/global_lists.dm
@@ -42,6 +42,7 @@ var/global/list/facial_hair_styles_male_list = list()
var/global/list/facial_hair_styles_female_list = list()
var/global/list/skin_styles_female_list = list() //unused
var/global/list/body_marking_styles_list = list() //stores /datum/sprite_accessory/marking indexed by name
+var/global/list/body_marking_nopersist_list = list() // Body marking styles, minus non-genetic markings and augments
var/global/list/ear_styles_list = list() // Stores /datum/sprite_accessory/ears indexed by type
var/global/list/tail_styles_list = list() // Stores /datum/sprite_accessory/tail indexed by type
var/global/list/wing_styles_list = list() // Stores /datum/sprite_accessory/wing indexed by type
@@ -149,6 +150,8 @@ GLOBAL_LIST_EMPTY(mannequins)
for(var/path in paths)
var/datum/sprite_accessory/marking/M = new path()
body_marking_styles_list[M.name] = M
+ if(!M.genetic)
+ body_marking_nopersist_list[M.name] = M
//Surgery Steps - Initialize all /datum/surgery_step into a list
paths = subtypesof(/datum/surgery_step)
diff --git a/code/controllers/subsystems/supply.dm b/code/controllers/subsystems/supply.dm
index 04908f3f31..af096c33a8 100644
--- a/code/controllers/subsystems/supply.dm
+++ b/code/controllers/subsystems/supply.dm
@@ -56,6 +56,8 @@ SUBSYSTEM_DEF(supply)
return 1
if(istype(A,/obj/item/device/perfect_tele_beacon)) //VOREStation Addition: Translocator beacons
return 1 //VOREStation Addition: Translocator beacons
+ if(istype(A,/obj/machinery/power/quantumpad)) // //VOREStation Add: Quantum pads
+ return 1 //VOREStation Add: Quantum pads
for(var/atom/B in A.contents)
if(.(B))
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index 93a2895311..df62ad8ecf 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -123,6 +123,7 @@ var/global/list/datum/dna/gene/dna_genes[0]
// New stuff
var/species = SPECIES_HUMAN
var/list/body_markings = list()
+ var/list/body_markings_genetic = list()
var/list/body_descriptors = null
var/list/genetic_modifiers = list() // Modifiers with the MODIFIER_GENETIC flag are saved. Note that only the type is saved, not an instance.
@@ -143,6 +144,8 @@ var/global/list/datum/dna/gene/dna_genes[0]
new_dna.custom_ask=custom_ask //VOREStaton Edit
new_dna.custom_whisper=custom_whisper //VOREStaton Edit
new_dna.custom_exclaim=custom_exclaim //VOREStaton Edit
+ var/list/body_markings_genetic = (body_markings - body_marking_nopersist_list)
+ new_dna.body_markings=body_markings_genetic.Copy()
for(var/b=1;b<=DNA_SE_LENGTH;b++)
new_dna.SE[b]=SE[b]
if(b<=DNA_UI_LENGTH)
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index a2f310aaf1..6a61f01502 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -50,6 +50,11 @@
if(istype(P, /obj/item/weapon/circuitboard))
var/obj/item/weapon/circuitboard/B = P
if(B.board_type == "machine")
+ //VOREStation Addition End
+ if(istype(B, /obj/item/weapon/circuitboard/quantumpad) && istype(get_area(src), /area/shuttle))
+ to_chat(user, "This is too unstable a platform for a quantum pad to operate on!")
+ return
+ //VOREStation Addition End
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
to_chat(user, "You add the circuit board to the frame.")
circuit = P
diff --git a/code/game/objects/items/weapons/capture_crystal.dm b/code/game/objects/items/weapons/capture_crystal.dm
index 8b225d9298..5e492eec34 100644
--- a/code/game/objects/items/weapons/capture_crystal.dm
+++ b/code/game/objects/items/weapons/capture_crystal.dm
@@ -1,5 +1,5 @@
/obj/item/capture_crystal
- name = "Curious Crystal"
+ name = "curious crystal"
desc = "A silent, unassuming crystal in what appears to be some kind of steel housing."
icon = 'icons/obj/capture_crystal_vr.dmi'
icon_state = "inactive"
diff --git a/code/game/objects/items/weapons/implants/implantlanguage.dm b/code/game/objects/items/weapons/implants/implantlanguage.dm
index 692cdd381f..595e40c2b9 100644
--- a/code/game/objects/items/weapons/implants/implantlanguage.dm
+++ b/code/game/objects/items/weapons/implants/implantlanguage.dm
@@ -7,6 +7,7 @@
desc = "An implant allowing someone to speak the range of frequencies used in Galactic Common, as well as produce any phonemes that they usually cannot. Only helps with producing sounds, not understanding them."
known_implant = TRUE
var/list/languages = list(LANGUAGE_GALCOM) // List of languages that this assists with
+ initialize_loc = BP_HEAD
/obj/item/weapon/implant/language/post_implant(mob/M) // Amends the mob's voice organ, then deletes itself
if(ishuman(M))
diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm
index a03effa2e2..fb07754d1e 100644
--- a/code/game/turfs/simulated/wall_attacks.dm
+++ b/code/game/turfs/simulated/wall_attacks.dm
@@ -240,6 +240,7 @@
return
// Basic dismantling.
+ var/dismantle_toolspeed = 0
if(isnull(construction_stage) || !reinf_material)
var/cut_delay = 60 - material.cut_delay
@@ -259,6 +260,7 @@
else if(istype(W,/obj/item/weapon/melee/energy/blade))
dismantle_sound = "sparks"
dismantle_verb = "slicing"
+ dismantle_toolspeed = 1
cut_delay *= 0.5
else if(istype(W,/obj/item/weapon/pickaxe))
var/obj/item/weapon/pickaxe/P = W
@@ -272,7 +274,7 @@
if(dismantle_sound)
playsound(src, dismantle_sound, 100, 1)
- if(cut_delay<0)
+ if(cut_delay < 0)
cut_delay = 0
if(!do_after(user,cut_delay * W.toolspeed))
@@ -386,7 +388,7 @@
construction_stage = 0
user.update_examine_panel(src)
update_icon()
- to_chat(user, "The slice through the support rods.")
+ to_chat(user, "You slice through the support rods.")
return
if(0)
if(W.is_crowbar())
diff --git a/code/modules/client/preference_setup/loadout/loadout_cyberware.dm b/code/modules/client/preference_setup/loadout/loadout_cyberware.dm
index 2540e86fc8..1fac24c862 100644
--- a/code/modules/client/preference_setup/loadout/loadout_cyberware.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_cyberware.dm
@@ -12,19 +12,6 @@
path = /obj/item/weapon/implant/tracking/weak
cost = 0 //VOREStation Edit. Changed cost to 0
-// Remove these after generic implant has been in for awhile and everyone has had a reasonable period to copy their old descs.
-/datum/gear/utility/implant/dud1
- display_name = "implant, head"
- description = "An implant with no obvious purpose (DEPRECATED, USE GENERIC IMPLANT)."
- path = /obj/item/weapon/implant/dud
- cost = 1
-/datum/gear/utility/implant/dud2
- display_name = "implant, torso"
- description = "An implant with no obvious purpose (DEPRECATED, USE GENERIC IMPLANT)."
- path = /obj/item/weapon/implant/dud/torso
- cost = 1
-// End removal marker.
-
/datum/gear/utility/implant/generic
display_name = "implant, generic, primary"
description = "An implant with no obvious purpose."
diff --git a/code/modules/client/stored_item.dm b/code/modules/client/stored_item.dm
index 6ce1a4c524..d2210b2245 100644
--- a/code/modules/client/stored_item.dm
+++ b/code/modules/client/stored_item.dm
@@ -246,3 +246,7 @@
persist_storable = FALSE
/obj/item/weapon/reagent_containers/food/snacks/grown
persist_storable = FALSE
+/obj/item/weapon/stock_parts
+ persist_storable = FALSE
+/obj/item/weapon/rcd
+ persist_storable = FALSE
\ No newline at end of file
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index d27edd297b..e46fd9fc29 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -36,6 +36,9 @@
qdel(selected_image)
QDEL_NULL(vorePanel) //VOREStation Add
QDEL_LIST_NULL(vore_organs) //VOREStation Add
+ temp_language_sources = null //VOREStation Add
+ temp_languages = null //VOREStation Add
+
if(LAZYLEN(organs))
organs_by_name.Cut()
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index a71c2b2963..5f5a3bfe69 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -2062,9 +2062,12 @@ shaved
color_blend_mode = ICON_ADD
+ var/genetic = TRUE
var/body_parts = list() //A list of bodyparts this covers, in organ_tag defines
//Reminder: BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD
+//Tattoos
+
/datum/sprite_accessory/marking/tat_rheart
name = "Tattoo (Heart, R. Arm)"
icon_state = "tat_rheart"
@@ -2117,6 +2120,300 @@ shaved
icon_state = "tat_tiger"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN)
+//New tats
+
+/datum/sprite_accessory/marking/tat_belly
+ name = "Tattoo (Belly)"
+ icon_state = "tat_belly"
+ body_parts = list(BP_TORSO)
+
+/datum/sprite_accessory/marking/tat_forrest_left
+ name = "Tattoo (Forrest, Left Eye)"
+ icon_state = "tat_forrest_l"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/tat_forrest_right
+ name = "Tattoo (Forrest, Right Eye)"
+ icon_state = "tat_forrest_r"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/tat_hunter_left
+ name = "Tattoo (Hunter, Left Eye)"
+ icon_state = "tat_hunter_l"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/tat_hunter_right
+ name = "Tattoo (Hunter, Right Eye)"
+ icon_state = "tat_hunter_r"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/tat_jaeger_left
+ name = "Tattoo (Jaeger, Left Eye)"
+ icon_state = "tat_jaeger_l"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/tat_jaeger_right
+ name = "Tattoo (Jaeger, Right Eye)"
+ icon_state = "tat_jaeger_r"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/tat_kater_left
+ name = "Tattoo (Kater, Left Eye)"
+ icon_state = "tat_kater_l"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/tat_kater_right
+ name = "Tattoo (Kater, Right Eye)"
+ icon_state = "tat_kater_r"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/tat_lujan_left
+ name = "Tattoo (Lujan, Left Eye)"
+ icon_state = "tat_lujan_l"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/tat_lujan_right
+ name = "Tattoo (Lujan, Right Eye)"
+ icon_state = "tat_lujan_r"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/tat_montana_left
+ name = "Tattoo (Montana, Left Face)"
+ icon_state = "tat_montana_l"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/tat_montana_right
+ name = "Tattoo (Montana, Right Face)"
+ icon_state = "tat_montana_r"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/tat_natasha_left
+ name = "Tattoo (Natasha, Left Eye)"
+ icon_state = "tat_natasha_l"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/tat_natasha_right
+ name = "Tattoo (Natasha, Right Eye)"
+ icon_state = "tat_natasha_r"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/tat_tamoko
+ name = "Tattoo (Ta Moko, Face)"
+ icon_state = "tat_tamoko"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/tat_toshi_left
+ name = "Tattoo (Toshi, Left Eye)"
+ icon_state = "tat_toshi_l"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/tat_toshi_right
+ name = "Tattoo (Volgin, Right Eye)"
+ icon_state = "tat_toshi_r"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/tat_wings_back
+ name = "Tattoo (Wings, Lower Back)"
+ icon_state = "tat_wingsback"
+ body_parts = list(BP_TORSO)
+
+/datum/sprite_accessory/marking/tilaka
+ name = "Tilaka"
+ icon_state = "tilaka"
+ body_parts = list(BP_HEAD)
+
+
+/datum/sprite_accessory/marking/bands
+ name = "Color Bands"
+ icon_state = "bands"
+ body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN)
+
+/datum/sprite_accessory/marking/bandsface
+ name = "Color Bands (Face)"
+ icon_state = "bandsface"
+ body_parts = list(BP_HEAD)
+ species_allowed = list(SPECIES_TAJ,SPECIES_UNATHI)
+
+/datum/sprite_accessory/marking/bandsface_human
+ name = "Color Bands (Face)"
+ icon_state = "bandshumanface"
+ body_parts = list(BP_HEAD)
+ species_allowed = list(SPECIES_HUMAN,SPECIES_HUMAN_VATBORN,SPECIES_SKRELL)
+
+/datum/sprite_accessory/marking/tiger_stripes
+ name = "Tiger Stripes"
+ icon_state = "tiger"
+ body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_GROIN)
+ species_allowed = list(SPECIES_TAJ) //There's a tattoo for non-cats
+
+/datum/sprite_accessory/marking/tigerhead
+ name = "Tiger Stripes (Head, Minor)"
+ icon_state = "tigerhead"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/tigerface
+ name = "Tiger Stripes (Head, Major)"
+ icon_state = "tigerface"
+ body_parts = list(BP_HEAD)
+ species_allowed = list(SPECIES_TAJ) //There's a tattoo for non-cats
+
+/datum/sprite_accessory/marking/backstripe
+ name = "Back Stripe"
+ icon_state = "backstripe"
+ body_parts = list(BP_TORSO)
+
+/datum/sprite_accessory/marking/bindi
+ name = "Bindi"
+ icon_state = "bindi"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/blush
+ name = "Blush"
+ icon_state= "blush"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/bridge
+ name = "Bridge"
+ icon_state = "bridge"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/brow_left
+ name = "Brow Left"
+ icon_state = "brow_l"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/brow_right
+ name = "Brow Right"
+ icon_state = "brow_r"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/cheekspot_left
+ name = "Cheek Spot (Left Cheek)"
+ icon_state = "cheekspot_l"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/cheekspot_right
+ name = "Cheek Spot (Right Cheek)"
+ icon_state = "cheekspot_r"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/cheshire_left
+ name = "Cheshire (Left Cheek)"
+ icon_state = "cheshire_l"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/cheshire_right
+ name = "Cheshire (Right Cheek)"
+ icon_state = "cheshire_r"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/eyestripe
+ name = "Eye Stripe"
+ icon_state = "eyestripe"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/eyecorner_left
+ name = "Eye Corner Left"
+ icon_state = "eyecorner_l"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/eyecorner_right
+ name = "Eye Corner Right"
+ icon_state = "eyecorner_r"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/fullfacepaint
+ name = "Full Face Paint"
+ icon_state = "fullface"
+ body_parts = list(BP_HEAD)
+ species_allowed = list(SPECIES_HUMAN,SPECIES_HUMAN_VATBORN,SPECIES_SKRELL)
+
+/datum/sprite_accessory/marking/lips
+ name = "Lips"
+ icon_state = "lips"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/lowercheek_left
+ name = "Lower Cheek Left"
+ icon_state = "lowercheek_l"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/lowercheek_left
+ name = "Lower Cheek Right"
+ icon_state = "lowercheek_r"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/neck
+ name = "Neck Cover"
+ icon_state = "neck"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/neckthick
+ name = "Neck Cover (Thick)"
+ icon_state = "neckthick"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/nosestripe
+ name = "Nose Stripe"
+ icon_state = "nosestripe"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/nosetape
+ name = "Nose Tape"
+ icon_state = "nosetape"
+ body_parts = list(BP_HEAD)
+ genetic = FALSE
+
+/datum/sprite_accessory/marking/scratch_abdomen_left
+ name = "Scar, Abdomen Left"
+ icon_state = "scratch_abdomen_l"
+ body_parts = list(BP_TORSO)
+
+/datum/sprite_accessory/marking/scratch_abdomen_right
+ name = "Scar, Abdomen Right"
+ icon_state = "scratch_abdomen_r"
+ body_parts = list(BP_TORSO)
+
+/datum/sprite_accessory/marking/scratch_abdomen_small_left
+ name = "Scar, Abdomen Small Left"
+ icon_state = "scratch_abdomensmall_l"
+ body_parts = list(BP_TORSO)
+
+/datum/sprite_accessory/marking/scratch_abdomen_small_right
+ name = "Scar, Abdomen Small Right"
+ icon_state = "scratch_abdomensmall_r"
+ body_parts = list(BP_TORSO)
+
+/datum/sprite_accessory/marking/scratch_back
+ name = "Scar, Back"
+ icon_state = "scratch_back"
+ body_parts = list(BP_TORSO)
+
+/datum/sprite_accessory/marking/scratch_chest_left
+ name = "Scar, Chest (Left)"
+ icon_state = "scratch_chest_l"
+ body_parts = list(BP_TORSO)
+
+/datum/sprite_accessory/marking/scratch_chest_right
+ name = "Scar, Chest (Right)"
+ icon_state = "scratch_chest_r"
+ body_parts = list(BP_TORSO)
+
+/datum/sprite_accessory/marking/skull_paint
+ name = "Skull Paint"
+ icon_state = "skull"
+ body_parts = list(BP_HEAD)
+ genetic = FALSE
+
+//Heterochromia
+
+/datum/sprite_accessory/marking/heterochromia
+ name = "Heterochromia (right eye)"
+ icon_state = "heterochromia"
+ body_parts = list(BP_HEAD)
+
+//Taj/Unathi shared markings
+
/datum/sprite_accessory/marking/taj_paw_socks
name = "Socks Coloration (Taj)"
icon_state = "taj_pawsocks"
@@ -2171,42 +2468,6 @@ shaved
body_parts = list(BP_HEAD)
species_allowed = list(SPECIES_TAJ)
-/datum/sprite_accessory/marking/bands
- name = "Color Bands"
- icon_state = "bands"
- body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN)
-
-/datum/sprite_accessory/marking/bandsface
- name = "Color Bands (Face)"
- icon_state = "bandsface"
- body_parts = list(BP_HEAD)
-
-/datum/sprite_accessory/marking/tiger_stripes
- name = "Tiger Stripes"
- icon_state = "tiger"
- body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_GROIN)
- species_allowed = list(SPECIES_TAJ) //There's a tattoo for non-cats
-
-/datum/sprite_accessory/marking/tigerhead
- name = "Tiger Stripes (Head, Minor)"
- icon_state = "tigerhead"
- body_parts = list(BP_HEAD)
-
-/datum/sprite_accessory/marking/tigerface
- name = "Tiger Stripes (Head, Major)"
- icon_state = "tigerface"
- body_parts = list(BP_HEAD)
- species_allowed = list(SPECIES_TAJ) //There's a tattoo for non-cats
-
-/datum/sprite_accessory/marking/backstripe
- name = "Back Stripe"
- icon_state = "backstripe"
- body_parts = list(BP_TORSO)
-
-/datum/sprite_accessory/marking/heterochromia
- name = "Heterochromia (right eye)"
- icon_state = "heterochromia"
- body_parts = list(BP_HEAD)
//Taj specific stuff
/datum/sprite_accessory/marking/taj_belly
@@ -2340,10 +2601,174 @@ shaved
do_colouration = 0
+//Cybernetic Augments, some species-limited due to sprite misalignment. /aug/ types are excluded from dna.
+
+/datum/sprite_accessory/marking/aug
+ name = "Augment (Backports, Back)"
+ icon_state = "aug_backports"
+ genetic = FALSE
+ body_parts = list(BP_TORSO)
+ species_allowed = list(SPECIES_HUMAN,SPECIES_SKRELL,SPECIES_TAJ,SPECIES_HUMAN_VATBORN,SPECIES_UNATHI,SPECIES_ZADDAT)
+
+/datum/sprite_accessory/marking/aug/diode
+ name = "Augment (Backports Diode, Back)"
+ icon_state = "aug_backportsdiode"
+
+/datum/sprite_accessory/marking/aug/backportswide
+ name = "Augment (Backports Wide, Back)"
+ icon_state = "aug_backportswide"
+ body_parts = list(BP_TORSO)
+
+/datum/sprite_accessory/marking/aug/backportswide/diode
+ name = "Augment (Backports Wide Diode, Back)"
+ icon_state = "aug_backportswidediode"
+
+/datum/sprite_accessory/marking/aug/headcase
+ name = "Augment (Headcase, Head)"
+ icon_state = "aug_headcase"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/aug/headcase_light
+ name = "Augment (Headcase Light, Head)"
+ icon_state = "aug_headcaselight"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/aug/headport
+ name = "Augment (Headport, Head)"
+ icon_state = "aug_headport"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/aug/headport/diode
+ name = "Augment (Headport Diode, Head)"
+ icon_state = "aug_headplugdiode"
+
+/datum/sprite_accessory/marking/aug/lowerjaw
+ name = "Augment (Lower Jaw, Head)"
+ icon_state = "aug_lowerjaw"
+ body_parts = list(BP_HEAD)
+ species_allowed = list(SPECIES_HUMAN,SPECIES_SKRELL,SPECIES_HUMAN_VATBORN,SPECIES_ZADDAT)
+
+/datum/sprite_accessory/marking/aug/scalpports
+ name = "Augment (Scalp Ports)"
+ icon_state = "aug_scalpports"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/aug/scalpports/vertex_left
+ name = "Augment (Scalp Port, Vertex Left)"
+ icon_state = "aug_vertexport_l"
+
+/datum/sprite_accessory/marking/aug/scalpports/vertex_right
+ name = "Augment (Scalp Port, Vertex Right)"
+ icon_state = "aug_vertexport_r"
+
+/datum/sprite_accessory/marking/aug/scalpports/occipital_left
+ name = "Augment (Scalp Port, Occipital Left)"
+ icon_state = "aug_occipitalport_l"
+
+/datum/sprite_accessory/marking/aug/scalpports/occipital_right
+ name = "Augment (Scalp Port, Occipital Right)"
+ icon_state = "aug_occipitalport_r"
+
+/datum/sprite_accessory/marking/aug/scalpportsdiode
+ name = "Augment (Scalp Ports Diode)"
+ icon_state = "aug_scalpportsdiode"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/aug/scalpportsdiode/vertex_left
+ name = "Augment (Scalp Port Diode, Vertex Left)"
+ icon_state = "aug_vertexportdiode_l"
+
+/datum/sprite_accessory/marking/aug/scalpportsdiode/vertex_right
+ name = "Augment (Scalp Port Diode, Vertex Right)"
+ icon_state = "aug_vertexportdiode_r"
+
+/datum/sprite_accessory/marking/aug/scalpportsdiode/occipital_left
+ name = "Augment (Scalp Port Diode, Occipital Left)"
+ icon_state = "aug_occipitalportdiode_l"
+
+/datum/sprite_accessory/marking/aug/scalpportsdiode/occipital_right
+ name = "Augment (Scalp Port Diode, Occipital Right)"
+ icon_state = "aug_occipitalportdiode_r"
+
+/datum/sprite_accessory/marking/aug/backside_left
+ name = "Augment (Backside Left, Head)"
+ icon_state = "aug_backside_l"
+
+/datum/sprite_accessory/marking/aug/backside_left/side_diode
+ name = "Augment (Backside Left Diode, Head)"
+ icon_state = "aug_sidediode_l"
+
+/datum/sprite_accessory/marking/aug/backside_right
+ name = "Augment (Backside Right, Head)"
+ icon_state = "aug_backside_r"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/aug/backside_right/side_diode
+ name = "Augment (Backside Right Diode, Head)"
+ icon_state = "aug_sidediode_r"
+
+/datum/sprite_accessory/marking/aug/side_deunan_left
+ name = "Augment (Deunan, Side Left)"
+ icon_state = "aug_sidedeunan_l"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/aug/side_deunan_right
+ name = "Augment (Deunan, Side Right)"
+ icon_state = "aug_sidedeunan_r"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/aug/side_kuze_left
+ name = "Augment (Kuze, Side Left)"
+ icon_state = "aug_sidekuze_l"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/aug/side_kuze_left/side_diode
+ name = "Augment (Kuze Diode, Side Left)"
+ icon_state = "aug_sidekuzediode_l"
+
+/datum/sprite_accessory/marking/aug/side_kuze_right
+ name = "Augment (Kuze, Side Right)"
+ icon_state = "aug_sidekuze_r"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/aug/side_kuze_right/side_diode
+ name = "Augment (Kuze Diode, Side Right)"
+ icon_state = "aug_sidekuzediode_r"
+
+/datum/sprite_accessory/marking/aug/side_kinzie_left
+ name = "Augment (Kinzie, Side Left)"
+ icon_state = "aug_sidekinzie_l"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/aug/side_kinzie_right
+ name = "Augment (Kinzie, Side Right)"
+ icon_state = "aug_sidekinzie_r"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/aug/side_shelly_left
+ name = "Augment (Shelly, Side Left)"
+ icon_state = "aug_sideshelly_l"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/aug/side_shelly_right
+ name = "Augment (Shelly, Side Right)"
+ icon_state = "aug_sideshelly_r"
+ body_parts = list(BP_HEAD)
+
+/datum/sprite_accessory/marking/aug/chestports
+ name = "Augment (Chest Ports)"
+ icon_state = "aug_chestports"
+ body_parts = list(BP_TORSO)
+
+/datum/sprite_accessory/marking/aug/abdomenports
+ name = "Augment (Abdomen Ports)"
+ icon_state = "aug_abdomenports"
+ body_parts = list(BP_TORSO)
//skin styles - WIP
//going to have to re-integrate this with surgery
//let the icon_state hold an icon preview for now
+
/datum/sprite_accessory/skin
icon = 'icons/mob/human_races/r_human.dmi'
diff --git a/code/modules/shieldgen/directional_shield.dm b/code/modules/shieldgen/directional_shield.dm
index 2677a56536..209dc9ca9a 100644
--- a/code/modules/shieldgen/directional_shield.dm
+++ b/code/modules/shieldgen/directional_shield.dm
@@ -103,7 +103,7 @@
if(always_on)
create_shields()
GLOB.moved_event.register(src, src, .proc/moved_event)
- ..()
+ return ..()
/obj/item/shield_projector/Destroy()
destroy_shields()
diff --git a/code/modules/telesci/quantum_pad.dm b/code/modules/telesci/quantum_pad.dm
index a55004e404..1ca5dfbf4e 100644
--- a/code/modules/telesci/quantum_pad.dm
+++ b/code/modules/telesci/quantum_pad.dm
@@ -65,6 +65,11 @@
return
if(istype(I, /obj/item/device/multitool))
+ //VOREStation Addition Start
+ if(istype(get_area(src), /area/shuttle))
+ to_chat(user, "This is too unstable a platform for \the [src] to operate on!")
+ return
+ //VOREStation Addition End
if(panel_open)
var/obj/item/device/multitool/M = I
M.connectable = src
@@ -128,6 +133,10 @@
if(istype(get_area(src), /area/shuttle))
to_chat(user, "This is too unstable a platform for \the [src] to operate on!")
+ //VOREStation Addition Start
+ if(linked_pad)
+ linked_pad.linked_pad = null
+ //VOREStation Addition End
return
if(!powernet)
@@ -175,6 +184,11 @@
update_icon()
if(!linked_pad)
return
+ //VOREStation Addition Start
+ if(istype(get_area(src), /area/shuttle))
+ to_chat(user, "This is too unstable a platform for \the [src] to operate on!")
+ return
+ //VOREStation Addition End
playsound(src, 'sound/weapons/flash.ogg', 25, 1)
teleporting = 1
diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index e9e5baab15..f96af5c204 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -374,6 +374,7 @@
ML.muffled = 0
if(ML.absorbed)
ML.absorbed = FALSE
+ handle_absorb_langs(ML, owner)
if(ishuman(M) && ishuman(OW))
var/mob/living/carbon/human/Prey = M
var/mob/living/carbon/human/Pred = OW
@@ -676,6 +677,11 @@
absorb_alert_prey = replacetext(absorb_alert_prey, "%countprey", absorbed_count)
M.absorbed = TRUE
+ if(M.ckey)
+ owner.temp_language_sources += M
+ M.temp_language_sources += owner
+ handle_absorb_langs(M, owner)
+
to_chat(M, "[absorb_alert_prey]")
to_chat(owner, "[absorb_alert_owner]")
if(M.noisy) //Mute drained absorbee hunger if enabled.
@@ -741,6 +747,7 @@
unabsorb_alert_prey = replacetext(unabsorb_alert_prey, "%countprey", absorbed_count)
M.absorbed = FALSE
+ handle_absorb_langs(M, owner)
to_chat(M, "[unabsorb_alert_prey]")
to_chat(owner, "[unabsorb_alert_owner]")
@@ -752,6 +759,39 @@
if(isanimal(owner))
owner.update_icon()
+/////////////////////////////////////////////////////////////////////////
+/obj/belly/proc/handle_absorb_langs(var/mob/living/prey, var/mob/living/pred)
+ for(var/mob/living/p in pred.temp_language_sources) //Let's look at the pred's sources
+ if (!p.absorbed)
+ for(var/L in pred.temp_languages)
+ if(L in p.languages)
+ pred.languages -= L
+ pred.temp_languages -= L
+ pred.temp_language_sources -= p
+ else
+ for(var/L in p.languages)
+ if(L in pred.languages)
+ continue
+ pred.languages += L
+ pred.temp_languages += L
+
+ for(var/mob/living/P in prey.temp_language_sources) //Let's look at the prey's sources
+ if (!prey.absorbed)
+ for(var/L in prey.temp_languages)
+ if(L in P.languages)
+ prey.languages -= L
+ prey.temp_languages -= L
+ prey.temp_language_sources -= P
+ else
+ for(var/L in P.languages)
+ if(L in prey.languages)
+ continue
+ prey.languages += L
+ prey.temp_languages += L
+
+////////////////////////////////////////////////////////////////////////
+
+
//Digest a single item
//Receives a return value from digest_act that's how much nutrition
//the item should be worth
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 6837cc4d56..ffaaa5ec09 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -12,6 +12,8 @@
var/obj/belly/vore_selected // Default to no vore capability.
var/list/vore_organs = list() // List of vore containers inside a mob
var/absorbed = FALSE // If a mob is absorbed into another
+ var/list/temp_language_sources = list() //VOREStation Addition - Absorbs add languages to the pred
+ var/list/temp_languages = list() //VOREStation Addition - Absorbs add languages to the pred
var/weight = 137 // Weight for mobs for weightgain system
var/weight_gain = 1 // How fast you gain weight
var/weight_loss = 0.5 // How fast you lose weight
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index 31d74f6d0e..d83744547d 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -540,6 +540,9 @@
to_chat(user,"You manage to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!")
to_chat(M,"[host] manages to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!")
to_chat(OB.owner,"Someone inside you has eaten someone else!")
+ if(M.absorbed)
+ M.absorbed = FALSE
+ OB.handle_absorb_langs(M, OB.owner)
TB.nom_mob(M)
/datum/vore_look/proc/pick_from_outside(mob/user, params)
diff --git a/icons/mob/human_races/markings.dmi b/icons/mob/human_races/markings.dmi
index f9f91da90b..de0dcafb7c 100644
Binary files a/icons/mob/human_races/markings.dmi and b/icons/mob/human_races/markings.dmi differ
diff --git a/maps/stellardelight/stellar_delight3.dmm b/maps/stellardelight/stellar_delight3.dmm
index 9688aec1ba..299c0bacca 100644
--- a/maps/stellardelight/stellar_delight3.dmm
+++ b/maps/stellardelight/stellar_delight3.dmm
@@ -13225,6 +13225,7 @@
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 8
},
+/obj/item/weapon/folder/white_cmo,
/turf/simulated/floor/tiled/eris/white/cargo,
/area/crew_quarters/heads/cmo)
"VG" = (
@@ -13678,6 +13679,7 @@
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 8
},
+/obj/item/weapon/folder/white_rd,
/turf/simulated/floor/tiled/techfloor,
/area/crew_quarters/heads/hor)
"Xo" = (
diff --git a/maps/submaps/engine_submaps/engine.dm b/maps/submaps/engine_submaps/engine.dm
index 74db547fb2..63a0552c6d 100644
--- a/maps/submaps/engine_submaps/engine.dm
+++ b/maps/submaps/engine_submaps/engine.dm
@@ -4,6 +4,9 @@
var/clean_turfs // A list of lists, where each list is (x, )
/obj/effect/landmark/engine_loader/New()
+INITIALIZE_IMMEDIATE(/obj/effect/landmark/engine_loader)
+
+/obj/effect/landmark/engine_loader/Initialize()
if(SSmapping.engine_loader)
warning("Duplicate engine_loader landmarks: [log_info_line(src)] and [log_info_line(SSmapping.engine_loader)]")
delete_me = TRUE