diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index c81bd490601..19f7fd5e0fd 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -8780,7 +8780,7 @@
"dmR" = (/obj/machinery/camera{c_tag = "Mini Satellite Access"; dir = 4; network = list("SS13","MiniSat")},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/engine/engineering)
"dmS" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/engine/engineering)
"dmT" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/transit_tube{dir = 4; icon_state = "Block"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/engineering)
-"dmU" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/transit_tube/station,/obj/structure/transit_tube_pod{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/engine/engineering)
+"dmU" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/transit_tube/station,/obj/structure/transit_tube_pod{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/engine/engineering)
"dmV" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube,/turf/simulated/floor/plating,/area/engine/engineering)
"dmW" = (/obj/structure/transit_tube,/turf/space,/area/space)
"dmX" = (/obj/structure/transit_tube{icon_state = "E-W-Pass"},/obj/structure/lattice,/turf/space,/area/space)
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index 08b75f3857d..a4d9ca87384 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -24,8 +24,8 @@
#define BLOCK_GAS_SMOKE_EFFECT 8192 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY!
#define THICKMATERIAL 8192 //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with BLOCK_GAS_SMOKE_EFFECT)
-
-#define NOREACT 16384 //Reagents dont' react inside this container.
+//Reagent flags
+#define REAGENT_NOREACT 1
//Species flags.
diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm
index b623ce72158..492918be671 100644
--- a/code/__DEFINES/qdel.dm
+++ b/code/__DEFINES/qdel.dm
@@ -4,8 +4,7 @@
#define QDEL_HINT_LETMELIVE 1 //qdel should let the object live after calling destory.
#define QDEL_HINT_IWILLGC 2 //functionally the same as the above. qdel should assume the object will gc on its own, and not check it.
#define QDEL_HINT_HARDDEL_NOW 4 //qdel should assume this object won't gc, and hard del it post haste.
-#define QDEL_HINT_PUTINPOOL 5 //qdel will put this object in the atom pool.
-#define QDEL_HINT_FINDREFERENCE 6 //functionally identical to QDEL_HINT_QUEUE if TESTING is not enabled in _compiler_options.dm.
+#define QDEL_HINT_FINDREFERENCE 5 //functionally identical to QDEL_HINT_QUEUE if TESTING is not enabled in _compiler_options.dm.
//if TESTING is enabled, qdel will call this object's find_references() verb.
// A convenient wrapper around checking for qdeletion/non-existence
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index b91f19f97b4..fbfbbb12527 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -387,7 +387,7 @@
return
for(var/mob/living/target in targets)
var/thralls = 0
- var/victory_threshold = 15
+ var/victory_threshold = ticker.mode.required_thralls
var/mob/M
to_chat(target, "You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls.")
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index d95570cf88f..13602957de1 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -243,7 +243,6 @@
desc = "Equipment for medical exosuits. A chem synthesizer with syringe gun. Reagents inside are held in stasis, so no reactions will occur."
icon = 'icons/obj/guns/projectile.dmi'
icon_state = "syringegun"
- flags = NOREACT
var/list/syringes
var/list/known_reagents
var/list/processed_reagents
@@ -259,6 +258,7 @@
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/New()
..()
create_reagents(max_volume)
+ reagents.set_reacting(FALSE)
syringes = new
known_reagents = list("epinephrine"="Epinephrine","charcoal"="Charcoal")
processed_reagents = new
@@ -273,7 +273,8 @@
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/critfail()
..()
- flags &= ~NOREACT
+ if(reagents)
+ reagents.set_reacting(TRUE)
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/can_attach(obj/mecha/medical/M)
if(..())
diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm
index 8449e17a9db..26bb243f0d1 100644
--- a/code/game/objects/items/weapons/cigs.dm
+++ b/code/game/objects/items/weapons/cigs.dm
@@ -42,11 +42,13 @@ LIGHTERS ARE IN LIGHTERS.DM
/obj/item/clothing/mask/cigarette/New()
..()
- flags |= NOREACT // so it doesn't react until you light it
create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 30
+ reagents.set_reacting(FALSE) // so it doesn't react until you light it
/obj/item/clothing/mask/cigarette/Destroy()
- qdel(reagents)
+ if(reagents)
+ qdel(reagents)
+ processing_objects -= src
return ..()
/obj/item/clothing/mask/cigarette/attack(var/mob/living/M, var/mob/living/user, def_zone)
@@ -135,7 +137,7 @@ LIGHTERS ARE IN LIGHTERS.DM
M.unEquip(src, 1)
qdel(src)
return
- flags &= ~NOREACT // allowing reagents to react after being lit
+ reagents.set_reacting(TRUE)
reagents.handle_reactions()
icon_state = icon_on
item_state = icon_on
diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm
index 4df6905c0d3..d82ec9fdf00 100644
--- a/code/game/objects/items/weapons/holy_weapons.dm
+++ b/code/game/objects/items/weapons/holy_weapons.dm
@@ -461,6 +461,51 @@
if(prob(10))
to_chat(H, "Being in the presence of [holder]'s [src] is interfering with your powers!")
+/obj/item/weapon/nullrod/salt
+ name = "Holy Salt"
+ icon = 'icons/obj/food/containers.dmi'
+ icon_state = "saltshakersmall"
+ desc = "While commonly used to repel some ghosts, it appears others are downright attracted to it."
+ force = 0
+ throwforce = 0
+ var/ghostcall_CD = 0
+
+
+/obj/item/weapon/nullrod/salt/attack_self(mob/user)
+
+ if(!user.mind || user.mind.assigned_role != "Chaplain")
+ to_chat(user, "You are not close enough with [ticker.Bible_deity_name] to use [src].")
+ return
+
+ if(!(ghostcall_CD > world.time))
+ ghostcall_CD = world.time + 3000 //deciseconds..5 minutes
+ user.visible_message("[user] kneels and begins to utter a prayer to [ticker.Bible_deity_name] while drawing a circle with salt!", \
+ "You kneel and begin a prayer to [ticker.Bible_deity_name] while drawing a circle!")
+ notify_ghosts("The Chaplain is calling ghosts to [get_area(src)] with [name]!", source = src)
+ else
+ to_chat(user, "You need to wait before using [src] again.")
+ return
+
+
+/obj/item/weapon/nullrod/rosary/bread
+ name = "prayer bread"
+ icon = 'icons/obj/food/food.dmi'
+ icon_state = "baguette"
+ desc = "a staple of worshipers of the Silentfather, this holy mime artifact has an odd effect on clowns."
+
+/obj/item/weapon/nullrod/rosary/bread/process()
+ if(ishuman(loc))
+ var/mob/living/carbon/human/holder = loc
+ //would like to make the holder mime if they have it in on thier person in general
+ if(src == holder.l_hand || src == holder.r_hand) // Holding this in your hand will
+ for(var/mob/living/carbon/human/H in range(5))
+ if(H.mind.assigned_role == "Clown")
+ H.Silence(10)
+ animate_fade_grayscale(H,20)
+ if(prob(10))
+ to_chat(H, "Being in the presence of [holder]'s [src] is interfering with your honk!")
+
+
/obj/item/weapon/nullrod/missionary_staff
name = "holy staff"
desc = "It has a mysterious, protective aura."
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index 1d8990875a4..9a9cf319319 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -176,8 +176,8 @@
/obj/item/weapon/storage/fancy/cigarettes/New()
..()
- flags |= NOREACT
create_reagents(30 * storage_slots)//so people can inject cigarettes without opening a packet, now with being able to inject the whole one
+ reagents.set_reacting(FALSE)
for(var/i = 1 to storage_slots)
var/obj/item/clothing/mask/cigarette/C = new cigarette_type(src)
unlaced_cigarettes += C
diff --git a/code/modules/clothing/spacesuits/breaches.dm b/code/modules/clothing/spacesuits/breaches.dm
index 7c74f77b054..37c88241173 100644
--- a/code/modules/clothing/spacesuits/breaches.dm
+++ b/code/modules/clothing/spacesuits/breaches.dm
@@ -92,7 +92,7 @@ var/global/list/breach_burn_descriptors = list(
if(!breaches)
breaches = list()
- if(damage > 25) return //We don't need to keep tracking it when it's at 250% pressure loss, really.
+ if(damage >= 25) return //We don't need to keep tracking it when it's at 250% pressure loss, really.
if(!loc) return
var/turf/T = get_turf(src)
@@ -125,7 +125,7 @@ var/global/list/breach_burn_descriptors = list(
var/datum/breach/B = new()
breaches += B
- B.class = min(amount,5)
+ B.class = min(amount,(5 - max(damage - 20,0))) //We cap the check at 25, this line could overshoot without the calculation if it gets enough dammage in one shot.
B.damtype = damtype
B.update_descriptor()
diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm
index 16ddf2bdd69..925beda23cd 100644
--- a/code/modules/clothing/spacesuits/rig/modules/combat.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm
@@ -119,7 +119,7 @@
gun.attack_self(holder.wearer)
return 1
- gun.process_fire(target,holder.wearer)
+ gun.afterattack(target,holder.wearer)
return 1
/obj/item/rig_module/mounted/egun
diff --git a/code/modules/clothing/spacesuits/rig/modules/handheld.dm b/code/modules/clothing/spacesuits/rig/modules/handheld.dm
new file mode 100644
index 00000000000..1a8a66a5fc4
--- /dev/null
+++ b/code/modules/clothing/spacesuits/rig/modules/handheld.dm
@@ -0,0 +1,50 @@
+
+/obj/item/rig_module/handheld
+ name = "mounted device"
+ desc = "Some kind of hardsuit extension."
+ usable = 0
+ selectable = 0
+ toggleable = 1
+ disruptive = 0
+ activate_string = "Deploy"
+ deactivate_string = "Retract"
+
+ var/device_type
+ var/obj/item/device
+
+/obj/item/rig_module/handheld/activate()
+ if(!..())
+ return
+
+ if(!holder.wearer.put_in_hands(device))
+ to_chat(holder.wearer, "You need a free hand to hold \the [device].")
+ active = 0
+ return
+
+ to_chat(holder.wearer, "You deploy \the [device].")
+
+
+/obj/item/rig_module/handheld/deactivate()
+ if(!..())
+ return
+ if(ismob(device.loc)) //Better check for the holder, instead of assuming the rigwearer has it.
+ var/mob/M = device.loc //Helps in case the code fails to keep the module in one place, this should still return it.
+ M.unEquip(device, 1)
+
+ device.loc = src
+ to_chat(holder.wearer, "You retract \the [device].")
+
+/obj/item/rig_module/handheld/New()
+ ..()
+ if(device_type)
+ device = new device_type(src)
+ device.flags |= NODROP //We don't want to drop it while it's active/inhand.
+ activate_string += " [device]"
+ deactivate_string += " [device]"
+
+/obj/item/rig_module/handheld/horn
+ name = "mounted bikehorn"
+ desc = "For tactical honking"
+ interface_name = "mounted bikehorn"
+ interface_desc = "Honks"
+ device_type = /obj/item/weapon/bikehorn
diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm
index 46471966aa7..aa1e644e506 100644
--- a/code/modules/clothing/spacesuits/rig/modules/utility.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm
@@ -94,7 +94,9 @@
*/
/obj/item/rig_module/device/New()
..()
- if(device_type) device = new device_type(src)
+ if(device_type)
+ device = new device_type(src)
+ device.flags |= ABSTRACT //Abstract in the sense that it's not an item that stands alone, but rather is just there to let the module act like it.
/obj/item/rig_module/device/engage(atom/target)
if(!..() || !device)
@@ -417,13 +419,15 @@
interface_desc = "Leave your mark."
engage_string = "Toggle stamp type"
usable = 1
- var/iastamp
- var/deniedstamp
+ var/obj/iastamp //Theese were just vars, but any device would need to be an object
+ var/obj/deniedstamp //Stops assigning non-objects to theese vars, which probably would break quite a bit.
/obj/item/rig_module/device/stamp/New()
..()
iastamp = new /obj/item/weapon/stamp/law(src)
deniedstamp = new /obj/item/weapon/stamp/denied(src)
+ iastamp.flags |= ABSTRACT
+ deniedstamp.flags |= ABSTRACT
device = iastamp
/obj/item/rig_module/device/stamp/engage(atom/target)
@@ -488,4 +492,4 @@
W.update_icon()
/obj/item/rig_module/welding_tank/proc/get_fuel()
- return reagents.get_reagent_amount("fuel")
\ No newline at end of file
+ return reagents.get_reagent_amount("fuel")
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index 2ebd01a9162..0b9e87891d8 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -42,7 +42,7 @@
//Component/device holders.
var/obj/item/weapon/tank/air_supply // Air tank, if any.
- var/obj/item/clothing/shoes/boots = null // Deployable boots, if any.
+ var/obj/item/clothing/shoes/magboots/boots = null // Deployable boots, if any.
var/obj/item/clothing/suit/space/new_rig/chest // Deployable chestpiece, if any.
var/obj/item/clothing/head/helmet/space/new_rig/helmet = null // Deployable helmet, if any.
var/obj/item/clothing/gloves/rig/gloves = null // Deployable gauntlets, if any.
@@ -76,6 +76,7 @@
var/airtight = 1 //If set, will adjust AIRTIGHT and STOPSPRESSUREDMAGE flags on components. Otherwise it should leave them untouched.
var/emp_protection = 0
+ var/has_emergency_release = 1 //Allows suit to be removed from outside.
// Wiring! How exciting.
var/datum/wires/rig/wires
@@ -126,14 +127,17 @@
if(helm_type)
helmet = new helm_type(src)
verbs |= /obj/item/weapon/rig/proc/toggle_helmet
+ helmet.item_color="[initial(icon_state)]_sealed" //For the lightswitching to know the correct string to manipulate
if(boot_type)
boots = new boot_type(src)
verbs |= /obj/item/weapon/rig/proc/toggle_boots
+ boots.magboot_state="[initial(icon_state)]_sealed" //For the magboot (de)activation to know the correct string to manipulate
if(chest_type)
chest = new chest_type(src)
if(allowed)
chest.allowed = allowed
chest.slowdown = offline_slowdown
+ chest.holder = src
verbs |= /obj/item/weapon/rig/proc/toggle_chest
for(var/obj/item/piece in list(gloves,helmet,boots,chest))
@@ -183,6 +187,10 @@
/obj/item/weapon/rig/proc/reset()
offline = 2
flags &= ~NODROP
+ if(helmet && helmet.on)
+ helmet.toggle_light(wearer)
+ if(boots && boots.magpulse)
+ boots.attack_self(wearer)
for(var/obj/item/piece in list(helmet,boots,gloves,chest))
if(!piece) continue
piece.icon_state = "[initial(icon_state)]"
@@ -254,6 +262,7 @@
switch(msg_type)
if("boots")
to_chat(wearer, "\The [correct_piece] seal around your feet.")
+ correct_piece.icon_state = "[initial(icon_state)]_sealed0" //Solution to not need a sprite for off, on, and unused magboots.
if(user != wearer)
to_chat(user, "\The [correct_piece] has been sealed.")
wearer.update_inv_shoes()
@@ -269,6 +278,7 @@
wearer.update_inv_wear_suit()
if("helmet")
to_chat(wearer, "\The [correct_piece] hisses closed.")
+ correct_piece.icon_state = "[initial(icon_state)]_sealed0" //Solution to not need a sprite for off, on, and unused helmet light.
if(user != wearer)
to_chat(user, "\The [correct_piece] has been sealed.")
wearer.update_inv_head()
@@ -383,10 +393,14 @@
sealing = FALSE
if(failed_to_seal)
- for(var/obj/item/piece in list(helmet, boots, gloves, chest))
+ for(var/obj/item/piece in list(gloves, chest))
if(!piece)
continue
piece.icon_state = "[initial(icon_state)]_sealed"
+ if(helmet)
+ helmet.icon_state = "[initial(icon_state)]_sealed[helmet.on]"
+ if(boots)
+ boots.icon_state = "[initial(icon_state)]_sealed[boots.magpulse]"
if(airtight)
update_component_sealed()
update_icon(1)
@@ -406,6 +420,10 @@
update_icon(1)
/obj/item/weapon/rig/proc/update_component_sealed()
+ if(istype(boots) && !(flags & NODROP) && boots.magpulse) //If we have (active) boots and unsealed the suit, we deactivate the magboots.
+ boots.attack_self(wearer)
+ if(istype(helmet) && !(flags & NODROP) && helmet.on) //If we have an (active) headlamp and unsealed the suit, we deactivate the headlamp.
+ helmet.toggle_light(wearer)
for(var/obj/item/piece in list(helmet,boots,gloves,chest))
if(!(flags & NODROP))
piece.flags &= ~STOPSPRESSUREDMAGE
@@ -695,6 +713,8 @@
M.visible_message("[M] struggles into \the [src].", "You struggle into \the [src].")
wearer = M
wearer.wearing_rig = src
+ if(has_emergency_release)
+ M.verbs |= /obj/item/weapon/rig/proc/emergency_release
update_icon()
/obj/item/weapon/rig/proc/toggle_piece(var/piece, var/mob/living/user, var/deploy_mode, var/force)
@@ -705,15 +725,15 @@
if(isliving(uneq_piece.loc))
var/mob/living/L = uneq_piece.loc
L.unEquip(uneq_piece, 1)
- uneq_piece.flags &= ~NODROP
uneq_piece.forceMove(src)
return 0
if(sealing || !cell || !cell.charge)
return 0
- if(user == wearer && user.incapacitated()) // If the user isn't wearing the suit it's probably an AI.
- return 0
+ if(!(deploy_mode == ONLY_RETRACT && force)) //This should be the case while stripping, stripping does trigger the if statement below.
+ if(user == wearer && user.incapacitated()) // If the user isn't wearing the suit it's probably an AI.
+ return 0
var/obj/item/check_slot
var/equip_to
@@ -752,7 +772,6 @@
if(to_strip)
to_strip.unEquip(use_obj, 1)
- use_obj.flags &= ~NODROP
use_obj.forceMove(src)
if(wearer)
to_chat(wearer, "Your [use_obj] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly.")
@@ -762,13 +781,11 @@
to_chat(wearer, "You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way.")
return
use_obj.forceMove(wearer)
- use_obj.flags &= ~NODROP
if(!wearer.equip_to_slot_if_possible(use_obj, equip_to, 0, 1))
use_obj.forceMove(src)
else
if(wearer)
to_chat(wearer, "Your [use_obj.name] [use_obj.gender == PLURAL ? "deploy" : "deploys"] swiftly.")
- use_obj.flags |= NODROP
if(piece == "helmet" && helmet)
helmet.update_light(wearer)
@@ -777,17 +794,17 @@
if(!wearer || !user)
return 0
- if(flags & NODROP)
- if(wearer.head && wearer.head != helmet)
+ if(flags & NODROP) //We need to check if we have the part, the person is wearing something in the parts slot, and if yes, are they the same.
+ if(helmet && wearer.head && wearer.head != helmet)
to_chat(user, "\The [wearer.head] is blocking \the [src] from deploying!")
return 0
- if(wearer.gloves && wearer.gloves != gloves)
+ if(gloves && wearer.gloves && wearer.gloves != gloves)
to_chat(user, "\The [wearer.gloves] is preventing \the [src] from deploying!")
return 0
- if(wearer.shoes && wearer.shoes != boots)
+ if(boots && wearer.shoes && wearer.shoes != boots)
to_chat(user, "\The [wearer.shoes] is preventing \the [src] from deploying!")
return 0
- if(wearer.wear_suit && wearer.wear_suit != chest)
+ if(chest && wearer.wear_suit && wearer.wear_suit != chest)
to_chat(user, "\The [wearer.wear_suit] is preventing \the [src] from deploying!")
return 0
@@ -797,6 +814,7 @@
/obj/item/weapon/rig/dropped(var/mob/user)
..()
+ user.verbs -= /obj/item/weapon/rig/proc/emergency_release
for(var/piece in list("helmet","gauntlets","chest","boots"))
toggle_piece(piece, user, ONLY_RETRACT, 1)
if(wearer)
@@ -996,6 +1014,38 @@
else
return null
+/obj/item/weapon/rig/proc/emergency_release()
+ set name = "Suit Emergency Release"
+ set desc = "Activate the suits emergency release system."
+ set category = "Object"
+ set src in oview(1)
+ var/obj/item/weapon/rig/T = get_rig()
+ return T.do_emergency_release(usr)
+
+/obj/item/weapon/rig/proc/do_emergency_release(var/mob/living/user)
+ if(!can_touch(user, wearer) || !has_emergency_release)
+ return can_touch(user,wearer)
+ usr.visible_message("[user] starts activating \the [src] emergency seals release!")
+ if(!do_after(user,240, target = wearer))
+ to_chat(user, "You need to focus on activating the emergency release.")
+ return 0
+ usr.visible_message("[user] activated \the [src] emergency seals release!")
+ malfunctioning += 1
+ malfunction_delay = 30
+ unseal(user)
+ return 1
+
+/obj/item/weapon/rig/proc/can_touch(var/mob/user, var/mob/wearer)
+ if(!user)
+ return 0
+ if(!wearer.Adjacent(user))
+ return 0
+ if(user.restrained())
+ to_chat(user, "You need your hands free for this.")
+ return 0
+ if(user.stat || user.paralysis || user.sleeping || user.lying || user.weakened)
+ return 0
+ return 1
#undef ONLY_DEPLOY
#undef ONLY_RETRACT
#undef SEAL_DELAY
diff --git a/code/modules/clothing/spacesuits/rig/rig_armormod.dm b/code/modules/clothing/spacesuits/rig/rig_armormod.dm
new file mode 100644
index 00000000000..ec045c7da2d
--- /dev/null
+++ b/code/modules/clothing/spacesuits/rig/rig_armormod.dm
@@ -0,0 +1,21 @@
+/obj/item/clothing/suit/space/new_rig/calc_breach_damage()
+ ..()
+ holder.update_armor() //New dammage, new armormultiplikator.
+ return damage
+
+/obj/item/weapon/rig/proc/update_armor()
+ var/multi = 1 //Multiplicative modification to the armor, maybe add an additive later on
+ if(chest)
+ multi *= (100 - chest.damage) / 100 //If we have some breaches, lower the armor value.
+
+ //TODO check for other armor mods, likely modules, which need to be coded.
+
+ for(var/obj/item/piece in list(gloves, helmet, boots, chest))
+ if(!istype(piece)) //Do we have the piece
+ continue
+ if(islist(armor)) //Did we even give them some armor, if this is the case, the list should be initialized from New()
+ var/list/L = armor
+ for(var/armortype in L)
+ piece.armor[armortype] = L[armortype]*multi
+
+//Perfect place to also add something like shield modules, or any other hit_reaction modules check.
diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
index b89c59cf837..a57c2258b04 100644
--- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
@@ -141,7 +141,7 @@
if(user.r_hand && user.l_hand)
cell.forceMove(get_turf(user))
else
- cell.forceMove(user.put_in_hands(cell))
+ user.put_in_hands(cell)
cell = null
else
to_chat(user, "There is nothing loaded in that mount.")
diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces.dm b/code/modules/clothing/spacesuits/rig/rig_pieces.dm
index dab4ad5ac35..0480490c0ca 100644
--- a/code/modules/clothing/spacesuits/rig/rig_pieces.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_pieces.dm
@@ -4,7 +4,7 @@
/obj/item/clothing/head/helmet/space/new_rig
name = "helmet"
- flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | THICKMATERIAL
+ flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | THICKMATERIAL | NODROP
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEMASK
body_parts_covered = HEAD
heat_protection = HEAD
@@ -12,11 +12,12 @@
var/brightness_on = 4
var/on = 0
sprite_sheets = list(
- "Tajara" = 'icons/mob/species/tajaran/helmet.dmi',
+ "Tajaran" = 'icons/mob/species/tajaran/helmet.dmi',
"Skrell" = 'icons/mob/species/skrell/helmet.dmi',
"Unathi" = 'icons/mob/species/unathi/helmet.dmi'
)
species_restricted = null
+ actions_types = list(/datum/action/item_action/toggle_helmet_light)
flash_protect = 2
@@ -28,13 +29,17 @@
toggle_light(user)
/obj/item/clothing/head/helmet/space/new_rig/proc/toggle_light(mob/user)
- on = !on
- icon_state = "rig[on]-[item_color]"
+ if(flags & AIRTIGHT) //Could also check for STOPSPRESSUREDMAGE, but one is enough, both get toggled when the seal gets toggled.
- if(on)
- set_light(brightness_on)
+ on = !on
+ icon_state = "[item_color][on]"
+
+ if(on)
+ set_light(brightness_on)
+ else
+ set_light(0)
else
- set_light(0)
+ to_chat(user, "You cannot turn the light on while the suit isn't sealed.")
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
@@ -42,7 +47,7 @@
/obj/item/clothing/gloves/rig
name = "gauntlets"
- flags = THICKMATERIAL
+ flags = THICKMATERIAL | NODROP
body_parts_covered = HANDS
heat_protection = HANDS
cold_protection = HANDS
@@ -51,12 +56,19 @@
/obj/item/clothing/shoes/magboots/rig
name = "boots"
+ flags = NODROP
body_parts_covered = FEET
cold_protection = FEET
heat_protection = FEET
species_restricted = null
gender = PLURAL
+/obj/item/clothing/shoes/magboots/rig/attack_self(mob/user)
+ if(flags & AIRTIGHT) //Could also check for STOPSPRESSUREDMAGE, but one is enough, both get toggled when the seal gets toggled.
+ ..(user)
+ else
+ to_chat(user, "You cannot activate mag-pulse traction system while the suit is not sealed.")
+
/obj/item/clothing/suit/space/new_rig
name = "chestpiece"
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank)
@@ -64,14 +76,14 @@
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
flags_inv = HIDEJUMPSUIT|HIDETAIL
- flags = STOPSPRESSUREDMAGE | THICKMATERIAL | AIRTIGHT
+ flags = STOPSPRESSUREDMAGE | THICKMATERIAL | AIRTIGHT | NODROP
slowdown = 0
- //will reach 10 breach damage after 25 laser carbine blasts, 3 revolver hits, or ~1 PTR hit. Completely immune to smg or sts hits.
- breach_threshold = 38
+ breach_threshold = 20
resilience = 0.2
can_breach = 1
+ var/obj/item/weapon/rig/holder
sprite_sheets = list(
- "Tajara" = 'icons/mob/species/tajaran/suit.dmi',
+ "Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
"Unathi" = 'icons/mob/species/unathi/suit.dmi'
)
diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm
index 0bda9f9288a..2a38480dabc 100644
--- a/code/modules/clothing/spacesuits/rig/suits/light.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/light.dm
@@ -112,7 +112,7 @@
name = "stealth suit control module"
suit_type = "stealth"
desc = "A highly advanced and expensive suit designed for covert operations."
- icon_state = "stealth_rig"
+ icon_state = "ninja_rig" //supposed to be "stealth_rig", but as it currently only has a semi-copied ninja rig sprite, we can just use them directly.
req_access = list(access_syndicate)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
index ef7591e3955..54f3bc739ab 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
@@ -8,7 +8,7 @@
use_power = 1
idle_power_usage = 5
active_power_usage = 100
- flags = OPENCONTAINER | NOREACT
+ flags = OPENCONTAINER
var/operating = 0 // Is it on?
var/dirty = 0 // = {0..100} Does it need cleaning?
var/broken = 0 // ={0,1,2} How broken is it???
@@ -33,6 +33,7 @@
/obj/machinery/kitchen_machine/New()
create_reagents(100)
+ reagents.set_reacting(FALSE)
if(!available_recipes)
available_recipes = new
acceptable_items = new
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index 2b684d37902..b5f77b63cfe 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -10,7 +10,6 @@
use_power = 1
idle_power_usage = 5
active_power_usage = 100
- flags = NOREACT
var/max_n_of_items = 1500
var/icon_on = "smartfridge"
var/icon_off = "smartfridge-off"
@@ -25,6 +24,8 @@
/obj/machinery/smartfridge/New()
..()
+ create_reagents()
+ reagents.set_reacting(FALSE)
component_parts = list()
var/obj/item/weapon/circuitboard/smartfridge/board = new(null)
board.set_type(type)
diff --git a/code/modules/garbage_collection/garbage_collector.dm b/code/modules/garbage_collection/garbage_collector.dm
index 3d6007d313e..e2204788016 100644
--- a/code/modules/garbage_collection/garbage_collector.dm
+++ b/code/modules/garbage_collection/garbage_collector.dm
@@ -149,8 +149,6 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
del(D)
if(garbageCollector)
garbageCollector.dels_count++
- if(QDEL_HINT_PUTINPOOL) //qdel will put this object in the pool.
- PlaceInPool(D,0)
if(QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion.
#ifdef TESTING
D.find_references(remove_from_queue = FALSE)
diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm
index 525de63a0af..24854085c1a 100644
--- a/code/modules/lighting/lighting_overlay.dm
+++ b/code/modules/lighting/lighting_overlay.dm
@@ -3,7 +3,6 @@
mouse_opacity = 0
simulated = 0
anchored = 1
- flags = NOREACT
icon = LIGHTING_ICON
layer = LIGHTING_LAYER
invisibility = INVISIBILITY_LIGHTING
diff --git a/code/modules/pooling/pool.dm b/code/modules/pooling/pool.dm
deleted file mode 100644
index 2a81a8494b8..00000000000
--- a/code/modules/pooling/pool.dm
+++ /dev/null
@@ -1,133 +0,0 @@
-
-/*
-/tg/station13 /datum Pool:
----------------------------------
-By RemieRichards
-
-Creation/Deletion is laggy, so let's reduce reuse and recycle!
-
-Usage:
-
-To get a object, just call
- - PoolOrNew(type, arg) if you only want to pass one argument to New(), usually loc
- - PoolOrNew(type, list) if you want to pass multiple arguments to New()
-
-To put a object back in the pool, call PlaceInPool(object)
-This will call destroy on the object, set its loc to null,
-and reset all of its vars to their default
-
-You can override your object's destroy to return QDEL_HINT_PUTINPOOL
-to ensure its always placed in this pool (this will only be acted on if qdel calls destroy, and destroy will not get called twice)
-
-*/
-
-var/global/list/GlobalPool = list()
-
-//You'll be using this proc 90% of the time.
-//It grabs a type from the pool if it can
-//And if it can't, it creates one
-//The pool is flexible and will expand to fit
-//The new created atom when it eventually
-//Goes into the pool
-
-//Second argument can be a single arg
-//Or a list of arguments
-//Either way it gets passed to new
-
-/proc/PoolOrNew(var/get_type,var/second_arg)
- if(!get_type)
- return
-
- . = GetFromPool(get_type,second_arg)
-
- if(!.)
- if(ispath(get_type))
- if(islist(second_arg))
- . = new get_type (arglist(second_arg))
- else
- . = new get_type (second_arg)
-
-
-/proc/GetFromPool(var/get_type,var/second_arg)
- if(!get_type)
- return
-
- if(isnull(GlobalPool[get_type]))
- return
-
- if(length(GlobalPool[get_type]) == 0)
- return
-
- var/datum/pooled = pop(GlobalPool[get_type])
- if(pooled)
- pooled.gcDestroyed = null
-
- var/atom/movable/AM
- if(istype(pooled, /atom/movable))
- AM = pooled
-
- if(islist(second_arg))
- if(AM)
- AM.loc = second_arg[1] //we need to do loc setting explicetly before even calling New() to replicate new()'s behavior
- pooled.New(arglist(second_arg))
-
- else
- if(AM)
- AM.loc = second_arg
- pooled.New(second_arg)
-
- return pooled
-
-
-/proc/PlaceInPool(var/datum/diver, destroy = 1)
- if(!istype(diver))
- return
-
- if(diver in GlobalPool[diver.type])
- return
-
- if(!GlobalPool[diver.type])
- GlobalPool[diver.type] = list()
-
- GlobalPool[diver.type] |= diver
-
- if (destroy)
- diver.Destroy()
-
- diver.gcDestroyed = 1
-
- diver.ResetVars()
-
-var/list/exclude = list("animate_movement", "contents", "loc", "locs", "parent_type", "vars", "verbs", "type", "gc_destroyed")
-var/list/pooledvariables = list()
-//thanks to clusterfack @ /vg/station for these two procs
-/datum/proc/createVariables()
- pooledvariables[type] = new/list()
- var/list/exclude = global.exclude + args
-
- for(var/key in vars)
- if(key in exclude)
- continue
- if(islist(vars[key]))
- pooledvariables[type][key] = list()
- else
- pooledvariables[type][key] = initial(vars[key])
-
-/datum/proc/ResetVars()
- if(!pooledvariables[type])
- createVariables(args)
-
- for(var/key in pooledvariables[type])
- if (islist(pooledvariables[type][key]))
- vars[key] = list()
- else
- vars[key] = pooledvariables[type][key]
-
-/atom/movable/ResetVars()
- ..()
- loc = null
- contents = initial(contents) //something is really wrong if this object still has stuff in it by this point
-
-/image/ResetVars()
- ..()
- loc = null
\ No newline at end of file
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index e2e97437b68..7acb4e7356c 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -80,12 +80,12 @@
to_chat(user, "You inject the solution into the power cell.")
- if(S.reagents.has_reagent("plasma", 5))
+ if(S.reagents.has_reagent("plasma", 5) || S.reagents.has_reagent("plasma_dust", 5))
rigged = 1
- log_admin("LOG: [user.name] ([user.ckey]) injected a power cell with plasma, rigging it to explode.")
- message_admins("LOG: [user.name] ([user.ckey]) injected a power cell with plasma, rigging it to explode.")
+ log_admin("LOG: [key_name(user)] injected a power cell with plasma, rigging it to explode.")
+ message_admins("LOG: [key_name_admin(user)] injected a power cell with plasma, rigging it to explode.")
S.reagents.clear_reagents()
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 7c702313ae4..2b2b3e20183 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -674,10 +674,10 @@
to_chat(user, "You inject the solution into the [src].")
- if(S.reagents.has_reagent("plasma", 5))
+ if(S.reagents.has_reagent("plasma", 5) || S.reagents.has_reagent("plasma_dust", 5))
- log_admin("LOG: [user.name] ([user.ckey]) injected a light with plasma, rigging it to explode.")
- message_admins("LOG: [user.name] ([user.ckey]) injected a light with plasma, rigging it to explode.")
+ log_admin("LOG: [key_name(user)] injected a light with plasma, rigging it to explode.")
+ message_admins("LOG: [key_name_admin(user)] injected a light with plasma, rigging it to explode.")
rigged = 1
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index eb4e42ff821..bba3db2d6d6 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -246,9 +246,9 @@
/obj/item/ammo_casing/shotgun/dart/New()
..()
- flags |= NOREACT
flags |= OPENCONTAINER
create_reagents(30)
+ reagents.set_reacting(FALSE)
/obj/item/ammo_casing/shotgun/dart/attackby()
return
diff --git a/code/modules/projectiles/guns/dartgun.dm b/code/modules/projectiles/guns/dartgun.dm
index 6ff1b8982f6..4ec3b827945 100644
--- a/code/modules/projectiles/guns/dartgun.dm
+++ b/code/modules/projectiles/guns/dartgun.dm
@@ -154,7 +154,7 @@
qdel(S)
D.icon_state = "syringeproj"
D.name = "syringe"
- D.flags |= NOREACT
+ D.reagents.set_reacting(FALSE)
playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
for(var/i=0, i<6, i++)
diff --git a/code/modules/projectiles/guns/projectile/saw.dm b/code/modules/projectiles/guns/projectile/saw.dm
index d36ad1dd2c6..72e4bacebab 100644
--- a/code/modules/projectiles/guns/projectile/saw.dm
+++ b/code/modules/projectiles/guns/projectile/saw.dm
@@ -87,7 +87,7 @@ obj/item/projectile/bullet/saw/incen/Move()
..()
var/turf/location = get_turf(src)
if(location)
- PoolOrNew(/obj/effect/hotspot, location)
+ new /obj/effect/hotspot(location)
location.hotspot_expose(700, 50, 1)
/obj/item/projectile/bullet/saw/incen/on_hit(atom/target, blocked = 0)
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 31a09ecde37..9a9d5df1845 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -243,8 +243,8 @@
/obj/item/projectile/bullet/dart/New()
..()
- flags |= NOREACT
create_reagents(50)
+ reagents.set_reacting(FALSE)
/obj/item/projectile/bullet/dart/on_hit(var/atom/target, var/blocked = 0, var/hit_zone)
if(iscarbon(target))
@@ -260,7 +260,7 @@
target.visible_message("The [name] was deflected!", \
"You were protected against the [name]!")
..(target, blocked, hit_zone)
- flags &= ~NOREACT
+ reagents.set_reacting(TRUE)
reagents.handle_reactions()
return 1
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 9c0c14014e4..c9a05f263a2 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -13,10 +13,12 @@ var/const/INGEST = 2
var/atom/my_atom = null
var/chem_temp = 300
var/list/datum/reagent/addiction_list = new/list()
+ var/flags
-/datum/reagents/New(maximum=100)
+/datum/reagents/New(maximum = 100)
maximum_volume = maximum
-
+ if(!(flags & REAGENT_NOREACT))
+ processing_objects |= src
//I dislike having these here but map-objects are initialised before world/New() is called. >_>
if(!chemical_reagents_list)
//Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id
@@ -288,11 +290,24 @@ var/const/INGEST = 2
od_chems.Add(R.id)
return od_chems
+/datum/reagents/proc/process()
+ if(flags & REAGENT_NOREACT)
+ processing_objects -= src
+ return
-/datum/reagents/proc/reagent_on_tick()
for(var/datum/reagent/R in reagent_list)
R.on_tick()
- return
+
+/datum/reagents/proc/set_reacting(react = TRUE)
+ if(react)
+ // Order is important, process() can remove from processing if
+ // the flag is present
+ flags &= ~(REAGENT_NOREACT)
+ processing_objects |= src
+ else
+ processing_objects -= src
+ flags |= REAGENT_NOREACT
+
/*
if(!target) return
var/total_transfered = 0
@@ -337,7 +352,7 @@ var/const/INGEST = 2
update_total()
/datum/reagents/proc/handle_reactions()
- if(my_atom.flags & NOREACT)
+ if(flags & REAGENT_NOREACT)
return //Yup, no reactions here. No siree.
var/reaction_occured = 0
@@ -721,7 +736,7 @@ atom/proc/create_reagents(max_vol)
/datum/reagents/Destroy()
. = ..()
- processing_objects.Remove(src)
+ processing_objects -= src
for(var/datum/reagent/R in reagent_list)
qdel(R)
reagent_list.Cut()
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index f46d4010e69..727574fed16 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -30,7 +30,6 @@
if(!possible_transfer_amounts)
verbs -= /obj/item/weapon/reagent_containers/verb/set_APTFT
create_reagents(volume)
- processing_objects.Add(src)
if(spawned_disease)
var/datum/disease/F = new spawned_disease(0)
var/list/data = list("viruses" = list(F), "blood_colour" = "#A10808")
@@ -38,11 +37,6 @@
if(list_reagents)
reagents.add_reagent_list(list_reagents)
-/obj/item/weapon/reagent_containers/process()
- if(reagents)
- reagents.reagent_on_tick()
- return
-
/obj/item/weapon/reagent_containers/ex_act()
if(reagents)
for(var/datum/reagent/R in reagents.reagent_list)
diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm
index 9a41cef6432..0972f49a2c1 100644
--- a/code/modules/reagents/reagent_containers/glass_containers.dm
+++ b/code/modules/reagents/reagent_containers/glass_containers.dm
@@ -290,7 +290,11 @@
materials = list(MAT_GLASS=500)
volume = 50
amount_per_transfer_from_this = 10
- flags = OPENCONTAINER | NOREACT
+ flags = OPENCONTAINER
+
+/obj/item/weapon/reagent_containers/glass/beaker/noreact/New()
+ ..()
+ reagents.set_reacting(FALSE)
/obj/item/weapon/reagent_containers/glass/beaker/bluespace
name = "bluespace beaker"
diff --git a/code/modules/surgery/rig_removal.dm b/code/modules/surgery/rig_removal.dm
new file mode 100644
index 00000000000..4e0403e43a4
--- /dev/null
+++ b/code/modules/surgery/rig_removal.dm
@@ -0,0 +1,58 @@
+//Procedures in this file: Unsealing a Rig.
+
+/datum/surgery/rigsuit
+ name = "Rig Unsealing"
+ steps = list(/datum/surgery_step/rigsuit)
+ possible_locs = list("chest")
+
+/datum/surgery/rigsuit/can_start(mob/user, mob/living/carbon/target)
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ var/obj/item/backitem = H.get_item_by_slot(slot_back)
+ if(istype(backitem,/obj/item/weapon/rig)) //Check if we have a rig to operate on
+ if(backitem.flags&NODROP) //Check if the rig is sealed, if not, we don't need to operate
+ return 1
+ return 0
+
+//Bay12 removal
+/datum/surgery_step/rigsuit
+ name="Cut Seals"
+ allowed_tools = list(
+ /obj/item/weapon/weldingtool = 80,
+ /obj/item/weapon/circular_saw = 60,
+ /obj/item/weapon/gun/energy/plasmacutter = 100
+ )
+
+ can_infect = 0
+ blood_level = 0
+
+ time = 50
+
+/datum/surgery_step/hardsuit/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(!istype(target))
+ return 0
+ if(istype(tool,/obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/welder = tool
+ if(!welder.isOn() || !welder.remove_fuel(1,user))
+ return 0
+ return (target_zone == "chest") && istype(target.back, /obj/item/weapon/rig) && (target.back.flags&NODROP)
+
+/datum/surgery_step/rigsuit/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts cutting through the support systems of [target]'s [target.back] with \the [tool]." , \
+ "You start cutting through the support systems of [target]'s [target.back] with \the [tool].")
+ ..()
+
+/datum/surgery_step/rigsuit/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+
+ var/obj/item/weapon/rig/rig = target.back
+ if(!istype(rig))
+ return
+ rig.reset()
+ user.visible_message("[user] has cut through the support systems of [target]'s [rig] with \the [tool].", \
+ "You have cut through the support systems of [target]'s [rig] with \the [tool].")
+ return 1
+
+/datum/surgery_step/rigsuit/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user]'s [tool] can't quite seem to get through the metal...", \
+ "Your [tool] can't quite seem to get through the metal. It's weakening, though - try again.")
+ return 0
diff --git a/html/changelog.html b/html/changelog.html
index 1a27683c793..4b058f53784 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,7 +55,25 @@
-->
+
26 January 2017
+
FalseIncarnate updated:
+
+ - Plasma dust can now be used to rig lights and power cells, like the plasma reagent, with explosive results.
+
+
Fethas updated:
+
+ - Adds two new holy weapon skins for people who belive in ghosts and worshipers of the silentfather.
+
+
FreeStylaLT updated:
+
+ - AI sat transport tubes are no longer misaligned
+
+
25 January 2017
+
FlattestGuitar updated:
+
+ - Fixes shadowlings thrall scaling
+
scrubmcnoob updated:
- Shadowling Thrall count now scales to a max of 25.
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 9dd7818e744..47b6e1748b2 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -3409,6 +3409,17 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: .45 and 9mm rubber bullets.
- imageadd: New shotgun ammo boxes.
2017-01-25:
+ FlattestGuitar:
+ - tweak: Fixes shadowlings thrall scaling
scrubmcnoob:
- tweak: Shadowling Thrall count now scales to a max of 25.
- tweak: Shadowling Thralls lose lesser glare
+2017-01-26:
+ FalseIncarnate:
+ - tweak: Plasma dust can now be used to rig lights and power cells, like the plasma
+ reagent, with explosive results.
+ Fethas:
+ - rscadd: Adds two new holy weapon skins for people who belive in ghosts and worshipers
+ of the silentfather.
+ FreeStylaLT:
+ - tweak: AI sat transport tubes are no longer misaligned
diff --git a/icons/mob/custom-synthetic.dmi b/icons/mob/custom-synthetic.dmi
index 3b75d6f2201..709a6e2f0da 100644
Binary files a/icons/mob/custom-synthetic.dmi and b/icons/mob/custom-synthetic.dmi differ
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index 09ba4ebe9d1..597f35d2e89 100644
Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 8e851a7c26c..fb10621a79c 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/species/skrell/helmet.dmi b/icons/mob/species/skrell/helmet.dmi
index d8a5beaf448..8e2965371c0 100644
Binary files a/icons/mob/species/skrell/helmet.dmi and b/icons/mob/species/skrell/helmet.dmi differ
diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi
index 37d312d3133..49f209387bf 100644
Binary files a/icons/mob/species/tajaran/helmet.dmi and b/icons/mob/species/tajaran/helmet.dmi differ
diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi
index 46b11152ba7..c84122e9571 100644
Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ
diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi
index 062c1b86db3..f30cb9facef 100644
Binary files a/icons/mob/species/unathi/suit.dmi and b/icons/mob/species/unathi/suit.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 16ed4ce4b04..e1c56b46b69 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index 04dfe342cb6..22aca1fd733 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/paradise.dme b/paradise.dme
index cd71e26931c..60c83e47b74 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1167,6 +1167,7 @@
#include "code\modules\clothing\spacesuits\syndi.dm"
#include "code\modules\clothing\spacesuits\void.dm"
#include "code\modules\clothing\spacesuits\rig\rig.dm"
+#include "code\modules\clothing\spacesuits\rig\rig_armormod.dm"
#include "code\modules\clothing\spacesuits\rig\rig_attackby.dm"
#include "code\modules\clothing\spacesuits\rig\rig_pieces.dm"
#include "code\modules\clothing\spacesuits\rig\rig_verbs.dm"
@@ -1770,7 +1771,6 @@
#include "code\modules\pda\radio.dm"
#include "code\modules\pda\utilities.dm"
#include "code\modules\persistence\persistence.dm"
-#include "code\modules\pooling\pool.dm"
#include "code\modules\power\apc.dm"
#include "code\modules\power\cable.dm"
#include "code\modules\power\cable_heavyduty.dm"
@@ -2049,6 +2049,7 @@
#include "code\modules\surgery\limb_reattach.dm"
#include "code\modules\surgery\organs_internal.dm"
#include "code\modules\surgery\other.dm"
+#include "code\modules\surgery\rig_removal.dm"
#include "code\modules\surgery\robotics.dm"
#include "code\modules\surgery\slime.dm"
#include "code\modules\surgery\surgery.dm"