diff --git a/code/ZAS/Phoron.dm b/code/ZAS/Phoron.dm
index a29cbee046..fd79d83dc5 100644
--- a/code/ZAS/Phoron.dm
+++ b/code/ZAS/Phoron.dm
@@ -40,18 +40,28 @@ var/image/contamination_overlay = image('icons/effects/contamination.dmi')
obj/var/contaminated = 0
+obj/var/phoronproof = 0
+
/obj/item/proc/can_contaminate()
//Clothing and backpacks can be contaminated.
- if(flags & PHORONGUARD) return 0
- else if(istype(src,/obj/item/weapon/storage/backpack)) return 0 //Cannot be washed :(
- else if(istype(src,/obj/item/clothing)) return 1
+ if(flags & PHORONGUARD)
+ return 0
+ else if(phoronproof == 1)
+ return 0
+ else if(istype(src,/obj/item/weapon/storage/backpack))
+ return 0 //Cannot be washed :(
+ else if(istype(src,/obj/item/clothing))
+ return 1
/obj/item/proc/contaminate()
//Do a contamination overlay? Temporary measure to keep contamination less deadly than it was.
- if(!contaminated)
- contaminated = 1
- overlays += contamination_overlay
+ if(!can_contaminate())
+ return
+ else
+ if(!contaminated)
+ contaminated = 1
+ overlays += contamination_overlay
/obj/item/proc/decontaminate()
contaminated = 0
@@ -114,6 +124,15 @@ obj/var/contaminated = 0
src << "High levels of toxins cause you to spontaneously mutate!"
domutcheck(src,null)
+/mob/living/carbon/human/vox/pl_effects()
+ //Handles all the bad things phoron can do to Vox.
+
+ //Contamination
+ if(vsc.plc.CLOTH_CONTAMINATION) contaminate()
+
+ //Anything else requires them to not be dead.
+ if(stat >= 2)
+ return
/mob/living/carbon/human/proc/burn_eyes()
var/obj/item/organ/internal/eyes/E = internal_organs_by_name[O_EYES]
diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index 2797c8c904..bcd85b53be 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -192,3 +192,10 @@
#define NOMUT 0
#define COLORMUT 1
#define SPECIESMUT 2
+
+//carbon taste sensitivity defines, used in mob/living/carbon/proc/ingest
+#define TASTE_HYPERSENSITIVE 3 //anything below 5%
+#define TASTE_SENSITIVE 2 //anything below 7%
+#define TASTE_NORMAL 1 //anything below 15%
+#define TASTE_DULL 0.5 //anything below 30%
+#define TASTE_NUMB 0.1 //anything below 150%
\ No newline at end of file
diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm
index c1aaed9e42..957a690f4f 100644
--- a/code/__defines/species_languages.dm
+++ b/code/__defines/species_languages.dm
@@ -5,12 +5,15 @@
#define NO_PAIN 0x8 // Cannot suffer halloss/recieves deceptive health indicator.
#define NO_SLIP 0x10 // Cannot fall over.
#define NO_POISON 0x20 // Cannot not suffer toxloss.
+#define NO_EMBED 0x40 // Can step on broken glass with no ill-effects and cannot have shrapnel embedded in it.
// unused: 0x8000 - higher than this will overflow
// Species spawn flags
#define SPECIES_IS_WHITELISTED 0x1 // Must be whitelisted to play.
#define SPECIES_IS_RESTRICTED 0x2 // Is not a core/normally playable species. (castes, mutantraces)
#define SPECIES_CAN_JOIN 0x4 // Species is selectable in chargen.
+#define SPECIES_NO_FBP_CONSTRUCTION 0x8 // FBP of this species can't be made in-game.
+#define SPECIES_NO_FBP_CHARGEN 0x10 // FBP of this species can't be selected at chargen.
// Species appearance flags
#define HAS_SKIN_TONE 0x1 // Skin tone selectable in chargen. (0-255)
@@ -22,15 +25,22 @@
#define RADIATION_GLOWS 0x40 // Radiation causes this character to glow.
// Languages.
+#define LANGUAGE_GALCOM "Galactic Common"
+#define LANGUAGE_EAL "Encoded Audio Language"
#define LANGUAGE_SOL_COMMON "Sol Common"
#define LANGUAGE_UNATHI "Sinta'unathi"
#define LANGUAGE_SIIK "Siik"
#define LANGUAGE_SKRELLIAN "Skrellian"
-#define LANGUAGE_ROOTSPEAK "Rootspeak"
#define LANGUAGE_TRADEBAND "Tradeband"
#define LANGUAGE_GUTTER "Gutter"
+#define LANGUAGE_SIGN "Sign Language"
#define LANGUAGE_SCHECHI "Schechi"
+#define LANGUAGE_ROOTLOCAL "Local Rootspeak"
+#define LANGUAGE_ROOTGLOBAL "Global Rootspeak"
#define LANGUAGE_CULT "Cult"
+#define LANGUAGE_OCCULT "Occult"
+#define LANGUAGE_CHANGELING "Changeling"
+#define LANGUAGE_VOX "Vox-Pidgin"
// Language flags.
#define WHITELISTED 1 // Language is available if the speaker is whitelisted.
@@ -42,3 +52,4 @@
#define INNATE 64 // All mobs can be assumed to speak and understand this language. (audible emotes)
#define NO_TALK_MSG 128 // Do not show the "\The [speaker] talks into \the [radio]" message
#define NO_STUTTER 256 // No stuttering, slurring, or other speech problems
+#define ALT_TRANSMIT 512 // Language is not based on vision or sound (Todo: add this into the say code and use it for the rootspeak languages)
\ No newline at end of file
diff --git a/code/_helpers/turfs.dm b/code/_helpers/turfs.dm
index 8583628114..1926246856 100644
--- a/code/_helpers/turfs.dm
+++ b/code/_helpers/turfs.dm
@@ -32,3 +32,10 @@
if(!available_turfs.len)
available_turfs = start_turfs
return pick(available_turfs)
+
+/proc/is_below_sound_pressure(var/turf/T)
+ var/datum/gas_mixture/environment = T ? T.return_air() : null
+ var/pressure = environment ? environment.return_pressure() : 0
+ if(pressure < SOUND_MINIMUM_PRESSURE)
+ return TRUE
+ return FALSE
\ No newline at end of file
diff --git a/code/_helpers/type2type.dm b/code/_helpers/type2type.dm
index 0bcf546123..8dc9cb020b 100644
--- a/code/_helpers/type2type.dm
+++ b/code/_helpers/type2type.dm
@@ -73,14 +73,14 @@
// Turns a direction into text
/proc/dir2text(direction)
switch (direction)
- if (1.0) return "north"
- if (2.0) return "south"
- if (4.0) return "east"
- if (8.0) return "west"
- if (5.0) return "northeast"
- if (6.0) return "southeast"
- if (9.0) return "northwest"
- if (10.0) return "southwest"
+ if (NORTH) return "north"
+ if (SOUTH) return "south"
+ if (EAST) return "east"
+ if (WEST) return "west"
+ if (NORTHEAST) return "northeast"
+ if (SOUTHEAST) return "southeast"
+ if (NORTHWEST) return "northwest"
+ if (SOUTHWEST) return "southwest"
// Turns text into proper directions
/proc/text2dir(direction)
diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index d8623fa3eb..716e439283 100644
--- a/code/_helpers/unsorted.dm
+++ b/code/_helpers/unsorted.dm
@@ -1165,12 +1165,12 @@ proc/is_hot(obj/item/W as obj)
/proc/is_surgery_tool(obj/item/W as obj)
return ( \
- istype(W, /obj/item/weapon/scalpel) || \
- istype(W, /obj/item/weapon/hemostat) || \
- istype(W, /obj/item/weapon/retractor) || \
- istype(W, /obj/item/weapon/cautery) || \
- istype(W, /obj/item/weapon/bonegel) || \
- istype(W, /obj/item/weapon/bonesetter)
+ istype(W, /obj/item/weapon/surgical/scalpel) || \
+ istype(W, /obj/item/weapon/surgical/hemostat) || \
+ istype(W, /obj/item/weapon/surgical/retractor) || \
+ istype(W, /obj/item/weapon/surgical/cautery) || \
+ istype(W, /obj/item/weapon/surgical/bonegel) || \
+ istype(W, /obj/item/weapon/surgical/bonesetter)
)
//check if mob is lying down on something we can operate him on.
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 522db6e1c4..d899f62049 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -300,6 +300,13 @@
else
contents.Add(0)
+ // And here's for the Vox
+ if ("phoron")
+ if(t.air_contents.gas["phoron"] && !t.air_contents.gas["oxygen"])
+ contents.Add(t.air_contents.gas["phoron"])
+ else
+ contents.Add(0)
+
else
//no tank so we set contents to 0
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 2ceda25312..6ff37e0449 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -161,6 +161,7 @@ var/list/gamemode_cache = list()
var/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt
var/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt
var/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database
+ var/use_age_restriction_for_antags = 0 //Do antags use account age restrictions? --requires database
var/simultaneous_pm_warning_timeout = 100
@@ -279,6 +280,9 @@ var/list/gamemode_cache = list()
if ("use_age_restriction_for_jobs")
config.use_age_restriction_for_jobs = 1
+ if ("use_age_restriction_for_antags")
+ config.use_age_restriction_for_antags = 1
+
if ("jobs_have_minimal_access")
config.jobs_have_minimal_access = 1
diff --git a/code/datums/autolathe/medical.dm b/code/datums/autolathe/medical.dm
index 40211f9a8f..0762b5076e 100644
--- a/code/datums/autolathe/medical.dm
+++ b/code/datums/autolathe/medical.dm
@@ -1,26 +1,26 @@
/datum/category_item/autolathe/medical/scalpel
name = "scalpel"
- path =/obj/item/weapon/scalpel
+ path =/obj/item/weapon/surgical/scalpel
/datum/category_item/autolathe/medical/circularsaw
name = "circular saw"
- path =/obj/item/weapon/circular_saw
+ path =/obj/item/weapon/surgical/circular_saw
/datum/category_item/autolathe/medical/surgicaldrill
name = "surgical drill"
- path =/obj/item/weapon/surgicaldrill
+ path =/obj/item/weapon/surgical/surgicaldrill
/datum/category_item/autolathe/medical/retractor
name = "retractor"
- path =/obj/item/weapon/retractor
+ path =/obj/item/weapon/surgical/retractor
/datum/category_item/autolathe/medical/cautery
name = "cautery"
- path =/obj/item/weapon/cautery
+ path =/obj/item/weapon/surgical/cautery
/datum/category_item/autolathe/medical/hemostat
name = "hemostat"
- path =/obj/item/weapon/hemostat
+ path =/obj/item/weapon/surgical/hemostat
/datum/category_item/autolathe/medical/beaker
name = "glass beaker"
diff --git a/code/datums/supplypacks/atmospherics.dm b/code/datums/supplypacks/atmospherics.dm
index fdbb4cafc3..4d097c4370 100644
--- a/code/datums/supplypacks/atmospherics.dm
+++ b/code/datums/supplypacks/atmospherics.dm
@@ -98,7 +98,7 @@
/obj/item/weapon/storage/toolbox/emergency = 2,
/obj/item/clothing/suit/storage/hazardvest = 2,
/obj/item/clothing/suit/storage/vest = 2,
- /obj/item/weapon/tank/emergency_oxygen/engi = 4,
+ /obj/item/weapon/tank/emergency/oxygen/engi = 4,
/obj/item/clothing/suit/space/emergency = 4,
/obj/item/clothing/head/helmet/space/emergency = 4,
/obj/item/clothing/mask/gas = 4
diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm
index 18f18db672..51a7e6e03c 100644
--- a/code/datums/supplypacks/medical.dm
+++ b/code/datums/supplypacks/medical.dm
@@ -49,17 +49,17 @@
/datum/supply_packs/med/surgery
name = "Surgery crate"
contains = list(
- /obj/item/weapon/cautery,
- /obj/item/weapon/surgicaldrill,
+ /obj/item/weapon/surgical/cautery,
+ /obj/item/weapon/surgical/surgicaldrill,
/obj/item/clothing/mask/breath/medical,
/obj/item/weapon/tank/anesthetic,
- /obj/item/weapon/FixOVein,
- /obj/item/weapon/hemostat,
- /obj/item/weapon/scalpel,
- /obj/item/weapon/bonegel,
- /obj/item/weapon/retractor,
- /obj/item/weapon/bonesetter,
- /obj/item/weapon/circular_saw
+ /obj/item/weapon/surgical/FixOVein,
+ /obj/item/weapon/surgical/hemostat,
+ /obj/item/weapon/surgical/scalpel,
+ /obj/item/weapon/surgical/bonegel,
+ /obj/item/weapon/surgical/retractor,
+ /obj/item/weapon/surgical/bonesetter,
+ /obj/item/weapon/surgical/circular_saw
)
cost = 25
containertype = "/obj/structure/closet/crate/secure"
@@ -237,7 +237,7 @@
/obj/item/device/camera,
/obj/item/device/camera_film = 2,
/obj/item/weapon/autopsy_scanner,
- /obj/item/weapon/scalpel,
+ /obj/item/weapon/surgical/scalpel,
/obj/item/weapon/storage/box/masks,
/obj/item/weapon/storage/box/gloves,
/obj/item/weapon/pen
diff --git a/code/datums/supplypacks/misc.dm b/code/datums/supplypacks/misc.dm
index 4fa22ddc50..5be62b2a58 100644
--- a/code/datums/supplypacks/misc.dm
+++ b/code/datums/supplypacks/misc.dm
@@ -37,8 +37,7 @@
/obj/item/clothing/shoes/black,
/obj/item/clothing/suit/nun,
/obj/item/clothing/head/nun_hood,
- /obj/item/clothing/suit/chaplain_hoodie,
- /obj/item/clothing/head/chaplain_hood,
+ /obj/item/clothing/suit/storage/hooded/chaplain_hoodie,
/obj/item/clothing/suit/holidaypriest,
/obj/item/clothing/under/wedding/bride_white,
/obj/item/weapon/storage/backpack/cultpack,
diff --git a/code/datums/underwear/undershirts.dm b/code/datums/underwear/undershirts.dm
index f4ff3d9505..9a4ab9600b 100644
--- a/code/datums/underwear/undershirts.dm
+++ b/code/datums/underwear/undershirts.dm
@@ -141,7 +141,7 @@
/datum/category_item/underwear/undershirt/longjon
name = "Long John Shirt"
- icon_state = "longjont"
+ icon_state = "ljont"
has_color = TRUE
/datum/category_item/underwear/undershirt/longstripe_black
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 627bd27e7b..5ecc707227 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -573,7 +573,7 @@
name = "subspace wavelength analyzer"
icon_state = "wavelength_analyzer"
desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths."
- origin_tech = list(TECH_DATA = 3, TECH_MAGNETS = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
+ origin_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10)
/obj/item/weapon/stock_parts/subspace/crystal
diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm
index 348bf6244d..47b82b82ac 100644
--- a/code/game/antagonist/antagonist.dm
+++ b/code/game/antagonist/antagonist.dm
@@ -47,6 +47,7 @@
var/mob_path = /mob/living/carbon/human // Mobtype this antag will use if none is provided.
var/feedback_tag = "traitor_objective" // End of round
var/bantype = "Syndicate" // Ban to check when spawning this antag.
+ var/minimum_player_age = 7 // Players need to be at least minimum_player_age days old before they are eligable for auto-spawning
var/suspicion_chance = 50 // Prob of being on the initial Command report
var/flags = 0 // Various runtime options.
@@ -105,6 +106,8 @@
if(ghosts_only && !istype(player.current, /mob/observer/dead))
candidates -= player
log_debug("[key_name(player)] is not eligible to become a [role_text]: Only ghosts may join as this role! They have been removed from the draft.")
+ else if(config.use_age_restriction_for_antags && player.current.client.player_age < minimum_player_age)
+ log_debug("[key_name(player)] is not eligible to become a [role_text]: Is only [player.current.client.player_age] day\s old, has to be [minimum_player_age] day\s!")
else if(istype(player.current, /mob/living/voice))
candidates -= player
log_debug("[key_name(player)] is not eligible to become a [role_text]: They are only a communicator voice. They have been removed from the draft.")
diff --git a/code/game/antagonist/outsider/raider.dm b/code/game/antagonist/outsider/raider.dm
index 7bfa22ad43..ae77e8f216 100644
--- a/code/game/antagonist/outsider/raider.dm
+++ b/code/game/antagonist/outsider/raider.dm
@@ -204,23 +204,26 @@ var/datum/antagonist/raider/raiders
if(!..())
return 0
- var/new_shoes = pick(raider_shoes)
- var/new_uniform = pick(raider_uniforms)
- var/new_glasses = pick(raider_glasses)
- var/new_helmet = pick(raider_helmets)
- var/new_suit = pick(raider_suits)
+ if(player.species && player.species.get_bodytype() == "Vox")
+ equip_vox(player)
+ else
+ var/new_shoes = pick(raider_shoes)
+ var/new_uniform = pick(raider_uniforms)
+ var/new_glasses = pick(raider_glasses)
+ var/new_helmet = pick(raider_helmets)
+ var/new_suit = pick(raider_suits)
- player.equip_to_slot_or_del(new new_shoes(player),slot_shoes)
- if(!player.shoes)
- //If equipping shoes failed, fall back to equipping sandals
- var/fallback_type = pick(/obj/item/clothing/shoes/sandal, /obj/item/clothing/shoes/jackboots/toeless)
- player.equip_to_slot_or_del(new fallback_type(player), slot_shoes)
+ player.equip_to_slot_or_del(new new_shoes(player),slot_shoes)
+ if(!player.shoes)
+ //If equipping shoes failed, fall back to equipping sandals
+ var/fallback_type = pick(/obj/item/clothing/shoes/sandal, /obj/item/clothing/shoes/jackboots/toeless)
+ player.equip_to_slot_or_del(new fallback_type(player), slot_shoes)
- player.equip_to_slot_or_del(new new_uniform(player),slot_w_uniform)
- player.equip_to_slot_or_del(new new_glasses(player),slot_glasses)
- player.equip_to_slot_or_del(new new_helmet(player),slot_head)
- player.equip_to_slot_or_del(new new_suit(player),slot_wear_suit)
- equip_weapons(player)
+ player.equip_to_slot_or_del(new new_uniform(player),slot_w_uniform)
+ player.equip_to_slot_or_del(new new_glasses(player),slot_glasses)
+ player.equip_to_slot_or_del(new new_helmet(player),slot_head)
+ player.equip_to_slot_or_del(new new_suit(player),slot_wear_suit)
+ equip_weapons(player)
var/obj/item/weapon/card/id/id = create_id("Visitor", player, equip = 0)
id.name = "[player.real_name]'s Passport"
@@ -296,3 +299,20 @@ var/datum/antagonist/raider/raiders
var/grenade_type = pick(grenades)
new grenade_type(ammobox)
player.put_in_any_hand_if_possible(ammobox)
+
+/datum/antagonist/raider/proc/equip_vox(var/mob/living/carbon/human/player)
+
+ var/uniform_type = pick(list(/obj/item/clothing/under/vox/vox_robes,/obj/item/clothing/under/vox/vox_casual))
+
+ player.equip_to_slot_or_del(new uniform_type(player), slot_w_uniform)
+ player.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/vox(player), slot_shoes) // REPLACE THESE WITH CODED VOX ALTERNATIVES.
+ player.equip_to_slot_or_del(new /obj/item/clothing/gloves/vox(player), slot_gloves) // AS ABOVE.
+ player.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat/vox(player), slot_wear_mask)
+ player.equip_to_slot_or_del(new /obj/item/weapon/tank/vox(player), slot_back)
+ player.equip_to_slot_or_del(new /obj/item/device/flashlight(player), slot_r_store)
+
+ player.internal = locate(/obj/item/weapon/tank) in player.contents
+ if(istype(player.internal,/obj/item/weapon/tank) && player.internals)
+ player.internals.icon_state = "internal1"
+
+ return 1
diff --git a/code/game/gamemodes/changeling/powers/armor.dm b/code/game/gamemodes/changeling/powers/armor.dm
index ac98f15c40..357639fde6 100644
--- a/code/game/gamemodes/changeling/powers/armor.dm
+++ b/code/game/gamemodes/changeling/powers/armor.dm
@@ -37,7 +37,7 @@
desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel."
flags = STOPPRESSUREDAMAGE //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it,
//it still ends up in your blood. (also balance but muh fluff)
- allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/tank/oxygen)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/tank/oxygen)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) //No armor at all.
canremove = 0
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index f463c9bd0f..5868bf4b59 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -106,7 +106,7 @@
icon_state = "cult_armour"
desc = "A bulky suit of armour, bristling with spikes. It looks space-worthy."
w_class = ITEMSIZE_NORMAL
- allowed = list(/obj/item/weapon/book/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank/emergency_oxygen,/obj/item/device/suit_cooling_unit)
+ allowed = list(/obj/item/weapon/book/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank/emergency/oxygen,/obj/item/device/suit_cooling_unit)
slowdown = 1
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
siemens_coefficient = 0
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 7205d0e850..393d3aee74 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -5,11 +5,11 @@
/var/list/meteors_normal = list(/obj/effect/meteor/dust=3, /obj/effect/meteor/medium=8, /obj/effect/meteor/big=3, \
/obj/effect/meteor/flaming=1, /obj/effect/meteor/irradiated=3) //for normal meteor event
-/var/list/meteors_threatening = list(/obj/effect/meteor/medium=4, /obj/effect/meteor/big=8, \
- /obj/effect/meteor/flaming=3, /obj/effect/meteor/irradiated=3) //for threatening meteor event
+/var/list/meteors_threatening = list(/obj/effect/meteor/medium=5, /obj/effect/meteor/big=10, \
+ /obj/effect/meteor/flaming=3, /obj/effect/meteor/irradiated=3, /obj/effect/meteor/emp=3) //for threatening meteor event
/var/list/meteors_catastrophic = list(/obj/effect/meteor/medium=5, /obj/effect/meteor/big=75, \
- /obj/effect/meteor/flaming=10, /obj/effect/meteor/irradiated=10, /obj/effect/meteor/tunguska = 1) //for catastrophic meteor event
+ /obj/effect/meteor/flaming=10, /obj/effect/meteor/irradiated=10, /obj/effect/meteor/emp=10, /obj/effect/meteor/tunguska = 1) //for catastrophic meteor event
/var/list/meteors_dust = list(/obj/effect/meteor/dust) //for space dust event
@@ -38,7 +38,6 @@
var/Me = pickweight(meteortypes)
var/obj/effect/meteor/M = new Me(pickedstart)
M.dest = pickedgoal
- M.z_original = startLevel
spawn(0)
walk_towards(M, M.dest, 1)
return
@@ -97,11 +96,16 @@
var/dest
pass_flags = PASSTABLE
var/heavy = 0
- var/z_original = 1
+ var/z_original
var/meteordrop = /obj/item/weapon/ore/iron
var/dropamt = 2
+/obj/effect/meteor/New()
+ ..()
+ z_original = z
+
+
/obj/effect/meteor/Move()
if(z != z_original || loc == dest)
qdel(src)
@@ -151,7 +155,7 @@
hits--
if(hits <= 0)
make_debris()
- meteor_effect(heavy)
+ meteor_effect()
qdel(src)
/obj/effect/meteor/ex_act()
@@ -168,8 +172,8 @@
var/obj/item/O = new meteordrop(get_turf(src))
O.throw_at(dest, 5, 10)
-/obj/effect/meteor/proc/meteor_effect(var/effect=1)
- if(effect)
+/obj/effect/meteor/proc/meteor_effect()
+ if(heavy)
for(var/mob/M in player_list)
var/turf/T = get_turf(M)
if(!T || T.z != src.z)
@@ -197,7 +201,7 @@
dropamt = 3
/obj/effect/meteor/medium/meteor_effect()
- ..(heavy)
+ ..()
explosion(src.loc, 0, 1, 2, 3, 0)
//Large-sized
@@ -209,7 +213,7 @@
dropamt = 4
/obj/effect/meteor/big/meteor_effect()
- ..(heavy)
+ ..()
explosion(src.loc, 1, 2, 3, 4, 0)
//Flaming meteor
@@ -221,7 +225,7 @@
meteordrop = /obj/item/weapon/ore/phoron
/obj/effect/meteor/flaming/meteor_effect()
- ..(heavy)
+ ..()
explosion(src.loc, 1, 2, 3, 4, 0, 0, 5)
//Radiation meteor
@@ -233,12 +237,25 @@
/obj/effect/meteor/irradiated/meteor_effect()
- ..(heavy)
+ ..()
explosion(src.loc, 0, 0, 4, 3, 0)
new /obj/effect/decal/cleanable/greenglow(get_turf(src))
for(var/mob/living/L in view(5, src))
L.apply_effect(40, IRRADIATE)
+/obj/effect/meteor/emp
+ name = "conducting meteor"
+ icon_state = "glowing_blue"
+ desc = "Hide your floppies!"
+ meteordrop = /obj/item/weapon/ore/osmium
+ dropamt = 3
+
+/obj/effect/meteor/emp/meteor_effect()
+ ..()
+ // Best case scenario: Comparable to a low-yield EMP grenade.
+ // Worst case scenario: Comparable to a standard yield EMP grenade.
+ empulse(src, rand(2, 4), rand(4, 10))
+
//Station buster Tunguska
/obj/effect/meteor/tunguska
name = "tunguska meteor"
@@ -250,7 +267,7 @@
meteordrop = /obj/item/weapon/ore/phoron
/obj/effect/meteor/tunguska/meteor_effect()
- ..(heavy)
+ ..()
explosion(src.loc, 5, 10, 15, 20, 0)
/obj/effect/meteor/tunguska/Bump()
diff --git a/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm b/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm
index 9c18e774ed..a4761c847a 100644
--- a/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm
+++ b/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm
@@ -47,7 +47,7 @@
..()
/obj/item/clothing/gloves/regen/process()
- if(!wearer || wearer.isSynthetic() || wearer.stat == DEAD || wearer.nutrition >= 10)
+ if(!wearer || wearer.isSynthetic() || wearer.stat == DEAD || wearer.nutrition <= 10)
return // Robots and dead people don't have a metabolism.
if(wearer.getBruteLoss())
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 25acb8caa7..519a1bd5a2 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -14,8 +14,12 @@
return check_access(id)
return 0
-/obj/item/proc/GetAccess()
- return list()
+///obj/item/proc/GetAccess()
+// return list()
+
+/atom/movable/proc/GetAccess()
+ var/obj/item/weapon/card/id/id = GetIdCard()
+ return id ? id.GetAccess() : list()
/obj/proc/GetID()
return null
@@ -197,7 +201,7 @@
"Emergency Response Team",
"Emergency Response Team Leader")
-/mob/proc/GetIdCard()
+/atom/movable/proc/GetIdCard()
return null
/mob/living/bot/GetIdCard()
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index e234ac4d23..cbdcfb9f2f 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -13,7 +13,7 @@
desc = "Emergency air-tight shutter, capable of sealing off breached areas."
icon = 'icons/obj/doors/DoorHazard.dmi'
icon_state = "door_open"
- req_one_access = list(access_atmospherics, access_engine_equip)
+ req_one_access = list(access_eva) //access_atmospherics, access_engine_equip)
opacity = 0
density = 0
layer = DOOR_OPEN_LAYER - 0.01
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 13168e19f4..4349752370 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -8,7 +8,7 @@ obj/machinery/recharger
idle_power_usage = 4
active_power_usage = 40000 //40 kW
var/obj/item/charging = null
- var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/laptop, /obj/item/weapon/cell, /obj/item/device/flashlight)
+ var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/laptop, /obj/item/weapon/cell, /obj/item/device/flashlight, /obj/item/device/electronic_assembly)
var/icon_state_charged = "recharger2"
var/icon_state_charging = "recharger1"
var/icon_state_idle = "recharger0" //also when unpowered
@@ -60,6 +60,11 @@ obj/machinery/recharger
if(!L.stored_computer.battery)
user << "There's no battery in it!"
return
+ if(istype(G, /obj/item/device/electronic_assembly))
+ var/obj/item/device/electronic_assembly/assembly = G
+ if(!assembly.battery)
+ to_chat(user, "The assembly doesn't have a power cell.")
+ return
user.drop_item()
G.loc = src
charging = G
@@ -161,6 +166,21 @@ obj/machinery/recharger
update_use_power(1)
return
+ if(istype(charging, /obj/item/device/electronic_assembly))
+ var/obj/item/device/electronic_assembly/assembly = charging
+ if(assembly.battery)
+ if(!assembly.battery.fully_charged())
+ icon_state = icon_state_charging
+ assembly.battery.give(active_power_usage*CELLRATE)
+ update_use_power(2)
+ else
+ icon_state = icon_state_charged
+ update_use_power(1)
+ else
+ icon_state = icon_state_idle
+ update_use_power(1)
+ return
+
/obj/machinery/recharger/emp_act(severity)
if(stat & (NOPOWER|BROKEN) || !anchored)
..(severity)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 64e8c5e539..0559b626e1 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -206,37 +206,16 @@
R.activate_module(src)
R.hud_used.update_robot_modules_display()
-// Due to storage type consolidation this should get used more now.
-// I have cleaned it up a little, but it could probably use more. -Sayu
/obj/item/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W,/obj/item/weapon/storage))
+ if(istype(W, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = W
if(S.use_to_pickup)
- if(S.collection_mode) //Mode is set to collect all items on a tile and we clicked on a valid one.
+ if(S.collection_mode) //Mode is set to collect all items
if(isturf(src.loc))
- var/list/rejections = list()
- var/success = 0
- var/failure = 0
-
- for(var/obj/item/I in src.loc)
- if(I.type in rejections) // To limit bag spamming: any given type only complains once
- continue
- if(!S.can_be_inserted(I)) // Note can_be_inserted still makes noise when the answer is no
- rejections += I.type // therefore full bags are still a little spammy
- failure = 1
- continue
- success = 1
- S.handle_item_insertion(I, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed.
- if(success && !failure)
- user << "You put everything in [S]."
- else if(success)
- user << "You put some things in [S]."
- else
- user << "You fail to pick anything up with \the [S]."
+ S.gather_all(src.loc, user)
else if(S.can_be_inserted(src))
S.handle_item_insertion(src)
-
return
/obj/item/proc/talk_into(mob/M as mob, text)
diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm
index 6c86b7ebf4..a2310cda92 100644
--- a/code/game/objects/items/bodybag.dm
+++ b/code/game/objects/items/bodybag.dm
@@ -132,7 +132,7 @@
var/obj/item/weapon/tank/tank = null
/obj/structure/closet/body_bag/cryobag/New()
- tank = new /obj/item/weapon/tank/emergency_oxygen(null) //It's in nullspace to prevent ejection when the bag is opened.
+ tank = new /obj/item/weapon/tank/emergency/oxygen(null) //It's in nullspace to prevent ejection when the bag is opened.
..()
/obj/structure/closet/body_bag/cryobag/Destroy()
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index eec5638523..55cdc170e2 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -508,7 +508,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
qdel(src)
/obj/item/weapon/implant/compressed/implanted(mob/source as mob)
- src.activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
+ src.activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
if (source.mind)
source.mind.store_memory("Compressed matter implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0)
source << "The implanted compressed matter implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate."
diff --git a/code/game/objects/items/weapons/implants/implantfreedom.dm b/code/game/objects/items/weapons/implants/implantfreedom.dm
index 3913ebf1b2..92021a46a2 100644
--- a/code/game/objects/items/weapons/implants/implantfreedom.dm
+++ b/code/game/objects/items/weapons/implants/implantfreedom.dm
@@ -9,7 +9,7 @@
/obj/item/weapon/implant/freedom/New()
- src.activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
+ src.activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
src.uses = rand(1, 5)
..()
return
diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm
index 785fc64f75..644ebf1bb7 100644
--- a/code/game/objects/items/weapons/implants/implantuplink.dm
+++ b/code/game/objects/items/weapons/implants/implantuplink.dm
@@ -4,7 +4,7 @@
var/activation_emote = "chuckle"
/obj/item/weapon/implant/uplink/New()
- activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
+ activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
hidden_uplink = new(src)
//hidden_uplink.uses = 5
//Code currently uses a mind var for telecrystals, balancing is currently an issue. Will investigate.
@@ -12,7 +12,7 @@
return
/obj/item/weapon/implant/uplink/implanted(mob/source)
- activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
+ activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
source.mind.store_memory("Uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0)
source << "The implanted uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate."
listening_objects |= src
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 5c3d090d71..4f9a3bd6ef 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -55,12 +55,17 @@
/obj/item/weapon/storage/box/survival/New()
..()
new /obj/item/clothing/mask/breath(src)
- new /obj/item/weapon/tank/emergency_oxygen(src)
+ new /obj/item/weapon/tank/emergency/oxygen(src)
+
+/obj/item/weapon/storage/box/vox/New()
+ ..()
+ new /obj/item/clothing/mask/breath(src)
+ new /obj/item/weapon/tank/emergency/phoron(src)
/obj/item/weapon/storage/box/engineer/New()
..()
new /obj/item/clothing/mask/breath(src)
- new /obj/item/weapon/tank/emergency_oxygen/engi(src)
+ new /obj/item/weapon/tank/emergency/oxygen/engi(src)
/obj/item/weapon/storage/box/gloves
name = "box of latex gloves"
@@ -574,9 +579,9 @@
icon_state = "light"
desc = "This box is shaped on the inside so that only light tubes and bulbs fit."
item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
- storage_slots = 21
+ storage_slots = 24
can_hold = list(/obj/item/weapon/light/tube, /obj/item/weapon/light/bulb)
- max_storage_space = ITEMSIZE_COST_SMALL * 21 //holds 21 items of w_class 2
+ max_storage_space = ITEMSIZE_COST_SMALL * 24 //holds 24 items of w_class 2
use_to_pickup = 1 // for picking up broken bulbs, not that most people will try
/obj/item/weapon/storage/box/lights/bulbs/New()
diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm
index f6703bb7cb..1c77e1f6cb 100644
--- a/code/game/objects/items/weapons/storage/firstaid.dm
+++ b/code/game/objects/items/weapons/storage/firstaid.dm
@@ -138,15 +138,15 @@
/obj/item/weapon/storage/firstaid/surgery/New()
..()
if (empty) return
- new /obj/item/weapon/bonesetter(src)
- new /obj/item/weapon/cautery(src)
- new /obj/item/weapon/circular_saw(src)
- new /obj/item/weapon/hemostat(src)
- new /obj/item/weapon/retractor(src)
- new /obj/item/weapon/scalpel(src)
- new /obj/item/weapon/surgicaldrill(src)
- new /obj/item/weapon/bonegel(src)
- new /obj/item/weapon/FixOVein(src)
+ new /obj/item/weapon/surgical/bonesetter(src)
+ new /obj/item/weapon/surgical/cautery(src)
+ new /obj/item/weapon/surgical/circular_saw(src)
+ new /obj/item/weapon/surgical/hemostat(src)
+ new /obj/item/weapon/surgical/retractor(src)
+ new /obj/item/weapon/surgical/scalpel(src)
+ new /obj/item/weapon/surgical/surgicaldrill(src)
+ new /obj/item/weapon/surgical/bonegel(src)
+ new /obj/item/weapon/surgical/FixOVein(src)
new /obj/item/stack/medical/advanced/bruise_pack(src)
return
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index e691ed2795..8c1c47713a 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -478,6 +478,27 @@
src.add_fingerprint(user)
return
+/obj/item/weapon/storage/proc/gather_all(turf/T as turf, mob/user as mob)
+ var/list/rejections = list()
+ var/success = 0
+ var/failure = 0
+
+ for(var/obj/item/I in T)
+ if(I.type in rejections) // To limit bag spamming: any given type only complains once
+ continue
+ if(!can_be_inserted(I, user)) // Note can_be_inserted still makes noise when the answer is no
+ rejections += I.type // therefore full bags are still a little spammy
+ failure = 1
+ continue
+ success = 1
+ handle_item_insertion(I, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed.
+ if(success && !failure)
+ to_chat(user, "You put everything in [src].")
+ else if(success)
+ to_chat(user, "You put some things in [src].")
+ else
+ to_chat(user, "You fail to pick anything up with \the [src].")
+
/obj/item/weapon/storage/verb/toggle_gathering_mode()
set name = "Switch Gathering Method"
set category = "Object"
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index f45e766610..573325e079 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -22,7 +22,7 @@
new /obj/item/clothing/suit/space/syndicate(src)
new /obj/item/clothing/head/helmet/space/syndicate(src)
new /obj/item/clothing/mask/gas/syndicate(src)
- new /obj/item/weapon/tank/emergency_oxygen/double(src)
+ new /obj/item/weapon/tank/emergency/oxygen/double(src)
return
if("guns")
@@ -59,7 +59,7 @@
new /obj/item/clothing/suit/space/syndicate(src)
new /obj/item/clothing/head/helmet/space/syndicate(src)
new /obj/item/clothing/mask/gas/syndicate(src)
- new /obj/item/weapon/tank/emergency_oxygen/double(src)
+ new /obj/item/weapon/tank/emergency/oxygen/double(src)
new /obj/item/weapon/card/emag(src)
return
@@ -121,7 +121,7 @@
new /obj/item/clothing/suit/space/syndicate(src)
new /obj/item/clothing/head/helmet/space/syndicate(src)
new /obj/item/clothing/mask/gas/syndicate(src)
- new /obj/item/weapon/tank/emergency_oxygen/double(src)
+ new /obj/item/weapon/tank/emergency/oxygen/double(src)
return
/obj/item/weapon/storage/box/syndie_kit/chameleon
diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm
index 0c942bf486..2c5673790a 100644
--- a/code/game/objects/items/weapons/surgery_tools.dm
+++ b/code/game/objects/items/weapons/surgery_tools.dm
@@ -11,55 +11,59 @@
/*
* Retractor
*/
-/obj/item/weapon/retractor
+
+/obj/item/weapon/surgical
+ name = "Surgical tool"
+ desc = "This shouldn't be here, ahelp it."
+ icon = 'icons/obj/surgery.dmi'
+ w_class = ITEMSIZE_SMALL
+ flags = CONDUCT
+ var/helpforce = 0 //For help intent things
+
+/obj/item/weapon/surgical/attack(mob/M, mob/user)
+ if(user.a_intent == I_HELP) //A tad messy, but this should stop people from smacking their patients in surgery
+ return 0
+ ..()
+
+/obj/item/weapon/surgical/retractor
name = "retractor"
desc = "Retracts stuff."
icon = 'icons/obj/surgery.dmi'
icon_state = "retractor"
matter = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 5000)
- flags = CONDUCT
- w_class = ITEMSIZE_SMALL
origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1)
/*
* Hemostat
*/
-/obj/item/weapon/hemostat
+/obj/item/weapon/surgical/hemostat
name = "hemostat"
desc = "You think you have seen this before."
- icon = 'icons/obj/surgery.dmi'
icon_state = "hemostat"
matter = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500)
- flags = CONDUCT
- w_class = ITEMSIZE_SMALL
origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1)
attack_verb = list("attacked", "pinched")
/*
* Cautery
*/
-/obj/item/weapon/cautery
+/obj/item/weapon/surgical/cautery
name = "cautery"
desc = "This stops bleeding."
- icon = 'icons/obj/surgery.dmi'
icon_state = "cautery"
matter = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500)
- flags = CONDUCT
- w_class = ITEMSIZE_SMALL
origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1)
attack_verb = list("burnt")
/*
* Surgical Drill
*/
-/obj/item/weapon/surgicaldrill
+/obj/item/weapon/surgical/surgicaldrill
name = "surgical drill"
desc = "You can drill using this item. You dig?"
- icon = 'icons/obj/surgery.dmi'
icon_state = "drill"
hitsound = 'sound/weapons/circsawhit.ogg'
matter = list(DEFAULT_WALL_MATERIAL = 15000, "glass" = 10000)
- flags = CONDUCT
force = 15.0
w_class = ITEMSIZE_NORMAL
origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1)
@@ -73,12 +77,10 @@
/*
* Scalpel
*/
-/obj/item/weapon/scalpel
+/obj/item/weapon/surgical/scalpel
name = "scalpel"
desc = "Cut, cut, and once more cut."
- icon = 'icons/obj/surgery.dmi'
icon_state = "scalpel"
- flags = CONDUCT
force = 10.0
sharp = 1
edge = 1
@@ -100,27 +102,27 @@
/*
* Researchable Scalpels
*/
-/obj/item/weapon/scalpel/laser1
+/obj/item/weapon/surgical/scalpel/laser1
name = "laser scalpel"
desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks basic and could be improved."
icon_state = "scalpel_laser1_on"
damtype = "fire"
-/obj/item/weapon/scalpel/laser2
+/obj/item/weapon/surgical/scalpel/laser2
name = "laser scalpel"
desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks somewhat advanced."
icon_state = "scalpel_laser2_on"
damtype = "fire"
force = 12.0
-/obj/item/weapon/scalpel/laser3
+/obj/item/weapon/surgical/scalpel/laser3
name = "laser scalpel"
desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks to be the pinnacle of precision energy cutlery!"
icon_state = "scalpel_laser3_on"
damtype = "fire"
force = 15.0
-/obj/item/weapon/scalpel/manager
+/obj/item/weapon/surgical/scalpel/manager
name = "incision management system"
desc = "A true extension of the surgeon's body, this marvel instantly and completely prepares an incision allowing for the immediate commencement of therapeutic steps."
icon_state = "scalpel_manager_on"
@@ -129,13 +131,11 @@
/*
* Circular Saw
*/
-/obj/item/weapon/circular_saw
+/obj/item/weapon/surgical/circular_saw
name = "circular saw"
desc = "For heavy duty cutting."
- icon = 'icons/obj/surgery.dmi'
icon_state = "saw3"
hitsound = 'sound/weapons/circsawhit.ogg'
- flags = CONDUCT
force = 15.0
w_class = ITEMSIZE_NORMAL
throwforce = 9.0
@@ -148,31 +148,25 @@
edge = 1
//misc, formerly from code/defines/weapons.dm
-/obj/item/weapon/bonegel
+/obj/item/weapon/surgical/bonegel
name = "bone gel"
- icon = 'icons/obj/surgery.dmi'
icon_state = "bone-gel"
force = 0
- w_class = ITEMSIZE_SMALL
throwforce = 1.0
-/obj/item/weapon/FixOVein
+/obj/item/weapon/surgical/FixOVein
name = "FixOVein"
- icon = 'icons/obj/surgery.dmi'
icon_state = "fixovein"
force = 0
throwforce = 1.0
origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 3)
- w_class = ITEMSIZE_SMALL
var/usage_amount = 10
-/obj/item/weapon/bonesetter
+/obj/item/weapon/surgical/bonesetter
name = "bone setter"
- icon = 'icons/obj/surgery.dmi'
icon_state = "bone setter"
force = 8.0
throwforce = 9.0
throw_speed = 3
throw_range = 5
- w_class = ITEMSIZE_SMALL
attack_verb = list("attacked", "hit", "bludgeoned")
diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm
index 83372ffa58..6c2b6aa885 100644
--- a/code/game/objects/items/weapons/tanks/tank_types.dm
+++ b/code/game/objects/items/weapons/tanks/tank_types.dm
@@ -16,15 +16,15 @@
icon_state = "oxygen"
distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
- New()
+/obj/item/weapon/tank/oxygen/New()
..()
air_contents.adjust_gas("oxygen", (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
return
- examine(mob/user)
- if(..(user, 0) && air_contents.gas["oxygen"] < 10)
- user << text("The meter on \the [src] indicates you are almost out of oxygen!")
- //playsound(usr, 'sound/effects/alert.ogg', 50, 1)
+/obj/item/weapon/tank/oxygen/examine(mob/user)
+ if(..(user, 0) && air_contents.gas["oxygen"] < 10)
+ user << text("The meter on \the [src] indicates you are almost out of oxygen!")
+ //playsound(usr, 'sound/effects/alert.ogg', 50, 1)
/obj/item/weapon/tank/oxygen/yellow
desc = "A tank of oxygen, this one is yellow."
@@ -59,10 +59,10 @@
desc = "Mixed anyone?"
icon_state = "oxygen"
- examine(mob/user)
- if(..(user, 0) && air_contents.gas["oxygen"] < 1 && loc==user)
- user << "The meter on the [src.name] indicates you are almost out of air!"
- user << sound('sound/effects/alert.ogg')
+/obj/item/weapon/tank/air/examine(mob/user)
+ if(..(user, 0) && air_contents.gas["oxygen"] < 1 && loc==user)
+ user << "The meter on the [src.name] indicates you are almost out of air!"
+ user << sound('sound/effects/alert.ogg')
/obj/item/weapon/tank/air/New()
..()
@@ -100,44 +100,97 @@
src.loc = F
return
+/obj/item/weapon/tank/vox //Can't be a child of phoron or the gas amount gets screwey.
+ name = "phoron tank"
+ desc = "Contains dangerous phoron. Do not inhale. Warning: extremely flammable."
+ icon_state = "oxygen_fr"
+ gauge_icon = null
+ flags = CONDUCT
+ distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
+ slot_flags = SLOT_BACK //these ones have straps!
+
+/obj/item/weapon/tank/vox/New()
+ ..()
+
+ air_contents.adjust_gas("phoron", (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
+ return
+
/*
* Emergency Oxygen
*/
-/obj/item/weapon/tank/emergency_oxygen
- name = "emergency oxygen tank"
- desc = "Used for emergencies. Contains very little oxygen, so try to conserve it until you actually need it."
+
+/obj/item/weapon/tank/emergency
+ name = "emergency tank"
icon_state = "emergency"
gauge_icon = "indicator_emergency"
gauge_cap = 4
flags = CONDUCT
slot_flags = SLOT_BELT
w_class = ITEMSIZE_SMALL
- force = 4.0
+ force = 4
distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
volume = 2 //Tiny. Real life equivalents only have 21 breaths of oxygen in them. They're EMERGENCY tanks anyway -errorage (dangercon 2011)
- New()
+/obj/item/weapon/tank/emergency/oxygen
+ name = "emergency oxygen tank"
+ desc = "Used for emergencies. Contains very little oxygen, so try to conserve it until you actually need it."
+ icon_state = "emergency"
+ gauge_icon = "indicator_emergency"
+
+/obj/item/weapon/tank/emergency/oxygen/New()
..()
src.air_contents.adjust_gas("oxygen", (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
return
- examine(mob/user)
- if(..(user, 0) && air_contents.gas["oxygen"] < 0.2 && loc==user)
- user << text("The meter on the [src.name] indicates you are almost out of air!")
- user << sound('sound/effects/alert.ogg')
+/obj/item/weapon/tank/emergency/oxygen/examine(mob/user)
+ if(..(user, 0) && air_contents.gas["oxygen"] < 0.2 && loc==user)
+ user << text("The meter on the [src.name] indicates you are almost out of air!")
+ user << sound('sound/effects/alert.ogg')
-/obj/item/weapon/tank/emergency_oxygen/engi
+/obj/item/weapon/tank/emergency/oxygen/engi
name = "extended-capacity emergency oxygen tank"
icon_state = "emergency_engi"
volume = 6
-/obj/item/weapon/tank/emergency_oxygen/double
+/obj/item/weapon/tank/emergency/oxygen/double
name = "double emergency oxygen tank"
icon_state = "emergency_double"
gauge_icon = "indicator_emergency_double"
volume = 10
+/obj/item/weapon/tank/emergency/nitrogen
+ name = "emergency nitrogen tank"
+ desc = "An emergency air tank hastily painted red."
+ icon_state = "emergency_nitro"
+ gauge_icon = "indicator_emergency"
+
+/obj/item/weapon/tank/emergency/nitrogen/New()
+ ..()
+ src.air_contents.adjust_gas("nitrogen", (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
+
+/obj/item/weapon/tank/emergency/nitrogen/double
+ name = "double emergency nitrogen tank"
+ icon_state = "emergency_double_nitrogen"
+ gauge_icon = "indicator_emergency_double"
+ volume = 10
+
+/obj/item/weapon/tank/emergency/phoron
+ name = "emergency phoron tank"
+ desc = "An emergency air tank hastily painted red."
+ icon_state = "emergency_nitro"
+ gauge_icon = "indicator_emergency"
+
+/obj/item/weapon/tank/emergency/phoron/New()
+ ..()
+ src.air_contents.adjust_gas("phoron", (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
+
+/obj/item/weapon/tank/emergency/phoron/double
+ name = "double emergency nitrogen tank"
+ icon_state = "emergency_double_nitrogen"
+ gauge_icon = "indicator_emergency_double"
+ volume = 10
+
/*
* Nitrogen
*/
diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm
index bea64ddce9..cd12ad5a0c 100644
--- a/code/game/objects/random/random.dm
+++ b/code/game/objects/random/random.dm
@@ -462,9 +462,9 @@
prob(4);/obj/item/weapon/tank/oxygen/yellow,
prob(4);/obj/item/weapon/tank/oxygen/red,
prob(3);/obj/item/weapon/tank/air,
- prob(4);/obj/item/weapon/tank/emergency_oxygen,
- prob(3);/obj/item/weapon/tank/emergency_oxygen/engi,
- prob(2);/obj/item/weapon/tank/emergency_oxygen/double,
+ prob(4);/obj/item/weapon/tank/emergency/oxygen,
+ prob(3);/obj/item/weapon/tank/emergency/oxygen/engi,
+ prob(2);/obj/item/weapon/tank/emergency/oxygen/double,
prob(1);/obj/item/device/suit_cooling_unit)
/obj/random/cigarettes
diff --git a/code/game/objects/structures/crates_lockers/closets/l3closet.dm b/code/game/objects/structures/crates_lockers/closets/l3closet.dm
index 1b4b27b196..c00875e522 100644
--- a/code/game/objects/structures/crates_lockers/closets/l3closet.dm
+++ b/code/game/objects/structures/crates_lockers/closets/l3closet.dm
@@ -53,8 +53,8 @@
new /obj/item/clothing/head/bio_hood/janitor(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/clothing/mask/gas(src)
- new /obj/item/weapon/tank/emergency_oxygen/engi(src)
- new /obj/item/weapon/tank/emergency_oxygen/engi(src)
+ new /obj/item/weapon/tank/emergency/oxygen/engi(src)
+ new /obj/item/weapon/tank/emergency/oxygen/engi(src)
/obj/structure/closet/l3closet/scientist
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index c7095514cc..6417f93ab7 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -57,7 +57,7 @@
new /obj/item/clothing/gloves/black(src)
// new /obj/item/weapon/cartridge/quartermaster(src)
new /obj/item/clothing/suit/fire/firefighter(src)
- new /obj/item/weapon/tank/emergency_oxygen(src)
+ new /obj/item/weapon/tank/emergency/oxygen(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/clothing/glasses/meson(src)
new /obj/item/clothing/head/soft(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 3ead9d15aa..f79203c3ba 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -36,7 +36,7 @@
new /obj/item/device/flash(src)
new /obj/item/taperoll/engineering(src)
new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering(src)
- new /obj/item/weapon/tank/emergency_oxygen/engi(src)
+ new /obj/item/weapon/tank/emergency/oxygen/engi(src)
return
@@ -127,7 +127,7 @@
new /obj/item/weapon/cartridge/engineering(src)
new /obj/item/taperoll/engineering(src)
new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering(src)
- new /obj/item/weapon/tank/emergency_oxygen/engi(src)
+ new /obj/item/weapon/tank/emergency/oxygen/engi(src)
return
@@ -162,5 +162,5 @@
new /obj/item/weapon/cartridge/atmos(src)
new /obj/item/taperoll/atmos(src)
new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos(src)
- new /obj/item/weapon/tank/emergency_oxygen/engi(src)
+ new /obj/item/weapon/tank/emergency/oxygen/engi(src)
return
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index a564ddb074..9f6109b8ef 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -143,7 +143,7 @@
new /obj/item/device/radio/headset/headset_med/alt(src)
new /obj/item/weapon/cartridge/medical(src)
new /obj/item/device/flashlight(src)
- new /obj/item/weapon/tank/emergency_oxygen/engi(src)
+ new /obj/item/weapon/tank/emergency/oxygen/engi(src)
new /obj/item/clothing/glasses/hud/health(src)
new /obj/item/device/healthanalyzer(src)
new /obj/item/device/radio/off(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index a7d50f24e6..4bed035b82 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -127,6 +127,7 @@
new /obj/item/clothing/head/beret/sec/corporate/hos(src)
new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src)
new /obj/item/device/flashlight/maglight(src)
+ new /obj/item/clothing/mask/gas/half(src)
return
@@ -173,6 +174,7 @@
new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src)
new /obj/item/device/flashlight/maglight(src)
new /obj/item/device/megaphone(src)
+ new /obj/item/clothing/mask/gas/half(src)
return
diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
index 714be281b8..5c8aa2b2e0 100644
--- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
@@ -24,27 +24,27 @@
switch (pickweight(list("small" = 55, "aid" = 25, "tank" = 10, "both" = 10)))
if ("small")
- new /obj/item/weapon/tank/emergency_oxygen(src)
- new /obj/item/weapon/tank/emergency_oxygen(src)
+ new /obj/item/weapon/tank/emergency/oxygen(src)
+ new /obj/item/weapon/tank/emergency/oxygen(src)
new /obj/item/clothing/mask/breath(src)
new /obj/item/clothing/mask/breath(src)
new /obj/item/clothing/suit/space/emergency(src)
new /obj/item/clothing/head/helmet/space/emergency(src)
if ("aid")
- new /obj/item/weapon/tank/emergency_oxygen(src)
+ new /obj/item/weapon/tank/emergency/oxygen(src)
new /obj/item/weapon/storage/toolbox/emergency(src)
new /obj/item/clothing/mask/breath(src)
new /obj/item/weapon/storage/firstaid/o2(src)
new /obj/item/clothing/suit/space/emergency(src)
new /obj/item/clothing/head/helmet/space/emergency(src)
if ("tank")
- new /obj/item/weapon/tank/emergency_oxygen/engi(src)
+ new /obj/item/weapon/tank/emergency/oxygen/engi(src)
new /obj/item/clothing/mask/breath(src)
- new /obj/item/weapon/tank/emergency_oxygen/engi(src)
+ new /obj/item/weapon/tank/emergency/oxygen/engi(src)
new /obj/item/clothing/mask/breath(src)
if ("both")
new /obj/item/weapon/storage/toolbox/emergency(src)
- new /obj/item/weapon/tank/emergency_oxygen/engi(src)
+ new /obj/item/weapon/tank/emergency/oxygen/engi(src)
new /obj/item/clothing/mask/breath(src)
new /obj/item/weapon/storage/firstaid/o2(src)
new /obj/item/clothing/suit/space/emergency(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/walllocker.dm b/code/game/objects/structures/crates_lockers/closets/walllocker.dm
index 1fadf10eec..39204e3491 100644
--- a/code/game/objects/structures/crates_lockers/closets/walllocker.dm
+++ b/code/game/objects/structures/crates_lockers/closets/walllocker.dm
@@ -16,7 +16,7 @@
/obj/structure/closet/walllocker/emerglocker
name = "emergency locker"
desc = "A wall mounted locker with emergency supplies."
- var/list/spawnitems = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/weapon/crowbar/red)
+ var/list/spawnitems = list(/obj/item/weapon/tank/emergency/oxygen,/obj/item/clothing/mask/breath,/obj/item/weapon/crowbar/red)
var/amount = 2 // spawns each items X times.
icon_state = "emerg"
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index 3dcdd0e85c..f69242fcfa 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -147,8 +147,7 @@
new /obj/item/clothing/shoes/black(src)
new /obj/item/clothing/suit/nun(src)
new /obj/item/clothing/head/nun_hood(src)
- new /obj/item/clothing/suit/chaplain_hoodie(src)
- new /obj/item/clothing/head/chaplain_hood(src)
+ new /obj/item/clothing/suit/storage/hooded/chaplain_hoodie(src)
new /obj/item/clothing/suit/holidaypriest(src)
new /obj/item/clothing/under/wedding/bride_white(src)
new /obj/item/weapon/storage/backpack/cultpack (src)
@@ -536,6 +535,7 @@
new /obj/item/clothing/under/pants/black(src)
new /obj/item/clothing/under/pants/tan(src)
new /obj/item/clothing/under/pants/track(src)
+ new /obj/item/clothing/suit/storage/toggle/track(src)
new /obj/item/clothing/under/pants(src)
new /obj/item/clothing/under/pants/khaki(src)
new /obj/item/clothing/mask/bandana/blue(src)
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 588517a7ed..0d8a94944d 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -78,6 +78,9 @@
else
user << "[src] can't hold any more signs."
+ else if(istype(I, /obj/item/weapon/reagent_containers/glass))
+ return // So we do not put them in the trash bag as we mean to fill the mop bucket
+
else if(mybag)
mybag.attackby(I, user)
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index a8747e07ec..cd0ab5ec9c 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -113,3 +113,31 @@
else
user.visible_message("[user] hits [src] and bounces off!")
return 1
+
+// The following mirror is ~special~.
+/obj/structure/mirror/raider
+ name = "cracked mirror"
+ desc = "Something seems strange about this old, dirty mirror. Your reflection doesn't look like you remember it."
+ icon_state = "mirror_broke"
+ shattered = 1
+
+/obj/structure/mirror/raider/attack_hand(var/mob/living/carbon/human/user)
+ if(istype(get_area(src),/area/syndicate_mothership))
+ if(istype(user) && user.mind && user.mind.special_role == "Raider" && user.species.name != "Vox" && is_alien_whitelisted(user, "Vox"))
+ var/choice = input("Do you wish to become a true Vox of the Shoal? This is not reversible.") as null|anything in list("No","Yes")
+ if(choice && choice == "Yes")
+ var/mob/living/carbon/human/vox/vox = new(get_turf(src),"Vox")
+ vox.gender = user.gender
+ raiders.equip(vox)
+ if(user.mind)
+ user.mind.transfer_to(vox)
+ spawn(1)
+ var/newname = sanitizeSafe(input(vox,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN)
+ if(!newname || newname == "")
+ var/datum/language/L = all_languages[vox.species.default_language]
+ newname = L.get_random_name()
+ vox.real_name = newname
+ vox.name = vox.real_name
+ raiders.update_access(vox)
+ qdel(user)
+ ..()
\ No newline at end of file
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index 4172457b1f..0b2da66927 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -147,8 +147,8 @@
slip_stun = 4
slip_dist = 2
- if(M.slip("the [floor_type] floor",slip_stun))
- for(var/i = 0;iMovement is admin-disabled." //This is to identify lag problems
diff --git a/code/modules/admin/news.dm b/code/modules/admin/news.dm
index 7881febe3a..179391987c 100644
--- a/code/modules/admin/news.dm
+++ b/code/modules/admin/news.dm
@@ -1,13 +1,13 @@
#define NEWSFILE "data/news.sav" //where the memos are saved
/client/
- var/last_news_hash = null // Stores a hash of the last news window it saw, which gets compared to the current one to see if it is different.
+ //var/last_news_hash = null // Stores a hash of the last news window it saw, which gets compared to the current one to see if it is different.
// Returns true if news was updated since last seen.
/client/proc/check_for_new_server_news()
var/savefile/F = get_server_news()
if(F)
- if(md5(F["body"]) != last_news_hash)
+ if(md5(F["body"]) != prefs.lastnews)
return TRUE
return FALSE
@@ -21,11 +21,17 @@
var/savefile/F = new(NEWSFILE)
if(F)
var/title = F["title"]
- var/body = F["body"]
+ var/body = html2paper_markup(F["body"])
var/new_title = sanitize(input(src,"Write a good title for the news update. Note: HTML is NOT supported.","Write News", title) as null|text, extra = 0)
if(!new_title)
return
- var/new_body = sanitize(input(src,"Write the body of the news update here. Note: HTML is NOT supported.","Write News", body) as null|message, extra = 0)
+ var/new_body = sanitize(input(src,"Write the body of the news update here. Note: HTML is NOT supported, however paper markup is supported. \n\
+ Hitting enter will automatically add a line break. \n\
+ Valid markup includes: \[b\], \[i\], \[u\], \[large\], \[h1\], \[h2\], \[h3\]\ \[*\], \[hr\], \[small\], \[list\], \[table\], \[grid\], \
+ \[row\], \[cell\], \[logo\], \[sglogo\].","Write News", body) as null|message, extra = 0)
+
+ new_body = paper_markup2html(new_body)
+
if(findtext(new_body,"