diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
index 9af84740ad8..9a687fb4421 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE.md
@@ -1,4 +1,4 @@
-#### Brief description of the issue
+#### Brief description of the bug
#### What you expected to happen
diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm
index ee1379ac288..5e62fe58021 100644
--- a/code/ATMOSPHERICS/components/unary/outlet_injector.dm
+++ b/code/ATMOSPHERICS/components/unary/outlet_injector.dm
@@ -1,4 +1,4 @@
-//Basically a one way passive valve. If the pressure inside is greater than the environment then gas will flow passively,
+//Basically a one way passive valve. If the pressure inside is greater than the environment then gas will flow passively,
//but it does not permit gas to flow back from the environment into the injector. Can be turned off to prevent any gas flow.
//When it receives the "inject" signal, it will try to pump it's entire contents into the environment regardless of pressure, using power.
@@ -13,7 +13,7 @@
use_power = 0
idle_power_usage = 150 //internal circuitry, friction losses and stuff
power_rating = 15000 //15000 W ~ 20 HP
-
+
var/injecting = 0
var/volume_rate = 50 //flow rate limit
@@ -26,7 +26,7 @@
/obj/machinery/atmospherics/unary/outlet_injector/New()
..()
- air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //Give it a small reservoir for injecting. Also allows it to have a higher flow rate limit than vent pumps, to differentiate injectors a bit more.
+ air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //Give it a small reservoir for injecting. Also allows it to have a higher flow rate limit than vent pumps, to differentiate injectors a bit more.
/obj/machinery/atmospherics/unary/outlet_injector/Destroy()
unregister_radio(src, frequency)
@@ -60,21 +60,21 @@
if((stat & (NOPOWER|BROKEN)) || !use_power)
return
-
+
var/power_draw = -1
var/datum/gas_mixture/environment = loc.return_air()
-
+
if(environment && air_contents.temperature > 0)
var/transfer_moles = (volume_rate/air_contents.volume)*air_contents.total_moles //apply flow rate limit
power_draw = pump_gas(src, air_contents, environment, transfer_moles, power_rating)
-
+
if (power_draw >= 0)
last_power_draw = power_draw
use_power(power_draw)
-
+
if(network)
network.update = 1
-
+
return 1
/obj/machinery/atmospherics/unary/outlet_injector/proc/inject()
@@ -84,7 +84,7 @@
var/datum/gas_mixture/environment = loc.return_air()
if (!environment)
return 0
-
+
injecting = 1
if(air_contents.temperature > 0)
@@ -155,4 +155,23 @@
update_icon()
/obj/machinery/atmospherics/unary/outlet_injector/hide(var/i)
- update_underlays()
\ No newline at end of file
+ update_underlays()
+
+/obj/machinery/atmospherics/unary/outlet_injector/attack_hand(mob/user as mob)
+ to_chat(user, "You toggle \the [src].")
+ injecting = !injecting
+ use_power = injecting
+ update_icon()
+
+/obj/machinery/atmospherics/unary/outlet_injector/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
+ if (!W.is_wrench())
+ return ..()
+
+ playsound(src, W.usesound, 50, 1)
+ to_chat(user, "You begin to unfasten \the [src]...")
+ if (do_after(user, 40 * W.toolspeed))
+ user.visible_message( \
+ "\The [user] unfastens \the [src].", \
+ "You have unfastened \the [src].", \
+ "You hear a ratchet.")
+ deconstruct()
diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm
index 1f7414e17f1..0d728085451 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 394fe72478a..59837bbe5f1 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 29ab678ef1d..41fcdcad85c 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 6ffec0be995..57a7d21036d 100644
--- a/code/ZAS/Phoron.dm
+++ b/code/ZAS/Phoron.dm
@@ -102,7 +102,8 @@ 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.
@@ -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/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm
index c65a87d6c82..ccffcf43416 100644
--- a/code/__defines/belly_modes_vr.dm
+++ b/code/__defines/belly_modes_vr.dm
@@ -32,6 +32,7 @@
#define DM_FLAG_NUMBING 0x1
#define DM_FLAG_STRIPPING 0x2
#define DM_FLAG_LEAVEREMAINS 0x4
+#define DM_FLAG_THICKBELLY 0x8
//Item related modes
#define IM_HOLD "Hold"
diff --git a/code/__defines/chemistry.dm b/code/__defines/chemistry.dm
index 399c7e879b8..0976ed5ea36 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/damage_organs.dm b/code/__defines/damage_organs.dm
index 9692409d458..c87b9942dfc 100644
--- a/code/__defines/damage_organs.dm
+++ b/code/__defines/damage_organs.dm
@@ -8,6 +8,7 @@
#define HALLOSS "halloss"
#define ELECTROCUTE "electrocute"
#define BIOACID "bioacid"
+#define SEARING "searing"
#define CUT "cut"
#define BRUISE "bruise"
diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm
index 2dc4afe70aa..69b91d0dc32 100644
--- a/code/__defines/misc.dm
+++ b/code/__defines/misc.dm
@@ -175,6 +175,7 @@
#define MAT_LEAD "lead"
#define MAT_SUPERMATTER "supermatter"
#define MAT_METALHYDROGEN "mhydrogen"
+#define MAT_OSMIUM "osmium"
#define SHARD_SHARD "shard"
#define SHARD_SHRAPNEL "shrapnel"
@@ -347,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 8426edcfcfe..de9ffa6cf9d 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"
@@ -210,13 +224,17 @@
#define O_GBLADDER "gas bladder"
#define O_POLYP "polyp segment"
#define O_ANCHOR "anchoring ligament"
+#define O_REGBRUTE "pneumoregenitor"
+#define O_REGBURN "thermoregenitor"
+#define O_REGOXY "respiroregenitor"
+#define O_REGTOX "toxoregenitor"
#define O_ACID "acid gland"
#define O_EGG "egg sac"
#define O_RESIN "resin spinner"
#define O_AREJECT "immune hub"
#define O_VENTC "morphoplastic node"
#define O_VRLINK "virtual node"
-#define O_ALL list(O_STANDARD, O_MOUTH, O_CELL, O_PLASMA, O_HIVE, O_NUTRIENT, O_STRATA, O_RESPONSE, O_GBLADDER, O_POLYP, O_ANCHOR, O_ACID, O_EGG, O_RESIN, O_AREJECT, O_VENTC, O_VRLINK)
+#define O_ALL list(O_STANDARD, O_MOUTH, O_CELL, O_PLASMA, O_HIVE, O_NUTRIENT, O_STRATA, O_RESPONSE, O_GBLADDER, O_POLYP, O_ANCHOR, O_REGBRUTE, O_REGBURN, O_REGOXY, O_REGTOX, O_ACID, O_EGG, O_RESIN, O_AREJECT, O_VENTC, O_VRLINK)
// External organs, aka limbs
#define BP_L_FOOT "l_foot"
diff --git a/code/__defines/mobs_vr.dm b/code/__defines/mobs_vr.dm
index fadd802c84e..5e9bb78189e 100644
--- a/code/__defines/mobs_vr.dm
+++ b/code/__defines/mobs_vr.dm
@@ -35,3 +35,4 @@
#define SPECIES_MONKEY_NEVREAN "Sparra"
#define SPECIES_MONKEY_SERGAL "Saru"
#define SPECIES_MONKEY_VULPKANIN "Wolpin"
+#define SPECIES_WEREBEAST "Werebeast"
diff --git a/code/__defines/sound.dm b/code/__defines/sound.dm
index 0995f0e071f..d954d34b2a0 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/__defines/species_languages_vr.dm b/code/__defines/species_languages_vr.dm
index 1004c1e22c1..831df5253dd 100644
--- a/code/__defines/species_languages_vr.dm
+++ b/code/__defines/species_languages_vr.dm
@@ -1,5 +1,6 @@
#define SPECIES_WHITELIST_SELECTABLE 0x20 // Can select and customize, but not join as
+#define LANGUAGE_SLAVIC "Pan-Slavic"
#define LANGUAGE_BIRDSONG "Birdsong"
#define LANGUAGE_SAGARU "Sagaru"
#define LANGUAGE_CANILUNZT "Canilunzt"
diff --git a/code/__defines/xenoarcheaology.dm b/code/__defines/xenoarcheaology.dm
index 45e40cfbdeb..8a4988b78c0 100644
--- a/code/__defines/xenoarcheaology.dm
+++ b/code/__defines/xenoarcheaology.dm
@@ -36,7 +36,8 @@
#define ARCHAEO_ALIEN_ITEM 36
#define ARCHAEO_ALIEN_BOAT 37
#define ARCHAEO_IMPERION_CIRCUIT 38
-#define MAX_ARCHAEO 38
+#define ARCHAEO_TELECUBE 39
+#define MAX_ARCHAEO 39
#define DIGSITE_GARDEN 1
#define DIGSITE_ANIMAL 2
diff --git a/code/_global_vars/mobs.dm b/code/_global_vars/mobs.dm
index 10d829904ab..7e60dc71ea2 100644
--- a/code/_global_vars/mobs.dm
+++ b/code/_global_vars/mobs.dm
@@ -5,3 +5,4 @@ GLOBAL_LIST_EMPTY(stealthminID)
GLOBAL_LIST_EMPTY(directory) //all ckeys with associated client
GLOBAL_LIST_EMPTY(clients)
GLOBAL_LIST_EMPTY(players_by_zlevel)
+GLOBAL_LIST_EMPTY(round_text_log)
diff --git a/code/_helpers/files.dm b/code/_helpers/files.dm
index 4a7b9fa646e..dd8c5dd6901 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 846291edc46..c9a64048a8b 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,
@@ -124,6 +132,7 @@ var/global/list/tf_vore_egg_types = list(
var/global/list/edible_trash = list(/obj/item/broken_device,
/obj/item/clothing/accessory/collar, //TFF 10/7/19 - add option to nom collars,
+ /obj/item/device/communicator, //TFF 19/9/19 - add option to nom communicators and commwatches,
/obj/item/clothing/mask,
/obj/item/clothing/glasses,
/obj/item/clothing/gloves,
diff --git a/code/_helpers/icons_vr.dm b/code/_helpers/icons_vr.dm
index be5de68e82d..60765578e71 100644
--- a/code/_helpers/icons_vr.dm
+++ b/code/_helpers/icons_vr.dm
@@ -42,4 +42,18 @@
for(var/x_pixel = 1 to I.Width())
if (I.GetPixel(x_pixel, y_pixel))
return y_pixel - 1
- return null
\ No newline at end of file
+ return null
+
+//Standard behaviour is to cut pixels from the main icon that are covered by pixels from the mask icon unless passed mask_ready, see below.
+/proc/get_icon_difference(var/icon/main, var/icon/mask, var/mask_ready)
+ /*You should skip prep if the mask is already sprited properly. This significantly improves performance by eliminating most of the realtime icon work.
+ e.g. A 'ready' mask is a mask where the part you want cut out is missing (no pixels, 0 alpha) from the sprite, and everything else is solid white.*/
+
+ if(istype(main) && istype(mask))
+ if(!mask_ready) //Prep the mask if we're using a regular old sprite and not a special-made mask.
+ mask.Blend(rgb(255,255,255), ICON_SUBTRACT) //Make all pixels on the mask as black as possible.
+ mask.Opaque(rgb(255,255,255)) //Make the transparent pixels (background) white.
+ mask.BecomeAlphaMask() //Make all the black pixels vanish (fully transparent), leaving only the white background pixels.
+
+ main.AddAlphaMask(mask) //Make the pixels in the main icon that are in the transparent zone of the mask icon also vanish (fully transparent).
+ return main
diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm
index c771de02ef6..51c9c015279 100644
--- a/code/_helpers/logging.dm
+++ b/code/_helpers/logging.dm
@@ -61,8 +61,8 @@
/proc/log_access_in(client/new_client)
if (config.log_access)
- var/message = "[key_name(new_client)] - IP:[new_client.address] - CID:[new_client.computer_id] - BYOND v[new_client.byond_version]"
- WRITE_LOG(diary, "ACCESS IN: [message]")
+ var/message = "[key_name(new_client)] - IP:[new_client.address] - CID:[new_client.computer_id] - BYOND v[new_client.byond_version]"
+ WRITE_LOG(diary, "ACCESS IN: [message]") //VOREStation Edit
/proc/log_access_out(mob/last_mob)
if (config.log_access)
@@ -73,26 +73,46 @@
if (config.log_say)
WRITE_LOG(diary, "SAY: [speaker.simple_info_line()]: [html_decode(text)]")
+ //Log the message to in-game dialogue logs, as well.
+ if(speaker.client)
+ speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) SAY: - [text]"
+ GLOB.round_text_log += "([time_stamp()]) ([speaker]/[speaker.client]) SAY: - [text]"
+
/proc/log_ooc(text, client/user)
if (config.log_ooc)
WRITE_LOG(diary, "OOC: [user.simple_info_line()]: [html_decode(text)]")
+ GLOB.round_text_log += "([time_stamp()]) ([user]) OOC: - [text]"
+
/proc/log_aooc(text, client/user)
if (config.log_ooc)
WRITE_LOG(diary, "AOOC: [user.simple_info_line()]: [html_decode(text)]")
+ GLOB.round_text_log += "([time_stamp()]) ([user]) AOOC: - [text]"
+
/proc/log_looc(text, client/user)
if (config.log_ooc)
WRITE_LOG(diary, "LOOC: [user.simple_info_line()]: [html_decode(text)]")
+ GLOB.round_text_log += "([time_stamp()]) ([user]) LOOC: - [text]"
+
/proc/log_whisper(text, mob/speaker)
if (config.log_whisper)
WRITE_LOG(diary, "WHISPER: [speaker.simple_info_line()]: [html_decode(text)]")
+ if(speaker.client)
+ speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) SAY: - [text]"
+ GLOB.round_text_log += "([time_stamp()]) ([speaker]/[speaker.client]) SAY: - [text]"
+
+
/proc/log_emote(text, mob/speaker)
if (config.log_emote)
WRITE_LOG(diary, "EMOTE: [speaker.simple_info_line()]: [html_decode(text)]")
+ if(speaker.client)
+ speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) EMOTE: - [text]"
+ GLOB.round_text_log += "([time_stamp()]) ([speaker]/[speaker.client]) EMOTE: - [text]"
+
/proc/log_attack(attacker, defender, message)
if (config.log_attack)
WRITE_LOG(diary, "ATTACK: [attacker] against [defender]: [message]")
@@ -113,6 +133,10 @@
if (config.log_say)
WRITE_LOG(diary, "DEADCHAT: [speaker.simple_info_line()]: [html_decode(text)]")
+ speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) DEADSAY: - [text]"
+ GLOB.round_text_log += "([time_stamp()]) ([src]/[speaker.client]) DEADSAY: - [text]"
+
+
/proc/log_ghostemote(text, mob/speaker)
if (config.log_emote)
WRITE_LOG(diary, "DEADEMOTE: [speaker.simple_info_line()]: [html_decode(text)]")
@@ -125,6 +149,10 @@
if (config.log_pda)
WRITE_LOG(diary, "PDA: [speaker.simple_info_line()]: [html_decode(text)]")
+ speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) MSG: - [text]"
+ GLOB.round_text_log += "([time_stamp()]) ([speaker]/[speaker.client]) MSG: - [text]"
+
+
/proc/log_to_dd(text)
world.log << text //this comes before the config check because it can't possibly runtime
if(config.log_world_output)
@@ -222,7 +250,7 @@
if(include_link && is_special_character(M) && highlight_special_characters)
name = "[name]" //Orange
-
+
. += "/([name])"
return .
diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index 9104bc71d9a..d85c33a4e5c 100644
--- a/code/_helpers/unsorted.dm
+++ b/code/_helpers/unsorted.dm
@@ -358,7 +358,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 643ab6d7905..299ccf6ec25 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -114,6 +114,19 @@
trigger_aiming(TARGET_CAN_CLICK)
return 1
+ // VOREStation Addition Start: inbelly item interaction
+ if(isbelly(loc) && (loc == A.loc))
+ if(W)
+ var/resolved = W.resolve_attackby(A,src)
+ if(!resolved && A && W)
+ W.afterattack(A, src, 1, params) // 1: clicking something Adjacent
+ else
+ if(ismob(A)) // No instant mob attacking
+ setClickCooldown(get_attack_speed())
+ UnarmedAttack(A, 1)
+ return
+ // VOREStation Addition End
+
if(!isturf(loc)) // This is going to stop you from telekinesing from inside a closet, but I don't shed many tears for that
return
@@ -170,7 +183,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)
@@ -303,7 +316,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 1dcc2bc9551..8d107e8f645 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/ability_screen_objects.dm b/code/_onclick/hud/ability_screen_objects.dm
index d29ef9dd967..fc06f8e0cc6 100644
--- a/code/_onclick/hud/ability_screen_objects.dm
+++ b/code/_onclick/hud/ability_screen_objects.dm
@@ -282,7 +282,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/observer.dm b/code/_onclick/observer.dm
index f34a68a742f..d5197cb30f3 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 5f2561c25c7..ed7a1c7e2fb 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 18043f92702..00000000000
--- 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 71d9c60233e..00000000000
--- 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 ac5e4696abc..00000000000
--- 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/garbage.dm b/code/controllers/subsystems/garbage.dm
index a741869b5b3..9938fa20eb0 100644
--- a/code/controllers/subsystems/garbage.dm
+++ b/code/controllers/subsystems/garbage.dm
@@ -240,9 +240,9 @@ SUBSYSTEM_DEF(garbage)
time = TICK_DELTA_TO_MS(tick)/100
if (time > highest_del_time)
highest_del_time = time
- if (time > 10)
- log_game("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete)")
- message_admins("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete).")
+ if (time > 20) //VOREStation Edit
+ log_game("Error: [type]([refID]) took longer than 2 seconds to delete (took [time/10] seconds to delete)") //VOREStation Edit
+ message_admins("Error: [type]([refID]) took longer than 2 seconds to delete (took [time/10] seconds to delete).") //VOREStation Edit
postpone(time)
/datum/controller/subsystem/garbage/proc/HardQueue(datum/D)
diff --git a/code/controllers/subsystems/radiation.dm b/code/controllers/subsystems/radiation.dm
new file mode 100644
index 00000000000..babc2c7d5d4
--- /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 e7c3d5aaf9b..54fb4879851 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 hour to finish ongoing projects?" //VOREStation 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 72f0b9d15ab..546141457d3 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/autolathe/engineering_vr.dm b/code/datums/autolathe/engineering_vr.dm
new file mode 100644
index 00000000000..08e1cf986bf
--- /dev/null
+++ b/code/datums/autolathe/engineering_vr.dm
@@ -0,0 +1,7 @@
+/datum/category_item/autolathe/engineering/timeclock
+ name = "timeclock electronics"
+ path =/obj/item/weapon/circuitboard/timeclock
+
+/datum/category_item/autolathe/engineering/id_restorer
+ name = "ID restoration console electronics"
+ path =/obj/item/weapon/circuitboard/id_restorer
\ No newline at end of file
diff --git a/code/datums/ghost_query.dm b/code/datums/ghost_query.dm
index 2f7942a9b29..427b38f73bb 100644
--- a/code/datums/ghost_query.dm
+++ b/code/datums/ghost_query.dm
@@ -117,7 +117,7 @@
/datum/ghost_query/lost_drone
role_name = "Lost Drone"
question = "A lost drone onboard has been discovered by a crewmember and they are attempting to reactivate it. Would you like to play as the drone?"
- be_special_flag = BE_AI
+ //be_special_flag = BE_AI //VOREStation Removal: Positronic role is never used because intended purpose is unfitting, so remove the check
check_bans = list("AI", "Cyborg")
cutoff_number = 1
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
index aef0fd0ac2a..4dad60db895 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 8b927b3a54b..4795f63687f 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 = 10
+ end_sound = 'sound/machines/air_pump/airpumpshutdown.ogg'
+ volume = 20
+ pref_check = /datum/client_preference/air_pump_noise
\ No newline at end of file
diff --git a/code/datums/outfits/jobs/civilian.dm b/code/datums/outfits/jobs/civilian.dm
index 8e7f72815c5..c6d6194f17b 100644
--- a/code/datums/outfits/jobs/civilian.dm
+++ b/code/datums/outfits/jobs/civilian.dm
@@ -44,6 +44,14 @@
name = OUTFIT_JOB_NAME("Cook")
id_pda_assignment = "Cook"
+// Rykka adds Server Outfit
+
+/decl/hierarchy/outfit/job/service/server
+ name = OUTFIT_JOB_NAME("Server")
+ uniform = /obj/item/clothing/under/waiter
+
+// End Outfit addition
+
/decl/hierarchy/outfit/job/service/gardener
name = OUTFIT_JOB_NAME("Gardener")
uniform = /obj/item/clothing/under/rank/hydroponics
diff --git a/code/datums/outfits/military/fleet.dm b/code/datums/outfits/military/fleet.dm
index cf5028978d0..915917918cf 100644
--- a/code/datums/outfits/military/fleet.dm
+++ b/code/datums/outfits/military/fleet.dm
@@ -1,21 +1,21 @@
/decl/hierarchy/outfit/military/fleet/pt
name = OUTFIT_MILITARY("Fleet PT")
- uniform = /obj/item/clothing/under/pt/fleet
+ uniform = /obj/item/clothing/under/solgov/pt/fleet
shoes = /obj/item/clothing/shoes/black
/decl/hierarchy/outfit/military/fleet/utility
name = OUTFIT_MILITARY("Fleet Utility")
- uniform = /obj/item/clothing/under/utility/fleet
- shoes = /obj/item/clothing/shoes/boots/jackboots
+ uniform = /obj/item/clothing/under/solgov/utility/fleet
+ shoes = /obj/item/clothing/shoes/boots/duty
/decl/hierarchy/outfit/military/fleet/service
name = OUTFIT_MILITARY("Fleet Service")
- uniform = /obj/item/clothing/under/service/fleet
+ uniform = /obj/item/clothing/under/solgov/service/fleet
shoes = /obj/item/clothing/shoes/dress/white
/decl/hierarchy/outfit/military/fleet/dress
name = OUTFIT_MILITARY("Fleet Dress")
- uniform = /obj/item/clothing/under/service/fleet
+ uniform = /obj/item/clothing/under/solgov/service/fleet
shoes = /obj/item/clothing/shoes/dress/white
suit = /obj/item/clothing/suit/storage/toggle/dress/fleet
gloves = /obj/item/clothing/gloves/white
diff --git a/code/datums/outfits/military/marines.dm b/code/datums/outfits/military/marines.dm
index d818dabcaaa..719b36c6909 100644
--- a/code/datums/outfits/military/marines.dm
+++ b/code/datums/outfits/military/marines.dm
@@ -1,22 +1,22 @@
/decl/hierarchy/outfit/military/marine/pt
name = OUTFIT_MILITARY("Marine PT")
- uniform = /obj/item/clothing/under/pt/marine
+ uniform = /obj/item/clothing/under/solgov/pt/marine
shoes = /obj/item/clothing/shoes/black
/decl/hierarchy/outfit/military/marine/utility
name = OUTFIT_MILITARY("Marine Utility")
- uniform = /obj/item/clothing/under/utility/marine
+ uniform = /obj/item/clothing/under/solgov/utility/marine
shoes = /obj/item/clothing/shoes/boots/jungle
/decl/hierarchy/outfit/military/marine/service
name = OUTFIT_MILITARY("Marine Service")
- uniform = /obj/item/clothing/under/service/marine
+ uniform = /obj/item/clothing/under/solgov/service/marine
shoes = /obj/item/clothing/shoes/dress
suit = /obj/item/clothing/suit/storage/service/marine
/decl/hierarchy/outfit/military/marine/dress
name = OUTFIT_MILITARY("Marine Dress")
- uniform = /obj/item/clothing/under/mildress/marine
+ uniform = /obj/item/clothing/under/solgov/mildress/marine
shoes = /obj/item/clothing/shoes/dress/white
suit = /obj/item/clothing/suit/dress/marine
gloves = /obj/item/clothing/gloves/white
diff --git a/code/datums/outfits/military/sifguard.dm b/code/datums/outfits/military/sifguard.dm
index e1280f0cfed..9348224a9eb 100644
--- a/code/datums/outfits/military/sifguard.dm
+++ b/code/datums/outfits/military/sifguard.dm
@@ -1,22 +1,22 @@
/decl/hierarchy/outfit/military/sifguard/pt
name = OUTFIT_MILITARY("SifGuard PT")
- uniform = /obj/item/clothing/under/pt/sifguard
+ uniform = /obj/item/clothing/under/solgov/pt/sifguard
shoes = /obj/item/clothing/shoes/black
/decl/hierarchy/outfit/military/sifguard/utility
name = OUTFIT_MILITARY("SifGuard Utility")
- uniform = /obj/item/clothing/under/utility/sifguard
- shoes = /obj/item/clothing/shoes/boots/jackboots
+ uniform = /obj/item/clothing/under/solgov/utility/sifguard
+ shoes = /obj/item/clothing/shoes/boots/tactical
/decl/hierarchy/outfit/military/sifguard/service
name = OUTFIT_MILITARY("SifGuard Service")
- uniform = /obj/item/clothing/under/utility/sifguard
- shoes = /obj/item/clothing/shoes/boots/jackboots
+ uniform = /obj/item/clothing/under/solgov/utility/sifguard
+ shoes = /obj/item/clothing/shoes/boots/tactical
suit = /obj/item/clothing/suit/storage/service/sifguard
/decl/hierarchy/outfit/military/sifguard/dress
name = OUTFIT_MILITARY("SifGuard Dress")
- uniform = /obj/item/clothing/under/mildress/sifguard
+ uniform = /obj/item/clothing/under/solgov/mildress/sifguard
shoes = /obj/item/clothing/shoes/dress
suit = /obj/item/clothing/suit/dress/expedition
gloves = /obj/item/clothing/gloves/white
diff --git a/code/datums/outfits/outfit_vr.dm b/code/datums/outfits/outfit_vr.dm
index 6177836a759..27e5cde50ef 100644
--- a/code/datums/outfits/outfit_vr.dm
+++ b/code/datums/outfits/outfit_vr.dm
@@ -1,6 +1,6 @@
/decl/hierarchy/outfit/USDF/Marine
name = "USDF marine"
- uniform = /obj/item/clothing/under/utility/marine/green
+ uniform = /obj/item/clothing/under/solgov/utility/marine/green
shoes = /obj/item/clothing/shoes/boots/jackboots
gloves = /obj/item/clothing/gloves/combat
l_ear = /obj/item/device/radio/headset/centcom
@@ -30,7 +30,7 @@
head = /obj/item/clothing/head/dress/marine/command/admiral
shoes = /obj/item/clothing/shoes/boots/jackboots
l_ear = /obj/item/device/radio/headset/centcom
- uniform = /obj/item/clothing/under/mildress/marine/command
+ uniform = /obj/item/clothing/under/solgov/mildress/marine/command
back = /obj/item/weapon/storage/backpack/satchel
belt = /obj/item/weapon/gun/projectile/revolver/consul
l_pocket = /obj/item/ammo_magazine/s44
diff --git a/code/datums/repositories/radiation.dm b/code/datums/repositories/radiation.dm
deleted file mode 100644
index 4525032e200..00000000000
--- 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/hospitality_vr.dm b/code/datums/supplypacks/hospitality_vr.dm
index 822773b6f9a..decb7027db1 100644
--- a/code/datums/supplypacks/hospitality_vr.dm
+++ b/code/datums/supplypacks/hospitality_vr.dm
@@ -1,3 +1,6 @@
+/datum/supply_pack/randomised/hospitality/pizza
+ cost = 50
+
/datum/supply_pack/randomised/hospitality/burgers_vr
num_contained = 5
contains = list(
diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm
index 5596d95f038..554a826f20f 100644
--- a/code/datums/supplypacks/medical.dm
+++ b/code/datums/supplypacks/medical.dm
@@ -334,4 +334,39 @@
contains = list(/obj/item/device/defib_kit = 2)
cost = 30
containertype = /obj/structure/closet/crate/medical
- containername = "Defibrillator crate"
\ No newline at end of file
+ containername = "Defibrillator crate"
+
+/datum/supply_pack/med/distillery
+ name = "Chemical distiller crate"
+ contains = list(/obj/machinery/portable_atmospherics/powered/reagent_distillery = 1)
+ cost = 175
+ containertype = /obj/structure/largecrate
+ containername = "Chemical distiller crate"
+
+/datum/supply_pack/med/advdistillery
+ name = "Industrial Chemical distiller crate"
+ contains = list(/obj/machinery/portable_atmospherics/powered/reagent_distillery/industrial = 1)
+ 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/medical_vr.dm b/code/datums/supplypacks/medical_vr.dm
index 344e2bbdbda..0538f838679 100644
--- a/code/datums/supplypacks/medical_vr.dm
+++ b/code/datums/supplypacks/medical_vr.dm
@@ -1,38 +1,50 @@
-/datum/supply_pack/med/medicalbiosuits
- contains = list(
- /obj/item/clothing/head/bio_hood/scientist = 3,
- /obj/item/clothing/suit/bio_suit/scientist = 3,
- /obj/item/clothing/suit/bio_suit/virology = 3,
- /obj/item/clothing/head/bio_hood/virology = 3,
- /obj/item/clothing/suit/bio_suit/cmo,
- /obj/item/clothing/head/bio_hood/cmo,
- /obj/item/clothing/shoes/white = 7,
- /obj/item/clothing/mask/gas = 7,
- /obj/item/weapon/tank/oxygen = 7,
- /obj/item/weapon/storage/box/masks,
- /obj/item/weapon/storage/box/gloves
- )
- cost = 40
-
-/datum/supply_pack/med/virologybiosuits
- name = "Virology biohazard gear"
- contains = list(
- /obj/item/clothing/suit/bio_suit/virology = 3,
- /obj/item/clothing/head/bio_hood/virology = 3,
- /obj/item/clothing/mask/gas = 3,
- /obj/item/weapon/tank/oxygen = 3,
- /obj/item/weapon/storage/box/masks,
- /obj/item/weapon/storage/box/gloves
- )
- cost = 40
- containertype = /obj/structure/closet/crate/secure
- containername = "Virology biohazard equipment"
- access = access_medical_equip
-
-/datum/supply_pack/med/virus
- name = "Virus sample crate"
- contains = list(/obj/item/weapon/virusdish/random = 4)
- cost = 25
- containertype = /obj/structure/closet/crate/secure
- containername = "Virus sample crate"
- access = access_medical_equip
\ No newline at end of file
+/datum/supply_pack/med/medicalbiosuits
+ contains = list(
+ /obj/item/clothing/head/bio_hood/scientist = 3,
+ /obj/item/clothing/suit/bio_suit/scientist = 3,
+ /obj/item/clothing/suit/bio_suit/virology = 3,
+ /obj/item/clothing/head/bio_hood/virology = 3,
+ /obj/item/clothing/suit/bio_suit/cmo,
+ /obj/item/clothing/head/bio_hood/cmo,
+ /obj/item/clothing/shoes/white = 7,
+ /obj/item/clothing/mask/gas = 7,
+ /obj/item/weapon/tank/oxygen = 7,
+ /obj/item/weapon/storage/box/masks,
+ /obj/item/weapon/storage/box/gloves
+ )
+ cost = 40
+
+/datum/supply_pack/med/virologybiosuits
+ name = "Virology biohazard gear"
+ contains = list(
+ /obj/item/clothing/suit/bio_suit/virology = 3,
+ /obj/item/clothing/head/bio_hood/virology = 3,
+ /obj/item/clothing/mask/gas = 3,
+ /obj/item/weapon/tank/oxygen = 3,
+ /obj/item/weapon/storage/box/masks,
+ /obj/item/weapon/storage/box/gloves
+ )
+ cost = 40
+ containertype = /obj/structure/closet/crate/secure
+ containername = "Virology biohazard equipment"
+ access = access_medical_equip
+
+/datum/supply_pack/med/virus
+ name = "Virus sample crate"
+ contains = list(/obj/item/weapon/virusdish/random = 4)
+ cost = 25
+ containertype = /obj/structure/closet/crate/secure
+ containername = "Virus sample crate"
+ access = access_medical_equip
+
+
+/datum/supply_pack/med/bloodpack
+ containertype = /obj/structure/closet/crate/medical/blood
+
+/datum/supply_pack/med/compactdefib
+ name = "Compact Defibrillator crate"
+ contains = list(/obj/item/device/defib_kit/compact = 1)
+ cost = 90
+ containertype = /obj/structure/closet/crate/secure
+ containername = "Compact Defibrillator crate"
+ access = access_medical_equip
diff --git a/code/datums/supplypacks/misc.dm b/code/datums/supplypacks/misc.dm
index b77d442e82f..7f4f0362dbd 100644
--- a/code/datums/supplypacks/misc.dm
+++ b/code/datums/supplypacks/misc.dm
@@ -143,4 +143,39 @@
)
cost = 25
containertype = /obj/structure/closet/crate
- containername = "Glucose Hypo Crate"
\ No newline at end of file
+ containername = "Glucose Hypo Crate"
+
+/datum/supply_pack/misc/mre_rations
+ num_contained = 6
+ name = "Emergency - MREs"
+ contains = list(/obj/item/weapon/storage/mre,
+ /obj/item/weapon/storage/mre/menu2,
+ /obj/item/weapon/storage/mre/menu3,
+ /obj/item/weapon/storage/mre/menu4,
+ /obj/item/weapon/storage/mre/menu5,
+ /obj/item/weapon/storage/mre/menu6,
+ /obj/item/weapon/storage/mre/menu7,
+ /obj/item/weapon/storage/mre/menu8,
+ /obj/item/weapon/storage/mre/menu9,
+ /obj/item/weapon/storage/mre/menu10)
+ cost = 50
+ containertype = /obj/structure/closet/crate/freezer
+ containername = "ready to eat rations"
+
+/datum/supply_pack/misc/paste_rations
+ name = "Emergency - Paste"
+ contains = list(
+ /obj/item/weapon/storage/mre/menu11 = 2
+ )
+ 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/supplypacks/misc_vr.dm b/code/datums/supplypacks/misc_vr.dm
index 613a01cfd46..93523707b9d 100644
--- a/code/datums/supplypacks/misc_vr.dm
+++ b/code/datums/supplypacks/misc_vr.dm
@@ -13,24 +13,6 @@
containername = "Belt-miner gear crate"
access = access_mining
-/datum/supply_pack/misc/rations
- name = "Emergency rations"
- contains = list(
- /obj/item/weapon/reagent_containers/food/snacks/liquidfood = 4,
- )
- cost = 20
- containertype = /obj/structure/closet/crate/freezer
- containername = "emergency rations"
-
-/datum/supply_pack/misc/proteinrations
- name = "Emergency meat rations"
- contains = list(
- /obj/item/weapon/reagent_containers/food/snacks/liquidprotein = 4,
- )
- cost = 30
- containertype = /obj/structure/closet/crate/freezer
- containername = "emergency meat rations"
-
/datum/supply_pack/misc/eva_rig
name = "eva hardsuit (empty)"
contains = list(
@@ -55,4 +37,44 @@
containername = "industrial hardsuit crate"
access = list(access_mining,
access_eva)
- one_access = TRUE
\ No newline at end of file
+ one_access = TRUE
+
+/datum/supply_pack/misc/medical_rig
+ name = "medical hardsuit (empty)"
+ contains = list(
+ /obj/item/weapon/rig/medical = 1
+ )
+ cost = 150
+ containertype = /obj/structure/closet/crate/secure/gear
+ containername = "medical hardsuit crate"
+ access = access_medical
+
+/datum/supply_pack/misc/security_rig
+ name = "hazard hardsuit (empty)"
+ contains = list(
+ /obj/item/weapon/rig/hazard = 1
+ )
+ cost = 150
+ containertype = /obj/structure/closet/crate/secure/gear
+ containername = "hazard hardsuit crate"
+ access = access_armory
+
+/datum/supply_pack/misc/science_rig
+ name = "ami hardsuit (empty)"
+ contains = list(
+ /obj/item/weapon/rig/hazmat = 1
+ )
+ cost = 150
+ containertype = /obj/structure/closet/crate/secure/gear
+ containername = "ami hardsuit crate"
+ access = access_rd
+
+/datum/supply_pack/misc/ce_rig
+ name = "advanced voidsuit (empty)"
+ contains = list(
+ /obj/item/weapon/rig/ce = 1
+ )
+ cost = 150
+ containertype = /obj/structure/closet/crate/secure/gear
+ containername = "advanced voidsuit crate"
+ access = access_ce
diff --git a/code/datums/supplypacks/security_vr.dm b/code/datums/supplypacks/security_vr.dm
index 852b44adee7..a00556e5287 100644
--- a/code/datums/supplypacks/security_vr.dm
+++ b/code/datums/supplypacks/security_vr.dm
@@ -34,3 +34,23 @@
/obj/item/weapon/storage/box/gloves
)
cost = 40
+
+/datum/supply_pack/security/trackingimplant
+ name = "Implants - Tracking"
+ contains = list(
+ /obj/item/weapon/storage/box/trackimp = 1
+ )
+ cost = 25
+ containertype = /obj/structure/closet/crate/secure
+ containername = "Tracking implants"
+ access = access_security
+
+/datum/supply_pack/security/chemicalimplant
+ name = "Implants - Chemical"
+ contains = list(
+ /obj/item/weapon/storage/box/chemimp = 1
+ )
+ cost = 25
+ containertype = /obj/structure/closet/crate/secure
+ containername = "Chemical implants"
+ access = access_security
diff --git a/code/datums/uplink/implants.dm b/code/datums/uplink/implants.dm
index 7e3e2f30050..e36396c9cd0 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 00000000000..324398843f8
--- /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 00000000000..5a165f7aacc
--- /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 e8a69d2aafa..e4c27752f0e 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 83c9957be20..a072196c1b1 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 5dc6c5f327a..fba64679835 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 feaf8857ba8..6f2a7fe2e33 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/antagonist/station/highlander.dm b/code/game/antagonist/station/highlander.dm
index e2ec983818a..f483b1df3bd 100644
--- a/code/game/antagonist/station/highlander.dm
+++ b/code/game/antagonist/station/highlander.dm
@@ -47,8 +47,8 @@ var/datum/antagonist/highlander/highlanders
var/obj/item/weapon/card/id/W = new(player)
W.name = "[player.real_name]'s ID Card"
W.icon_state = "centcom"
- W.access = get_all_station_access()
- W.access += get_all_centcom_access()
+ W.access = get_all_station_access().Copy
+ W.access |= get_all_centcom_access()
W.assignment = "Highlander"
W.registered_name = player.real_name
player.equip_to_slot_or_del(W, slot_wear_id)
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 787cc55f7b6..ac11cd2e4f0 100755
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -2737,4 +2737,4 @@ var/list/the_station_areas = list (
icon_state = "yellow"
luminosity = 1
dynamic_lighting = 0
- requires_power = 0
+ requires_power = 0
\ No newline at end of file
diff --git a/code/game/area/Space Station 13 areas_vr.dm b/code/game/area/Space Station 13 areas_vr.dm
index 396ab608215..c03489b3071 100644
--- a/code/game/area/Space Station 13 areas_vr.dm
+++ b/code/game/area/Space Station 13 areas_vr.dm
@@ -1,121 +1,4 @@
-/area/crew_quarters/sleep/vistor_room_1
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/vistor_room_2
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/vistor_room_3
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/vistor_room_4
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/vistor_room_5
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/vistor_room_6
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/vistor_room_7
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/vistor_room_8
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/vistor_room_9
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/vistor_room_10
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/vistor_room_11
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/vistor_room_12
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/Dorm_1
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/Dorm_2
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/Dorm_3
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/Dorm_4
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/Dorm_5
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/Dorm_6
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/Dorm_7
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/Dorm_8
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/Dorm_9
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/crew_quarters/sleep/Dorm_10
- flags = RAD_SHIELDED | BLUE_SHIELDED
-
-/area/teleporter/departing
- name = "\improper Long-Range Teleporter"
- icon_state = "teleporter"
- music = "signal"
-
-// Override telescience shielding on some areas
-/area/security/armoury
- flags = BLUE_SHIELDED
-
-/area/security/tactical
- flags = BLUE_SHIELDED
-
-/area/security/nuke_storage
- flags = BLUE_SHIELDED
-
-/area/supply
- flags = BLUE_SHIELDED
-
-// Add rad shielding to maintenance and construction sites
-/area/vacant
- flags = RAD_SHIELDED
-
-/area/maintenance
- flags = RAD_SHIELDED
-
-/area/rnd/research_storage //Located entirely in maint under public access, so why not that too
- flags = RAD_SHIELDED
-
-// New shuttles
-/area/shuttle/administration/transit
- name = "Deep Space (AS)"
- icon_state = "shuttle"
-
-/area/shuttle/administration/away_mission
- name = "Away Mission (AS)"
- icon_state = "shuttle"
-
-/area/shuttle/awaymission/home
- name = "NSB Adephagia (AM)"
- icon_state = "shuttle2"
-
-/area/shuttle/awaymission/warp
- name = "Deep Space (AM)"
- icon_state = "shuttle"
-
-/area/shuttle/awaymission/away
- name = "Away Mission (AM)"
- icon_state = "shuttle2"
-
-/area/shuttle/awaymission/oldengbase
- name = "Old Construction Site (AM)"
- icon_state = "shuttle2"
+//TFF 28/8/19 - cleanup of areas placement - removes all but rogueminer_vr stuff.
/area/shuttle/belter/station
name = "Belter Shuttle Landed"
@@ -162,140 +45,6 @@
icon_state = "red2"
shuttle_area = /area/shuttle/belter/belt/zone4
-/area/medical/resleeving
- name = "Resleeving Lab"
- icon_state = "genetics"
-
-/area/bigship
- name = "Bigship"
- requires_power = 0
- flags = RAD_SHIELDED
- sound_env = SMALL_ENCLOSED
- base_turf = /turf/space
- icon_state = "red2"
-
-/area/bigship/teleporter
- name = "Bigship Teleporter Room"
-
-//////// Small Cruiser Areas ////////
-/area/houseboat
- name = "Small Cruiser"
- requires_power = 0
- flags = RAD_SHIELDED
- base_turf = /turf/space
- icon_state = "red2"
- lightswitch = TRUE
-
-/area/houseboat/holodeck_area
- name = "Small Cruiser - Holodeck"
- icon_state = "blue2"
-
-/area/houseboat/holodeck/off
- name = "Small Cruiser Holo - Off"
- icon_state = "blue2"
-/area/houseboat/holodeck/beach
- name = "Small Cruiser Holo - Beach"
- icon_state = "blue2"
-/area/houseboat/holodeck/snow
- name = "Small Cruiser Holo - Snow"
- icon_state = "blue2"
-/area/houseboat/holodeck/desert
- name = "Small Cruiser Holo - Desert"
- icon_state = "blue2"
-/area/houseboat/holodeck/picnic
- name = "Small Cruiser Holo - Picnic"
- icon_state = "blue2"
-/area/houseboat/holodeck/thunderdome
- name = "Small Cruiser Holo - Thunderdome"
- icon_state = "blue2"
-/area/houseboat/holodeck/basketball
- name = "Small Cruiser Holo - Basketball"
- icon_state = "blue2"
-/area/houseboat/holodeck/gaming
- name = "Small Cruiser Holo - Gaming Table"
- icon_state = "blue2"
-/area/houseboat/holodeck/space
- name = "Small Cruiser Holo - Space"
- icon_state = "blue2"
-/area/houseboat/holodeck/bunking
- name = "Small Cruiser Holo - Bunking"
- icon_state = "blue2"
-
-/area/shuttle/cruiser/cruiser
- name = "Small Cruiser Shuttle - Cruiser"
- icon_state = "blue2"
- base_turf = /turf/simulated/floor/tiled/techfloor
-/area/shuttle/cruiser/station
- name = "Small Cruiser Shuttle - Station"
- icon_state = "blue2"
-
-
-// Tether Map has this shuttle
-/area/shuttle/tether/surface
- name = "Tether Shuttle Landed"
- icon_state = "shuttle"
- base_turf = /turf/simulated/floor/reinforced
-
-/area/shuttle/tether/station
- name = "Tether Shuttle Dock"
- icon_state = "shuttle2"
-
-/area/shuttle/tether/transit
- name = "Tether Shuttle Transit"
- icon_state = "shuttle2"
-
-// rnd (Research and Development)
-/area/rnd/research/testingrange
- name = "\improper Weapons Testing Range"
- icon_state = "firingrange"
-
-/area/rnd/research/researchdivision
- name = "\improper Research Division"
- icon_state = "research"
-
-/area/rnd/outpost
- name = "\improper Research Outpost Hallway"
- icon_state = "research"
-
-/area/rnd/outpost/airlock
- name = "\improper Research Outpost Airlock"
- icon_state = "green"
-
-/area/rnd/outpost/eva
- name = "Research Outpost EVA Storage"
- icon_state = "eva"
-
-/area/rnd/outpost/chamber
- name = "\improper Research Outpost Burn Chamber"
- icon_state = "engine"
-
-/area/rnd/outpost/atmos
- name = "Research Outpost Atmospherics"
- icon_state = "atmos"
-
-/area/rnd/outpost/storage
- name = "\improper Research Outpost Gas Storage"
- icon_state = "toxstorage"
-
-/area/rnd/outpost/mixing
- name = "\improper Research Outpost Gas Mixing"
- icon_state = "toxmix"
-
-/area/rnd/outpost/heating
- name = "\improper Research Outpost Gas Heating"
- icon_state = "toxmix"
-
-/area/rnd/outpost/testing
- name = "\improper Research Outpost Testing"
- icon_state = "toxtest"
-
-/area/maintenance/substation/outpost
- name = "Research Outpost Substation"
-
/area/engineering/engine_gas
name = "\improper Engine Gas Storage"
icon_state = "engine_waste"
-
-/area/chapel/observation
- name = "\improper Chapel Observation"
- icon_state = "chapel"
\ No newline at end of file
diff --git a/code/game/area/areas_vr.dm b/code/game/area/areas_vr.dm
new file mode 100644
index 00000000000..d422c1cd0f1
--- /dev/null
+++ b/code/game/area/areas_vr.dm
@@ -0,0 +1,6 @@
+/area/shuttle_arrived()
+ .=..()
+ for(var/obj/machinery/telecomms/relay/R in contents)
+ R.reset_z()
+ for(var/obj/machinery/power/apc/A in contents)
+ A.update_area()
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 6929943de22..631ed4df19f 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -388,7 +388,8 @@
blood_DNA = list()
was_bloodied = 1
- blood_color = "#A10808"
+ if(!blood_color)
+ blood_color = "#A10808"
if(istype(M))
if (!istype(M.dna, /datum/dna))
M.dna = new /datum/dna(null)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index adaabce4422..c8f0b44c3d5 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -1,6 +1,6 @@
/atom/movable
layer = OBJ_LAYER
- appearance_flags = TILE_BOUND|PIXEL_SCALE
+ appearance_flags = TILE_BOUND|PIXEL_SCALE|KEEP_TOGETHER //VOREStation Edit
var/last_move = null
var/anchored = 0
// var/elevation = 2 - not used anywhere
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index b5a73224fc7..23d8c7b60fa 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 998b712828f..1fe5d43a599 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 627b4e8b140..373aefa0d81 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 ef1ab650a19..f2d7b458319 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 45b230b00c1..02285a0c7ee 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 947f06cee45..c05ad96e81e 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 3f3c1bd7adc..192f8b38741 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 347881df9b2..e2fede649e2 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 bc68428d892..e1a2b10cff9 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 a94ad1744aa..92e7a80a308 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 7853a9603e8..f50460a826b 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 16303f7c589..81930a7ebc7 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 0c5d91d83b6..35ce94daf0e 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 cae98164a0e..3581a8d06a2 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 f7760e9ce6a..ed60400517e 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 c8e5f116040..105de8f4f56 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 f2742490f66..6a5cf807300 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 ae953176838..6b84c577ff6 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 660434d185a..30679b6ef5a 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 2eb628b8f6c..6d1e9ee300c 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 9362333c57c..77bab9bd998 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 66f13e720f1..a50a41269f7 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 7fe4ab232be..0648fa8ab65 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 6d6228eba88..51083616697 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 4989c27f877..a2b9013c5a3 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 334b0c139f8..16d24c878f1 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 678e195e22a..1f6bc7b93dc 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/cultify/mob.dm b/code/game/gamemodes/cult/cultify/mob.dm
index d78956c40ab..0cadd06d6cf 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/gameticker.dm b/code/game/gamemodes/gameticker.dm
index 69733a60d8d..04d8e853633 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -284,7 +284,7 @@ var/global/datum/controller/gameticker/ticker
var/mob/living/carbon/human/new_char = player.create_character()
if(new_char)
qdel(player)
- if(istype(new_char))
+ if(istype(new_char) && !(new_char.mind.assigned_role=="Cyborg"))
data_core.manifest_inject(new_char)
//VOREStation Edit End
@@ -304,7 +304,7 @@ var/global/datum/controller/gameticker/ticker
if(!player_is_antag(player.mind, only_offstation_roles = 1))
job_master.EquipRank(player, player.mind.assigned_role, 0)
UpdateFactionList(player)
- equip_custom_items(player)
+ //equip_custom_items(player) //VOREStation Removal
//player.apply_traits() //VOREStation Removal
if(captainless)
for(var/mob/M in player_list)
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 4380331b50d..1ac4779414d 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 7904b5cb6c4..6dc3f2d52b1 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 681d29da50b..adfeda58ab1 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/assistant.dm b/code/game/jobs/job/assistant.dm
index 06c22a4c8bc..d20e3925992 100644
--- a/code/game/jobs/job/assistant.dm
+++ b/code/game/jobs/job/assistant.dm
@@ -1,54 +1,26 @@
-//VOREStation Edit - Basically this whole file
-/datum/job/intern
- title = "Intern"
- flag = INTERN
- department = "Civilian"
- department_flag = ENGSEC // VOREStation Edit - Ran out of bits
- faction = "Station"
- total_positions = -1
- spawn_positions = -1
- supervisors = "the staff from the departmen you're interning in"
- selection_color = "#555555"
- economic_modifier = 2
- access = list() //See /datum/job/assistant/get_access()
- minimal_access = list() //See /datum/job/assistant/get_access()
- outfit_type = /decl/hierarchy/outfit/job/assistant/intern
- alt_titles = list("Apprentice Engineer","Medical Intern","Lab Assistant","Security Cadet","Jr. Cargo Tech", "Jr. Explorer") //VOREStation Edit
- timeoff_factor = 0 //VOREStation Edit - Interns, noh
-
-//VOREStation Add
-/datum/job/intern/New()
- ..()
- if(config)
- total_positions = config.limit_interns
- spawn_positions = config.limit_interns
-//VOREStation Add End
-
-// VOREStation Add
/datum/job/assistant
- title = USELESS_JOB
+ title = "Assistant"
flag = ASSISTANT
department = "Civilian"
department_flag = CIVILIAN
faction = "Station"
total_positions = -1
spawn_positions = -1
- supervisors = "nobody! You don't work here"
+ supervisors = "absolutely everyone"
selection_color = "#515151"
economic_modifier = 1
- access = list()
- minimal_access = list()
+ access = list() //See /datum/job/assistant/get_access()
+ minimal_access = list() //See /datum/job/assistant/get_access()
outfit_type = /decl/hierarchy/outfit/job/assistant
- timeoff_factor = 0
-/datum/job/assistant/New()
- ..()
- if(config)
- total_positions = config.limit_visitors
- spawn_positions = config.limit_visitors
+/* alt_titles = list(
+ "Technical Assistant",
+ "Medical Intern",
+ "Research Assistant",
+ "Visitor" = /decl/hierarchy/outfit/job/assistant/visitor
+ ) */ //VOREStation Removal: no alt-titles for visitors
/datum/job/assistant/get_access()
if(config.assistant_maint)
return list(access_maint_tunnels)
else
return list()
-//VOREStation Add End
diff --git a/code/game/jobs/job/assistant_vr.dm b/code/game/jobs/job/assistant_vr.dm
new file mode 100644
index 00000000000..212ca5f847f
--- /dev/null
+++ b/code/game/jobs/job/assistant_vr.dm
@@ -0,0 +1,42 @@
+/datum/job/intern
+ title = "Intern"
+ flag = INTERN
+ department = "Civilian"
+ department_flag = ENGSEC // Ran out of bits
+ faction = "Station"
+ total_positions = -1
+ spawn_positions = -1
+ supervisors = "the staff from the department you're interning in"
+ selection_color = "#555555"
+ economic_modifier = 2
+ access = list() //See /datum/job/intern/get_access()
+ minimal_access = list() //See /datum/job/intern/get_access()
+ outfit_type = /decl/hierarchy/outfit/job/assistant/intern
+ alt_titles = list("Apprentice Engineer","Medical Intern","Lab Assistant","Security Cadet","Jr. Cargo Tech", "Jr. Explorer", "Server" = /decl/hierarchy/outfit/job/service/server)
+ timeoff_factor = 0 // Interns, noh
+
+/datum/job/intern/New()
+ ..()
+ if(config)
+ total_positions = config.limit_interns
+ spawn_positions = config.limit_interns
+
+/datum/job/intern/get_access()
+ if(config.assistant_maint)
+ return list(access_maint_tunnels)
+ else
+ return list()
+
+/datum/job/assistant // Visitor
+ title = USELESS_JOB
+ supervisors = "nobody! You don't work here"
+ timeoff_factor = 0
+
+/datum/job/assistant/New()
+ ..()
+ if(config)
+ total_positions = config.limit_visitors
+ spawn_positions = config.limit_visitors
+
+/datum/job/assistant/get_access()
+ return list()
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index 94a32c3841b..f1e0a1b8b2a 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -31,7 +31,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
H.implant_loyalty(src)
*/
/datum/job/captain/get_access()
- return get_all_station_access()
+ return get_all_station_access().Copy()
/datum/job/hop
title = "Head of Personnel"
@@ -60,13 +60,13 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
- access_hop, access_RC_announce, access_keycard_auth) //, access_gateway) //VOREStation Edit
+ access_hop, access_RC_announce, access_keycard_auth, access_gateway)
minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
- access_hop, access_RC_announce, access_keycard_auth) //, access_gateway) //VOREStation Edit
+ access_hop, access_RC_announce, access_keycard_auth, access_gateway)
/datum/job/secretary
title = "Command Secretary"
diff --git a/code/game/jobs/job/captain_vr.dm b/code/game/jobs/job/captain_vr.dm
new file mode 100644
index 00000000000..b6c38cae15e
--- /dev/null
+++ b/code/game/jobs/job/captain_vr.dm
@@ -0,0 +1,23 @@
+/datum/job/captain
+ disallow_jobhop = TRUE
+
+/datum/job/hop
+
+ disallow_jobhop = TRUE
+ alt_titles = list("Deputy Director", "Crew Resources Officer")
+
+ access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
+ access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
+ access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
+ access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
+ access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
+ access_hop, access_RC_announce, access_keycard_auth)
+ minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
+ access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
+ access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
+ access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
+ access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
+ access_hop, access_RC_announce, access_keycard_auth)
+
+/datum/job/secretary
+ disallow_jobhop = TRUE
\ No newline at end of file
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index 1b59d5a2a0f..d31a551726c 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -132,8 +132,8 @@
department = "Civilian"
department_flag = CIVILIAN
faction = "Station"
- total_positions = 2 // VOREStation Edit. Original number is 1.
- spawn_positions = 2 // VOREStation Edit. Original number is 1.
+ total_positions = 1
+ spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian/librarian
diff --git a/code/game/jobs/job/civilian_vr.dm b/code/game/jobs/job/civilian_vr.dm
new file mode 100644
index 00000000000..9a13c8925fb
--- /dev/null
+++ b/code/game/jobs/job/civilian_vr.dm
@@ -0,0 +1,28 @@
+/datum/job/chef
+ total_positions = 2 //IT TAKES A LOT TO MAKE A STEW
+ spawn_positions = 2 //A PINCH OF SALT AND LAUGHTER, TOO
+
+/datum/job/cargo_tech
+ total_positions = 3
+ spawn_positions = 3
+
+/datum/job/mining
+ total_positions = 4
+ spawn_positions = 4
+
+/datum/job/janitor //Lots of janitor substations on station.
+ total_positions = 3
+ spawn_positions = 3
+ alt_titles = list("Custodian", "Sanitation Technician", "Maid")
+
+//TFF 5/9/19 - restore librarian job slot to 2
+/datum/job/librarian
+ total_positions = 2
+ spawn_positions = 2
+ alt_titles = list("Journalist", "Historian", "Writer")
+
+/datum/job/lawyer
+ disallow_jobhop = TRUE
+
+
+
diff --git a/code/game/jobs/job/engineering_vr.dm b/code/game/jobs/job/engineering_vr.dm
new file mode 100644
index 00000000000..da4b94de38d
--- /dev/null
+++ b/code/game/jobs/job/engineering_vr.dm
@@ -0,0 +1,5 @@
+/datum/job/chief_engineer
+ disallow_jobhop = TRUE
+
+/datum/job/atmos
+ spawn_positions = 3
\ No newline at end of file
diff --git a/code/game/jobs/job/medical_vr.dm b/code/game/jobs/job/medical_vr.dm
new file mode 100644
index 00000000000..bd541fb00a7
--- /dev/null
+++ b/code/game/jobs/job/medical_vr.dm
@@ -0,0 +1,5 @@
+/datum/job/cmo
+ disallow_jobhop = TRUE
+
+/datum/job/doctor
+ spawn_positions = 5
\ No newline at end of file
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index 3a2c213884f..c65f3413b6b 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_eva, access_network) //VOREStation Edit
+ access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_network)
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) //VOREStation Edit
+ access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_network)
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
new file mode 100644
index 00000000000..408101842d2
--- /dev/null
+++ b/code/game/jobs/job/science_vr.dm
@@ -0,0 +1,14 @@
+/datum/job/rd
+ disallow_jobhop = TRUE
+
+ 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)
+ 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)
+
+/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/security.dm b/code/game/jobs/job/security.dm
index 0316f824c80..6b753f519c0 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -14,12 +14,12 @@
economic_modifier = 10
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
- access_research, access_engine, access_mining, access_construction, access_mailsorting,
- access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)//VOREStation Edit
+ access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
+ access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
- access_research, access_engine, access_mining, access_construction, access_mailsorting,
- access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)//VOREStation Edit
+ access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
+ access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
minimum_character_age = 25
minimal_player_age = 14
diff --git a/code/game/jobs/job/security_vr.dm b/code/game/jobs/job/security_vr.dm
new file mode 100644
index 00000000000..8d53dc4a1d5
--- /dev/null
+++ b/code/game/jobs/job/security_vr.dm
@@ -0,0 +1,11 @@
+/datum/job/hos
+ disallow_jobhop = TRUE
+
+ access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
+ access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
+ access_research, access_engine, access_mining, access_construction, access_mailsorting,
+ access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
+ minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
+ access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
+ access_research, access_engine, access_mining, access_construction, access_mailsorting,
+ access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
\ No newline at end of file
diff --git a/code/game/jobs/job/silicon_vr.dm b/code/game/jobs/job/silicon_vr.dm
new file mode 100644
index 00000000000..44cb17ec720
--- /dev/null
+++ b/code/game/jobs/job/silicon_vr.dm
@@ -0,0 +1,3 @@
+/datum/job/cyborg
+ total_positions = 4 //Along with one able to spawn later in the round.
+ spawn_positions = 3 //Let's have 3 able to spawn in roundstart
\ No newline at end of file
diff --git a/code/game/jobs/job/special.dm b/code/game/jobs/job/special_vr.dm
similarity index 99%
rename from code/game/jobs/job/special.dm
rename to code/game/jobs/job/special_vr.dm
index 7d1ccead195..fbed7452404 100644
--- a/code/game/jobs/job/special.dm
+++ b/code/game/jobs/job/special_vr.dm
@@ -37,8 +37,7 @@
return 1
get_access()
- var/access = get_all_accesses()
- return access
+ return get_all_accesses().Copy()
/*/datum/job/centcom_visitor //For Pleasure // You mean for admin abuse... -Ace
title = "CentCom Visitor"
diff --git a/code/game/jobs/job/z_all_jobs_vr.dm b/code/game/jobs/job/z_all_jobs_vr.dm
deleted file mode 100644
index 0e740c70922..00000000000
--- a/code/game/jobs/job/z_all_jobs_vr.dm
+++ /dev/null
@@ -1,77 +0,0 @@
-//Contains all modified jobs for easy access and editing.
-
-/datum/job/captain
- disallow_jobhop = TRUE
-
-/datum/job/hop
- disallow_jobhop = TRUE
- alt_titles = list("Deputy Director", "Crew Resources Officer")
-
-/datum/job/hos
- disallow_jobhop = TRUE
-
-/datum/job/chief_engineer
- disallow_jobhop = TRUE
-
-/datum/job/cmo
- disallow_jobhop = TRUE
-
-/datum/job/rd
- disallow_jobhop = TRUE
-
-/datum/job/secretary
- disallow_jobhop = TRUE
-
-/datum/job/lawyer
- disallow_jobhop = TRUE
-
-/datum/job/doctor
- total_positions = 5
- spawn_positions = 5
-
-/datum/job/janitor //Lots of janitor substations on station.
- total_positions = 3
- spawn_positions = 3
- alt_titles = list("Custodian", "Sanitation Technician", "Maid")
-
-/datum/job/librarian
- alt_titles = list("Journalist", "Historian", "Writer")
-
-/datum/job/officer
- total_positions = 4
- spawn_positions = 4
-
-/datum/job/cargo_tech
- total_positions = 3
- spawn_positions = 3
-
-/datum/job/psychiatrist
- total_positions = 1
- spawn_positions = 1
-
-/datum/job/mining
- total_positions = 4
- spawn_positions = 4
-
-/datum/job/cyborg
- total_positions = 4 //Along with one able to spawn later in the round.
- spawn_positions = 3 //Let's have 3 able to spawn in roundstart
-
-/datum/job/bartender
- total_positions = 2
- spawn_positions = 2
-
-/datum/job/chef
- total_positions = 2 //IT TAKES A LOT TO MAKE A STEW
- spawn_positions = 2 //A PINCH OF SALT AND LAUGHTER, TOO
-
-/datum/job/engineer
- total_positions = 5
- spawn_positions = 5
-
-/datum/job/atmos
- total_positions = 3
- spawn_positions = 3
-
-/datum/job/scientist
- alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher", "Circuit Designer")
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index e454c93b18a..b5d42ba2f67 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/Sleeper.dm b/code/game/machinery/Sleeper.dm
index b259fe1dedc..b73b8b8415c 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -26,11 +26,12 @@
for(dir in list(NORTH, EAST, SOUTH, WEST)) // Loop through every direction
sleepernew = locate(/obj/machinery/sleeper, get_step(src, dir)) // Try to find a scanner in that direction
if(sleepernew)
+ // VOREStation Edit Start
sleeper = sleepernew
sleepernew.console = src
- set_dir(get_dir(src, sleepernew))
- return
- return
+ break
+ // VOREStation Edit End
+
/obj/machinery/sleep_console/attack_ai(var/mob/user)
return attack_hand(user)
@@ -45,7 +46,7 @@
to_chat(user, "Sleeper not found!")
return
- if(sleeper.panel_open)
+ if(panel_open)
to_chat(user, "Close the maintenance panel first.")
return
@@ -108,6 +109,7 @@
else
data["beaker"] = -1
data["filtering"] = S.filtering
+ data["pump"] = S.pumping
var/stasis_level_name = "Error!"
for(var/N in S.stasis_choices)
@@ -142,6 +144,9 @@
if(href_list["sleeper_filter"])
if(S.filtering != text2num(href_list["sleeper_filter"]))
S.toggle_filter()
+ if(href_list["pump"])
+ if(S.pumping != text2num(href_list["pump"]))
+ S.toggle_pump()
if(href_list["chemical"] && href_list["amount"])
if(S.occupant && S.occupant.stat != DEAD)
if(href_list["chemical"] in S.available_chemicals) // Your hacks are bad and you should feel bad
@@ -166,6 +171,7 @@
var/list/base_chemicals = list("inaprovaline" = "Inaprovaline", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin")
var/obj/item/weapon/reagent_containers/glass/beaker = null
var/filtering = 0
+ var/pumping = 0
var/obj/machinery/sleep_console/console
var/stasis_level = 0 //Every 'this' life ticks are applied to the mob (when life_ticks%stasis_level == 1)
var/stasis_choices = list("Complete (1%)" = 100, "Deep (10%)" = 10, "Moderate (20%)" = 5, "Light (50%)" = 2, "None (100%)" = 0)
@@ -263,6 +269,13 @@
else
toggle_filter()
+ if(pumping > 0)
+ if(beaker)
+ if(beaker.reagents.total_volume < beaker.reagents.maximum_volume)
+ for(var/datum/reagent/x in occupant.ingested.reagent_list)
+ occupant.ingested.trans_to_obj(beaker, 3)
+ else
+ toggle_pump()
/obj/machinery/sleeper/update_icon()
icon_state = "sleeper_[occupant ? "1" : "0"]"
@@ -301,14 +314,12 @@
return
if(UNCONSCIOUS)
to_chat(usr, "You struggle through the haze to hit the eject button. This will take a couple of minutes...")
- sleep(2 MINUTES)
- if(!src || !usr || !occupant || (occupant != usr)) //Check if someone's released/replaced/bombed him already
- return
- go_out()
+ if(do_after(usr, 2 MINUTES, src))
+ go_out()
if(CONSCIOUS)
go_out()
else
- if(usr.stat != 0)
+ if(usr.stat != CONSCIOUS)
return
go_out()
add_fingerprint(usr)
@@ -326,6 +337,9 @@
if(filtering)
toggle_filter()
+ if(pumping)
+ toggle_pump()
+
if(stat & (BROKEN|NOPOWER))
..(severity)
return
@@ -340,6 +354,12 @@
return
filtering = !filtering
+/obj/machinery/sleeper/proc/toggle_pump()
+ if(!occupant || !beaker)
+ pumping = 0
+ return
+ pumping = !pumping
+
/obj/machinery/sleeper/proc/go_in(var/mob/M, var/mob/user)
if(!M)
return
@@ -370,7 +390,8 @@
update_icon()
/obj/machinery/sleeper/proc/go_out()
- if(!occupant)
+ if(!occupant || occupant.loc != src)
+ occupant = null // JUST IN CASE
return
if(occupant.client)
occupant.client.eye = occupant.client.mob
@@ -387,6 +408,7 @@
update_use_power(1)
update_icon()
toggle_filter()
+ toggle_pump()
/obj/machinery/sleeper/proc/remove_beaker()
if(beaker)
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index 8778b4e5f3b..085c070f7d8 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -149,6 +149,8 @@
var/power_losses
var/last_power_draw = 0
var/obj/item/weapon/cell/cell
+ var/use_cell = TRUE
+ var/removeable_cell = TRUE
/obj/machinery/portable_atmospherics/powered/powered()
if(use_power) //using area power
@@ -158,7 +160,7 @@
return 0
/obj/machinery/portable_atmospherics/powered/attackby(obj/item/I, mob/user)
- if(istype(I, /obj/item/weapon/cell))
+ if(use_cell && istype(I, /obj/item/weapon/cell))
if(cell)
to_chat(user, "There is already a power cell installed.")
return
@@ -173,7 +175,7 @@
power_change()
return
- if(I.is_screwdriver())
+ if(I.is_screwdriver() && removeable_cell)
if(!cell)
to_chat(user, "There is no power cell installed.")
return
diff --git a/code/game/machinery/autolathe_vr.dm b/code/game/machinery/autolathe_vr.dm
deleted file mode 100644
index 489c97f2f52..00000000000
--- 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 f60fcabbfab..19c790b06b7 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 4f6b7df94f1..a1c954df007 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 8e3cb117f97..52a31d5afe9 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 96e6f6b5f9e..5178d77d822 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/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index c31c8f650b9..480effcf98e 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 ea881323c8c..bf201989fea 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/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index 0935dfa7248..7e25bb2df97 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -351,6 +351,12 @@
name = "Cell 6"
id = "Cell 6"
+
+/obj/machinery/door_timer/tactical_pet_storage //Vorestation Addition
+ name = "Tactical Pet Storage"
+ id = "tactical_pet_storage"
+ desc = "Opens and Closes on a timer. This one seals away a tactical boost in morale."
+
#undef FONT_SIZE
#undef FONT_COLOR
#undef FONT_STYLE
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index c55a7d8345f..43fb8340ef3 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 88bf735f539..41c7a33a19c 100644
--- a/code/game/machinery/frame.dm
+++ b/code/game/machinery/frame.dm
@@ -102,6 +102,11 @@
circuit = /obj/item/weapon/circuitboard/grinder
frame_size = 3
+/datum/frame/frame_types/reagent_distillery
+ name = "Distillery"
+ frame_class = FRAME_CLASS_MACHINE
+ frame_size = 4
+
/datum/frame/frame_types/display
name = "Display"
frame_class = FRAME_CLASS_DISPLAY
@@ -186,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
@@ -201,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)
..()
@@ -254,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()
@@ -271,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()
@@ -284,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)
@@ -581,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))
@@ -600,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/machinery.dm b/code/game/machinery/machinery.dm
index 4251a0e6067..5d2ed9a1743 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -214,7 +214,6 @@ Class Procs:
/obj/machinery/CanUseTopic(var/mob/user)
if(!interact_offline && (stat & (NOPOWER | BROKEN)))
return STATUS_CLOSE
-
return ..()
/obj/machinery/CouldUseTopic(var/mob/user)
@@ -458,4 +457,4 @@ Class Procs:
return
/datum/proc/remove_visual(mob/M)
- return
\ No newline at end of file
+ return
diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm
index 74cc399beb1..7665fd0e83a 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/portable_turret.dm b/code/game/machinery/portable_turret.dm
index ab772202816..9c29365ae42 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -74,6 +74,7 @@
var/check_synth = FALSE //if active, will shoot at anything not an AI or cyborg
var/check_all = FALSE //If active, will fire on anything, including synthetics.
var/ailock = FALSE // AI cannot use this
+ var/check_down = FALSE //If active, will shoot to kill when lethals are also on
var/faction = null //if set, will not fire at people in the same faction for any reason.
var/attacked = FALSE //if set to TRUE, the turret gets pissed off and shoots at people nearby (unless they have sec access!)
@@ -103,6 +104,7 @@
check_weapons = TRUE
check_anomalies = TRUE
check_all = FALSE
+ check_down = TRUE
/obj/machinery/porta_turret/can_catalogue(mob/user) // Dead turrets can't be scanned.
if(stat & BROKEN)
@@ -224,6 +226,7 @@
check_records = FALSE
check_anomalies = FALSE
check_all = FALSE
+ check_down = FALSE
/obj/machinery/porta_turret/lasertag/red
turret_type = "red"
@@ -264,8 +267,8 @@
data["access"] = !isLocked(user)
data["locked"] = locked
data["enabled"] = enabled
- data["is_lethal"] = 1
- data["lethal"] = lethal
+ //data["is_lethal"] = 1 // VOREStation Removal of "Lethal" setting - it does nothing. Rykka did dis.
+ //data["lethal"] = lethal // VOREStation Removal of "Lethal" setting - it does nothing. Rykka did dis.
if(data["access"])
var/settings[0]
@@ -288,8 +291,8 @@
var/value = text2num(href_list["value"])
if(href_list["command"] == "enable")
enabled = value
- else if(href_list["command"] == "lethal")
- lethal = value
+ //else if(href_list["command"] == "lethal") // VOREStation Removal of "Lethal" setting - it does nothing. Rykka did dis.
+ //lethal = value // VOREStation Removal of "Lethal" setting - it does nothing. Rykka did dis.
else if(href_list["command"] == "check_synth")
check_synth = value
else if(href_list["command"] == "check_weapons")
@@ -404,7 +407,7 @@
return 1
if(locked && !issilicon(user))
- to_chat(user, "Access denied.")
+ to_chat(user, "Controls locked.")
return 1
return 0
@@ -438,6 +441,7 @@
settings[++settings.len] = list("category" = "Check Access Authorization", "setting" = "check_access", "value" = check_access)
settings[++settings.len] = list("category" = "Check misc. Lifeforms", "setting" = "check_anomalies", "value" = check_anomalies)
settings[++settings.len] = list("category" = "Neutralize All Entities", "setting" = "check_all", "value" = check_all)
+ settings[++settings.len] = list("category" = "Neutralize Downed Entities", "setting" = "check_down", "value" = check_down)
data["settings"] = settings
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
@@ -489,6 +493,8 @@
check_anomalies = value
else if(href_list["command"] == "check_all")
check_all = value
+ else if(href_list["command"] == "check_down")
+ check_down = value
return 1
@@ -732,7 +738,7 @@
if(!emagged && issilicon(L) && check_all == FALSE) // Don't target silica, unless told to neutralize everything.
return TURRET_NOT_TARGET
- if(L.stat && !emagged) //if the perp is dead/dying, no need to bother really
+ if(L.stat == DEAD && !emagged) //if the perp is dead, no need to bother really
return TURRET_NOT_TARGET //move onto next potential victim!
if(get_dist(src, L) > 7) //if it's too far away, why bother?
@@ -749,7 +755,7 @@
if(check_synth || check_all) //If it's set to attack all non-silicons or everything, target them!
if(L.lying)
- return lethal ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET
+ return check_down ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET
return TURRET_PRIORITY_TARGET
if(iscuffed(L)) // If the target is handcuffed, leave it alone
@@ -766,7 +772,7 @@
return TURRET_NOT_TARGET //if threat level < 4, keep going
if(L.lying) //if the perp is lying down, it's still a target but a less-important target
- return lethal ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET
+ return check_down ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET
return TURRET_PRIORITY_TARGET //if the perp has passed all previous tests, congrats, it is now a "shoot-me!" nominee
@@ -1132,4 +1138,4 @@
#undef TURRET_PRIORITY_TARGET
#undef TURRET_SECONDARY_TARGET
-#undef TURRET_NOT_TARGET
\ No newline at end of file
+#undef TURRET_NOT_TARGET
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 691492a88fd..e9997425078 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -10,7 +10,7 @@
active_power_usage = 40000 //40 kW
var/efficiency = 40000 //will provide the modified power rate when upgraded
var/obj/item/charging = null
- var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/modular_computer, /obj/item/weapon/computer_hardware/battery_module, /obj/item/weapon/cell, /obj/item/device/flashlight, /obj/item/device/electronic_assembly, /obj/item/weapon/weldingtool/electric, /obj/item/ammo_magazine/smart, /obj/item/device/flash, /obj/item/ammo_casing/nsfw_batt) //VOREStation Add - NSFW Batteries
+ var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/modular_computer, /obj/item/weapon/computer_hardware/battery_module, /obj/item/weapon/cell, /obj/item/device/flashlight, /obj/item/device/electronic_assembly, /obj/item/weapon/weldingtool/electric, /obj/item/ammo_magazine/smart, /obj/item/device/flash, /obj/item/ammo_casing/microbattery) //VOREStation Add - NSFW Batteries
var/icon_state_charged = "recharger2"
var/icon_state_charging = "recharger1"
var/icon_state_idle = "recharger0" //also when unpowered
@@ -72,7 +72,7 @@
if(EW.use_external_power)
to_chat(user, "\The [EW] has no recharge port.")
return
- else if(!G.get_cell() && !istype(G, /obj/item/ammo_casing/nsfw_batt)) //VOREStation Edit: NSFW charging
+ else if(!G.get_cell() && !istype(G, /obj/item/ammo_casing/microbattery)) //VOREStation Edit: NSFW charging
to_chat(user, "\The [G] does not have a battery installed.")
return
@@ -157,8 +157,8 @@
update_use_power(1)
//VOREStation Add - NSFW Batteries
- else if(istype(charging, /obj/item/ammo_casing/nsfw_batt))
- var/obj/item/ammo_casing/nsfw_batt/batt = charging
+ else if(istype(charging, /obj/item/ammo_casing/microbattery))
+ var/obj/item/ammo_casing/microbattery/batt = charging
if(batt.shots_left >= initial(batt.shots_left))
icon_state = icon_state_charged
update_use_power(1)
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index d94ac049b9a..a8c9492e236 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -648,7 +648,7 @@
model_text = "Exploration"
departments = list("Exploration","Old Exploration")
-/obj/machinery/suit_cycler/exploreration/Initialize()
+/obj/machinery/suit_cycler/exploration/Initialize()
species -= SPECIES_TESHARI
return ..()
@@ -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 00000000000..ef6b3da0bbf
--- /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/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index cd65fb9f910..8f6e8e589ea 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -22,7 +22,17 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
machinetype = 5
produces_heat = 0
delay = 7
- circuitboard = "/obj/item/weapon/circuitboard/telecomms/broadcaster"
+ circuit = /obj/item/weapon/circuitboard/telecomms/broadcaster
+
+/obj/machinery/telecomms/processor/Initialize()
+ . = ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src)
+ component_parts += new /obj/item/weapon/stock_parts/subspace/crystal(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser/high(src)
+ component_parts += new /obj/item/stack/cable_coil(src, 1)
/obj/machinery/telecomms/broadcaster/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
// Don't broadcast rejected signals
diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm
index 331f5644d92..d41104df251 100644
--- a/code/game/machinery/telecomms/machine_interactions.dm
+++ b/code/game/machinery/telecomms/machine_interactions.dm
@@ -12,7 +12,6 @@
/obj/machinery/telecomms
var/temp = "" // output message
- var/construct_op = 0
/obj/machinery/telecomms/attackby(obj/item/P as obj, mob/user as mob)
@@ -21,7 +20,6 @@
if(istype(P, /obj/item/device/multitool))
attack_hand(user)
-
// REPAIRING: Use Nanopaste to repair 10-20 integrity points.
if(istype(P, /obj/item/stack/nanopaste))
var/obj/item/stack/nanopaste/T = P
@@ -34,75 +32,10 @@
return
- switch(construct_op)
- if(0)
- if(P.is_screwdriver())
- to_chat(user, "You unfasten the bolts.")
- playsound(src.loc, P.usesound, 50, 1)
- construct_op ++
- if(1)
- if(P.is_screwdriver())
- to_chat(user, "You fasten the bolts.")
- playsound(src.loc, P.usesound, 50, 1)
- construct_op --
- if(P.is_wrench())
- to_chat(user, "You dislodge the external plating.")
- playsound(src.loc, P.usesound, 75, 1)
- construct_op ++
- if(2)
- if(P.is_wrench())
- to_chat(user, "You secure the external plating.")
- playsound(src.loc, P.usesound, 75, 1)
- construct_op --
- if(P.is_wirecutter())
- playsound(src.loc, P.usesound, 50, 1)
- to_chat(user, "You remove the cables.")
- construct_op ++
- var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( user.loc )
- A.amount = 5
- stat |= BROKEN // the machine's been borked!
- if(3)
- if(istype(P, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/A = P
- if (A.use(5))
- to_chat(user, "You insert the cables.")
- construct_op--
- stat &= ~BROKEN // the machine's not borked anymore!
- else
- to_chat(user, "You need five coils of wire for this.")
- if(P.is_crowbar())
- to_chat(user, "You begin prying out the circuit board other components...")
- playsound(src.loc, P.usesound, 50, 1)
- if(do_after(user,60 * P.toolspeed))
- to_chat(user, "You finish prying out the components.")
-
- // Drop all the component stuff
- if(contents.len > 0)
- for(var/obj/x in src)
- x.loc = user.loc
- else
-
- // If the machine wasn't made during runtime, probably doesn't have components:
- // manually find the components and drop them!
- var/newpath = text2path(circuitboard)
- var/obj/item/weapon/circuitboard/C = new newpath
- for(var/I in C.req_components)
- for(var/i = 1, i <= C.req_components[I], i++)
- newpath = text2path(I)
- var/obj/item/s = new newpath
- s.loc = user.loc
- if(istype(P, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/A = P
- A.amount = 1
-
- // Drop a circuit board too
- C.loc = user.loc
-
- // Create a frame and delete the current machine
- var/obj/structure/frame/F = new
- F.loc = src.loc
- qdel(src)
-
+ if(default_deconstruction_screwdriver(user, P))
+ return
+ if(default_deconstruction_crowbar(user, P))
+ return
/obj/machinery/telecomms/attack_ai(var/mob/user as mob)
attack_hand(user)
diff --git a/code/game/machinery/telecomms/presets_vr.dm b/code/game/machinery/telecomms/presets_vr.dm
index 1bd6b92460d..01a07a5f5ed 100644
--- a/code/game/machinery/telecomms/presets_vr.dm
+++ b/code/game/machinery/telecomms/presets_vr.dm
@@ -3,3 +3,6 @@
hide = 1
produces_heat = 0
autolinkers = list("hb_relay")
+
+/obj/machinery/telecomms/relay/proc/reset_z()
+ listening_level = z
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index 50e2f504c9f..d6cefb68283 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -32,7 +32,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
var/produces_heat = 1 //whether the machine will produce heat when on.
var/delay = 10 // how many process() ticks to delay per heat
var/long_range_link = 0 // Can you link it across Z levels or on the otherside of the map? (Relay & Hub)
- var/circuitboard = null // string pointing to a circuitboard type
var/hide = 0 // Is it a hidden machine?
var/listening_level = 0 // 0 = auto set in New() - this is the z level that the machine is listening to.
@@ -256,7 +255,17 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
idle_power_usage = 600
machinetype = 1
produces_heat = 0
- circuitboard = "/obj/item/weapon/circuitboard/telecomms/receiver"
+ circuit = /obj/item/weapon/circuitboard/telecomms/receiver
+
+/obj/machinery/telecomms/receiver/Initialize()
+ . = ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/subspace/ansible(src)
+ component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
+ RefreshParts()
/obj/machinery/telecomms/receiver/receive_signal(datum/signal/signal)
@@ -312,7 +321,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
use_power = 1
idle_power_usage = 1600
machinetype = 7
- circuitboard = "/obj/item/weapon/circuitboard/telecomms/hub"
+ circuit = /obj/item/weapon/circuitboard/telecomms/hub
long_range_link = 1
netspeed = 40
var/list/telecomms_map
@@ -320,6 +329,13 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
/obj/machinery/telecomms/hub/Initialize()
. = ..()
LAZYINITLIST(telecomms_map)
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src)
+ component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/stack/cable_coil(src, 2)
+ RefreshParts()
/obj/machinery/telecomms/hub/process()
. = ..()
@@ -365,12 +381,22 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
idle_power_usage = 600
machinetype = 8
produces_heat = 0
- circuitboard = "/obj/item/weapon/circuitboard/telecomms/relay"
+ circuit = /obj/item/weapon/circuitboard/telecomms/relay
netspeed = 5
long_range_link = 1
var/broadcasting = 1
var/receiving = 1
+/obj/machinery/telecomms/relay/Initialize()
+ . = ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src)
+ component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/stack/cable_coil(src, 2)
+ RefreshParts()
+
/obj/machinery/telecomms/relay/forceMove(var/newloc)
. = ..(newloc)
listening_level = z
@@ -420,10 +446,19 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
use_power = 1
idle_power_usage = 1000
machinetype = 2
- circuitboard = "/obj/item/weapon/circuitboard/telecomms/bus"
+ circuit = /obj/item/weapon/circuitboard/telecomms/bus
netspeed = 40
var/change_frequency = 0
+/obj/machinery/telecomms/bus/Initialize()
+ . = ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/stack/cable_coil(src, 1)
+ RefreshParts()
+
/obj/machinery/telecomms/bus/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
if(is_freq_listening(signal))
@@ -473,23 +508,37 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
idle_power_usage = 600
machinetype = 3
delay = 5
- circuitboard = "/obj/item/weapon/circuitboard/telecomms/processor"
+ circuit = /obj/item/weapon/circuitboard/telecomms/processor
var/process_mode = 1 // 1 = Uncompress Signals, 0 = Compress Signals
- receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
+/obj/machinery/telecomms/processor/Initialize()
+ . = ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src)
+ component_parts += new /obj/item/weapon/stock_parts/subspace/treatment(src)
+ component_parts += new /obj/item/weapon/stock_parts/subspace/treatment(src)
+ component_parts += new /obj/item/weapon/stock_parts/subspace/amplifier(src)
+ component_parts += new /obj/item/weapon/stock_parts/subspace/analyzer(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/stack/cable_coil(src, 2)
+ RefreshParts()
- if(is_freq_listening(signal))
+/obj/machinery/telecomms/processor/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
- if(process_mode)
- signal.data["compression"] = 0 // uncompress subspace signal
- else
- signal.data["compression"] = 100 // even more compressed signal
+ if(is_freq_listening(signal))
- if(istype(machine_from, /obj/machinery/telecomms/bus))
- relay_direct_information(signal, machine_from) // send the signal back to the machine
- else // no bus detected - send the signal to servers instead
- signal.data["slow"] += rand(5, 10) // slow the signal down
- relay_information(signal, "/obj/machinery/telecomms/server")
+ if(process_mode)
+ signal.data["compression"] = 0 // uncompress subspace signal
+ else
+ signal.data["compression"] = 100 // even more compressed signal
+
+ if(istype(machine_from, /obj/machinery/telecomms/bus))
+ relay_direct_information(signal, machine_from) // send the signal back to the machine
+ else // no bus detected - send the signal to servers instead
+ signal.data["slow"] += rand(5, 10) // slow the signal down
+ relay_information(signal, "/obj/machinery/telecomms/server")
/*
@@ -510,7 +559,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
use_power = 1
idle_power_usage = 300
machinetype = 4
- circuitboard = "/obj/item/weapon/circuitboard/telecomms/server"
+ circuit = /obj/item/weapon/circuitboard/telecomms/server
var/list/log_entries = list()
var/list/stored_names = list()
var/list/TrafficActions = list()
@@ -534,6 +583,15 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
Compiler.Holder = src
server_radio = new()
+/obj/machinery/telecomms/server/Initialize()
+ . = ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/stack/cable_coil(src, 1)
+ RefreshParts()
+
/obj/machinery/telecomms/server/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
if(signal.data["message"])
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 663230b11ff..48f9e3c4f23 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 19a24e669ee..0bf7b947146 100644
--- a/code/game/machinery/vending_vr.dm
+++ b/code/game/machinery/vending_vr.dm
@@ -131,3 +131,18 @@
products += list(/obj/item/weapon/reagent_containers/food/snacks/liquidprotein = 8)
prices += list(/obj/item/weapon/reagent_containers/food/snacks/liquidprotein = 10)
..()
+
+/obj/machinery/vending/blood
+ name = "Blood-Onator"
+ desc = "Freezer-vendor for storage and quick dispensing of blood packs"
+ product_ads = "The true life juice!;Vampire's choice!;Home-grown blood only!;Donate today, be saved tomorrow!;Approved by Zeng-Hu Pharmaceuticals Incorporated!; Curse you, Vey-Med artificial blood!"
+ icon_state = "blood"
+ idle_power_usage = 211
+ req_access = list(access_medical)
+ products = list(/obj/item/weapon/reagent_containers/blood/prelabeled/APlus = 3,/obj/item/weapon/reagent_containers/blood/prelabeled/AMinus = 3,
+ /obj/item/weapon/reagent_containers/blood/prelabeled/BPlus = 3,/obj/item/weapon/reagent_containers/blood/prelabeled/BMinus = 3,
+ /obj/item/weapon/reagent_containers/blood/prelabeled/OPlus = 2,/obj/item/weapon/reagent_containers/blood/prelabeled/OMinus = 5,
+ /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
diff --git a/code/game/magic/archived_book.dm b/code/game/magic/archived_book.dm
index 2fc9412fcd9..b2af5f3f73c 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 f94c8bc78ee..a33cd963e2e 100644
--- a/code/game/mecha/combat/gorilla.dm
+++ b/code/game/mecha/combat/gorilla.dm
@@ -87,7 +87,7 @@
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 19564acba9e..d70c8f9e855 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 b8aed16ceff..9521147089b 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 b54368a75e8..8f72de5f517 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/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index 27ae65ea67f..48a46fae56c 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -273,3 +273,6 @@
if(chassis)
chassis.log_message("[src]: [message]")
return
+
+/obj/item/mecha_parts/mecha_equipment/proc/MoveAction() //Allows mech equipment to do an action upon the mech moving
+ return
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index d275c2f4a6d..9f1e5227332 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -10,7 +10,7 @@
var/mob/living/carbon/human/occupant = null
var/datum/global_iterator/pr_mech_sleeper
var/inject_amount = 5
- required_type = /obj/mecha/medical
+ required_type = list(/obj/mecha/medical)
salvageable = 0
allow_duplicate = TRUE
@@ -247,144 +247,6 @@
return
-/obj/item/mecha_parts/mecha_equipment/tool/cable_layer
- name = "Cable Layer"
- icon_state = "mecha_wire"
- var/datum/event/event
- var/turf/old_turf
- var/obj/structure/cable/last_piece
- var/obj/item/stack/cable_coil/cable
- var/max_cable = 1000
- required_type = /obj/mecha/working
-
-/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/New()
- cable = new(src)
- cable.amount = 0
- ..()
-
-/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/attach()
- ..()
- event = chassis.events.addEvent("onMove",src,"layCable")
- return
-
-/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/detach()
- chassis.events.clearEvent("onMove",event)
- return ..()
-
-/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/destroy()
- chassis.events.clearEvent("onMove",event)
- return ..()
-
-/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/action(var/obj/item/stack/cable_coil/target)
- if(!action_checks(target))
- return
- var/result = load_cable(target)
- var/message
- if(isnull(result))
- message = "Unable to load [target] - no cable found."
- else if(!result)
- message = "Reel is full."
- else
- message = "[result] meters of cable successfully loaded."
- send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
- occupant_message(message)
- return
-
-/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/Topic(href,href_list)
- ..()
- if(href_list["toggle"])
- set_ready_state(!equip_ready)
- occupant_message("[src] [equip_ready?"dea":"a"]ctivated.")
- log_message("[equip_ready?"Dea":"A"]ctivated.")
- return
- if(href_list["cut"])
- if(cable && cable.amount)
- var/m = round(input(chassis.occupant,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1)
- m = min(m, cable.amount)
- if(m)
- use_cable(m)
- var/obj/item/stack/cable_coil/CC = new (get_turf(chassis))
- CC.amount = m
- else
- occupant_message("There's no more cable on the reel.")
- return
-
-/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/get_equip_info()
- var/output = ..()
- if(output)
- return "[output] \[Cable: [cable ? cable.amount : 0] m\][(cable && cable.amount) ? "- [!equip_ready?"Dea":"A"]ctivate|Cut" : null]"
- return
-
-/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/load_cable(var/obj/item/stack/cable_coil/CC)
- if(istype(CC) && CC.amount)
- var/cur_amount = cable? cable.amount : 0
- var/to_load = max(max_cable - cur_amount,0)
- if(to_load)
- to_load = min(CC.amount, to_load)
- if(!cable)
- cable = new(src)
- cable.amount = 0
- cable.amount += to_load
- CC.use(to_load)
- return to_load
- else
- return 0
- return
-
-/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/use_cable(amount)
- if(!cable || cable.amount<1)
- set_ready_state(1)
- occupant_message("Cable depleted, [src] deactivated.")
- log_message("Cable depleted, [src] deactivated.")
- return
- if(cable.amount < amount)
- occupant_message("No enough cable to finish the task.")
- return
- cable.use(amount)
- update_equip_info()
- return 1
-
-/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/reset()
- last_piece = null
-
-/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/dismantleFloor(var/turf/new_turf)
- if(istype(new_turf, /turf/simulated/floor))
- var/turf/simulated/floor/T = new_turf
- if(!T.is_plating())
- T.make_plating(!(T.broken || T.burnt))
- return new_turf.is_plating()
-
-/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/layCable(var/turf/new_turf)
- if(equip_ready || !istype(new_turf) || !dismantleFloor(new_turf))
- return reset()
- var/fdirn = turn(chassis.dir,180)
- for(var/obj/structure/cable/LC in new_turf) // check to make sure there's not a cable there already
- if(LC.d1 == fdirn || LC.d2 == fdirn)
- return reset()
- if(!use_cable(1))
- return reset()
- var/obj/structure/cable/NC = new(new_turf)
- NC.cableColor("red")
- NC.d1 = 0
- NC.d2 = fdirn
- NC.update_icon()
-
- var/datum/powernet/PN
- if(last_piece && last_piece.d2 != chassis.dir)
- last_piece.d1 = min(last_piece.d2, chassis.dir)
- last_piece.d2 = max(last_piece.d2, chassis.dir)
- last_piece.update_icon()
- PN = last_piece.powernet
-
- if(!PN)
- PN = new()
- PN.add_cable(NC)
- NC.mergeConnectedNetworks(NC.d2)
-
- //NC.mergeConnectedNetworksOnTurf()
- last_piece = NC
- return 1
-
/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun
name = "syringe gun"
desc = "Exosuit-mounted chem synthesizer with syringe gun. Reagents inside are held in stasis, so no reactions will occur. (Can be attached to: Medical Exosuits)"
@@ -402,7 +264,7 @@
range = MELEE|RANGED
equip_cooldown = 10
origin_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_MAGNET = 4, TECH_DATA = 3)
- required_type = /obj/mecha/medical
+ required_type = list(/obj/mecha/medical)
//This is a list of datums so as to allow id changes, and force compile errors if removed.
var/static/list/allowed_reagents = list(
@@ -712,3 +574,232 @@
S.reagents.add_reagent(reagent,amount)
S.chassis.use_power(energy_drain)
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/medical_tools_vr.dm b/code/game/mecha/equipment/tools/medical_tools_vr.dm
new file mode 100644
index 00000000000..19efa0a5fd2
--- /dev/null
+++ b/code/game/mecha/equipment/tools/medical_tools_vr.dm
@@ -0,0 +1,10 @@
+/obj/item/mecha_parts/mecha_equipment/weapon/energy/medigun
+ equip_cooldown = 6
+ name = "\improper BL-3 \"Phoenix\" directed restoration system"
+ desc = "The BL-3 'Phoenix' is a portable medical system used to treat external injuries from afar."
+ icon_state = "mecha_medbeam"
+ energy_drain = 1000
+ projectile = /obj/item/projectile/beam/medigun
+ fire_sound = 'sound/weapons/eluger.ogg'
+ equip_type = EQUIP_UTILITY
+ origin_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_BIO = 6, TECH_POWER = 6)
\ No newline at end of file
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index ee424671216..73f7356ade6 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
@@ -1537,3 +1537,132 @@
chassis.step_in = initial(chassis.step_in)
..()
return
+
+/obj/item/mecha_parts/mecha_equipment/tool/cable_layer
+ name = "Cable Layer"
+ icon_state = "mecha_wire"
+ var/turf/old_turf
+ var/obj/structure/cable/last_piece
+ var/obj/item/stack/cable_coil/cable
+ var/max_cable = 1000
+ required_type = list(/obj/mecha/working)
+
+/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/New()
+ cable = new(src)
+ cable.amount = 0
+ ..()
+
+/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/MoveAction()
+ layCable()
+
+/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/action(var/obj/item/stack/cable_coil/target)
+ if(!action_checks(target))
+ return
+ var/result = load_cable(target)
+ var/message
+ if(isnull(result))
+ message = "Unable to load [target] - no cable found."
+ else if(!result)
+ message = "Reel is full."
+ else
+ message = "[result] meters of cable successfully loaded."
+ send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
+ occupant_message(message)
+ return
+
+/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/Topic(href,href_list)
+ ..()
+ if(href_list["toggle"])
+ set_ready_state(!equip_ready)
+ occupant_message("[src] [equip_ready?"dea":"a"]ctivated.")
+ log_message("[equip_ready?"Dea":"A"]ctivated.")
+ return
+ if(href_list["cut"])
+ if(cable && cable.amount)
+ var/m = round(input(chassis.occupant,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1)
+ m = min(m, cable.amount)
+ if(m)
+ use_cable(m)
+ var/obj/item/stack/cable_coil/CC = new (get_turf(chassis))
+ CC.amount = m
+ else
+ occupant_message("There's no more cable on the reel.")
+ return
+
+/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/get_equip_info()
+ var/output = ..()
+ if(output)
+ return "[output] \[Cable: [cable ? cable.amount : 0] m\][(cable && cable.amount) ? "- [!equip_ready?"Dea":"A"]ctivate|Cut" : null]"
+ return
+
+/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/load_cable(var/obj/item/stack/cable_coil/CC)
+ if(istype(CC) && CC.amount)
+ var/cur_amount = cable? cable.amount : 0
+ var/to_load = max(max_cable - cur_amount,0)
+ if(to_load)
+ to_load = min(CC.amount, to_load)
+ if(!cable)
+ cable = new(src)
+ cable.amount = 0
+ cable.amount += to_load
+ CC.use(to_load)
+ return to_load
+ else
+ return 0
+ return
+
+/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/use_cable(amount)
+ if(!cable || cable.amount<1)
+ set_ready_state(1)
+ occupant_message("Cable depleted, [src] deactivated.")
+ log_message("Cable depleted, [src] deactivated.")
+ return
+ if(cable.amount < amount)
+ occupant_message("No enough cable to finish the task.")
+ return
+ cable.use(amount)
+ update_equip_info()
+ return 1
+
+/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/reset()
+ last_piece = null
+
+/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/dismantleFloor(var/turf/new_turf)
+ new_turf = get_turf(chassis)
+ if(istype(new_turf, /turf/simulated/floor))
+ var/turf/simulated/floor/T = new_turf
+ if(!T.is_plating())
+ T.make_plating(!(T.broken || T.burnt))
+ return new_turf.is_plating()
+
+/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/layCable(var/turf/new_turf)
+ new_turf = get_turf(chassis)
+ if(equip_ready || !istype(new_turf, /turf/simulated/floor) || !dismantleFloor(new_turf))
+ return reset()
+ var/fdirn = turn(chassis.dir,180)
+ for(var/obj/structure/cable/LC in new_turf) // check to make sure there's not a cable there already
+ if(LC.d1 == fdirn || LC.d2 == fdirn)
+ return reset()
+ if(!use_cable(1))
+ return reset()
+ var/obj/structure/cable/NC = new(new_turf)
+ NC.cableColor("red")
+ NC.d1 = 0
+ NC.d2 = fdirn
+ NC.update_icon()
+
+ var/datum/powernet/PN
+ if(last_piece && last_piece.d2 != chassis.dir)
+ last_piece.d1 = min(last_piece.d2, chassis.dir)
+ last_piece.d2 = max(last_piece.d2, chassis.dir)
+ last_piece.update_icon()
+ PN = last_piece.powernet
+
+ if(!PN)
+ PN = new()
+ PN.add_cable(NC)
+ NC.mergeConnectedNetworks(NC.d2)
+
+ //NC.mergeConnectedNetworksOnTurf()
+ last_piece = NC
+ return 1
\ No newline at end of file
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 5b783c8e50c..74cdb2d368b 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -384,9 +384,16 @@
/obj/mecha/Move()
. = ..()
if(.)
- events.fireEvent("onMove",get_turf(src))
+ MoveAction()
return
+/obj/mecha/proc/MoveAction() //Allows mech equipment to do an action once the mech moves
+ if(!equipment.len)
+ return
+
+ for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
+ ME.MoveAction()
+
/obj/mecha/relaymove(mob/user,direction)
if(user != src.occupant) //While not "realistic", this piece is player friendly.
if(istype(user,/mob/living/carbon/brain))
@@ -621,6 +628,11 @@
/obj/mecha/bullet_act(var/obj/item/projectile/Proj) //wrapper
+ if(istype(Proj, /obj/item/projectile/test))
+ var/obj/item/projectile/test/Test = Proj
+ Test.hit |= occupant // Register a hit on the occupant, for things like turrets, or in simple-mob cases stopping friendly fire in firing line mode.
+ return
+
src.log_message("Hit by projectile. Type: [Proj.name]([Proj.check_armour]).",1)
call((proc_res["dynbulletdamage"]||src), "dynbulletdamage")(Proj) //calls equipment
..()
diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm
index b3b9faa37de..1f90a45d613 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/micro/mechfab_designs_vr.dm b/code/game/mecha/micro/mechfab_designs_vr.dm
index 7a86d8d9ec0..671e53b4da5 100644
--- a/code/game/mecha/micro/mechfab_designs_vr.dm
+++ b/code/game/mecha/micro/mechfab_designs_vr.dm
@@ -185,3 +185,11 @@
id = "weasel_head"
build_path = /obj/item/mecha_parts/micro/part/weasel_head
materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 2500)
+
+/datum/design/item/mecha/medigun
+ name = "BL-3/P directed restoration system"
+ desc = "A portable medical system used to treat external injuries from afar."
+ id = "mech_medigun"
+ req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_BIO = 6)
+ materials = list(DEFAULT_WALL_MATERIAL = 8000, "gold" = 2000, "silver" = 1750, "diamond" = 1500, "phoron" = 4000)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/medigun
\ No newline at end of file
diff --git a/code/game/mecha/space/hoverpod.dm b/code/game/mecha/space/hoverpod.dm
index 85fc59d564b..31558458d99 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 c4813bb0dd3..5dd88eb7e73 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 0de8d332b71..552e8672f8f 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)
+ 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/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 3b1584ca194..7a773c733ec 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -53,7 +53,7 @@ var/global/list/image/splatter_cache=list()
blood_DNA |= B.blood_DNA.Copy()
qdel(B)
drytime = world.time + DRYING_TIME * (amount+1)
- START_PROCESSING(SSobj, src)
+ START_PROCESSING(SSobj, src)
/obj/effect/decal/cleanable/blood/process()
if(world.time > drytime)
@@ -93,7 +93,6 @@ var/global/list/image/splatter_cache=list()
S.overlays += S.blood_overlay
if(S.blood_overlay && S.blood_overlay.color != basecolor)
S.blood_overlay.color = basecolor
- S.overlays.Cut()
S.overlays += S.blood_overlay
S.blood_DNA |= blood_DNA.Copy()
perp.update_inv_shoes()
@@ -200,10 +199,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/map_effects/radiation_emitter.dm b/code/game/objects/effects/map_effects/radiation_emitter.dm
index 3fb31d3c5dc..8abf946556d 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/spiders_vr.dm b/code/game/objects/effects/spiders_vr.dm
new file mode 100644
index 00000000000..65829b95acb
--- /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 b5345cc8ebb..61191381213 100644
--- a/code/game/objects/effects/step_triggers.dm
+++ b/code/game/objects/effects/step_triggers.dm
@@ -6,6 +6,8 @@
invisibility = 99 // nope cant see this shit
plane = ABOVE_PLANE
anchored = 1
+ icon = 'icons/mob/screen1.dmi' //VS Edit
+ icon_state = "centermarker" //VS Edit
/obj/effect/step_trigger/proc/Trigger(var/atom/movable/A)
return 0
@@ -227,6 +229,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/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index 8a9220e87f2..04046985c66 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -44,3 +44,14 @@
icon_state = "explosionfast"
duration = 4
// VOREStation Add End
+
+//VOREStation edit: medigun
+/obj/effect/temp_visual/heal
+ name = "healing glow"
+ icon_state = "heal"
+ duration = 15
+
+/obj/effect/temp_visual/heal/Initialize(mapload)
+ pixel_x = rand(-12, 12)
+ pixel_y = rand(-9, 0)
+//VOREStation edit ends
\ No newline at end of file
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
index 872c652356a..d4f65fc9d10 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
@@ -79,3 +79,12 @@
light_range = 4
light_power = 3
light_color = "#3300ff"
+
+//VOREStation edit: medigun
+/obj/effect/projectile/impact/medigun
+ icon = 'icons/obj/projectiles_vr.dmi'
+ icon_state = "impact_medbeam"
+ light_range = 2
+ light_power = 0.5
+ light_color = "#80F5FF"
+//VOREStation edit ends
\ No newline at end of file
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
index 42511e65774..d901aeaa612 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
@@ -91,3 +91,12 @@
light_range = 4
light_power = 3
light_color = "#3300ff"
+
+//VOREStation edit: medigun
+/obj/effect/projectile/muzzle/medigun
+ icon = 'icons/obj/projectiles_vr.dmi'
+ icon_state = "muzzle_medbeam"
+ light_range = 2
+ light_power = 0.5
+ light_color = "#80F5FF"
+//VOREStation edit ends
\ No newline at end of file
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
index 54fa41265fb..59d56b6c7c4 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
@@ -1,4 +1,12 @@
-/proc/generate_tracer_between_points(datum/point/starting, datum/point/ending, beam_type, color, qdel_in = 5, light_range = 2, light_color_override, light_intensity = 1, instance_key) //Do not pass z-crossing points as that will not be properly (and likely will never be properly until it's absolutely needed) supported!
+/datum/beam_components_cache
+ var/list/beam_components = list()
+
+/datum/beam_components_cache/Destroy()
+ for(var/component in beam_components)
+ qdel(component)
+ return ..()
+
+/proc/generate_tracer_between_points(datum/point/starting, datum/point/ending, datum/beam_components_cache/beam_components, beam_type, color, qdel_in = 5, light_range = 2, light_color_override, light_intensity = 1, instance_key) //Do not pass z-crossing points as that will not be properly (and likely will never be properly until it's absolutely needed) supported!
if(!istype(starting) || !istype(ending) || !ispath(beam_type))
return
var/datum/point/midpoint = point_midpoint_points(starting, ending)
@@ -21,10 +29,9 @@
for(var/obj/effect/projectile_lighting/PL in T)
if(PL.owner == instance_key)
continue tracing_line
- QDEL_IN(new /obj/effect/projectile_lighting(T, light_color_override, light_range, light_intensity, instance_key), qdel_in > 0? qdel_in : 5)
+ beam_components.beam_components += new /obj/effect/projectile_lighting(T, light_color_override, light_range, light_intensity, instance_key)
line = null
- if(qdel_in)
- QDEL_IN(PB, qdel_in)
+ beam_components.beam_components += PB
/obj/effect/projectile/tracer
name = "beam"
@@ -107,3 +114,12 @@
light_range = 4
light_power = 3
light_color = "#3300ff"
+
+//VOREStation edit: medigun
+/obj/effect/projectile/tracer/medigun
+ icon = 'icons/obj/projectiles_vr.dmi'
+ icon_state = "medbeam"
+ light_range = 2
+ light_power = 0.5
+ light_color = "#80F5FF"
+//VOREStation edit ends
\ No newline at end of file
diff --git a/code/game/objects/effects/temporary_visuals/temproary_visual.dm~1fb83e6... Merge pull request #5959 from elgeonmb_suit++ b/code/game/objects/effects/temporary_visuals/temproary_visual.dm~1fb83e6... Merge pull request #5959 from elgeonmb_suit++
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 591da027570..b651e2bfe23 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -581,10 +581,9 @@ var/list/global/slot_flags_enumeration = list(
if( !blood_overlay )
generate_blood_overlay()
- //apply the blood-splatter overlay if it isn't already in there
- if(!blood_DNA.len)
- blood_overlay.color = blood_color
- overlays += blood_overlay
+ //Make the blood_overlay have the proper color then apply it.
+ blood_overlay.color = blood_color
+ overlays += blood_overlay
//if this blood isn't already in the list, add it
if(istype(M))
@@ -593,6 +592,7 @@ var/list/global/slot_flags_enumeration = list(
blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
return 1 //we applied blood to the item
+
/obj/item/proc/generate_blood_overlay()
if(blood_overlay)
return
@@ -716,7 +716,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
icon = 'icons/obj/device.dmi'
//Worn icon generation for on-mob sprites
-/obj/item/proc/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer)
+/obj/item/proc/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer,var/icon/clip_mask = null) //VOREStation edit - add 'clip mask' argument.
//Get the required information about the base icon
var/icon/icon2use = get_worn_icon_file(body_type = body_type, slot_name = slot_name, default_icon = default_icon, inhands = inhands)
var/state2use = get_worn_icon_state(slot_name = slot_name)
@@ -738,6 +738,8 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
if(!inhands)
apply_custom(standing_icon) //Pre-image overridable proc to customize the thing
apply_addblends(icon2use,standing_icon) //Some items have ICON_ADD blend shaders
+ if(istype(clip_mask)) //VOREStation Edit - For taur bodies/tails clipping off parts of uniforms and suits.
+ standing_icon = get_icon_difference(standing_icon, clip_mask, 1)
var/image/standing = image(standing_icon)
standing.alpha = alpha
diff --git a/code/game/objects/items/bells.dm b/code/game/objects/items/bells.dm
index 43046d22b77..c7aa08a440f 100644
--- a/code/game/objects/items/bells.dm
+++ b/code/game/objects/items/bells.dm
@@ -10,6 +10,7 @@
attack_verb = list("annoyed")
var/static/radial_examine = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_examine")
var/static/radial_use = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_use")
+ var/static/radial_pickup = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_pickup")
/obj/item/weapon/deskbell/examine(mob/user)
..()
@@ -26,6 +27,7 @@
//This defines the radials and what call we're assiging to them.
var/list/options = list()
options["examine"] = radial_examine
+ options["pick up"] = radial_pickup
if(!broken)
options["use"] = radial_use
@@ -54,6 +56,9 @@
ring(user)
add_fingerprint(user)
+ if("pick up")
+ ..()
+
/obj/item/weapon/deskbell/proc/ring(mob/user)
if(user.a_intent == "harm")
playsound(user.loc, 'sound/effects/deskbell_rude.ogg', 50, 1)
@@ -78,9 +83,16 @@
to_chat(user,"You are not able to ring [src].")
return 0
-/obj/item/weapon/deskbell/attackby(obj/item/i, mob/user, params)
- if(!istype(i))
+/obj/item/weapon/deskbell/attackby(obj/item/W, mob/user, params)
+ if(!istype(W))
return
+ if(W.is_wrench() && isturf(loc))
+ if(do_after(5))
+ if(!src) return
+ to_chat(user, "You dissasemble the desk bell")
+ new /obj/item/stack/material/steel(get_turf(src), 1)
+ qdel(src)
+ return
if(!broken)
ring(user)
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 46c425bb897..1d1d591d57c 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -1096,7 +1096,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
P.conversations.Add("\ref[src]")
- if (prob(15)) //Give the AI a chance of intercepting the message
+ if (prob(5) && security_level >= SEC_LEVEL_BLUE) //Give the AI a chance of intercepting the message //VOREStation Edit: no spam interception on lower codes + lower interception chance
var/who = src.owner
if(prob(50))
who = P.owner
diff --git a/code/game/objects/items/devices/communicator/UI.dm b/code/game/objects/items/devices/communicator/UI.dm
index e37587812a0..a4859c08a56 100644
--- a/code/game/objects/items/devices/communicator/UI.dm
+++ b/code/game/objects/items/devices/communicator/UI.dm
@@ -116,7 +116,7 @@
data["flashlight"] = fon
data["manifest"] = PDA_Manifest
data["feeds"] = compile_news()
- data["latest_news"] = get_recent_news()
+ //data["latest_news"] = get_recent_news() //VOREStation Edit, bandaid for catastrophic runtime lag in helper.dm
if(cartridge) // If there's a cartridge, we need to grab the information from it
data["cart_devices"] = cartridge.get_device_status()
data["cart_templates"] = cartridge.ui_templates
diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm
index 26fb1b69aa8..b66c4a37765 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 76697ddba30..92ff449855e 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/encryptionkey_vr.dm b/code/game/objects/items/devices/radio/encryptionkey_vr.dm
index 4d2debc3414..a70ad6f7df7 100644
--- a/code/game/objects/items/devices/radio/encryptionkey_vr.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey_vr.dm
@@ -18,3 +18,9 @@
name = "research director's encryption key"
icon_state = "rd_cypherkey"
channels = list("Command" = 1, "Science" = 1, "Explorer" = 1)
+
+/obj/item/device/encryptionkey/ert
+ channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1, "Service" = 1, "Explorer" = 1)
+
+/obj/item/device/encryptionkey/omni //Literally only for the admin intercoms
+ channels = list("Mercenary" = 1, "Raider" = 1, "Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1, "Service" = 1, "Explorer" = 1)
diff --git a/code/game/objects/items/devices/radio/headset_vr.dm b/code/game/objects/items/devices/radio/headset_vr.dm
index 46d4ead3d87..a82e694d0e8 100644
--- a/code/game/objects/items/devices/radio/headset_vr.dm
+++ b/code/game/objects/items/devices/radio/headset_vr.dm
@@ -3,6 +3,7 @@
desc = "The headset of the boss's boss."
icon_state = "cent_headset"
item_state = "headset"
+ centComm = 1
ks2type = /obj/item/device/encryptionkey/ert
/obj/item/device/radio/headset/centcom/alt
@@ -13,5 +14,33 @@
name = "\improper NT radio headset"
desc = "The headset of a Nanotrasen corporate employee."
icon_state = "nt_headset"
+ 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 68c862db09d..747f7f7d0ec 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/radio/radio_vr.dm b/code/game/objects/items/devices/radio/radio_vr.dm
index 932229d0ad3..86a16280fc9 100644
--- a/code/game/objects/items/devices/radio/radio_vr.dm
+++ b/code/game/objects/items/devices/radio/radio_vr.dm
@@ -99,7 +99,7 @@
if((slot_flags & SLOT_BACK) && M.get_equipped_item(slot_back) == src)
return 1
- if((slot_flags & SLOT_BELT) && M.get_equipped_item(slot_belt) == src)
+ if((slot_flags & SLOT_BACK) && M.get_equipped_item(slot_s_store) == src)
return 1
return 0
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 90ae753da2e..a085e59d246 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 6fd6d7debdd..c12a3a655aa 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/robot/robot_upgrades_vr.dm b/code/game/objects/items/robot/robot_upgrades_vr.dm
index a3c77099440..13f09a980d6 100644
--- a/code/game/objects/items/robot/robot_upgrades_vr.dm
+++ b/code/game/objects/items/robot/robot_upgrades_vr.dm
@@ -6,6 +6,7 @@
R.add_language(LANGUAGE_ECUREUILIAN, 1)
R.add_language(LANGUAGE_DAEMON, 1)
R.add_language(LANGUAGE_ENOCHIAN, 1)
+ R.add_language(LANGUAGE_SLAVIC, 1)
return 1
else
return 0
diff --git a/code/game/objects/items/stacks/matter_synth.dm b/code/game/objects/items/stacks/matter_synth.dm
index 3483dfbc61c..d92cd5f8dda 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 612a14c4d4f..51e2b8a03e2 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/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm
index 7b156c025ff..1170fedc04f 100644
--- a/code/game/objects/items/stacks/nanopaste.dm
+++ b/code/game/objects/items/stacks/nanopaste.dm
@@ -29,18 +29,21 @@
if (istype(M,/mob/living/carbon/human)) //Repairing robolimbs
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/S = H.get_organ(user.zone_sel.selecting)
-
+ //VOREStation Edit Start
if (S && (S.robotic >= ORGAN_ROBOT))
if(!S.get_damage())
- user << "Nothing to fix here."
+ to_chat(user, "Nothing to fix here.")
+ else if((S.open < 2) && (S.brute_dam + S.burn_dam >= S.min_broken_damage) && !repair_external)
+ to_chat(user, "The damage is too extensive for this nanite swarm to handle.")
else if(can_use(1))
user.setClickCooldown(user.get_attack_speed(src))
if(S.open >= 2)
if(do_after(user,5 * toolspeed))
- S.heal_damage(20, 20, robo_repair = 1)
+ S.heal_damage(restoration_internal, restoration_internal, robo_repair = 1)
else if(do_after(user,5 * toolspeed))
- S.heal_damage(10,10, robo_repair =1)
+ S.heal_damage(restoration_external,restoration_external, robo_repair =1)
H.updatehealth()
use(1)
user.visible_message("\The [user] applies some nanite paste on [user != M ? "[M]'s [S.name]" : "[S]"] with [src].",\
"You apply some nanite paste on [user == M ? "your" : "[M]'s"] [S.name].")
+ //VOREStation Edit End
diff --git a/code/game/objects/items/stacks/nanopaste_vr.dm b/code/game/objects/items/stacks/nanopaste_vr.dm
new file mode 100644
index 00000000000..cd39b61fef4
--- /dev/null
+++ b/code/game/objects/items/stacks/nanopaste_vr.dm
@@ -0,0 +1,13 @@
+/obj/item/stack/nanopaste
+ var/restoration_external = 5
+ var/restoration_internal = 20
+ var/repair_external = FALSE
+
+/obj/item/stack/nanopaste/advanced
+ name = "advanced nanopaste"
+ singular_name = "advanced nanite swarm"
+ desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery. These ones are capable of restoring condition even of most thrashed robotic parts"
+ icon = 'icons/obj/stacks_vr.dmi'
+ icon_state = "adv_nanopaste"
+ restoration_external = 10
+ repair_external = TRUE
\ No newline at end of file
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index c5be2552044..984c5b97f63 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 89182806db7..d457ccf7d1a 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -929,6 +929,12 @@
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."
@@ -1357,4 +1363,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/trash.dm b/code/game/objects/items/trash.dm
index 3d9c4ea140c..12315972a2a 100644
--- a/code/game/objects/items/trash.dm
+++ b/code/game/objects/items/trash.dm
@@ -76,6 +76,14 @@
name = "\improper \"LiquidFood\" ration"
icon_state = "liquidfood"
+/obj/item/trash/liquidprotein
+ 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/trash_vr.dm b/code/game/objects/items/trash_vr.dm
index 43cadda3f70..20f7e32c4c4 100644
--- a/code/game/objects/items/trash_vr.dm
+++ b/code/game/objects/items/trash_vr.dm
@@ -26,11 +26,6 @@
return
..()
-/obj/item/trash/liquidprotein
- name = "\improper \"LiquidProtein\" ration"
- icon = 'icons/obj/trash_vr.dmi'
- icon_state = "liquidprotein"
-
/obj/item/trash/fancyplate
name = "dirty fancy plate"
icon = 'icons/obj/trash_vr.dmi'
diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm
index 63308e6caad..6b59d13ea56 100644
--- a/code/game/objects/items/weapons/circuitboards/frame.dm
+++ b/code/game/objects/items/weapons/circuitboards/frame.dm
@@ -170,6 +170,15 @@
/obj/item/weapon/stock_parts/gear = 1,
/obj/item/weapon/reagent_containers/glass/beaker/large = 1)
+/obj/item/weapon/circuitboard/distiller
+ build_path = /obj/machinery/portable_atmospherics/powered/reagent_distillery
+ board_type = new /datum/frame/frame_types/reagent_distillery
+ req_components = list(
+ /obj/item/weapon/stock_parts/capacitor = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/motor = 2,
+ /obj/item/weapon/stock_parts/gear = 1)
+
/obj/item/weapon/circuitboard/teleporter_hub
name = T_BOARD("teleporter hub")
build_path = /obj/machinery/teleport/hub
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index 43e7e0f90cc..d4a29d47f33 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -97,6 +97,23 @@
name = "seismic charge"
desc = "Used to dig holes in specific areas without too much extra hole."
- blast_heavy = 3
- blast_light = 5
- blast_flash = 8
+ blast_heavy = 2
+ blast_light = 4
+ blast_flash = 7
+
+/obj/item/weapon/plastique/seismic/attackby(var/obj/item/I, var/mob/user)
+ . = ..()
+ if(open_panel)
+ if(istype(I, /obj/item/weapon/stock_parts/micro_laser))
+ var/obj/item/weapon/stock_parts/SP = I
+ var/new_blast_power = max(1, round(SP.rating / 2) + 1)
+ if(new_blast_power > blast_heavy)
+ to_chat(user, "You install \the [I] into \the [src].")
+ user.drop_from_inventory(I)
+ qdel(I)
+ blast_heavy = new_blast_power
+ blast_light = blast_heavy + round(new_blast_power * 0.5)
+ blast_flash = blast_light + round(new_blast_power * 0.75)
+ else
+ to_chat(user, "The [I] is not any better than the component already installed into this charge!")
+ return .
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/explosives_vr.dm b/code/game/objects/items/weapons/explosives_vr.dm
new file mode 100644
index 00000000000..a82ca02bbc8
--- /dev/null
+++ b/code/game/objects/items/weapons/explosives_vr.dm
@@ -0,0 +1,17 @@
+/obj/item/weapon/plastique/seismic/locked
+ desc = "Used to dig holes in specific areas without too much extra hole. Has extra mechanism that safely implodes the bomb if it is used in close proximity to the facility."
+
+/obj/item/weapon/plastique/seismic/locked/explode(var/location)
+ if(!target)
+ target = get_atom_on_turf(src)
+ if(!target)
+ target = src
+
+ var/turf/T = get_turf(target)
+ if(T.z in using_map.map_levels)
+ target.visible_message("\The [src] lets out a loud beep as safeties trigger, before imploding and falling apart.")
+ target.overlays -= image_overlay
+ qdel(src)
+ return 0
+ else
+ return ..()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade_vr.dm b/code/game/objects/items/weapons/grenades/spawnergrenade_vr.dm
new file mode 100644
index 00000000000..56204be9849
--- /dev/null
+++ b/code/game/objects/items/weapons/grenades/spawnergrenade_vr.dm
@@ -0,0 +1,30 @@
+/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked
+ desc = "It is set to detonate in 5 seconds. It will deploy three weaponized survey drones. This one has a safety interlock that prevents release if used while in proximity to the facility."
+ req_access = list(access_armory) //for toggling safety
+ var/locked = 1
+
+/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked/detonate()
+ if(locked)
+ var/turf/T = get_turf(src)
+ if(T.z in using_map.map_levels)
+ icon_state = initial(icon_state)
+ active = 0
+ return 0
+ return ..()
+
+/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked/attackby(obj/item/I, mob/user)
+ var/obj/item/weapon/card/id/id = I.GetID()
+ if(istype(id))
+ if(check_access(id))
+ locked = !locked
+ to_chat(user, "You [locked ? "enable" : "disable"] the safety lock on \the [src].")
+ else
+ to_chat(user, "Access denied.")
+ user.visible_message("[user] swipes \the [I] against \the [src].")
+ else
+ return ..()
+
+/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked/emag_act(var/remaining_charges,var/mob/user)
+ ..()
+ locked = !locked
+ to_chat(user, "You [locked ? "enable" : "disable"] the safety lock on \the [src]!")
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/id cards/station_ids.dm b/code/game/objects/items/weapons/id cards/station_ids.dm
index c157d424925..4d37f154b36 100644
--- a/code/game/objects/items/weapons/id cards/station_ids.dm
+++ b/code/game/objects/items/weapons/id cards/station_ids.dm
@@ -31,6 +31,7 @@
var/dorm = 0 // determines if this ID has claimed a dorm already
var/mining_points = 0 // For redeeming at mining equipment vendors
+ var/survey_points = 0 // For redeeming at explorer equipment vendors.
/obj/item/weapon/card/id/examine(mob/user)
set src in oview(1)
@@ -170,7 +171,7 @@
/obj/item/weapon/card/id/synthetic/Initialize()
. = ..()
- access = get_all_station_access() + access_synth
+ access = get_all_station_access().Copy() + access_synth
/obj/item/weapon/card/id/centcom
name = "\improper CentCom. ID"
@@ -181,7 +182,7 @@
/obj/item/weapon/card/id/centcom/Initialize()
. = ..()
- access = get_all_centcom_access()
+ access = get_all_centcom_access().Copy()
/obj/item/weapon/card/id/centcom/station/Initialize()
. = ..()
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 1804d576fd8..ff4146b8a0a 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/implant_vr.dm b/code/game/objects/items/weapons/implants/implant_vr.dm
index bec23b4c2b8..17d1d6f6d24 100644
--- a/code/game/objects/items/weapons/implants/implant_vr.dm
+++ b/code/game/objects/items/weapons/implants/implant_vr.dm
@@ -33,6 +33,7 @@
source.add_language(LANGUAGE_BIRDSONG)
source.add_language(LANGUAGE_SAGARU)
source.add_language(LANGUAGE_CANILUNZT)
+ source.add_language(LANGUAGE_SLAVIC)
source.add_language(LANGUAGE_SOL_COMMON) //In case they're giving a xenomorph an implant or something.
/obj/item/weapon/implant/vrlanguage/post_implant(mob/source)
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 00000000000..10873d1d06f
--- /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.
+