diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index b00c11274b..229d5755a1 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -1142,6 +1142,10 @@
/obj/effect/turf_decal/bot{
dir = 2
},
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
/turf/open/floor/plasteel{
dir = 2
},
@@ -1338,6 +1342,13 @@
/obj/effect/turf_decal/bot{
dir = 2
},
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/floor/plasteel{
dir = 2
},
@@ -1356,6 +1367,13 @@
/obj/effect/turf_decal/bot{
dir = 2
},
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/floor/plasteel{
dir = 2
},
@@ -53772,6 +53790,10 @@
/obj/effect/turf_decal/bot{
dir = 2
},
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
/turf/open/floor/plasteel{
dir = 2
},
@@ -112232,11 +112254,11 @@ btp
cbv
ccq
bns
-cjD
-cjD
-cjD
-cjD
-cnj
+aof
+aof
+aof
+aof
+amw
aaa
aaa
aaa
@@ -112489,13 +112511,13 @@ ckS
bky
ccq
cds
-cjD
+aof
ckt
cly
cmw
-cnj
-cnj
-cnj
+amw
+amw
+amw
aaa
aaa
aaf
@@ -113003,13 +113025,13 @@ cbg
bTr
cct
cdu
-cjG
+aqx
cku
clz
cmx
-cnj
-cnj
-cnj
+amw
+amw
+amw
aaa
aaa
aaf
@@ -113260,11 +113282,11 @@ bky
bky
bky
bky
-cjD
-cjD
-cjD
-cjD
-cnj
+aof
+aof
+aof
+aof
+amw
aaa
aaa
aaa
diff --git a/_maps/shuttles/emergency_raven.dmm b/_maps/shuttles/emergency_raven.dmm
index 7bf4708da7..eeb1a3756b 100644
--- a/_maps/shuttles/emergency_raven.dmm
+++ b/_maps/shuttles/emergency_raven.dmm
@@ -123,6 +123,7 @@
},
/area/shuttle/escape)
"aw" = (
+/obj/machinery/light,
/turf/open/floor/plasteel/darkblue/side,
/area/shuttle/escape)
"ax" = (
@@ -168,6 +169,10 @@
"aE" = (
/obj/structure/table/reinforced,
/obj/item/weapon/defibrillator/loaded,
+/obj/machinery/light{
+ dir = 4;
+ icon_state = "tube1"
+ },
/turf/open/floor/plasteel/darkpurple/side{
dir = 4
},
@@ -216,6 +221,9 @@
id = "shuttleflash";
pixel_y = -23
},
+/obj/machinery/light{
+ dir = 1
+ },
/turf/open/floor/plasteel/darkblue/side{
tag = "icon-darkblue (NORTH)";
dir = 1
@@ -232,6 +240,9 @@
},
/area/shuttle/escape)
"aM" = (
+/obj/machinery/light{
+ dir = 1
+ },
/turf/open/floor/plasteel/darkblue/side{
tag = "icon-darkblue (NORTH)";
dir = 1
@@ -412,6 +423,9 @@
pixel_y = 9
},
/obj/structure/closet/crate/internals,
+/obj/machinery/light{
+ dir = 1
+ },
/turf/open/floor/plasteel/darkyellow/side{
tag = "icon-darkyellow (NORTHEAST)";
icon_state = "darkyellow";
@@ -516,6 +530,9 @@
pixel_y = 8
},
/obj/structure/table/reinforced,
+/obj/machinery/light{
+ dir = 8
+ },
/turf/open/floor/plasteel/darkpurple/side{
dir = 8
},
@@ -918,6 +935,9 @@
/area/shuttle/escape)
"ch" = (
/obj/structure/reagent_dispensers/fueltank,
+/obj/machinery/light{
+ dir = 8
+ },
/turf/open/floor/plasteel/darkgreen/side{
dir = 9;
icon_state = "darkgreen";
@@ -926,6 +946,10 @@
/area/shuttle/escape)
"ci" = (
/obj/structure/reagent_dispensers/watertank,
+/obj/machinery/light{
+ dir = 4;
+ icon_state = "tube1"
+ },
/turf/open/floor/plasteel/darkgreen/side{
dir = 5
},
@@ -1040,9 +1064,9 @@
name = "Bridge Blast Shutters";
pixel_x = 0;
pixel_y = -26;
- req_access_txt = "150";
- pixel_x = 0
+ req_access_txt = "19"
},
+/obj/machinery/light,
/turf/open/floor/plasteel/darkblue/side,
/area/shuttle/escape)
"cA" = (
@@ -1482,10 +1506,146 @@
pixel_x = 24;
pixel_y = 0
},
+/obj/machinery/light{
+ dir = 4;
+ icon_state = "tube1"
+ },
/turf/open/floor/plasteel/darkgreen/side{
dir = 4
},
/area/shuttle/escape)
+"eC" = (
+/obj/machinery/light{
+ dir = 4;
+ icon_state = "tube1"
+ },
+/turf/open/floor/plasteel/darkpurple/side{
+ dir = 4
+ },
+/area/shuttle/escape)
+"eD" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/brig{
+ dir = 8;
+ floor_tile = /obj/item/stack/tile/plasteel;
+ icon_state = "darkred"
+ },
+/area/shuttle/escape)
+"eE" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/darkgreen/side{
+ tag = "icon-darkgreen (NORTH)";
+ icon_state = "darkgreen";
+ dir = 1
+ },
+/area/shuttle/escape)
+"eF" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/plasteel/darkgreen/side{
+ dir = 8
+ },
+/area/shuttle/escape)
+"eG" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/darkgreen/side{
+ tag = "icon-darkgreen (NORTH)";
+ icon_state = "darkgreen";
+ dir = 1
+ },
+/area/shuttle/escape)
+"eH" = (
+/obj/machinery/light,
+/turf/open/floor/plasteel/darkgreen/side,
+/area/shuttle/escape)
+"eI" = (
+/obj/machinery/light,
+/turf/open/floor/plasteel/darkgreen/side,
+/area/shuttle/escape)
+"eJ" = (
+/obj/machinery/button/flasher{
+ id = "cockpit_flasher";
+ pixel_x = 6;
+ pixel_y = -24
+ },
+/obj/machinery/light,
+/turf/open/floor/mineral/titanium/blue,
+/area/space)
+"eK" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/darkgreen/side{
+ tag = "icon-darkgreen (NORTH)";
+ icon_state = "darkgreen";
+ dir = 1
+ },
+/area/shuttle/escape)
+"eL" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/darkgreen/side{
+ tag = "icon-darkgreen (NORTH)";
+ icon_state = "darkgreen";
+ dir = 1
+ },
+/area/shuttle/escape)
+"eM" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/darkgreen/side{
+ tag = "icon-darkgreen (NORTH)";
+ icon_state = "darkgreen";
+ dir = 1
+ },
+/area/shuttle/escape)
+"eN" = (
+/obj/machinery/light{
+ dir = 4;
+ icon_state = "tube1"
+ },
+/turf/open/floor/plasteel/darkgreen/side{
+ dir = 4
+ },
+/area/shuttle/escape)
+"eO" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/plasteel/darkgreen/side{
+ dir = 8
+ },
+/area/shuttle/escape)
+"eP" = (
+/obj/machinery/light,
+/turf/open/floor/plasteel/darkgreen/side,
+/area/shuttle/escape)
+"eQ" = (
+/obj/machinery/light{
+ dir = 4;
+ icon_state = "tube1"
+ },
+/turf/open/floor/plasteel/darkgreen/side{
+ dir = 4
+ },
+/area/shuttle/escape)
+"eR" = (
+/obj/machinery/light,
+/turf/open/floor/plasteel/darkgreen/side,
+/area/shuttle/escape)
+"eS" = (
+/obj/machinery/light,
+/turf/open/floor/plasteel/darkgreen/side,
+/area/shuttle/escape)
(1,1,1) = {"
aa
@@ -1531,7 +1691,7 @@ cs
ar
aW
bc
-bc
+eD
bc
bc
bc
@@ -1545,7 +1705,7 @@ cu
bF
be
be
-be
+eO
be
be
cd
@@ -1604,19 +1764,19 @@ cu
cu
cs
ar
-br
+eG
aC
-bz
+eH
ar
bT
bo
-br
+eK
bZ
ca
aC
bZ
ca
-bz
+eR
ab
ch
ar
@@ -1636,7 +1796,7 @@ be
be
be
be
-be
+eF
be
bG
aC
@@ -1712,13 +1872,13 @@ bP
ar
bU
bo
-br
+eL
bZ
ca
aC
bZ
ca
-bz
+eS
ab
ci
ar
@@ -1742,7 +1902,7 @@ bz
cs
bH
bG
-bz
+eI
cs
cs
cs
@@ -1771,7 +1931,7 @@ bb
bf
bk
cs
-br
+eE
bz
cs
bI
@@ -1884,9 +2044,9 @@ aa
cs
cs
cs
-br
+eM
aC
-bz
+eP
cs
cs
cs
@@ -1946,7 +2106,7 @@ bB
cu
ad
ad
-ad
+eJ
ad
cu
br
@@ -2004,7 +2164,7 @@ ar
aE
aI
aO
-aV
+eC
aV
bi
bm
@@ -2020,9 +2180,9 @@ cs
bW
aZ
aZ
+eN
aZ
-aZ
-aZ
+eQ
aZ
aZ
ce
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index a9f76f7f9d..a8e2681dc9 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -92,7 +92,7 @@
if(next_move > world.time) // in the year 2000...
return
- if(A.IsObscured())
+ if(!modifiers["catcher"] && A.IsObscured())
return
if(istype(loc,/obj/mecha))
@@ -325,8 +325,6 @@
/mob/living/carbon/human/CtrlClick(mob/user)
if(ishuman(user) && Adjacent(user))
- if(world.time < user.next_move)
- return FALSE
var/mob/living/carbon/human/H = user
H.dna.species.grab(H, src, H.mind.martial_art)
H.changeNext_move(CLICK_CD_MELEE)
@@ -448,6 +446,7 @@
C.swap_hand()
else
var/turf/T = params2turf(modifiers["screen-loc"], get_turf(usr))
+ params += "&catcher=1"
if(T)
T.Click(location, control, params)
. = 1
@@ -466,4 +465,4 @@
view = -1
else
view = 1
- add_view_range(view)
+ add_view_range(view)
\ No newline at end of file
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index dfabe23025..7e6f488a47 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -271,8 +271,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
/obj/screen/alert/bloodsense/Initialize()
. = ..()
- if(!narnar)
- narnar = new('icons/mob/screen_alert.dmi', "mini_nar")
+ narnar = new('icons/mob/screen_alert.dmi', "mini_nar")
START_PROCESSING(SSprocessing, src)
/obj/screen/alert/bloodsense/Destroy()
diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm
index 8f18f8b1fe..a3157e6514 100644
--- a/code/datums/holocall.dm
+++ b/code/datums/holocall.dm
@@ -46,7 +46,7 @@
user.reset_perspective()
if(user.client)
for(var/datum/camerachunk/chunk in eye.visibleCameraChunks)
- user.client.images -= chunk.obscured
+ chunk.remove(eye)
user.remote_control = null
QDEL_NULL(eye)
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index ed1a64eede..4be11267ef 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -375,8 +375,8 @@
desc = "Used by veteran cultists to instantly transport items to their needful bretheren."
w_class = WEIGHT_CLASS_SMALL
brightness_on = 1
- icon_state = "torch-on"
- item_state = "torch-on"
+ icon_state = "torch"
+ item_state = "torch"
color = "#ff0000"
on_damage = 15
slot_flags = null
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
index 4bbdd0ca18..1e725bccba 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
@@ -75,7 +75,7 @@
if(C.client)
C.client.images -= remote_eye.user_image
for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks)
- C.client.images -= chunk.obscured
+ chunk.remove(remote_eye)
C.remote_control = null
C.unset_machine()
Remove(C)
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index c72152668d..4c25d221ff 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -3,6 +3,7 @@
icon = 'icons/obj/wizard.dmi'
icon_state = "soulstone"
item_state = "electronic"
+ layer = HIGH_OBJ_LAYER
desc = "A fragment of the legendary treasure known simply as the 'Soul Stone'. The shard still flickers with a fraction of the full artefact's power."
w_class = WEIGHT_CLASS_TINY
slot_flags = SLOT_BELT
@@ -213,12 +214,12 @@
var/obj/screen/alert/bloodsense/BS
if(newstruct.mind && ((stoner && iscultist(stoner)) || cultoverride) && SSticker && SSticker.mode)
SSticker.mode.add_cultist(newstruct.mind, 0)
- BS = newstruct.alerts.Find("bloodsense")
if(iscultist(stoner) || cultoverride)
to_chat(newstruct, "You are still bound to serve the cult[stoner ? " and [stoner]":""], follow their orders and help them complete their goals at all costs.")
else if(stoner)
to_chat(newstruct, "You are still bound to serve your creator, [stoner], follow their orders and help them complete their goals at all costs.")
- BS = newstruct.throw_alert("bloodsense", /obj/screen/alert/bloodsense)
+ newstruct.clear_alert("bloodsense")
+ BS = newstruct.throw_alert("bloodsense", /obj/screen/alert/bloodsense)
if(BS)
BS.Cviewer = newstruct
newstruct.cancel_camera()
diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm
index 39cdb1478c..e3637d3430 100644
--- a/code/game/machinery/computer/camera_advanced.dm
+++ b/code/game/machinery/computer/camera_advanced.dm
@@ -157,7 +157,7 @@ obj/machinery/computer/camera_advanced/attack_ai(mob/user)
if(remote_eye.visible_icon)
C.client.images -= remote_eye.user_image
for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks)
- C.client.images -= chunk.obscured
+ chunk.remove(remote_eye)
C.remote_control = null
C.unset_machine()
Remove(C)
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index ae9d485447..22c6c57b17 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -553,6 +553,7 @@
use_power = 0
has_cover = 0
scan_range = 9
+ req_access = list(GLOB.access_syndicate)
stun_projectile = /obj/item/projectile/bullet
lethal_projectile = /obj/item/projectile/bullet
lethal_projectile_sound = 'sound/weapons/Gunshot.ogg'
@@ -569,6 +570,8 @@
return 10 //Syndicate turrets shoot everything not in their faction
/obj/machinery/porta_turret/syndicate/pod
+ max_integrity = 40
+ integrity_failure = 20
obj_integrity = 40
stun_projectile = /obj/item/projectile/bullet/weakbullet3
lethal_projectile = /obj/item/projectile/bullet/weakbullet3
diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm
index 045673b019..7ade1b707f 100644
--- a/code/game/objects/effects/forcefields.dm
+++ b/code/game/objects/effects/forcefields.dm
@@ -10,6 +10,7 @@
/obj/effect/forcefield/cult
desc = "An unholy shield that blocks all attacks."
name = "glowing wall"
+ icon = 'icons/effects/cult_effects.dmi'
icon_state = "cultshield"
///////////Mimewalls///////////
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index 14e4f5a01c..9c14a4376a 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -196,13 +196,6 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
user.visible_message("[user] starts cutting hair off \the [src].", "You start cutting the hair off \the [src]...", "You hear the sound of a knife rubbing against flesh.")
if(do_after(user,50, target = src))
to_chat(user, "You cut the hair from this [src.singular_name].")
- //Try locating an exisitng stack on the tile and add to there if possible
- for(var/obj/item/stack/sheet/hairlesshide/HS in user.loc)
- if(HS.amount < 50)
- HS.amount++
- use(1)
- break
- //If it gets to here it means it did not find a suitable stack on the tile.
var/obj/item/stack/sheet/hairlesshide/HS = new(user.loc)
HS.amount = 1
use(1)
@@ -230,3 +223,9 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
HS.amount = 1
wetness = initial(wetness)
src.use(1)
+
+/obj/item/stack/sheet/wetleather/microwave_act(obj/machinery/microwave/MW)
+ ..()
+ var/obj/item/stack/sheet/leather/L = new(loc)
+ L.amount = amount
+ qdel(src)
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index 11d20a2dc1..445af97b4e 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -246,6 +246,12 @@
desc = "A sign labelling an area as a place where xenobiological entities are researched."
icon_state = "xenobio"
+/obj/structure/sign/xeno_warning_mining
+ name = "DANGEROUS ALIEN LIFE"
+ desc = "A sign that warns would-be travellers of hostile alien life in the vicinity."
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "xeno_warning"
+
/obj/structure/sign/enginesafety
name = "\improper ENGINEERING SAFETY"
desc = "A sign detailing the various safety protocols when working on-site to ensure a safe shift."
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index 73e0c2042f..51e97eb5a4 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -27,10 +27,10 @@
var/radio_key = /obj/item/device/encryptionkey/headset_med
var/radio_channel = "Medical"
-/obj/machinery/atmospherics/components/unary/cryo_cell/New()
- ..()
+/obj/machinery/atmospherics/components/unary/cryo_cell/Initialize()
+ . = ..()
initialize_directions = dir
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/cryo_tube(null)
+ var/obj/item/weapon/circuitboard/machine/cryo_tube/B = new
B.apply_default_parts(src)
radio = new(src)
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index b3f74b038f..fccfe21589 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -65,9 +65,8 @@
backpack_contents = list(/obj/item/weapon/storage/box/engineer=1,\
/obj/item/weapon/storage/box/handcuffs=1,\
/obj/item/clothing/mask/gas/sechailer=1,\
- /obj/item/weapon/gun/energy/e_gun=1,\
- /obj/item/weapon/melee/baton/loaded=1,\
- /obj/item/weapon/gun/energy/e_gun/advtaser=1)
+ /obj/item/weapon/gun/energy/e_gun/stun=1,\
+ /obj/item/weapon/melee/baton/loaded=1)
/datum/outfit/ert/security/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index a8ed4d2100..1cadd5cc0d 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -14,14 +14,14 @@
/obj/item/clothing/suit/armor/vest
name = "armor vest"
- desc = "A slim armored vest that protects against most types of damage."
+ desc = "A slim Type I armored vest that provides decent protection against most types of damage."
icon_state = "armoralt"
item_state = "armoralt"
blood_overlay_type = "armor"
dog_fashion = /datum/dog_fashion/back
/obj/item/clothing/suit/armor/vest/alt
- desc = "An armored vest that protects against most types of damage."
+ desc = "A Type I armored vest that provides decent protection against most types of damage."
icon_state = "armor"
item_state = "armor"
@@ -31,7 +31,7 @@
/obj/item/clothing/suit/armor/hos
name = "armored greatcoat"
- desc = "A greatcoat enchanced with a special alloy for some protection and style for those with a commanding presence."
+ desc = "A greatcoat enhanced with a special alloy for some extra protection and style for those with a commanding presence."
icon_state = "hos"
item_state = "greatcoat"
body_parts_covered = CHEST|GROIN|ARMS|LEGS
@@ -77,7 +77,7 @@
/obj/item/clothing/suit/armor/vest/capcarapace
name = "captain's carapace"
- desc = "An armored vest reinforced with ceramic plates and pauldrons to provide additional protection whilst still offering maximum mobility and flexibility. Issued only to the station's finest, although it does chafe your nipples."
+ desc = "An fireproof armored chestpiece reinforced with ceramic plates and plasteel pauldrons to provide additional protection whilst still offering maximum mobility and flexibility. Issued only to the station's finest, although it does chafe your nipples."
icon_state = "capcarapace"
item_state = "armor"
body_parts_covered = CHEST|GROIN
@@ -93,7 +93,7 @@
/obj/item/clothing/suit/armor/riot
name = "riot suit"
- desc = "A suit of armor with heavy padding to protect against melee attacks."
+ desc = "A suit of semi-flexible polycarbonate body armor with heavy padding to protect against melee attacks."
icon_state = "riot"
item_state = "swat_suit"
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
@@ -115,7 +115,7 @@
/obj/item/clothing/suit/armor/bulletproof
name = "bulletproof armor"
- desc = "A bulletproof vest that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent."
+ desc = "A Type III heavy bulletproof vest that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent."
icon_state = "bulletproof"
item_state = "armor"
blood_overlay_type = "armor"
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index dc443cf265..68665e2d81 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -270,7 +270,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
if(5)
dat += "
Upload a New Title
"
if(!scanner)
- findscanner(9)
+ scanner = findscanner(9)
if(!scanner)
dat += "No scanner found within wireless network range.
"
else if(!scanner.cache)
@@ -314,7 +314,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
popup.open()
/obj/machinery/computer/libraryconsole/bookmanagement/proc/findscanner(viewrange)
- for(var/obj/machinery/libraryscanner/S in range(viewrange))
+ for(var/obj/machinery/libraryscanner/S in range(viewrange, get_turf(src)))
return S
return null
diff --git a/code/modules/mining/equipment.dm b/code/modules/mining/equipment.dm
deleted file mode 100644
index a9315b7bea..0000000000
--- a/code/modules/mining/equipment.dm
+++ /dev/null
@@ -1,557 +0,0 @@
-/****************Explorer's Suit**************************/
-
-/obj/item/clothing/suit/hooded/explorer
- name = "explorer suit"
- desc = "An armoured suit for exploring harsh environments."
- icon_state = "explorer"
- item_state = "explorer"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
- min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
- cold_protection = CHEST|GROIN|LEGS|ARMS
- max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
- heat_protection = CHEST|GROIN|LEGS|ARMS
- hoodtype = /obj/item/clothing/head/hooded/explorer
- armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/weapon/gun/energy/kinetic_accelerator, /obj/item/weapon/pickaxe)
- resistance_flags = FIRE_PROOF
-
-/obj/item/clothing/head/hooded/explorer
- name = "explorer hood"
- desc = "An armoured hood for exploring harsh environments."
- icon_state = "explorer"
- body_parts_covered = HEAD
- flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
- min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
- max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
- armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50)
- resistance_flags = FIRE_PROOF
-
-/obj/item/clothing/mask/gas/explorer
- name = "explorer gas mask"
- desc = "A military-grade gas mask that can be connected to an air supply."
- icon_state = "gas_mining"
- visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
- visor_flags_inv = HIDEFACIALHAIR
- visor_flags_cover = MASKCOVERSMOUTH
- actions_types = list(/datum/action/item_action/adjust)
- armor = list(melee = 10, bullet = 5, laser = 5, energy = 5, bomb = 0, bio = 50, rad = 0, fire = 20, acid = 40)
- resistance_flags = FIRE_PROOF
-
-/obj/item/clothing/mask/gas/explorer/attack_self(mob/user)
- adjustmask(user)
-
-/obj/item/clothing/mask/gas/explorer/adjustmask(user)
- ..()
- w_class = mask_adjusted ? WEIGHT_CLASS_NORMAL : WEIGHT_CLASS_SMALL
-
-/obj/item/clothing/mask/gas/explorer/folded/New()
- ..()
- adjustmask()
-
-
-/**********************Mining Equipment Vendor Items**************************/
-
-/**********************Jaunter**********************/
-
-/obj/item/device/wormhole_jaunter
- name = "wormhole jaunter"
- desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to blue space for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least.\nThanks to modifications provided by the Free Golems, this jaunter can be worn on the belt to provide protection from chasms."
- icon = 'icons/obj/mining.dmi'
- icon_state = "Jaunter"
- item_state = "electronic"
- throwforce = 0
- w_class = WEIGHT_CLASS_SMALL
- throw_speed = 3
- throw_range = 5
- origin_tech = "bluespace=2"
- slot_flags = SLOT_BELT
-
-/obj/item/device/wormhole_jaunter/attack_self(mob/user)
- user.visible_message("[user.name] activates the [src.name]!")
- SSblackbox.add_details("jaunter", "User") // user activated
- activate(user)
-
-/obj/item/device/wormhole_jaunter/proc/turf_check(mob/user)
- var/turf/device_turf = get_turf(user)
- if(!device_turf||device_turf.z==2||device_turf.z>=7)
- to_chat(user, "You're having difficulties getting the [src.name] to work.")
- return FALSE
- return TRUE
-
-/obj/item/device/wormhole_jaunter/proc/get_destinations(mob/user)
- var/list/destinations = list()
-
- if(isgolem(user))
- for(var/obj/item/device/radio/beacon/B in GLOB.teleportbeacons)
- var/turf/T = get_turf(B)
- if(istype(T.loc, /area/ruin/powered/golem_ship))
- destinations += B
-
- // In the event golem beacon is destroyed, send to station instead
- if(destinations.len)
- return destinations
-
- for(var/obj/item/device/radio/beacon/B in GLOB.teleportbeacons)
- var/turf/T = get_turf(B)
- if(T.z == ZLEVEL_STATION)
- destinations += B
-
- return destinations
-
-/obj/item/device/wormhole_jaunter/proc/activate(mob/user)
- if(!turf_check(user))
- return
-
- var/list/L = get_destinations(user)
- if(!L.len)
- to_chat(user, "The [src.name] found no beacons in the world to anchor a wormhole to.")
- return
- var/chosen_beacon = pick(L)
- var/obj/effect/portal/wormhole/jaunt_tunnel/J = new /obj/effect/portal/wormhole/jaunt_tunnel(get_turf(src), chosen_beacon, lifespan=100)
- J.target = chosen_beacon
- try_move_adjacent(J)
- playsound(src,'sound/effects/sparks4.ogg',50,1)
- qdel(src)
-
-/obj/item/device/wormhole_jaunter/emp_act(power)
- var/triggered = FALSE
-
- if(usr.get_item_by_slot(slot_belt) == src)
- if(power == 1)
- triggered = TRUE
- else if(power == 2 && prob(50))
- triggered = TRUE
-
- if(triggered)
- usr.visible_message("The [src] overloads and activates!")
- SSblackbox.add_details("jaunter","EMP") // EMP accidental activation
- activate(usr)
-
-/obj/item/device/wormhole_jaunter/proc/chasm_react(mob/user)
- if(user.get_item_by_slot(slot_belt) == src)
- to_chat(user, "Your [src] activates, saving you from the chasm!")
- SSblackbox.add_details("jaunter","Chasm") // chasm automatic activation
- activate(user)
- else
- to_chat(user, "The [src] is not attached to your belt, preventing it from saving you from the chasm. RIP.")
-
-
-/obj/effect/portal/wormhole/jaunt_tunnel
- name = "jaunt tunnel"
- icon = 'icons/effects/effects.dmi'
- icon_state = "bhole3"
- desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon."
- mech_sized = TRUE //save your ripley
-
-/obj/effect/portal/wormhole/jaunt_tunnel/teleport(atom/movable/M)
- if(istype(M, /obj/effect))
- return
-
- if(M.anchored)
- if(!(istype(M, /obj/mecha) && mech_sized))
- return
-
- if(istype(M, /atom/movable))
- if(do_teleport(M, target, 6))
- // KERPLUNK
- playsound(M,'sound/weapons/resonator_blast.ogg',50,1)
- if(iscarbon(M))
- var/mob/living/carbon/L = M
- L.Weaken(3)
- if(ishuman(L))
- shake_camera(L, 20, 1)
- addtimer(CALLBACK(L, /mob/living/carbon.proc/vomit), 20)
-
-/**********************Resonator**********************/
-
-/obj/item/weapon/resonator
- name = "resonator"
- icon = 'icons/obj/mining.dmi'
- icon_state = "resonator"
- item_state = "resonator"
- desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It's more effective in a vacuum."
- w_class = WEIGHT_CLASS_NORMAL
- force = 15
- throwforce = 10
- var/burst_time = 30
- var/fieldlimit = 4
- var/list/fields = list()
- var/quick_burst_mod = 0.8
- origin_tech = "magnets=3;engineering=3"
-
-/obj/item/weapon/resonator/upgraded
- name = "upgraded resonator"
- desc = "An upgraded version of the resonator that can produce more fields at once, as well as having no damage penalty for bursting a resonance field early."
- icon_state = "resonator_u"
- item_state = "resonator_u"
- origin_tech = "materials=4;powerstorage=3;engineering=3;magnets=3"
- fieldlimit = 6
- quick_burst_mod = 1
-
-/obj/item/weapon/resonator/attack_self(mob/user)
- if(burst_time == 50)
- burst_time = 30
- to_chat(user, "You set the resonator's fields to detonate after 3 seconds.")
- else
- burst_time = 50
- to_chat(user, "You set the resonator's fields to detonate after 5 seconds.")
-
-/obj/item/weapon/resonator/proc/CreateResonance(target, mob/user)
- var/turf/T = get_turf(target)
- var/obj/effect/temp_visual/resonance/R = locate(/obj/effect/temp_visual/resonance) in T
- if(R)
- R.damage_multiplier = quick_burst_mod
- R.burst()
- return
- if(LAZYLEN(fields) < fieldlimit)
- new /obj/effect/temp_visual/resonance(T, user, src, burst_time)
- user.changeNext_move(CLICK_CD_MELEE)
-
-/obj/item/weapon/resonator/pre_attackby(atom/target, mob/user, params)
- if(check_allowed_items(target, 1))
- CreateResonance(target, user)
- return TRUE
-
-/obj/effect/temp_visual/resonance
- name = "resonance field"
- desc = "A resonating field that significantly damages anything inside of it when the field eventually ruptures. More damaging in low pressure environments."
- icon_state = "shield1"
- layer = ABOVE_ALL_MOB_LAYER
- duration = 50
- var/resonance_damage = 20
- var/damage_multiplier = 1
- var/creator
- var/obj/item/weapon/resonator/res
-
-/obj/effect/temp_visual/resonance/Initialize(mapload, set_creator, set_resonator, set_duration)
- duration = set_duration
- . = ..()
- creator = set_creator
- res = set_resonator
- if(res)
- res.fields += src
- playsound(src,'sound/weapons/resonator_fire.ogg',50,1)
- transform = matrix()*0.75
- animate(src, transform = matrix()*1.5, time = duration)
- deltimer(timerid)
- timerid = addtimer(CALLBACK(src, .proc/burst), duration, TIMER_STOPPABLE)
-
-/obj/effect/temp_visual/resonance/Destroy()
- if(res)
- res.fields -= src
- res = null
- creator = null
- . = ..()
-
-/obj/effect/temp_visual/resonance/proc/check_pressure(turf/proj_turf)
- if(!proj_turf)
- proj_turf = get_turf(src)
- if(!istype(proj_turf))
- return
- var/datum/gas_mixture/environment = proj_turf.return_air()
- var/pressure = environment.return_pressure()
- resonance_damage = initial(resonance_damage)
- if(pressure < 50)
- name = "strong [initial(name)]"
- resonance_damage *= 3
- else
- name = initial(name)
- resonance_damage *= damage_multiplier
-
-/obj/effect/temp_visual/resonance/proc/burst()
- var/turf/T = get_turf(src)
- new /obj/effect/temp_visual/resonance_crush(T)
- if(ismineralturf(T))
- var/turf/closed/mineral/M = T
- M.gets_drilled(creator)
- check_pressure(T)
- playsound(T,'sound/weapons/resonator_blast.ogg',50,1)
- for(var/mob/living/L in T)
- if(creator)
- add_logs(creator, L, "used a resonator field on", "resonator")
- to_chat(L, "[src] ruptured with you in it!")
- L.apply_damage(resonance_damage, BRUTE)
- qdel(src)
-
-/obj/effect/temp_visual/resonance_crush
- icon_state = "shield1"
- layer = ABOVE_ALL_MOB_LAYER
- duration = 4
-
-/obj/effect/temp_visual/resonance_crush/Initialize()
- . = ..()
- transform = matrix()*1.5
- animate(src, transform = matrix()*0.1, alpha = 50, time = 4)
-
-/**********************Facehugger toy**********************/
-
-/obj/item/clothing/mask/facehugger/toy
- item_state = "facehugger_inactive"
- desc = "A toy often used to play pranks on other miners by putting it in their beds. It takes a bit to recharge after latching onto something."
- throwforce = 0
- real = 0
- sterile = 1
- tint = 3 //Makes it feel more authentic when it latches on
-
-/obj/item/clothing/mask/facehugger/toy/Die()
- return
-
-/**********************Lazarus Injector**********************/
-
-/obj/item/weapon/lazarus_injector
- name = "lazarus injector"
- desc = "An injector with a cocktail of nanomachines and chemicals, this device can seemingly raise animals from the dead, making them become friendly to the user. Unfortunately, the process is useless on higher forms of life and incredibly costly, so these were hidden in storage until an executive thought they'd be great motivation for some of their employees."
- icon = 'icons/obj/syringe.dmi'
- icon_state = "lazarus_hypo"
- item_state = "hypo"
- throwforce = 0
- w_class = WEIGHT_CLASS_SMALL
- throw_speed = 3
- throw_range = 5
- var/loaded = 1
- var/malfunctioning = 0
- var/revive_type = SENTIENCE_ORGANIC //So you can't revive boss monsters or robots with it
- origin_tech = "biotech=4;magnets=6"
-
-/obj/item/weapon/lazarus_injector/afterattack(atom/target, mob/user, proximity_flag)
- if(!loaded)
- return
- if(isliving(target) && proximity_flag)
- if(istype(target, /mob/living/simple_animal))
- var/mob/living/simple_animal/M = target
- if(M.sentience_type != revive_type)
- to_chat(user, "[src] does not work on this sort of creature.")
- return
- if(M.stat == DEAD)
- M.faction = list("neutral")
- M.revive(full_heal = 1, admin_revive = 1)
- if(ishostile(target))
- var/mob/living/simple_animal/hostile/H = M
- if(malfunctioning)
- H.faction |= list("lazarus", "\ref[user]")
- H.robust_searching = 1
- H.friends += user
- H.attack_same = 1
- log_game("[user] has revived hostile mob [target] with a malfunctioning lazarus injector")
- else
- H.attack_same = 0
- loaded = 0
- user.visible_message("[user] injects [M] with [src], reviving it.")
- SSblackbox.add_details("lazarus_injector", "[M.type]")
- playsound(src,'sound/effects/refill.ogg',50,1)
- icon_state = "lazarus_empty"
- return
- else
- to_chat(user, "[src] is only effective on the dead.")
- return
- else
- to_chat(user, "[src] is only effective on lesser beings.")
- return
-
-/obj/item/weapon/lazarus_injector/emp_act()
- if(!malfunctioning)
- malfunctioning = 1
-
-/obj/item/weapon/lazarus_injector/examine(mob/user)
- ..()
- if(!loaded)
- to_chat(user, "[src] is empty.")
- if(malfunctioning)
- to_chat(user, "The display on [src] seems to be flickering.")
-
-/**********************Mining Scanners**********************/
-
-/obj/item/device/mining_scanner
- desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations."
- name = "manual mining scanner"
- icon_state = "mining1"
- item_state = "analyzer"
- w_class = WEIGHT_CLASS_SMALL
- flags = CONDUCT
- slot_flags = SLOT_BELT
- var/cooldown = 35
- var/current_cooldown = 0
- origin_tech = "engineering=1;magnets=1"
-
-/obj/item/device/mining_scanner/attack_self(mob/user)
- if(!user.client)
- return
- if(current_cooldown <= world.time)
- current_cooldown = world.time + cooldown
- mineral_scan_pulse(get_turf(user))
-
-
-//Debug item to identify all ore spread quickly
-/obj/item/device/mining_scanner/admin
-
-/obj/item/device/mining_scanner/admin/attack_self(mob/user)
- for(var/turf/closed/mineral/M in world)
- if(M.scan_state)
- M.icon_state = M.scan_state
- qdel(src)
-
-/obj/item/device/t_scanner/adv_mining_scanner
- desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. This one has an extended range."
- name = "advanced automatic mining scanner"
- icon_state = "mining0"
- item_state = "analyzer"
- w_class = WEIGHT_CLASS_SMALL
- flags = CONDUCT
- slot_flags = SLOT_BELT
- var/cooldown = 35
- var/current_cooldown = 0
- var/range = 7
- origin_tech = "engineering=3;magnets=3"
-
-/obj/item/device/t_scanner/adv_mining_scanner/lesser
- name = "automatic mining scanner"
- desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations."
- range = 4
- cooldown = 50
-
-/obj/item/device/t_scanner/adv_mining_scanner/scan()
- if(current_cooldown <= world.time)
- current_cooldown = world.time + cooldown
- var/turf/t = get_turf(src)
- mineral_scan_pulse(t, range)
-
-/proc/mineral_scan_pulse(turf/T, range = world.view)
- var/list/minerals = list()
- for(var/turf/closed/mineral/M in range(range, T))
- if(M.scan_state)
- minerals += M
- if(LAZYLEN(minerals))
- for(var/turf/closed/mineral/M in minerals)
- var/obj/effect/temp_visual/mining_overlay/oldC = locate(/obj/effect/temp_visual/mining_overlay) in M
- if(oldC)
- qdel(oldC)
- var/obj/effect/temp_visual/mining_overlay/C = new /obj/effect/temp_visual/mining_overlay(M)
- C.icon_state = M.scan_state
-
-/obj/effect/temp_visual/mining_overlay
- plane = FULLSCREEN_PLANE
- layer = FLASH_LAYER
- icon = 'icons/effects/ore_visuals.dmi'
- appearance_flags = 0 //to avoid having TILE_BOUND in the flags, so that the 480x480 icon states let you see it no matter where you are
- duration = 35
- pixel_x = -224
- pixel_y = -224
-
-/obj/effect/temp_visual/mining_overlay/Initialize()
- . = ..()
- animate(src, alpha = 0, time = duration, easing = EASE_IN)
-
-
-/**********************Xeno Warning Sign**********************/
-/obj/structure/sign/xeno_warning_mining
- name = "DANGEROUS ALIEN LIFE"
- desc = "A sign that warns would be travellers of hostile alien life in the vicinity."
- icon = 'icons/obj/mining.dmi'
- icon_state = "xeno_warning"
-
-/*********************Hivelord stabilizer****************/
-
-/obj/item/weapon/hivelordstabilizer
- name = "stabilizing serum"
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle19"
- desc = "Inject certain types of monster organs with this stabilizer to preserve their healing powers indefinitely."
- w_class = WEIGHT_CLASS_TINY
- origin_tech = "biotech=3"
-
-/obj/item/weapon/hivelordstabilizer/afterattack(obj/item/organ/M, mob/user)
- var/obj/item/organ/hivelord_core/C = M
- if(!istype(C, /obj/item/organ/hivelord_core))
- to_chat(user, "The stabilizer only works on certain types of monster organs, generally regenerative in nature.")
- return ..()
-
- C.preserved()
- to_chat(user, "You inject the [M] with the stabilizer. It will no longer go inert.")
- qdel(src)
-
-/*********************Mining Hammer****************/
-/obj/item/weapon/twohanded/required/mining_hammer
- icon = 'icons/obj/mining.dmi'
- icon_state = "mining_hammer1"
- item_state = "mining_hammer1"
- name = "proto-kinetic crusher"
- desc = "An early design of the proto-kinetic accelerator, it is little more than an combination of various mining tools cobbled together, forming a high-tech club. \
- While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna.\
- \nMark a mob with the destabilizing force, then hit them in melee to activate it for extra damage. Extra damage if backstabbed in this fashion. \
- This weapon is only particularly effective against large creatures."
- force = 20 //As much as a bone spear, but this is significantly more annoying to carry around due to requiring the use of both hands at all times
- w_class = WEIGHT_CLASS_BULKY
- slot_flags = SLOT_BACK
- force_unwielded = 20 //It's never not wielded so these are the same
- force_wielded = 20
- throwforce = 5
- throw_speed = 4
- luminosity = 4
- armour_penetration = 10
- materials = list(MAT_METAL=1150, MAT_GLASS=2075)
- hitsound = 'sound/weapons/bladeslice.ogg'
- attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped")
- sharpness = IS_SHARP
- var/charged = TRUE
- var/charge_time = 14
-
-/obj/item/projectile/destabilizer
- name = "destabilizing force"
- icon_state = "pulse1"
- nodamage = TRUE
- damage = 0 //We're just here to mark people. This is still a melee weapon.
- damage_type = BRUTE
- flag = "bomb"
- range = 6
- log_override = TRUE
- var/obj/item/weapon/twohanded/required/mining_hammer/hammer_synced
-
-/obj/item/projectile/destabilizer/Destroy()
- hammer_synced = null
- return ..()
-
-/obj/item/projectile/destabilizer/on_hit(atom/target, blocked = 0)
- if(isliving(target))
- var/mob/living/L = target
- var/datum/status_effect/crusher_mark/CM = L.apply_status_effect(STATUS_EFFECT_CRUSHERMARK)
- CM.hammer_synced = hammer_synced
- var/target_turf = get_turf(target)
- if(ismineralturf(target_turf))
- var/turf/closed/mineral/M = target_turf
- new /obj/effect/temp_visual/kinetic_blast(M)
- M.gets_drilled(firer)
- ..()
-
-/obj/item/weapon/twohanded/required/mining_hammer/afterattack(atom/target, mob/user, proximity_flag)
- if(!proximity_flag && charged)//Mark a target, or mine a tile.
- var/turf/proj_turf = user.loc
- if(!isturf(proj_turf))
- return
- var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(proj_turf)
- D.preparePixelProjectile(target, get_turf(target), user)
- D.hammer_synced = src
- playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1)
- D.fire()
- charged = FALSE
- icon_state = "mining_hammer1_uncharged"
- addtimer(CALLBACK(src, .proc/Recharge), charge_time)
- return
- if(proximity_flag && isliving(target))
- var/mob/living/L = target
- var/datum/status_effect/crusher_mark/CM = L.has_status_effect(STATUS_EFFECT_CRUSHERMARK)
- if(!CM || CM.hammer_synced != src || !L.remove_status_effect(STATUS_EFFECT_CRUSHERMARK))
- return
- new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
- var/backstab_dir = get_dir(user, L)
- var/def_check = L.getarmor(type = "bomb")
- if((user.dir & backstab_dir) && (L.dir & backstab_dir))
- L.apply_damage(80, BRUTE, blocked = def_check)
- playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong
- else
- L.apply_damage(50, BRUTE, blocked = def_check)
-
-/obj/item/weapon/twohanded/required/mining_hammer/proc/Recharge()
- if(!charged)
- charged = TRUE
- icon_state = "mining_hammer1"
- playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
new file mode 100644
index 0000000000..e4acea1cf0
--- /dev/null
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -0,0 +1,48 @@
+/****************Explorer's Suit and Mask****************/
+/obj/item/clothing/suit/hooded/explorer
+ name = "explorer suit"
+ desc = "An armoured suit for exploring harsh environments."
+ icon_state = "explorer"
+ item_state = "explorer"
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS
+ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
+ cold_protection = CHEST|GROIN|LEGS|ARMS
+ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
+ heat_protection = CHEST|GROIN|LEGS|ARMS
+ hoodtype = /obj/item/clothing/head/hooded/explorer
+ armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/weapon/gun/energy/kinetic_accelerator, /obj/item/weapon/pickaxe)
+ resistance_flags = FIRE_PROOF
+
+/obj/item/clothing/head/hooded/explorer
+ name = "explorer hood"
+ desc = "An armoured hood for exploring harsh environments."
+ icon_state = "explorer"
+ body_parts_covered = HEAD
+ flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
+ min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
+ max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
+ armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50)
+ resistance_flags = FIRE_PROOF
+
+/obj/item/clothing/mask/gas/explorer
+ name = "explorer gas mask"
+ desc = "A military-grade gas mask that can be connected to an air supply."
+ icon_state = "gas_mining"
+ visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ visor_flags_inv = HIDEFACIALHAIR
+ visor_flags_cover = MASKCOVERSMOUTH
+ actions_types = list(/datum/action/item_action/adjust)
+ armor = list(melee = 10, bullet = 5, laser = 5, energy = 5, bomb = 0, bio = 50, rad = 0, fire = 20, acid = 40)
+ resistance_flags = FIRE_PROOF
+
+/obj/item/clothing/mask/gas/explorer/attack_self(mob/user)
+ adjustmask(user)
+
+/obj/item/clothing/mask/gas/explorer/adjustmask(user)
+ ..()
+ w_class = mask_adjusted ? WEIGHT_CLASS_NORMAL : WEIGHT_CLASS_SMALL
+
+/obj/item/clothing/mask/gas/explorer/folded/New()
+ ..()
+ adjustmask()
diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm
new file mode 100644
index 0000000000..15d6c6afc5
--- /dev/null
+++ b/code/modules/mining/equipment/kinetic_crusher.dm
@@ -0,0 +1,86 @@
+/*********************Mining Hammer****************/
+/obj/item/weapon/twohanded/required/mining_hammer
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "mining_hammer1"
+ item_state = "mining_hammer1"
+ name = "proto-kinetic crusher"
+ desc = "An early design of the proto-kinetic accelerator, it is little more than an combination of various mining tools cobbled together, forming a high-tech club. \
+ While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna.\
+ \nMark a mob with the destabilizing force, then hit them in melee to activate it for extra damage. Extra damage if backstabbed in this fashion. \
+ This weapon is only particularly effective against large creatures."
+ force = 20 //As much as a bone spear, but this is significantly more annoying to carry around due to requiring the use of both hands at all times
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = SLOT_BACK
+ force_unwielded = 20 //It's never not wielded so these are the same
+ force_wielded = 20
+ throwforce = 5
+ throw_speed = 4
+ luminosity = 4
+ armour_penetration = 10
+ materials = list(MAT_METAL=1150, MAT_GLASS=2075)
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped")
+ sharpness = IS_SHARP
+ var/charged = TRUE
+ var/charge_time = 14
+
+/obj/item/projectile/destabilizer
+ name = "destabilizing force"
+ icon_state = "pulse1"
+ nodamage = TRUE
+ damage = 0 //We're just here to mark people. This is still a melee weapon.
+ damage_type = BRUTE
+ flag = "bomb"
+ range = 6
+ log_override = TRUE
+ var/obj/item/weapon/twohanded/required/mining_hammer/hammer_synced
+
+/obj/item/projectile/destabilizer/Destroy()
+ hammer_synced = null
+ return ..()
+
+/obj/item/projectile/destabilizer/on_hit(atom/target, blocked = 0)
+ if(isliving(target))
+ var/mob/living/L = target
+ var/datum/status_effect/crusher_mark/CM = L.apply_status_effect(STATUS_EFFECT_CRUSHERMARK)
+ CM.hammer_synced = hammer_synced
+ var/target_turf = get_turf(target)
+ if(ismineralturf(target_turf))
+ var/turf/closed/mineral/M = target_turf
+ new /obj/effect/temp_visual/kinetic_blast(M)
+ M.gets_drilled(firer)
+ ..()
+
+/obj/item/weapon/twohanded/required/mining_hammer/afterattack(atom/target, mob/user, proximity_flag)
+ if(!proximity_flag && charged)//Mark a target, or mine a tile.
+ var/turf/proj_turf = user.loc
+ if(!isturf(proj_turf))
+ return
+ var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(proj_turf)
+ D.preparePixelProjectile(target, get_turf(target), user)
+ D.hammer_synced = src
+ playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1)
+ D.fire()
+ charged = FALSE
+ icon_state = "mining_hammer1_uncharged"
+ addtimer(CALLBACK(src, .proc/Recharge), charge_time)
+ return
+ if(proximity_flag && isliving(target))
+ var/mob/living/L = target
+ var/datum/status_effect/crusher_mark/CM = L.has_status_effect(STATUS_EFFECT_CRUSHERMARK)
+ if(!CM || CM.hammer_synced != src || !L.remove_status_effect(STATUS_EFFECT_CRUSHERMARK))
+ return
+ new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
+ var/backstab_dir = get_dir(user, L)
+ var/def_check = L.getarmor(type = "bomb")
+ if((user.dir & backstab_dir) && (L.dir & backstab_dir))
+ L.apply_damage(80, BRUTE, blocked = def_check)
+ playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong
+ else
+ L.apply_damage(50, BRUTE, blocked = def_check)
+
+/obj/item/weapon/twohanded/required/mining_hammer/proc/Recharge()
+ if(!charged)
+ charged = TRUE
+ icon_state = "mining_hammer1"
+ playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
diff --git a/code/modules/mining/equipment/lazarus_injector.dm b/code/modules/mining/equipment/lazarus_injector.dm
new file mode 100644
index 0000000000..7199e29bf4
--- /dev/null
+++ b/code/modules/mining/equipment/lazarus_injector.dm
@@ -0,0 +1,61 @@
+/**********************Lazarus Injector**********************/
+/obj/item/weapon/lazarus_injector
+ name = "lazarus injector"
+ desc = "An injector with a cocktail of nanomachines and chemicals, this device can seemingly raise animals from the dead, making them become friendly to the user. Unfortunately, the process is useless on higher forms of life and incredibly costly, so these were hidden in storage until an executive thought they'd be great motivation for some of their employees."
+ icon = 'icons/obj/syringe.dmi'
+ icon_state = "lazarus_hypo"
+ item_state = "hypo"
+ throwforce = 0
+ w_class = WEIGHT_CLASS_SMALL
+ throw_speed = 3
+ throw_range = 5
+ var/loaded = 1
+ var/malfunctioning = 0
+ var/revive_type = SENTIENCE_ORGANIC //So you can't revive boss monsters or robots with it
+ origin_tech = "biotech=4;magnets=6"
+
+/obj/item/weapon/lazarus_injector/afterattack(atom/target, mob/user, proximity_flag)
+ if(!loaded)
+ return
+ if(isliving(target) && proximity_flag)
+ if(istype(target, /mob/living/simple_animal))
+ var/mob/living/simple_animal/M = target
+ if(M.sentience_type != revive_type)
+ to_chat(user, "[src] does not work on this sort of creature.")
+ return
+ if(M.stat == DEAD)
+ M.faction = list("neutral")
+ M.revive(full_heal = 1, admin_revive = 1)
+ if(ishostile(target))
+ var/mob/living/simple_animal/hostile/H = M
+ if(malfunctioning)
+ H.faction |= list("lazarus", "\ref[user]")
+ H.robust_searching = 1
+ H.friends += user
+ H.attack_same = 1
+ log_game("[user] has revived hostile mob [target] with a malfunctioning lazarus injector")
+ else
+ H.attack_same = 0
+ loaded = 0
+ user.visible_message("[user] injects [M] with [src], reviving it.")
+ SSblackbox.add_details("lazarus_injector", "[M.type]")
+ playsound(src,'sound/effects/refill.ogg',50,1)
+ icon_state = "lazarus_empty"
+ return
+ else
+ to_chat(user, "[src] is only effective on the dead.")
+ return
+ else
+ to_chat(user, "[src] is only effective on lesser beings.")
+ return
+
+/obj/item/weapon/lazarus_injector/emp_act()
+ if(!malfunctioning)
+ malfunctioning = 1
+
+/obj/item/weapon/lazarus_injector/examine(mob/user)
+ ..()
+ if(!loaded)
+ to_chat(user, "[src] is empty.")
+ if(malfunctioning)
+ to_chat(user, "The display on [src] seems to be flickering.")
diff --git a/code/modules/mining/equipment/mineral_scanner.dm b/code/modules/mining/equipment/mineral_scanner.dm
new file mode 100644
index 0000000000..4f76c98a28
--- /dev/null
+++ b/code/modules/mining/equipment/mineral_scanner.dm
@@ -0,0 +1,79 @@
+/**********************Mining Scanners**********************/
+/obj/item/device/mining_scanner
+ desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations."
+ name = "manual mining scanner"
+ icon_state = "mining1"
+ item_state = "analyzer"
+ w_class = WEIGHT_CLASS_SMALL
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ var/cooldown = 35
+ var/current_cooldown = 0
+ origin_tech = "engineering=1;magnets=1"
+
+/obj/item/device/mining_scanner/attack_self(mob/user)
+ if(!user.client)
+ return
+ if(current_cooldown <= world.time)
+ current_cooldown = world.time + cooldown
+ mineral_scan_pulse(get_turf(user))
+
+//Debug item to identify all ore spread quickly
+/obj/item/device/mining_scanner/admin
+
+/obj/item/device/mining_scanner/admin/attack_self(mob/user)
+ for(var/turf/closed/mineral/M in world)
+ if(M.scan_state)
+ M.icon_state = M.scan_state
+ qdel(src)
+
+/obj/item/device/t_scanner/adv_mining_scanner
+ desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. This one has an extended range."
+ name = "advanced automatic mining scanner"
+ icon_state = "mining0"
+ item_state = "analyzer"
+ w_class = WEIGHT_CLASS_SMALL
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ var/cooldown = 35
+ var/current_cooldown = 0
+ var/range = 7
+ origin_tech = "engineering=3;magnets=3"
+
+/obj/item/device/t_scanner/adv_mining_scanner/lesser
+ name = "automatic mining scanner"
+ desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations."
+ range = 4
+ cooldown = 50
+
+/obj/item/device/t_scanner/adv_mining_scanner/scan()
+ if(current_cooldown <= world.time)
+ current_cooldown = world.time + cooldown
+ var/turf/t = get_turf(src)
+ mineral_scan_pulse(t, range)
+
+/proc/mineral_scan_pulse(turf/T, range = world.view)
+ var/list/minerals = list()
+ for(var/turf/closed/mineral/M in range(range, T))
+ if(M.scan_state)
+ minerals += M
+ if(LAZYLEN(minerals))
+ for(var/turf/closed/mineral/M in minerals)
+ var/obj/effect/temp_visual/mining_overlay/oldC = locate(/obj/effect/temp_visual/mining_overlay) in M
+ if(oldC)
+ qdel(oldC)
+ var/obj/effect/temp_visual/mining_overlay/C = new /obj/effect/temp_visual/mining_overlay(M)
+ C.icon_state = M.scan_state
+
+/obj/effect/temp_visual/mining_overlay
+ plane = FULLSCREEN_PLANE
+ layer = FLASH_LAYER
+ icon = 'icons/effects/ore_visuals.dmi'
+ appearance_flags = 0 //to avoid having TILE_BOUND in the flags, so that the 480x480 icon states let you see it no matter where you are
+ duration = 35
+ pixel_x = -224
+ pixel_y = -224
+
+/obj/effect/temp_visual/mining_overlay/Initialize()
+ . = ..()
+ animate(src, alpha = 0, time = duration, easing = EASE_IN)
diff --git a/code/modules/mining/equipment/resonator.dm b/code/modules/mining/equipment/resonator.dm
new file mode 100644
index 0000000000..c54def1b2b
--- /dev/null
+++ b/code/modules/mining/equipment/resonator.dm
@@ -0,0 +1,120 @@
+/**********************Resonator**********************/
+/obj/item/weapon/resonator
+ name = "resonator"
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "resonator"
+ item_state = "resonator"
+ desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It's more effective in a vacuum."
+ w_class = WEIGHT_CLASS_NORMAL
+ force = 15
+ throwforce = 10
+ var/burst_time = 30
+ var/fieldlimit = 4
+ var/list/fields = list()
+ var/quick_burst_mod = 0.8
+ origin_tech = "magnets=3;engineering=3"
+
+/obj/item/weapon/resonator/upgraded
+ name = "upgraded resonator"
+ desc = "An upgraded version of the resonator that can produce more fields at once, as well as having no damage penalty for bursting a resonance field early."
+ icon_state = "resonator_u"
+ item_state = "resonator_u"
+ origin_tech = "materials=4;powerstorage=3;engineering=3;magnets=3"
+ fieldlimit = 6
+ quick_burst_mod = 1
+
+/obj/item/weapon/resonator/attack_self(mob/user)
+ if(burst_time == 50)
+ burst_time = 30
+ to_chat(user, "You set the resonator's fields to detonate after 3 seconds.")
+ else
+ burst_time = 50
+ to_chat(user, "You set the resonator's fields to detonate after 5 seconds.")
+
+/obj/item/weapon/resonator/proc/CreateResonance(target, mob/user)
+ var/turf/T = get_turf(target)
+ var/obj/effect/temp_visual/resonance/R = locate(/obj/effect/temp_visual/resonance) in T
+ if(R)
+ R.damage_multiplier = quick_burst_mod
+ R.burst()
+ return
+ if(LAZYLEN(fields) < fieldlimit)
+ new /obj/effect/temp_visual/resonance(T, user, src, burst_time)
+ user.changeNext_move(CLICK_CD_MELEE)
+
+/obj/item/weapon/resonator/pre_attackby(atom/target, mob/user, params)
+ if(check_allowed_items(target, 1))
+ CreateResonance(target, user)
+ return TRUE
+
+//resonance field, crushes rock, damages mobs
+/obj/effect/temp_visual/resonance
+ name = "resonance field"
+ desc = "A resonating field that significantly damages anything inside of it when the field eventually ruptures. More damaging in low pressure environments."
+ icon_state = "shield1"
+ layer = ABOVE_ALL_MOB_LAYER
+ duration = 50
+ var/resonance_damage = 20
+ var/damage_multiplier = 1
+ var/creator
+ var/obj/item/weapon/resonator/res
+
+/obj/effect/temp_visual/resonance/Initialize(mapload, set_creator, set_resonator, set_duration)
+ duration = set_duration
+ . = ..()
+ creator = set_creator
+ res = set_resonator
+ if(res)
+ res.fields += src
+ playsound(src,'sound/weapons/resonator_fire.ogg',50,1)
+ transform = matrix()*0.75
+ animate(src, transform = matrix()*1.5, time = duration)
+ deltimer(timerid)
+ timerid = addtimer(CALLBACK(src, .proc/burst), duration, TIMER_STOPPABLE)
+
+/obj/effect/temp_visual/resonance/Destroy()
+ if(res)
+ res.fields -= src
+ res = null
+ creator = null
+ . = ..()
+
+/obj/effect/temp_visual/resonance/proc/check_pressure(turf/proj_turf)
+ if(!proj_turf)
+ proj_turf = get_turf(src)
+ if(!istype(proj_turf))
+ return
+ var/datum/gas_mixture/environment = proj_turf.return_air()
+ var/pressure = environment.return_pressure()
+ resonance_damage = initial(resonance_damage)
+ if(pressure < 50)
+ name = "strong [initial(name)]"
+ resonance_damage *= 3
+ else
+ name = initial(name)
+ resonance_damage *= damage_multiplier
+
+/obj/effect/temp_visual/resonance/proc/burst()
+ var/turf/T = get_turf(src)
+ new /obj/effect/temp_visual/resonance_crush(T)
+ if(ismineralturf(T))
+ var/turf/closed/mineral/M = T
+ M.gets_drilled(creator)
+ check_pressure(T)
+ playsound(T,'sound/weapons/resonator_blast.ogg',50,1)
+ for(var/mob/living/L in T)
+ if(creator)
+ add_logs(creator, L, "used a resonator field on", "resonator")
+ to_chat(L, "[src] ruptured with you in it!")
+ L.apply_damage(resonance_damage, BRUTE)
+ qdel(src)
+
+/obj/effect/temp_visual/resonance_crush
+ icon_state = "shield1"
+ layer = ABOVE_ALL_MOB_LAYER
+ duration = 4
+
+/obj/effect/temp_visual/resonance_crush/Initialize()
+ . = ..()
+ transform = matrix()*1.5
+ animate(src, transform = matrix()*0.1, alpha = 50, time = 4)
diff --git a/code/modules/mining/equipment/vendor_items.dm b/code/modules/mining/equipment/vendor_items.dm
new file mode 100644
index 0000000000..4ff83ea21f
--- /dev/null
+++ b/code/modules/mining/equipment/vendor_items.dm
@@ -0,0 +1,33 @@
+/**********************Mining Equipment Vendor Items**************************/
+//misc stuff you can buy from the vendor that has special code but doesn't really need its own file
+
+/**********************Facehugger toy**********************/
+/obj/item/clothing/mask/facehugger/toy
+ item_state = "facehugger_inactive"
+ desc = "A toy often used to play pranks on other miners by putting it in their beds. It takes a bit to recharge after latching onto something."
+ throwforce = 0
+ real = 0
+ sterile = 1
+ tint = 3 //Makes it feel more authentic when it latches on
+
+/obj/item/clothing/mask/facehugger/toy/Die()
+ return
+
+/*********************Hivelord stabilizer****************/
+/obj/item/weapon/hivelordstabilizer
+ name = "stabilizing serum"
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle19"
+ desc = "Inject certain types of monster organs with this stabilizer to preserve their healing powers indefinitely."
+ w_class = WEIGHT_CLASS_TINY
+ origin_tech = "biotech=3"
+
+/obj/item/weapon/hivelordstabilizer/afterattack(obj/item/organ/M, mob/user)
+ var/obj/item/organ/hivelord_core/C = M
+ if(!istype(C, /obj/item/organ/hivelord_core))
+ to_chat(user, "The stabilizer only works on certain types of monster organs, generally regenerative in nature.")
+ return ..()
+
+ C.preserved()
+ to_chat(user, "You inject the [M] with the stabilizer. It will no longer go inert.")
+ qdel(src)
diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm
new file mode 100644
index 0000000000..135f4482fc
--- /dev/null
+++ b/code/modules/mining/equipment/wormhole_jaunter.dm
@@ -0,0 +1,109 @@
+/**********************Jaunter**********************/
+/obj/item/device/wormhole_jaunter
+ name = "wormhole jaunter"
+ desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to blue space for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least.\nThanks to modifications provided by the Free Golems, this jaunter can be worn on the belt to provide protection from chasms."
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "Jaunter"
+ item_state = "electronic"
+ throwforce = 0
+ w_class = WEIGHT_CLASS_SMALL
+ throw_speed = 3
+ throw_range = 5
+ origin_tech = "bluespace=2"
+ slot_flags = SLOT_BELT
+
+/obj/item/device/wormhole_jaunter/attack_self(mob/user)
+ user.visible_message("[user.name] activates the [src.name]!")
+ SSblackbox.add_details("jaunter", "User") // user activated
+ activate(user)
+
+/obj/item/device/wormhole_jaunter/proc/turf_check(mob/user)
+ var/turf/device_turf = get_turf(user)
+ if(!device_turf||device_turf.z==2||device_turf.z>=7)
+ to_chat(user, "You're having difficulties getting the [src.name] to work.")
+ return FALSE
+ return TRUE
+
+/obj/item/device/wormhole_jaunter/proc/get_destinations(mob/user)
+ var/list/destinations = list()
+
+ if(isgolem(user))
+ for(var/obj/item/device/radio/beacon/B in GLOB.teleportbeacons)
+ var/turf/T = get_turf(B)
+ if(istype(T.loc, /area/ruin/powered/golem_ship))
+ destinations += B
+
+ // In the event golem beacon is destroyed, send to station instead
+ if(destinations.len)
+ return destinations
+
+ for(var/obj/item/device/radio/beacon/B in GLOB.teleportbeacons)
+ var/turf/T = get_turf(B)
+ if(T.z == ZLEVEL_STATION)
+ destinations += B
+
+ return destinations
+
+/obj/item/device/wormhole_jaunter/proc/activate(mob/user)
+ if(!turf_check(user))
+ return
+
+ var/list/L = get_destinations(user)
+ if(!L.len)
+ to_chat(user, "The [src.name] found no beacons in the world to anchor a wormhole to.")
+ return
+ var/chosen_beacon = pick(L)
+ var/obj/effect/portal/wormhole/jaunt_tunnel/J = new /obj/effect/portal/wormhole/jaunt_tunnel(get_turf(src), chosen_beacon, lifespan=100)
+ J.target = chosen_beacon
+ try_move_adjacent(J)
+ playsound(src,'sound/effects/sparks4.ogg',50,1)
+ qdel(src)
+
+/obj/item/device/wormhole_jaunter/emp_act(power)
+ var/triggered = FALSE
+
+ if(usr.get_item_by_slot(slot_belt) == src)
+ if(power == 1)
+ triggered = TRUE
+ else if(power == 2 && prob(50))
+ triggered = TRUE
+
+ if(triggered)
+ usr.visible_message("The [src] overloads and activates!")
+ SSblackbox.add_details("jaunter","EMP") // EMP accidental activation
+ activate(usr)
+
+/obj/item/device/wormhole_jaunter/proc/chasm_react(mob/user)
+ if(user.get_item_by_slot(slot_belt) == src)
+ to_chat(user, "Your [src] activates, saving you from the chasm!")
+ SSblackbox.add_details("jaunter","Chasm") // chasm automatic activation
+ activate(user)
+ else
+ to_chat(user, "The [src] is not attached to your belt, preventing it from saving you from the chasm. RIP.")
+
+//jaunter tunnel
+/obj/effect/portal/wormhole/jaunt_tunnel
+ name = "jaunt tunnel"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "bhole3"
+ desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon."
+ mech_sized = TRUE //save your ripley
+
+/obj/effect/portal/wormhole/jaunt_tunnel/teleport(atom/movable/M)
+ if(istype(M, /obj/effect))
+ return
+
+ if(M.anchored)
+ if(!(istype(M, /obj/mecha) && mech_sized))
+ return
+
+ if(istype(M, /atom/movable))
+ if(do_teleport(M, target, 6))
+ // KERPLUNK
+ playsound(M,'sound/weapons/resonator_blast.ogg',50,1)
+ if(iscarbon(M))
+ var/mob/living/carbon/L = M
+ L.Weaken(3)
+ if(ishuman(L))
+ shake_camera(L, 20, 1)
+ addtimer(CALLBACK(L, /mob/living/carbon.proc/vomit), 20)
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 6fe1c5db53..afcf1d4c33 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -386,7 +386,6 @@
background_icon_state = "bg_demon"
buttontooltipstyle = "cult"
button_icon_state = "cult_mark"
- var/tracking = FALSE
var/mob/living/simple_animal/hostile/construct/harvester/the_construct
/datum/action/innate/seek_prey/Grant(var/mob/living/C)
@@ -396,12 +395,10 @@
/datum/action/innate/seek_prey/Activate()
if(GLOB.cult_narsie == null)
return
- if(tracking)
+ if(the_construct.seeking)
desc = "None can hide from Nar'Sie, activate to track a survivor attempting to flee the red harvest!"
button_icon_state = "cult_mark"
- tracking = FALSE
the_construct.seeking = FALSE
- the_construct.master = GLOB.cult_narsie
to_chat(the_construct, "You are now tracking Nar'Sie, return to reap the harvest!")
return
else
@@ -413,7 +410,6 @@
return
desc = "Activate to track Nar'Sie!"
button_icon_state = "sintouch"
- tracking = TRUE
the_construct.seeking = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index e3e4e37396..eaabcf5980 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -255,10 +255,8 @@
addtimer(CALLBACK(src, .proc/inert_check), 2400)
/obj/item/organ/hivelord_core/proc/inert_check()
- if(!owner && !preserved)
+ if(!preserved)
go_inert()
- else
- preserved(implanted = 1)
/obj/item/organ/hivelord_core/proc/preserved(implanted = 0)
inert = FALSE
@@ -278,7 +276,10 @@
update_icon()
/obj/item/organ/hivelord_core/ui_action_click()
- owner.revive(full_heal = 1)
+ if(inert)
+ to_chat(owner, "[src] breaks down as it tries to activate.")
+ else
+ owner.revive(full_heal = 1)
qdel(src)
/obj/item/organ/hivelord_core/on_life()
@@ -306,6 +307,18 @@
qdel(src)
..()
+/obj/item/organ/hivelord_core/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
+ . = ..()
+ if(!preserved && !inert)
+ preserved(TRUE)
+ owner.visible_message("[src] stabilizes as it's inserted.")
+
+/obj/item/organ/hivelord_core/Remove(mob/living/carbon/M, special = 0)
+ if(!inert && !special)
+ owner.visible_message("[src] goes inert as it's removed.")
+ go_inert()
+ return ..()
+
/obj/item/organ/hivelord_core/prepare_eat()
return null
diff --git a/code/modules/procedural_mapping/mapGeneratorModule.dm b/code/modules/procedural_mapping/mapGeneratorModule.dm
index 0ad35adddb..3a78d8385e 100644
--- a/code/modules/procedural_mapping/mapGeneratorModule.dm
+++ b/code/modules/procedural_mapping/mapGeneratorModule.dm
@@ -9,14 +9,14 @@
var/allowAtomsOnSpace = FALSE
-//Syncs the module up with it's mother
+//Syncs the module up with its mother
/datum/mapGeneratorModule/proc/sync(datum/mapGenerator/mum)
mother = null
if(mum)
mother = mum
-//Generates it's spawnable atoms and turfs
+//Generates its spawnable atoms and turfs
/datum/mapGeneratorModule/proc/generate()
if(!mother)
return
@@ -143,4 +143,4 @@
/datum/mapGeneratorModule/denseLayer
clusterCheckFlags = CLUSTER_CHECK_NONE
spawnableAtoms = list(/atom = 75)
- spawnableTurfs = list(/turf = 75)
\ No newline at end of file
+ spawnableTurfs = list(/turf = 75)
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index 7da945a5b8..51703e0a5a 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -78,6 +78,9 @@
fire_sound = 'sound/weapons/taser.ogg'
e_cost = 200
+/obj/item/ammo_casing/energy/electrode/spec
+ e_cost = 100
+
/obj/item/ammo_casing/energy/electrode/gun
fire_sound = 'sound/weapons/gunshot.ogg'
e_cost = 100
diff --git a/code/modules/projectiles/box_magazine.dm b/code/modules/projectiles/box_magazine.dm
index 982bbdf587..028aebe66a 100644
--- a/code/modules/projectiles/box_magazine.dm
+++ b/code/modules/projectiles/box_magazine.dm
@@ -86,6 +86,7 @@
if(num_loaded)
if(!silent)
to_chat(user, "You load [num_loaded] shell\s into \the [src]!")
+ playsound(user, 'sound/weapons/bulletinsert.ogg', 60, 1)
A.update_icon()
update_icon()
@@ -96,6 +97,7 @@
if(A)
user.put_in_hands(A)
to_chat(user, "You remove a round from \the [src]!")
+ playsound(user, 'sound/weapons/bulletremove.ogg', 60, 1)
update_icon()
/obj/item/ammo_box/update_icon()
diff --git a/code/modules/projectiles/boxes_magazines/external_mag.dm b/code/modules/projectiles/boxes_magazines/external_mag.dm
index 8733cd2e1e..c2a7129b4e 100644
--- a/code/modules/projectiles/boxes_magazines/external_mag.dm
+++ b/code/modules/projectiles/boxes_magazines/external_mag.dm
@@ -30,16 +30,19 @@
/obj/item/ammo_box/magazine/m10mm/fire
name = "pistol magazine (10mm incendiary)"
+ icon_state = "9x19pI"
desc = "A gun magazine. Loaded with rounds which ignite the target."
ammo_type = /obj/item/ammo_casing/c10mm/fire
/obj/item/ammo_box/magazine/m10mm/hp
name = "pistol magazine (10mm HP)"
+ icon_state = "9x19pH"
desc= "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing."
ammo_type = /obj/item/ammo_casing/c10mm/hp
/obj/item/ammo_box/magazine/m10mm/ap
name = "pistol magazine (10mm AP)"
+ icon_state = "9x19pA"
desc= "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets"
ammo_type = /obj/item/ammo_casing/c10mm/ap
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index 0235bbe84d..2f7036cab8 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -44,6 +44,8 @@
oldmag.update_icon()
else
to_chat(user, "You insert the magazine into \the [src].")
+
+ playsound(user, 'sound/weapons/autoguninsert.ogg', 60, 1)
chamber_round()
A.update_icon()
update_icon()
@@ -300,6 +302,10 @@
/obj/item/weapon/gun/ballistic/automatic/l6_saw/attack_self(mob/user)
cover_open = !cover_open
to_chat(user, "You [cover_open ? "open" : "close"] [src]'s cover.")
+ if(cover_open)
+ playsound(user, 'sound/weapons/sawopen.ogg', 60, 1)
+ else
+ playsound(user, 'sound/weapons/sawclose.ogg', 60, 1)
update_icon()
@@ -330,6 +336,7 @@
magazine = null
update_icon()
to_chat(user, "You remove the magazine from [src].")
+ playsound(user, 'sound/weapons/magout.ogg', 60, 1)
/obj/item/weapon/gun/ballistic/automatic/l6_saw/attackby(obj/item/A, mob/user, params)
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index ac3c56b88a..892defa9f4 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -28,6 +28,7 @@
var/num_loaded = magazine.attackby(A, user, params, 1)
if(num_loaded)
to_chat(user, "You load [num_loaded] shell\s into \the [src].")
+ playsound(user, 'sound/weapons/bulletinsert.ogg', 60, 1)
A.update_icon()
update_icon()
chamber_round(0)
@@ -45,6 +46,7 @@
num_unloaded++
if (num_unloaded)
to_chat(user, "You unload [num_unloaded] shell\s from [src].")
+ playsound(user, 'sound/weapons/bulletremove.ogg', 60, 1)
else
to_chat(user, "[src] is empty!")
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 5f376370d4..918acd27a1 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -20,6 +20,7 @@
var/num_loaded = magazine.attackby(A, user, params, 1)
if(num_loaded)
to_chat(user, "You load [num_loaded] shell\s into \the [src]!")
+ playsound(user, 'sound/weapons/shotguninsert.ogg', 60, 1)
A.update_icon()
update_icon()
diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm
index cc1166814b..e115d58190 100644
--- a/code/modules/projectiles/guns/energy/energy_gun.dm
+++ b/code/modules/projectiles/guns/energy/energy_gun.dm
@@ -31,6 +31,12 @@
if(gun_light && gun_light.on)
add_overlay("mini-light")
+/obj/item/weapon/gun/energy/e_gun/stun
+ name = "tactical energy gun"
+ desc = "Military issue energy gun, is able to fire stun rounds."
+ ammo_type = list(/obj/item/ammo_casing/energy/electrode/spec, /obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser)
+
+
/obj/item/weapon/gun/energy/e_gun/mini/practice_phaser
name = "practice phaser"
desc = "A modified version of the basic phaser gun, this one fires less concentrated energy bolts designed for target practice."
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 73355cd326..0594c17469 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -28,8 +28,8 @@
damage = 10
/obj/item/projectile/bullet/armourpiercing
- damage = 17
- armour_penetration = 10
+ damage = 15
+ armour_penetration = 40
/obj/item/projectile/bullet/pellet
name = "pellet"
@@ -244,7 +244,7 @@
name = "\improper DNA injector"
icon_state = "syringeproj"
var/obj/item/weapon/dnainjector/injector
-
+
/obj/item/projectile/bullet/dnainjector/on_hit(atom/target, blocked = 0)
if(iscarbon(target))
var/mob/living/carbon/M = target
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index b30207eaf3..f3cc8b8620 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -160,6 +160,12 @@
var/obj/item/toy/carpplushie/dehy_carp/dehy = O
dehy.Swell() // Makes a carp
+ else if(istype(O, /obj/item/stack/sheet/hairlesshide))
+ var/obj/item/stack/sheet/hairlesshide/HH = O
+ var/obj/item/stack/sheet/wetleather/WL = new(get_turf(HH))
+ WL.amount = HH.amount
+ qdel(HH)
+
/*
* Water reaction to a mob
*/
@@ -367,11 +373,15 @@
if(ishuman(M))
var/mob/living/carbon/human/N = M
- if(N.dna.species.id == "human") // If they're human, turn em to the "orange" race, and give em spiky black hair
+ N.hair_style = "Spiky"
+ N.facial_hair_style = "Shaved"
+ N.facial_hair_color = "000"
+ N.hair_color = "000"
+ if(!(HAIR in N.dna.species.species_traits)) //No hair? No problem!
+ N.dna.species.species_traits += HAIR
+ if(N.dna.species.use_skintones)
N.skin_tone = "orange"
- N.hair_style = "Spiky"
- N.hair_color = "000"
- if(MUTCOLORS in N.dna.species.species_traits) //Aliens with custom colors simply get turned orange
+ else if(MUTCOLORS in N.dna.species.species_traits) //Aliens with custom colors simply get turned orange
N.dna.features["mcolor"] = "f80"
N.regenerate_icons()
if(prob(7))
@@ -380,7 +390,7 @@
else
M.visible_message("[M] flexes [M.p_their()] arms.")
if(prob(10))
- M.say(pick("Check these sweet biceps bro!", "Deal with it.", "CHUG! CHUG! CHUG! CHUG!", "Winning!", "NERDS!", "My name is John and I hate every single one of you."))
+ M.say(pick("Shit was SO cash.", "You are everything bad in the world.", "What sports do you play, other than 'jack off to naked drawn Japanese people?'", "Don’t be a stranger. Just hit me with your best shot.", "My name is John and I hate every single one of you."))
..()
return
@@ -1126,7 +1136,7 @@
/datum/reagent/nitrous_oxide/reaction_mob(mob/M, method=TOUCH, reac_volume)
if(method == VAPOR)
M.drowsyness += max(round(reac_volume, 1), 2)
-
+
/datum/reagent/nitrous_oxide/on_mob_life(mob/living/M)
M.drowsyness += 2
if(ishuman(M))
diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm
index bd34ff60c0..ff7c3f6340 100644
--- a/code/modules/research/xenobiology/xenobio_camera.dm
+++ b/code/modules/research/xenobiology/xenobio_camera.dm
@@ -101,7 +101,7 @@
if(C.client)
C.client.images -= remote_eye.user_image
for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks)
- C.client.images -= chunk.obscured
+ chunk.remove(remote_eye)
C.remote_control = null
C.unset_machine()
Remove(C)
diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm
index d47a5b268c..f022e0338f 100644
--- a/code/modules/spells/spell.dm
+++ b/code/modules/spells/spell.dm
@@ -203,7 +203,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
charge_counter-- //returns the charge if the targets selecting fails
if("holdervar")
adjust_var(user, holder_var_type, holder_var_amount)
-
+ if(action)
+ action.UpdateButtonIcon()
return 1
/obj/effect/proc_holder/spell/proc/invocation(mob/user = usr) //spelling the spell out and setting it on recharge/reducing charges amount
@@ -249,16 +250,13 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
return TRUE
/obj/effect/proc_holder/spell/proc/start_recharge()
- if(action)
- action.UpdateButtonIcon()
recharging = TRUE
- if(action)
- action.UpdateButtonIcon()
/obj/effect/proc_holder/spell/process()
if(recharging && charge_type == "recharge" && (charge_counter < charge_max))
charge_counter += 2 //processes 5 times per second instead of 10.
if(charge_counter >= charge_max)
+ action.UpdateButtonIcon()
charge_counter = charge_max
recharging = FALSE
@@ -276,6 +274,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
else
cast(targets,user=user)
after_cast(targets)
+ if(action)
+ action.UpdateButtonIcon()
/obj/effect/proc_holder/spell/proc/before_cast(list/targets)
if(overlay)
@@ -332,6 +332,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
charge_counter++
if("holdervar")
adjust_var(user, holder_var_type, -holder_var_amount)
+ if(action)
+ action.UpdateButtonIcon()
/obj/effect/proc_holder/spell/proc/adjust_var(mob/living/target = usr, type, amount) //handles the adjustment of the var when the spell is used. has some hardcoded types
if (!istype(target))
diff --git a/html/changelogs/AutoChangeLog-pr-1110.yml b/html/changelogs/AutoChangeLog-pr-1110.yml
new file mode 100644
index 0000000000..ba60502d77
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1110.yml
@@ -0,0 +1,8 @@
+author: "Robustin"
+delete-after: True
+changes:
+ - rscadd: "Added a sexy new icon for the harvester's AOE conversion spell"
+ - bugfix: "Fixed construct's forcewall being invisible"
+ - bugfix: "Fixed cult constructs \"Locate Master\" and \"Locate Prey\" not functioning"
+ - bugfix: "Fixed spell action buttons not showing their actual availability status"
+ - tweak: "Changed the duration of a few frames for the new Cult ending"
diff --git a/html/changelogs/AutoChangeLog-pr-1141.yml b/html/changelogs/AutoChangeLog-pr-1141.yml
new file mode 100644
index 0000000000..2b8841490d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1141.yml
@@ -0,0 +1,4 @@
+author: "Tacolizard"
+delete-after: True
+changes:
+ - tweak: "Station based armour is slightly more descriptive of what it does."
diff --git a/html/changelogs/AutoChangeLog-pr-1143.yml b/html/changelogs/AutoChangeLog-pr-1143.yml
new file mode 100644
index 0000000000..7eda0316fd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1143.yml
@@ -0,0 +1,4 @@
+author: "Steelpoint"
+delete-after: True
+changes:
+ - rscadd: "Sketchin alternative magazines (Armour Piercing, Hollow Point, Incendiary) now have unique sprites to better identify them."
diff --git a/html/changelogs/AutoChangeLog-pr-1144.yml b/html/changelogs/AutoChangeLog-pr-1144.yml
new file mode 100644
index 0000000000..8dc8d42475
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1144.yml
@@ -0,0 +1,4 @@
+author: "QualityVan"
+delete-after: True
+changes:
+ - bugfix: "Inserted legion cores no longer work if they went inert before implanting"
diff --git a/html/changelogs/AutoChangeLog-pr-1146.yml b/html/changelogs/AutoChangeLog-pr-1146.yml
new file mode 100644
index 0000000000..c7b4db56f6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1146.yml
@@ -0,0 +1,4 @@
+author: "That Really Good Soda Flavor"
+delete-after: True
+changes:
+ - tweak: "Changed spray tan overdoses to be more realistic."
diff --git a/html/changelogs/AutoChangeLog-pr-1147.yml b/html/changelogs/AutoChangeLog-pr-1147.yml
new file mode 100644
index 0000000000..6c524da4aa
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1147.yml
@@ -0,0 +1,5 @@
+author: "QualityVan"
+delete-after: True
+changes:
+ - rscadd: "Hairless hides now become wet when exposed to water"
+ - rscadd: "You can microwave wet leather to dry it"
diff --git a/html/changelogs/AutoChangeLog-pr-1149.yml b/html/changelogs/AutoChangeLog-pr-1149.yml
new file mode 100644
index 0000000000..4a5c010dd4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1149.yml
@@ -0,0 +1,4 @@
+author: "Steelpoint"
+delete-after: True
+changes:
+ - rscadd: "Boxstation armoury weapon racks now have glass panes to help prevent the weapons easily flying out of a breached hull."
diff --git a/html/changelogs/AutoChangeLog-pr-1150.yml b/html/changelogs/AutoChangeLog-pr-1150.yml
new file mode 100644
index 0000000000..7bc3eb78a5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1150.yml
@@ -0,0 +1,4 @@
+author: "Steelpoint"
+delete-after: True
+changes:
+ - rscadd: "Many Ballistic weapons now have new sounds related to reloading or placing bullets into magazines."
diff --git a/html/changelogs/AutoChangeLog-pr-1152.yml b/html/changelogs/AutoChangeLog-pr-1152.yml
new file mode 100644
index 0000000000..813a4a931a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1152.yml
@@ -0,0 +1,4 @@
+author: "Steelpoint"
+delete-after: True
+changes:
+ - tweak: "Changes to production of Nanotrasen Auto Rifle armour piercing bullets have now made AP bullets better able to penetrate armour, but at the cost of the amount of possible damage the bullet can do to soft targets."
diff --git a/html/changelogs/AutoChangeLog-pr-1156.yml b/html/changelogs/AutoChangeLog-pr-1156.yml
new file mode 100644
index 0000000000..eda11511f8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1156.yml
@@ -0,0 +1,4 @@
+author: "Steelpoint"
+delete-after: True
+changes:
+ - bugfix: "Fixed Battleship Raven's bridge blast doors not working."
diff --git a/html/changelogs/AutoChangeLog-pr-1158.yml b/html/changelogs/AutoChangeLog-pr-1158.yml
new file mode 100644
index 0000000000..0cb4ddd10d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1158.yml
@@ -0,0 +1,4 @@
+author: "Steelpoint"
+delete-after: True
+changes:
+ - rscadd: "ERT, non-red alert, Security Response Officers spawn with a Tactical Energy Gun. This is a military variant of the Egun that, in addition to laser and disable rounds, has access to stun rounds."
diff --git a/icons/effects/station_explosion.dmi b/icons/effects/station_explosion.dmi
index bddc66e137..385818b011 100644
Binary files a/icons/effects/station_explosion.dmi and b/icons/effects/station_explosion.dmi differ
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 7f6f85b004..c8fc98d4f5 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 33149a3e2e..24323f5cf3 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/sound/weapons/autoguninsert.ogg b/sound/weapons/autoguninsert.ogg
new file mode 100644
index 0000000000..f68139968e
Binary files /dev/null and b/sound/weapons/autoguninsert.ogg differ
diff --git a/sound/weapons/bulletinsert.ogg b/sound/weapons/bulletinsert.ogg
new file mode 100644
index 0000000000..789ee15b08
Binary files /dev/null and b/sound/weapons/bulletinsert.ogg differ
diff --git a/sound/weapons/bulletremove.ogg b/sound/weapons/bulletremove.ogg
new file mode 100644
index 0000000000..4d1ec70973
Binary files /dev/null and b/sound/weapons/bulletremove.ogg differ
diff --git a/sound/weapons/magin.ogg b/sound/weapons/magin.ogg
new file mode 100644
index 0000000000..8908bb2f4f
Binary files /dev/null and b/sound/weapons/magin.ogg differ
diff --git a/sound/weapons/magout.ogg b/sound/weapons/magout.ogg
new file mode 100644
index 0000000000..ca91915bd4
Binary files /dev/null and b/sound/weapons/magout.ogg differ
diff --git a/sound/weapons/sawclose.ogg b/sound/weapons/sawclose.ogg
new file mode 100644
index 0000000000..f33a06059f
Binary files /dev/null and b/sound/weapons/sawclose.ogg differ
diff --git a/sound/weapons/sawopen.ogg b/sound/weapons/sawopen.ogg
new file mode 100644
index 0000000000..c6da68e323
Binary files /dev/null and b/sound/weapons/sawopen.ogg differ
diff --git a/sound/weapons/shotguninsert.ogg b/sound/weapons/shotguninsert.ogg
new file mode 100644
index 0000000000..189324493c
Binary files /dev/null and b/sound/weapons/shotguninsert.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 2d2e35f59e..d7d2b0949d 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1472,7 +1472,6 @@
#include "code\modules\mining\abandoned_crates.dm"
#include "code\modules\mining\aux_base.dm"
#include "code\modules\mining\aux_base_camera.dm"
-#include "code\modules\mining\equipment.dm"
#include "code\modules\mining\fulton.dm"
#include "code\modules\mining\machine_input_output_plates.dm"
#include "code\modules\mining\machine_processing.dm"
@@ -1487,6 +1486,13 @@
#include "code\modules\mining\ores_coins.dm"
#include "code\modules\mining\satchel_ore_boxdm.dm"
#include "code\modules\mining\shelters.dm"
+#include "code\modules\mining\equipment\explorer_gear.dm"
+#include "code\modules\mining\equipment\kinetic_crusher.dm"
+#include "code\modules\mining\equipment\lazarus_injector.dm"
+#include "code\modules\mining\equipment\mineral_scanner.dm"
+#include "code\modules\mining\equipment\resonator.dm"
+#include "code\modules\mining\equipment\vendor_items.dm"
+#include "code\modules\mining\equipment\wormhole_jaunter.dm"
#include "code\modules\mining\laborcamp\laborshuttle.dm"
#include "code\modules\mining\laborcamp\laborstacker.dm"
#include "code\modules\mining\lavaland\ash_flora.dm"