diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
index 84c5d49daa..8bf3d3477c 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
@@ -85,20 +85,21 @@
to_chat(user, "Access denied.")
return
usr.set_machine(src)
+ var/list/node_connects = get_node_connect_dirs()
var/dat = {"Power: [use_power?"On":"Off"]
Set Flow Rate Limit:
[set_flow_rate]L/s | Change
Flow Rate: [round(last_flow_rate, 0.1)]L/s
- Node 1 Concentration:
+ Node 1 ([dir_name(node_connects[1],TRUE)]) Concentration:
-
-
[mixing_inputs[air1]]([mixing_inputs[air1]*100]%)
+
+
- Node 2 Concentration:
+ Node 2 ([dir_name(node_connects[2],TRUE)]) Concentration:
-
-
[mixing_inputs[air2]]([mixing_inputs[air2]*100]%)
diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm
index 1f7414e17f..0d72808545 100644
--- a/code/ATMOSPHERICS/components/unary/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm
@@ -47,6 +47,8 @@
var/radio_filter_out
var/radio_filter_in
+ var/datum/looping_sound/air_pump/soundloop
+
/obj/machinery/atmospherics/unary/vent_pump/on
use_power = 1
icon_state = "map_vent_out"
@@ -68,6 +70,10 @@
pressure_checks = 2
pressure_checks_default = 2
+/obj/machinery/atmospherics/unary/vent_pump/Initialize()
+ . = ..()
+ soundloop = new(list(src), FALSE)
+
/obj/machinery/atmospherics/unary/vent_pump/New()
..()
air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP
@@ -84,6 +90,7 @@
if(initial_loc)
initial_loc.air_vent_info -= id_tag
initial_loc.air_vent_names -= id_tag
+ QDEL_NULL(soundloop)
return ..()
/obj/machinery/atmospherics/unary/vent_pump/high_volume
@@ -164,11 +171,15 @@
/obj/machinery/atmospherics/unary/vent_pump/proc/can_pump()
if(stat & (NOPOWER|BROKEN))
+ soundloop.stop()
return 0
if(!use_power)
+ soundloop.stop()
return 0
if(welded)
+ soundloop.stop()
return 0
+ soundloop.start()
return 1
/obj/machinery/atmospherics/unary/vent_pump/process()
diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm
index 394fe72478..59837bbe5f 100644
--- a/code/ZAS/Airflow.dm
+++ b/code/ZAS/Airflow.dm
@@ -9,13 +9,13 @@ mob/proc/airflow_stun()
if(last_airflow_stun > world.time - vsc.airflow_stun_cooldown) return 0
if(!(status_flags & CANSTUN) && !(status_flags & CANWEAKEN))
- src << "You stay upright as the air rushes past you."
+ to_chat(src, "You stay upright as the air rushes past you.")
return 0
if(buckled)
- src << "Air suddenly rushes past you!"
+ to_chat(src, "Air suddenly rushes past you!")
return 0
if(!lying)
- src << "The sudden rush of air knocks you over!"
+ to_chat(src, "The sudden rush of air knocks you over!")
Weaken(5)
last_airflow_stun = world.time
diff --git a/code/ZAS/Diagnostic.dm b/code/ZAS/Diagnostic.dm
index 29ab678ef1..41fcdcad85 100644
--- a/code/ZAS/Diagnostic.dm
+++ b/code/ZAS/Diagnostic.dm
@@ -10,10 +10,10 @@ client/proc/ZoneTick()
var/result = air_master.Tick()
if(result)
- src << "Successfully Processed."
+ to_chat(src, "Successfully Processed.")
else
- src << "Failed to process! ([air_master.tick_progress])"
+ to_chat(src, "Failed to process! ([air_master.tick_progress])")
*/
client/proc/Zone_Info(turf/T as null|turf)
diff --git a/code/ZAS/Phoron.dm b/code/ZAS/Phoron.dm
index 6ffec0be99..e12beb900f 100644
--- a/code/ZAS/Phoron.dm
+++ b/code/ZAS/Phoron.dm
@@ -102,11 +102,12 @@ obj/var/contaminated = 0
if(vsc.plc.SKIN_BURNS && (species.breath_type != "phoron"))
if(!pl_head_protected() || !pl_suit_protected())
burn_skin(0.75)
- if(prob(20)) src << "Your skin burns!"
+ if(prob(20))
+ to_chat(src, "Your skin burns!")
updatehealth()
//Burn eyes if exposed.
- if(vsc.plc.EYE_BURNS && (species.breath_type != "phoron"))
+ if(vsc.plc.EYE_BURNS && species.breath_type && (species.breath_type != "phoron")) //VOREStation Edit: those who don't breathe
var/burn_eyes = 1
//Check for protective glasses
@@ -133,17 +134,18 @@ obj/var/contaminated = 0
if(vsc.plc.GENETIC_CORRUPTION && (species.breath_type != "phoron"))
if(rand(1,10000) < vsc.plc.GENETIC_CORRUPTION)
randmutb(src)
- src << "High levels of toxins cause you to spontaneously mutate!"
+ to_chat(src, "High levels of toxins cause you to spontaneously mutate!")
domutcheck(src,null)
/mob/living/carbon/human/proc/burn_eyes()
var/obj/item/organ/internal/eyes/E = internal_organs_by_name[O_EYES]
if(E)
- if(prob(20)) src << "Your eyes burn!"
+ if(prob(20))
+ to_chat(src, "Your eyes burn!")
E.damage += 2.5
eye_blurry = min(eye_blurry+1.5,50)
if (prob(max(0,E.damage - 15) + 1) &&!eye_blind)
- src << "You are blinded!"
+ to_chat(src, "You are blinded!")
Blind(20)
/mob/living/carbon/human/proc/pl_head_protected()
diff --git a/code/__defines/chemistry.dm b/code/__defines/chemistry.dm
index 399c7e879b..0976ed5ea3 100644
--- a/code/__defines/chemistry.dm
+++ b/code/__defines/chemistry.dm
@@ -35,6 +35,7 @@
#define CE_ALCOHOL_TOXIC "alcotoxic" // Liver damage
#define CE_SPEEDBOOST "gofast" // Hyperzine
#define CE_SLOWDOWN "goslow" // Slowdown
+#define CE_ANTACID "nopuke" // Don't puke.
#define REAGENTS_PER_SHEET 20
diff --git a/code/__defines/chemistry_vr.dm b/code/__defines/chemistry_vr.dm
index 094bfc2139..f15ebd4a56 100644
--- a/code/__defines/chemistry_vr.dm
+++ b/code/__defines/chemistry_vr.dm
@@ -1,2 +1,3 @@
// More for our custom races
-#define IS_CHIMERA 12
\ No newline at end of file
+#define IS_CHIMERA 12
+#define IS_SHADEKIN 13
\ No newline at end of file
diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm
index 7f7e9e705e..69b91d0dc3 100644
--- a/code/__defines/misc.dm
+++ b/code/__defines/misc.dm
@@ -348,10 +348,12 @@ var/global/list/##LIST_NAME = list();\
#define RCD_MAX_CAPACITY 30 * RCD_SHEETS_PER_MATTER_UNIT
// Radiation 'levels'. Used for the geiger counter, for visuals and sound. They are in different files so this goes here.
-#define RAD_LEVEL_LOW 0.01 // Around the level at which radiation starts to become harmful
-#define RAD_LEVEL_MODERATE 10
+#define RAD_LEVEL_LOW 0.5 // Around the level at which radiation starts to become harmful
+#define RAD_LEVEL_MODERATE 5
#define RAD_LEVEL_HIGH 25
-#define RAD_LEVEL_VERY_HIGH 50
+#define RAD_LEVEL_VERY_HIGH 75
+
+#define RADIATION_THRESHOLD_CUTOFF 0.1 // Radiation will not affect a tile when below this value.
//https://secure.byond.com/docs/ref/info.html#/atom/var/mouse_opacity
#define MOUSE_OPACITY_TRANSPARENT 0
diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index efb94d4963..de9ffa6cf9 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -194,10 +194,24 @@
#define O_KIDNEYS "kidneys"
#define O_APPENDIX "appendix"
#define O_VOICE "voicebox"
-#define O_STANDARD list(O_EYES, O_HEART, O_LUNGS, O_BRAIN, O_LIVER, O_KIDNEYS, O_APPENDIX, O_VOICE)
+#define O_SPLEEN "spleen"
+#define O_STOMACH "stomach"
+#define O_INTESTINE "intestine"
+#define O_STANDARD list(O_EYES, O_HEART, O_LUNGS, O_BRAIN, O_LIVER, O_KIDNEYS, O_SPLEEN, O_APPENDIX, O_VOICE, O_STOMACH, O_INTESTINE)
// Augments
-#define O_AUG_TSHADE "integrated thermolensing implant"
+#define O_AUG_EYES "occular augment"
+
+#define O_AUG_L_FOREARM "left forearm augment"
+#define O_AUG_R_FOREARM "right forearm augment"
+#define O_AUG_L_UPPERARM "left upperarm augment"
+#define O_AUG_R_UPPERARM "right upperarm augment"
+#define O_AUG_L_HAND "left hand augment"
+#define O_AUG_R_HAND "right hand augment"
+
+#define O_AUG_RIBS "rib augment"
+#define O_AUG_SPINE "spinal augment"
+#define O_AUG_PELVIC "pelvic augment"
// Non-Standard organs
#define O_MOUTH "mouth"
diff --git a/code/__defines/mobs_vr.dm b/code/__defines/mobs_vr.dm
index fadd802c84..924b8b4814 100644
--- a/code/__defines/mobs_vr.dm
+++ b/code/__defines/mobs_vr.dm
@@ -35,3 +35,6 @@
#define SPECIES_MONKEY_NEVREAN "Sparra"
#define SPECIES_MONKEY_SERGAL "Saru"
#define SPECIES_MONKEY_VULPKANIN "Wolpin"
+
+#define SPECIES_WEREBEAST "Werebeast"
+#define SPECIES_SHADEKIN "Shadekin"
diff --git a/code/__defines/mobs_yw.dm b/code/__defines/mobs_yw.dm
new file mode 100644
index 0000000000..adceca8519
--- /dev/null
+++ b/code/__defines/mobs_yw.dm
@@ -0,0 +1 @@
+#define SPECIES_SHADEKIN_YW "GeneShadekin"
\ No newline at end of file
diff --git a/code/__defines/sound.dm b/code/__defines/sound.dm
index 0995f0e071..d954d34b2a 100644
--- a/code/__defines/sound.dm
+++ b/code/__defines/sound.dm
@@ -8,11 +8,12 @@
#define CHANNEL_AMBIENCE 1018
#define CHANNEL_BUZZ 1017
#define CHANNEL_BICYCLE 1016
+#define CHANNEL_PREYLOOP 1015 //VORESTATION ADD - Fancy Sound Loop channel
//THIS SHOULD ALWAYS BE THE LOWEST ONE!
//KEEP IT UPDATED
-#define CHANNEL_HIGHEST_AVAILABLE 1015
+#define CHANNEL_HIGHEST_AVAILABLE 1014 //VORESTATION EDIT - Fancy Sound Loop channel from 1015
#define SOUND_MINIMUM_PRESSURE 10
#define FALLOFF_SOUNDS 0.5
diff --git a/code/_helpers/_global_objects_vr.dm b/code/_helpers/_global_objects_vr.dm
new file mode 100644
index 0000000000..84642cc4d1
--- /dev/null
+++ b/code/_helpers/_global_objects_vr.dm
@@ -0,0 +1 @@
+var/datum/gear_tweak/collar_tag/gear_tweak_collar_tag = new()
\ No newline at end of file
diff --git a/code/_helpers/atmospherics.dm b/code/_helpers/atmospherics.dm
index 2fe393b4dc..e211ed329a 100644
--- a/code/_helpers/atmospherics.dm
+++ b/code/_helpers/atmospherics.dm
@@ -1,4 +1,4 @@
-/obj/proc/analyze_gases(var/obj/A, var/mob/user)
+/obj/proc/analyze_gases(var/atom/A, var/mob/user)
if(src != A)
user.visible_message("\The [user] has used \an [src] on \the [A]")
@@ -13,12 +13,12 @@
user << "Your [src] flashes a red light as it fails to analyze \the [A]."
return 0
-/proc/atmosanalyzer_scan(var/obj/target, var/datum/gas_mixture/mixture, var/mob/user)
- var/pressure = mixture.return_pressure()
- var/total_moles = mixture.total_moles
-
+/proc/atmosanalyzer_scan(var/atom/target, var/datum/gas_mixture/mixture, var/mob/user)
var/list/results = list()
- if (total_moles>0)
+
+ if (mixture && mixture.total_moles > 0)
+ var/pressure = mixture.return_pressure()
+ var/total_moles = mixture.total_moles
results += "Pressure: [round(pressure,0.1)] kPa"
for(var/mix in mixture.gas)
results += "[gas_data.name[mix]]: [round((mixture.gas[mix] / total_moles) * 100)]%"
@@ -28,7 +28,10 @@
return results
-/obj/proc/atmosanalyze(var/mob/user)
+/turf/atmosanalyze(var/mob/user)
+ return atmosanalyzer_scan(src, src.air, user)
+
+/atom/proc/atmosanalyze(var/mob/user)
return
/obj/item/weapon/tank/atmosanalyze(var/mob/user)
@@ -40,6 +43,33 @@
/obj/machinery/atmospherics/pipe/atmosanalyze(var/mob/user)
return atmosanalyzer_scan(src, src.parent.air, user)
+/obj/machinery/atmospherics/portables_connector/atmosanalyze(var/mob/user)
+ return atmosanalyzer_scan(src, src.network.gases, user)
+
+/obj/machinery/atmospherics/unary/atmosanalyze(var/mob/user)
+ return atmosanalyzer_scan(src, src.air_contents, user)
+
+/obj/machinery/atmospherics/binary/atmosanalyze(var/mob/user)
+ return atmosanalyzer_scan(src, src.air1, user)
+
+/obj/machinery/atmospherics/trinary/atmos_filter/atmosanalyze(var/mob/user)
+ return atmosanalyzer_scan(src, src.air1, user)
+
+/obj/machinery/atmospherics/trinary/mixer/atmosanalyze(var/mob/user)
+ return atmosanalyzer_scan(src, src.air3, user)
+
+/obj/machinery/atmospherics/omni/atmos_filter/atmosanalyze(var/mob/user)
+ return atmosanalyzer_scan(src, src.input.air, user)
+
+/obj/machinery/atmospherics/omni/mixer/atmosanalyze(var/mob/user)
+ return atmosanalyzer_scan(src, src.output.air, user)
+
+/obj/machinery/meter/atmosanalyze(var/mob/user)
+ var/datum/gas_mixture/mixture = null
+ if(src.target)
+ mixture = src.target.parent.air
+ return atmosanalyzer_scan(src, mixture, user)
+
/obj/machinery/power/rad_collector/atmosanalyze(var/mob/user)
if(P) return atmosanalyzer_scan(src, src.P.air_contents, user)
diff --git a/code/_helpers/files.dm b/code/_helpers/files.dm
index 4a7b9fa646..dd8c5dd690 100644
--- a/code/_helpers/files.dm
+++ b/code/_helpers/files.dm
@@ -39,7 +39,7 @@
var/extension = copytext(path,-4,0)
if( !fexists(path) || !(extension in valid_extensions) )
- src << "Error: browse_files(): File not found/Invalid file([path])."
+ to_chat(src, "Error: browse_files(): File not found/Invalid file([path]).")
return
return path
@@ -53,7 +53,7 @@
/client/proc/file_spam_check()
var/time_to_wait = fileaccess_timer - world.time
if(time_to_wait > 0)
- src << "Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds."
+ to_chat(src, "Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds.")
return 1
fileaccess_timer = world.time + FTPDELAY
return 0
diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm
index d1037b37ab..702cca5139 100644
--- a/code/_helpers/global_lists_vr.dm
+++ b/code/_helpers/global_lists_vr.dm
@@ -42,40 +42,8 @@ var/global/list/item_vore_blacklist = list(
/obj/item/weapon/disk/nuclear,
/obj/item/clothing/suit/storage/hooded/wintercoat/roiz)
-var/global/list/digestion_sounds = list(
- 'sound/vore/digest1.ogg',
- 'sound/vore/digest2.ogg',
- 'sound/vore/digest3.ogg',
- 'sound/vore/digest4.ogg',
- 'sound/vore/digest5.ogg',
- 'sound/vore/digest6.ogg',
- 'sound/vore/digest7.ogg',
- 'sound/vore/digest8.ogg',
- 'sound/vore/digest9.ogg',
- 'sound/vore/digest10.ogg',
- 'sound/vore/digest11.ogg',
- 'sound/vore/digest12.ogg')
-
-var/global/list/death_sounds = list(
- 'sound/vore/death1.ogg',
- 'sound/vore/death2.ogg',
- 'sound/vore/death3.ogg',
- 'sound/vore/death4.ogg',
- 'sound/vore/death5.ogg',
- 'sound/vore/death6.ogg',
- 'sound/vore/death7.ogg',
- 'sound/vore/death8.ogg',
- 'sound/vore/death9.ogg',
- 'sound/vore/death10.ogg')
-
-var/global/list/hunger_sounds = list(
- 'sound/vore/growl1.ogg',
- 'sound/vore/growl2.ogg',
- 'sound/vore/growl3.ogg',
- 'sound/vore/growl4.ogg',
- 'sound/vore/growl5.ogg')
-
-var/global/list/vore_sounds = list(
+//Classic Vore sounds
+var/global/list/classic_vore_sounds = list(
"Gulp" = 'sound/vore/gulp.ogg',
"Insert" = 'sound/vore/insert.ogg',
"Insertion1" = 'sound/vore/insertion1.ogg',
@@ -86,15 +54,55 @@ var/global/list/vore_sounds = list(
"Squish2" = 'sound/vore/squish2.ogg',
"Squish3" = 'sound/vore/squish3.ogg',
"Squish4" = 'sound/vore/squish4.ogg',
- "Rustle (cloth)" = 'sound/effects/rustle5.ogg',
+ "Rustle (cloth)" = 'sound/effects/rustle1.ogg',
+ "Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg',
+ "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg',
+ "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg',
+ "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg',
"None" = null)
-var/global/list/struggle_sounds = list(
- "Squish1" = 'sound/vore/squish1.ogg',
- "Squish2" = 'sound/vore/squish2.ogg',
- "Squish3" = 'sound/vore/squish3.ogg',
- "Squish4" = 'sound/vore/squish4.ogg')
+var/global/list/classic_release_sounds = list(
+ "Rustle (cloth)" = 'sound/effects/rustle1.ogg',
+ "Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg',
+ "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg',
+ "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg',
+ "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg',
+ "Splatter" = 'sound/effects/splat.ogg',
+ "None" = null
+ )
+//Poojy's Fancy Sounds
+var/global/list/fancy_vore_sounds = list(
+ "Gulp" = 'sound/vore/sunesound/pred/swallow_01.ogg',
+ "Swallow" = 'sound/vore/sunesound/pred/swallow_02.ogg',
+ "Insertion1" = 'sound/vore/sunesound/pred/insertion_01.ogg',
+ "Insertion2" = 'sound/vore/sunesound/pred/insertion_02.ogg',
+ "Tauric Swallow" = 'sound/vore/sunesound/pred/taurswallow.ogg',
+ "Stomach Move" = 'sound/vore/sunesound/pred/stomachmove.ogg',
+ "Schlorp" = 'sound/vore/sunesound/pred/schlorp.ogg',
+ "Squish1" = 'sound/vore/sunesound/pred/squish_01.ogg',
+ "Squish2" = 'sound/vore/sunesound/pred/squish_02.ogg',
+ "Squish3" = 'sound/vore/sunesound/pred/squish_03.ogg',
+ "Squish4" = 'sound/vore/sunesound/pred/squish_04.ogg',
+ "Rustle (cloth)" = 'sound/effects/rustle1.ogg',
+ "Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg',
+ "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg',
+ "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg',
+ "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg',
+ "None" = null
+ )
+
+var/global/list/fancy_release_sounds = list(
+ "Rustle (cloth)" = 'sound/effects/rustle1.ogg',
+ "Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg',
+ "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg',
+ "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg',
+ "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg',
+ "Stomach Move" = 'sound/vore/sunesound/pred/stomachmove.ogg',
+ "Pred Escape" = 'sound/vore/sunesound/pred/escape.ogg',
+ "Splatter" = 'sound/effects/splat.ogg',
+ "None" = null
+ )
var/global/list/global_vore_egg_types = list(
"Unathi" = UNATHI_EGG,
@@ -399,7 +407,7 @@ var/global/list/contamination_colors = list("green",
"beige",
"pink")
-//For the mechanic of leaving remains. Ones listed below are basically ones that got no bones.
+//For the mechanic of leaving remains. Ones listed below are basically ones that got no bones or leave no trace after death.
var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
SPECIES_DIONA,
SPECIES_ALRAUNE,
@@ -418,7 +426,9 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
SPECIES_XENO_SENTINEL,
SPECIES_XENO_QUEEN,
SPECIES_SHADOW,
- SPECIES_GOLEM) //Some special species that may or may not be ever used in event too
+ SPECIES_GOLEM, //Some special species that may or may not be ever used in event too,
+ SPECIES_SHADEKIN, //Shadefluffers just poof away
+ SPECIES_SHADEKIN_YW) //YW edits
/hook/startup/proc/init_vore_datum_ref_lists()
var/paths
diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index f031194a06..38773ce621 100644
--- a/code/_helpers/unsorted.dm
+++ b/code/_helpers/unsorted.dm
@@ -361,7 +361,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
break
if(newname)
break //That's a suitable name!
- src << "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken."
+ to_chat(src, "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken.")
if(!newname) //we'll stick with the oldname then
return
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 6cde264566..6fc470cc81 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -134,6 +134,12 @@
// A is a turf or is on a turf, or in something on a turf (pen in a box); but not something in something on a turf (pen in a box in a backpack)
sdepth = A.storage_depth_turf()
if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1))
+ //VOREStation Edit begin: SHADEKIN
+ var/mob/SK = src
+ if(istype(SK))
+ if(SK.shadekin_phasing_check())
+ return
+ //VOREStation Edit end: SHADEKIN
if(A.Adjacent(src) || (W && W.attack_can_reach(src, A, W.reach)) ) // see adjacent.dm
if(W)
// Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example)
@@ -183,7 +189,7 @@
/mob/living/UnarmedAttack(var/atom/A, var/proximity_flag)
if(!ticker)
- src << "You cannot attack people before the game has started."
+ to_chat(src, "You cannot attack people before the game has started.")
return 0
if(stat)
@@ -316,7 +322,7 @@
nutrition = max(nutrition - rand(1,5),0)
handle_regular_hud_updates()
else
- src << "You're out of energy! You need food!"
+ to_chat(src, "You're out of energy! You need food!")
// Simple helper to face what you clicked on, in case it should be needed in more than one place
/mob/proc/face_atom(var/atom/A)
diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm
index 1dcc2bc955..8d107e8f64 100644
--- a/code/_onclick/cyborg.dm
+++ b/code/_onclick/cyborg.dm
@@ -45,7 +45,7 @@
if(is_component_functioning("camera"))
aiCamera.captureimage(A, usr)
else
- src << "Your camera isn't functional."
+ to_chat(src, "Your camera isn't functional.")
return
/*
diff --git a/code/_onclick/hud/_defines_vr.dm b/code/_onclick/hud/_defines_vr.dm
new file mode 100644
index 0000000000..e72150b44c
--- /dev/null
+++ b/code/_onclick/hud/_defines_vr.dm
@@ -0,0 +1,2 @@
+#define ui_shadekin_dark_display "EAST-1:28,CENTER-3:15"
+#define ui_shadekin_energy_display "EAST-1:28,CENTER-4:15"
\ No newline at end of file
diff --git a/code/_onclick/hud/ability_screen_objects.dm b/code/_onclick/hud/ability_screen_objects.dm
index d29ef9dd96..655a451e92 100644
--- a/code/_onclick/hud/ability_screen_objects.dm
+++ b/code/_onclick/hud/ability_screen_objects.dm
@@ -180,7 +180,8 @@
/mob/New()
..()
- ability_master = new /obj/screen/movable/ability_master(src)
+ if(!ability_master) //VOREStation Edit: S H A D E K I N
+ ability_master = new /obj/screen/movable/ability_master(src)
///////////ACTUAL ABILITIES////////////
//This is what you click to do things//
@@ -282,7 +283,7 @@
if(!mob)
return // Paranoid.
if(isnull(slot) || !isnum(slot))
- src << ".activate_ability requires a number as input, corrisponding to the slot you wish to use."
+ to_chat(src, ".activate_ability requires a number as input, corrisponding to the slot you wish to use.")
return // Bad input.
if(!mob.ability_master)
return // No abilities.
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 1c903700b0..f1aba60b10 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -293,6 +293,18 @@
mymob.nutrition_icon.screen_loc = ui_nutrition
hud_elements |= mymob.nutrition_icon
+ //VOREStation Addition begin
+ mymob.shadekin_dark_display = new /obj/screen/shadekin/darkness()
+ mymob.shadekin_dark_display.screen_loc = ui_shadekin_dark_display
+ mymob.shadekin_dark_display.icon_state = "dark"
+ hud_elements |= mymob.shadekin_dark_display
+
+ mymob.shadekin_energy_display = new /obj/screen/shadekin/energy()
+ mymob.shadekin_energy_display.screen_loc = ui_shadekin_energy_display
+ mymob.shadekin_energy_display.icon_state = "energy0"
+ hud_elements |= mymob.shadekin_energy_display
+ //VOREStation Addition end
+
mymob.ling_chem_display = new /obj/screen/ling/chems()
mymob.ling_chem_display.screen_loc = ui_ling_chemical_display
mymob.ling_chem_display.icon_state = "ling_chems"
diff --git a/code/_onclick/hud/screen_objects_vr.dm b/code/_onclick/hud/screen_objects_vr.dm
index ea6b72cd10..c1fbd99448 100644
--- a/code/_onclick/hud/screen_objects_vr.dm
+++ b/code/_onclick/hud/screen_objects_vr.dm
@@ -1,16 +1,19 @@
-/obj/screen/proc/Click_vr(location, control, params) //VORESTATION AI TEMPORARY REMOVAL
+/obj/screen/proc/Click_vr(location, control, params)
if(!usr) return 1
switch(name)
//Shadekin
if("darkness")
- var/mob/living/simple_mob/shadekin/sk = usr
- var/turf/T = get_turf(sk)
+ var/turf/T = get_turf(usr)
var/darkness = round(1 - T.get_lumcount(),0.1)
to_chat(usr,"Darkness: [darkness]")
if("energy")
- var/mob/living/simple_mob/shadekin/sk = usr
- to_chat(usr,"Energy: [sk.energy] ([sk.dark_gains])")
+ var/mob/living/simple_mob/shadekin/SK = usr
+ if(istype(SK))
+ to_chat(usr,"Energy: [SK.energy] ([SK.dark_gains])")
+ var/mob/living/carbon/human/H = usr
+ if(istype(H) && istype(H.species, /datum/species/shadekin))
+ to_chat(usr,"Energy: [H.shadekin_get_energy(H)]")
diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm
index f34a68a742..d5197cb30f 100644
--- a/code/_onclick/observer.dm
+++ b/code/_onclick/observer.dm
@@ -6,9 +6,9 @@
if(!client) return
client.inquisitive_ghost = !client.inquisitive_ghost
if(client.inquisitive_ghost)
- src << "You will now examine everything you click on."
+ to_chat(src, "You will now examine everything you click on.")
else
- src << "You will no longer examine things you click on."
+ to_chat(src, "You will no longer examine things you click on.")
/mob/observer/dead/DblClickOn(var/atom/A, var/params)
if(client.buildmode)
diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm
index 5f2561c25c..ed7a1c7e2f 100644
--- a/code/_onclick/rig.dm
+++ b/code/_onclick/rig.dm
@@ -18,15 +18,15 @@
switch(hardsuit_click_mode)
if(MIDDLE_CLICK)
- src << "Hardsuit activation mode set to middle-click."
+ to_chat(src, "Hardsuit activation mode set to middle-click.")
if(ALT_CLICK)
- src << "Hardsuit activation mode set to alt-click."
+ to_chat(src, "Hardsuit activation mode set to alt-click.")
if(CTRL_CLICK)
- src << "Hardsuit activation mode set to control-click."
+ to_chat(src, "Hardsuit activation mode set to control-click.")
else
// should never get here, but just in case:
soft_assert(0, "Bad hardsuit click mode: [hardsuit_click_mode] - expected 0 to [MAX_HARDSUIT_CLICK_MODE]")
- src << "Somehow you bugged the system. Setting your hardsuit mode to middle-click."
+ to_chat(src, "Somehow you bugged the system. Setting your hardsuit mode to middle-click.")
hardsuit_click_mode = MIDDLE_CLICK
/mob/living/MiddleClickOn(atom/A)
diff --git a/code/controllers/Processes/planet.dm b/code/controllers/Processes/planet.dm
deleted file mode 100644
index 18043f9270..0000000000
--- a/code/controllers/Processes/planet.dm
+++ /dev/null
@@ -1,96 +0,0 @@
-var/datum/controller/process/planet/planet_controller = null
-
-/datum/controller/process/planet
- var/list/planets = list()
- var/list/z_to_planet = list()
-
-/datum/controller/process/planet/setup()
- name = "planet controller"
- planet_controller = src
- schedule_interval = 1 MINUTE
- start_delay = 20 SECONDS
-
- var/list/planet_datums = typesof(/datum/planet) - /datum/planet
- for(var/P in planet_datums)
- var/datum/planet/NP = new P()
- planets.Add(NP)
-
- allocateTurfs()
-
-/datum/controller/process/planet/proc/allocateTurfs()
- for(var/turf/simulated/OT in outdoor_turfs)
- for(var/datum/planet/P in planets)
- if(OT.z in P.expected_z_levels)
- P.planet_floors |= OT
- OT.vis_contents |= P.weather_holder.visuals
- break
- outdoor_turfs.Cut() //Why were you in there INCORRECTLY?
-
- for(var/turf/unsimulated/wall/planetary/PW in planetary_walls)
- for(var/datum/planet/P in planets)
- if(PW.type == P.planetary_wall_type)
- P.planet_walls |= PW
- break
- planetary_walls.Cut()
-
-/datum/controller/process/planet/proc/unallocateTurf(var/turf/T)
- for(var/planet in planets)
- var/datum/planet/P = planet
- if(T.z in P.expected_z_levels)
- P.planet_floors -= T
- T.vis_contents -= P.weather_holder.visuals
-
-/datum/controller/process/planet/doWork()
- if(outdoor_turfs.len || planetary_walls.len)
- allocateTurfs()
-
- for(var/datum/planet/P in planets)
- P.process(schedule_interval / 10)
- SCHECK //Your process() really shouldn't take this long...
-
- //Sun light needs changing
- if(P.needs_work & PLANET_PROCESS_SUN)
- P.needs_work &= ~PLANET_PROCESS_SUN
- // Remove old value from corners
- var/list/sunlit_corners = P.sunlit_corners
- var/old_lum_r = -P.sun["lum_r"]
- var/old_lum_g = -P.sun["lum_g"]
- var/old_lum_b = -P.sun["lum_b"]
- if(old_lum_r || old_lum_g || old_lum_b)
- for(var/C in P.sunlit_corners)
- var/datum/lighting_corner/LC = C
- LC.update_lumcount(old_lum_r, old_lum_g, old_lum_b)
- SCHECK
- sunlit_corners.Cut()
-
- // Calculate new values to apply
- var/new_brightness = P.sun["brightness"]
- var/new_color = P.sun["color"]
- var/lum_r = new_brightness * GetRedPart (new_color) / 255
- var/lum_g = new_brightness * GetGreenPart(new_color) / 255
- var/lum_b = new_brightness * GetBluePart (new_color) / 255
- var/static/update_gen = -1 // Used to prevent double-processing corners. Otherwise would happen when looping over adjacent turfs.
- for(var/I in P.planet_floors)
- var/turf/simulated/T = I
- if(!T.lighting_corners_initialised)
- T.generate_missing_corners()
- for(var/C in T.get_corners())
- var/datum/lighting_corner/LC = C
- if(LC.update_gen != update_gen && LC.active)
- sunlit_corners += LC
- LC.update_gen = update_gen
- LC.update_lumcount(lum_r, lum_g, lum_b)
- SCHECK
- update_gen--
- P.sun["lum_r"] = lum_r
- P.sun["lum_g"] = lum_g
- P.sun["lum_b"] = lum_b
-
- //Temperature needs updating
- if(P.needs_work & PLANET_PROCESS_TEMP)
- P.needs_work &= ~PLANET_PROCESS_TEMP
- //Set new temperatures
- for(var/W in P.planet_walls)
- var/turf/unsimulated/wall/planetary/wall = W
- wall.set_temperature(P.weather_holder.temperature)
- SCHECK
diff --git a/code/controllers/Processes/radiation.dm b/code/controllers/Processes/radiation.dm
deleted file mode 100644
index 71d9c60233..0000000000
--- a/code/controllers/Processes/radiation.dm
+++ /dev/null
@@ -1,56 +0,0 @@
-/datum/controller/process/radiation
- var/repository/radiation/linked = null
-
-/datum/controller/process/radiation/setup()
- name = "radiation controller"
- schedule_interval = 20 // every 2 seconds
- linked = radiation_repository
-
-/datum/controller/process/radiation/doWork()
- sources_decay()
- cache_expires()
- irradiate_targets()
-
-// Step 1 - Sources Decay
-/datum/controller/process/radiation/proc/sources_decay()
- var/list/sources = linked.sources
- for(var/thing in sources)
- var/datum/radiation_source/S = thing
- if(QDELETED(S))
- sources.Remove(S)
- continue
- if(S.decay)
- S.update_rad_power(S.rad_power - config.radiation_decay_rate)
- if(S.rad_power <= config.radiation_lower_limit)
- sources.Remove(S)
- SCHECK // This scheck probably just wastes resources, but better safe than sorry in this case.
-
-// Step 2 - Cache Expires
-/datum/controller/process/radiation/proc/cache_expires()
- var/list/resistance_cache = linked.resistance_cache
- for(var/thing in resistance_cache)
- var/turf/T = thing
- if(QDELETED(T))
- resistance_cache.Remove(T)
- continue
- if((length(T.contents) + 1) != resistance_cache[T])
- resistance_cache.Remove(T) // If its stale REMOVE it! It will get added if its needed.
- SCHECK
-
-// Step 3 - Registered irradiatable things are checked for radiation
-/datum/controller/process/radiation/proc/irradiate_targets()
- var/list/registered_listeners = living_mob_list // For now just use this. Nothing else is interested anyway.
- if(length(linked.sources) > 0)
- for(var/thing in registered_listeners)
- var/atom/A = thing
- if(QDELETED(A))
- continue
- var/turf/T = get_turf(thing)
- var/rads = linked.get_rads_at_turf(T)
- if(rads)
- A.rad_act(rads)
- SCHECK
-
-/datum/controller/process/radiation/statProcess()
- ..()
- stat(null, "[linked.sources.len] sources, [linked.resistance_cache.len] cached turfs")
diff --git a/code/controllers/Processes/scheduler.dm b/code/controllers/Processes/scheduler.dm
deleted file mode 100644
index ac5e4696ab..0000000000
--- a/code/controllers/Processes/scheduler.dm
+++ /dev/null
@@ -1,169 +0,0 @@
-/var/datum/controller/process/scheduler/scheduler
-
-/************
-* Scheduler *
-************/
-/datum/controller/process/scheduler
- var/list/scheduled_tasks
-
-/datum/controller/process/scheduler/setup()
- name = "scheduler"
- schedule_interval = 1 SECOND
- scheduled_tasks = list()
- scheduler = src
-
-/datum/controller/process/scheduler/doWork()
- var/world_time = world.time
- for(last_object in scheduled_tasks)
- var/datum/scheduled_task/scheduled_task = last_object
- if(world_time < scheduled_task.trigger_time)
- break // Too early for this one, and therefore too early for all remaining.
- try
- unschedule(scheduled_task)
- scheduled_task.pre_process()
- scheduled_task.process()
- scheduled_task.post_process()
- catch(var/exception/e)
- catchException(e, last_object)
- SCHECK
-
-// We've been restarted, probably due to having a massive list of tasks.
-// Lets copy over the task list as safely as we can and try to chug thru it...
-// Note: We won't be informed about tasks being destroyed, but this is the best we can do.
-/datum/controller/process/scheduler/copyStateFrom(var/datum/controller/process/scheduler/target)
- scheduled_tasks = list()
- for(var/datum/scheduled_task/st in target.scheduled_tasks)
- if(!QDELETED(st) && istype(st))
- schedule(st)
- scheduler = src
-
-// We are being killed. Least we can do is deregister all those events we registered
-/datum/controller/process/scheduler/onKill()
- for(var/st in scheduled_tasks)
- GLOB.destroyed_event.unregister(st, src)
-
-/datum/controller/process/scheduler/statProcess()
- ..()
- stat(null, "[scheduled_tasks.len] task\s")
-
-/datum/controller/process/scheduler/proc/schedule(var/datum/scheduled_task/st)
- dd_insertObjectList(scheduled_tasks, st)
-
-/datum/controller/process/scheduler/proc/unschedule(var/datum/scheduled_task/st)
- scheduled_tasks -= st
-
-/**********
-* Helpers *
-**********/
-/proc/schedule_task_in(var/in_time, var/procedure, var/list/arguments = list())
- return schedule_task(world.time + in_time, procedure, arguments)
-
-/proc/schedule_callback_in(var/in_time, var/datum/callback)
- return schedule_callback(world.time + in_time, callback)
-
-/proc/schedule_task_with_source_in(var/in_time, var/source, var/procedure, var/list/arguments = list())
- return schedule_task_with_source(world.time + in_time, source, procedure, arguments)
-
-/proc/schedule_task(var/trigger_time, var/procedure, var/list/arguments)
- var/datum/scheduled_task/st = new/datum/scheduled_task(trigger_time, procedure, arguments, /proc/destroy_scheduled_task, list())
- scheduler.schedule(st)
- return st
-
-/proc/schedule_callback(var/trigger_time, var/datum/callback)
- var/datum/scheduled_task/callback/st = new/datum/scheduled_task/callback(trigger_time, callback, /proc/destroy_scheduled_task, list())
- scheduler.schedule(st)
- return st
-
-/proc/schedule_task_with_source(var/trigger_time, var/source, var/procedure, var/list/arguments)
- var/datum/scheduled_task/st = new/datum/scheduled_task/source(trigger_time, source, procedure, arguments, /proc/destroy_scheduled_task, list())
- scheduler.schedule(st)
- return st
-
-/proc/schedule_repeating_task(var/trigger_time, var/repeat_interval, var/procedure, var/list/arguments)
- var/datum/scheduled_task/st = new/datum/scheduled_task(trigger_time, procedure, arguments, /proc/repeat_scheduled_task, list(repeat_interval))
- scheduler.schedule(st)
- return st
-
-/proc/schedule_repeating_task_with_source(var/trigger_time, var/repeat_interval, var/source, var/procedure, var/list/arguments)
- var/datum/scheduled_task/st = new/datum/scheduled_task/source(trigger_time, source, procedure, arguments, /proc/repeat_scheduled_task, list(repeat_interval))
- scheduler.schedule(st)
- return st
-
-/*************
-* Task Datum *
-*************/
-/datum/scheduled_task
- var/trigger_time
- var/procedure
- var/list/arguments
- var/task_after_process
- var/list/task_after_process_args
-
-/datum/scheduled_task/New(var/trigger_time, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args)
- ..()
- src.trigger_time = trigger_time
- src.procedure = procedure
- src.arguments = arguments ? arguments : list()
- src.task_after_process = task_after_process ? task_after_process : /proc/destroy_scheduled_task
- src.task_after_process_args = istype(task_after_process_args) ? task_after_process_args : list()
- task_after_process_args += src
-
-/datum/scheduled_task/Destroy()
- scheduler.unschedule(src)
- procedure = null
- arguments.Cut()
- task_after_process = null
- task_after_process_args.Cut()
- return ..()
-
-/datum/scheduled_task/dd_SortValue()
- return trigger_time
-
-/datum/scheduled_task/proc/pre_process()
- task_triggered_event.raise_event(list(src))
-
-/datum/scheduled_task/proc/process()
- if(procedure)
- call(procedure)(arglist(arguments))
-
-/datum/scheduled_task/proc/post_process()
- call(task_after_process)(arglist(task_after_process_args))
-
-// Resets the trigger time, has no effect if the task has already triggered
-/datum/scheduled_task/proc/trigger_task_in(var/trigger_in)
- src.trigger_time = world.time + trigger_in
-
-/datum/scheduled_task/callback
- var/datum/callback/callback
-
-/datum/scheduled_task/callback/New(var/trigger_time, var/datum/callback, var/proc/task_after_process, var/list/task_after_process_args)
- src.callback = callback
- ..(trigger_time = trigger_time, task_after_process = task_after_process, task_after_process_args = task_after_process_args)
-
-/datum/scheduled_task/callback/process()
- callback.Invoke()
-
-/datum/scheduled_task/source
- var/datum/source
-
-/datum/scheduled_task/source/New(var/trigger_time, var/datum/source, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args)
- src.source = source
- GLOB.destroyed_event.register(src.source, src, /datum/scheduled_task/source/proc/source_destroyed)
- ..(trigger_time, procedure, arguments, task_after_process, task_after_process_args)
-
-/datum/scheduled_task/source/Destroy()
- source = null
- return ..()
-
-/datum/scheduled_task/source/process()
- call(source, procedure)(arglist(arguments))
-
-/datum/scheduled_task/source/proc/source_destroyed()
- qdel(src)
-
-/proc/destroy_scheduled_task(var/datum/scheduled_task/st)
- qdel(st)
-
-/proc/repeat_scheduled_task(var/trigger_delay, var/datum/scheduled_task/st)
- st.trigger_time = world.time + trigger_delay
- scheduler.schedule(st)
diff --git a/code/controllers/subsystems/radiation.dm b/code/controllers/subsystems/radiation.dm
new file mode 100644
index 0000000000..babc2c7d5d
--- /dev/null
+++ b/code/controllers/subsystems/radiation.dm
@@ -0,0 +1,135 @@
+SUBSYSTEM_DEF(radiation)
+ name = "Radiation"
+ wait = 2 SECONDS
+ flags = SS_NO_INIT
+
+ var/list/sources = list() // all radiation source datums
+ var/list/sources_assoc = list() // Sources indexed by turf for de-duplication.
+ var/list/resistance_cache = list() // Cache of turf's radiation resistance.
+
+ var/tmp/list/current_sources = list()
+ var/tmp/list/current_res_cache = list()
+ var/tmp/list/listeners = list()
+
+/datum/controller/subsystem/radiation/fire(resumed = FALSE)
+ if (!resumed)
+ current_sources = sources.Copy()
+ current_res_cache = resistance_cache.Copy()
+ listeners = living_mob_list.Copy()
+
+ while(current_sources.len)
+ var/datum/radiation_source/S = current_sources[current_sources.len]
+ current_sources.len--
+
+ if(QDELETED(S))
+ sources -= S
+ else if(S.decay)
+ S.update_rad_power(S.rad_power - config.radiation_decay_rate)
+ if (MC_TICK_CHECK)
+ return
+
+ while(current_res_cache.len)
+ var/turf/T = current_res_cache[current_res_cache.len]
+ current_res_cache.len--
+
+ if(QDELETED(T))
+ resistance_cache -= T
+ else if((length(T.contents) + 1) != resistance_cache[T])
+ resistance_cache -= T // If its stale REMOVE it! It will get added if its needed.
+ if (MC_TICK_CHECK)
+ return
+
+ if(!sources.len)
+ listeners.Cut()
+
+ while(listeners.len)
+ var/atom/A = listeners[listeners.len]
+ listeners.len--
+
+ if(!QDELETED(A))
+ var/turf/T = get_turf(A)
+ var/rads = get_rads_at_turf(T)
+ if(rads)
+ A.rad_act(rads)
+ if (MC_TICK_CHECK)
+ return
+
+/datum/controller/subsystem/radiation/stat_entry()
+ ..("S:[sources.len], RC:[resistance_cache.len]")
+
+// Ray trace from all active radiation sources to T and return the strongest effect.
+/datum/controller/subsystem/radiation/proc/get_rads_at_turf(var/turf/T)
+ . = 0
+ if(!istype(T))
+ return
+
+ for(var/value in sources)
+ var/datum/radiation_source/source = value
+ if(source.rad_power < .)
+ continue // Already being affected by a stronger source
+ if(source.source_turf.z != T.z)
+ continue // Radiation is not multi-z
+ if(source.respect_maint)
+ var/area/A = T.loc
+ if(A.flags & RAD_SHIELDED)
+ continue // In shielded area
+
+ var/dist = get_dist(source.source_turf, T)
+ if(dist > source.range)
+ continue // Too far to possibly affect
+ if(source.flat)
+ . = max(., source.rad_power)
+ continue // No need to ray trace for flat field
+
+ // Okay, now ray trace to find resistence!
+ var/turf/origin = source.source_turf
+ var/working = source.rad_power
+ while(origin != T)
+ origin = get_step_towards(origin, T) //Raytracing
+ if(!resistance_cache[origin]) //Only get the resistance if we don't already know it.
+ origin.calc_rad_resistance()
+ if(origin.cached_rad_resistance)
+ working = round((working / (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0.1)
+ if((working <= .) || (working <= RADIATION_THRESHOLD_CUTOFF))
+ break // Already affected by a stronger source (or its zero...)
+ . = max((working / (dist ** 2)), .) //Butchered version of the inverse square law. Works for this purpose
+ if(. <= RADIATION_THRESHOLD_CUTOFF)
+ . = 0
+
+// Add a radiation source instance to the repository. It will override any existing source on the same turf.
+/datum/controller/subsystem/radiation/proc/add_source(var/datum/radiation_source/S)
+ if(!isturf(S.source_turf))
+ return
+ var/datum/radiation_source/existing = sources_assoc[S.source_turf]
+ if(existing)
+ qdel(existing)
+ sources += S
+ sources_assoc[S.source_turf] = S
+
+// Creates a temporary radiation source that will decay
+/datum/controller/subsystem/radiation/proc/radiate(source, power) //Sends out a radiation pulse, taking walls into account
+ if(!(source && power)) //Sanity checking
+ return
+ var/datum/radiation_source/S = new()
+ S.source_turf = get_turf(source)
+ S.update_rad_power(power)
+ add_source(S)
+
+// Sets the radiation in a range to a constant value.
+/datum/controller/subsystem/radiation/proc/flat_radiate(source, power, range, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please.
+ if(!(source && power && range))
+ return
+ var/datum/radiation_source/S = new()
+ S.flat = TRUE
+ S.range = range
+ S.respect_maint = respect_maint
+ S.source_turf = get_turf(source)
+ S.update_rad_power(power)
+ add_source(S)
+
+// Irradiates a full Z-level. Hacky way of doing it, but not too expensive.
+/datum/controller/subsystem/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please.
+ if(!(power && source))
+ return
+ var/turf/epicentre = locate(round(world.maxx / 2), round(world.maxy / 2), source.z)
+ flat_radiate(epicentre, power, world.maxx, respect_maint)
\ No newline at end of file
diff --git a/code/controllers/subsystems/vote.dm b/code/controllers/subsystems/vote.dm
index 641f356632..c4a720ad62 100644
--- a/code/controllers/subsystems/vote.dm
+++ b/code/controllers/subsystems/vote.dm
@@ -105,7 +105,7 @@ SUBSYSTEM_DEF(vote)
factor = 1.4
choices["Initiate Crew Transfer"] = round(choices["Initiate Crew Transfer"] * factor)
world << "Crew Transfer Factor: [factor]"
- greatest_votes = max(choices["Initiate Crew Transfer"], choices["Continue The Round"])
+ greatest_votes = max(choices["Initiate Crew Transfer"], choices["Extend the Shift"]) //VOREStation Edit
. = list() // Get all options with that many votes and return them in a list
if(greatest_votes)
@@ -220,8 +220,8 @@ SUBSYSTEM_DEF(vote)
if(ticker.current_state <= GAME_STATE_SETTING_UP)
initiator_key << "The crew transfer button has been disabled!"
return 0
- question = "End the shift?"
- choices.Add("Initiate Crew Transfer", "Continue The Round")
+ question = "Your PDA beeps with a message from Central. Would you like an additional four hours to finish ongoing projects?" //Yawn Wider Edit
+ choices.Add("Initiate Crew Transfer", "Extend the Shift") //VOREStation Edit
if(VOTE_ADD_ANTAGONIST)
if(!config.allow_extra_antags || ticker.current_state >= GAME_STATE_SETTING_UP)
return 0
diff --git a/code/datums/autolathe/arms_vr.dm b/code/datums/autolathe/arms_vr.dm
index 72f0b9d15a..546141457d 100644
--- a/code/datums/autolathe/arms_vr.dm
+++ b/code/datums/autolathe/arms_vr.dm
@@ -32,3 +32,21 @@
name = "magazine (.44 rubber)"
path =/obj/item/ammo_magazine/m44/rubber
hidden = 1
+
+/datum/category_item/autolathe/arms/classic_smg_9mm
+ name = "SMG magazine (9mm)"
+ path = /obj/item/ammo_magazine/m9mml
+ hidden = 1
+/* De-coded?
+/datum/category_item/autolathe/arms/classic_smg_9mmr
+ name = "SMG magazine (9mm rubber)"
+ path = /obj/item/ammo_magazine/m9mml/rubber
+
+/datum/category_item/autolathe/arms/classic_smg_9mmp
+ name = "SMG magazine (9mm practice)"
+ path = /obj/item/ammo_magazine/m9mml/practice
+
+/datum/category_item/autolathe/arms/classic_smg_9mmf
+ name = "SMG magazine (9mm flash)"
+ path = /obj/item/ammo_magazine/m9mml/flash
+*/
\ No newline at end of file
diff --git a/code/datums/beam.dm b/code/datums/beam.dm
index 24f5e6c91f..88fe9dbf1c 100644
--- a/code/datums/beam.dm
+++ b/code/datums/beam.dm
@@ -138,6 +138,12 @@
return
/obj/effect/ebeam/deadly/Crossed(atom/A)
+ //VOREStation Edit begin: SHADEKIN
+ var/mob/SK = A
+ if(istype(SK))
+ if(SK.shadekin_phasing_check())
+ return
+ //VOREStation Edit end: SHADEKIN
..()
A.ex_act(1)
@@ -157,6 +163,12 @@
on_contact(A)
/obj/effect/ebeam/reactive/Crossed(atom/A)
+ //VOREStation Edit begin: SHADEKIN
+ var/mob/SK = A
+ if(istype(SK))
+ if(SK.shadekin_phasing_check())
+ return
+ //VOREStation Edit end: SHADEKIN
..()
on_contact(A)
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
index aef0fd0ac2..4dad60db89 100644
--- a/code/datums/helper_datums/getrev.dm
+++ b/code/datums/helper_datums/getrev.dm
@@ -35,10 +35,10 @@ client/verb/showrevinfo()
set desc = "Check the current server code revision"
if(revdata.revision)
- src << "Server revision: [revdata.branch] - [revdata.date]"
+ to_chat(src, "Server revision: [revdata.branch] - [revdata.date]")
if(config.githuburl)
- src << "[revdata.revision]"
+ to_chat(src, "[revdata.revision]")
else
src << revdata.revision
else
- src << "Revision unknown"
+ to_chat(src, "Revision unknown")
diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm
index 8b927b3a54..599f8f4632 100644
--- a/code/datums/looping_sounds/machinery_sounds.dm
+++ b/code/datums/looping_sounds/machinery_sounds.dm
@@ -43,4 +43,15 @@
mid_sounds = list('sound/machines/microwave/microwave-mid1.ogg'=10, 'sound/machines/microwave/microwave-mid2.ogg'=1)
mid_length = 10
end_sound = 'sound/machines/microwave/microwave-end.ogg'
- volume = 90
\ No newline at end of file
+ volume = 90
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/datum/looping_sound/air_pump
+ start_sound = 'sound/machines/air_pump/airpumpstart.ogg'
+ start_length = 10
+ mid_sounds = list('sound/machines/air_pump/airpumpidle.ogg' = 1)
+ mid_length = 4
+ end_sound = 'sound/machines/air_pump/airpumpshutdown.ogg'
+ volume = 15
+ pref_check = /datum/client_preference/air_pump_noise
\ No newline at end of file
diff --git a/code/datums/repositories/radiation.dm b/code/datums/repositories/radiation.dm
deleted file mode 100644
index 4525032e20..0000000000
--- a/code/datums/repositories/radiation.dm
+++ /dev/null
@@ -1,138 +0,0 @@
-var/global/repository/radiation/radiation_repository = new()
-
-/repository/radiation
- var/list/sources = list() // all radiation source datums
- var/list/sources_assoc = list() // Sources indexed by turf for de-duplication.
- var/list/resistance_cache = list() // Cache of turf's radiation resistance.
-
-// Describes a point source of radiation. Created either in response to a pulse of radiation, or over an irradiated atom.
-// Sources will decay over time, unless something is renewing their power!
-/datum/radiation_source
- var/turf/source_turf // Location of the radiation source.
- var/rad_power // Strength of the radiation being emitted.
- var/decay = TRUE // True for automatic decay. False if owner promises to handle it (i.e. supermatter)
- var/respect_maint = FALSE // True for not affecting RAD_SHIELDED areas.
- var/flat = FALSE // True for power falloff with distance.
- var/range // Cached maximum range, used for quick checks against mobs.
-
-/datum/radiation_source/Destroy()
- radiation_repository.sources -= src
- if(radiation_repository.sources_assoc[src.source_turf] == src)
- radiation_repository.sources_assoc -= src.source_turf
- src.source_turf = null
- . = ..()
-
-/datum/radiation_source/proc/update_rad_power(var/new_power = null)
- if(new_power == null || new_power == rad_power)
- return // No change
- else if(new_power <= 0)
- qdel(src) // Decayed to nothing
- else
- rad_power = new_power
- if(!flat)
- range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) // R = rad_power / dist**2 - Solve for dist
-
-// Ray trace from all active radiation sources to T and return the strongest effect.
-/repository/radiation/proc/get_rads_at_turf(var/turf/T)
- if(!istype(T)) return 0
-
- . = 0
- for(var/value in sources)
- var/datum/radiation_source/source = value
- if(source.rad_power < .)
- continue // Already being affected by a stronger source
- if(source.source_turf.z != T.z)
- continue // Radiation is not multi-z
- var/dist = get_dist(source.source_turf, T)
- if(dist > source.range)
- continue // Too far to possibly affect
- if(source.respect_maint)
- var/atom/A = T.loc
- if(A.flags & RAD_SHIELDED)
- continue // In shielded area
- if(source.flat)
- . = max(., source.rad_power)
- continue // No need to ray trace for flat field
-
- // Okay, now ray trace to find resistence!
- var/turf/origin = source.source_turf
- var/working = source.rad_power
- while(origin != T)
- origin = get_step_towards(origin, T) //Raytracing
- if(!(origin in resistance_cache)) //Only get the resistance if we don't already know it.
- origin.calc_rad_resistance()
- working = max((working - (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0)
- if(working <= .)
- break // Already affected by a stronger source (or its zero...)
- . = max((working * (1 / (dist ** 2))), .) //Butchered version of the inverse square law. Works for this purpose
-
-// Add a radiation source instance to the repository. It will override any existing source on the same turf.
-/repository/radiation/proc/add_source(var/datum/radiation_source/S)
- if(!isturf(S.source_turf))
- return
- var/datum/radiation_source/existing = sources_assoc[S.source_turf]
- if(existing)
- qdel(existing)
- sources += S
- sources_assoc[S.source_turf] = S
-
-// Creates a temporary radiation source that will decay
-/repository/radiation/proc/radiate(source, power) //Sends out a radiation pulse, taking walls into account
- if(!(source && power)) //Sanity checking
- return
- var/datum/radiation_source/S = new()
- S.source_turf = get_turf(source)
- S.update_rad_power(power)
- add_source(S)
-
-// Sets the radiation in a range to a constant value.
-/repository/radiation/proc/flat_radiate(source, power, range, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please.
- if(!(source && power && range))
- return
- var/datum/radiation_source/S = new()
- S.flat = TRUE
- S.range = range
- S.respect_maint = respect_maint
- S.source_turf = get_turf(source)
- S.update_rad_power(power)
- add_source(S)
-
-// Irradiates a full Z-level. Hacky way of doing it, but not too expensive.
-/repository/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please.
- if(!(power && source))
- return
- var/turf/epicentre = locate(round(world.maxx / 2), round(world.maxy / 2), source.z)
- flat_radiate(epicentre, power, world.maxx, respect_maint)
-
-/turf
- var/cached_rad_resistance = 0
-
-/turf/proc/calc_rad_resistance()
- cached_rad_resistance = 0
- for(var/obj/O in src.contents)
- if(O.rad_resistance) //Override
- cached_rad_resistance += O.rad_resistance
-
- else if(O.density) //So open doors don't get counted
- var/material/M = O.get_material()
- if(!M) continue
- cached_rad_resistance += M.weight + M.radiation_resistance
- // Looks like storing the contents length is meant to be a basic check if the cache is stale due to items enter/exiting. Better than nothing so I'm leaving it as is. ~Leshana
- radiation_repository.resistance_cache[src] = (length(contents) + 1)
-
-/turf/simulated/wall/calc_rad_resistance()
- radiation_repository.resistance_cache[src] = (length(contents) + 1)
- cached_rad_resistance = (density ? material.weight + material.radiation_resistance : 0)
-
-/obj
- var/rad_resistance = 0 // Allow overriding rad resistance
-
-// If people expand the system, this may be useful. Here as a placeholder until then
-/atom/proc/rad_act(var/severity)
- return 1
-
-/mob/living/rad_act(var/severity)
- if(severity && !isbelly(loc)) //eaten mobs are made immune to radiation //VOREStation Edit Start
- src.apply_effect(severity, IRRADIATE, src.getarmor(null, "rad"))
- for(var/atom/I in src)
- I.rad_act(severity) ///VOREStation Edit End
diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm
index e345b18505..554a826f20 100644
--- a/code/datums/supplypacks/medical.dm
+++ b/code/datums/supplypacks/medical.dm
@@ -349,3 +349,24 @@
cost = 250
containertype = /obj/structure/largecrate
containername = "Industrial Chemical distiller crate"
+
+/datum/supply_pack/med/oxypump
+ name = "Oxygen pump crate"
+ contains = list(/obj/machinery/oxygen_pump/mobile = 1)
+ cost = 125
+ containertype = /obj/structure/largecrate
+ containername = "Oxygen pump crate"
+
+/datum/supply_pack/med/anestheticpump
+ name = "Anesthetic pump crate"
+ contains = list(/obj/machinery/oxygen_pump/mobile/anesthetic = 1)
+ cost = 130
+ containertype = /obj/structure/largecrate
+ containername = "Anesthetic pump crate"
+
+/datum/supply_pack/med/stablepump
+ name = "Portable stabilizer crate"
+ contains = list(/obj/machinery/oxygen_pump/mobile/stabilizer = 1)
+ cost = 175
+ containertype = /obj/structure/largecrate
+ containername = "Portable stabilizer crate"
diff --git a/code/datums/supplypacks/misc.dm b/code/datums/supplypacks/misc.dm
index bf5b8ba53b..7f4f0362db 100644
--- a/code/datums/supplypacks/misc.dm
+++ b/code/datums/supplypacks/misc.dm
@@ -170,3 +170,12 @@
cost = 25
containertype = /obj/structure/closet/crate/freezer
containername = "emergency rations"
+
+/datum/supply_pack/misc/medical_rations
+ name = "Emergency - VitaPaste"
+ contains = list(
+ /obj/item/weapon/storage/mre/menu13 = 2
+ )
+ cost = 40
+ containertype = /obj/structure/closet/crate/freezer
+ containername = "emergency rations"
diff --git a/code/datums/uplink/implants.dm b/code/datums/uplink/implants.dm
index 7e3e2f3005..e36396c9cd 100644
--- a/code/datums/uplink/implants.dm
+++ b/code/datums/uplink/implants.dm
@@ -23,3 +23,53 @@
name = "Uplink Implant" //Original name: "Uplink Implant (Contains 5 Telecrystals)"
item_cost = 50 //Original cost: 10
path = /obj/item/weapon/storage/box/syndie_kit/imp_uplink
+
+/datum/uplink_item/item/implants/imp_shades
+ name = "Integrated Thermal-Shades Implant (Organic)"
+ item_cost = 80
+ path = /obj/item/weapon/storage/box/syndie_kit/imp_aug
+
+/datum/uplink_item/item/implants/imp_taser
+ name = "Integrated Taser Implant (Organic)"
+ item_cost = 30
+ path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/taser
+
+/datum/uplink_item/item/implants/imp_laser
+ name = "Integrated Laser Implant (Organic)"
+ item_cost = 50
+ path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/laser
+
+/datum/uplink_item/item/implants/imp_dart
+ name = "Integrated Dart Implant (Organic)"
+ item_cost = 60
+ path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/dart
+
+/datum/uplink_item/item/implants/imp_toolkit
+ name = "Integrated Toolkit Implant (Organic)"
+ item_cost = 80
+ path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/toolkit
+
+/datum/uplink_item/item/implants/imp_medkit
+ name = "Integrated Medkit Implant (Organic)"
+ item_cost = 60
+ path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/medkit
+
+/datum/uplink_item/item/implants/imp_analyzer
+ name = "Integrated Research Scanner Implant (Organic)"
+ item_cost = 20
+ path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/analyzer
+
+/datum/uplink_item/item/implants/imp_sword
+ name = "Integrated Sword Implant (Organic)"
+ item_cost = 40
+ path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/sword
+
+/datum/uplink_item/item/implants/imp_sprinter
+ name = "Integrated Sprinter Implant (Organic)"
+ item_cost = 40
+ path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/sprinter
+
+/datum/uplink_item/item/implants/imp_sprinter
+ name = "Integrated Surge Implant (Organic)"
+ item_cost = 40
+ path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/surge
diff --git a/code/datums/uplink/medical_vr.dm b/code/datums/uplink/medical_vr.dm
new file mode 100644
index 0000000000..324398843f
--- /dev/null
+++ b/code/datums/uplink/medical_vr.dm
@@ -0,0 +1,57 @@
+/**********
+* Medical *
+**********/
+/datum/uplink_item/item/medical/mre
+ name = "Meal, Ready to eat (Random)"
+ item_cost = 5
+ path = /obj/item/weapon/storage/mre/random
+
+/datum/uplink_item/item/medical/protein
+ name = "Meal, Ready to eat (Protein)"
+ item_cost = 5
+ path = /obj/item/weapon/storage/mre/menu10
+
+/datum/uplink_item/item/medical/emergency
+ name = "Meal, Ready to eat (Emergency)"
+ item_cost = 5
+ path = /obj/item/weapon/storage/mre/menu11
+
+/datum/uplink_item/item/medical/glucose
+ name = "Glucose injector"
+ item_cost = 5
+ path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose
+
+/datum/uplink_item/item/medical/purity
+ name = "Purity injector"
+ item_cost = 5
+ path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity
+
+/datum/uplink_item/item/medical/brute
+ name = "Brute injector"
+ item_cost = 5
+ path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute
+
+/datum/uplink_item/item/medical/burn
+ name = "Burn injector"
+ item_cost = 5
+ path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn
+
+/datum/uplink_item/item/medical/toxin
+ name = "Toxin injector"
+ item_cost = 5
+ path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/toxin
+
+/datum/uplink_item/item/medical/oxy
+ name = "Oxy injector"
+ item_cost = 5
+ path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/oxy
+
+/datum/uplink_item/item/medical/nanites
+ name = "Healing Nanite pill bottle"
+ item_cost = 30
+ path = /obj/item/weapon/storage/pill_bottle/healing_nanites
+
+/datum/uplink_item/item/medical/insiderepair
+ name = "Combat organ kit"
+ item_cost = 120
+ path = /obj/item/weapon/storage/firstaid/insiderepair
diff --git a/code/datums/uplink/tools_vr.dm b/code/datums/uplink/tools_vr.dm
new file mode 100644
index 0000000000..5a165f7aac
--- /dev/null
+++ b/code/datums/uplink/tools_vr.dm
@@ -0,0 +1,42 @@
+/********************
+* Devices and Tools *
+********************/
+/datum/uplink_item/item/tools/basiclaptop
+ name = "Laptop (Basic)"
+ item_cost = 5
+ path = /obj/item/modular_computer/laptop/preset/custom_loadout/cheap
+
+/datum/uplink_item/item/tools/survivalcapsule
+ name = "Survival Capsule"
+ item_cost = 5
+ path = /obj/item/device/survivalcapsule
+
+/datum/uplink_item/item/tools/nanopaste
+ name = "Nanopaste (Advanced)"
+ item_cost = 10
+ path = /obj/item/stack/nanopaste/advanced
+
+/datum/uplink_item/item/tools/elitetablet
+ name = "Tablet (Advanced)"
+ item_cost = 15
+ path = /obj/item/modular_computer/tablet/preset/custom_loadout/advanced
+
+/datum/uplink_item/item/tools/elitelaptop
+ name = "Laptop (Advanced)"
+ item_cost = 20
+ path = /obj/item/modular_computer/laptop/preset/custom_loadout/elite
+
+/datum/uplink_item/item/tools/luxurycapsule
+ name = "Survival Capsule (Luxury)"
+ item_cost = 40
+ path = /obj/item/device/survivalcapsule/luxury
+
+/datum/uplink_item/item/tools/translocator
+ name = "Translocator"
+ item_cost = 40
+ path = /obj/item/device/perfect_tele
+
+/datum/uplink_item/item/tools/barcapsule
+ name = "Survival Capsule (Bar)"
+ item_cost = 80
+ path = /obj/item/device/survivalcapsule/luxurybar
diff --git a/code/datums/uplink/visible_weapons.dm b/code/datums/uplink/visible_weapons.dm
index e8a69d2aaf..e4c27752f0 100644
--- a/code/datums/uplink/visible_weapons.dm
+++ b/code/datums/uplink/visible_weapons.dm
@@ -15,37 +15,17 @@
path = /obj/item/weapon/material/knife/tacknife/combatknife
/datum/uplink_item/item/visible_weapons/energy_sword
- name = "Energy Sword, Random"
+ name = "Energy Sword, Colorable"
item_cost = 40
path = /obj/item/weapon/melee/energy/sword
-/datum/uplink_item/item/visible_weapons/energy_sword_blue
- name = "Energy Sword, Blue"
- item_cost = 40
- path = /obj/item/weapon/melee/energy/sword/blue
-
-/datum/uplink_item/item/visible_weapons/energy_sword_green
- name = "Energy Sword, Green"
- item_cost = 40
- path = /obj/item/weapon/melee/energy/sword/green
-
-/datum/uplink_item/item/visible_weapons/energy_sword_red
- name = "Energy Sword, Red"
- item_cost = 40
- path = /obj/item/weapon/melee/energy/sword/red
-
-/datum/uplink_item/item/visible_weapons/energy_sword_purple
- name = "Energy Sword, Purple"
- item_cost = 40
- path = /obj/item/weapon/melee/energy/sword/purple
-
/datum/uplink_item/item/visible_weapons/energy_sword_pirate
- name = "Energy Cutlass"
+ name = "Energy Cutlass, Colorable"
item_cost = 40
path = /obj/item/weapon/melee/energy/sword/pirate
/datum/uplink_item/item/visible_weapons/energy_spear
- name = "Energy Spear"
+ name = "Energy Spear, Colorable"
item_cost = 50
path = /obj/item/weapon/melee/energy/spear
@@ -192,4 +172,4 @@
/datum/uplink_item/item/visible_weapons/xray
name = "Xray Gun"
item_cost = 85
- path = /obj/item/weapon/gun/energy/xray
\ No newline at end of file
+ path = /obj/item/weapon/gun/energy/xray
diff --git a/code/game/antagonist/antagonist_factions.dm b/code/game/antagonist/antagonist_factions.dm
index 83c9957be2..a072196c1b 100644
--- a/code/game/antagonist/antagonist_factions.dm
+++ b/code/game/antagonist/antagonist_factions.dm
@@ -14,33 +14,33 @@
return
if(faction.is_antagonist(player))
- src << "\The [player.current] already serves the [faction.faction_descriptor]."
+ to_chat(src, "\The [player.current] already serves the [faction.faction_descriptor].")
return
if(player_is_antag(player))
- src << "\The [player.current]'s loyalties seem to be elsewhere..."
+ to_chat(src, "\The [player.current]'s loyalties seem to be elsewhere...")
return
if(!faction.can_become_antag(player))
- src << "\The [player.current] cannot be \a [faction.faction_role_text]!"
+ to_chat(src, "\The [player.current] cannot be \a [faction.faction_role_text]!")
return
if(world.time < player.rev_cooldown)
- src << "You must wait five seconds between attempts."
+ to_chat(src, "You must wait five seconds between attempts.")
return
- src << "You are attempting to convert \the [player.current]..."
+ to_chat(src, "You are attempting to convert \the [player.current]...")
log_admin("[src]([src.ckey]) attempted to convert [player.current].")
message_admins("[src]([src.ckey]) attempted to convert [player.current].")
player.rev_cooldown = world.time+100
var/choice = alert(player.current,"Asked by [src]: Do you want to join the [faction.faction_descriptor]?","Join the [faction.faction_descriptor]?","No!","Yes!")
if(choice == "Yes!" && faction.add_antagonist_mind(player, 0, faction.faction_role_text, faction.faction_welcome))
- src << "\The [player.current] joins the [faction.faction_descriptor]!"
+ to_chat(src, "\The [player.current] joins the [faction.faction_descriptor]!")
return
if(choice == "No!")
player << "You reject this traitorous cause!"
- src << "\The [player.current] does not support the [faction.faction_descriptor]!"
+ to_chat(src, "\The [player.current] does not support the [faction.faction_descriptor]!")
/mob/living/proc/convert_to_loyalist(mob/M as mob in oview(src))
set name = "Convert Recidivist"
diff --git a/code/game/antagonist/antagonist_objectives.dm b/code/game/antagonist/antagonist_objectives.dm
index 5dc6c5f327..fba6467983 100644
--- a/code/game/antagonist/antagonist_objectives.dm
+++ b/code/game/antagonist/antagonist_objectives.dm
@@ -38,8 +38,8 @@
if(!mind)
return
if(!is_special_character(mind))
- src << "While you may perhaps have goals, this verb's meant to only be visible \
- to antagonists. Please make a bug report!"
+ to_chat(src, "While you may perhaps have goals, this verb's meant to only be visible \
+ to antagonists. Please make a bug report!")
return
var/new_ambitions = input(src, "Write a short sentence of what your character hopes to accomplish \
today as an antagonist. Remember that this is purely optional. It will be shown at the end of the \
@@ -49,7 +49,7 @@
new_ambitions = sanitize(new_ambitions)
mind.ambitions = new_ambitions
if(new_ambitions)
- src << "You've set your goal to be '[new_ambitions]'."
+ to_chat(src, "You've set your goal to be '[new_ambitions]'.")
else
- src << "You leave your ambitions behind."
+ to_chat(src, "You leave your ambitions behind.")
log_and_message_admins("has set their ambitions to now be: [new_ambitions].")
diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm
index feaf8857ba..6f2a7fe2e3 100644
--- a/code/game/antagonist/outsider/wizard.dm
+++ b/code/game/antagonist/outsider/wizard.dm
@@ -115,18 +115,18 @@ obj/item/clothing
/*Checks if the wizard is wearing the proper attire.
Made a proc so this is not repeated 14 (or more) times.*/
/mob/proc/wearing_wiz_garb()
- src << "Silly creature, you're not a human. Only humans can cast this spell."
+ to_chat(src, "Silly creature, you're not a human. Only humans can cast this spell.")
return 0
// Humans can wear clothes.
/mob/living/carbon/human/wearing_wiz_garb()
if(!is_wiz_garb(src.wear_suit))
- src << "I don't feel strong enough without my robe."
+ to_chat(src, "I don't feel strong enough without my robe.")
return 0
if(!is_wiz_garb(src.shoes))
- src << "I don't feel strong enough without my sandals."
+ to_chat(src, "I don't feel strong enough without my sandals.")
return 0
if(!is_wiz_garb(src.head))
- src << "I don't feel strong enough without my hat."
+ to_chat(src, "I don't feel strong enough without my hat.")
return 0
return 1
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index ceebe5df22..daa87810fd 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -111,6 +111,8 @@ var/global/list/datum/dna/gene/dna_genes[0]
// New stuff
var/species = SPECIES_HUMAN
var/list/body_markings = 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.
// Make a copy of this strand.
// USE THIS WHEN COPYING STUFF OR YOU'LL GET CORRUPTION!
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 998b712828..1fe5d43a59 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -18,6 +18,8 @@
var/mind=null
var/languages=null
var/list/flavor=null
+ var/gender = null
+ 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.
/datum/dna2/record/proc/GetData()
@@ -706,7 +708,10 @@
databuf.types = DNA2_BUF_UE
databuf.dna = src.connected.occupant.dna.Clone()
if(ishuman(connected.occupant))
- databuf.dna.real_name=connected.occupant.dna.real_name
+ var/mob/living/carbon/human/H = connected.occupant
+ databuf.dna.real_name = H.dna.real_name
+ databuf.gender = H.gender
+ databuf.body_descriptors = H.descriptors
databuf.name = "Unique Identifier"
src.buffers[bufferId] = databuf
return 1
@@ -717,7 +722,10 @@
databuf.types = DNA2_BUF_UI|DNA2_BUF_UE
databuf.dna = src.connected.occupant.dna.Clone()
if(ishuman(connected.occupant))
- databuf.dna.real_name=connected.occupant.dna.real_name
+ var/mob/living/carbon/human/H = connected.occupant
+ databuf.dna.real_name = H.dna.real_name
+ databuf.gender = H.gender
+ databuf.body_descriptors = H.descriptors
databuf.name = "Unique Identifier + Unique Enzymes"
src.buffers[bufferId] = databuf
return 1
@@ -728,7 +736,10 @@
databuf.types = DNA2_BUF_SE
databuf.dna = src.connected.occupant.dna.Clone()
if(ishuman(connected.occupant))
- databuf.dna.real_name=connected.occupant.dna.real_name
+ var/mob/living/carbon/human/H = connected.occupant
+ databuf.dna.real_name = H.dna.real_name
+ databuf.gender = H.gender
+ databuf.body_descriptors = H.descriptors
databuf.name = "Structural Enzymes"
src.buffers[bufferId] = databuf
return 1
@@ -764,10 +775,18 @@
if ((buf.types & DNA2_BUF_UE))
src.connected.occupant.real_name = buf.dna.real_name
src.connected.occupant.name = buf.dna.real_name
+ if(ishuman(connected.occupant))
+ var/mob/living/carbon/human/H = connected.occupant
+ H.gender = buf.gender
+ H.descriptors = buf.body_descriptors
src.connected.occupant.UpdateAppearance(buf.dna.UI.Copy())
else if (buf.types & DNA2_BUF_SE)
src.connected.occupant.dna.SE = buf.dna.SE
src.connected.occupant.dna.UpdateSE()
+ if(ishuman(connected.occupant))
+ var/mob/living/carbon/human/H = connected.occupant
+ H.gender = buf.gender
+ H.descriptors = buf.body_descriptors
domutcheck(src.connected.occupant,src.connected)
src.connected.occupant.apply_effect(rand(20,50), IRRADIATE, check_protection = 0)
return 1
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 627b4e8b14..373aefa0d8 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -129,19 +129,19 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
return
if(src.stat > max_stat)
- src << "We are incapacitated."
+ to_chat(src, "We are incapacitated.")
return
if(changeling.absorbed_dna.len < required_dna)
- src << "We require at least [required_dna] samples of compatible DNA."
+ to_chat(src, "We require at least [required_dna] samples of compatible DNA.")
return
if(changeling.chem_charges < required_chems)
- src << "We require at least [required_chems] units of chemicals to do that!"
+ to_chat(src, "We require at least [required_chems] units of chemicals to do that!")
return
if(changeling.geneticdamage > max_genetic_damage)
- src << "Our genomes are still reassembling. We need time to recover first."
+ to_chat(src, "Our genomes are still reassembling. We need time to recover first.")
return
return changeling
@@ -204,11 +204,11 @@ turf/proc/AdjacentTurfsRangedSting()
if(M.loc == src.loc)
return 1 //target and source are in the same thing
if(!isturf(src.loc) || !isturf(M.loc))
- src << "We cannot reach \the [M] with a sting!"
+ to_chat(src, "We cannot reach \the [M] with a sting!")
return 0 //One is inside, the other is outside something.
// Maximum queued turfs set to 25; I don't *think* anything raises sting_range above 2, but if it does the 25 may need raising
if(!AStar(src.loc, M.loc, /turf/proc/AdjacentTurfsRangedSting, /turf/proc/Distance, max_nodes=25, max_node_depth=sting_range)) //If we can't find a path, fail
- src << "We cannot find a path to sting \the [M] by!"
+ to_chat(src, "We cannot find a path to sting \the [M] by!")
return 0
return 1
@@ -225,7 +225,7 @@ turf/proc/AdjacentTurfsRangedSting()
if(!T)
return
if(T.isSynthetic())
- src << "We are unable to pierce the outer shell of [T]."
+ to_chat(src, "We are unable to pierce the outer shell of [T].")
return
if(!(T in view(changeling.sting_range))) return
if(!sting_can_reach(T, changeling.sting_range)) return
@@ -236,7 +236,7 @@ turf/proc/AdjacentTurfsRangedSting()
src.verbs -= verb_path
spawn(10) src.verbs += verb_path
- src << "We stealthily sting [T]."
+ to_chat(src, "We stealthily sting [T].")
if(!T.mind || !T.mind.changeling) return T //T will be affected by the sting
T << "You feel a tiny prick."
return
diff --git a/code/game/gamemodes/changeling/generic_equip_procs.dm b/code/game/gamemodes/changeling/generic_equip_procs.dm
index ef1ab650a1..f2d7b45831 100644
--- a/code/game/gamemodes/changeling/generic_equip_procs.dm
+++ b/code/game/gamemodes/changeling/generic_equip_procs.dm
@@ -32,7 +32,7 @@
return 1
if(M.head || M.wear_suit) //Make sure our slots aren't full
- src << "We require nothing to be on our head, and we cannot wear any external suits, or shoes."
+ to_chat(src, "We require nothing to be on our head, and we cannot wear any external suits, or shoes.")
return 0
var/obj/item/clothing/suit/A = new armor_type(src)
@@ -242,7 +242,7 @@
var/mob/living/carbon/human/M = src
if(M.hands_are_full()) //Make sure our hands aren't full.
- src << "Our hands are full. Drop something first."
+ to_chat(src, "Our hands are full. Drop something first.")
return 0
var/obj/item/weapon/W = new weapon_type(src)
diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm
index 45b230b00c..02285a0c7e 100644
--- a/code/game/gamemodes/changeling/powers/absorb.dm
+++ b/code/game/gamemodes/changeling/powers/absorb.dm
@@ -16,41 +16,41 @@
var/obj/item/weapon/grab/G = src.get_active_hand()
if(!istype(G))
- src << "We must be grabbing a creature in our active hand to absorb them."
+ to_chat(src, "We must be grabbing a creature in our active hand to absorb them.")
return
var/mob/living/carbon/human/T = G.affecting
if(!istype(T) || T.isSynthetic())
- src << "\The [T] is not compatible with our biology."
+ to_chat(src, "\The [T] is not compatible with our biology.")
return
if(T.species.flags & NO_SCAN)
- src << "We do not know how to parse this creature's DNA!"
+ to_chat(src, "We do not know how to parse this creature's DNA!")
return
if(HUSK in T.mutations) //Lings can always absorb other lings, unless someone beat them to it first.
if(!T.mind.changeling || T.mind.changeling && T.mind.changeling.geneticpoints < 0)
- src << "This creature's DNA is ruined beyond useability!"
+ to_chat(src, "This creature's DNA is ruined beyond useability!")
return
if(G.state != GRAB_KILL)
- src << "We must have a tighter grip to absorb this creature."
+ to_chat(src, "We must have a tighter grip to absorb this creature.")
return
if(changeling.isabsorbing)
- src << "We are already absorbing!"
+ to_chat(src, "We are already absorbing!")
return
changeling.isabsorbing = 1
for(var/stage = 1, stage<=3, stage++)
switch(stage)
if(1)
- src << "This creature is compatible. We must hold still..."
+ to_chat(src, "This creature is compatible. We must hold still...")
if(2)
- src << "We extend a proboscis."
+ to_chat(src, "We extend a proboscis.")
src.visible_message("[src] extends a proboscis!")
if(3)
- src << "We stab [T] with the proboscis."
+ to_chat(src, "We stab [T] with the proboscis.")
src.visible_message("[src] stabs [T] with the proboscis!")
T << "You feel a sharp stabbing pain!"
add_attack_logs(src,T,"Absorbed (changeling)")
@@ -60,11 +60,11 @@
feedback_add_details("changeling_powers","A[stage]")
if(!do_mob(src, T, 150) || G.state != GRAB_KILL)
- src << "Our absorption of [T] has been interrupted!"
+ to_chat(src, "Our absorption of [T] has been interrupted!")
changeling.isabsorbing = 0
return
- src << "We have absorbed [T]!"
+ to_chat(src, "We have absorbed [T]!")
src.visible_message("[src] sucks the fluids from [T]!")
T << "You have been absorbed by the changeling!"
if(src.nutrition < 400)
@@ -76,7 +76,7 @@
if(changeling.readapts > changeling.max_readapts)
changeling.readapts = changeling.max_readapts
- src << "We can now re-adapt, reverting our evolution so that we may start anew, if needed."
+ to_chat(src, "We can now re-adapt, reverting our evolution so that we may start anew, if needed.")
var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages, T.identifying_gender, T.flavor_texts, T.modifiers)
absorbDNA(newDNA)
@@ -98,7 +98,7 @@
changeling.geneticpoints += 4
changeling.max_geneticpoints += 4
- src << "We absorbed another changeling, and we grow stronger. Our genomes increase."
+ to_chat(src, "We absorbed another changeling, and we grow stronger. Our genomes increase.")
T.mind.changeling.chem_charges = 0
T.mind.changeling.geneticpoints = -1
diff --git a/code/game/gamemodes/changeling/powers/armblade.dm b/code/game/gamemodes/changeling/powers/armblade.dm
index 947f06cee4..c05ad96e81 100644
--- a/code/game/gamemodes/changeling/powers/armblade.dm
+++ b/code/game/gamemodes/changeling/powers/armblade.dm
@@ -14,7 +14,7 @@
if(src.mind.changeling.recursive_enhancement)
if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/arm_blade/greater))
- src << "We prepare an extra sharp blade."
+ to_chat(src, "We prepare an extra sharp blade.")
return 1
else
@@ -39,7 +39,7 @@
if(src.mind.changeling.recursive_enhancement)
if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/claw/greater, 1, 15))
- src << "We prepare an extra sharp claw."
+ to_chat(src, "We prepare an extra sharp claw.")
return 1
else
diff --git a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm
index 3f3c1bd7ad..192f8b3874 100644
--- a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm
+++ b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm
@@ -25,7 +25,7 @@
if(held_item == null)
if(src.mind.changeling.recursive_enhancement)
if(changeling_generic_weapon(/obj/item/weapon/electric_hand/efficent,0))
- src << "We will shock others more efficently."
+ to_chat(src, "We will shock others more efficently.")
return 1
else
if(changeling_generic_weapon(/obj/item/weapon/electric_hand,0)) //Chemical cost is handled in the equip proc.
@@ -54,7 +54,7 @@
"Our hand channels raw electricity into [G.affecting].",
"You hear sparks!")
else
- src << "Our gloves block us from shocking \the [G.affecting]."
+ to_chat(src, "Our gloves block us from shocking \the [G.affecting].")
src.mind.changeling.chem_charges -= 10
return 1
@@ -92,7 +92,7 @@
sleep(1 SECOND)
success = 1
if(success == 0) //If we couldn't do anything with the ability, don't deduct the chemicals.
- src << "We are unable to affect \the [held_item]."
+ to_chat(src, "We are unable to affect \the [held_item].")
else
src.mind.changeling.chem_charges -= 10
return success
@@ -143,7 +143,7 @@
var/mob/living/carbon/C = target
if(user.mind.changeling.chem_charges < shock_cost)
- src << "We require more chemicals to electrocute [C]!"
+ to_chat(src, "We require more chemicals to electrocute [C]!")
return 0
C.electrocute_act(electrocute_amount * siemens,src,1.0,BP_TORSO)
@@ -156,7 +156,7 @@
"Our hand channels raw electricity into [C]",
"You hear sparks!")
else
- src << "Our gloves block us from shocking \the [C]."
+ to_chat(src, "Our gloves block us from shocking \the [C].")
//qdel(src) //Since we're no longer a one hit stun, we need to stick around.
user.mind.changeling.chem_charges -= shock_cost
return 1
@@ -165,7 +165,7 @@
var/mob/living/silicon/S = target
if(user.mind.changeling.chem_charges < 10)
- src << "We require more chemicals to electrocute [S]!"
+ to_chat(src, "We require more chemicals to electrocute [S]!")
return 0
S.electrocute_act(60,src,0.75) //If only they had surge protectors.
@@ -205,7 +205,7 @@
success = 1
break
if(success == 0)
- src << "We are unable to affect \the [target]."
+ to_chat(src, "We are unable to affect \the [target].")
else
qdel(src)
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/blind_sting.dm b/code/game/gamemodes/changeling/powers/blind_sting.dm
index 347881df9b..e2fede649e 100644
--- a/code/game/gamemodes/changeling/powers/blind_sting.dm
+++ b/code/game/gamemodes/changeling/powers/blind_sting.dm
@@ -21,7 +21,7 @@
var/duration = 300
if(src.mind.changeling.recursive_enhancement)
duration = duration + 150
- src << "They will be deprived of sight for longer."
+ to_chat(src, "They will be deprived of sight for longer.")
spawn(duration)
T.disabilities &= ~NEARSIGHTED
T.Blind(10)
diff --git a/code/game/gamemodes/changeling/powers/cryo_sting.dm b/code/game/gamemodes/changeling/powers/cryo_sting.dm
index bc68428d89..e1a2b10cff 100644
--- a/code/game/gamemodes/changeling/powers/cryo_sting.dm
+++ b/code/game/gamemodes/changeling/powers/cryo_sting.dm
@@ -20,12 +20,12 @@
var/inject_amount = 10
if(src.mind.changeling.recursive_enhancement)
inject_amount = inject_amount * 1.5
- src << "We inject extra chemicals."
+ to_chat(src, "We inject extra chemicals.")
if(T.reagents)
T.reagents.add_reagent("cryotoxin", inject_amount)
feedback_add_details("changeling_powers","CS")
src.verbs -= /mob/proc/changeling_cryo_sting
spawn(3 MINUTES)
- src << "Our cryogenic string is ready to be used once more."
+ to_chat(src, "Our cryogenic string is ready to be used once more.")
src.verbs |= /mob/proc/changeling_cryo_sting
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/deaf_sting.dm b/code/game/gamemodes/changeling/powers/deaf_sting.dm
index a94ad1744a..92e7a80a30 100644
--- a/code/game/gamemodes/changeling/powers/deaf_sting.dm
+++ b/code/game/gamemodes/changeling/powers/deaf_sting.dm
@@ -19,7 +19,7 @@
var/duration = 300
if(src.mind.changeling.recursive_enhancement)
duration = duration + 100
- src << "They will be unable to hear for a little longer."
+ to_chat(src, "They will be unable to hear for a little longer.")
T << "Your ears pop and begin ringing loudly!"
T.sdisabilities |= DEAF
spawn(duration) T.sdisabilities &= ~DEAF
diff --git a/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm b/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm
index 7853a9603e..f50460a826 100644
--- a/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm
+++ b/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm
@@ -32,7 +32,7 @@
var/type_to_give = /datum/modifier/delayed_toxin_sting
if(src.mind.changeling.recursive_enhancement)
type_to_give = /datum/modifier/delayed_toxin_sting/strong
- src << "Our toxin will be extra potent, when it strikes."
+ to_chat(src, "Our toxin will be extra potent, when it strikes.")
T.add_modifier(type_to_give, 2 MINUTES)
diff --git a/code/game/gamemodes/changeling/powers/enfeebling_string.dm b/code/game/gamemodes/changeling/powers/enfeebling_string.dm
index 16303f7c58..81930a7ebc 100644
--- a/code/game/gamemodes/changeling/powers/enfeebling_string.dm
+++ b/code/game/gamemodes/changeling/powers/enfeebling_string.dm
@@ -40,7 +40,7 @@
var/type_to_give = /datum/modifier/enfeeble
if(src.mind.changeling.recursive_enhancement)
type_to_give = /datum/modifier/enfeeble/strong
- src << "We make them extremely weak."
+ to_chat(src, "We make them extremely weak.")
H.add_modifier(type_to_give, 2 MINUTES)
feedback_add_details("changeling_powers","ES")
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/extract_dna_sting.dm b/code/game/gamemodes/changeling/powers/extract_dna_sting.dm
index 0c5d91d83b..35ce94daf0 100644
--- a/code/game/gamemodes/changeling/powers/extract_dna_sting.dm
+++ b/code/game/gamemodes/changeling/powers/extract_dna_sting.dm
@@ -24,15 +24,15 @@
return
if(!istype(T) || T.isSynthetic())
- src << "\The [T] is not compatible with our biology."
+ to_chat(src, "\The [T] is not compatible with our biology.")
return 0
if(T.species.flags & NO_SCAN)
- src << "We do not know how to parse this creature's DNA!"
+ to_chat(src, "We do not know how to parse this creature's DNA!")
return 0
if(HUSK in T.mutations)
- src << "This creature's DNA is ruined beyond useability!"
+ to_chat(src, "This creature's DNA is ruined beyond useability!")
return 0
add_attack_logs(src,T,"DNA extraction sting (changeling)")
diff --git a/code/game/gamemodes/changeling/powers/fake_death.dm b/code/game/gamemodes/changeling/powers/fake_death.dm
index cae98164a0..3581a8d06a 100644
--- a/code/game/gamemodes/changeling/powers/fake_death.dm
+++ b/code/game/gamemodes/changeling/powers/fake_death.dm
@@ -19,7 +19,7 @@
var/mob/living/carbon/C = src
if(changeling.max_geneticpoints < 0) //Absorbed by another ling
- src << "We have no genomes, not even our own, and cannot regenerate."
+ to_chat(src, "We have no genomes, not even our own, and cannot regenerate.")
return 0
if(!C.stat && alert("Are we sure we wish to regenerate? We will appear to be dead while doing so.","Revival","Yes","No") == "No")
@@ -44,7 +44,7 @@
spawn(rand(2 MINUTES, 4 MINUTES))
//The ling will now be able to choose when to revive
src.verbs += /mob/proc/changeling_revive
- src << "We are ready to rise. Use the Revive verb when you are ready."
+ to_chat(src, "We are ready to rise. Use the Revive verb when you are ready.")
feedback_add_details("changeling_powers","FD")
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm
index f7760e9ce6..ed60400517 100644
--- a/code/game/gamemodes/changeling/powers/fleshmend.dm
+++ b/code/game/gamemodes/changeling/powers/fleshmend.dm
@@ -22,10 +22,10 @@
var/heal_amount = 2
if(src.mind.changeling.recursive_enhancement)
heal_amount = heal_amount * 2
- src << "We will heal much faster."
+ to_chat(src, "We will heal much faster.")
spawn(0)
- src << "We begin to heal ourselves."
+ to_chat(src, "We begin to heal ourselves.")
for(var/i = 0, i<50,i++)
if(C)
C.adjustBruteLoss(-heal_amount)
@@ -35,7 +35,7 @@
src.verbs -= /mob/proc/changeling_fleshmend
spawn(50 SECONDS)
- src << "Our regeneration has slowed to normal levels."
+ to_chat(src, "Our regeneration has slowed to normal levels.")
src.verbs += /mob/proc/changeling_fleshmend
feedback_add_details("changeling_powers","FM")
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/hivemind.dm b/code/game/gamemodes/changeling/powers/hivemind.dm
index c8e5f11604..105de8f4f5 100644
--- a/code/game/gamemodes/changeling/powers/hivemind.dm
+++ b/code/game/gamemodes/changeling/powers/hivemind.dm
@@ -34,7 +34,7 @@ var/list/datum/dna/hivemind_bank = list()
names += DNA.name
if(names.len <= 0)
- src << "The airwaves already have all of our DNA."
+ to_chat(src, "The airwaves already have all of our DNA.")
return
var/S = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names
@@ -46,7 +46,7 @@ var/list/datum/dna/hivemind_bank = list()
changeling.chem_charges -= 10
hivemind_bank += chosen_dna
- src << "We channel the DNA of [S] to the air."
+ to_chat(src, "We channel the DNA of [S] to the air.")
feedback_add_details("changeling_powers","HU")
return 1
@@ -64,7 +64,7 @@ var/list/datum/dna/hivemind_bank = list()
names[DNA.name] = DNA
if(names.len <= 0)
- src << "There's no new DNA to absorb from the air."
+ to_chat(src, "There's no new DNA to absorb from the air.")
return
var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names
@@ -75,6 +75,6 @@ var/list/datum/dna/hivemind_bank = list()
changeling.chem_charges -= 20
absorbDNA(chosen_dna)
- src << "We absorb the DNA of [S] from the air."
+ to_chat(src, "We absorb the DNA of [S] from the air.")
feedback_add_details("changeling_powers","HD")
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/lesser_form.dm b/code/game/gamemodes/changeling/powers/lesser_form.dm
index f2742490f6..6a5cf80730 100644
--- a/code/game/gamemodes/changeling/powers/lesser_form.dm
+++ b/code/game/gamemodes/changeling/powers/lesser_form.dm
@@ -13,13 +13,13 @@
if(!changeling) return
if(src.has_brain_worms())
- src << "We cannot perform this ability at the present time!"
+ to_chat(src, "We cannot perform this ability at the present time!")
return
var/mob/living/carbon/human/H = src
if(!istype(H) || !H.species.primitive_form)
- src << "We cannot perform this ability in this form!"
+ to_chat(src, "We cannot perform this ability in this form!")
return
changeling.chem_charges--
diff --git a/code/game/gamemodes/changeling/powers/mimic_voice.dm b/code/game/gamemodes/changeling/powers/mimic_voice.dm
index ae95317683..6b84c577ff 100644
--- a/code/game/gamemodes/changeling/powers/mimic_voice.dm
+++ b/code/game/gamemodes/changeling/powers/mimic_voice.dm
@@ -19,7 +19,7 @@
if(changeling.mimicing)
changeling.mimicing = ""
- src << "We return our vocal glands to their original location."
+ to_chat(src, "We return our vocal glands to their original location.")
return
var/mimic_voice = sanitize(input(usr, "Enter a name to mimic.", "Mimic Voice", null), MAX_NAME_LEN)
@@ -28,8 +28,8 @@
changeling.mimicing = mimic_voice
- src << "We shape our glands to take the voice of [mimic_voice], this will stop us from regenerating chemicals while active."
- src << "Use this power again to return to our original voice and reproduce chemicals again."
+ to_chat(src, "We shape our glands to take the voice of [mimic_voice], this will stop us from regenerating chemicals while active.")
+ to_chat(src, "Use this power again to return to our original voice and reproduce chemicals again.")
feedback_add_details("changeling_powers","MV")
diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm
index 660434d185..30679b6ef5 100644
--- a/code/game/gamemodes/changeling/powers/panacea.dm
+++ b/code/game/gamemodes/changeling/powers/panacea.dm
@@ -18,7 +18,7 @@
return 0
src.mind.changeling.chem_charges -= 20
- src << "We cleanse impurities from our form."
+ to_chat(src, "We cleanse impurities from our form.")
var/mob/living/carbon/human/C = src
@@ -32,7 +32,7 @@
var/heal_amount = 5
if(src.mind.changeling.recursive_enhancement)
heal_amount = heal_amount * 2
- src << "We will heal much faster."
+ to_chat(src, "We will heal much faster.")
for(var/i = 0, i<10,i++)
if(C)
diff --git a/code/game/gamemodes/changeling/powers/rapid_regen.dm b/code/game/gamemodes/changeling/powers/rapid_regen.dm
index 2eb628b8f6..6d1e9ee300 100644
--- a/code/game/gamemodes/changeling/powers/rapid_regen.dm
+++ b/code/game/gamemodes/changeling/powers/rapid_regen.dm
@@ -24,7 +24,7 @@
var/healing_amount = 40
if(src.mind.changeling.recursive_enhancement)
healing_amount = C.maxHealth
- src << "We completely heal ourselves."
+ to_chat(src, "We completely heal ourselves.")
spawn(0)
C.adjustBruteLoss(-healing_amount)
C.adjustFireLoss(-healing_amount)
diff --git a/code/game/gamemodes/changeling/powers/recursive_enhancement.dm b/code/game/gamemodes/changeling/powers/recursive_enhancement.dm
index 9362333c57..77bab9bd99 100644
--- a/code/game/gamemodes/changeling/powers/recursive_enhancement.dm
+++ b/code/game/gamemodes/changeling/powers/recursive_enhancement.dm
@@ -15,10 +15,10 @@
if(!changeling)
return 0
if(src.mind.changeling.recursive_enhancement)
- src << "We will no longer empower our abilities."
+ to_chat(src, "We will no longer empower our abilities.")
src.mind.changeling.recursive_enhancement = 0
return 0
- src << "We empower ourselves. Our abilities will now be extra potent."
+ to_chat(src, "We empower ourselves. Our abilities will now be extra potent.")
src.mind.changeling.recursive_enhancement = 1
feedback_add_details("changeling_powers","RE")
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/respec.dm b/code/game/gamemodes/changeling/powers/respec.dm
index 66f13e720f..a50a41269f 100644
--- a/code/game/gamemodes/changeling/powers/respec.dm
+++ b/code/game/gamemodes/changeling/powers/respec.dm
@@ -7,7 +7,7 @@
if(!changeling)
return
if(src.mind.changeling.readapts <= 0)
- to_chat(src, "We must first absorb another compatable creature!")
+ to_chat(src, "We must first absorb another compatible creature!")
src.mind.changeling.readapts = 0
return
@@ -26,6 +26,6 @@
H.remove_modifiers_of_type(/datum/modifier/endoarmor) //Revert endoarmor too.
src.make_changeling() //And give back our freebies.
- src << "We have removed our evolutions from this form, and are now ready to readapt."
+ to_chat(src, "We have removed our evolutions from this form, and are now ready to readapt.")
ling_datum.purchased_powers_history.Add("Re-adapt (Reset to [ling_datum.max_geneticpoints])")
diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm
index 7fe4ab232b..0648fa8ab6 100644
--- a/code/game/gamemodes/changeling/powers/revive.dm
+++ b/code/game/gamemodes/changeling/powers/revive.dm
@@ -9,7 +9,7 @@
return 0
if(changeling.max_geneticpoints < 0) //Absorbed by another ling
- src << "You have no genomes, not even your own, and cannot revive."
+ to_chat(src, "You have no genomes, not even your own, and cannot revive.")
return 0
if(src.stat == DEAD)
diff --git a/code/game/gamemodes/changeling/powers/self_respiration.dm b/code/game/gamemodes/changeling/powers/self_respiration.dm
index 6d6228eba8..5108361669 100644
--- a/code/game/gamemodes/changeling/powers/self_respiration.dm
+++ b/code/game/gamemodes/changeling/powers/self_respiration.dm
@@ -19,13 +19,13 @@
if(istype(src,/mob/living/carbon))
var/mob/living/carbon/C = src
if(C.suiciding)
- src << "You're committing suicide, this isn't going to work."
+ to_chat(src, "You're committing suicide, this isn't going to work.")
return 0
if(C.does_not_breathe == 0)
C.does_not_breathe = 1
- src << "We stop breathing, as we no longer need to."
+ to_chat(src, "We stop breathing, as we no longer need to.")
return 1
else
C.does_not_breathe = 0
- src << "We resume breathing, as we now need to again."
+ to_chat(src, "We resume breathing, as we now need to again.")
return 0
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm
index 4989c27f87..a2b9013c5a 100644
--- a/code/game/gamemodes/changeling/powers/shriek.dm
+++ b/code/game/gamemodes/changeling/powers/shriek.dm
@@ -95,13 +95,13 @@
if(!changeling) return 0
if(is_muzzled())
- src << "Mmmf mrrfff!"
+ to_chat(src, "Mmmf mrrfff!")
return 0
if(ishuman(src))
var/mob/living/carbon/human/H = src
if(H.silent)
- src << "You can't speak!"
+ to_chat(src, "You can't speak!")
return 0
if(world.time < (changeling.last_shriek + 10 SECONDS) )
@@ -125,7 +125,7 @@
range_med = range_med * 2
range_light = range_light * 2
range_long = range_long * 2
- src << "We are extra loud."
+ to_chat(src, "We are extra loud.")
src.mind.changeling.recursive_enhancement = 0
visible_message("[src] appears to shout.")
diff --git a/code/game/gamemodes/changeling/powers/silence_sting.dm b/code/game/gamemodes/changeling/powers/silence_sting.dm
index 334b0c139f..16d24c878f 100644
--- a/code/game/gamemodes/changeling/powers/silence_sting.dm
+++ b/code/game/gamemodes/changeling/powers/silence_sting.dm
@@ -19,7 +19,7 @@
var/duration = 30
if(src.mind.changeling.recursive_enhancement)
duration = duration + 10
- src << "They will be unable to cry out in fear for a little longer."
+ to_chat(src, "They will be unable to cry out in fear for a little longer.")
T.silent += duration
feedback_add_details("changeling_powers","SS")
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/transform_sting.dm b/code/game/gamemodes/changeling/powers/transform_sting.dm
index 678e195e22..1f6bc7b93d 100644
--- a/code/game/gamemodes/changeling/powers/transform_sting.dm
+++ b/code/game/gamemodes/changeling/powers/transform_sting.dm
@@ -34,7 +34,7 @@
if(!T)
return 0
if((HUSK in T.mutations) || (!ishuman(T) && !issmall(T)))
- src << "Our sting appears ineffective against its DNA."
+ to_chat(src, "Our sting appears ineffective against its DNA.")
return 0
add_attack_logs(src,T,"Transformation sting (changeling)")
T.visible_message("[T] transforms!")
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index 24c2ed5f52..986800ef9f 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -116,6 +116,12 @@
return
/obj/effect/gateway/Crossed(AM as mob|obj)
+ //VOREStation Edit begin: SHADEKIN
+ var/mob/SK = AM
+ if(istype(SK))
+ if(SK.shadekin_phasing_check())
+ return
+ //VOREStation Edit end: SHADEKIN
spawn(0)
return
return
@@ -148,6 +154,12 @@
qdel(src)
/obj/effect/gateway/active/Crossed(var/atom/A)
+ //VOREStation Edit begin: SHADEKIN
+ var/mob/SK = A
+ if(istype(SK))
+ if(SK.shadekin_phasing_check())
+ return
+ //VOREStation Edit end: SHADEKIN
if(!istype(A, /mob/living))
return
diff --git a/code/game/gamemodes/cult/cultify/mob.dm b/code/game/gamemodes/cult/cultify/mob.dm
index d78956c40a..0cadd06d6c 100644
--- a/code/game/gamemodes/cult/cultify/mob.dm
+++ b/code/game/gamemodes/cult/cultify/mob.dm
@@ -12,7 +12,7 @@
icon_state = "ghost-narsie"
overlays = 0
invisibility = 0
- src << "Even as a non-corporal being, you can feel Nar-Sie's presence altering you. You are now visible to everyone."
+ to_chat(src, "Even as a non-corporal being, you can feel Nar-Sie's presence altering you. You are now visible to everyone.")
/mob/living/cultify()
if(iscultist(src) && client)
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 4380331b50..1ac4779414 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -273,7 +273,7 @@
if(explode)
explosion(src.loc, devastation_range = 0, heavy_impact_range = 0, light_impact_range = 4, flash_range = 6, adminlog = 0)
new /obj/effect/decal/cleanable/greenglow(get_turf(src))
- radiation_repository.radiate(src, 50)
+ SSradiation.radiate(src, 50)
// This meteor fries toasters.
/obj/effect/meteor/emp
diff --git a/code/game/gamemodes/technomancer/instability.dm b/code/game/gamemodes/technomancer/instability.dm
index 7904b5cb6c..6dc3f2d52b 100644
--- a/code/game/gamemodes/technomancer/instability.dm
+++ b/code/game/gamemodes/technomancer/instability.dm
@@ -122,13 +122,13 @@
electrocute_act(instability * 0.3, "unstable energies", 0.75)
if(1)
adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability
- src << "Your chassis alerts you to overheating from an unknown external force!"
+ to_chat(src, "Your chassis alerts you to overheating from an unknown external force!")
if(2)
adjustBruteLoss(instability * 0.15) //7.5 brute @ 50 instability
- src << "Your chassis makes the sound of metal groaning!"
+ to_chat(src, "Your chassis makes the sound of metal groaning!")
if(3)
safe_blink(src, range = 6)
- src << "You're teleported against your will!"
+ to_chat(src, "You're teleported against your will!")
if(4)
emp_act(3)
@@ -141,10 +141,10 @@
emp_act(2)
if(2)
adjustFireLoss(instability * 0.3) //30 burn @ 100 instability
- src << "Your chassis alerts you to extreme overheating from an unknown external force!"
+ to_chat(src, "Your chassis alerts you to extreme overheating from an unknown external force!")
if(3)
adjustBruteLoss(instability * 0.3) //30 brute @ 100 instability
- src << "Your chassis makes the sound of metal groaning and tearing!"
+ to_chat(src, "Your chassis makes the sound of metal groaning and tearing!")
if(101 to 200) //Lethal
rng = rand(0,4)
@@ -155,10 +155,10 @@
emp_act(1)
if(2)
adjustFireLoss(instability * 0.4) //40 burn @ 100 instability
- src << "Your chassis alerts you to extreme overheating from an unknown external force!"
+ to_chat(src, "Your chassis alerts you to extreme overheating from an unknown external force!")
if(3)
adjustBruteLoss(instability * 0.4) //40 brute @ 100 instability
- src << "Your chassis makes the sound of metal groaning and tearing!"
+ to_chat(src, "Your chassis makes the sound of metal groaning and tearing!")
/mob/living/carbon/human/instability_effects()
if(instability)
@@ -190,23 +190,23 @@
if(2)
if(can_feel_pain())
apply_effect(instability * 0.3, AGONY)
- src << "You feel a sharp pain!"
+ to_chat(src, "You feel a sharp pain!")
if(3)
apply_effect(instability * 0.3, EYE_BLUR)
- src << "Your eyes start to get cloudy!"
+ to_chat(src, "Your eyes start to get cloudy!")
if(4)
electrocute_act(instability * 0.3, "unstable energies")
if(5)
adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability
- src << "You feel your skin burn!"
+ to_chat(src, "You feel your skin burn!")
if(6)
adjustBruteLoss(instability * 0.15) //7.5 brute @ 50 instability
- src << "You feel a sharp pain as an unseen force harms your body!"
+ to_chat(src, "You feel a sharp pain as an unseen force harms your body!")
if(7)
adjustToxLoss(instability * 0.15) //7.5 tox @ 50 instability
if(8)
safe_blink(src, range = 6)
- src << "You're teleported against your will!"
+ to_chat(src, "You're teleported against your will!")
if(50 to 100) //Severe
rng = rand(0,8)
@@ -218,18 +218,18 @@
if(2)
if(can_feel_pain())
apply_effect(instability * 0.7, AGONY)
- src << "You feel an extremly angonizing pain from all over your body!"
+ to_chat(src, "You feel an extremly angonizing pain from all over your body!")
if(3)
apply_effect(instability * 0.5, EYE_BLUR)
- src << "Your eyes start to get cloudy!"
+ to_chat(src, "Your eyes start to get cloudy!")
if(4)
electrocute_act(instability * 0.5, "extremely unstable energies")
if(5)
fire_act()
- src << "You spontaneously combust!"
+ to_chat(src, "You spontaneously combust!")
if(6)
adjustCloneLoss(instability * 0.05) //5 cloneloss @ 100 instability
- src << "You feel your body slowly degenerate."
+ to_chat(src, "You feel your body slowly degenerate.")
if(7)
adjustToxLoss(instability * 0.25) //25 tox @ 100 instability
@@ -245,18 +245,18 @@
if(2)
if(can_feel_pain())
apply_effect(instability, AGONY)
- src << "You feel an extremly angonizing pain from all over your body!"
+ to_chat(src, "You feel an extremly angonizing pain from all over your body!")
if(3)
apply_effect(instability, EYE_BLUR)
- src << "Your eyes start to get cloudy!"
+ to_chat(src, "Your eyes start to get cloudy!")
if(4)
electrocute_act(instability, "extremely unstable energies")
if(5)
fire_act()
- src << "You spontaneously combust!"
+ to_chat(src, "You spontaneously combust!")
if(6)
adjustCloneLoss(instability * 0.10) //5 cloneloss @ 100 instability
- src << "You feel your body slowly degenerate."
+ to_chat(src, "You feel your body slowly degenerate.")
if(7)
adjustToxLoss(instability * 0.40) //40 tox @ 100 instability
diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm
index 681d29da50..adfeda58ab 100644
--- a/code/game/gamemodes/technomancer/spell_objs.dm
+++ b/code/game/gamemodes/technomancer/spell_objs.dm
@@ -292,7 +292,7 @@
if(l_spell.aspect == ASPECT_CHROMATIC) //Check the other hand too.
l_spell.on_combine_cast(S, src)
else //Welp
- src << "You require a free hand to use this function."
+ to_chat(src, "You require a free hand to use this function.")
return 0
if(S.run_checks())
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index 8d52204d5e..397ba71882 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -83,8 +83,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
minimal_player_age = 5
economic_modifier = 7
- access = list(access_heads, access_keycard_auth)
- minimal_access = list(access_heads, access_keycard_auth)
+ access = list(access_heads, access_keycard_auth, access_RC_announce) //YAWN EDIT
+ minimal_access = list(access_heads, access_keycard_auth, access_RC_announce)//YAWN EDIT
outfit_type = /decl/hierarchy/outfit/job/secretary
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index d669d63580..8ceacde5b6 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -15,11 +15,11 @@
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
access_tox_storage, access_teleporter, access_sec_doors,
access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage,
- access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_network)
+ access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_network, access_maint_tunnels) //Yawn added "access_maint_tunnels"
minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
access_tox_storage, access_teleporter, access_sec_doors,
access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage,
- access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_network)
+ access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_network, access_maint_tunnels)
alt_titles = list("Research Supervisor")
minimum_character_age = 25
diff --git a/code/game/jobs/job/science_vr.dm b/code/game/jobs/job/science_vr.dm
index 408101842d..284dd1e856 100644
--- a/code/game/jobs/job/science_vr.dm
+++ b/code/game/jobs/job/science_vr.dm
@@ -4,11 +4,11 @@
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
access_tox_storage, access_teleporter, access_sec_doors,
access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage,
- access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network)
+ access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network, access_maint_tunnels) //Yawn added "access_maint_tunnels"
minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
access_tox_storage, access_teleporter, access_sec_doors,
access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage,
- access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network)
+ access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network, access_maint_tunnels)
/datum/job/scientist
alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher", "Circuit Designer")
\ No newline at end of file
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index e454c93b18..b5d42ba2f6 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -389,11 +389,9 @@ var/global/datum/controller/occupations/job_master
H << "Your current species, job or whitelist status does not permit you to spawn with [thing]!"
continue
- if(G.exploitable)
- H.amend_exploitable(G.path)
-
if(G.slot == "implant")
var/obj/item/weapon/implant/I = G.spawn_item(H)
+ I.invisibility = 100
I.implant_loadout(H)
continue
diff --git a/code/game/machinery/autolathe_vr.dm b/code/game/machinery/autolathe_vr.dm
deleted file mode 100644
index 489c97f2f5..0000000000
--- a/code/game/machinery/autolathe_vr.dm
+++ /dev/null
@@ -1,17 +0,0 @@
-/datum/category_item/autolathe/arms/classic_smg_9mm
- name = "SMG magazine (9mm)"
- path = /obj/item/ammo_magazine/m9mml
- hidden = 1
-/* De-coded?
-/datum/category_item/autolathe/arms/classic_smg_9mmr
- name = "SMG magazine (9mm rubber)"
- path = /obj/item/ammo_magazine/m9mml/rubber
-
-/datum/category_item/autolathe/arms/classic_smg_9mmp
- name = "SMG magazine (9mm practice)"
- path = /obj/item/ammo_magazine/m9mml/practice
-
-/datum/category_item/autolathe/arms/classic_smg_9mmf
- name = "SMG magazine (9mm flash)"
- path = /obj/item/ammo_magazine/m9mml/flash
-*/
\ No newline at end of file
diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm
index f60fcabbfa..19c790b06b 100644
--- a/code/game/machinery/bioprinter.dm
+++ b/code/game/machinery/bioprinter.dm
@@ -21,6 +21,10 @@
var/loaded_dna //Blood sample for DNA hashing.
var/malfunctioning = FALSE // May cause rejection, or the printing of some alien limb instead!
+ var/complex_organs = FALSE // Can it print more 'complex' organs?
+
+ var/anomalous_organs = FALSE // Can it print anomalous organs?
+
// These should be subtypes of /obj/item/organ
// Costs roughly 20u Phoron (1 sheet) per internal organ, limbs are 60u for limb and extremity
var/list/products = list(
@@ -29,6 +33,7 @@
"Kidneys" = list(/obj/item/organ/internal/kidneys,20),
"Eyes" = list(/obj/item/organ/internal/eyes, 20),
"Liver" = list(/obj/item/organ/internal/liver, 20),
+ "Spleen" = list(/obj/item/organ/internal/spleen, 20),
"Arm, Left" = list(/obj/item/organ/external/arm, 40),
"Arm, Right" = list(/obj/item/organ/external/arm/right, 40),
"Leg, Left" = list(/obj/item/organ/external/leg, 40),
@@ -39,6 +44,18 @@
"Hand, Right" = list(/obj/item/organ/external/hand/right, 20)
)
+ var/list/complex_products = list(
+ "Brain" = list(/obj/item/organ/internal/brain, 60),
+ "Larynx" = list(/obj/item/organ/internal/voicebox, 20),
+ "Head" = list(/obj/item/organ/external/head, 40)
+ )
+
+ var/list/anomalous_products = list(
+ "Lymphatic Complex" = list(/obj/item/organ/internal/immunehub, 120),
+ "Respiration Nexus" = list(/obj/item/organ/internal/lungs/replicant/mending, 80),
+ "Adrenal Valve Cluster" = list(/obj/item/organ/internal/heart/replicant/rage, 80)
+ )
+
/obj/machinery/organ_printer/attackby(var/obj/item/O, var/mob/user)
if(default_deconstruction_screwdriver(user, O))
updateUsrDialog()
@@ -90,6 +107,17 @@
else
malfunctioning = initial(malfunctioning)
+ if(manip_rating >= 3)
+ complex_organs = TRUE
+ if(manip_rating >= 4)
+ anomalous_organs = TRUE
+ if(manip_rating >= 5)
+ malfunctioning = TRUE
+ else
+ complex_organs = initial(complex_organs)
+ anomalous_organs = initial(anomalous_organs)
+ malfunctioning = initial(malfunctioning)
+
. = ..()
/obj/machinery/organ_printer/attack_hand(mob/user)
@@ -113,7 +141,17 @@
to_chat(user, "\The [src] can't operate without a reagent reservoir!")
/obj/machinery/organ_printer/proc/printing_menu(mob/user)
- var/choice = input("What would you like to print?") as null|anything in products
+ var/list/possible_list = list()
+
+ possible_list |= products
+
+ if(complex_organs)
+ possible_list |= complex_products
+
+ if(anomalous_organs)
+ possible_list |= anomalous_products
+
+ var/choice = input("What would you like to print?") as null|anything in possible_list
if(!choice || printing || (stat & (BROKEN|NOPOWER)))
return
diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm
index 4f6b7df94f..a1c954df00 100644
--- a/code/game/machinery/camera/tracking.dm
+++ b/code/game/machinery/camera/tracking.dm
@@ -47,24 +47,24 @@
loc = sanitize(loc)
if(!loc)
- src << "Must supply a location name"
+ to_chat(src, "Must supply a location name")
return
if(stored_locations.len >= max_locations)
- src << "Cannot store additional locations. Remove one first"
+ to_chat(src, "Cannot store additional locations. Remove one first")
return
if(loc in stored_locations)
- src << "There is already a stored location by this name"
+ to_chat(src, "There is already a stored location by this name")
return
var/L = src.eyeobj.getLoc()
if (InvalidPlayerTurf(get_turf(L)))
- src << "Unable to store this location"
+ to_chat(src, "Unable to store this location")
return
stored_locations[loc] = L
- src << "Location '[loc]' stored"
+ to_chat(src, "Location '[loc]' stored")
/mob/living/silicon/ai/proc/sorted_stored_locations()
return sortList(stored_locations)
@@ -75,7 +75,7 @@
set desc = "Returns to the selected camera location"
if (!(loc in stored_locations))
- src << "Location [loc] not found"
+ to_chat(src, "Location [loc] not found")
return
var/L = stored_locations[loc]
@@ -87,11 +87,11 @@
set desc = "Deletes the selected camera location"
if (!(loc in stored_locations))
- src << "Location [loc] not found"
+ to_chat(src, "Location [loc] not found")
return
stored_locations.Remove(loc)
- src << "Location [loc] removed"
+ to_chat(src, "Location [loc] removed")
// Used to allow the AI is write in mob names/camera name from the CMD line.
/datum/trackable
@@ -134,7 +134,7 @@
set desc = "Select who you would like to track."
if(src.stat == 2)
- src << "You can't follow [target_name] with cameras because you are dead!"
+ to_chat(src, "You can't follow [target_name] with cameras because you are dead!")
return
if(!target_name)
src.cameraFollow = null
@@ -147,7 +147,7 @@
if(!cameraFollow)
return
- src << "Follow camera mode [forced ? "terminated" : "ended"]."
+ to_chat(src, "Follow camera mode [forced ? "terminated" : "ended"].")
cameraFollow.tracking_cancelled()
cameraFollow = null
@@ -266,14 +266,14 @@ mob/living/proc/tracking_initiated()
mob/living/silicon/robot/tracking_initiated()
tracking_entities++
if(tracking_entities == 1 && has_zeroth_law())
- src << "Internal camera is currently being accessed."
+ to_chat(src, "Internal camera is currently being accessed.")
mob/living/proc/tracking_cancelled()
mob/living/silicon/robot/tracking_initiated()
tracking_entities--
if(!tracking_entities && has_zeroth_law())
- src << "Internal camera is no longer being accessed."
+ to_chat(src, "Internal camera is no longer being accessed.")
#undef TRACKING_POSSIBLE
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 8e3cb117f9..52a31d5afe 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -113,6 +113,8 @@
if(!R.dna.real_name) //to prevent null names
R.dna.real_name = "clone ([rand(0,999)])"
H.real_name = R.dna.real_name
+ H.gender = R.gender
+ H.descriptors = R.body_descriptors
//Get the clone body ready
H.adjustCloneLoss(150) // New damage var so you can't eject a clone early then stab them to abuse the current damage system --NeoFite
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 96e6f6b5f9..5178d77d82 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -335,6 +335,8 @@
R.name = R.dna.real_name
R.types = DNA2_BUF_UI|DNA2_BUF_UE|DNA2_BUF_SE
R.languages = subject.languages
+ R.gender = subject.gender
+ R.body_descriptors = subject.descriptors
if(!brain_skip) //Brains don't have flavor text.
R.flavor = subject.flavor_texts.Copy()
else
diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm
index a1fd7199b2..d4c490c2a9 100644
--- a/code/game/machinery/computer/guestpass.dm
+++ b/code/game/machinery/computer/guestpass.dm
@@ -52,6 +52,7 @@
icon_state = "guest_invalid"
expiration_time = world.time
expired = 1
+ return
return ..()
/obj/item/weapon/card/id/guest/Initialize()
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index c31c8f650b..480effcf98 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -387,7 +387,7 @@
/obj/machinery/door/airlock/uranium/process()
if(world.time > last_event+20)
if(prob(50))
- radiation_repository.radiate(src, rad_power)
+ SSradiation.radiate(src, rad_power)
last_event = world.time
..()
diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm
index 615309d31c..b2a9941afa 100644
--- a/code/game/machinery/doors/blast_door.dm
+++ b/code/game/machinery/doors/blast_door.dm
@@ -56,7 +56,7 @@
icon_state = icon_state_closed
else
icon_state = icon_state_open
- radiation_repository.resistance_cache.Remove(get_turf(src))
+ SSradiation.resistance_cache.Remove(get_turf(src))
return
// Has to be in here, comment at the top is older than the emag_act code on doors proper
diff --git a/code/game/machinery/doors/blast_door_yw.dm b/code/game/machinery/doors/blast_door_yw.dm
index 115df425be..791355e98e 100644
--- a/code/game/machinery/doors/blast_door_yw.dm
+++ b/code/game/machinery/doors/blast_door_yw.dm
@@ -10,6 +10,7 @@
icon_state = "pdoor1"
maxhealth = 600
rad_resistance = 100
+ id = "EngineShroud"
/obj/machinery/door/blast/radproof/open
icon_state = "pdoor0"
@@ -24,3 +25,8 @@
/obj/machinery/door/blast/radproof/force_close()
src.rad_resistance = 100
..()
+
+/obj/machinery/button/remote/blast_door/radproof
+ name = "Reactor Shroud Control"
+ desc = "It the reactor shroud remotely."
+ id = "EngineShroud"
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index c55a7d8345..43fb8340ef 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -382,7 +382,7 @@
icon_state = "door1"
else
icon_state = "door0"
- radiation_repository.resistance_cache.Remove(get_turf(src))
+ SSradiation.resistance_cache.Remove(get_turf(src))
return
diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm
index 0baa68cf22..41c7a33a19 100644
--- a/code/game/machinery/frame.dm
+++ b/code/game/machinery/frame.dm
@@ -105,7 +105,6 @@
/datum/frame/frame_types/reagent_distillery
name = "Distillery"
frame_class = FRAME_CLASS_MACHINE
- circuit = /obj/item/weapon/circuitboard/distiller
frame_size = 4
/datum/frame/frame_types/display
@@ -192,13 +191,13 @@
//////////////////////////////
/obj/structure/frame
- anchored = 0
+ anchored = FALSE
name = "frame"
icon = 'icons/obj/stock_parts.dmi'
icon_state = "machine_0"
var/state = FRAME_PLACED
var/obj/item/weapon/circuitboard/circuit = null
- var/need_circuit = 1
+ var/need_circuit = TRUE
var/datum/frame/frame_types/frame_type = new /datum/frame/frame_types/machine
var/list/components = null
@@ -207,8 +206,8 @@
/obj/structure/frame/computer //used for maps
frame_type = new /datum/frame/frame_types/computer
- anchored = 1
- density = 1
+ anchored = TRUE
+ density = TRUE
/obj/structure/frame/examine(mob/user)
..()
@@ -260,14 +259,14 @@
pixel_y = (dir & 3)? (dir == NORTH ? -frame_type.y_offset : frame_type.y_offset) : 0
if(frame_type.circuit)
- need_circuit = 0
+ need_circuit = FALSE
circuit = new frame_type.circuit(src)
if(frame_type.name == "Computer")
- density = 1
+ density = TRUE
if(frame_type.frame_class == FRAME_CLASS_MACHINE)
- density = 1
+ density = TRUE
update_icon()
@@ -277,7 +276,7 @@
to_chat(user, "You start to wrench the frame into place.")
playsound(src.loc, P.usesound, 50, 1)
if(do_after(user, 20 * P.toolspeed))
- anchored = 1
+ anchored = TRUE
if(!need_circuit && circuit)
state = FRAME_FASTENED
check_components()
@@ -290,7 +289,7 @@
playsound(src, P.usesound, 50, 1)
if(do_after(user, 20 * P.toolspeed))
to_chat(user, "You unfasten the frame.")
- anchored = 0
+ anchored = FALSE
else if(istype(P, /obj/item/weapon/weldingtool))
if(state == FRAME_PLACED)
@@ -587,11 +586,11 @@
set src in oview(1)
if(usr.incapacitated())
- return 0
+ return FALSE
if(anchored)
to_chat(usr, "It is fastened to the floor therefore you can't rotate it!")
- return 0
+ return FALSE
src.set_dir(turn(src.dir, 90))
@@ -606,11 +605,11 @@
set src in oview(1)
if(usr.incapacitated())
- return 0
+ return FALSE
if(anchored)
to_chat(usr, "It is fastened to the floor therefore you can't rotate it!")
- return 0
+ return FALSE
src.set_dir(turn(src.dir, 270))
diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm
index 74cc399beb..7665fd0e83 100644
--- a/code/game/machinery/oxygen_pump.dm
+++ b/code/game/machinery/oxygen_pump.dm
@@ -4,7 +4,7 @@
/obj/machinery/oxygen_pump
name = "emergency oxygen pump"
icon = 'icons/obj/walllocker.dmi'
- desc = "A wall mounted oxygen pump with a retractable face mask that you can pull over your face in case of emergencies."
+ desc = "A wall mounted oxygen pump with a retractable mask that you can pull over your face in case of emergencies."
icon_state = "oxygen_tank"
anchored = TRUE
@@ -236,3 +236,76 @@
icon_state_closed = "anesthetic_tank"
icon_state_open = "anesthetic_tank_open"
mask_type = /obj/item/clothing/mask/breath/anesthetic
+
+/obj/machinery/oxygen_pump/mobile
+ name = "portable oxygen pump"
+ icon = 'icons/obj/atmos.dmi'
+ desc = "A portable oxygen pump with a retractable mask that you can pull over your face in case of emergencies."
+ icon_state = "medpump"
+ icon_state_open = "medpump_open"
+ icon_state_closed = "medpump"
+
+ anchored = FALSE
+ density = TRUE
+
+ mask_type = /obj/item/clothing/mask/gas/clear
+
+ var/last_area = null
+
+/obj/machinery/oxygen_pump/mobile/process()
+ ..()
+
+ var/turf/T = get_turf(src)
+
+ if(!last_area && T)
+ last_area = T.loc
+
+ if(last_area != T.loc)
+ power_change()
+ last_area = T.loc
+
+/obj/machinery/oxygen_pump/mobile/anesthetic
+ name = "portable anesthetic pump"
+ spawn_type = /obj/item/weapon/tank/anesthetic
+ icon_state = "medpump_n2o"
+ icon_state_closed = "medpump_n2o"
+ icon_state_open = "medpump_n2o_open"
+ mask_type = /obj/item/clothing/mask/breath/anesthetic
+
+/obj/machinery/oxygen_pump/mobile/stabilizer
+ name = "portable patient stabilizer"
+ desc = "A portable oxygen pump with a retractable mask used for stabilizing patients in the field."
+
+/obj/machinery/oxygen_pump/mobile/stabilizer/process()
+ if(breather)
+ if(!can_apply_to_target(breather))
+ if(tank)
+ tank.forceMove(src)
+ breather.remove_from_mob(contained)
+ contained.forceMove(src)
+ src.visible_message("\The [contained] rapidly retracts back into \the [src]!")
+ breather = null
+ use_power = 1
+ else if(!breather.internal && tank)
+ breather.internal = tank
+ if(breather.internals)
+ breather.internals.icon_state = "internal0"
+
+ if(breather) // Safety.
+ if(ishuman(breather))
+ var/mob/living/carbon/human/H = breather
+
+ if(H.stat == DEAD)
+ H.add_modifier(/datum/modifier/bloodpump_corpse, 6 SECONDS)
+
+ else
+ H.add_modifier(/datum/modifier/bloodpump, 6 SECONDS)
+
+ var/turf/T = get_turf(src)
+
+ if(!last_area && T)
+ last_area = T.loc
+
+ if(last_area != T.loc)
+ power_change()
+ last_area = T.loc
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 5a4c58b74a..a8c9492e23 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -931,9 +931,10 @@
/obj/machinery/suit_cycler/proc/finished_job()
var/turf/T = get_turf(src)
- T.visible_message("\icon[src]The [src] pings loudly.")
+ T.visible_message("\icon[src]The [src] beeps several times.")
icon_state = initial(icon_state)
active = 0
+ playsound(src, 'sound/machines/boobeebeep.ogg', 50)
updateUsrDialog()
/obj/machinery/suit_cycler/proc/repair_suit()
diff --git a/code/game/machinery/syndicatebeacon_vr.dm b/code/game/machinery/syndicatebeacon_vr.dm
new file mode 100644
index 0000000000..ef6b3da0bb
--- /dev/null
+++ b/code/game/machinery/syndicatebeacon_vr.dm
@@ -0,0 +1,40 @@
+// Virgo modified syndie beacon, does not give objectives
+
+/obj/machinery/syndicate_beacon/virgo/attack_hand(var/mob/user as mob)
+ usr.set_machine(src)
+ var/dat = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]...
Identity confirmed,
"
+ if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai))
+ if(is_special_character(user))
+ dat += "Operative record found. Greetings, Agent [user.name].
"
+ else if(charges < 1)
+ dat += "Connection severed.
"
+ else
+ var/honorific = "Mr."
+ if(user.gender == FEMALE)
+ honorific = "Ms."
+ dat += "Identity not found in operative database. What can the Black Market do for you today, [honorific] [user.name]?
"
+ if(!selfdestructing)
+ dat += "
\"[pick("Send me some supplies!", "Transfer supplies.")]\"
"
+ dat += temptext
+ user << browse(dat, "window=syndbeacon")
+ onclose(user, "syndbeacon")
+
+/obj/machinery/syndicate_beacon/virgo/Topic(href, href_list)
+ if(href_list["betraitor"])
+ if(charges < 1)
+ updateUsrDialog()
+ return
+ var/mob/M = locate(href_list["traitormob"])
+ if(M.mind.special_role || jobban_isbanned(M, "Syndicate"))
+ temptext = "We have no need for you at this time. Have a pleasant day.
"
+ updateUsrDialog()
+ return
+ charges -= 1
+ if(istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/N = M
+ to_chat(N, "Access granted, here are the supplies!")
+ traitors.equip(N)
+ message_admins("[N]/([N.ckey]) has recieved an uplink and telecrystals from the syndicate beacon.")
+
+ updateUsrDialog()
+ return
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 0fe0a98f27..9e921993ee 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -772,6 +772,7 @@
name = "Robust Softdrinks"
desc = "A softdrink vendor provided by Robust Industries, LLC."
icon_state = "Cola_Machine" //VOREStation Edit
+ icon_vend = "Cola_Machine-purchase" //VOREStation Edit
product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!"
product_ads = "Refreshing!;Hope you're thirsty!;Over 1 million drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space."
products = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola = 10,/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind = 10,
diff --git a/code/game/machinery/vending_vr.dm b/code/game/machinery/vending_vr.dm
index 0bf7b94714..e165d88cbd 100644
--- a/code/game/machinery/vending_vr.dm
+++ b/code/game/machinery/vending_vr.dm
@@ -145,4 +145,1104 @@
/obj/item/weapon/reagent_containers/blood/empty = 5)
contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/stoxin = 2)
req_log_access = access_cmo
- has_logs = 1
\ No newline at end of file
+ has_logs = 1
+
+/obj/machinery/vending/loadout
+ name = "Fingers and Toes"
+ desc = "A special vendor for gloves and shoes!"
+ product_ads = "Do you have fingers and toes? COVER THEM UP!;Show me your toes! Wait. NO DON'T! BUY NEW SHOES!;Don't leave prints, BUY SOME GLOVES!;Remember to check your shoes for micros! You don't have to let them out, but just check for them!;Fingers and Toes is not liable for micro entrapment or abuse under the feet of our patrons.!;This little piggy went WE WE WE all the way down to FINGERS AND TOES to pick up some sweet new gloves and shoes."
+ icon_state = "glovesnshoes"
+ products = list(/obj/item/clothing/gloves/evening = 5,
+ /obj/item/clothing/gloves/fingerless = 5,
+ /obj/item/clothing/gloves/black = 5,
+ /obj/item/clothing/gloves/blue = 5,
+ /obj/item/clothing/gloves/brown = 5,
+ /obj/item/clothing/gloves/color = 5,
+ /obj/item/clothing/gloves/green = 5,
+ /obj/item/clothing/gloves/grey = 5,
+ /obj/item/clothing/gloves/sterile/latex = 5,
+ /obj/item/clothing/gloves/light_brown = 5,
+ /obj/item/clothing/gloves/sterile/nitrile = 5,
+ /obj/item/clothing/gloves/orange = 5,
+ /obj/item/clothing/gloves/purple = 5,
+ /obj/item/clothing/gloves/red = 5,
+ /obj/item/clothing/gloves/fluff/siren = 5,
+ /obj/item/clothing/gloves/white = 5,
+ /obj/item/clothing/gloves/duty = 5,
+ /obj/item/clothing/shoes/athletic = 5,
+ /obj/item/clothing/shoes/boots/fluff/siren = 5,
+ /obj/item/clothing/shoes/slippers = 5,
+ /obj/item/clothing/shoes/boots/cowboy/classic = 5,
+ /obj/item/clothing/shoes/boots/cowboy = 5,
+ /obj/item/clothing/shoes/boots/duty = 5,
+ /obj/item/clothing/shoes/flats/white/color = 5,
+ /obj/item/clothing/shoes/flipflop = 5,
+ /obj/item/clothing/shoes/heels = 5,
+ /obj/item/clothing/shoes/hitops/black = 5,
+ /obj/item/clothing/shoes/hitops/blue = 5,
+ /obj/item/clothing/shoes/hitops/green = 5,
+ /obj/item/clothing/shoes/hitops/orange = 5,
+ /obj/item/clothing/shoes/hitops/purple = 5,
+ /obj/item/clothing/shoes/hitops/red = 5,
+ /obj/item/clothing/shoes/flats/white/color = 5,
+ /obj/item/clothing/shoes/hitops/yellow = 5,
+ /obj/item/clothing/shoes/boots/jackboots = 5,
+ /obj/item/clothing/shoes/boots/jungle = 5,
+ /obj/item/clothing/shoes/black/cuffs = 5,
+ /obj/item/clothing/shoes/black/cuffs/blue = 5,
+ /obj/item/clothing/shoes/black/cuffs/red = 5,
+ /obj/item/clothing/shoes/sandal = 5,
+ /obj/item/clothing/shoes/black = 5,
+ /obj/item/clothing/shoes/blue = 5,
+ /obj/item/clothing/shoes/brown = 5,
+ /obj/item/clothing/shoes/laceup = 5,
+ /obj/item/clothing/shoes/green = 5,
+ /obj/item/clothing/shoes/leather = 5,
+ /obj/item/clothing/shoes/orange = 5,
+ /obj/item/clothing/shoes/purple = 5,
+ /obj/item/clothing/shoes/red = 5,
+ /obj/item/clothing/shoes/white = 5,
+ /obj/item/clothing/shoes/yellow = 5,
+ /obj/item/clothing/shoes/skater = 5,
+ /obj/item/clothing/shoes/boots/cowboy/snakeskin = 5,
+ /obj/item/clothing/shoes/boots/jackboots/toeless = 5,
+ /obj/item/clothing/shoes/boots/workboots/toeless = 5,
+ /obj/item/clothing/shoes/boots/winter = 5,
+ /obj/item/clothing/shoes/boots/workboots = 5,
+ /obj/item/clothing/shoes/footwraps = 5)
+ prices = list(/obj/item/clothing/gloves/evening = 200,
+ /obj/item/clothing/gloves/fingerless = 200,
+ /obj/item/clothing/gloves/black = 200,
+ /obj/item/clothing/gloves/blue = 200,
+ /obj/item/clothing/gloves/brown = 200,
+ /obj/item/clothing/gloves/color = 200,
+ /obj/item/clothing/gloves/green = 200,
+ /obj/item/clothing/gloves/grey = 200,
+ /obj/item/clothing/gloves/sterile/latex = 200,
+ /obj/item/clothing/gloves/light_brown = 200,
+ /obj/item/clothing/gloves/sterile/nitrile = 200,
+ /obj/item/clothing/gloves/orange = 200,
+ /obj/item/clothing/gloves/purple = 200,
+ /obj/item/clothing/gloves/red = 200,
+ /obj/item/clothing/gloves/fluff/siren = 200,
+ /obj/item/clothing/gloves/white = 200,
+ /obj/item/clothing/gloves/duty = 200,
+ /obj/item/clothing/shoes/athletic = 100,
+ /obj/item/clothing/shoes/boots/fluff/siren = 100,
+ /obj/item/clothing/shoes/slippers = 100,
+ /obj/item/clothing/shoes/boots/cowboy/classic = 100,
+ /obj/item/clothing/shoes/boots/cowboy = 100,
+ /obj/item/clothing/shoes/boots/duty = 200,
+ /obj/item/clothing/shoes/flats/white/color = 100,
+ /obj/item/clothing/shoes/flipflop = 100,
+ /obj/item/clothing/shoes/heels = 100,
+ /obj/item/clothing/shoes/hitops/black = 100,
+ /obj/item/clothing/shoes/hitops/blue = 100,
+ /obj/item/clothing/shoes/hitops/green = 100,
+ /obj/item/clothing/shoes/hitops/orange = 100,
+ /obj/item/clothing/shoes/hitops/purple = 100,
+ /obj/item/clothing/shoes/hitops/red = 100,
+ /obj/item/clothing/shoes/flats/white/color = 100,
+ /obj/item/clothing/shoes/hitops/yellow = 100,
+ /obj/item/clothing/shoes/boots/jackboots = 100,
+ /obj/item/clothing/shoes/boots/jungle = 200,
+ /obj/item/clothing/shoes/black/cuffs = 100,
+ /obj/item/clothing/shoes/black/cuffs/blue = 100,
+ /obj/item/clothing/shoes/black/cuffs/red = 100,
+ /obj/item/clothing/shoes/sandal = 100,
+ /obj/item/clothing/shoes/black = 100,
+ /obj/item/clothing/shoes/blue = 100,
+ /obj/item/clothing/shoes/brown = 100,
+ /obj/item/clothing/shoes/laceup = 100,
+ /obj/item/clothing/shoes/green = 100,
+ /obj/item/clothing/shoes/leather = 100,
+ /obj/item/clothing/shoes/orange = 100,
+ /obj/item/clothing/shoes/purple = 100,
+ /obj/item/clothing/shoes/red = 100,
+ /obj/item/clothing/shoes/white = 100,
+ /obj/item/clothing/shoes/yellow = 100,
+ /obj/item/clothing/shoes/skater = 100,
+ /obj/item/clothing/shoes/boots/cowboy/snakeskin = 100,
+ /obj/item/clothing/shoes/boots/jackboots/toeless = 100,
+ /obj/item/clothing/shoes/boots/workboots/toeless = 100,
+ /obj/item/clothing/shoes/boots/winter = 100,
+ /obj/item/clothing/shoes/boots/workboots = 100,
+ /obj/item/clothing/shoes/footwraps = 100)
+ premium = list(/obj/item/clothing/gloves/rainbow = 1,
+ /obj/item/clothing/shoes/rainbow = 1,)
+ contraband = list(/obj/item/clothing/shoes/syndigaloshes = 1,
+ /obj/item/clothing/shoes/clown_shoes = 1)
+/obj/machinery/vending/loadout/uniform
+ name = "The Basics"
+ desc = "A vendor using compressed matter cartridges to store large amounts of basic station uniforms."
+ product_ads = "Don't get caught naked!;Pick up your uniform!;Using compressed matter cartridges and VERY ETHICAL labor practices, we bring you the uniforms you need!;No uniform? No problem!;We've got your covered!;The Basics is not responsible for being crushed under the amount of things inside our machines. DO NOT VEND IN EXCESS!!"
+ icon_state = "loadout"
+ icon_vend = "loadout-purchase"
+ vend_delay = 16
+ products = list(/obj/item/device/pda = 50,
+ /obj/item/device/radio/headset = 50,
+ /obj/item/weapon/storage/backpack/ = 10,
+ /obj/item/weapon/storage/backpack/messenger = 10,
+ /obj/item/weapon/storage/backpack/satchel = 10,
+ /obj/item/clothing/under/color = 5,
+ /obj/item/clothing/under/color/aqua = 5,
+ /obj/item/clothing/under/color/black = 5,
+ /obj/item/clothing/under/color/blackjumpskirt = 5,
+ /obj/item/clothing/under/color/blue = 5,
+ /obj/item/clothing/under/color/brown = 5,
+ /obj/item/clothing/under/color/green = 5,
+ /obj/item/clothing/under/color/grey = 5,
+ /obj/item/clothing/under/color/orange = 5,
+ /obj/item/clothing/under/color/pink = 5,
+ /obj/item/clothing/under/color/red = 5,
+ /obj/item/clothing/under/color/white = 5,
+ /obj/item/clothing/under/color/yellow = 5,
+ /obj/item/clothing/shoes/black = 20,
+ /obj/item/clothing/shoes/white = 20)
+/obj/machinery/vending/loadout/accessory
+ name = "Looty Inc."
+ desc = "A special vendor for accessories."
+ product_ads = "Want shinies? We have the shinies.;Need that special something to complete your outfit? We have what you need!;Ditch that old dull dangly something you've got and pick up one of our shinies!;Bracelets, collars, scarfs rings and more! We have the fancy things you need!;Does your pet need a collar? We don't judge! Keep them in line with one of one of ours!;Top of the line materials! 'Hand crafted' goods!"
+ icon_state = "accessory"
+ icon_vend = "accessory-purchase"
+ vend_delay = 6
+ products = list(/obj/item/clothing/accessory = 5,
+ /obj/item/clothing/accessory/armband/med/color = 10,
+ /obj/item/clothing/accessory/asymmetric = 5,
+ /obj/item/clothing/accessory/asymmetric/purple = 5,
+ /obj/item/clothing/accessory/asymmetric/green = 5,
+ /obj/item/clothing/accessory/bracelet = 5,
+ /obj/item/clothing/accessory/bracelet/material = 5,
+ /obj/item/clothing/accessory/bracelet/friendship = 5,
+ /obj/item/clothing/accessory/chaps = 5,
+ /obj/item/clothing/accessory/chaps/black = 5,
+ /obj/item/weapon/storage/briefcase/clutch = 1,
+ /obj/item/clothing/accessory/collar = 5,
+ /obj/item/clothing/accessory/collar/bell = 5,
+ /obj/item/clothing/accessory/collar/spike = 5,
+ /obj/item/clothing/accessory/collar/pink = 5,
+ /obj/item/clothing/accessory/collar/holo = 5,
+ /obj/item/clothing/accessory/collar/shock = 5,
+ /obj/item/weapon/storage/belt/fannypack = 1,
+ /obj/item/weapon/storage/belt/fannypack/white = 5,
+ /obj/item/clothing/accessory/fullcape = 5,
+ /obj/item/clothing/accessory/halfcape = 5,
+ /obj/item/clothing/accessory/hawaii = 5,
+ /obj/item/clothing/accessory/hawaii/random = 5,
+ /obj/item/clothing/accessory/locket = 5,
+ /obj/item/weapon/storage/backpack/purse = 1,
+ /obj/item/clothing/accessory/sash = 5,
+ /obj/item/clothing/accessory/scarf = 5,
+ /obj/item/clothing/accessory/scarf/red = 5,
+ /obj/item/clothing/accessory/scarf/darkblue = 5,
+ /obj/item/clothing/accessory/scarf/purple = 5,
+ /obj/item/clothing/accessory/scarf/yellow = 5,
+ /obj/item/clothing/accessory/scarf/orange = 5,
+ /obj/item/clothing/accessory/scarf/lightblue = 5,
+ /obj/item/clothing/accessory/scarf/white = 5,
+ /obj/item/clothing/accessory/scarf/black = 5,
+ /obj/item/clothing/accessory/scarf/zebra = 5,
+ /obj/item/clothing/accessory/scarf/christmas = 5,
+ /obj/item/clothing/accessory/scarf/stripedred = 5,
+ /obj/item/clothing/accessory/scarf/stripedgreen = 5,
+ /obj/item/clothing/accessory/scarf/stripedblue = 5,
+ /obj/item/clothing/accessory/jacket = 5,
+ /obj/item/clothing/accessory/jacket/checkered = 5,
+ /obj/item/clothing/accessory/jacket/burgundy = 5,
+ /obj/item/clothing/accessory/jacket/navy = 5,
+ /obj/item/clothing/accessory/jacket/charcoal = 5,
+ /obj/item/clothing/accessory/vest = 5,
+ /obj/item/clothing/accessory/sweater = 5,
+ /obj/item/clothing/accessory/sweater/pink = 5,
+ /obj/item/clothing/accessory/sweater/mint = 5,
+ /obj/item/clothing/accessory/sweater/blue = 5,
+ /obj/item/clothing/accessory/sweater/heart = 5,
+ /obj/item/clothing/accessory/sweater/nt = 5,
+ /obj/item/clothing/accessory/sweater/keyhole = 5,
+ /obj/item/clothing/accessory/sweater/winterneck = 5,
+ /obj/item/clothing/accessory/sweater/uglyxmas = 5,
+ /obj/item/clothing/accessory/sweater/flowersweater = 5,
+ /obj/item/clothing/accessory/sweater/redneck = 5,
+ /obj/item/clothing/accessory/tie = 5,
+ /obj/item/clothing/accessory/tie/horrible = 5,
+ /obj/item/clothing/accessory/tie/white = 5,
+ /obj/item/clothing/accessory/tie/navy = 5,
+ /obj/item/clothing/accessory/tie/yellow = 5,
+ /obj/item/clothing/accessory/tie/darkgreen = 5,
+ /obj/item/clothing/accessory/tie/black = 5,
+ /obj/item/clothing/accessory/tie/red_long = 5,
+ /obj/item/clothing/accessory/tie/red_clip = 5,
+ /obj/item/clothing/accessory/tie/blue_long = 5,
+ /obj/item/clothing/accessory/tie/blue_clip = 5,
+ /obj/item/clothing/accessory/tie/red = 5,
+ /obj/item/clothing/accessory/wcoat = 5,
+ /obj/item/clothing/accessory/wcoat/red = 5,
+ /obj/item/clothing/accessory/wcoat/grey = 5,
+ /obj/item/clothing/accessory/wcoat/brown = 5,
+ /obj/item/clothing/accessory/wcoat/gentleman = 5,
+ /obj/item/clothing/accessory/wcoat/swvest = 5,
+ /obj/item/clothing/accessory/wcoat/swvest/blue = 5,
+ /obj/item/clothing/accessory/wcoat/swvest/red = 5,
+ /obj/item/weapon/storage/wallet = 5,
+ /obj/item/weapon/storage/wallet/poly = 5,
+ /obj/item/weapon/storage/wallet/womens = 5,
+ /obj/item/weapon/lipstick = 5,
+ /obj/item/weapon/lipstick/purple = 5,
+ /obj/item/weapon/lipstick/jade = 5,
+ /obj/item/weapon/lipstick/black = 5,
+ /obj/item/clothing/ears/earmuffs = 5,
+ /obj/item/clothing/ears/earmuffs/headphones = 5,
+ /obj/item/clothing/ears/earring/stud = 5,
+ /obj/item/clothing/ears/earring/dangle = 5,
+ /obj/item/clothing/gloves/ring/mariner = 5,
+ /obj/item/clothing/gloves/ring/engagement = 5,
+ /obj/item/clothing/gloves/ring/seal/signet = 5,
+ /obj/item/clothing/gloves/ring/seal/mason = 5,
+ /obj/item/clothing/gloves/ring/material/plastic = 5,
+ /obj/item/clothing/gloves/ring/material/steel = 5,
+ /obj/item/clothing/gloves/ring/material/gold = 5,
+ /obj/item/clothing/glasses/eyepatch = 5,
+ /obj/item/clothing/glasses/gglasses = 5,
+ /obj/item/clothing/glasses/regular/hipster = 5,
+ /obj/item/clothing/glasses/rimless = 5,
+ /obj/item/clothing/glasses/thin = 5,
+ /obj/item/clothing/glasses/monocle = 5,
+ /obj/item/clothing/glasses/goggles = 5,
+ /obj/item/clothing/glasses/fluff/spiffygogs = 5,
+ /obj/item/clothing/glasses/fakesunglasses = 5,
+ /obj/item/clothing/glasses/fakesunglasses/aviator = 5,
+ /obj/item/clothing/mask/bandana/blue = 5,
+ /obj/item/clothing/mask/bandana/gold = 5,
+ /obj/item/clothing/mask/bandana/green = 5,
+ /obj/item/clothing/mask/bandana/red = 5,
+ /obj/item/clothing/mask/surgical = 5)
+ prices = list(/obj/item/clothing/accessory = 100,
+ /obj/item/clothing/accessory/armband/med/color = 100,
+ /obj/item/clothing/accessory/asymmetric = 100,
+ /obj/item/clothing/accessory/asymmetric/purple = 100,
+ /obj/item/clothing/accessory/asymmetric/green = 100,
+ /obj/item/clothing/accessory/bracelet = 100,
+ /obj/item/clothing/accessory/bracelet/material = 100,
+ /obj/item/clothing/accessory/bracelet/friendship = 100,
+ /obj/item/clothing/accessory/chaps = 100,
+ /obj/item/clothing/accessory/chaps/black = 100,
+ /obj/item/weapon/storage/briefcase/clutch = 100,
+ /obj/item/clothing/accessory/collar = 100,
+ /obj/item/clothing/accessory/collar/bell = 100,
+ /obj/item/clothing/accessory/collar/spike = 100,
+ /obj/item/clothing/accessory/collar/pink = 100,
+ /obj/item/clothing/accessory/collar/holo = 100,
+ /obj/item/clothing/accessory/collar/shock = 100,
+ /obj/item/weapon/storage/belt/fannypack = 100,
+ /obj/item/weapon/storage/belt/fannypack/white = 100,
+ /obj/item/clothing/accessory/fullcape = 100,
+ /obj/item/clothing/accessory/halfcape = 100,
+ /obj/item/clothing/accessory/hawaii = 100,
+ /obj/item/clothing/accessory/hawaii/random = 100,
+ /obj/item/clothing/accessory/locket = 100,
+ /obj/item/weapon/storage/backpack/purse = 100,
+ /obj/item/clothing/accessory/sash = 100,
+ /obj/item/clothing/accessory/scarf = 5,
+ /obj/item/clothing/accessory/scarf/red = 100,
+ /obj/item/clothing/accessory/scarf/darkblue = 100,
+ /obj/item/clothing/accessory/scarf/purple = 100,
+ /obj/item/clothing/accessory/scarf/yellow = 100,
+ /obj/item/clothing/accessory/scarf/orange = 100,
+ /obj/item/clothing/accessory/scarf/lightblue = 100,
+ /obj/item/clothing/accessory/scarf/white = 100,
+ /obj/item/clothing/accessory/scarf/black = 100,
+ /obj/item/clothing/accessory/scarf/zebra = 100,
+ /obj/item/clothing/accessory/scarf/christmas = 100,
+ /obj/item/clothing/accessory/scarf/stripedred = 100,
+ /obj/item/clothing/accessory/scarf/stripedgreen = 100,
+ /obj/item/clothing/accessory/scarf/stripedblue = 100,
+ /obj/item/clothing/accessory/jacket = 100,
+ /obj/item/clothing/accessory/jacket/checkered = 100,
+ /obj/item/clothing/accessory/jacket/burgundy = 100,
+ /obj/item/clothing/accessory/jacket/navy = 100,
+ /obj/item/clothing/accessory/jacket/charcoal = 100,
+ /obj/item/clothing/accessory/vest = 100,
+ /obj/item/clothing/accessory/sweater = 100,
+ /obj/item/clothing/accessory/sweater/pink = 100,
+ /obj/item/clothing/accessory/sweater/mint = 100,
+ /obj/item/clothing/accessory/sweater/blue = 100,
+ /obj/item/clothing/accessory/sweater/heart = 100,
+ /obj/item/clothing/accessory/sweater/nt = 5,
+ /obj/item/clothing/accessory/sweater/keyhole = 100,
+ /obj/item/clothing/accessory/sweater/winterneck = 100,
+ /obj/item/clothing/accessory/sweater/uglyxmas = 5,
+ /obj/item/clothing/accessory/sweater/flowersweater = 100,
+ /obj/item/clothing/accessory/sweater/redneck = 100,
+ /obj/item/clothing/accessory/tie = 100,
+ /obj/item/clothing/accessory/tie/horrible = 100,
+ /obj/item/clothing/accessory/tie/white = 100,
+ /obj/item/clothing/accessory/tie/navy = 100,
+ /obj/item/clothing/accessory/tie/yellow = 100,
+ /obj/item/clothing/accessory/tie/darkgreen = 100,
+ /obj/item/clothing/accessory/tie/black = 100,
+ /obj/item/clothing/accessory/tie/red_long = 100,
+ /obj/item/clothing/accessory/tie/red_clip = 100,
+ /obj/item/clothing/accessory/tie/blue_long = 100,
+ /obj/item/clothing/accessory/tie/blue_clip = 100,
+ /obj/item/clothing/accessory/tie/red = 100,
+ /obj/item/clothing/accessory/wcoat = 100,
+ /obj/item/clothing/accessory/wcoat/red = 100,
+ /obj/item/clothing/accessory/wcoat/grey = 100,
+ /obj/item/clothing/accessory/wcoat/brown = 100,
+ /obj/item/clothing/accessory/wcoat/gentleman = 100,
+ /obj/item/clothing/accessory/wcoat/swvest = 100,
+ /obj/item/clothing/accessory/wcoat/swvest/blue = 100,
+ /obj/item/clothing/accessory/wcoat/swvest/red = 100,
+ /obj/item/weapon/storage/wallet = 100,
+ /obj/item/weapon/storage/wallet/poly = 100,
+ /obj/item/weapon/storage/wallet/womens = 100,
+ /obj/item/weapon/lipstick = 100,
+ /obj/item/weapon/lipstick/purple = 100,
+ /obj/item/weapon/lipstick/jade = 100,
+ /obj/item/weapon/lipstick/black = 100,
+ /obj/item/clothing/ears/earmuffs = 100,
+ /obj/item/clothing/ears/earmuffs/headphones = 100,
+ /obj/item/clothing/ears/earring/stud = 100,
+ /obj/item/clothing/ears/earring/dangle = 100,
+ /obj/item/clothing/gloves/ring/mariner = 100,
+ /obj/item/clothing/gloves/ring/engagement = 100,
+ /obj/item/clothing/gloves/ring/seal/signet = 100,
+ /obj/item/clothing/gloves/ring/seal/mason = 100,
+ /obj/item/clothing/gloves/ring/material/plastic = 100,
+ /obj/item/clothing/gloves/ring/material/steel = 100,
+ /obj/item/clothing/gloves/ring/material/gold = 500,
+ /obj/item/clothing/glasses/eyepatch = 100,
+ /obj/item/clothing/glasses/gglasses = 100,
+ /obj/item/clothing/glasses/regular/hipster = 100,
+ /obj/item/clothing/glasses/rimless = 100,
+ /obj/item/clothing/glasses/thin = 100,
+ /obj/item/clothing/glasses/monocle = 100,
+ /obj/item/clothing/glasses/goggles = 100,
+ /obj/item/clothing/glasses/fluff/spiffygogs = 100,
+ /obj/item/clothing/glasses/fakesunglasses = 100,
+ /obj/item/clothing/glasses/fakesunglasses/aviator = 100,
+ /obj/item/clothing/mask/bandana/blue = 100,
+ /obj/item/clothing/mask/bandana/gold = 100,
+ /obj/item/clothing/mask/bandana/green = 100,
+ /obj/item/clothing/mask/bandana/red = 100,
+ /obj/item/clothing/mask/surgical = 200)
+ premium = list(/obj/item/weapon/bedsheet/rainbow = 1)
+ contraband = list(/obj/item/clothing/mask/gas/clown_hat = 1)
+/obj/machinery/vending/loadout/clothing
+ name = "General Jump"
+ desc = "A special vendor using compressed matter cartridges to store large amounts of clothing."
+ product_ads = "Tired of your grey jumpsuit? Spruce yourself up!;We have the outfit for you!;Don't let that grey jumpsuit get you down, get a ROBUST outfit right now!;Using compressed matter catridges and VERY ETHICAL labor practices to bring YOU the clothing you crave!;Are you sure you want to go to work in THAT?;All of our wares have a whole TWO pockets!"
+ icon_state = "clothing"
+ icon_vend = "clothing-purchase"
+ vend_delay = 16
+ products = list(/obj/item/clothing/under/bathrobe = 5,
+ /obj/item/clothing/under/dress/black_corset = 5,
+ /obj/item/clothing/under/blazer = 5,
+ /obj/item/clothing/under/blazer/skirt = 5,
+ /obj/item/clothing/under/cheongsam = 5,
+ /obj/item/clothing/under/cheongsam/red = 5,
+ /obj/item/clothing/under/cheongsam/blue = 5,
+ /obj/item/clothing/under/cheongsam/black = 5,
+ /obj/item/clothing/under/cheongsam/darkred = 5,
+ /obj/item/clothing/under/cheongsam/green = 5,
+ /obj/item/clothing/under/cheongsam/purple = 5,
+ /obj/item/clothing/under/cheongsam/darkblue = 5,
+ /obj/item/clothing/under/croptop = 5,
+ /obj/item/clothing/under/croptop/red = 5,
+ /obj/item/clothing/under/croptop/grey = 5,
+ /obj/item/clothing/under/cuttop = 5,
+ /obj/item/clothing/under/cuttop/red = 5,
+ /obj/item/clothing/under/suit_jacket/female/skirt = 5,
+ /obj/item/clothing/under/dress/dress_fire = 5,
+ /obj/item/clothing/under/dress/flamenco = 5,
+ /obj/item/clothing/under/dress/flower_dress = 5,
+ /obj/item/clothing/under/fluff/gnshorts = 5,
+ /obj/item/clothing/under/color = 5,
+ /obj/item/clothing/under/color/aqua = 5,
+ /obj/item/clothing/under/color/black = 5,
+ /obj/item/clothing/under/color/blackf = 5,
+ /obj/item/clothing/under/color/blackjumpskirt = 5,
+ /obj/item/clothing/under/color/blue = 5,
+ /obj/item/clothing/under/color/brown = 5,
+ /obj/item/clothing/under/color/darkblue = 5,
+ /obj/item/clothing/under/color/darkred = 5,
+ /obj/item/clothing/under/color/green = 5,
+ /obj/item/clothing/under/color/grey = 5,
+ /obj/item/clothing/under/color/lightblue = 5,
+ /obj/item/clothing/under/color/lightbrown = 5,
+ /obj/item/clothing/under/color/lightgreen = 5,
+ /obj/item/clothing/under/color/lightpurple = 5,
+ /obj/item/clothing/under/color/lightred = 5,
+ /obj/item/clothing/under/color/orange = 5,
+ /obj/item/clothing/under/color/pink = 5,
+ /obj/item/clothing/under/color/prison = 5,
+ /obj/item/clothing/under/color/ranger = 5,
+ /obj/item/clothing/under/color/red = 5,
+ /obj/item/clothing/under/color/white = 5,
+ /obj/item/clothing/under/color/yellow = 5,
+ /obj/item/clothing/under/color/yellowgreen = 5,
+ /obj/item/clothing/under/aether = 5,
+ /obj/item/clothing/under/focal = 5,
+ /obj/item/clothing/under/hephaestus = 5,
+ /obj/item/clothing/under/wardt = 5,
+ /obj/item/clothing/under/kilt = 5,
+ /obj/item/clothing/under/fluff/latexmaid = 5,
+ /obj/item/clothing/under/dress/lilacdress = 5,
+ /obj/item/clothing/under/dress/white2 = 5,
+ /obj/item/clothing/under/dress/white4 = 5,
+ /obj/item/clothing/under/dress/maid = 5,
+ /obj/item/clothing/under/dress/maid/sexy = 5,
+ /obj/item/clothing/under/dress/maid/janitor = 5,
+ /obj/item/clothing/under/moderncoat = 5,
+ /obj/item/clothing/under/permit = 5,
+ /obj/item/clothing/under/oldwoman = 5,
+ /obj/item/clothing/under/frontier = 5,
+ /obj/item/clothing/under/mbill = 5,
+ /obj/item/clothing/under/pants/baggy/ = 5,
+ /obj/item/clothing/under/pants/baggy/classicjeans = 5,
+ /obj/item/clothing/under/pants/baggy/mustangjeans = 5,
+ /obj/item/clothing/under/pants/baggy/blackjeans = 5,
+ /obj/item/clothing/under/pants/baggy/greyjeans = 5,
+ /obj/item/clothing/under/pants/baggy/youngfolksjeans = 5,
+ /obj/item/clothing/under/pants/baggy/white = 5,
+ /obj/item/clothing/under/pants/baggy/red = 5,
+ /obj/item/clothing/under/pants/baggy/black = 5,
+ /obj/item/clothing/under/pants/baggy/tan = 5,
+ /obj/item/clothing/under/pants/baggy/track = 5,
+ /obj/item/clothing/under/pants/baggy/khaki = 5,
+ /obj/item/clothing/under/pants/baggy/camo = 5,
+ /obj/item/clothing/under/pants/utility/ = 5,
+ /obj/item/clothing/under/pants/utility/orange = 5,
+ /obj/item/clothing/under/pants/utility/blue = 5,
+ /obj/item/clothing/under/pants/utility/white = 5,
+ /obj/item/clothing/under/pants/utility/red = 5,
+ /obj/item/clothing/under/pants/chaps = 5,
+ /obj/item/clothing/under/pants/chaps/black = 5,
+ /obj/item/clothing/under/pants/track = 5,
+ /obj/item/clothing/under/pants/track/red = 5,
+ /obj/item/clothing/under/pants/track/white = 5,
+ /obj/item/clothing/under/pants/track/green = 5,
+ /obj/item/clothing/under/pants/track/blue = 5,
+ /obj/item/clothing/under/pants/yogapants = 5,
+ /obj/item/clothing/under/ascetic = 5,
+ /obj/item/clothing/under/dress/white3 = 5,
+ /obj/item/clothing/under/skirt/pleated = 5,
+ /obj/item/clothing/under/dress/darkred = 5,
+ /obj/item/clothing/under/dress/redeveninggown = 5,
+ /obj/item/clothing/under/dress/red_swept_dress = 5,
+ /obj/item/clothing/under/dress/sailordress = 5,
+ /obj/item/clothing/under/dress/sari = 5,
+ /obj/item/clothing/under/dress/sari/green = 5,
+ /obj/item/clothing/under/shorts/red = 5,
+ /obj/item/clothing/under/shorts/green = 5,
+ /obj/item/clothing/under/shorts/blue = 5,
+ /obj/item/clothing/under/shorts/black = 5,
+ /obj/item/clothing/under/shorts/grey = 5,
+ /obj/item/clothing/under/shorts/white = 5,
+ /obj/item/clothing/under/shorts/jeans = 5,
+ /obj/item/clothing/under/shorts/jeans/ = 5,
+ /obj/item/clothing/under/shorts/jeans/classic = 5,
+ /obj/item/clothing/under/shorts/jeans/mustang = 5,
+ /obj/item/clothing/under/shorts/jeans/youngfolks = 5,
+ /obj/item/clothing/under/shorts/jeans/black = 5,
+ /obj/item/clothing/under/shorts/jeans/grey = 5,
+ /obj/item/clothing/under/shorts/khaki/ = 5,
+ /obj/item/clothing/under/skirt/loincloth = 5,
+ /obj/item/clothing/under/skirt/khaki = 5,
+ /obj/item/clothing/under/skirt/blue = 5,
+ /obj/item/clothing/under/skirt/red = 5,
+ /obj/item/clothing/under/skirt/denim = 5,
+ /obj/item/clothing/under/skirt/pleated = 5,
+ /obj/item/clothing/under/skirt/outfit/plaid_blue = 5,
+ /obj/item/clothing/under/skirt/outfit/plaid_red = 5,
+ /obj/item/clothing/under/skirt/outfit/plaid_purple = 5,
+ /obj/item/clothing/under/overalls/sleek = 5,
+ /obj/item/clothing/under/sl_suit = 5,
+ /obj/item/clothing/under/gentlesuit = 5,
+ /obj/item/clothing/under/gentlesuit/skirt = 5,
+ /obj/item/clothing/under/suit_jacket = 5,
+ /obj/item/clothing/under/suit_jacket/really_black/skirt = 5,
+ /obj/item/clothing/under/suit_jacket/really_black = 5,
+ /obj/item/clothing/under/suit_jacket/female/skirt = 5,
+ /obj/item/clothing/under/suit_jacket/female/ = 5,
+ /obj/item/clothing/under/suit_jacket/red = 5,
+ /obj/item/clothing/under/suit_jacket/red/skirt = 5,
+ /obj/item/clothing/under/suit_jacket/charcoal = 5,
+ /obj/item/clothing/under/suit_jacket/charcoal/skirt = 5,
+ /obj/item/clothing/under/suit_jacket/navy = 5,
+ /obj/item/clothing/under/suit_jacket/navy/skirt = 5,
+ /obj/item/clothing/under/suit_jacket/burgundy = 5,
+ /obj/item/clothing/under/suit_jacket/burgundy/skirt = 5,
+ /obj/item/clothing/under/suit_jacket/checkered = 5,
+ /obj/item/clothing/under/suit_jacket/checkered/skirt = 5,
+ /obj/item/clothing/under/suit_jacket/tan = 5,
+ /obj/item/clothing/under/suit_jacket/tan/skirt = 5,
+ /obj/item/clothing/under/scratch = 5,
+ /obj/item/clothing/under/scratch/skirt = 5,
+ /obj/item/clothing/under/sundress = 5,
+ /obj/item/clothing/under/sundress_white = 5,
+ /obj/item/clothing/under/rank/psych/turtleneck/sweater = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/blue = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/purple = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/green = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/red = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/white = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/earth = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/engineering = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/science = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/security = 5,
+ /obj/item/weapon/storage/box/fluff/swimsuit/medical = 5,
+ /obj/item/clothing/under/utility = 5,
+ /obj/item/clothing/under/utility/grey = 5,
+ /obj/item/clothing/under/utility/blue = 5,
+ /obj/item/clothing/under/fluff/v_nanovest = 5,
+ /obj/item/clothing/under/dress/westernbustle = 5,
+ /obj/item/clothing/under/wedding/bride_white = 5,
+ /obj/item/weapon/storage/backpack/ = 5,
+ /obj/item/weapon/storage/backpack/messenger = 5,
+ /obj/item/weapon/storage/backpack/satchel = 5)
+ prices = list(/obj/item/clothing/under/bathrobe = 100,
+ /obj/item/clothing/under/dress/black_corset = 100,
+ /obj/item/clothing/under/blazer = 100,
+ /obj/item/clothing/under/blazer/skirt = 100,
+ /obj/item/clothing/under/cheongsam = 100,
+ /obj/item/clothing/under/cheongsam/red = 100,
+ /obj/item/clothing/under/cheongsam/blue = 100,
+ /obj/item/clothing/under/cheongsam/black = 100,
+ /obj/item/clothing/under/cheongsam/darkred = 100,
+ /obj/item/clothing/under/cheongsam/green = 100,
+ /obj/item/clothing/under/cheongsam/purple = 100,
+ /obj/item/clothing/under/cheongsam/darkblue = 100,
+ /obj/item/clothing/under/croptop = 100,
+ /obj/item/clothing/under/croptop/red = 100,
+ /obj/item/clothing/under/croptop/grey = 100,
+ /obj/item/clothing/under/cuttop = 100,
+ /obj/item/clothing/under/cuttop/red = 100,
+ /obj/item/clothing/under/suit_jacket/female/skirt = 100,
+ /obj/item/clothing/under/dress/dress_fire = 100,
+ /obj/item/clothing/under/dress/flamenco = 100,
+ /obj/item/clothing/under/dress/flower_dress = 100,
+ /obj/item/clothing/under/fluff/gnshorts = 100,
+ /obj/item/clothing/under/color = 100,
+ /obj/item/clothing/under/color/aqua = 100,
+ /obj/item/clothing/under/color/black = 100,
+ /obj/item/clothing/under/color/blackf = 100,
+ /obj/item/clothing/under/color/blackjumpskirt = 100,
+ /obj/item/clothing/under/color/blue = 100,
+ /obj/item/clothing/under/color/brown = 100,
+ /obj/item/clothing/under/color/darkblue = 100,
+ /obj/item/clothing/under/color/darkred = 100,
+ /obj/item/clothing/under/color/green = 100,
+ /obj/item/clothing/under/color/grey = 100,
+ /obj/item/clothing/under/color/lightblue = 100,
+ /obj/item/clothing/under/color/lightbrown = 100,
+ /obj/item/clothing/under/color/lightgreen = 100,
+ /obj/item/clothing/under/color/lightpurple = 100,
+ /obj/item/clothing/under/color/lightred = 100,
+ /obj/item/clothing/under/color/orange = 100,
+ /obj/item/clothing/under/color/pink = 100,
+ /obj/item/clothing/under/color/prison = 100,
+ /obj/item/clothing/under/color/ranger = 100,
+ /obj/item/clothing/under/color/red = 100,
+ /obj/item/clothing/under/color/white = 100,
+ /obj/item/clothing/under/color/yellow = 100,
+ /obj/item/clothing/under/color/yellowgreen = 100,
+ /obj/item/clothing/under/aether = 100,
+ /obj/item/clothing/under/focal = 100,
+ /obj/item/clothing/under/hephaestus = 100,
+ /obj/item/clothing/under/wardt = 100,
+ /obj/item/clothing/under/kilt = 100,
+ /obj/item/clothing/under/fluff/latexmaid = 100,
+ /obj/item/clothing/under/dress/lilacdress = 100,
+ /obj/item/clothing/under/dress/white2 = 100,
+ /obj/item/clothing/under/dress/white4 = 100,
+ /obj/item/clothing/under/dress/maid = 100,
+ /obj/item/clothing/under/dress/maid/sexy = 100,
+ /obj/item/clothing/under/dress/maid/janitor = 100,
+ /obj/item/clothing/under/moderncoat = 100,
+ /obj/item/clothing/under/permit = 100,
+ /obj/item/clothing/under/oldwoman = 100,
+ /obj/item/clothing/under/frontier = 100,
+ /obj/item/clothing/under/mbill = 100,
+ /obj/item/clothing/under/pants/baggy/ = 100,
+ /obj/item/clothing/under/pants/baggy/classicjeans = 100,
+ /obj/item/clothing/under/pants/baggy/mustangjeans = 100,
+ /obj/item/clothing/under/pants/baggy/blackjeans = 100,
+ /obj/item/clothing/under/pants/baggy/greyjeans = 100,
+ /obj/item/clothing/under/pants/baggy/youngfolksjeans = 100,
+ /obj/item/clothing/under/pants/baggy/white = 100,
+ /obj/item/clothing/under/pants/baggy/red = 100,
+ /obj/item/clothing/under/pants/baggy/black = 100,
+ /obj/item/clothing/under/pants/baggy/tan = 100,
+ /obj/item/clothing/under/pants/baggy/track = 100,
+ /obj/item/clothing/under/pants/baggy/khaki = 100,
+ /obj/item/clothing/under/pants/baggy/camo = 100,
+ /obj/item/clothing/under/pants/utility/ = 100,
+ /obj/item/clothing/under/pants/utility/orange = 100,
+ /obj/item/clothing/under/pants/utility/blue = 100,
+ /obj/item/clothing/under/pants/utility/white = 100,
+ /obj/item/clothing/under/pants/utility/red = 100,
+ /obj/item/clothing/under/pants/chaps = 100,
+ /obj/item/clothing/under/pants/chaps/black = 100,
+ /obj/item/clothing/under/pants/track = 100,
+ /obj/item/clothing/under/pants/track/red = 100,
+ /obj/item/clothing/under/pants/track/white = 100,
+ /obj/item/clothing/under/pants/track/green = 100,
+ /obj/item/clothing/under/pants/track/blue = 100,
+ /obj/item/clothing/under/pants/yogapants = 100,
+ /obj/item/clothing/under/ascetic = 100,
+ /obj/item/clothing/under/dress/white3 = 100,
+ /obj/item/clothing/under/skirt/pleated = 100,
+ /obj/item/clothing/under/dress/darkred = 100,
+ /obj/item/clothing/under/dress/redeveninggown = 100,
+ /obj/item/clothing/under/dress/red_swept_dress = 100,
+ /obj/item/clothing/under/dress/sailordress = 100,
+ /obj/item/clothing/under/dress/sari = 100,
+ /obj/item/clothing/under/dress/sari/green = 100,
+ /obj/item/clothing/under/shorts/red = 100,
+ /obj/item/clothing/under/shorts/green = 100,
+ /obj/item/clothing/under/shorts/blue = 100,
+ /obj/item/clothing/under/shorts/black = 100,
+ /obj/item/clothing/under/shorts/grey = 100,
+ /obj/item/clothing/under/shorts/white = 100,
+ /obj/item/clothing/under/shorts/jeans = 100,
+ /obj/item/clothing/under/shorts/jeans/ = 100,
+ /obj/item/clothing/under/shorts/jeans/classic = 100,
+ /obj/item/clothing/under/shorts/jeans/mustang = 100,
+ /obj/item/clothing/under/shorts/jeans/youngfolks = 100,
+ /obj/item/clothing/under/shorts/jeans/black = 100,
+ /obj/item/clothing/under/shorts/jeans/grey = 100,
+ /obj/item/clothing/under/shorts/khaki/ = 100,
+ /obj/item/clothing/under/skirt/loincloth = 100,
+ /obj/item/clothing/under/skirt/khaki = 100,
+ /obj/item/clothing/under/skirt/blue = 100,
+ /obj/item/clothing/under/skirt/red = 100,
+ /obj/item/clothing/under/skirt/denim = 100,
+ /obj/item/clothing/under/skirt/pleated = 100,
+ /obj/item/clothing/under/skirt/outfit/plaid_blue = 100,
+ /obj/item/clothing/under/skirt/outfit/plaid_red = 100,
+ /obj/item/clothing/under/skirt/outfit/plaid_purple = 100,
+ /obj/item/clothing/under/overalls/sleek = 100,
+ /obj/item/clothing/under/sl_suit = 100,
+ /obj/item/clothing/under/gentlesuit = 100,
+ /obj/item/clothing/under/gentlesuit/skirt = 100,
+ /obj/item/clothing/under/suit_jacket = 100,
+ /obj/item/clothing/under/suit_jacket/really_black/skirt = 100,
+ /obj/item/clothing/under/suit_jacket/really_black = 100,
+ /obj/item/clothing/under/suit_jacket/female/skirt = 100,
+ /obj/item/clothing/under/suit_jacket/female/ = 100,
+ /obj/item/clothing/under/suit_jacket/red = 100,
+ /obj/item/clothing/under/suit_jacket/red/skirt = 100,
+ /obj/item/clothing/under/suit_jacket/charcoal = 100,
+ /obj/item/clothing/under/suit_jacket/charcoal/skirt = 100,
+ /obj/item/clothing/under/suit_jacket/navy = 100,
+ /obj/item/clothing/under/suit_jacket/navy/skirt = 100,
+ /obj/item/clothing/under/suit_jacket/burgundy = 100,
+ /obj/item/clothing/under/suit_jacket/burgundy/skirt = 100,
+ /obj/item/clothing/under/suit_jacket/checkered = 100,
+ /obj/item/clothing/under/suit_jacket/checkered/skirt = 100,
+ /obj/item/clothing/under/suit_jacket/tan = 100,
+ /obj/item/clothing/under/suit_jacket/tan/skirt = 100,
+ /obj/item/clothing/under/scratch = 100,
+ /obj/item/clothing/under/scratch/skirt = 100,
+ /obj/item/clothing/under/sundress = 100,
+ /obj/item/clothing/under/sundress_white = 100,
+ /obj/item/clothing/under/rank/psych/turtleneck/sweater = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/blue = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/purple = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/green = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/red = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/white = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/earth = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/engineering = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/science = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/security = 100,
+ /obj/item/weapon/storage/box/fluff/swimsuit/medical = 100,
+ /obj/item/clothing/under/utility = 100,
+ /obj/item/clothing/under/utility/grey = 100,
+ /obj/item/clothing/under/utility/blue = 100,
+ /obj/item/clothing/under/fluff/v_nanovest = 100,
+ /obj/item/clothing/under/dress/westernbustle = 100,
+ /obj/item/clothing/under/wedding/bride_white = 100,
+ /obj/item/weapon/storage/backpack/ = 100,
+ /obj/item/weapon/storage/backpack/messenger = 100,
+ /obj/item/weapon/storage/backpack/satchel = 100)
+ premium = list(/obj/item/clothing/under/color/rainbow = 1)
+ contraband = list(/obj/item/clothing/under/rank/clown = 1)
+/obj/machinery/vending/loadout/gadget
+ name = "Chips Co."
+ desc = "A special vendor for devices and gadgets."
+ product_ads = "You can't RESIST our great deals!;Feeling disconnected? We have a gadget for you!;You know you have the capacity to buy our capacitors!;FILL THAT HOLE IN YOUR HEART WITH OUR PLASTIC DISTRACTIONS!!!;Devices for everyone! Chips Co.!;ROBUST INVENTORY, GREAT PRICES! ;DON'T FORGET THE oyPAD 13s PRO! ON SALE NOW, ONLY ONE THOUSAND THALERS!"
+ icon_state = "gadgets"
+ icon_vend = "gadgets-purchase"
+ vend_delay = 11
+ products = list(/obj/item/clothing/suit/circuitry = 1,
+ /obj/item/clothing/head/circuitry = 1,
+ /obj/item/clothing/shoes/circuitry = 1,
+ /obj/item/clothing/gloves/circuitry = 1,
+ /obj/item/clothing/under/circuitry = 1,
+ /obj/item/clothing/glasses/circuitry = 1,
+ /obj/item/clothing/ears/circuitry = 1,
+ /obj/item/device/text_to_speech = 5,
+ /obj/item/device/paicard = 5,
+ /obj/item/device/communicator = 10,
+ /obj/item/device/communicator/watch = 10,
+ /obj/item/device/radio = 10,
+ /obj/item/device/camera = 5,
+ /obj/item/device/taperecorder = 5,
+ /obj/item/modular_computer/tablet/preset/custom_loadout/cheap = 5,
+ /obj/item/device/pda = 10,
+ /obj/item/device/radio/headset = 10,
+ /obj/item/device/flashlight = 5,
+ /obj/item/device/laser_pointer = 3,
+ /obj/item/clothing/glasses/omnihud = 10)
+ prices = list(/obj/item/clothing/suit/circuitry = 100,
+ /obj/item/clothing/head/circuitry = 100,
+ /obj/item/clothing/shoes/circuitry = 100,
+ /obj/item/clothing/gloves/circuitry = 100,
+ /obj/item/clothing/under/circuitry = 100,
+ /obj/item/clothing/glasses/circuitry = 100,
+ /obj/item/clothing/ears/circuitry = 100,
+ /obj/item/device/text_to_speech = 300,
+ /obj/item/device/paicard = 100,
+ /obj/item/device/communicator = 100,
+ /obj/item/device/communicator/watch = 100,
+ /obj/item/device/radio = 100,
+ /obj/item/device/camera = 100,
+ /obj/item/device/taperecorder = 100,
+ /obj/item/modular_computer/tablet/preset/custom_loadout/cheap = 1000,
+ /obj/item/device/pda = 50,
+ /obj/item/device/radio/headset = 50,
+ /obj/item/device/flashlight = 100,
+ /obj/item/device/laser_pointer = 200,
+ /obj/item/clothing/glasses/omnihud = 100)
+ premium = list(/obj/item/device/perfect_tele/one_beacon = 1)
+ contraband = list(/obj/item/weapon/disk/nifsoft/compliance = 1)
+/obj/machinery/vending/loadout/loadout_misc
+ name = "Bits and Bobs"
+ desc = "A special vendor for things and also stuff!"
+ product_ads = "You never know when you might need an umbrella.;Hey kid... want some cardemon cards?;Miscellaneous for your miscellaneous heart.;Who's bob? Wouldn't you like to know.;I'm sorry there's no grappling hooks in our umbrellas.;We sell things AND stuff."
+ icon_state = "loadout_misc"
+ products = list(/obj/item/weapon/cane = 5,
+ /obj/item/weapon/pack/cardemon = 25,
+ /obj/item/weapon/deck/holder = 5,
+ /obj/item/weapon/deck/cah = 5,
+ /obj/item/weapon/deck/cah/black = 5,
+ /obj/item/weapon/deck/tarot = 5,
+ /obj/item/weapon/deck/cards = 5,
+ /obj/item/weapon/pack/spaceball = 10,
+ /obj/item/weapon/storage/pill_bottle/dice = 5,
+ /obj/item/weapon/storage/pill_bottle/dice_nerd = 5,
+ /obj/item/weapon/melee/umbrella/random = 10)
+ prices = list(/obj/item/weapon/cane = 100,
+ /obj/item/weapon/pack/cardemon = 100,
+ /obj/item/weapon/deck/holder = 100,
+ /obj/item/weapon/deck/cah = 100,
+ /obj/item/weapon/deck/cah/black = 100,
+ /obj/item/weapon/deck/tarot = 100,
+ /obj/item/weapon/deck/cards = 100,
+ /obj/item/weapon/pack/spaceball = 100,
+ /obj/item/weapon/storage/pill_bottle/dice = 100,
+ /obj/item/weapon/storage/pill_bottle/dice_nerd = 100,
+ /obj/item/weapon/melee/umbrella/random = 100)
+ premium = list(/obj/item/toy/bosunwhistle = 1)
+ contraband = list(/obj/item/toy/katana = 1)
+/obj/machinery/vending/loadout/overwear
+ name = "Big D's Best"
+ desc = "A special vendor using compressed matter cartridges to store large amounts of overwear!"
+ product_ads = "Dress your best! It's what big D would want.;Overwear for all occasions!;Big D has what you need if what you need is some form of jacket!;Need a new hoodie? Bid D has you covered.;Big D says you need a new suit!;Big D smiles when he sees you in one of his coats!"
+ icon_state = "suit"
+ icon_vend = "suit-purchase"
+ vend_delay = 16
+ products = list(/obj/item/clothing/suit/storage/apron = 5,
+ /obj/item/clothing/suit/storage/flannel/aqua = 5,
+ /obj/item/clothing/suit/storage/toggle/bomber = 5,
+ /obj/item/clothing/suit/storage/bomber/alt = 5,
+ /obj/item/clothing/suit/storage/flannel/brown = 5,
+ /obj/item/clothing/suit/storage/toggle/cardigan = 5,
+ /obj/item/clothing/accessory/poncho/roles/cloak/custom = 5,
+ /obj/item/clothing/suit/storage/duster = 5,
+ /obj/item/clothing/suit/storage/toggle/denim_jacket = 5,
+ /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen = 5,
+ /obj/item/clothing/suit/storage/toggle/denim_jacket/sleeveless = 5,
+ /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen/sleeveless = 5,
+ /obj/item/clothing/suit/storage/fluff/gntop = 5,
+ /obj/item/clothing/suit/greatcoat = 5,
+ /obj/item/clothing/suit/storage/flannel = 5,
+ /obj/item/clothing/suit/storage/greyjacket = 5,
+ /obj/item/clothing/suit/storage/hazardvest = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/black = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/red = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/blue = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/green = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/orange = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/yellow = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/cti = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/mu = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/nt = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/smw = 5,
+ /obj/item/clothing/suit/storage/toggle/hoodie/nrti = 5,
+ /obj/item/clothing/suit/storage/fluff/jacket/field = 5,
+ /obj/item/clothing/suit/storage/fluff/jacket/air_cavalry = 5,
+ /obj/item/clothing/suit/storage/fluff/jacket/air_force = 5,
+ /obj/item/clothing/suit/storage/fluff/jacket/navy = 5,
+ /obj/item/clothing/suit/storage/fluff/jacket/special_forces = 5,
+ /obj/item/clothing/suit/kamishimo = 5,
+ /obj/item/clothing/suit/kimono = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/blue = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/blue_edge = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/green = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/orange = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/pink = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/red = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/yellow = 5,
+ /obj/item/clothing/suit/leathercoat = 5,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket = 5,
+ /obj/item/clothing/suit/storage/leather_jacket_alt = 5,
+ /obj/item/clothing/suit/storage/toggle/brown_jacket = 5,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen = 5,
+ /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen = 5,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket/sleeveless = 5,
+ /obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless = 5,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen/sleeveless = 5,
+ /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen/sleeveless = 5,
+ /obj/item/clothing/suit/storage/miljacket = 5,
+ /obj/item/clothing/suit/storage/miljacket/alt = 5,
+ /obj/item/clothing/suit/storage/miljacket/green = 5,
+ /obj/item/clothing/suit/storage/apron/overalls = 5,
+ /obj/item/clothing/suit/storage/toggle/peacoat = 5,
+ /obj/item/clothing/accessory/poncho = 5,
+ /obj/item/clothing/accessory/poncho/green = 5,
+ /obj/item/clothing/accessory/poncho/red = 5,
+ /obj/item/clothing/accessory/poncho/purple = 5,
+ /obj/item/clothing/accessory/poncho/blue = 5,
+ /obj/item/clothing/suit/jacket/puffer = 5,
+ /obj/item/clothing/suit/jacket/puffer/vest = 5,
+ /obj/item/clothing/suit/storage/flannel/red = 5,
+ /obj/item/clothing/suit/unathi/robe = 5,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit = 5,
+ /obj/item/clothing/suit/storage/toggle/internalaffairs = 5,
+ /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 5,
+ /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 5,
+ /obj/item/clothing/suit/suspenders = 5,
+ /obj/item/clothing/suit/storage/toggle/track = 5,
+ /obj/item/clothing/suit/storage/toggle/track/blue = 5,
+ /obj/item/clothing/suit/storage/toggle/track/green = 5,
+ /obj/item/clothing/suit/storage/toggle/track/red = 5,
+ /obj/item/clothing/suit/storage/toggle/track/white = 5,
+ /obj/item/clothing/suit/storage/trench = 5,
+ /obj/item/clothing/suit/storage/trench/grey = 5,
+ /obj/item/clothing/suit/varsity = 5,
+ /obj/item/clothing/suit/varsity/red = 5,
+ /obj/item/clothing/suit/varsity/purple = 5,
+ /obj/item/clothing/suit/varsity/green = 5,
+ /obj/item/clothing/suit/varsity/blue = 5,
+ /obj/item/clothing/suit/varsity/brown = 5,
+ /obj/item/clothing/suit/storage/hooded/wintercoat = 5,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey = 5)
+ prices = list(/obj/item/clothing/suit/storage/apron = 200,
+ /obj/item/clothing/suit/storage/flannel/aqua = 200,
+ /obj/item/clothing/suit/storage/toggle/bomber = 200,
+ /obj/item/clothing/suit/storage/bomber/alt = 200,
+ /obj/item/clothing/suit/storage/flannel/brown = 200,
+ /obj/item/clothing/suit/storage/toggle/cardigan = 200,
+ /obj/item/clothing/accessory/poncho/roles/cloak/custom = 200,
+ /obj/item/clothing/suit/storage/duster = 200,
+ /obj/item/clothing/suit/storage/toggle/denim_jacket = 200,
+ /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen = 200,
+ /obj/item/clothing/suit/storage/toggle/denim_jacket/sleeveless = 200,
+ /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen/sleeveless = 200,
+ /obj/item/clothing/suit/storage/fluff/gntop = 200,
+ /obj/item/clothing/suit/greatcoat = 200,
+ /obj/item/clothing/suit/storage/flannel = 200,
+ /obj/item/clothing/suit/storage/greyjacket = 200,
+ /obj/item/clothing/suit/storage/hazardvest = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/black = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/red = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/blue = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/green = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/orange = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/yellow = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/cti = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/mu = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/nt = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/smw = 200,
+ /obj/item/clothing/suit/storage/toggle/hoodie/nrti = 200,
+ /obj/item/clothing/suit/storage/fluff/jacket/field = 200,
+ /obj/item/clothing/suit/storage/fluff/jacket/air_cavalry = 200,
+ /obj/item/clothing/suit/storage/fluff/jacket/air_force = 200,
+ /obj/item/clothing/suit/storage/fluff/jacket/navy = 200,
+ /obj/item/clothing/suit/storage/fluff/jacket/special_forces = 200,
+ /obj/item/clothing/suit/kamishimo = 200,
+ /obj/item/clothing/suit/kimono = 200,
+ /obj/item/clothing/suit/storage/toggle/labcoat = 200,
+ /obj/item/clothing/suit/storage/toggle/labcoat/blue = 200,
+ /obj/item/clothing/suit/storage/toggle/labcoat/blue_edge = 200,
+ /obj/item/clothing/suit/storage/toggle/labcoat/green = 200,
+ /obj/item/clothing/suit/storage/toggle/labcoat/orange = 200,
+ /obj/item/clothing/suit/storage/toggle/labcoat/pink = 200,
+ /obj/item/clothing/suit/storage/toggle/labcoat/red = 200,
+ /obj/item/clothing/suit/storage/toggle/labcoat/yellow = 200,
+ /obj/item/clothing/suit/leathercoat = 200,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket = 200,
+ /obj/item/clothing/suit/storage/leather_jacket_alt = 200,
+ /obj/item/clothing/suit/storage/toggle/brown_jacket = 200,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen = 200,
+ /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen = 200,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket/sleeveless = 200,
+ /obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless = 200,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen/sleeveless = 200,
+ /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen/sleeveless = 200,
+ /obj/item/clothing/suit/storage/miljacket = 200,
+ /obj/item/clothing/suit/storage/miljacket/alt = 200,
+ /obj/item/clothing/suit/storage/miljacket/green = 200,
+ /obj/item/clothing/suit/storage/apron/overalls = 100,
+ /obj/item/clothing/suit/storage/toggle/peacoat = 200,
+ /obj/item/clothing/accessory/poncho = 100,
+ /obj/item/clothing/accessory/poncho/green = 100,
+ /obj/item/clothing/accessory/poncho/red = 100,
+ /obj/item/clothing/accessory/poncho/purple = 100,
+ /obj/item/clothing/accessory/poncho/blue = 100,
+ /obj/item/clothing/suit/jacket/puffer = 200,
+ /obj/item/clothing/suit/jacket/puffer/vest = 200,
+ /obj/item/clothing/suit/storage/flannel/red = 200,
+ /obj/item/clothing/suit/unathi/robe = 100,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit = 200,
+ /obj/item/clothing/suit/storage/toggle/internalaffairs = 200,
+ /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 200,
+ /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 200,
+ /obj/item/clothing/suit/suspenders = 200,
+ /obj/item/clothing/suit/storage/toggle/track = 200,
+ /obj/item/clothing/suit/storage/toggle/track/blue = 200,
+ /obj/item/clothing/suit/storage/toggle/track/green = 200,
+ /obj/item/clothing/suit/storage/toggle/track/red = 200,
+ /obj/item/clothing/suit/storage/toggle/track/white = 200,
+ /obj/item/clothing/suit/storage/trench = 200,
+ /obj/item/clothing/suit/storage/trench/grey = 200,
+ /obj/item/clothing/suit/varsity = 200,
+ /obj/item/clothing/suit/varsity/red = 200,
+ /obj/item/clothing/suit/varsity/purple = 200,
+ /obj/item/clothing/suit/varsity/green = 200,
+ /obj/item/clothing/suit/varsity/blue = 200,
+ /obj/item/clothing/suit/varsity/brown = 200,
+ /obj/item/clothing/suit/storage/hooded/wintercoat = 200,
+ /obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey = 200)
+ premium = list(/obj/item/clothing/suit/imperium_monk = 3)
+ contraband = list(/obj/item/toy/katana = 1)
+/obj/machinery/vending/loadout/costume
+ name = "Thespian's Delight"
+ desc = "Sometimes nerds need costumes!"
+ product_ads = "Don't let your art be stifled!;Remember, practice makes perfect!;Break a leg!;Don't make me get the cane!;Thespian's Delight entering stage right!;Costumes for your acting needs!"
+ icon_state = "Theater_b"
+ products = list(/obj/item/clothing/suit/storage/hooded/carp_costume = 3,
+ /obj/item/clothing/suit/storage/hooded/carp_costume = 3,
+ /obj/item/clothing/suit/chickensuit = 3,
+ /obj/item/clothing/head/chicken = 3,
+ /obj/item/clothing/head/helmet/gladiator = 3,
+ /obj/item/clothing/under/gladiator = 3,
+ /obj/item/clothing/suit/storage/toggle/labcoat/mad = 3,
+ /obj/item/clothing/under/gimmick/rank/captain/suit = 3,
+ /obj/item/clothing/glasses/gglasses = 3,
+ /obj/item/clothing/head/flatcap = 3,
+ /obj/item/clothing/shoes/boots/jackboots = 3,
+ /obj/item/clothing/under/schoolgirl = 3,
+ /obj/item/clothing/head/kitty = 3,
+ /obj/item/clothing/glasses/sunglasses/blindfold = 3,
+ /obj/item/clothing/head/beret = 3,
+ /obj/item/clothing/under/skirt = 3,
+ /obj/item/clothing/under/suit_jacket = 3,
+ /obj/item/clothing/head/that = 3,
+ /obj/item/clothing/accessory/wcoat = 3,
+ /obj/item/clothing/under/scratch = 3,
+ /obj/item/clothing/shoes/white = 3,
+ /obj/item/clothing/gloves/white = 3,
+ /obj/item/clothing/under/kilt = 3,
+ /obj/item/clothing/glasses/monocle = 3,
+ /obj/item/clothing/under/sl_suit = 3,
+ /obj/item/clothing/mask/fakemoustache = 3,
+ /obj/item/weapon/cane = 3,
+ /obj/item/clothing/head/bowler = 3,
+ /obj/item/clothing/head/plaguedoctorhat = 3,
+ /obj/item/clothing/suit/bio_suit/plaguedoctorsuit = 3,
+ /obj/item/clothing/mask/gas/plaguedoctor/fluff = 3,
+ /obj/item/clothing/under/owl = 3,
+ /obj/item/clothing/mask/gas/owl_mask = 3,
+ /obj/item/clothing/under/waiter = 3,
+ /obj/item/clothing/suit/storage/apron = 3,
+ /obj/item/clothing/under/pirate = 3,
+ /obj/item/clothing/head/pirate = 3,
+ /obj/item/clothing/suit/pirate = 3,
+ /obj/item/clothing/glasses/eyepatch = 3,
+ /obj/item/clothing/head/ushanka = 3,
+ /obj/item/clothing/under/soviet = 3,
+ /obj/item/clothing/suit/imperium_monk = 1,
+ /obj/item/clothing/suit/holidaypriest = 3,
+ /obj/item/clothing/head/witchwig = 3,
+ /obj/item/clothing/under/sundress = 3,
+ /obj/item/weapon/staff/broom = 3,
+ /obj/item/clothing/suit/wizrobe/fake = 3,
+ /obj/item/clothing/head/wizard/fake = 3,
+ /obj/item/weapon/staff = 3,
+ /obj/item/clothing/mask/gas/sexyclown = 3,
+ /obj/item/clothing/under/sexyclown = 3,
+ /obj/item/clothing/mask/gas/sexymime = 3,
+ /obj/item/clothing/under/sexymime = 3)
+ prices = list(/obj/item/clothing/suit/storage/hooded/carp_costume = 200,
+ /obj/item/clothing/suit/storage/hooded/carp_costume = 200,
+ /obj/item/clothing/suit/chickensuit = 200,
+ /obj/item/clothing/head/chicken = 200,
+ /obj/item/clothing/head/helmet/gladiator = 300,
+ /obj/item/clothing/under/gladiator = 500,
+ /obj/item/clothing/suit/storage/toggle/labcoat/mad = 200,
+ /obj/item/clothing/under/gimmick/rank/captain/suit = 200,
+ /obj/item/clothing/glasses/gglasses = 200,
+ /obj/item/clothing/head/flatcap = 200,
+ /obj/item/clothing/shoes/boots/jackboots = 200,
+ /obj/item/clothing/under/schoolgirl = 200,
+ /obj/item/clothing/head/kitty = 200,
+ /obj/item/clothing/glasses/sunglasses/blindfold = 200,
+ /obj/item/clothing/head/beret = 200,
+ /obj/item/clothing/under/skirt = 200,
+ /obj/item/clothing/under/suit_jacket = 200,
+ /obj/item/clothing/head/that = 200,
+ /obj/item/clothing/accessory/wcoat = 200,
+ /obj/item/clothing/under/scratch = 200,
+ /obj/item/clothing/shoes/white = 200,
+ /obj/item/clothing/gloves/white = 200,
+ /obj/item/clothing/under/kilt = 200,
+ /obj/item/clothing/glasses/monocle = 400,
+ /obj/item/clothing/under/sl_suit = 200,
+ /obj/item/clothing/mask/fakemoustache = 200,
+ /obj/item/weapon/cane = 300,
+ /obj/item/clothing/head/bowler = 200,
+ /obj/item/clothing/head/plaguedoctorhat = 300,
+ /obj/item/clothing/suit/bio_suit/plaguedoctorsuit = 300,
+ /obj/item/clothing/mask/gas/plaguedoctor/fluff = 600,
+ /obj/item/clothing/under/owl = 400,
+ /obj/item/clothing/mask/gas/owl_mask = 400,
+ /obj/item/clothing/under/waiter = 200,
+ /obj/item/clothing/suit/storage/apron = 200,
+ /obj/item/clothing/under/pirate = 300,
+ /obj/item/clothing/head/pirate = 400,
+ /obj/item/clothing/suit/pirate = 600,
+ /obj/item/clothing/glasses/eyepatch = 200,
+ /obj/item/clothing/head/ushanka = 200,
+ /obj/item/clothing/under/soviet = 200,
+ /obj/item/clothing/suit/imperium_monk = 2000,
+ /obj/item/clothing/suit/holidaypriest = 200,
+ /obj/item/clothing/head/witchwig = 200,
+ /obj/item/clothing/under/sundress = 200,
+ /obj/item/weapon/staff/broom = 400,
+ /obj/item/clothing/suit/wizrobe/fake = 200,
+ /obj/item/clothing/head/wizard/fake = 200,
+ /obj/item/weapon/staff = 400,
+ /obj/item/clothing/mask/gas/sexyclown = 600,
+ /obj/item/clothing/under/sexyclown = 200,
+ /obj/item/clothing/mask/gas/sexymime = 600,
+ /obj/item/clothing/under/sexymime = 200)
+ premium = list(/obj/item/clothing/suit/imperium_monk = 3)
+ contraband = list(/obj/item/clothing/head/syndicatefake = 1,
+ /obj/item/clothing/suit/syndicatefake = 1)
diff --git a/code/game/machinery/vending_yw.dm b/code/game/machinery/vending_yw.dm
index b5f4ab3142..63fdf7ba77 100644
--- a/code/game/machinery/vending_yw.dm
+++ b/code/game/machinery/vending_yw.dm
@@ -1,6 +1,11 @@
+/obj/machinery/vending/cigarette/New()
+ products += list(/obj/item/weapon/storage/fancy/cigarettes/yw/mauser = 5)
+ prices += list(/obj/item/weapon/storage/fancy/cigarettes/yw/mauser = 18)
+ ..()
+
/obj/machinery/vending/food/prison //Fluff vendor for the lewd houseboat.
name = "Prison Nutriment Vendor"
- desc = "Do you think Joan cooks? Of course not. Lazy squirrel!"
+ desc = "Delicious, probably not."
icon_state = "boozeomat"
icon_deny = "boozeomat-deny"
products = list(/obj/item/weapon/tray = 6,
diff --git a/code/game/magic/archived_book.dm b/code/game/magic/archived_book.dm
index 2fc9412fcd..b2af5f3f73 100644
--- a/code/game/magic/archived_book.dm
+++ b/code/game/magic/archived_book.dm
@@ -37,7 +37,7 @@ datum/book_manager/proc/freeid()
set desc = "Permamently deletes a book from the database."
set category = "Admin"
if(!src.holder)
- src << "Only administrators may use this command."
+ to_chat(src, "Only administrators may use this command.")
return
var/isbn = input("ISBN number?", "Delete Book") as num | null
diff --git a/code/game/mecha/combat/gorilla.dm b/code/game/mecha/combat/gorilla.dm
index 3d29cc8f0f..13e8040e65 100644
--- a/code/game/mecha/combat/gorilla.dm
+++ b/code/game/mecha/combat/gorilla.dm
@@ -81,7 +81,7 @@ HONK Blaster and a pulse cannon protected by projectile armor and powered by a b
max_universal_equip = 5
max_special_equip = 2
-/obj/mecha/combat/gorilla/New()
+/obj/mecha/combat/gorilla/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) // This thing basically cannot function without an external power supply.
ME.attach(src)
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index 19564acba9..d70c8f9e85 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -45,7 +45,7 @@
max_universal_equip = 1
max_special_equip = 2
-/obj/mecha/combat/gygax/dark/New()
+/obj/mecha/combat/gygax/dark/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
ME.attach(src)
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index b8aed16cef..9521147089 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -55,7 +55,7 @@
wreckage = /obj/effect/decal/mecha_wreckage/mauler
mech_faction = MECH_FACTION_SYNDI
-/obj/mecha/combat/marauder/New()
+/obj/mecha/combat/marauder/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse
ME.attach(src)
@@ -69,7 +69,7 @@
src.smoke_system.attach(src)
return
-/obj/mecha/combat/marauder/seraph/New()
+/obj/mecha/combat/marauder/seraph/Initialize()
..()//Let it equip whatever is needed.
var/obj/item/mecha_parts/mecha_equipment/ME
if(equipment.len)//Now to remove it and equip anew.
diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm
index b54368a75e..8f72de5f51 100644
--- a/code/game/mecha/combat/phazon.dm
+++ b/code/game/mecha/combat/phazon.dm
@@ -27,7 +27,7 @@
max_universal_equip = 3
max_special_equip = 4
-/obj/mecha/combat/phazon/equipped/New()
+/obj/mecha/combat/phazon/equipped/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/rcd
ME.attach(src)
@@ -133,7 +133,7 @@
..()
if(phasing)
phasing = FALSE
- radiation_repository.radiate(get_turf(src), 30)
+ SSradiation.radiate(get_turf(src), 30)
log_append_to_last("WARNING: BLUESPACE DRIVE INSTABILITY DETECTED. DISABLING DRIVE.",1)
visible_message("The [src.name] appears to flicker, before its silhouette stabilizes!")
return
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index b61ada6d18..9f1e522733 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -573,4 +573,233 @@
for(var/reagent in S.processed_reagents)
S.reagents.add_reagent(reagent,amount)
S.chassis.use_power(energy_drain)
- return 1
\ No newline at end of file
+ return 1
+
+/obj/item/mecha_parts/mecha_equipment/crisis_drone
+ name = "crisis dronebay"
+ desc = "A small shoulder-mounted dronebay containing a rapid response drone capable of moderately stabilizing a patient near the exosuit."
+ icon_state = "mecha_dronebay"
+ origin_tech = list(TECH_PHORON = 3, TECH_MAGNET = 6, TECH_BIO = 5, TECH_DATA = 4)
+ range = MELEE|RANGED
+ equip_cooldown = 3 SECONDS
+ required_type = list(/obj/mecha/medical)
+
+ var/droid_state = "med_droid"
+
+ var/beam_state = "medbeam"
+
+ var/enabled = FALSE
+
+ var/icon/drone_overlay
+
+ var/max_distance = 3
+
+ var/damcap = 60
+ var/heal_dead = FALSE // Does this device heal the dead?
+
+ var/brute_heal = 0.5 // Amount of bruteloss healed.
+ var/burn_heal = 0.5 // Amount of fireloss healed.
+ var/tox_heal = 0.5 // Amount of toxloss healed.
+ var/oxy_heal = 1 // Amount of oxyloss healed.
+ var/rad_heal = 0 // Amount of radiation healed.
+ var/clone_heal = 0 // Amount of cloneloss healed.
+ var/hal_heal = 0.2 // Amount of halloss healed.
+ var/bone_heal = 0 // Percent chance it will heal a broken bone. this does not mean 'make it not instantly re-break'.
+
+ var/mob/living/Target = null
+ var/datum/beam/MyBeam = null
+
+ equip_type = EQUIP_HULL
+
+/obj/item/mecha_parts/mecha_equipment/crisis_drone/Initialize()
+ ..()
+ drone_overlay = new(src.icon, icon_state = droid_state)
+
+/obj/item/mecha_parts/mecha_equipment/crisis_drone/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ ..()
+
+/obj/item/mecha_parts/mecha_equipment/crisis_drone/attach(obj/mecha/M as obj)
+ . = ..(M)
+ if(chassis)
+ START_PROCESSING(SSobj, src)
+
+/obj/item/mecha_parts/mecha_equipment/crisis_drone/detach(atom/moveto=null)
+ shut_down()
+ . = ..(moveto)
+ STOP_PROCESSING(SSobj, src)
+
+/obj/item/mecha_parts/mecha_equipment/crisis_drone/critfail()
+ . = ..()
+ STOP_PROCESSING(SSobj, src)
+ shut_down()
+ if(chassis && chassis.occupant)
+ to_chat(chassis.occupant, "\The [chassis] shudders as something jams!")
+ log_message("[src.name] has malfunctioned. Maintenance required.")
+
+/obj/item/mecha_parts/mecha_equipment/crisis_drone/process() // Will continually try to find the nearest person above the threshold that is a valid target, and try to heal them.
+ if(chassis && enabled && chassis.has_charge(energy_drain) && (chassis.occupant || enable_special))
+ var/mob/living/Targ = Target
+ var/TargDamage = 0
+
+ if(!valid_target(Target))
+ Target = null
+
+ if(Target)
+ TargDamage = (Targ.getOxyLoss() + Targ.getFireLoss() + Targ.getBruteLoss() + Targ.getToxLoss())
+
+ for(var/mob/living/Potential in viewers(max_distance, chassis))
+ if(!valid_target(Potential))
+ continue
+
+ var/tallydamage = 0
+ if(oxy_heal)
+ tallydamage += Potential.getOxyLoss()
+ if(burn_heal)
+ tallydamage += Potential.getFireLoss()
+ if(brute_heal)
+ tallydamage += Potential.getBruteLoss()
+ if(tox_heal)
+ tallydamage += Potential.getToxLoss()
+ if(hal_heal)
+ tallydamage += Potential.getHalLoss()
+ if(clone_heal)
+ tallydamage += Potential.getCloneLoss()
+ if(rad_heal)
+ tallydamage += Potential.radiation / 2
+
+ if(tallydamage > TargDamage)
+ Target = Potential
+
+ if(MyBeam && !valid_target(MyBeam.target))
+ QDEL_NULL(MyBeam)
+
+ if(Target)
+ if(MyBeam && MyBeam.target != Target)
+ QDEL_NULL(MyBeam)
+
+ if(valid_target(Target))
+ if(!MyBeam)
+ MyBeam = chassis.Beam(Target,icon='icons/effects/beam.dmi',icon_state=beam_state,time=3 SECONDS,maxdistance=max_distance,beam_type = /obj/effect/ebeam,beam_sleep_time=2)
+ heal_target(Target)
+
+ else
+ shut_down()
+
+/obj/item/mecha_parts/mecha_equipment/crisis_drone/proc/valid_target(var/mob/living/L)
+ . = TRUE
+
+ if(!L || !istype(L))
+ return FALSE
+
+ if(get_dist(L, src) > max_distance)
+ return FALSE
+
+ if(!(L in viewers(max_distance, chassis)))
+ return FALSE
+
+ if(!unique_patient_checks(L))
+ return FALSE
+
+ if(L.stat == DEAD && !heal_dead)
+ return FALSE
+
+ var/tallydamage = 0
+ if(oxy_heal)
+ tallydamage += L.getOxyLoss()
+ if(burn_heal)
+ tallydamage += L.getFireLoss()
+ if(brute_heal)
+ tallydamage += L.getBruteLoss()
+ if(tox_heal)
+ tallydamage += L.getToxLoss()
+ if(hal_heal)
+ tallydamage += L.getHalLoss()
+ if(clone_heal)
+ tallydamage += L.getCloneLoss()
+ if(rad_heal)
+ tallydamage += L.radiation / 2
+
+ if(tallydamage < damcap)
+ return FALSE
+
+/obj/item/mecha_parts/mecha_equipment/crisis_drone/proc/shut_down()
+ if(enabled)
+ chassis.visible_message("\The [chassis]'s [src] buzzes as its drone returns to port.")
+ toggle_drone()
+ if(!isnull(Target))
+ Target = null
+ if(MyBeam)
+ QDEL_NULL(MyBeam)
+
+/obj/item/mecha_parts/mecha_equipment/crisis_drone/proc/unique_patient_checks(var/mob/living/L) // Anything special for subtypes. Does it only work on Robots? Fleshies? A species?
+ . = TRUE
+
+/obj/item/mecha_parts/mecha_equipment/crisis_drone/proc/heal_target(var/mob/living/L) // We've done all our special checks, just get to fixing damage.
+ chassis.use_power(energy_drain)
+ if(istype(L))
+ L.adjustBruteLoss(brute_heal * -1)
+ L.adjustFireLoss(burn_heal * -1)
+ L.adjustToxLoss(tox_heal * -1)
+ L.adjustOxyLoss(oxy_heal * -1)
+ L.adjustCloneLoss(clone_heal * -1)
+ L.adjustHalLoss(hal_heal * -1)
+ L.radiation = max(0, L.radiation - rad_heal)
+
+ if(ishuman(L) && bone_heal)
+ var/mob/living/carbon/human/H = L
+
+ if(H.bad_external_organs.len)
+ for(var/obj/item/organ/external/E in H.bad_external_organs)
+ if(prob(bone_heal))
+ E.status &= ~ORGAN_BROKEN
+
+/obj/item/mecha_parts/mecha_equipment/crisis_drone/proc/toggle_drone()
+ ..()
+ if(chassis)
+ enabled = !enabled
+ if(enabled)
+ set_ready_state(0)
+ log_message("Activated.")
+ chassis.overlays += drone_overlay
+ else
+ set_ready_state(1)
+ log_message("Deactivated.")
+ chassis.overlays -= drone_overlay
+
+/obj/item/mecha_parts/mecha_equipment/crisis_drone/Topic(href, href_list)
+ ..()
+ if(href_list["toggle_drone"])
+ toggle_drone()
+ return
+
+/obj/item/mecha_parts/mecha_equipment/crisis_drone/get_equip_info()
+ if(!chassis) return
+ return "* [src.name] - [enabled?"Dea":"A"]ctivate"
+
+/obj/item/mecha_parts/mecha_equipment/crisis_drone/rad
+ name = "hazmat dronebay"
+ desc = "A small shoulder-mounted dronebay containing a rapid response drone capable of purging a patient near the exosuit of radiation damage."
+ icon_state = "mecha_dronebay_rad"
+
+ droid_state = "rad_drone"
+ beam_state = "g_beam"
+
+ tox_heal = 0.5
+ rad_heal = 5
+ clone_heal = 0.2
+ hal_heal = 0.2
+
+/obj/item/mecha_parts/mecha_equipment/tool/powertool/medanalyzer
+ name = "mounted humanoid scanner"
+ desc = "An exosuit-mounted scanning device."
+ icon_state = "mecha_analyzer_health"
+ origin_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 5, TECH_BIO = 5)
+ equip_cooldown = 5 SECONDS
+ energy_drain = 100
+ range = MELEE
+ equip_type = EQUIP_UTILITY
+ ready_sound = 'sound/weapons/flash.ogg'
+ required_type = list(/obj/mecha/medical)
+
+ tooltype = /obj/item/device/healthanalyzer/advanced
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index f821945144..73f7356ade 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -1201,7 +1201,7 @@
/datum/global_iterator/mecha_generator/nuclear/process(var/obj/item/mecha_parts/mecha_equipment/generator/nuclear/EG)
if(..())
- radiation_repository.radiate(EG, (EG.rad_per_cycle * 3))
+ SSradiation.radiate(EG, (EG.rad_per_cycle * 3))
return 1
diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm
index b3b9faa37d..1f90a45d61 100644
--- a/code/game/mecha/medical/odysseus.dm
+++ b/code/game/mecha/medical/odysseus.dm
@@ -123,7 +123,7 @@
C.images += holder
*/
-/obj/mecha/medical/odysseus/loaded/New()
+/obj/mecha/medical/odysseus/loaded/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/sleeper
ME.attach(src)
diff --git a/code/game/mecha/space/hoverpod.dm b/code/game/mecha/space/hoverpod.dm
index 85fc59d564..31558458d9 100644
--- a/code/game/mecha/space/hoverpod.dm
+++ b/code/game/mecha/space/hoverpod.dm
@@ -105,7 +105,7 @@
max_universal_equip = 1
max_special_equip = 1
-/obj/mecha/working/hoverpod/combatpod/New()
+/obj/mecha/working/hoverpod/combatpod/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
ME.attach(src)
@@ -116,7 +116,7 @@
/obj/mecha/working/hoverpod/shuttlepod
desc = "Who knew a tiny ball could fit three people?"
-/obj/mecha/working/hoverpod/shuttlepod/New()
+/obj/mecha/working/hoverpod/shuttlepod/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/passenger
ME.attach(src)
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index c4813bb0dd..5dd88eb7e7 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -54,7 +54,7 @@
max_universal_equip = 1
max_special_equip = 1
-/obj/mecha/working/ripley/deathripley/New()
+/obj/mecha/working/ripley/deathripley/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/safety_clamp
ME.attach(src)
@@ -64,7 +64,7 @@
desc = "An old, dusty mining ripley."
name = "APLU \"Miner\""
-/obj/mecha/working/ripley/mining/New()
+/obj/mecha/working/ripley/mining/Initialize()
..()
//Attach drill
if(prob(25)) //Possible diamond drill... Feeling lucky?
diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm
index 0de8d332b7..bdcbe95e7f 100644
--- a/code/game/objects/effects/alien/aliens.dm
+++ b/code/game/objects/effects/alien/aliens.dm
@@ -152,6 +152,12 @@
* Weeds
*/
#define NODERANGE 3
+#define WEED_NORTH_EDGING "north"
+#define WEED_SOUTH_EDGING "south"
+#define WEED_EAST_EDGING "east"
+#define WEED_WEST_EDGING "west"
+#define WEED_NODE_GLOW "glow"
+#define WEED_NODE_BASE "nodebase"
/obj/effect/alien/weeds
name = "weeds"
@@ -164,6 +170,18 @@
layer = ABOVE_TURF_LAYER
var/health = 15
var/obj/effect/alien/weeds/node/linked_node = null
+ var/static/list/weedImageCache
+
+/obj/effect/alien/weeds/Destroy()
+ var/turf/T = get_turf(src)
+ // To not mess up the overlay updates.
+ loc = null
+
+ for (var/obj/effect/alien/weeds/W in range(1,T))
+ W.updateWeedOverlays()
+
+ linked_node = null
+ ..()
/obj/effect/alien/weeds/node
icon_state = "weednode"
@@ -173,9 +191,22 @@
light_range = NODERANGE
var/node_range = NODERANGE
+ var/set_color = null
+
/obj/effect/alien/weeds/node/New()
..(src.loc, src)
+/obj/effect/alien/weeds/node/Initialize()
+ ..()
+ START_PROCESSING(SSobj, src)
+
+ spawn(1 SECOND)
+ if(color)
+ set_color = color
+
+/obj/effect/alien/weeds/node/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ ..()
/obj/effect/alien/weeds/New(pos, node)
..()
@@ -184,12 +215,45 @@
return
linked_node = node
if(icon_state == "weeds")icon_state = pick("weeds", "weeds1", "weeds2")
- spawn(rand(150, 200))
- if(src)
- Life()
+
+ fullUpdateWeedOverlays()
+
+/obj/effect/alien/weeds/proc/updateWeedOverlays()
+
+ overlays.Cut()
+
+ if(!weedImageCache || !weedImageCache.len)
+ weedImageCache = list()
+// weedImageCache.len = 4
+ weedImageCache[WEED_NORTH_EDGING] = image('icons/mob/alien.dmi', "weeds_side_n", layer=2.11, pixel_y = -32)
+ weedImageCache[WEED_SOUTH_EDGING] = image('icons/mob/alien.dmi', "weeds_side_s", layer=2.11, pixel_y = 32)
+ weedImageCache[WEED_EAST_EDGING] = image('icons/mob/alien.dmi', "weeds_side_e", layer=2.11, pixel_x = -32)
+ weedImageCache[WEED_WEST_EDGING] = image('icons/mob/alien.dmi', "weeds_side_w", layer=2.11, pixel_x = 32)
+
+ var/turf/N = get_step(src, NORTH)
+ var/turf/S = get_step(src, SOUTH)
+ var/turf/E = get_step(src, EAST)
+ var/turf/W = get_step(src, WEST)
+ if(!locate(/obj/effect/alien) in N.contents)
+ if(istype(N, /turf/simulated/floor))
+ overlays += weedImageCache[WEED_SOUTH_EDGING]
+ if(!locate(/obj/effect/alien) in S.contents)
+ if(istype(S, /turf/simulated/floor))
+ overlays += weedImageCache[WEED_NORTH_EDGING]
+ if(!locate(/obj/effect/alien) in E.contents)
+ if(istype(E, /turf/simulated/floor))
+ overlays += weedImageCache[WEED_WEST_EDGING]
+ if(!locate(/obj/effect/alien) in W.contents)
+ if(istype(W, /turf/simulated/floor))
+ overlays += weedImageCache[WEED_EAST_EDGING]
+
+/obj/effect/alien/weeds/proc/fullUpdateWeedOverlays()
+ for (var/obj/effect/alien/weeds/W in range(1,src))
+ W.updateWeedOverlays()
+
return
-/obj/effect/alien/weeds/proc/Life()
+/obj/effect/alien/weeds/process()
set background = 1
var/turf/U = get_turf(src)
/*
@@ -211,6 +275,9 @@ Alien plants should do something if theres a lot of poison
if(!linked_node || (get_dist(linked_node, src) > linked_node.node_range) )
return
+ if(linked_node != src)
+ color = linked_node.set_color
+
direction_loop:
for(var/dirn in cardinal)
var/turf/T = get_step(src, dirn)
@@ -222,10 +289,33 @@ Alien plants should do something if theres a lot of poison
// continue
for(var/obj/O in T)
- if(O.density)
+ if(!O.CanZASPass(U))
continue direction_loop
- new /obj/effect/alien/weeds(T, linked_node)
+ var/obj/effect/E = new /obj/effect/alien/weeds(T, linked_node)
+
+ E.color = color
+
+ if(istype(src, /obj/effect/alien/weeds/node))
+ var/obj/effect/alien/weeds/node/N = src
+ var/list/nearby_weeds = list()
+ for(var/obj/effect/alien/weeds/W in range(N.node_range,src))
+ nearby_weeds |= W
+
+ for(var/obj/effect/alien/weeds/W in nearby_weeds)
+ if(!W)
+ continue
+
+ if(!W.linked_node)
+ W.linked_node = src
+
+ W.color = W.linked_node.set_color
+
+ if(W == src)
+ continue
+
+ if(prob(max(10, 40 - (5 * nearby_weeds.len))))
+ W.process()
/obj/effect/alien/weeds/ex_act(severity)
@@ -282,7 +372,12 @@ Alien plants should do something if theres a lot of poison
healthcheck()
#undef NODERANGE
-
+#undef WEED_NORTH_EDGING
+#undef WEED_SOUTH_EDGING
+#undef WEED_EAST_EDGING
+#undef WEED_WEST_EDGING
+#undef WEED_NODE_GLOW
+#undef WEED_NODE_BASE
/*
* Acid
diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm
index f32a75dcce..d3ee736251 100644
--- a/code/game/objects/effects/chem/foam.dm
+++ b/code/game/objects/effects/chem/foam.dm
@@ -74,6 +74,12 @@
qdel(src)
/obj/effect/effect/foam/Crossed(var/atom/movable/AM)
+ //VOREStation Edit begin: SHADEKIN
+ var/mob/SK = AM
+ if(istype(SK))
+ if(SK.shadekin_phasing_check())
+ return
+ //VOREStation Edit end: SHADEKIN
if(metal)
return
if(istype(AM, /mob/living))
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 8b8bba5a9d..cfde668d5c 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -70,6 +70,12 @@ var/global/list/image/splatter_cache=list()
desc = initial(desc)
/obj/effect/decal/cleanable/blood/Crossed(mob/living/carbon/human/perp)
+ //VOREStation Edit begin: SHADEKIN
+ var/mob/SK = perp
+ if(istype(SK))
+ if(SK.shadekin_phasing_check())
+ return
+ //VOREStation Edit end: SHADEKIN
if (!istype(perp))
return
if(amount < 1)
@@ -199,10 +205,10 @@ var/global/list/image/splatter_cache=list()
overlays += giblets
/obj/effect/decal/cleanable/blood/gibs/up
- random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1")
+ random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6","gibup1","gibup1","gibup1")
/obj/effect/decal/cleanable/blood/gibs/down
- random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
+ random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
/obj/effect/decal/cleanable/blood/gibs/body
random_icon_states = list("gibhead", "gibtorso")
diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm
index 551449a8fb..d1de900bae 100644
--- a/code/game/objects/effects/effect_system.dm
+++ b/code/game/objects/effects/effect_system.dm
@@ -185,6 +185,12 @@ steam.start() -- spawns the effect
qdel(src)
/obj/effect/effect/smoke/Crossed(mob/living/carbon/M as mob )
+ //VOREStation Edit begin: SHADEKIN
+ var/mob/SK = M
+ if(istype(SK))
+ if(SK.shadekin_phasing_check())
+ return
+ //VOREStation Edit end: SHADEKIN
..()
if(istype(M))
affect(M)
diff --git a/code/game/objects/effects/map_effects/radiation_emitter.dm b/code/game/objects/effects/map_effects/radiation_emitter.dm
index 3fb31d3c5d..8abf946556 100644
--- a/code/game/objects/effects/map_effects/radiation_emitter.dm
+++ b/code/game/objects/effects/map_effects/radiation_emitter.dm
@@ -1,19 +1,19 @@
-// Constantly emites radiation from the tile it's placed on.
-/obj/effect/map_effect/radiation_emitter
- name = "radiation emitter"
- icon_state = "radiation_emitter"
- var/radiation_power = 30 // Bigger numbers means more radiation.
-
-/obj/effect/map_effect/radiation_emitter/Initialize()
- START_PROCESSING(SSobj, src)
- return ..()
-
-/obj/effect/map_effect/radiation_emitter/Destroy()
- STOP_PROCESSING(SSobj, src)
- return ..()
-
-/obj/effect/map_effect/radiation_emitter/process()
- radiation_repository.radiate(src, radiation_power)
-
+// Constantly emites radiation from the tile it's placed on.
+/obj/effect/map_effect/radiation_emitter
+ name = "radiation emitter"
+ icon_state = "radiation_emitter"
+ var/radiation_power = 30 // Bigger numbers means more radiation.
+
+/obj/effect/map_effect/radiation_emitter/Initialize()
+ START_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/effect/map_effect/radiation_emitter/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/effect/map_effect/radiation_emitter/process()
+ SSradiation.radiate(src, radiation_power)
+
/obj/effect/map_effect/radiation_emitter/strong
radiation_power = 100
\ No newline at end of file
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index 87af3ec90b..fb4117ef44 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -36,6 +36,12 @@
..()
/obj/effect/mine/Crossed(AM as mob|obj)
+ //VOREStation Edit begin: SHADEKIN
+ var/mob/SK = AM
+ if(istype(SK))
+ if(SK.shadekin_phasing_check())
+ return
+ //VOREStation Edit end: SHADEKIN
Bumped(AM)
/obj/effect/mine/Bumped(mob/M as mob|obj)
diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm
index 7dc82a0ffb..5ba58dc4e0 100644
--- a/code/game/objects/effects/portals.dm
+++ b/code/game/objects/effects/portals.dm
@@ -21,6 +21,12 @@ GLOBAL_LIST_BOILERPLATE(all_portals, /obj/effect/portal)
return
/obj/effect/portal/Crossed(AM as mob|obj)
+ //VOREStation Edit begin: SHADEKIN
+ var/mob/SK = AM
+ if(istype(SK))
+ if(SK.shadekin_phasing_check())
+ return
+ //VOREStation Edit end: SHADEKIN
if(istype(AM,/mob) && !(istype(AM,/mob/living)))
return //do not send ghosts, zshadows, ai eyes, etc
spawn(0)
diff --git a/code/game/objects/effects/spiders_vr.dm b/code/game/objects/effects/spiders_vr.dm
new file mode 100644
index 0000000000..65829b95ac
--- /dev/null
+++ b/code/game/objects/effects/spiders_vr.dm
@@ -0,0 +1,2 @@
+/obj/effect/spider/spiderling/virgo
+ grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/hunter)
diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm
index 40c3f752e9..870656d92e 100644
--- a/code/game/objects/effects/step_triggers.dm
+++ b/code/game/objects/effects/step_triggers.dm
@@ -13,6 +13,12 @@
return 0
/obj/effect/step_trigger/Crossed(H as mob|obj)
+ //VOREStation Edit begin: SHADEKIN
+ var/mob/SK = H
+ if(istype(SK))
+ if(SK.shadekin_phasing_check())
+ return
+ //VOREStation Edit end: SHADEKIN
..()
if(!H)
return
@@ -229,6 +235,10 @@ var/global/list/tele_landmarks = list() // Terrible, but the alternative is loop
if(isobserver(A))
A.forceMove(T) // Harmlessly move ghosts.
return
+ //VOREStation Edit Start
+ if(!(A.can_fall()))
+ return // Phased shifted kin should not fall
+ //VOREStation Edit End
A.forceMove(T)
// Living things should probably be logged when they fall...
diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm
index 1a8b10a26a..67562e5a66 100644
--- a/code/game/objects/items/bodybag.dm
+++ b/code/game/objects/items/bodybag.dm
@@ -42,6 +42,29 @@
storage_capacity = (MOB_MEDIUM * 2) - 1
var/contains_body = 0
+//Yawn add
+/obj/item/bodybag/large
+ name = "mass grave body bag"
+ desc = "A large folded bag designed for the storage and transportation of cadavers."
+ icon = 'icons/obj/bodybag.dmi'
+ icon_state = "bluebodybag_folded"
+ w_class = ITEMSIZE_LARGE
+
+ attack_self(mob/user)
+ var/obj/structure/closet/body_bag/large/R = new /obj/structure/closet/body_bag/large(user.loc)
+ R.add_fingerprint(user)
+ qdel(src)
+
+/obj/structure/closet/body_bag/large
+ name = "mass grave body bag"
+ desc = "A massive body bag that holds as much as it does do to bluespace lining on its zipper. Shockingly compact for its storage."
+ icon_state = "bluebodybag_closed"
+ icon_closed = "bluebodybag_closed"
+ icon_opened = "bluebodybag_open"
+ storage_capacity = (MOB_MEDIUM * 12) - 1 //Holds 12 bodys
+ item_path = /obj/item/bodybag/large
+//End of Yawn add
+
/obj/structure/closet/body_bag/attackby(var/obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/pen))
var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 1d1d591d57..53a83c66bd 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -1456,6 +1456,12 @@ var/global/list/obj/item/device/pda/PDAs = list()
return ..()
/obj/item/device/pda/clown/Crossed(AM as mob|obj) //Clown PDA is slippery.
+ //VOREStation Edit begin: SHADEKIN
+ var/mob/SK = AM
+ if(istype(SK))
+ if(SK.shadekin_phasing_check())
+ return
+ //VOREStation Edit end: SHADEKIN
if (istype(AM, /mob/living))
var/mob/living/M = AM
diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm
index 26fb1b69aa..b66c4a3776 100644
--- a/code/game/objects/items/devices/defib.dm
+++ b/code/game/objects/items/devices/defib.dm
@@ -610,12 +610,12 @@
return 1
/obj/item/weapon/shockpaddles/standalone/checked_use(var/charge_amt)
- radiation_repository.radiate(src, charge_amt/12) //just a little bit of radiation. It's the price you pay for being powered by magic I guess
+ SSradiation.radiate(src, charge_amt/12) //just a little bit of radiation. It's the price you pay for being powered by magic I guess
return 1
/obj/item/weapon/shockpaddles/standalone/process()
if(fail_counter > 0)
- radiation_repository.radiate(src, fail_counter--)
+ SSradiation.radiate(src, fail_counter--)
else
STOP_PROCESSING(SSobj, src)
diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm
index 76697ddba3..92ff449855 100644
--- a/code/game/objects/items/devices/geiger.dm
+++ b/code/game/objects/items/devices/geiger.dm
@@ -28,7 +28,7 @@
/obj/item/device/geiger/proc/get_radiation()
if(!scanning)
return
- radiation_count = radiation_repository.get_rads_at_turf(get_turf(src))
+ radiation_count = SSradiation.get_rads_at_turf(get_turf(src))
update_icon()
update_sound()
diff --git a/code/game/objects/items/devices/radio/headset_vr.dm b/code/game/objects/items/devices/radio/headset_vr.dm
index d7216ed2d4..a82e694d0e 100644
--- a/code/game/objects/items/devices/radio/headset_vr.dm
+++ b/code/game/objects/items/devices/radio/headset_vr.dm
@@ -17,3 +17,30 @@
centComm = 1
ks2type = /obj/item/device/encryptionkey/ert
+/obj/item/device/radio/headset
+ sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/seromi/ears.dmi',
+ SPECIES_WEREBEAST = 'icons/mob/species/werebeast/ears.dmi')
+
+/obj/item/device/radio/headset/mob_headset //Adminbus headset for simplemob shenanigans.
+ name = "nonhuman radio implant"
+ desc = "An updated, modular intercom that requires no hands to operate. Takes encryption keys"
+
+/obj/item/device/radio/headset/mob_headset/receive_range(freq, level)
+ if(ismob(src.loc))
+ return ..(freq, level)
+ return -1
+
+/obj/item/device/radio/headset/mob_headset/afterattack(var/atom/movable/target, mob/living/user, proximity)
+ if(!proximity)
+ return
+ if(istype(target,/mob/living/simple_mob))
+ var/mob/living/simple_mob/M = target
+ if(!M.mob_radio)
+ forceMove(M)
+ M.mob_radio = src
+ return
+ if(M.mob_radio)
+ M.mob_radio.forceMove(M.loc)
+ M.mob_radio = null
+ return
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 68c862db09..747f7f7d0e 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -95,7 +95,7 @@ var/global/list/default_medbay_channels = list(
/obj/item/device/radio/interact(mob/user)
if(!user)
- return 0
+ return FALSE
if(b_stat)
wires.Interact(user)
@@ -151,10 +151,10 @@ var/global/list/default_medbay_channels = list(
/obj/item/device/radio/proc/has_channel_access(var/mob/user, var/freq)
if(!user)
- return 0
+ return FALSE
if(!(freq in internal_channels))
- return 0
+ return FALSE
return user.has_internal_radio_channel_access(internal_channels[freq])
@@ -191,7 +191,7 @@ var/global/list/default_medbay_channels = list(
/obj/item/device/radio/Topic(href, href_list)
if(..())
- return 1
+ return TRUE
usr.set_machine(src)
if (href_list["track"])
@@ -229,7 +229,7 @@ var/global/list/default_medbay_channels = list(
set_frequency(text2num(freq))
. = 1
if(href_list["nowindow"]) // here for pAIs, maybe others will want it, idk
- return 1
+ return TRUE
if(.)
SSnanoui.update_uis(src)
@@ -246,8 +246,6 @@ var/global/list/default_medbay_channels = list(
channel = null
if (!istype(connection))
return
- if (!connection)
- return
var/static/mob/living/silicon/ai/announcer/A = new /mob/living/silicon/ai/announcer(src, null, null, 1)
A.SetName(from)
@@ -274,18 +272,18 @@ var/global/list/default_medbay_channels = list(
return null
/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel, var/verb = "says", var/datum/language/speaking = null)
- if(!on) return 0 // the device has to be on
+ if(!on) return FALSE // the device has to be on
// Fix for permacell radios, but kinda eh about actually fixing them.
- if(!M || !message) return 0
+ if(!M || !message) return FALSE
- if(speaking && (speaking.flags & (SIGNLANG|NONVERBAL))) return 0
+ if(speaking && (speaking.flags & (SIGNLANG|NONVERBAL))) return FALSE
if(istype(M)) M.trigger_aiming(TARGET_CAN_RADIO)
// Uncommenting this. To the above comment:
// The permacell radios aren't suppose to be able to transmit, this isn't a bug and this "fix" is just making radio wires useless. -Giacom
if(wires.IsIndexCut(WIRE_TRANSMIT)) // The device has to have all its wires and shit intact
- return 0
+ return FALSE
if(!radio_connection)
set_frequency(frequency)
@@ -304,9 +302,7 @@ var/global/list/default_medbay_channels = list(
//#### Grab the connection datum ####//
var/datum/radio_frequency/connection = handle_message_mode(M, message, channel)
if (!istype(connection))
- return 0
- if (!connection)
- return 0
+ return FALSE
var/turf/position = get_turf(src)
@@ -360,13 +356,12 @@ var/global/list/default_medbay_channels = list(
/* ###### Radio headsets can only broadcast through subspace ###### */
-
if(subspace_transmission)
var/list/jamming = is_jammed(src)
if(jamming)
var/distance = jamming["distance"]
to_chat(M,"\icon[src] You hear the [distance <= 2 ? "loud hiss" : "soft hiss"] of static.")
- return 0
+ return FALSE
// First, we want to generate a new radio signal
var/datum/signal/signal = new
@@ -414,6 +409,7 @@ var/global/list/default_medbay_channels = list(
for(var/obj/machinery/telecomms/allinone/R in telecomms_list)
R.receive_signal(signal)
+ // Receiving code can be located in Telecommunications.dm
if(signal.data["done"] && position.z in signal.data["level"])
return TRUE //Huzzah, sent via subspace
@@ -474,13 +470,13 @@ var/global/list/default_medbay_channels = list(
to_chat(loc,"\The [src] pings as it reestablishes subspace communications.")
subspace_transmission = TRUE
// we're done here.
- return 1
+ return TRUE
// Oh my god; the comms are down or something because the signal hasn't been broadcasted yet in our level.
// Send a mundane broadcast with limited targets:
//THIS IS TEMPORARY. YEAH RIGHT
- if(!connection) return 0 //~Carn
+ if(!connection) return FALSE //~Carn
//VOREStation Add Start
if(bluespace_radio)
@@ -504,7 +500,7 @@ var/global/list/default_medbay_channels = list(
/obj/item/device/radio/proc/accept_rad(obj/item/device/radio/R as obj, message)
if ((R.frequency == frequency && message))
- return 1
+ return TRUE
else if
else
@@ -544,7 +540,7 @@ var/global/list/default_medbay_channels = list(
if (!accept)
for (var/ch_name in channels)
var/datum/radio_frequency/RF = secure_radio_connections[ch_name]
- if (RF.frequency==freq && (channels[ch_name]&FREQ_LISTENING))
+ if (RF && RF.frequency==freq && (channels[ch_name]&FREQ_LISTENING))
accept = 1
break
if (!accept)
@@ -695,7 +691,7 @@ var/global/list/default_medbay_channels = list(
/obj/item/device/radio/borg/Topic(href, href_list)
if(..())
- return 1
+ return TRUE
if (href_list["mode"])
var/enable_subspace_transmission = text2num(href_list["mode"])
if(enable_subspace_transmission != subspace_transmission)
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 90ae753da2..a085e59d24 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -175,6 +175,30 @@ HALOGEN COUNTER - Radcount on mobs
dat += stomachunknownreagents[d]
else
dat += "Unknown substance[(unknown > 1)?"s":""] found in subject's stomach.
"
+ if(C.touching && C.touching.total_volume)
+ var/unknown = 0
+ var/touchreagentdata[0]
+ var/touchunknownreagents[0]
+ for(var/B in C.touching.reagent_list)
+ var/datum/reagent/T = B
+ if(T.scannable)
+ touchreagentdata["[T.id]"] = "\t[round(C.touching.get_reagent_amount(T.id), 1)]u [T.name]
"
+ if (advscan == 0 || showadvscan == 0)
+ dat += "[T.name] found in subject's dermis.
"
+ else
+ ++unknown
+ touchunknownreagents["[T.id]"] = "\t[round(C.ingested.get_reagent_amount(T.id), 1)]u [T.name]
"
+ if(advscan >= 1 && showadvscan == 1)
+ dat += "Beneficial reagents detected in subject's dermis:
"
+ for(var/d in touchreagentdata)
+ dat += touchreagentdata[d]
+ if(unknown)
+ if(advscan >= 3 && showadvscan == 1)
+ dat += "Warning: Non-medical reagent[(unknown > 1)?"s":""] found in subject's dermis:
"
+ for(var/d in touchunknownreagents)
+ dat += touchunknownreagents[d]
+ else
+ dat += "Unknown substance[(unknown > 1)?"s":""] found in subject's dermis.
"
if(C.virus2.len)
for (var/ID in C.virus2)
if (ID in virusDB)
diff --git a/code/game/objects/items/poi_items.dm b/code/game/objects/items/poi_items.dm
index 6fd6d7debd..c12a3a655a 100644
--- a/code/game/objects/items/poi_items.dm
+++ b/code/game/objects/items/poi_items.dm
@@ -13,7 +13,7 @@
return ..()
/obj/item/poi/pascalb/process()
- radiation_repository.radiate(src, 5)
+ SSradiation.radiate(src, 5)
/obj/item/poi/pascalb/Destroy()
STOP_PROCESSING(SSobj, src)
@@ -41,7 +41,7 @@
return ..()
/obj/item/poi/brokenoldreactor/process()
- radiation_repository.radiate(src, 25)
+ SSradiation.radiate(src, 25)
/obj/item/poi/brokenoldreactor/Destroy()
STOP_PROCESSING(SSobj, src)
diff --git a/code/game/objects/items/stacks/matter_synth.dm b/code/game/objects/items/stacks/matter_synth.dm
index 3483dfbc61..d92cd5f8dd 100644
--- a/code/game/objects/items/stacks/matter_synth.dm
+++ b/code/game/objects/items/stacks/matter_synth.dm
@@ -50,4 +50,9 @@
/datum/matter_synth/wire
name = "Wire Synthesizer"
max_energy = 50
- recharge_rate = 2
\ No newline at end of file
+ recharge_rate = 2
+
+/datum/matter_synth/bandage
+ name = "Bandage Synthesizer"
+ max_energy = 10
+ recharge_rate = 1
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 612a14c4d4..51e2b8a03e 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -11,6 +11,8 @@
var/heal_burn = 0
var/apply_sounds
+ var/upgrade_to // The type path this stack can be upgraded to.
+
/obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob)
if (!istype(M))
user << "\The [src] cannot be applied to [M]!"
@@ -59,6 +61,80 @@
use(1)
M.updatehealth()
+
+/obj/item/stack/medical/proc/upgrade_stack(var/upgrade_amount)
+ . = FALSE
+
+ var/turf/T = get_turf(src)
+
+ if(ispath(upgrade_to) && use(upgrade_amount))
+ var/obj/item/stack/medical/M = new upgrade_to(T, upgrade_amount)
+ return M
+
+ return .
+
+/obj/item/stack/medical/crude_pack
+ name = "crude bandage"
+ singular_name = "crude bandage length"
+ desc = "Some bandages to wrap around bloody stumps."
+ icon_state = "gauze"
+ origin_tech = list(TECH_BIO = 1)
+ no_variants = FALSE
+ apply_sounds = list('sound/effects/rip1.ogg','sound/effects/rip2.ogg')
+
+ upgrade_to = /obj/item/stack/medical/bruise_pack
+
+/obj/item/stack/medical/crude_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
+ if(..())
+ return 1
+
+ if (istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
+
+ if(affecting.open)
+ to_chat(user, "The [affecting.name] is cut open, you'll need more than a bandage!")
+ return
+
+ if(affecting.is_bandaged())
+ to_chat(user, "The wounds on [M]'s [affecting.name] have already been bandaged.")
+ return 1
+ else
+ user.visible_message("\The [user] starts bandaging [M]'s [affecting.name].", \
+ "You start bandaging [M]'s [affecting.name]." )
+ var/used = 0
+ for (var/datum/wound/W in affecting.wounds)
+ if (W.internal)
+ continue
+ if(W.bandaged)
+ continue
+ if(used == amount)
+ break
+ if(!do_mob(user, M, W.damage/3))
+ to_chat(user, "You must stand still to bandage wounds.")
+ break
+
+ if(affecting.is_bandaged()) // We do a second check after the delay, in case it was bandaged after the first check.
+ to_chat(user, "The wounds on [M]'s [affecting.name] have already been bandaged.")
+ return 1
+
+ if (W.current_stage <= W.max_bleeding_stage)
+ user.visible_message("\The [user] bandages \a [W.desc] on [M]'s [affecting.name].", \
+ "You bandage \a [W.desc] on [M]'s [affecting.name]." )
+ else
+ user.visible_message("\The [user] places a bandage over \a [W.desc] on [M]'s [affecting.name].", \
+ "You place a bandage over \a [W.desc] on [M]'s [affecting.name]." )
+ W.bandage()
+ playsound(src, pick(apply_sounds), 25)
+ used++
+ affecting.update_damages()
+ if(used == amount)
+ if(affecting.is_bandaged())
+ to_chat(user, "\The [src] is used up.")
+ else
+ to_chat(user, "\The [src] is used up, but there are more wounds to treat on \the [affecting.name].")
+ use(used)
+
/obj/item/stack/medical/bruise_pack
name = "roll of gauze"
singular_name = "gauze length"
@@ -68,6 +144,8 @@
no_variants = FALSE
apply_sounds = list('sound/effects/rip1.ogg','sound/effects/rip2.ogg')
+ upgrade_to = /obj/item/stack/medical/advanced/bruise_pack
+
/obj/item/stack/medical/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
return 1
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index c5be255204..984c5b97f6 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -24,6 +24,9 @@
var/list/datum/matter_synth/synths = null
var/no_variants = TRUE // Determines whether the item should update it's sprites based on amount.
+ var/pass_color = FALSE // Will the item pass its own color var to the created item? Dyed cloth, wood, etc.
+ var/strict_color_stacking = FALSE // Will the stack merge with other stacks that are different colors? (Dyed cloth, wood, etc)
+
/obj/item/stack/New(var/loc, var/amount=null)
..()
if (!stacktype)
@@ -159,6 +162,17 @@
for (var/obj/item/I in O)
qdel(I)
+ if ((pass_color || recipe.pass_color))
+ if(!color)
+ if(recipe.use_material)
+ var/material/MAT = get_material_by_name(recipe.use_material)
+ if(MAT.icon_colour)
+ O.color = MAT.icon_colour
+ else
+ return
+ else
+ O.color = color
+
/obj/item/stack/Topic(href, href_list)
..()
if ((usr.restrained() || usr.stat || usr.get_active_hand() != src))
@@ -242,6 +256,9 @@
return 0
if ((stacktype != S.stacktype) && !type_verified)
return 0
+ if ((strict_color_stacking || S.strict_color_stacking) && S.color != color)
+ return 0
+
if (isnull(tamount))
tamount = src.get_amount()
@@ -355,8 +372,9 @@
var/one_per_turf = 0
var/on_floor = 0
var/use_material
+ var/pass_color
- New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, supplied_material = null)
+ New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, supplied_material = null, pass_stack_color)
src.title = title
src.result_type = result_type
src.req_amount = req_amount
@@ -366,6 +384,7 @@
src.one_per_turf = one_per_turf
src.on_floor = on_floor
src.use_material = supplied_material
+ src.pass_color = pass_stack_color
/*
* Recipe list datum
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 89182806db..067338bee9 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -322,6 +322,12 @@
qdel(src)
/obj/item/toy/snappop/Crossed(H as mob|obj)
+ //VOREStation Edit begin: SHADEKIN
+ var/mob/SK = H
+ if(istype(SK))
+ if(SK.shadekin_phasing_check())
+ return
+ //VOREStation Edit end: SHADEKIN
if((ishuman(H))) //i guess carp and shit shouldn't set them off
var/mob/living/carbon/M = H
if(M.m_intent == "run")
@@ -929,10 +935,16 @@
icon_state = "nymphplushie"
pokephrase = "Chirp!"
+/obj/item/toy/plushie/teshari
+ name = "teshari plush"
+ desc = "This is a plush teshari. Very soft, with a pompom on the tail. The toy is made well, as if alive. Looks like she is sleeping. Shhh!"
+ icon_state = "teshariplushie"
+ pokephrase = "Rya!"
+
/obj/item/toy/plushie/mouse
name = "mouse plush"
desc = "A plushie of a delightful mouse! What was once considered a vile rodent is now your very best friend."
- icon_state = "mouseplushie"
+ icon_state = "mouseplushie" //TFF 12/11/19 - updated icon to show a sprite that doesn't replicate a dead mouse. Heck you for that! >:C
pokephrase = "Squeak!"
/obj/item/toy/plushie/kitten
@@ -1357,4 +1369,4 @@
icon_state = "tinyxmastree"
w_class = ITEMSIZE_TINY
force = 1
- throwforce = 1
\ No newline at end of file
+ throwforce = 1
diff --git a/code/game/objects/items/toys_yw.dm b/code/game/objects/items/toys_yw.dm
new file mode 100644
index 0000000000..c79b27c3e8
--- /dev/null
+++ b/code/game/objects/items/toys_yw.dm
@@ -0,0 +1,18 @@
+/obj/item/toy/plushie/teshari/strix
+ name = "Strix Hades"
+ desc = "This is Strix Hades the plushie Avali. Very soft, with a pompom on the tail. The toy is made well, as if alive. Looks like he is sleeping. Shhh!"
+ icon_state = "strixplush"
+ pokephrase = "Weh!"
+ icon = 'icons/obj/toy_yw.dmi'
+
+ rename_plushie()
+ set name = "Name Plushie"
+ set category = "Object"
+ set desc = "Give your plushie a cute name!"
+ var/mob/M = usr
+ if(!M.mind)
+ return 0
+
+ if(src && !M.stat && in_range(M,src))
+ to_chat(M, "You cannot rename Strix Hades! You hug him anyway.")
+ return 1
\ No newline at end of file
diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm
index dd3ddb29ca..12315972a2 100644
--- a/code/game/objects/items/trash.dm
+++ b/code/game/objects/items/trash.dm
@@ -80,6 +80,10 @@
name = "\improper \"LiquidProtein\" ration"
icon_state = "liquidprotein"
+/obj/item/trash/liquidvitamin
+ name = "\improper \"VitaPaste\" ration"
+ icon_state = "liquidvitamin"
+
/obj/item/trash/tastybread
name = "bread tube"
icon_state = "tastybread"
diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm
index cb6a4e4a42..890e557f50 100644
--- a/code/game/objects/items/weapons/clown_items.dm
+++ b/code/game/objects/items/weapons/clown_items.dm
@@ -9,6 +9,12 @@
* Banana Peals
*/
/obj/item/weapon/bananapeel/Crossed(AM as mob|obj)
+ //VOREStation Edit begin: SHADEKIN
+ var/mob/SK = AM
+ if(istype(SK))
+ if(SK.shadekin_phasing_check())
+ return
+ //VOREStation Edit end: SHADEKIN
if (istype(AM, /mob/living))
var/mob/living/M = AM
M.slip("the [src.name]",4)
@@ -24,6 +30,12 @@
reagents.add_reagent("cleaner", 5)
/obj/item/weapon/soap/Crossed(AM as mob|obj)
+ //VOREStation Edit begin: SHADEKIN
+ var/mob/SK = AM
+ if(istype(SK))
+ if(SK.shadekin_phasing_check())
+ return
+ //VOREStation Edit end: SHADEKIN
if (istype(AM, /mob/living))
var/mob/living/M = AM
M.slip("the [src.name]",3)
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 1804d576fd..ff4146b8a0 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -13,6 +13,7 @@
var/implant_color = "b"
var/allow_reagents = 0
var/malfunction = 0
+ var/initialize_loc = BP_TORSO
show_messages = 1
/obj/item/weapon/implant/proc/trigger(emote, source as mob)
@@ -30,7 +31,7 @@
var/mob/living/carbon/human/H = source
var/obj/item/organ/external/affected = H.get_organ(target_zone)
if(affected)
- affected.implants += src
+ affected.implants |= src
part = affected
if(part)
forceMove(part)
@@ -65,8 +66,8 @@
/obj/item/weapon/implant/proc/implant_loadout(var/mob/living/carbon/human/H)
if(H)
- var/obj/item/organ/external/affected = H.organs_by_name[BP_HEAD]
- if(handle_implant(H, affected))
+ if(handle_implant(H, initialize_loc))
+ invisibility = initial(invisibility)
post_implant(H)
/obj/item/weapon/implant/Destroy()
@@ -110,7 +111,7 @@ GLOBAL_LIST_BOILERPLATE(all_tracking_implants, /obj/item/weapon/implant/tracking
..()
/obj/item/weapon/implant/tracking/post_implant(var/mob/source)
- START_PROCESSING(SSobj, src)
+ START_PROCESSING(SSobj, src)
/obj/item/weapon/implant/tracking/Destroy()
STOP_PROCESSING(SSobj, src)
@@ -563,7 +564,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
/obj/item/weapon/implant/death_alarm/post_implant(mob/source as mob)
mobname = source.real_name
- START_PROCESSING(SSobj, src)
+ START_PROCESSING(SSobj, src)
//////////////////////////////
// Compressed Matter Implant
diff --git a/code/game/objects/items/weapons/implants/implantaugment.dm b/code/game/objects/items/weapons/implants/implantaugment.dm
new file mode 100644
index 0000000000..10873d1d06
--- /dev/null
+++ b/code/game/objects/items/weapons/implants/implantaugment.dm
@@ -0,0 +1,196 @@
+//////////////////////////////
+// Nanite Organ Implant
+//////////////////////////////
+/obj/item/weapon/implant/organ
+ name = "nanite fabrication implant"
+ desc = "A buzzing implant covered in a writhing layer of metal insects."
+ icon_state = "implant_evil"
+ origin_tech = list(TECH_MATERIAL = 5, TECH_BIO = 2, TECH_ILLEGAL = 2)
+
+ var/organ_to_implant = /obj/item/organ/internal/augment/bioaugment/thermalshades
+ var/organ_display_name = "unknown organ"
+
+/obj/item/weapon/implant/organ/get_data()
+ var/dat = {"
+Implant Specifications:
+Name: \"GreyDoctor\" Class Nanite Hive
+Life: Activates upon implantation, destroying itself in the process.
+Important Notes: Nanites will fail to complete their task if a suitable location cannot be found for the organ.
+
+Implant Details:
+Function: Nanites will fabricate: [organ_display_name]
+Special Features: Organ identification protocols.
+Integrity: N/A"}
+ return dat
+
+/obj/item/weapon/implant/organ/post_implant(var/mob/M)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+
+ var/obj/item/organ/NewOrgan = new organ_to_implant()
+
+ var/obj/item/organ/external/E = H.get_organ(NewOrgan.parent_organ)
+ to_chat(H, "You feel a tingling sensation in your [part].")
+ if(E && !(H.internal_organs_by_name[NewOrgan.organ_tag]))
+ spawn(rand(1 SECONDS, 30 SECONDS))
+ to_chat(H, "You feel a pressure in your [E] as the tingling fades, the lump caused by the implant now gone.")
+
+ NewOrgan.forceMove(H)
+ NewOrgan.owner = H
+ if(E.internal_organs == null)
+ E.internal_organs = list()
+ E.internal_organs |= NewOrgan
+ H.internal_organs_by_name[NewOrgan.organ_tag] = NewOrgan
+ H.internal_organs |= NewOrgan
+ NewOrgan.handle_organ_mod_special()
+
+ spawn(1)
+ if(!QDELETED(src))
+ qdel(src)
+
+ else
+ qdel(NewOrgan)
+ to_chat(H, "You feel a pinching sensation in your [part]. The implant remains.")
+
+/obj/item/weapon/implant/organ/islegal()
+ return 0
+
+/*
+ * Arm / leg mounted augments.
+ */
+
+/obj/item/weapon/implant/organ/limbaugment
+ name = "nanite implant"
+
+ organ_to_implant = /obj/item/organ/internal/augment/armmounted/taser
+ organ_display_name = "physiological augment"
+
+ var/list/possible_targets = list(O_AUG_L_FOREARM, O_AUG_R_FOREARM)
+
+/obj/item/weapon/implant/organ/limbaugment/post_implant(var/mob/M)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+
+ var/obj/item/organ/NewOrgan = new organ_to_implant()
+
+ var/obj/item/organ/external/E = setup_augment_slots(H, NewOrgan)
+ to_chat(H, "You feel a tingling sensation in your [part].")
+ if(E && istype(E) && !(H.internal_organs_by_name[NewOrgan.organ_tag]))
+ spawn(rand(1 SECONDS, 30 SECONDS))
+ to_chat(H, "You feel a pressure in your [E] as the tingling fades, the lump caused by the implant now gone.")
+
+ NewOrgan.forceMove(H)
+ NewOrgan.owner = H
+ if(E.internal_organs == null)
+ E.internal_organs = list()
+ E.internal_organs |= NewOrgan
+ H.internal_organs_by_name[NewOrgan.organ_tag] = NewOrgan
+ H.internal_organs |= NewOrgan
+ NewOrgan.handle_organ_mod_special()
+
+ spawn(1)
+ if(!QDELETED(src))
+ qdel(src)
+
+ else
+ qdel(NewOrgan)
+ to_chat(H, "You feel a pinching sensation in your [part]. The implant remains.")
+
+/obj/item/weapon/implant/organ/limbaugment/proc/setup_augment_slots(var/mob/living/carbon/human/H, var/obj/item/organ/internal/augment/armmounted/I)
+ var/list/Choices = possible_targets.Copy()
+
+ for(var/targ in possible_targets)
+ if(H.internal_organs_by_name[targ])
+ Choices -= targ
+
+ var/target_choice = null
+ if(Choices && Choices.len)
+ if(Choices.len == 1)
+ target_choice = Choices[1]
+ else
+ target_choice = input("Choose augment location:") in Choices
+
+ else
+ return FALSE
+
+ if(target_choice)
+ switch(target_choice)
+ if(O_AUG_R_HAND)
+ I.organ_tag = O_AUG_R_HAND
+ I.parent_organ = BP_R_HAND
+ I.target_slot = slot_r_hand
+ if(O_AUG_L_HAND)
+ I.organ_tag = O_AUG_L_HAND
+ I.parent_organ = BP_L_HAND
+ I.target_slot = slot_l_hand
+
+ if(O_AUG_R_FOREARM)
+ I.organ_tag = O_AUG_R_FOREARM
+ I.parent_organ = BP_R_ARM
+ I.target_slot = slot_r_hand
+ if(O_AUG_L_FOREARM)
+ I.organ_tag = O_AUG_L_FOREARM
+ I.parent_organ = BP_L_ARM
+ I.target_slot = slot_l_hand
+
+ if(O_AUG_R_UPPERARM)
+ I.organ_tag = O_AUG_R_UPPERARM
+ I.parent_organ = BP_R_ARM
+ I.target_slot = slot_r_hand
+ if(O_AUG_L_UPPERARM)
+ I.organ_tag = O_AUG_L_UPPERARM
+ I.parent_organ = BP_L_ARM
+ I.target_slot = slot_l_hand
+
+ . = H.get_organ(I.parent_organ)
+
+/*
+ * Limb implant primary subtypes.
+ */
+
+/obj/item/weapon/implant/organ/limbaugment/upperarm
+ organ_to_implant = /obj/item/organ/internal/augment/armmounted/shoulder/multiple
+ organ_display_name = "multi-use augment"
+
+ possible_targets = list(O_AUG_R_UPPERARM,O_AUG_L_UPPERARM)
+
+/obj/item/weapon/implant/organ/limbaugment/wrist
+ organ_to_implant = /obj/item/organ/internal/augment/armmounted/hand
+ organ_display_name = "wrist augment"
+
+ possible_targets = list(O_AUG_R_HAND,O_AUG_L_HAND)
+
+/*
+ * Limb implant general subtypes.
+ */
+
+// Wrist
+/obj/item/weapon/implant/organ/limbaugment/wrist/sword
+ organ_to_implant = /obj/item/organ/internal/augment/armmounted/hand/sword
+ organ_display_name = "weapon augment"
+
+// Fore-arm
+/obj/item/weapon/implant/organ/limbaugment/laser
+ organ_to_implant = /obj/item/organ/internal/augment/armmounted
+ organ_display_name = "weapon augment"
+
+/obj/item/weapon/implant/organ/limbaugment/dart
+ organ_to_implant = /obj/item/organ/internal/augment/armmounted/dartbow
+ organ_display_name = "weapon augment"
+
+// Upper-arm.
+/obj/item/weapon/implant/organ/limbaugment/upperarm/medkit
+ organ_to_implant = /obj/item/organ/internal/augment/armmounted/shoulder/multiple/medical
+
+/obj/item/weapon/implant/organ/limbaugment/upperarm/surge
+ organ_to_implant = /obj/item/organ/internal/augment/armmounted/shoulder/surge
+
+/*
+ * Others
+ */
+
+/obj/item/weapon/implant/organ/pelvic
+ name = "nanite fabrication implant"
+
+ organ_to_implant = /obj/item/organ/internal/augment/bioaugment/sprint_enhance
+ organ_display_name = "pelvic augment"
diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm
index ae00895361..93fef6ca92 100644
--- a/code/game/objects/items/weapons/implants/implantcase.dm
+++ b/code/game/objects/items/weapons/implants/implantcase.dm
@@ -179,3 +179,103 @@
src.imp = new /obj/item/weapon/implant/language/eal( src )
..()
return
+
+/obj/item/weapon/implantcase/shades
+ name = "glass case - 'Integrated Shades'"
+ desc = "A case containing a nanite fabricator implant."
+ icon_state = "implantcase-b"
+
+/obj/item/weapon/implantcase/shades/New()
+ src.imp = new /obj/item/weapon/implant/organ( src )
+ ..()
+ return
+
+/obj/item/weapon/implantcase/taser
+ name = "glass case - 'Taser'"
+ desc = "A case containing a nanite fabricator implant."
+ icon_state = "implantcase-b"
+
+/obj/item/weapon/implantcase/taser/New()
+ src.imp = new /obj/item/weapon/implant/organ/limbaugment( src )
+ ..()
+ return
+
+/obj/item/weapon/implantcase/laser
+ name = "glass case - 'Laser'"
+ desc = "A case containing a nanite fabricator implant."
+ icon_state = "implantcase-b"
+
+/obj/item/weapon/implantcase/laser/New()
+ src.imp = new /obj/item/weapon/implant/organ/limbaugment/laser( src )
+ ..()
+ return
+
+/obj/item/weapon/implantcase/dart
+ name = "glass case - 'Dart'"
+ desc = "A case containing a nanite fabricator implant."
+ icon_state = "implantcase-b"
+
+/obj/item/weapon/implantcase/dart/New()
+ src.imp = new /obj/item/weapon/implant/organ/limbaugment/dart( src )
+ ..()
+ return
+
+/obj/item/weapon/implantcase/toolkit
+ name = "glass case - 'Toolkit'"
+ desc = "A case containing a nanite fabricator implant."
+ icon_state = "implantcase-b"
+
+/obj/item/weapon/implantcase/toolkit/New()
+ src.imp = new /obj/item/weapon/implant/organ/limbaugment/upperarm( src )
+ ..()
+ return
+
+/obj/item/weapon/implantcase/medkit
+ name = "glass case - 'Toolkit'"
+ desc = "A case containing a nanite fabricator implant."
+ icon_state = "implantcase-b"
+
+/obj/item/weapon/implantcase/medkit/New()
+ src.imp = new /obj/item/weapon/implant/organ/limbaugment/upperarm/medkit( src )
+ ..()
+ return
+
+/obj/item/weapon/implantcase/surge
+ name = "glass case - 'Muscle Overclocker'"
+ desc = "A case containing a nanite fabricator implant."
+ icon_state = "implantcase-b"
+
+/obj/item/weapon/implantcase/surge/New()
+ src.imp = new /obj/item/weapon/implant/organ/limbaugment/upperarm/surge( src )
+ ..()
+ return
+
+/obj/item/weapon/implantcase/analyzer
+ name = "glass case - 'Scanner'"
+ desc = "A case containing a nanite fabricator implant."
+ icon_state = "implantcase-b"
+
+/obj/item/weapon/implantcase/analyzer/New()
+ src.imp = new /obj/item/weapon/implant/organ/limbaugment/wrist( src )
+ ..()
+ return
+
+/obj/item/weapon/implantcase/sword
+ name = "glass case - 'Scanner'"
+ desc = "A case containing a nanite fabricator implant."
+ icon_state = "implantcase-b"
+
+/obj/item/weapon/implantcase/sword/New()
+ src.imp = new /obj/item/weapon/implant/organ/limbaugment/wrist/sword( src )
+ ..()
+ return
+
+/obj/item/weapon/implantcase/sprinter
+ name = "glass case - 'Sprinter'"
+ desc = "A case containing a nanite fabricator implant."
+ icon_state = "implantcase-b"
+
+/obj/item/weapon/implantcase/sprinter/New()
+ src.imp = new /obj/item/weapon/implant/organ/pelvic( src )
+ ..()
+ return
diff --git a/code/game/objects/items/weapons/implants/implantdud.dm b/code/game/objects/items/weapons/implants/implantdud.dm
new file mode 100644
index 0000000000..110051e58d
--- /dev/null
+++ b/code/game/objects/items/weapons/implants/implantdud.dm
@@ -0,0 +1,21 @@
+/obj/item/weapon/implant/dud
+ name = "unknown implant"
+ desc = "A small device with small connector wires."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "implant"
+ initialize_loc = BP_HEAD
+ var/roundstart = TRUE
+
+/obj/item/weapon/implant/dud/torso
+ name = "unknown implant"
+ desc = "A small device with small connector wires."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "implant"
+ initialize_loc = BP_TORSO
+
+/obj/item/weapon/implant/dud/old
+ name = "old implant"
+ desc = "A small device with small connector wires."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "implant"
+ roundstart = FALSE
diff --git a/code/game/objects/items/weapons/implants/neuralbasic.dm b/code/game/objects/items/weapons/implants/neuralbasic.dm
index d744c80fde..18d472154b 100644
--- a/code/game/objects/items/weapons/implants/neuralbasic.dm
+++ b/code/game/objects/items/weapons/implants/neuralbasic.dm
@@ -1,6 +1,7 @@
/obj/item/weapon/implant/neural
name = "neural framework implant"
desc = "A small metal casing with numerous wires stemming off of it."
+ initialize_loc = BP_HEAD
var/obj/item/organ/internal/brain/my_brain = null
var/target_state = null
var/robotic_brain = FALSE
diff --git a/code/game/objects/items/weapons/material/material_weapons.dm b/code/game/objects/items/weapons/material/material_weapons.dm
index a911d1e137..3f2b1978d3 100644
--- a/code/game/objects/items/weapons/material/material_weapons.dm
+++ b/code/game/objects/items/weapons/material/material_weapons.dm
@@ -86,10 +86,13 @@
health--
check_health()
-/obj/item/weapon/material/attackby(obj/item/weapon/W, mob/user as mob)
+/obj/item/weapon/material/attackby(obj/item/weapon/W, mob/user)
if(istype(W, /obj/item/weapon/whetstone))
var/obj/item/weapon/whetstone/whet = W
repair(whet.repair_amount, whet.repair_time, user)
+ if(istype(W, /obj/item/weapon/material/sharpeningkit))
+ var/obj/item/weapon/material/sharpeningkit/SK = W
+ repair(SK.repair_amount, SK.repair_time, user)
..()
/obj/item/weapon/material/proc/check_health(var/consumed)
@@ -134,7 +137,19 @@
to_chat(user, "You can't repair \the [src].")
return
-
+/obj/item/weapon/material/proc/sharpen(var/material, var/sharpen_time, var/kit, mob/living/M)
+ if(!fragile)
+ if(health < initial(health))
+ to_chat(M, "You should repair [src] first. Try using [kit] on it.")
+ return FALSE
+ M.visible_message("[M] begins to replace parts of [src] with [kit].", "You begin to replace parts of [src] with [kit].")
+ if(do_after(usr, sharpen_time))
+ M.visible_message("[M] has finished replacing parts of [src].", "You finish replacing parts of [src].")
+ src.set_material(material)
+ return TRUE
+ else
+ to_chat(M, "You can't sharpen and re-edge [src].")
+ return FALSE
/*
Commenting this out pending rebalancing of radiation based on small objects.
@@ -162,4 +177,4 @@ Commenting this out pending rebalancing of radiation based on small objects.
TemperatureAct(150)
else
return ..()
-*/
\ No newline at end of file
+*/
diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm
index 937391737a..8df81e434c 100644
--- a/code/game/objects/items/weapons/material/shards.dm
+++ b/code/game/objects/items/weapons/material/shards.dm
@@ -63,58 +63,57 @@
/obj/item/weapon/material/shard/afterattack(var/atom/target, mob/living/carbon/human/user as mob)
var/active_hand //hand the shard is in
- var/will_break
- var/gloves_are_heavy = FALSE//this is a fucking mess
+ var/will_break = FALSE
+ var/protected_hands = FALSE //this is a fucking mess
var/break_damage = 4
var/light_glove_d = rand(2, 4)
var/no_glove_d = rand(4, 6)
- var/list/h_gloves = list(/obj/item/clothing/gloves/captain, /obj/item/clothing/gloves/cyborg,
- /obj/item/clothing/gloves/swat, /obj/item/clothing/gloves/combat,
- /obj/item/clothing/gloves/botanic_leather, /obj/item/clothing/gloves/duty,
- /obj/item/clothing/gloves/tactical, /obj/item/clothing/gloves/vox,
- /obj/item/clothing/gloves/gauntlets)
+ var/list/forbidden_gloves = list(
+ /obj/item/clothing/gloves/sterile,
+ /obj/item/clothing/gloves/knuckledusters
+ )
- if(istype(user.l_hand, src))
+ if(src == user.l_hand)
active_hand = BP_L_HAND
- else
+ else if(src == user.r_hand)
active_hand = BP_R_HAND
+ else
+ return // If it's not actually in our hands anymore, we were probably gentle with it
+
+ active_hand = (src == user.l_hand) ? BP_L_HAND : BP_R_HAND // May not actually be faster than an if-else block, but a little bit cleaner -Ater
if(prob(75))
will_break = TRUE
- else
- will_break = FALSE
- if(user.gloves && (user.gloves.body_parts_covered & HANDS))
- var/obj/item/clothing/gloves/UG = user.gloves.type
- for(var/I in h_gloves)
- if(UG == I)
- gloves_are_heavy = TRUE
- if(will_break)
- user.visible_message("[user] hit \the [target] with \the [src], shattering it!", "You shatter \the [src] in your hand!")
- playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1)
- qdel(src)
+ if(user.gloves && (user.gloves.body_parts_covered & HANDS) && istype(user.gloves, /obj/item/clothing/gloves)) // Not-gloves aren't gloves, and therefore don't protect us
+ protected_hands = TRUE // If we're wearing gloves we can probably handle it just fine
+ for(var/I in forbidden_gloves)
+ if(istype(user.gloves, I)) // forbidden_gloves is a blacklist, so if we match anything in there, our hands are not protected
+ protected_hands = FALSE
+ break
- if(gloves_are_heavy == FALSE)
- to_chat(user, "\The [src] partially cuts into your hand through your gloves as you hit \the [target]!")
- if(will_break)
- user.visible_message("[user] hit \the [target] with \the [src], shattering it!", "You shatter \the [src] in your hand!")
- user.apply_damage(light_glove_d + break_damage, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge)
- playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1)
- qdel(src)
- else
- user.apply_damage(light_glove_d, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge)
- else
+ if(user.gloves && !protected_hands)
+ to_chat(user, "\The [src] partially cuts into your hand through your gloves as you hit \the [target]!")
+ user.apply_damage(light_glove_d + will_break ? break_damage : 0, BRUTE, active_hand, 0, 0, src, src.sharp, src.edge) // Ternary to include break damage
+
+ else if(!user.gloves)
to_chat(user, "\The [src] cuts into your hand as you hit \the [target]!")
- if(will_break)
- user.visible_message("[user] hit \the [target] with \the [src], shattering it!", "You shatter \the [src] in your hand!")
- user.apply_damage(no_glove_d + break_damage, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge)
- playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1)
- qdel(src)
- else
- user.apply_damage(no_glove_d, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge)
+ user.apply_damage(no_glove_d + will_break ? break_damage : 0, BRUTE, active_hand, 0, 0, src, src.sharp, src.edge)
+
+ if(will_break && src.loc == user) // If it's not in our hand anymore
+ user.visible_message("[user] hit \the [target] with \the [src], shattering it!", "You shatter \the [src] in your hand!")
+ playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1)
+ qdel(src)
+ return
/obj/item/weapon/material/shard/Crossed(AM as mob|obj)
..()
+ //VOREStation Edit begin: SHADEKIN
+ var/mob/SK = AM
+ if(istype(SK))
+ if(SK.shadekin_phasing_check())
+ return
+ //VOREStation Edit end: SHADEKIN
if(isliving(AM))
var/mob/M = AM
diff --git a/code/game/objects/items/weapons/material/whetstone.dm b/code/game/objects/items/weapons/material/whetstone.dm
index e312680d1b..628f450e3d 100644
--- a/code/game/objects/items/weapons/material/whetstone.dm
+++ b/code/game/objects/items/weapons/material/whetstone.dm
@@ -8,4 +8,69 @@
force = 3
w_class = ITEMSIZE_SMALL
var/repair_amount = 5
- var/repair_time = 40
\ No newline at end of file
+ var/repair_time = 40
+
+/obj/item/weapon/whetstone/attackby(obj/item/I, mob/user)
+ if(istype(I, /obj/item/stack/material))
+ var/obj/item/stack/material/M = I
+ if(M.amount >= 5)
+ to_chat(user, "You begin to refine the [src] with [M]...")
+ if(do_after(user, 70))
+ M.use(5)
+ var/obj/item/SK
+ SK = new /obj/item/weapon/material/sharpeningkit(get_turf(user), M.material.name)
+ to_chat(user, "You sharpen and refine the [src] into \a [SK].")
+ qdel(src)
+ if(SK)
+ user.put_in_hands(SK)
+ else
+ to_chat(user, "You need 5 [src] to refine it into a sharpening kit.")
+
+/obj/item/weapon/material/sharpeningkit
+ name = "sharpening kit"
+ desc = "A refined, fine grit whetstone, useful for sharpening dull edges, polishing out dents, and, with extra material, replacing an edge."
+ icon = 'icons/obj/kitchen.dmi'
+ icon_state = "sharpener"
+ hitsound = 'sound/weapons/genhit3.ogg'
+ force_divisor = 0.7
+ thrown_force_divisor = 1
+ var/repair_amount = 5
+ var/repair_time = 40
+ var/sharpen_time = 100
+ var/uses = 0
+
+/obj/item/weapon/material/sharpeningkit/examine(mob/user, distance)
+ . = ..()
+ to_chat(user, "There [uses == 1 ? "is" : "are"] [uses] [material] [uses == 1 ? src.material.sheet_singular_name : src.material.sheet_plural_name] left for use.")
+/obj/item/weapon/material/sharpeningkit/Initialize()
+ . = ..()
+ setrepair()
+
+/obj/item/weapon/material/sharpeningkit/proc/setrepair()
+ repair_amount = material.hardness * 0.1
+ repair_time = material.weight * 0.5
+ sharpen_time = material.weight * 3
+
+/obj/item/weapon/material/sharpeningkit/attackby(obj/item/weapon/W, mob/user)
+ if(istype(W, /obj/item/stack/material))
+ var/obj/item/stack/material/S = W
+ if(S.material == material)
+ S.use(1)
+ uses += 1
+ to_chat(user, "You add a [S.material.name] [S.material.sheet_singular_name] to [src].")
+ return
+
+ if(istype(W, /obj/item/weapon/material))
+ if(istype(W, /obj/item/weapon/material/sharpeningkit))
+ to_chat(user, "Really? Sharpening a [W] with [src]? You goofball.")
+ return
+ var/obj/item/weapon/material/M = W
+ if(uses >= M.w_class*2)
+ if(M.sharpen(src.material.name, sharpen_time, src, user))
+ uses -= M.w_class*2
+ return
+ else
+ to_chat(user, "Not enough material to sharpen [M]. You need [M.w_class*2] [M.material.sheet_plural_name].")
+ return
+ else
+ to_chat(user, "You can't sharpen [W] with [src]!")
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index d935d4eaa2..2c4fd9949b 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -11,17 +11,26 @@
var/lrange = 2
var/lpower = 2
var/lcolor = "#0099FF"
-
+ var/colorable = FALSE
+ var/rainbow = FALSE
// If it uses energy.
var/use_cell = FALSE
var/hitcost = 120
var/obj/item/weapon/cell/bcell = null
var/cell_type = /obj/item/weapon/cell/device
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi',
+ slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi',
+ )
/obj/item/weapon/melee/energy/proc/activate(mob/living/user)
if(active)
return
active = 1
+ if(rainbow)
+ item_state = "[icon_state]_blade_rainbow"
+ else
+ item_state = "[icon_state]_blade"
embed_chance = active_embed_chance
force = active_force
throwforce = active_throwforce
@@ -29,12 +38,14 @@
edge = 1
w_class = active_w_class
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
+ update_icon()
set_light(lrange, lpower, lcolor)
/obj/item/weapon/melee/energy/proc/deactivate(mob/living/user)
if(!active)
return
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
+ item_state = "[icon_state]"
active = 0
embed_chance = initial(embed_chance)
force = initial(force)
@@ -42,6 +53,7 @@
sharp = initial(sharp)
edge = initial(edge)
w_class = initial(w_class)
+ update_icon()
set_light(0,0)
/obj/item/weapon/melee/energy/proc/use_charge(var/cost)
@@ -102,6 +114,13 @@
return ..()
/obj/item/weapon/melee/energy/attackby(obj/item/weapon/W, mob/user)
+ if(istype(W, /obj/item/device/multitool) && colorable && !active)
+ if(!rainbow)
+ rainbow = TRUE
+ else
+ rainbow = FALSE
+ to_chat(user, "You manipulate the color controller in [src].")
+ update_icon()
if(use_cell)
if(istype(W, cell_type))
if(!bcell)
@@ -125,13 +144,52 @@
/obj/item/weapon/melee/energy/get_cell()
return bcell
+/obj/item/weapon/melee/energy/update_icon()
+ . = ..()
+ var/mutable_appearance/blade_overlay = mutable_appearance(icon, "[icon_state]_blade")
+ if(colorable)
+ blade_overlay.color = lcolor
+ if(rainbow || !colorable)
+ blade_overlay = mutable_appearance(icon, "[icon_state]_blade_rainbow")
+ blade_overlay.color = "FFFFFF"
+ cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
+ if(active)
+ add_overlay(blade_overlay)
+ if(istype(usr,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = usr
+ H.update_inv_l_hand()
+ H.update_inv_r_hand()
+
+
+
+
+/obj/item/weapon/melee/energy/AltClick(mob/living/user)
+ if(!colorable) //checks if is not colorable
+ return
+ if(!in_range(src, user)) //Basic checks to prevent abuse
+ return
+ if(user.incapacitated() || !istype(user))
+ to_chat(user, "You can't do that right now!")
+ return
+
+ if(alert("Are you sure you want to recolor your blade?", "Confirm Recolor", "Yes", "No") == "Yes")
+ var/energy_color_input = input(usr,"","Choose Energy Color",lcolor) as color|null
+ if(energy_color_input)
+ lcolor = sanitize_hexcolor(energy_color_input)
+ update_icon()
+
+/obj/item/weapon/melee/energy/examine(mob/user)
+ ..()
+ to_chat(user, "Alt-click to recolor it.")
+
/*
* Energy Axe
*/
/obj/item/weapon/melee/energy/axe
name = "energy axe"
desc = "An energised battle axe."
- icon_state = "axe0"
+ icon_state = "eaxe"
+ item_state = "eaxe"
//active_force = 150 //holy...
active_force = 60
active_throwforce = 35
@@ -152,13 +210,11 @@
/obj/item/weapon/melee/energy/axe/activate(mob/living/user)
..()
damtype = SEARING
- icon_state = "axe1"
to_chat(user, "\The [src] is now energised.")
/obj/item/weapon/melee/energy/axe/deactivate(mob/living/user)
..()
damtype = BRUTE
- icon_state = initial(icon_state)
to_chat(user, "\The [src] is de-energised. It's just a regular axe now.")
/obj/item/weapon/melee/energy/axe/suicide_act(mob/user)
@@ -187,7 +243,8 @@
color
name = "energy sword"
desc = "May the force be within you."
- icon_state = "sword0"
+ icon_state = "esword"
+ item_state = "esword"
active_force = 30
active_throwforce = 20
active_w_class = ITEMSIZE_LARGE
@@ -200,9 +257,8 @@
origin_tech = list(TECH_MAGNET = 3, TECH_ILLEGAL = 4)
sharp = 1
edge = 1
- var/blade_color
- var/random_color = TRUE
- var/active_state = "sword"
+ colorable = TRUE
+
projectile_parry_chance = 65
@@ -211,30 +267,6 @@
if(!istype(loc,/mob))
deactivate(user)
-/obj/item/weapon/melee/energy/sword/New()
- if(random_color)
- blade_color = pick("red","blue","green","purple","white")
- lcolor = blade_color
-
-/obj/item/weapon/melee/energy/sword/green/New()
- blade_color = "green"
- lcolor = "#008000"
-
-/obj/item/weapon/melee/energy/sword/red/New()
- blade_color = "red"
- lcolor = "#FF0000"
-
-/obj/item/weapon/melee/energy/sword/blue/New()
- blade_color = "blue"
- lcolor = "#0000FF"
-
-/obj/item/weapon/melee/energy/sword/purple/New()
- blade_color = "purple"
- lcolor = "#800080"
-
-/obj/item/weapon/melee/energy/sword/white/New()
- blade_color = "white"
- lcolor = "#FFFFFF"
/obj/item/weapon/melee/energy/sword/activate(mob/living/user)
if(!active)
@@ -242,14 +274,13 @@
..()
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- icon_state = "[active_state][blade_color]"
+
/obj/item/weapon/melee/energy/sword/deactivate(mob/living/user)
if(active)
to_chat(user, "\The [src] deactivates!")
..()
attack_verb = list()
- icon_state = initial(icon_state)
/obj/item/weapon/melee/energy/sword/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(active && default_parry_check(user, attacker, damage_source) && prob(60))
@@ -284,11 +315,10 @@
/obj/item/weapon/melee/energy/sword/pirate
name = "energy cutlass"
desc = "Arrrr matey."
- icon_state = "cutlass0"
+ icon_state = "cutlass"
+ item_state = "cutlass"
+ colorable = TRUE
-/obj/item/weapon/melee/energy/sword/pirate/activate(mob/living/user)
- ..()
- icon_state = "cutlass1"
/*
*Ionic Rapier
@@ -300,8 +330,8 @@
description_info = "This is a dangerous melee weapon that will deliver a moderately powerful electromagnetic pulse to whatever it strikes. \
Striking a lesser robotic entity will compel it to attack you, as well. It also does extra burn damage to robotic entities, but it does \
very little damage to purely organic targets."
- icon_state = "ionic_rapier0"
- random_color = FALSE
+ icon_state = "ionrapier"
+ item_state = "ionrapier"
active_force = 5
active_throwforce = 3
active_embed_chance = 0
@@ -312,7 +342,6 @@
lrange = 2
lpower = 2
lcolor = "#0000FF"
- active_state = "ionic_rapier"
projectile_parry_chance = 30 // It's not specifically designed for cutting and slashing, but it can still, maybe, save your life.
/obj/item/weapon/melee/energy/sword/ionic_rapier/afterattack(var/atom/movable/AM, var/mob/living/user, var/proximity)
@@ -350,6 +379,7 @@
active_force = 25
armor_penetration = 25
projectile_parry_chance = 40
+ colorable = TRUE
hitcost = 75
@@ -357,15 +387,14 @@
..()
bcell = new/obj/item/weapon/cell/device/weapon(src)
-/*
- *Energy Blade
- */
+//Energy Blade (ninja uses this)
//Can't be activated or deactivated, so no reason to be a subtype of energy
/obj/item/weapon/melee/energy/blade
name = "energy blade"
desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal."
icon_state = "blade"
+ item_state = "blade"
force = 40 //Normal attacks deal very high damage - about the same as wielded fire axe
armor_penetration = 100
sharp = 1
@@ -448,49 +477,27 @@
return 1
-/*
- *Energy Spear
- */
+//Energy Spear
/obj/item/weapon/melee/energy/spear
- name = "energy spear"
- desc = "Concentrated energy forming a sharp tip at the end of a long rod."
- icon_state = "espear0"
- armor_penetration = 75
- sharp = 1
- edge = 1
- force = 5
- throwforce = 10
- throw_speed = 7
- throw_range = 11
- reach = 2
- w_class = ITEMSIZE_LARGE
- active_force = 25
- active_throwforce = 30
- active_w_class = ITEMSIZE_HUGE
- var/random_color = TRUE
- var/tip_color = ""
- var/active_state = "espear"
+ name = "energy spear"
+ desc = "Concentrated energy forming a sharp tip at the end of a long rod."
+ icon_state = "espear"
+ armor_penetration = 75
+ sharp = 1
+ edge = 1
+ force = 5
+ throwforce = 10
+ throw_speed = 7
+ throw_range = 11
+ reach = 2
+ w_class = ITEMSIZE_LARGE
+ active_force = 25
+ active_throwforce = 30
+ active_w_class = ITEMSIZE_HUGE
+ colorable = TRUE
-/obj/item/weapon/melee/energy/spear/New()
- if(random_color)
- tip_color = pick("red","blue","green","purple")
- lcolor = tip_color
-/obj/item/weapon/melee/energy/spear/green/New()
- tip_color = "green"
- lcolor = "#008000"
-
-/obj/item/weapon/melee/energy/spear/red/New()
- tip_color = "red"
- lcolor = "#FF0000"
-
-/obj/item/weapon/melee/energy/spear/blue/New()
- tip_color = "blue"
- lcolor = "#0000FF"
-
-/obj/item/weapon/melee/energy/spear/purple/New()
- tip_color = "purple"
lcolor = "#800080"
/obj/item/weapon/melee/energy/spear/activate(mob/living/user)
@@ -498,7 +505,6 @@
to_chat(user, "\The [src] is now energised.")
..()
attack_verb = list("jabbed", "stabbed", "impaled")
- icon_state = "[active_state]-[tip_color]"
/obj/item/weapon/melee/energy/spear/deactivate(mob/living/user)
@@ -506,7 +512,6 @@
to_chat(user, "\The [src] deactivates!")
..()
attack_verb = list("whacked", "beat", "slapped", "thonked")
- icon_state = "espear0"
/obj/item/weapon/melee/energy/spear/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(active && default_parry_check(user, attacker, damage_source) && prob(50))
@@ -516,4 +521,4 @@
spark_system.start()
playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1)
return 1
- return 0
\ No newline at end of file
+ return 0
diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm
index 5ea586f43d..6d3310cdc4 100644
--- a/code/game/objects/items/weapons/shields.dm
+++ b/code/game/objects/items/weapons/shields.dm
@@ -115,7 +115,8 @@
name = "energy combat shield"
desc = "A shield capable of stopping most projectile and melee attacks. It can be retracted, expanded, and stored anywhere."
icon = 'icons/obj/weapons.dmi'
- icon_state = "eshield0" // eshield1 for expanded
+ icon_state = "eshield"
+ item_state = "eshield"
slot_flags = SLOT_EARS
flags = NOCONDUCT
force = 3.0
@@ -123,9 +124,16 @@
throw_speed = 1
throw_range = 4
w_class = ITEMSIZE_SMALL
+ var/lrange = 1.5
+ var/lpower = 1.5
+ var/lcolor = "#006AFF"
origin_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 3, TECH_ILLEGAL = 4)
attack_verb = list("shoved", "bashed")
var/active = 0
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi',
+ slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi',
+ )
/obj/item/weapon/shield/energy/handle_shield(mob/user)
if(!active)
@@ -175,11 +183,33 @@
return
/obj/item/weapon/shield/energy/update_icon()
- icon_state = "eshield[active]"
+ var/mutable_appearance/blade_overlay = mutable_appearance(icon, "[icon_state]_blade")
+ if(lcolor)
+ blade_overlay.color = lcolor
+ cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
if(active)
- set_light(1.5, 1.5, "#006AFF")
+ add_overlay(blade_overlay)
+ item_state = "[icon_state]_blade"
+ set_light(lrange, lpower, lcolor)
else
set_light(0)
+ item_state = "[icon_state]"
+
+/obj/item/weapon/shield/energy/AltClick(mob/living/user)
+ if(!in_range(src, user)) //Basic checks to prevent abuse
+ return
+ if(user.incapacitated() || !istype(user))
+ to_chat(user, "You can't do that right now!")
+ return
+ if(alert("Are you sure you want to recolor your shield?", "Confirm Recolor", "Yes", "No") == "Yes")
+ var/energy_color_input = input(usr,"","Choose Energy Color",lcolor) as color|null
+ if(energy_color_input)
+ lcolor = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+
+/obj/item/weapon/shield/energy/examine(mob/user)
+ ..()
+ to_chat(user, "Alt-click to recolor it.")
/obj/item/weapon/shield/riot/tele
name = "telescopic shield"
@@ -226,4 +256,4 @@
H.update_inv_r_hand()
add_fingerprint(user)
- return
\ No newline at end of file
+ return
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 18c60af449..f5ea4ead6f 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -422,3 +422,10 @@
H.visible_message("\The [src] decides not to unpack \the [src]!", \
"You decide not to unpack \the [src]!")
return
+
+/obj/item/weapon/storage/backpack/satchel/ranger
+ name = "ranger satchel"
+ desc = "A satchel designed for the Go Go ERT Rangers series to allow for slightly bigger carry capacity for the ERT-Rangers.\
+ Unlike the show claims, it is not a phoron-enhanced satchel of holding with plot-relevant content."
+ icon = 'icons/obj/clothing/ranger.dmi'
+ icon_state = "ranger_satchel"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/backpack_vr.dm b/code/game/objects/items/weapons/storage/backpack_vr.dm
index d836d23581..5e121a2b35 100644
--- a/code/game/objects/items/weapons/storage/backpack_vr.dm
+++ b/code/game/objects/items/weapons/storage/backpack_vr.dm
@@ -128,4 +128,9 @@
/obj/item/weapon/storage/backpack/dufflebag/fluff //Black dufflebag without syndie buffs.
name = "plain black dufflebag"
desc = "A large dufflebag for holding extra tactical supplies."
- icon_state = "duffle_syndie"
\ No newline at end of file
+ icon_state = "duffle_syndie"
+
+/obj/item/weapon/storage/backpack
+ sprite_sheets = list(
+ SPECIES_TESHARI = 'icons/mob/species/seromi/back.dmi',
+ SPECIES_WEREBEAST = 'icons/mob/species/werebeast/back.dmi')
diff --git a/code/game/objects/items/weapons/storage/bags_vr.dm b/code/game/objects/items/weapons/storage/bags_vr.dm
new file mode 100644
index 0000000000..6f9d0a0b15
--- /dev/null
+++ b/code/game/objects/items/weapons/storage/bags_vr.dm
@@ -0,0 +1,2 @@
+/obj/item/weapon/storage/bag/chemistry
+ slot_flags = null
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index f9a7d1e608..ddb8c489f6 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -435,3 +435,8 @@
icon_state = "fannypack_yellow"
item_state = "fannypack_yellow"
+/obj/item/weapon/storage/belt/ranger
+ name = "ranger belt"
+ desc = "The fancy utility-belt holding the tools, cuffs and gadgets of the Go Go ERT-Rangers. The belt buckle is not real phoron, but it is still surprisingly comfortable to wear."
+ icon = 'icons/obj/clothing/ranger.dmi'
+ icon_state = "ranger_belt"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/belt_vr.dm b/code/game/objects/items/weapons/storage/belt_vr.dm
new file mode 100644
index 0000000000..2e0829c153
--- /dev/null
+++ b/code/game/objects/items/weapons/storage/belt_vr.dm
@@ -0,0 +1,4 @@
+/obj/item/weapon/storage/belt
+ sprite_sheets = list(
+ SPECIES_TESHARI = 'icons/mob/species/seromi/belt.dmi',
+ SPECIES_WEREBEAST = 'icons/mob/species/werebeast/belt.dmi')
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/boxes_vr.dm b/code/game/objects/items/weapons/storage/boxes_vr.dm
index f2cbd06aed..8feee76bdd 100644
--- a/code/game/objects/items/weapons/storage/boxes_vr.dm
+++ b/code/game/objects/items/weapons/storage/boxes_vr.dm
@@ -33,7 +33,7 @@
starts_with = list(/obj/item/device/encryptionkey/headset_com = 7)
/obj/item/weapon/storage/box/servicekeys
- name = "box of command keys"
+ name = "box of service keys"
desc = "A box full of service keys, for the HoP to give out as necessary."
starts_with = list(/obj/item/device/encryptionkey/headset_service = 7)
diff --git a/code/game/objects/items/weapons/storage/fancy_yw.dm b/code/game/objects/items/weapons/storage/fancy_yw.dm
new file mode 100644
index 0000000000..2da08ec0a7
--- /dev/null
+++ b/code/game/objects/items/weapons/storage/fancy_yw.dm
@@ -0,0 +1,8 @@
+/obj/item/weapon/storage/fancy/cigarettes/yw
+ icon = 'icons/obj/cigarettes_yw.dmi'
+
+/obj/item/weapon/storage/fancy/cigarettes/yw/mauser
+ name = "\improper pack of f13 cigarettes"
+ desc = "A packet of 6 f13 brand cigarettes, they somehow have a faint flavor of gunpowder... And mustard gas."
+ icon_state = "MauserPacket"
+ brand = "\improper Mauser"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/mre.dm b/code/game/objects/items/weapons/storage/mre.dm
index c3adc484e0..582af52f43 100644
--- a/code/game/objects/items/weapons/storage/mre.dm
+++ b/code/game/objects/items/weapons/storage/mre.dm
@@ -185,6 +185,20 @@ MRE Stuff
/obj/random/mre/sauce/crayon
)
+/obj/item/weapon/storage/mre/menu13
+ name = "medical MRE"
+ meal_desc = "This one is menu 13, vitamin paste & dessert. Only for emergencies."
+ icon_state = "crayonmre"
+ starts_with = list(
+ /obj/item/weapon/reagent_containers/food/snacks/liquidvitamin,
+ /obj/item/weapon/reagent_containers/food/snacks/liquidvitamin,
+ /obj/item/weapon/reagent_containers/food/snacks/liquidvitamin,
+ /obj/item/weapon/reagent_containers/food/snacks/liquidprotein,
+ /obj/random/mre/drink,
+ /obj/item/weapon/storage/mrebag/dessert,
+ /obj/item/weapon/material/kitchen/utensil/spoon/plastic
+ )
+
/obj/item/weapon/storage/mre/random
meal_desc = "The menu label is faded out."
starts_with = list(
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index 4291752587..9624a85ca2 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -93,6 +93,42 @@
O.update()
. = ..()
+/obj/item/weapon/storage/box/syndie_kit/imp_aug
+ name = "boxed augment implant (with injector)"
+ var/case_type = /obj/item/weapon/implantcase/shades
+
+/obj/item/weapon/storage/box/syndie_kit/imp_aug/Initialize()
+ new /obj/item/weapon/implanter(src)
+ new case_type(src)
+ . = ..()
+
+/obj/item/weapon/storage/box/syndie_kit/imp_aug/taser
+ case_type = /obj/item/weapon/implantcase/taser
+
+/obj/item/weapon/storage/box/syndie_kit/imp_aug/laser
+ case_type = /obj/item/weapon/implantcase/laser
+
+/obj/item/weapon/storage/box/syndie_kit/imp_aug/dart
+ case_type = /obj/item/weapon/implantcase/dart
+
+/obj/item/weapon/storage/box/syndie_kit/imp_aug/toolkit
+ case_type = /obj/item/weapon/implantcase/toolkit
+
+/obj/item/weapon/storage/box/syndie_kit/imp_aug/medkit
+ case_type = /obj/item/weapon/implantcase/medkit
+
+/obj/item/weapon/storage/box/syndie_kit/imp_aug/surge
+ case_type = /obj/item/weapon/implantcase/surge
+
+/obj/item/weapon/storage/box/syndie_kit/imp_aug/analyzer
+ case_type = /obj/item/weapon/implantcase/analyzer
+
+/obj/item/weapon/storage/box/syndie_kit/imp_aug/sword
+ case_type = /obj/item/weapon/implantcase/sword
+
+/obj/item/weapon/storage/box/syndie_kit/imp_aug/sprinter
+ case_type = /obj/item/weapon/implantcase/sprinter
+
/obj/item/weapon/storage/box/syndie_kit/space
name = "boxed space suit and helmet"
starts_with = list(
diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm
index f011cd917b..292f047f0f 100644
--- a/code/game/objects/items/weapons/surgery_tools.dm
+++ b/code/game/objects/items/weapons/surgery_tools.dm
@@ -128,6 +128,15 @@
icon_state = "scalpel_manager_on"
force = 7.5
+/obj/item/weapon/surgical/scalpel/ripper
+ name = "organ pincers"
+ desc = "A horrifying bladed tool with a large metal spike in its center. The tool is used for rapidly removing organs from hopefully willing patients."
+ icon_state = "organ_ripper"
+ item_state = "bone_setter"
+ force = 15.0
+ toolspeed = 0.75
+ origin_tech = list(TECH_MATERIAL = 5, TECH_BIO = 3, TECH_ILLEGAL = 2)
+
/*
* Circular Saw
*/
@@ -147,6 +156,19 @@
sharp = 1
edge = 1
+/obj/item/weapon/surgical/circular_saw/manager
+ name = "energetic bone diverter"
+ desc = "For heavy duty cutting (and sealing), with science!"
+ icon_state = "adv_saw"
+ item_state = "saw3"
+ hitsound = 'sound/weapons/emitter2.ogg'
+ damtype = SEARING
+ w_class = ITEMSIZE_LARGE
+ origin_tech = list(TECH_BIO = 4, TECH_MATERIAL = 6, TECH_MAGNET = 6)
+ matter = list(DEFAULT_WALL_MATERIAL = 12500)
+ attack_verb = list("attacked", "slashed", "seared", "cut")
+ toolspeed = 0.75
+
//misc, formerly from code/defines/weapons.dm
/obj/item/weapon/surgical/bonegel
name = "bone gel"
@@ -245,4 +267,4 @@
/obj/item/weapon/surgical/bone_clamp/alien
icon = 'icons/obj/abductor.dmi'
- toolspeed = 0.75
\ No newline at end of file
+ toolspeed = 0.75
diff --git a/code/game/objects/items/weapons/tools/crowbar.dm b/code/game/objects/items/weapons/tools/crowbar.dm
index 73b62f0741..fab0a6fb98 100644
--- a/code/game/objects/items/weapons/tools/crowbar.dm
+++ b/code/game/objects/items/weapons/tools/crowbar.dm
@@ -64,7 +64,7 @@
/obj/item/weapon/tool/crowbar/hybrid/is_crowbar()
if(prob(10))
var/turf/T = get_turf(src)
- radiation_repository.radiate(get_turf(src), 5)
+ SSradiation.radiate(get_turf(src), 5)
T.visible_message("\The [src] shudders!")
return FALSE
return TRUE
diff --git a/code/game/objects/items/weapons/tools/screwdriver.dm b/code/game/objects/items/weapons/tools/screwdriver.dm
index a9bdd6cee8..1969987ff9 100644
--- a/code/game/objects/items/weapons/tools/screwdriver.dm
+++ b/code/game/objects/items/weapons/tools/screwdriver.dm
@@ -108,7 +108,7 @@
/obj/item/weapon/tool/screwdriver/hybrid/is_screwdriver()
if(prob(10))
var/turf/T = get_turf(src)
- radiation_repository.radiate(get_turf(src), 5)
+ SSradiation.radiate(get_turf(src), 5)
T.visible_message("\The [src] shudders!")
return FALSE
return TRUE
diff --git a/code/game/objects/items/weapons/tools/wirecutters.dm b/code/game/objects/items/weapons/tools/wirecutters.dm
index 181c786c4c..4d61609db4 100644
--- a/code/game/objects/items/weapons/tools/wirecutters.dm
+++ b/code/game/objects/items/weapons/tools/wirecutters.dm
@@ -88,7 +88,7 @@
/obj/item/weapon/tool/wirecutters/hybrid/is_wirecutter()
if(prob(10))
var/turf/T = get_turf(src)
- radiation_repository.radiate(get_turf(src), 5)
+ SSradiation.radiate(get_turf(src), 5)
T.visible_message("\The [src] shudders!")
return FALSE
return TRUE
diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/weapons/tools/wrench.dm
index 652e32cf75..3f02a2f8b3 100644
--- a/code/game/objects/items/weapons/tools/wrench.dm
+++ b/code/game/objects/items/weapons/tools/wrench.dm
@@ -44,7 +44,7 @@
/obj/item/weapon/tool/wrench/hybrid/is_wrench()
if(prob(10))
var/turf/T = get_turf(src)
- radiation_repository.radiate(get_turf(src), 5)
+ SSradiation.radiate(get_turf(src), 5)
T.visible_message("\The [src] shudders!")
return FALSE
return TRUE
diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm
index 1e63201f4e..1febf6b1ae 100644
--- a/code/game/objects/items/weapons/traps.dm
+++ b/code/game/objects/items/weapons/traps.dm
@@ -106,6 +106,12 @@
can_buckle = initial(can_buckle)
/obj/item/weapon/beartrap/Crossed(AM as mob|obj)
+ //VOREStation Edit begin: SHADEKIN
+ var/mob/SK = AM
+ if(istype(SK))
+ if(SK.shadekin_phasing_check())
+ return
+ //VOREStation Edit end: SHADEKIN
if(deployed && isliving(AM))
var/mob/living/L = AM
if(L.m_intent == "run")
diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm
index 20fd025ea9..5c606422d7 100644
--- a/code/game/objects/structures/catwalk.dm
+++ b/code/game/objects/structures/catwalk.dm
@@ -87,6 +87,12 @@
return ..()
/obj/structure/catwalk/Crossed()
+ //VOREStation Edit begin: SHADEKIN
+ var/mob/SK = usr
+ if(istype(SK))
+ if(SK.shadekin_phasing_check())
+ return
+ //VOREStation Edit end: SHADEKIN
. = ..()
if(isliving(usr))
playsound(src, pick('sound/effects/footstep/catwalk1.ogg', 'sound/effects/footstep/catwalk2.ogg', 'sound/effects/footstep/catwalk3.ogg', 'sound/effects/footstep/catwalk4.ogg', 'sound/effects/footstep/catwalk5.ogg'), 25, 1)
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 072dd43de6..aab0ecf7f0 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -38,7 +38,7 @@
if(!total_radiation)
return
- radiation_repository.radiate(src, total_radiation)
+ SSradiation.radiate(src, total_radiation)
return total_radiation
@@ -62,7 +62,7 @@
/obj/structure/girder/update_icon()
if(anchored)
- icon_state = "girder"
+ icon_state = initial(icon_state)
else
icon_state = "displaced"
@@ -320,6 +320,7 @@
name = "column"
icon= 'icons/obj/cult.dmi'
icon_state= "cultgirder"
+ max_health = 250
health = 250
cover = 70
girder_material = "cult"
@@ -354,6 +355,13 @@
new /obj/effect/decal/remains/human(get_turf(src))
dismantle()
+/obj/structure/girder/resin
+ name = "soft girder"
+ icon_state = "girder_resin"
+ max_health = 225
+ health = 225
+ cover = 60
+ girder_material = "resin"
/obj/structure/girder/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
var/turf/simulated/T = get_turf(src)
diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm
index 431ef0cdbb..60b94841ea 100644
--- a/code/game/objects/structures/simple_doors.dm
+++ b/code/game/objects/structures/simple_doors.dm
@@ -196,7 +196,7 @@
/obj/structure/simple_door/process()
if(!material.radioactivity)
return
- radiation_repository.radiate(src, round(material.radioactivity/3))
+ SSradiation.radiate(src, round(material.radioactivity/3))
/obj/structure/simple_door/iron/New(var/newloc,var/material_name)
..(newloc, "iron")
diff --git a/code/game/sound.dm b/code/game/sound.dm
index b1f0c32f66..cd3b140bd9 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -137,6 +137,46 @@
if ("button") soundin = pick('sound/machines/button1.ogg','sound/machines/button2.ogg','sound/machines/button3.ogg','sound/machines/button4.ogg')
if ("switch") soundin = pick('sound/machines/switch1.ogg','sound/machines/switch2.ogg','sound/machines/switch3.ogg','sound/machines/switch4.ogg')
if ("casing_sound") soundin = pick('sound/weapons/casingfall1.ogg','sound/weapons/casingfall2.ogg','sound/weapons/casingfall3.ogg')
+ //VORESTATION EDIT - vore sounds for better performance
+ if ("hunger_sounds") soundin = pick('sound/vore/growl1.ogg','sound/vore/growl2.ogg','sound/vore/growl3.ogg','sound/vore/growl4.ogg','sound/vore/growl5.ogg')
+
+ if("classic_digestion_sounds") soundin = pick(
+ 'sound/vore/digest1.ogg','sound/vore/digest2.ogg','sound/vore/digest3.ogg','sound/vore/digest4.ogg',
+ 'sound/vore/digest5.ogg','sound/vore/digest6.ogg','sound/vore/digest7.ogg','sound/vore/digest8.ogg',
+ 'sound/vore/digest9.ogg','sound/vore/digest10.ogg','sound/vore/digest11.ogg','sound/vore/digest12.ogg')
+ if("classic_death_sounds") soundin = pick(
+ 'sound/vore/death1.ogg','sound/vore/death2.ogg','sound/vore/death3.ogg','sound/vore/death4.ogg','sound/vore/death5.ogg',
+ 'sound/vore/death6.ogg','sound/vore/death7.ogg','sound/vore/death8.ogg','sound/vore/death9.ogg','sound/vore/death10.ogg')
+ if("classic_struggle_sounds") soundin = pick('sound/vore/squish1.ogg','sound/vore/squish2.ogg','sound/vore/squish3.ogg','sound/vore/squish4.ogg')
+
+ if("fancy_prey_struggle") soundin = pick(
+ 'sound/vore/sunesound/prey/struggle_01.ogg','sound/vore/sunesound/prey/struggle_02.ogg','sound/vore/sunesound/prey/struggle_03.ogg',
+ 'sound/vore/sunesound/prey/struggle_04.ogg','sound/vore/sunesound/prey/struggle_05.ogg')
+ if("fancy_digest_pred") soundin = pick(
+ 'sound/vore/sunesound/pred/digest_01.ogg','sound/vore/sunesound/pred/digest_02.ogg','sound/vore/sunesound/pred/digest_03.ogg',
+ 'sound/vore/sunesound/pred/digest_04.ogg','sound/vore/sunesound/pred/digest_05.ogg','sound/vore/sunesound/pred/digest_06.ogg',
+ 'sound/vore/sunesound/pred/digest_07.ogg','sound/vore/sunesound/pred/digest_08.ogg','sound/vore/sunesound/pred/digest_09.ogg',
+ 'sound/vore/sunesound/pred/digest_10.ogg','sound/vore/sunesound/pred/digest_11.ogg','sound/vore/sunesound/pred/digest_12.ogg',
+ 'sound/vore/sunesound/pred/digest_13.ogg','sound/vore/sunesound/pred/digest_14.ogg','sound/vore/sunesound/pred/digest_15.ogg',
+ 'sound/vore/sunesound/pred/digest_16.ogg','sound/vore/sunesound/pred/digest_17.ogg','sound/vore/sunesound/pred/digest_18.ogg')
+ if("fancy_death_pred") soundin = pick(
+ 'sound/vore/sunesound/pred/death_01.ogg','sound/vore/sunesound/pred/death_02.ogg','sound/vore/sunesound/pred/death_03.ogg',
+ 'sound/vore/sunesound/pred/death_04.ogg','sound/vore/sunesound/pred/death_05.ogg','sound/vore/sunesound/pred/death_06.ogg',
+ 'sound/vore/sunesound/pred/death_07.ogg','sound/vore/sunesound/pred/death_08.ogg','sound/vore/sunesound/pred/death_09.ogg',
+ 'sound/vore/sunesound/pred/death_10.ogg')
+ if("fancy_digest_prey") soundin = pick(
+ 'sound/vore/sunesound/prey/digest_01.ogg','sound/vore/sunesound/prey/digest_02.ogg','sound/vore/sunesound/prey/digest_03.ogg',
+ 'sound/vore/sunesound/prey/digest_04.ogg','sound/vore/sunesound/prey/digest_05.ogg','sound/vore/sunesound/prey/digest_06.ogg',
+ 'sound/vore/sunesound/prey/digest_07.ogg','sound/vore/sunesound/prey/digest_08.ogg','sound/vore/sunesound/prey/digest_09.ogg',
+ 'sound/vore/sunesound/prey/digest_10.ogg','sound/vore/sunesound/prey/digest_11.ogg','sound/vore/sunesound/prey/digest_12.ogg',
+ 'sound/vore/sunesound/prey/digest_13.ogg','sound/vore/sunesound/prey/digest_14.ogg','sound/vore/sunesound/prey/digest_15.ogg',
+ 'sound/vore/sunesound/prey/digest_16.ogg','sound/vore/sunesound/prey/digest_17.ogg','sound/vore/sunesound/prey/digest_18.ogg')
+ if("fancy_death_prey") soundin = pick(
+ 'sound/vore/sunesound/prey/death_01.ogg','sound/vore/sunesound/prey/death_02.ogg','sound/vore/sunesound/prey/death_03.ogg',
+ 'sound/vore/sunesound/prey/death_04.ogg','sound/vore/sunesound/prey/death_05.ogg','sound/vore/sunesound/prey/death_06.ogg',
+ 'sound/vore/sunesound/prey/death_07.ogg','sound/vore/sunesound/prey/death_08.ogg','sound/vore/sunesound/prey/death_09.ogg',
+ 'sound/vore/sunesound/prey/death_10.ogg')
+ //END VORESTATION EDIT
return soundin
//Are these even used?
diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm
index bd6adfe32f..676ad392f0 100644
--- a/code/game/turfs/simulated/wall_attacks.dm
+++ b/code/game/turfs/simulated/wall_attacks.dm
@@ -7,7 +7,7 @@
if(can_open == WALL_OPENING)
return
- radiation_repository.resistance_cache.Remove(src)
+ SSradiation.resistance_cache.Remove(src)
if(density)
can_open = WALL_OPENING
@@ -93,8 +93,9 @@
if(..()) return 1
if(!can_open)
- to_chat(user, "You push the wall, but nothing happens.")
- playsound(src, 'sound/weapons/Genhit.ogg', 25, 1)
+ if(!material.wall_touch_special(src, user))
+ to_chat(user, "You push the wall, but nothing happens.")
+ playsound(src, 'sound/weapons/Genhit.ogg', 25, 1)
else
toggle_open(user)
return 0
diff --git a/code/game/turfs/simulated/wall_icon.dm b/code/game/turfs/simulated/wall_icon.dm
index b8a0980de4..f277ea79f5 100644
--- a/code/game/turfs/simulated/wall_icon.dm
+++ b/code/game/turfs/simulated/wall_icon.dm
@@ -26,7 +26,7 @@
else if(material.opacity < 0.5 && opacity)
set_light(0)
- radiation_repository.resistance_cache.Remove(src)
+ SSradiation.resistance_cache.Remove(src)
update_connections(1)
update_icon()
diff --git a/code/game/turfs/simulated/wall_types.dm b/code/game/turfs/simulated/wall_types.dm
index b7dff4c4c5..5f0fb77f62 100644
--- a/code/game/turfs/simulated/wall_types.dm
+++ b/code/game/turfs/simulated/wall_types.dm
@@ -59,6 +59,9 @@
/turf/simulated/wall/snowbrick/New(var/newloc)
..(newloc,"packed snow")
+/turf/simulated/wall/resin/New(var/newloc)
+ ..(newloc,"resin",null,"resin")
+
// Kind of wondering if this is going to bite me in the butt.
/turf/simulated/wall/skipjack/New(var/newloc)
..(newloc,"alienalloy")
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 1847767083..bf5f711b20 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -274,7 +274,7 @@
if(!total_radiation)
return
- radiation_repository.radiate(src, total_radiation)
+ SSradiation.radiate(src, total_radiation)
return total_radiation
/turf/simulated/wall/proc/burn(temperature)
diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm
index 8a0d7852f5..cb3496a96b 100644
--- a/code/game/turfs/turf_changing.dm
+++ b/code/game/turfs/turf_changing.dm
@@ -28,7 +28,7 @@
if(N == /turf/space)
var/turf/below = GetBelow(src)
- if(istype(below) && (air_master.has_valid_zone(below) || air_master.has_valid_zone(src)) && !istype(below, /turf/unsimulated/wall)) // VOREStation Edit: Weird open space
+ if(istype(below) && (air_master.has_valid_zone(below) || air_master.has_valid_zone(src)) && (!istype(below, /turf/unsimulated/wall) && !istype(below, /turf/simulated/sky))) // VOREStation Edit: Weird open space
N = /turf/simulated/open
var/obj/fire/old_fire = fire
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index 0c6fa0fed7..b75de6685e 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -9,28 +9,28 @@
if(!mob) return
if(IsGuestKey(key))
- src << "Guests may not use OOC."
+ to_chat(src, "Guests may not use OOC.")
return
msg = sanitize(msg)
if(!msg) return
if(!is_preference_enabled(/datum/client_preference/show_ooc))
- src << "You have OOC muted."
+ to_chat(src, "You have OOC muted.")
return
if(!holder)
if(!config.ooc_allowed)
- src << "OOC is globally muted."
+ to_chat(src, "OOC is globally muted.")
return
if(!config.dooc_allowed && (mob.stat == DEAD))
usr << "OOC for dead mobs has been turned off."
return
if(prefs.muted & MUTE_OOC)
- src << "You cannot use OOC (muted)."
+ to_chat(src, "You cannot use OOC (muted).")
return
if(findtext(msg, "byond://"))
- src << "Advertising other servers is not allowed."
+ to_chat(src, "Advertising other servers is not allowed.")
log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
return
@@ -86,7 +86,7 @@
return
if(IsGuestKey(key))
- src << "Guests may not use OOC."
+ to_chat(src, "Guests may not use OOC.")
return
msg = sanitize(msg)
@@ -94,21 +94,21 @@
return
if(!is_preference_enabled(/datum/client_preference/show_looc))
- src << "You have LOOC muted."
+ to_chat(src, "You have LOOC muted.")
return
if(!holder)
if(!config.looc_allowed)
- src << "LOOC is globally muted."
+ to_chat(src, "LOOC is globally muted.")
return
if(!config.dooc_allowed && (mob.stat == DEAD))
usr << "OOC for dead mobs has been turned off."
return
if(prefs.muted & MUTE_OOC)
- src << "You cannot use OOC (muted)."
+ to_chat(src, "You cannot use OOC (muted).")
return
if(findtext(msg, "byond://"))
- src << "Advertising other servers is not allowed."
+ to_chat(src, "Advertising other servers is not allowed.")
log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
return
diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm
index 4a40ea97cb..5a6bfefdb4 100644
--- a/code/game/verbs/suicide.dm
+++ b/code/game/verbs/suicide.dm
@@ -4,27 +4,27 @@
set hidden = 1
if (stat == DEAD)
- src << "You're already dead!"
+ to_chat(src, "You're already dead!")
return
if (!ticker)
- src << "You can't commit suicide before the game starts!"
+ to_chat(src, "You can't commit suicide before the game starts!")
return
if(!player_is_antag(mind))
message_admins("[ckey] has tried to suicide, but they were not permitted due to not being antagonist as human.", 1)
- src << "No. Adminhelp if there is a legitimate reason."
+ to_chat(src, "No. Adminhelp if there is a legitimate reason.")
return
if (suiciding)
- src << "You're already committing suicide! Be patient!"
+ to_chat(src, "You're already committing suicide! Be patient!")
return
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
if(confirm == "Yes")
if(!canmove || restrained()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide
- src << "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))"
+ to_chat(src, "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))")
return
suiciding = 15
does_not_breathe = 0 //Prevents ling-suicide zombies, or something
@@ -92,15 +92,15 @@
set hidden = 1
if (stat == 2)
- src << "You're already dead!"
+ to_chat(src, "You're already dead!")
return
if (!ticker)
- src << "You can't commit suicide before the game starts!"
+ to_chat(src, "You can't commit suicide before the game starts!")
return
if (suiciding)
- src << "You're already committing suicide! Be patient!"
+ to_chat(src, "You're already committing suicide! Be patient!")
return
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
@@ -116,11 +116,11 @@
set hidden = 1
if (stat == 2)
- src << "You're already dead!"
+ to_chat(src, "You're already dead!")
return
if (suiciding)
- src << "You're already committing suicide! Be patient!"
+ to_chat(src, "You're already committing suicide! Be patient!")
return
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
@@ -136,11 +136,11 @@
set hidden = 1
if (stat == 2)
- src << "You're already dead!"
+ to_chat(src, "You're already dead!")
return
if (suiciding)
- src << "You're already committing suicide! Be patient!"
+ to_chat(src, "You're already committing suicide! Be patient!")
return
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
@@ -165,4 +165,4 @@
M.show_message("[src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", 3, "[src] bleeps electronically.", 2)
death(0)
else
- src << "Aborting suicide attempt."
+ to_chat(src, "Aborting suicide attempt.")
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
index c030e25649..a8100038a8 100644
--- a/code/game/verbs/who.dm
+++ b/code/game/verbs/who.dm
@@ -171,7 +171,7 @@
num_event_managers_online++
if(config.admin_irc)
- src << "Adminhelps are also sent to IRC. If no admins are available in game try anyway and an admin on IRC may see it and respond."
+ to_chat(src, "Adminhelps are also sent to IRC. If no admins are available in game try anyway and an admin on IRC may see it and respond.")
msg = "Current Admins ([num_admins_online]):\n" + msg
if(config.show_mods)
diff --git a/code/game/world.dm b/code/game/world.dm
index 075929b799..da0e2ae371 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -57,8 +57,8 @@
populate_robolimb_list()
//Must be done now, otherwise ZAS zones and lighting overlays need to be recreated.
- createRandomZlevel()
-
+ //createRandomZlevel() //VOREStation Removal: Deprecated
+
processScheduler = new
master_controller = new /datum/controller/game_controller()
diff --git a/code/modules/admin/ToRban.dm b/code/modules/admin/ToRban.dm
index d127bfe6f4..f4ddd3e3f2 100644
--- a/code/modules/admin/ToRban.dm
+++ b/code/modules/admin/ToRban.dm
@@ -72,16 +72,16 @@
var/choice = input(src,"Please select an IP address to remove from the ToR banlist:","Remove ToR ban",null) as null|anything in F.dir
if(choice)
F.dir.Remove(choice)
- src << "Address removed"
+ to_chat(src, "Address removed")
if("remove all")
- src << "[TORFILE] was [fdel(TORFILE)?"":"not "]removed."
+ to_chat(src, "[TORFILE] was [fdel(TORFILE)?"":"not "]removed.")
if("find")
var/input = input(src,"Please input an IP address to search for:","Find ToR ban",null) as null|text
if(input)
if(ToRban_isbanned(input))
- src << "Address is a known ToR address"
+ to_chat(src, "Address is a known ToR address")
else
- src << "Address is not a known ToR address"
+ to_chat(src, "Address is not a known ToR address")
return
#undef TORFILE
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 8daa899692..671520fbf8 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -1305,7 +1305,7 @@ var/datum/announcement/minor/admin_min_announcer = new
set desc = "Should fix any mob sprite update errors."
if (!holder)
- src << "Only administrators may use this command."
+ to_chat(src, "Only administrators may use this command.")
return
if(istype(H))
diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm
index 1c90383f40..12a84346b3 100644
--- a/code/modules/admin/admin_investigate.dm
+++ b/code/modules/admin/admin_investigate.dm
@@ -34,7 +34,7 @@
if("singulo", "telesci") //general one-round-only stuff
var/F = investigate_subject2file(subject)
if(!F)
- src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed."
+ to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.")
return
src << browse(F,"window=investigate[subject];size=800x300")
@@ -43,8 +43,8 @@
if(href_logfile)
src << browse(href_logfile,"window=investigate[subject];size=800x300")
else
- src << "Error: admin_investigate: No href logfile found."
+ to_chat(src, "Error: admin_investigate: No href logfile found.")
return
else
- src << "Error: admin_investigate: Href Logging is not on."
+ to_chat(src, "Error: admin_investigate: Href Logging is not on.")
return
diff --git a/code/modules/admin/admin_memo.dm b/code/modules/admin/admin_memo.dm
index 4bcaf10d9c..24ecba7c01 100644
--- a/code/modules/admin/admin_memo.dm
+++ b/code/modules/admin/admin_memo.dm
@@ -22,7 +22,7 @@
return
if("")
F.dir.Remove(ckey)
- src << "Memo removed"
+ to_chat(src, "Memo removed")
return
if( findtext(memo,"