diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
index f713d4e31d8..c2a31e4d761 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
@@ -871,7 +871,7 @@
"aqM" = (/obj/structure/table,/obj/item/weapon/storage/box/evidence,/obj/item/weapon/storage/box/evidence,/obj/item/weapon/storage/box/evidence,/obj/item/weapon/hand_labeler,/turf/simulated/floor/plasteel{tag = "icon-vault (SOUTHEAST)"; icon_state = "vault"; dir = 6},/area/security/warden)
"aqN" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/warden)
"aqO" = (/obj/structure/filingcabinet/security{pixel_x = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 28},/turf/simulated/floor/plasteel{tag = "icon-vault (SOUTHWEST)"; icon_state = "vault"; dir = 10},/area/security/warden)
-"aqP" = (/obj/structure/rack,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/item/weapon/storage/lockbox/loyalty,/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/security/warden)
+"aqP" = (/obj/structure/rack,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/item/weapon/storage/lockbox/mindshield,/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/security/warden)
"aqQ" = (/obj/structure/rack,/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/security/warden)
"aqR" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/warden)
"aqS" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/pod_3)
diff --git a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm
index 86d30d99fa3..62e480cd89e 100644
--- a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm
+++ b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm
@@ -7,20 +7,20 @@
"ag" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission/BMPship/Fore)
"ah" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"},/area/awaymission/BMPship/Fore)
"ai" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/awaymission/BMPship/Fore)
-"aj" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
-"ak" = (/obj/machinery/porta_turret{dir = 8; emagged = 1; installation = /obj/item/weapon/gun/energy/lasercannon},/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
+"aj" = (/mob/living/simple_animal/hostile/carp,/turf/space,/area/space)
+"ak" = (/obj/machinery/porta_turret{lethal = 1; name = "ship defense turret"},/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
"al" = (/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
-"am" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/awaymission/BMPship/Fore)
-"an" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
-"ao" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/awaymission/BMPship/Fore)
-"ap" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
-"aq" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
+"am" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
+"an" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/awaymission/BMPship/Aft)
+"ao" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
+"ap" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
+"aq" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
"ar" = (/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
"as" = (/obj/structure/lattice,/turf/space,/area/space)
-"at" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
-"au" = (/obj/machinery/light/small,/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
-"av" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"},/area/awaymission/BMPship/Fore)
-"aw" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/awaymission/BMPship/Fore)
+"at" = (/obj/machinery/light/small,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
+"au" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; equipment = 0; lighting = 0; locked = 0; operating = 0; pixel_y = 24; req_access = ""},/turf/simulated/floor/plasteel{tag = "icon-carpet"; icon_state = "carpet"},/area/awaymission/BMPship/Fore)
+"av" = (/obj/structure/table,/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
+"aw" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; environ = 0; equipment = 3; locked = 0; operating = 0; req_access = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"ax" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission/BMPship/Aft)
"ay" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"},/area/awaymission/BMPship/Aft)
"az" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"},/area/awaymission/BMPship/Aft)
@@ -122,8 +122,8 @@
"cr" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"cs" = (/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"ct" = (/obj/structure/kitchenspike,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
-"cu" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c500,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
-"cv" = (/obj/structure/closet/crate,/obj/item/device/analyzer,/obj/item/stack/spacecash/c10,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
+"cu" = (/obj/structure/closet/crate,/obj/item/device/analyzer,/obj/item/stack/spacecash/c10,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
+"cv" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c500,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"cw" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"cx" = (/obj/machinery/door_control{id = "packerCargo"; pixel_y = -24},/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"cy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
@@ -131,7 +131,7 @@
"cA" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship/Fore)
"cB" = (/turf/simulated/floor/plasteel{tag = "icon-carpet"; icon_state = "carpet"},/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/awaymission/BMPship/Fore)
"cC" = (/turf/simulated/floor/plasteel{tag = "icon-carpet"; icon_state = "carpet"},/area/awaymission/BMPship/Fore)
-"cD" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; locked = 0; pixel_y = 24; req_access = ""},/turf/simulated/floor/plasteel{tag = "icon-carpet"; icon_state = "carpet"},/area/awaymission/BMPship/Fore)
+"cD" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/computer/monitor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaymission/BMPship/Aft)
"cE" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/awaymission/BMPship/Midship)
"cF" = (/obj/structure/table,/obj/item/weapon/screwdriver,/obj/item/weapon/screwdriver,/obj/item/weapon/paper{info = "The next person who takes one of my screwdrivers gets stabbed with one. They are MINE. - Love, Madsen"; name = "scribbled note"},/obj/item/weapon/screwdriver,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
"cG" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
@@ -188,7 +188,7 @@
"dF" = (/obj/effect/landmark{name = "awaystart"},/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/BMPship/Aft)
"dG" = (/obj/item/weapon/crowbar,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/BMPship/Aft)
"dH" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaymission/BMPship/Aft)
-"dI" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; environ = 0; equipment = 3; locked = 0; req_access = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
+"dI" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/BMPship/Aft)
"dJ" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
"dK" = (/obj/structure/table,/obj/item/weapon/paper{info = "I'm no scientist, but judging from the design and components, it seems to be some kind of gateway. This thing is gonna be worth a lot of cash to the right man. The boys are excited, as they have every right to be, and I've let them crack into that case of beer we got. I normally wouldn't allow such a thing, but this is a time for celebration! It's not like a couple drinks will hurt anything."; name = "Captain's log entry"},/turf/simulated/floor/plasteel{tag = "icon-carpet6-0 (EAST)"; icon_state = "carpet6-0"; dir = 4},/area/awaymission/BMPship/Fore)
"dL" = (/obj/structure/table,/turf/simulated/floor/plasteel{tag = "icon-carpet14-2 (EAST)"; icon_state = "carpet14-2"; dir = 4},/area/awaymission/BMPship/Fore)
@@ -204,14 +204,14 @@
"dV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
"dW" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
"dX" = (/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/BMPship/Aft)
-"dY" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/BMPship/Aft)
+"dY" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"dZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"ea" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"eb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
-"ec" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
+"ec" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"ed" = (/obj/item/device/multitool,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
"ee" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (EAST)"; icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel/airless{tag = "icon-engine"; icon_state = "engine"},/area/awaymission/BMPship/Aft)
-"ef" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c10,/turf/simulated/floor/plasteel,/area/awaymission/BMPship/Aft)
+"ef" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; locked = 0; operating = 0; req_access = ""},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
"eg" = (/turf/simulated/floor/plasteel{tag = "icon-carpet15-15 (EAST)"; icon_state = "carpet15-15"; dir = 4},/area/awaymission/BMPship/Fore)
"eh" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor/plasteel{tag = "icon-carpet5-0 (EAST)"; icon_state = "carpet5-0"; dir = 4},/area/awaymission/BMPship/Fore)
"ei" = (/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-carpet13-1 (EAST)"; icon_state = "carpet13-1"; dir = 4},/area/awaymission/BMPship/Fore)
@@ -229,7 +229,7 @@
"eu" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaymission/BMPship/Aft)
"ev" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/BMPship/Aft)
"ew" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
-"ex" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
+"ex" = (/obj/machinery/power/smes/magical{desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; name = "power storage unit"; outputting = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"ey" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"ez" = (/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
"eA" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
@@ -240,7 +240,7 @@
"eF" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
"eG" = (/obj/machinery/shieldwallgen,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/awaymission/BMPship/Midship)
"eH" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
-"eI" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; locked = 0; req_access = ""},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship)
+"eI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"eJ" = (/turf/simulated/floor/plasteel{tag = "icon-loadingareadirty2 (EAST)"; icon_state = "loadingareadirty2"; dir = 4},/area/awaymission/BMPship/Midship)
"eK" = (/obj/machinery/conveyor{dir = 4; id = "meatConvey1"},/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Midship)
"eL" = (/obj/machinery/conveyor{dir = 4; id = "meatConvey1"},/obj/structure/plasticflaps,/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Midship)
@@ -253,9 +253,9 @@
"eS" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
"eT" = (/obj/structure/rack,/obj/item/weapon/storage/box/lights,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaymission/BMPship/Aft)
"eU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/BMPship/Aft)
-"eV" = (/obj/machinery/power/smes/magical{desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; name = "power storage unit"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
+"eV" = (/obj/machinery/power/smes/magical{desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; name = "power storage unit"; outputting = 0},/obj/structure/cable,/obj/structure/cable,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"eW" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/terminal{dir = 8},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
-"eX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
+"eX" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"eY" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
"eZ" = (/obj/structure/table,/turf/simulated/floor/plasteel{tag = "icon-carpet7-3 (EAST)"; icon_state = "carpet7-3"; dir = 4},/area/awaymission/BMPship/Fore)
"fa" = (/obj/structure/stool/bed/chair/office{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-carpet11-12 (EAST)"; icon_state = "carpet11-12"; dir = 4},/area/awaymission/BMPship/Fore)
@@ -276,7 +276,7 @@
"fp" = (/obj/effect/gibspawner/human,/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
"fq" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
"fr" = (/obj/structure/rack,/obj/item/weapon/storage/belt/utility/full,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaymission/BMPship/Aft)
-"fs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
+"fs" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"ft" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/awaymission/BMPship/Aft)
"fu" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-carpet15-7 (EAST)"; icon_state = "carpet15-7"; dir = 4},/area/awaymission/BMPship/Fore)
"fv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-carpet15-13 (EAST)"; icon_state = "carpet15-13"; dir = 4},/area/awaymission/BMPship/Fore)
@@ -290,7 +290,7 @@
"fD" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
"fE" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"},/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
"fF" = (/obj/structure/rack,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaymission/BMPship/Aft)
-"fG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
+"fG" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/BMPship/Aft)
"fH" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
"fI" = (/turf/simulated/floor/plasteel{tag = "icon-carpetside (SOUTHWEST)"; icon_state = "carpetside"; dir = 10},/area/awaymission/BMPship/Fore)
"fJ" = (/turf/simulated/floor/plasteel{tag = "icon-carpetside (SOUTHEAST)"; icon_state = "carpetside"; dir = 6},/area/awaymission/BMPship/Fore)
@@ -305,8 +305,8 @@
"fS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/BMPship/Aft)
"fT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/BMPship/Aft)
"fU" = (/obj/effect/gibspawner/generic,/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
-"fV" = (/obj/machinery/power/smes/magical{desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; name = "power storage unit"},/obj/structure/cable,/obj/structure/cable,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
-"fW" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
+"fV" = (/obj/machinery/porta_turret{check_synth = 1; lethal = 1; name = "ship defense turret"},/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
+"fW" = (/obj/structure/closet,/obj/item/clothing/head/bio_hood,/obj/item/clothing/suit/bio_suit,/obj/item/clothing/gloves/color/black,/turf/simulated/floor/plating,/area/awaymission)
"fX" = (/obj/effect/decal/cleanable/cobweb,/obj/machinery/power/port_gen/pacman/super,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
"fY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-carpet15-15 (EAST)"; icon_state = "carpet15-15"; dir = 4},/area/awaymission/BMPship/Fore)
"fZ" = (/obj/structure/closet,/turf/simulated/floor/plasteel{tag = "icon-carpet15-15 (EAST)"; icon_state = "carpet15-15"; dir = 4},/area/awaymission/BMPship/Fore)
@@ -332,7 +332,7 @@
"gt" = (/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
"gu" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
"gv" = (/obj/item/stack/cable_coil,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
-"gw" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
+"gw" = (/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/plating,/area/awaymission)
"gx" = (/obj/item/stack/sheet/mineral/uranium{amount = 50},/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
"gy" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/space)
"gz" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/awaymission/BMPship/Fore)
@@ -360,7 +360,7 @@
"gV" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/food/snacks/meat,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/BMPship/Aft)
"gW" = (/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/BMPship/Aft)
"gX" = (/obj/structure/reagent_dispensers,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/BMPship/Aft)
-"gY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
+"gY" = (/obj/machinery/porta_turret{check_synth = 1; lethal = 1; name = "ship defense turret"},/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
"gZ" = (/turf/simulated/shuttle/wall{tag = "icon-swallc2"; icon_state = "swallc2"},/area/awaymission/BMPship/Aft)
"ha" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/turf/simulated/shuttle/wall{dir = 3; icon_state = "swall_f10"; layer = 2; tag = "icon-swall_f10"},/area/awaymission/BMPship/Fore)
"hb" = (/obj/structure/computerframe{anchored = 1},/turf/simulated/floor/plating/airless{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/awaymission/BMPship/Fore)
@@ -440,18 +440,39 @@
"ix" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/awaymission/BMPship/Aft)
"iy" = (/obj/item/weapon/caution,/turf/simulated/floor/plating/airless,/area/awaymission)
"iz" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating/airless,/area/awaymission)
+"iA" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c10,/turf/simulated/floor/plasteel,/area/awaymission/BMPship/Aft)
"iB" = (/obj/structure/sink{dir = 2},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/awaymission/BMPship/Aft)
"iC" = (/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship/Aft)
"iD" = (/obj/item/clothing/gloves/color/yellow,/turf/space,/area/awaymission)
"iE" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall4"},/area/awaymission)
"iF" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission)
-"iG" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
-"iH" = (/obj/item/weapon/storage/box/matches,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
-"iI" = (/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
-"iJ" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/awaymission/BMPship/Fore)
-"iK" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship/Fore)
-"iL" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
+"iG" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
+"iH" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
+"iI" = (/obj/item/weapon/storage/box/matches,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
+"iJ" = (/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
+"iK" = (/turf/simulated/floor/plating,/area/awaymission)
+"iL" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/grenade/chem_grenade/drugs,/turf/simulated/floor/plating,/area/awaymission)
"iM" = (/turf/simulated/mineral/random/high_chance_clown,/area/awaymission)
+"iN" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating,/area/awaymission)
+"iO" = (/obj/item/ammo_casing{pixel_y = 3},/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plating,/area/awaymission)
+"iP" = (/obj/effect/decal/cleanable/blood/drip,/obj/item/clothing/mask/gas/syndicate,/turf/simulated/floor/plating,/area/awaymission)
+"iQ" = (/obj/machinery/door/airlock/external{name = "Crackden Airlock"},/turf/simulated/floor/plating,/area/awaymission)
+"iR" = (/obj/machinery/door/airlock/external{name = "Plain Airlock"},/turf/simulated/floor/plating,/area/awaymission)
+"iS" = (/mob/living/simple_animal/hostile/carp,/turf/simulated/floor/plating/airless/asteroid,/area/awaymission)
+"iT" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship/Aft)
+"iU" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/floor/plating,/area/awaymission)
+"iV" = (/obj/item/ammo_casing{pixel_y = 3},/turf/simulated/floor/plating,/area/awaymission)
+"iW" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
+"iX" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/drugs/meth,/obj/item/weapon/reagent_containers/glass/beaker/drugs/meth,/obj/item/weapon/reagent_containers/glass/beaker/drugs/meth,/turf/simulated/floor/plating,/area/awaymission)
+"iY" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/awaymission)
+"iZ" = (/obj/item/weapon/reagent_containers/food/snacks/chips,/turf/simulated/floor/plating,/area/awaymission)
+"ja" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave,/turf/simulated/floor/plating,/area/awaymission)
+"jb" = (/obj/machinery/chem_dispenser,/turf/simulated/floor/plating,/area/awaymission)
+"jc" = (/obj/machinery/chem_master,/turf/simulated/floor/plating,/area/awaymission)
+"jd" = (/obj/machinery/floodlight{in_use = 1},/turf/simulated/floor/plating,/area/awaymission)
+"je" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/awaymission)
+"jf" = (/turf/space,/area/crew_quarters/bar)
+"jg" = (/turf/space,/area/exploration/methlab)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -501,54 +522,54 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafagagahagawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajakalamanaoawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapalalaqararaoawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaaaaaaaaaaaaaaaaaaaaaaaatakauamarararavawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaaCaxaxayaxcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamakezdhaoancoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaaaajaaaaaaapezezeybdbdancoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaaaaaaaaaaaaaaaaaaaaaaaaqakatdhbdbdbdcWcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaEaxaxaxaxaxaxaxaxaxayaxaxaxazaAaBaCazazaxaDcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaasaFaGaHaIaJaKaLaMaNaOaPaQaRaSaTaUaVaVaVaVaVaVaWcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafagagahagagagagagagagaiaaaaaaaaaaaaasaXaYaHaHaZaHaHaHbaaHaHbbbcbdbdbebdbdbfbgbhbdbibjaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkblbmbnbobpbqbpbqbpbrbsaaaaaaaaaaasbtaYaHbuaHaHaHaGaHbvaNaNbwbxbybdbzbdbdbAbBbCbDbdbjaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEbFbGbnbHararararararbIaaaaaaasaEaFaHbuaYaHbuaHaHaHaZaHaHaHbJbcbKbdbdbdbdbLbMbNbdbdbOaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPbQbFbnarbRbRbSbRbRbTbUaaaaaaaEbVbtbuaHbWbXaHaHaHbYaHbWbYaHaPbccacbcccccdccccccccbyceaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacfcgchcicjckclclclclclcmclclclcmcnaxaxaxaxaAcpcpcpaCaxaxaxaxbVcqcrcsctcrcrcvcucwcxcyczaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCcDcCcEcFcGcHcIcJcKcIcLcGcMcNcOcPcQcRcMcMcMcMcScTcUcScVcWaxaxaxaxaxaxaxaxayaAcXaCcncoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacfcgchcicjckclclclclclcmclclclcmcnaxaxaxaxaAcpcpcpaCaxaxaxaxbVcqcrcsctcrcrcucvcwcxcyczaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCaucCcEcFcGcHcIcJcKcIcLcGcMcNcOcPcQcRcMcMcMcMcScTcUavcVcWaxaxaxaxaxaxaxaxayaAcXaCcncoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcYcZcYdacCcEcMdbcHdcdcdcdccLcMcMdddedededfcMcMcMcMdgdgcMdgcMdhdididjdkdldmdldnaPdodpdqdrazaxaycoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCdsdtdsdudvcEcMcMcHdcdwdcdccLcMcMdxdydzdAdBcMcMcMcMcMcMcMcMcMaPdjdCdjbJdDdEdFdGaPdHdpdododIdJcWazaxcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCdKdLdMdNdOcEcMcMdPdQdQbZdQdScMcMdTcMdUdVdVdVdVdVdVdVdVdVdWcMdhdjdXdjdraxaxaxaxbVdHdYdZeaebecbbedeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciegegegeheiejekelddemeneoeoeoeoeoeodWcMddcMepcMeqerererererererepcMaPdjesdjdjdjdjdjetaPeuevbdewbdexeyezeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeAeBeCegcYcZcYcZeDeEeoeFererererereGeHcMeIcMepeJeKeLeKeKeKeKeMeNeOePbbdjeseQeReReSdjdjaPeTeUbdeVeWeXbJezeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeYeZfaegfbdtdsdtfcdTcMcMerfdfefdfffgepfhepcMepcMfierererererererepfjfkflfmfnfofpfqdjdjaPfreUbdewbdfscWayaxftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeYeZfaegcYfufvfwfxddcMcMerfdfdfgfffgfyeofzeofAcMcMcMcMcMfBcMcMcMepcMfCdjesfDfofofEdjdjaPfFevfoewbdfGcWazaxcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafHfIfJegdsfKdsdtcCfLcMcMerfMfdfgfNfgepcMfOcMepcMcMfPcMcMcMcMcMcMfQdVfRfSfTfDfUfofEdjdjaPfFevfofVeWfWbbfXeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUegegegegfYegfZgadTemcMerfdfggbffgcepcMdTcMepcMeqerererererererepgdgeflfmfngffoggdjetaPeuevfobdbddJeyezeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaghahagaggigjagagaggkcMcMerfgfgfgglfgepgmddcMepgngogpgqgqgqgqeMeNeOgrbJdjesgsgtgtgudjdjaPdHeUbdgvbdgwbJgxeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCdsdtdsdudvcEcMcMcHdcdwdcdccLcMcMdxdydzdAdBcMcMcMcMcMcMcMcMcMaPdjdCdjbJdDdEdFdGaPdHdpdodoawdJcWazaxcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCdKdLdMdNdOcEcMcMdPdQdQbZdQdScMcMdTcMdUdVdVdVdVdVdVdVdVdVdWcMdhdjdXdjdraxaxaxaxbVcDdIdZeaebdYbbedeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciegegegeheiejekelddemeneoeoeoeoeoeodWcMddcMepcMeqerererererererepcMaPdjesdjdjdjdjdjetaPeuevbdecbdbKeyezeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeAeBeCegcYcZcYcZeDeEeoeFererererereGeHcMefcMepeJeKeLeKeKeKeKeMeNeOePbbdjeseQeReReSdjdjaPeTeUbdexeWeIbJezeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeYeZfaegfbdtdsdtfcdTcMcMerfdfefdfffgepfhepcMepcMfierererererererepfjfkflfmfnfofpfqdjdjaPfreUbdewbdeccWayaxftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeYeZfaegcYfufvfwfxddcMcMerfdfdfgfffgfyeofzeofAcMcMcMcMcMfBcMcMcMepcMfCdjesfDfofofEdjdjaPfFevfoewbdewcWazaxcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafHfIfJegdsfKdsdtcCfLcMcMerfMfdfgfNfgepcMfOcMepcMcMfPcMcMcMcMcMcMfQdVfRfSfTfDfUfofEdjdjaPfFevfoeVeWeXbbfXeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUegegegegfYegfZgadTemcMerfdfggbffgcepcMdTcMepcMeqerererererererepgdgeflfmfngffoggdjetaPeuevfobdbdbdeyezeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaghahagaggigjagagaggkcMcMerfgfgfgglfgepgmddcMepgngogpgqgqgqgqeMeNeOgrbJdjesgsgtgtgudjdjaPdHeUbdgvbdfsbJgxeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagygzgAgBgCgDgEgFcEcMcMererererereGgGcMdxcMepcMgHerererererererepcMaPdjgIgJgJgJgKdjgLaPdHevdqdogMgNcWayaxftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasgOgPgAgQgRgScEcMcMcMcMcMcMcMcMgTcMdTcMgUeoeoeoeoeoeodVdVdVeFcMdhgVdjdjdjdjesgWgXaPdHgYfogZayaxazftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaaaaasaaaaaaaahahbhcgBgScEcMhdcMcMcMcMhecMhfhecNcMhdcMcMcMhdcMcMcMcMhdcMcMcWaxaAhgaCaAhhaCaxazaAhiaCcnftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaasgOgPgAgQgRgScEcMcMcMcMcMcMcMcMgTcMdTcMgUeoeoeoeoeoeodVdVdVeFcMdhgVdjdjdjfGesgWgXaPdHecfogZayaxazftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaaajasaaaaaaaahahbhcgBgScEcMhdcMcMcMcMhecMhfhecNcMhdcMcMcMhdcMcMcMcMhdcMcMcWaxaAhgaCaAhhaCaxazaAhiaCcnftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjacaaasaahkasaahlagaghmhnhoclclclclclclclhphqhrhsclclclclclclclclclclclclclbVdqdqdqdqhtdphuhvhwhtevhxaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjacaaaaaaaaaahyakhzcihAhBhChDgzhEgBhFhjhjhjhjhGacachHhIachJhHachKhLhMhNhOaPhPdqbddqdqhQhRhRhRhRhShTaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhUaaaaaaaaaahValalhWhXgOhXhChYhXhChjhjhjhjhjhjhFachZiahHibicididhHhHhHhHbbhudqdqiedqifdqiedqdqdqigaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjacihaaaaaaaaaaiiakalbUgBgBhCgzhCgBhChFhjhjhjhFhjhjhjacijacididididhHhHikiliminininininiodqdqdqaCaxaxbVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaipacafagagiqagirhjhChFhjhjhjhjhjhjhjhjhjhjhjhIhZididibidhHishHhHbJdqdqitiudqiedqiedqiviwixaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhFachZhHhHhKiyiyiyizaPefefdqbddqdqdqdqdqbJiBiCftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjacaaaaajaaaahyfVhzcihAhBhChDgzhEgBhFhjhjhjhjhGacachHhIachJhHachKhLhMhNhOaPhPdqbddqdqhQhRhRhRhRhShTaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhUajaaaaaaaahValalhWhXgOhXhChYhXhChjhjhjhjhjhjhFachZiahHibicididhHhHhHhHbbhudqdqiedqifdqiedqdqdqigaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjacihaaaaaaaaaaiifValbUgBgBhCgzhCgBhChFhjhjhjhFhjhjhjacijacididididhHhHikiliminininininiodqdqdqaCaxaxbVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaajipacafagagiqagirhjhChFhjhjhjhjhjhjhjhjhjhjhjhIhZididibidhHishHhHbJdqdqitiudqiedqiedqiviwixaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhFachZhHhHhKiyiyiyizaPiAiAdqbddqdqdqdqdqbJiBiCftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiDacacachjhjhjhjhjhjhjhjhjhjhjhFhjhjhjhjhjhjhjhjhFiEiFiFiFiFiFiFiFazaxaxaxayaAhgaCayayazaxftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacacaaaaaaaaaaiGakhzciiHariIaviJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacacaaaaaaaaaaapalalaqarariKiJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacacaaaaaaaaaaiLakalbUaniKiJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaachjhjacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacacaaaaaaaaaaafagagiqagiJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhjacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjfWhjgwhjhjhjhjhjhjhjacacaaaaaaiGgYiHbbiIbdiJcWftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjiLiKiKiNiPiOiKiQiKiKiRaciSaaaaaaapezezeybdbdiTftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjiUiKiKiViKiKiKiKhjhjhjhjacacaaaaaaiWgYezbJaoiTftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaachjhjacachjhjhjhjhjhjhjhjhjhjhjhjhjhjiXiKiYiKiKiKiKiZiKhjacacacaaajaaaaaCaxaxazaxftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjjaiKiKjbjciKjdhjhjacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhjacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjjejdhjhjiKhjhjacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhjacacachjhjiMhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhjacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhjacacachjhjhjhjhjhjiMhjhjhjhjhjhjhjhjhjhjhjacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhjacacachjhjhjiMhjhjiMhjhjhjhjhjhjhjhjhjacacacachjhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjacacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacachjhjhjhjhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjacacacacacachjhjhjhjhjhjhjhjhjhjhjhjacacacachjhjhjhjhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacachjhjhjhjhjhjhjhjacacacacaaaaaahjhjhjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhjacacachjhjhjhjhjhjiMhjhjhjhjhjhjhjhjhjhjhjacacacacaaaaaaaajfaaaaaajgjgaajgjgjgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhjacacachjhjhjiMhjhjiMhjhjhjhjhjhjhjhjhjacacacachjhjaaaaaaaaaaaajgjgjgjgjgjgjgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjacacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacachjhjhjhjhjaaaaaaaaaajgjgjgjgaajgjgjgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjacacacacacachjhjhjhjhjhjhjhjhjhjhjhjacacacachjhjhjhjhjaaaaaaaaaajgjgjgjgaajgjgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacachjhjhjhjhjhjhjhjacacacacaaaaaahjhjhjaaaaaaaaaaaajgjgjgaaaajgjgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaajgjgjgaaaajgjgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/RandomZLevels/centcomAway.dmm b/_maps/map_files/RandomZLevels/centcomAway.dmm
index 392cb1df725..ead97277ac7 100644
--- a/_maps/map_files/RandomZLevels/centcomAway.dmm
+++ b/_maps/map_files/RandomZLevels/centcomAway.dmm
@@ -770,9 +770,9 @@
"oP" = (/obj/structure/reagent_dispensers/water_cooler,/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/awaymission/centcomAway/thunderdome)
"oQ" = (/mob/living/simple_animal/hostile/russian/ranged{loot = list(/obj/effect/landmark/mobcorpse/russian/ranged)},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"oR" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/thunderdome)
-"oS" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/hatchet,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome)
+"oS" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/weapon/hatchet,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome)
"oT" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome)
-"oU" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/hatchet,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome)
+"oU" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/weapon/hatchet,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/thunderdome)
"oV" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"oW" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/thunderdome)
"oX" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/thunderdome)
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index c92b7a15630..fe0d5aaed3f 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -777,7 +777,7 @@
"aoW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/flasher/portable,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"aoX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/armoury)
"aoY" = (/obj/structure/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/box/handcuffs,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/box/teargas{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"aoZ" = (/obj/structure/rack,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/lockbox/loyalty,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
+"aoZ" = (/obj/structure/rack,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/lockbox/mindshield,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"apa" = (/obj/structure/table,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/lock_buster,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"apb" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/security/armoury)
"apc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/light{dir = 8},/obj/structure/closet/secure_closet/security,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/seceqstorage)
@@ -6010,7 +6010,7 @@
"clD" = (/obj/machinery/optable,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
"clE" = (/obj/machinery/vending/medical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
"clF" = (/obj/machinery/light,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"clG" = (/obj/structure/table,/obj/item/weapon/storage/lockbox/loyalty,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
+"clG" = (/obj/structure/table,/obj/item/weapon/storage/lockbox/mindshield,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"clH" = (/obj/structure/table,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"clI" = (/obj/item/weapon/ore/silver,/obj/item/weapon/ore/silver,/obj/structure/closet/crate,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/quartermaster/miningdock)
"clJ" = (/obj/machinery/camera{c_tag = "Mining Dock External"; dir = 8},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/quartermaster/miningdock)
diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm
index 9a0255b509d..a5692e0ca1e 100644
--- a/_maps/map_files/cyberiad/z2.dmm
+++ b/_maps/map_files/cyberiad/z2.dmm
@@ -253,6 +253,7 @@
"eS" = (/turf/unsimulated/floor{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/centcom/control)
"eT" = (/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/centcom/specops)
"eU" = (/obj/structure/table/woodentable,/obj/item/stack/spacecash,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
+"eV" = (/obj/structure/rack,/obj/item/weapon/implanter/adrenalin{pixel_x = 12; pixel_y = -12},/obj/item/weapon/implanter/emp{pixel_x = 9; pixel_y = -9},/obj/item/weapon/implanter/explosive{pixel_x = 6; pixel_y = -6},/obj/item/weapon/implanter/explosive_macro{pixel_x = 3; pixel_y = -3},/obj/item/weapon/implanter/freedom,/obj/item/weapon/implanter/krav_maga{pixel_x = -9; pixel_y = 9},/obj/item/weapon/implanter/mindshield{pixel_x = -6; pixel_y = 6},/obj/item/weapon/implanter/storage{pixel_x = -3; pixel_y = 3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"eX" = (/obj/structure/flora/tree/pine,/turf/simulated/floor/holofloor{tag = "icon-snow"; icon_state = "snow"},/area/holodeck/source_snowfield)
"eY" = (/obj/structure/table/woodentable,/turf/simulated/floor/holofloor{tag = "icon-grimy"; icon_state = "grimy"; dir = 2},/area/holodeck/source_meetinghall)
"eZ" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_basketball)
@@ -485,7 +486,6 @@
"jE" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/twohanded/staff/broom,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"jF" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/twohanded/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"jG" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/holding{pixel_x = -3; pixel_y = 3},/obj/item/weapon/storage/backpack/satchel,/obj/item/weapon/storage/backpack/holding{pixel_x = -6; pixel_y = 6},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
-"jH" = (/obj/structure/rack,/obj/item/weapon/implanter/adrenalin{pixel_x = 12; pixel_y = -12},/obj/item/weapon/implanter/emp{pixel_x = 9; pixel_y = -9},/obj/item/weapon/implanter/explosive{pixel_x = 6; pixel_y = -6},/obj/item/weapon/implanter/explosive_macro{pixel_x = 3; pixel_y = -3},/obj/item/weapon/implanter/freedom,/obj/item/weapon/implanter/krav_maga{pixel_x = -9; pixel_y = 9},/obj/item/weapon/implanter/loyalty{pixel_x = -6; pixel_y = 6},/obj/item/weapon/implanter/storage{pixel_x = -3; pixel_y = 3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"jI" = (/turf/space,/area/adminconstruction)
"jJ" = (/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
"jK" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/light,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
@@ -1621,7 +1621,7 @@ aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbW
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNDZDKDKDKDKDKEdDADTDKDUDKDVDWDXDYDADvaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfEgDKEaEbEcDKEiDADKDKDKDKDKDKDKEeDIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNiQDAiRDKDKDKDKDKjfDAEjDKEkDKElDWDXDYEfaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAjGEhDKDKDKEhjHDADKDKDKDKDKDKDKEmDADvaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAjGEhDKDKDKEheVDADKDKDKDKDKDKDKEmDADvaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDuaNDADwDwDMEoDMDwDwDwDwDwDMEpDMDwDwDwEnaNDtDwEqErErEsDwDuaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDADwDwEtDKDKDKDKDKDKDKDKDKDKDKDKEuDAEnaNDvDwEvEwExEyEwEzDwjIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEBDKECDKDKDKDKDKDKDKDKDKDKDKDKDKDKDAaNaNaNEDEEEFEwEwEwEGEDaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index 80086cd75f9..1d7f436770d 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -53,15 +53,11 @@ Pipelines + Other Objects -> Pipe network
stored = new(src, make_from = src)
/obj/machinery/atmospherics/Destroy()
- if(stored)
- qdel(stored)
- stored = null
+ QDEL_NULL(stored)
for(var/mob/living/L in src) //ventcrawling is serious business
L.remove_ventcrawl()
L.forceMove(get_turf(src))
- if(pipe_image)
- qdel(pipe_image) //we have to del it, or it might keep a ref somewhere else
- pipe_image = null
+ QDEL_NULL(pipe_image) //we have to del it, or it might keep a ref somewhere else
return ..()
// Icons/overlays/underlays
diff --git a/code/ATMOSPHERICS/pipes/pipe.dm b/code/ATMOSPHERICS/pipes/pipe.dm
index f319e563835..05c5d18df99 100644
--- a/code/ATMOSPHERICS/pipes/pipe.dm
+++ b/code/ATMOSPHERICS/pipes/pipe.dm
@@ -21,8 +21,7 @@
/obj/machinery/atmospherics/pipe/Destroy()
releaseAirToTurf()
- qdel(air_temporary)
- air_temporary = null
+ QDEL_NULL(air_temporary)
var/turf/T = loc
for(var/obj/machinery/meter/meter in T)
diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm
index 7004e6c55fb..28c1a7e6860 100644
--- a/code/LINDA/LINDA_turf_tile.dm
+++ b/code/LINDA/LINDA_turf_tile.dm
@@ -70,8 +70,7 @@
/turf/simulated/Destroy()
visibilityChanged()
- if(active_hotspot)
- qdel(active_hotspot)
+ QDEL_NULL(active_hotspot)
return ..()
/turf/simulated/assume_air(datum/gas_mixture/giver)
diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm
index 6771d8062fc..4126fe1725f 100644
--- a/code/__DEFINES/hud.dm
+++ b/code/__DEFINES/hud.dm
@@ -7,7 +7,7 @@
#define STATUS_HUD "2" // a simple line rounding the mob's number health
#define ID_HUD "3" // the job asigned to your ID
#define WANTED_HUD "4" // wanted, released, parroled, security status
-#define IMPLOYAL_HUD "5" // loyality implant
+#define IMPMINDSHIELD_HUD "5" // mindshield implant
#define IMPCHEM_HUD "6" // chemical implant
#define IMPTRACK_HUD "7" // tracking implant
#define DIAG_STAT_HUD "8" // Silicon/Mech Status
diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm
index 5a96b6e954f..97cea621dae 100644
--- a/code/__DEFINES/mob.dm
+++ b/code/__DEFINES/mob.dm
@@ -124,6 +124,9 @@
#define islarva(A) (istype((A), /mob/living/carbon/alien/larva))
#define isslime(A) (istype((A), /mob/living/carbon/slime))
+//Human sub-species
+#define isabductor(A) (is_species(A, "Abductor"))
+
#define isanimal(A) (istype((A), /mob/living/simple_animal))
#define iscorgi(A) (istype((A), /mob/living/simple_animal/pet/corgi))
#define ismouse(A) (istype((A), /mob/living/simple_animal/mouse))
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 2c989753bf9..0abf2ac1af3 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -363,6 +363,13 @@ proc/add_logs(mob/user, mob/target, what_done, var/object=null, var/addition=nul
if(progress)
qdel(progbar)
+/proc/is_species(A, species_name)
+ . = FALSE
+ if(ishuman(A))
+ var/mob/living/carbon/human/H = A
+ if(H.get_species() == species_name)
+ . = TRUE
+
/proc/admin_mob_info(mob/M, mob/user = usr)
if(!ismob(M))
to_chat(user, "This can only be used on instances of type /mob")
diff --git a/code/__HELPERS/qdel.dm b/code/__HELPERS/qdel.dm
new file mode 100644
index 00000000000..e8a11f27a66
--- /dev/null
+++ b/code/__HELPERS/qdel.dm
@@ -0,0 +1,2 @@
+#define QDEL_IN(item, time) addtimer(GLOBAL_PROC, "qdel", time, FALSE, item)
+#define QDEL_NULL(item) if(item) { qdel(item); item = null }
\ No newline at end of file
diff --git a/code/_globalvars/station.dm b/code/_globalvars/station.dm
index f08afe5efb9..6d2578e5b88 100644
--- a/code/_globalvars/station.dm
+++ b/code/_globalvars/station.dm
@@ -1,7 +1,7 @@
var/global/datum/datacore/data_core = null
var/CELLRATE = 0.002 // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second)
-var/CHARGELEVEL = 0.0005 // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
+var/CHARGELEVEL = 0.001 // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
var/list/powernets = list()
var/list/deferred_powernet_rebuilds = list()
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index 29e7c676ac4..08fe2347cb4 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -54,8 +54,7 @@
qdel(hide_actions_toggle)
hide_actions_toggle = null
- qdel(module_store_icon)
- module_store_icon = null
+ QDEL_NULL(module_store_icon)
if(static_inventory.len)
for(var/thing in static_inventory)
diff --git a/code/controllers/Processes/shuttles.dm b/code/controllers/Processes/shuttles.dm
index b6b078323e9..c027a63b902 100644
--- a/code/controllers/Processes/shuttles.dm
+++ b/code/controllers/Processes/shuttles.dm
@@ -160,6 +160,8 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
/datum/controller/process/shuttle/proc/canRecall()
if(emergency.mode != SHUTTLE_CALL)
return
+ if(!emergency.canRecall)
+ return
if(ticker.mode.name == "meteor")
return
if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED)
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 62a2bd9a39d..0bec4e37d35 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -29,8 +29,7 @@
Remove(owner)
if(target)
target = null
- qdel(button)
- button = null
+ QDEL_NULL(button)
return ..()
/datum/action/proc/Grant(mob/M)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 57124aae742..886661d4fdb 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -157,7 +157,7 @@
var/mob/living/carbon/human/H = current
if(ishuman(current))
/** Impanted**/
- if(isloyal(H))
+ if(ismindshielded(H))
text = "Mindshield Implant:Remove|Implanted"
else
text = "Mindshield Implant:No Implant|Implant him!"
@@ -167,7 +167,7 @@
if(ticker.mode.config_tag=="revolution")
text += uppertext(text)
text = "[text]: "
- if(isloyal(H))
+ if(ismindshielded(H))
text += "NO|headrev|rev"
else if(src in ticker.mode.head_revolutionaries)
text += "no|HEADREV|rev"
@@ -203,7 +203,7 @@
if(ticker.mode.config_tag=="cult")
text = uppertext(text)
text = "[text]: "
- if(isloyal(H))
+ if(ismindshielded(H))
text += "NO|cultist"
else if(src in ticker.mode.cult)
text += "no|CULTIST"
@@ -657,7 +657,7 @@
switch(href_list["implant"])
if("remove")
- for(var/obj/item/weapon/implant/loyalty/I in H.contents)
+ for(var/obj/item/weapon/implant/mindshield/I in H.contents)
if(I && I.implanted)
I.removed(H)
qdel(I)
@@ -665,7 +665,7 @@
log_admin("[key_name(usr)] has deactivated [key_name(current)]'s mindshield implant")
message_admins("[key_name_admin(usr)] has deactivated [key_name_admin(current)]'s mindshield implant")
if("add")
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
+ var/obj/item/weapon/implant/mindshield/L = new/obj/item/weapon/implant/mindshield(H)
L.imp_in = H
L.implanted = 1
H.sec_hud_set_implants()
diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm
index 8dea043eea5..9bc700ebabe 100644
--- a/code/datums/outfits/outfit_admin.dm
+++ b/code/datums/outfits/outfit_admin.dm
@@ -218,7 +218,7 @@
if(istype(I))
apply_to_card(I, H, get_centcom_access("Nanotrasen Navy Officer"), "Nanotrasen Navy Officer")
- var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/loyalty(H)
+ var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/mindshield(H)
L.imp_in = H
L.implanted = 1
H.sec_hud_set_implants()
@@ -250,7 +250,7 @@
/obj/item/weapon/reagent_containers/hypospray/combat/nanites = 1,
/obj/item/weapon/storage/box/zipties = 1,
/obj/item/clothing/shoes/magboots/advance = 1,
- /obj/item/weapon/implanter/loyalty = 1,
+ /obj/item/weapon/implanter/mindshield = 1,
)
/datum/outfit/admin/nt_special_ops_officer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
@@ -329,7 +329,7 @@
if(istype(I))
apply_to_card(I, H, get_centcom_access("Nanotrasen Navy Captain"), "Nanotrasen Navy Captain")
- var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/loyalty(H)
+ var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/mindshield(H)
L.imp_in = H
L.implanted = 1
H.sec_hud_set_implants()
@@ -755,7 +755,7 @@
if(istype(I))
apply_to_card(I, H, get_centcom_access("Emergency Response Team Member"), "Emergency Response Team Member")
- var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/loyalty(H)
+ var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/mindshield(H)
L.imp_in = H
L.implanted = 1
H.sec_hud_set_implants()
diff --git a/code/datums/spell.dm b/code/datums/spell.dm
index 652f54af440..d32d5bac058 100644
--- a/code/datums/spell.dm
+++ b/code/datums/spell.dm
@@ -100,7 +100,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
var/action_icon = 'icons/mob/actions.dmi'
var/action_icon_state = "spell_default"
var/action_background_icon_state = "bg_spell"
-
+
var/sound = null //The sound the spell makes when it is cast
/obj/effect/proc_holder/spell/proc/cast_check(skipcharge = 0, mob/living/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell
@@ -184,8 +184,8 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
user.visible_message(invocation, invocation_emote_self) //same style as in mob/living/emote.dm
/obj/effect/proc_holder/spell/proc/playMagSound()
- playsound(get_turf(usr), sound,50,1)
-
+ playsound(get_turf(usr), sound,50,1)
+
/obj/effect/proc_holder/spell/New()
..()
action = new(src)
@@ -194,8 +194,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
charge_counter = charge_max
/obj/effect/proc_holder/spell/Destroy()
- qdel(action)
- action = null
+ QDEL_NULL(action)
return ..()
/obj/effect/proc_holder/spell/Click()
@@ -223,10 +222,10 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
spawn(0)
if(charge_type == "recharge" && recharge)
start_recharge()
-
+
if(sound)
- playMagSound()
-
+ playMagSound()
+
if(prob(critfailchance))
critfail(targets)
else
diff --git a/code/datums/spells/charge.dm b/code/datums/spells/charge.dm
index 1551dbc3b68..7f9a02bc01a 100644
--- a/code/datums/spells/charge.dm
+++ b/code/datums/spells/charge.dm
@@ -26,9 +26,9 @@
if(M.mind)
for(var/obj/effect/proc_holder/spell/S in M.mind.spell_list)
S.charge_counter = S.charge_max
- to_chat(M, "you feel raw magic flowing through you, it feels good!")
+ to_chat(M, "You feel raw magical energy flowing through you, it feels good!")
else
- to_chat(M, "you feel very strange for a moment, but then it passes.")
+ to_chat(M, "You feel very strange for a moment, but then it passes.")
burnt_out = 1
charged_item = M
break
@@ -62,11 +62,12 @@
break
else if(istype(item, /obj/item/weapon/stock_parts/cell/))
var/obj/item/weapon/stock_parts/cell/C = item
- if(prob(80))
- C.maxcharge -= 200
- if(C.maxcharge <= 1) //Div by 0 protection
- C.maxcharge = 1
- burnt_out = 1
+ if(!C.self_recharge)
+ if(prob(80))
+ C.maxcharge -= 200
+ if(C.maxcharge <= 1) //Div by 0 protection
+ C.maxcharge = 1
+ burnt_out = 1
C.charge = C.maxcharge
charged_item = C
break
@@ -75,17 +76,18 @@
for(I in item.contents)
if(istype(I, /obj/item/weapon/stock_parts/cell/))
var/obj/item/weapon/stock_parts/cell/C = I
- if(prob(80))
- C.maxcharge -= 200
- if(C.maxcharge <= 1) //Div by 0 protection
- C.maxcharge = 1
- burnt_out = 1
+ if(!C.self_recharge)
+ if(prob(80))
+ C.maxcharge -= 200
+ if(C.maxcharge <= 1) //Div by 0 protection
+ C.maxcharge = 1
+ burnt_out = 1
C.charge = C.maxcharge
item.update_icon()
charged_item = item
break
if(!charged_item)
- to_chat(L, "you feel magical power surging to your hands, but the feeling rapidly fades...")
+ to_chat(L, "You feel magical power surging to your hands, but the feeling rapidly fades...")
else if(burnt_out)
to_chat(L, "[charged_item] doesn't seem to be reacting to the spell...")
else
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index e4eda250cf9..4e624696a10 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -376,9 +376,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/////// Implants & etc
-/datum/supply_packs/security/armory/loyalty
+/datum/supply_packs/security/armory/mindshield
name = "Mindshield Implants Crate"
- contains = list (/obj/item/weapon/storage/lockbox/loyalty)
+ contains = list (/obj/item/weapon/storage/lockbox/mindshield)
cost = 40
containername = "mindshield implant crate"
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 3f0b51bf1e0..1cf08abebd0 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -352,6 +352,7 @@ var/list/uplink_items = list()
/datum/uplink_item/jobspecific/poison_pen
name = "Poison Pen"
desc = "Cutting edge of deadly writing implements technology, this gadget will infuse any piece of paper with delayed contact poison."
+ reference = "PP"
item = /obj/item/weapon/pen/poison
cost = 2
excludefrom = list(/datum/game_mode/nuclear)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index a7d464fb9db..b5d25c7f5a1 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -76,12 +76,10 @@
qdel(AA)
alternate_appearances = null
- if(reagents)
- qdel(reagents)
- reagents = null
+ QDEL_NULL(reagents)
invisibility = 101
return ..()
-
+
//Hook for running code when a dir change occurs
/atom/proc/setDir(newdir)
dir = newdir
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index 240c53b0025..2a6aa2b3a39 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -41,7 +41,7 @@
hud_icons = list(ID_HUD)
/datum/atom_hud/data/human/security/advanced
- hud_icons = list(ID_HUD, IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD, WANTED_HUD)
+ hud_icons = list(ID_HUD, IMPTRACK_HUD, IMPMINDSHIELD_HUD, IMPCHEM_HUD, WANTED_HUD)
/datum/atom_hud/data/diagnostic
hud_icons = list (DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD, DIAG_TRACK_HUD)
@@ -172,7 +172,7 @@
/mob/living/carbon/human/proc/sec_hud_set_implants()
var/image/holder
- for(var/i in list(IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD))
+ for(var/i in list(IMPTRACK_HUD, IMPMINDSHIELD_HUD, IMPCHEM_HUD))
holder = hud_list[i]
holder.icon_state = null
for(var/obj/item/weapon/implant/I in src)
@@ -180,8 +180,8 @@
if(istype(I,/obj/item/weapon/implant/tracking))
holder = hud_list[IMPTRACK_HUD]
holder.icon_state = "hud_imp_tracking"
- else if(istype(I,/obj/item/weapon/implant/loyalty))
- holder = hud_list[IMPLOYAL_HUD]
+ else if(istype(I,/obj/item/weapon/implant/mindshield))
+ holder = hud_list[IMPMINDSHIELD_HUD]
holder.icon_state = "hud_imp_loyal"
else if(istype(I,/obj/item/weapon/implant/chem))
holder = hud_list[IMPCHEM_HUD]
diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm
index e1f4309598e..6a7fa32c5c3 100644
--- a/code/game/gamemodes/autotraitor/autotraitor.dm
+++ b/code/game/gamemodes/autotraitor/autotraitor.dm
@@ -91,7 +91,7 @@
if(player.current) // Remove mindshield-implanted mobs from the list
if(ishuman(player.current))
var/mob/living/carbon/human/H = player.current
- for(var/obj/item/weapon/implant/loyalty/I in H.contents)
+ for(var/obj/item/weapon/implant/mindshield/I in H.contents)
if(I && I.implanted)
possible_traitors -= player
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index bce324ade0c..ff7c74a6fbb 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -19,7 +19,7 @@ var/global/list/all_cults = list()
return 0
if(ishuman(mind.current))
var/mob/living/carbon/human/H = mind.current
- if(isloyal(H))
+ if(ismindshielded(H))
return 0
if(issilicon(mind.current))
return 0 //can't convert machines, that's ratvar's thing
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index e5c11ac387d..6ab24e1d8b4 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -173,8 +173,8 @@
/obj/item/clothing/suit/hooded/cultrobes/berserker
name = "flagellant's robes"
desc = "Blood-soaked robes infused with dark magic; allows the user to move at inhuman speeds, but at the cost of increased damage."
- icon_state = "hardsuit-beserker"
- item_state = "hardsuit-beserker"
+ icon_state = "hardsuit-berserker"
+ item_state = "hardsuit-berserker"
flags_inv = HIDEJUMPSUIT
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
diff --git a/code/game/gamemodes/cult/cult_objectives.dm b/code/game/gamemodes/cult/cult_objectives.dm
index 2fe00023c20..4b30bbd37b0 100644
--- a/code/game/gamemodes/cult/cult_objectives.dm
+++ b/code/game/gamemodes/cult/cult_objectives.dm
@@ -145,6 +145,19 @@
message_admins("Last Cult Objective: [last_objective]")
log_admin("Last Cult Objective: [last_objective]")
+/datum/game_mode/cult/proc/get_possible_sac_targets()
+ var/list/possible_sac_targets = list()
+ for(var/mob/living/carbon/human/player in player_list)
+ if(player.mind && !is_convertable_to_cult(player.mind) && (player.stat != DEAD))
+ possible_sac_targets += player.mind
+ if(!possible_sac_targets.len)
+ //There are no living Unconvertables on the station. Looking for a Sacrifice Target among the ordinary crewmembers
+ for(var/mob/living/carbon/human/player in player_list)
+ if(is_secure_level(player.z)) //We can't sacrifice people that are on the centcom z-level
+ continue
+ if(player.mind && !(player.mind in cult) && (player.stat != DEAD))//make DAMN sure they are not dead
+ possible_sac_targets += player.mind
+ return possible_sac_targets
/datum/game_mode/cult/proc/pick_objective()
var/list/possible_objectives = list()
@@ -153,19 +166,7 @@
possible_objectives |= "bloodspill"
if(!sacrificed.len)
- var/list/possible_targets = list()
- for(var/mob/living/carbon/human/player in player_list)
- if(player.mind && !is_convertable_to_cult(player.mind) && (player.stat != DEAD))
- possible_targets += player.mind
-
- if(!possible_targets.len)
- //There are no living Unconvertables on the station. Looking for a Sacrifice Target among the ordinary crewmembers
- for(var/mob/living/carbon/human/player in player_list)
- if(is_secure_level(player.z)) //We can't sacrifice people that are on the centcom z-level
- continue
- if(player.mind && !(player.mind in cult) && (player.stat != DEAD))//make DAMN sure they are not dead
- possible_targets += player.mind
-
+ var/list/possible_targets = get_possible_sac_targets()
if(possible_targets.len > 0)
sacrifice_target = pick(possible_targets)
possible_objectives |= "sacrifice"
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 8d7d8883fdb..e0be012f328 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -102,7 +102,7 @@
If any are found, the user can choose which rune to send to. Upon activation, the rune teleports everything above it to the selected rune.
"
text += "Rite of Enlightenment
This rune is critical to the success of the cult. It will allow you to convert normal crew members into cultists. \
- To do this, simply place the crew member upon the rune and invoke it. This rune requires two invokers to use. If the target to be converted is loyalty-implanted or a certain assignment, they will \
+ To do this, simply place the crew member upon the rune and invoke it. This rune requires two invokers to use. If the target to be converted is mindshielded or a certain assignment, they will \
be unable to be converted. People [ticker.mode.cultdat.entity_title3] wishes sacrificed will also be ineligible for conversion, and anyone with a shielding presence like the null rod will not be converted.
\
Successful conversions will produce a tome for the new cultist.
"
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 15fdfc6f61c..14fe620cc3c 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -323,7 +323,7 @@ var/list/teleport_runes = list()
//Rite of Enlightenment: Converts a normal crewmember to the cult. Faster for every cultist nearby.
/obj/effect/rune/convert
cultist_name = "Rite of Enlightenment"
- cultist_desc = "converts a normal crewmember on top of it to the cult. Does not work on loyalty-implanted crew."
+ cultist_desc = "converts a normal crewmember on top of it to the cult. Does not work on mindshielded crew."
invocation = "Mah'weyh pleggh at e'ntrath!"
icon_state = "3"
req_cultists = 2
@@ -336,7 +336,7 @@ var/list/teleport_runes = list()
var/turf/T = get_turf(src)
for(var/mob/living/M in T.contents)
- if(!iscultist(M) && !isloyal(M))
+ if(!iscultist(M) && !ismindshielded(M))
convertees.Add(M)
if(!convertees.len)
fail_invoke()
@@ -937,6 +937,7 @@ var/list/teleport_runes = list()
icon_state = "6"
construct_invoke = 0
color = rgb(200, 0, 0)
+ var/list/summoned_guys = list()
/obj/effect/rune/manifest/New(loc)
..()
@@ -968,7 +969,7 @@ var/list/teleport_runes = list()
if(O.client && !jobban_isbanned(O, ROLE_CULTIST) && !jobban_isbanned(O, ROLE_SYNDICATE))
ghosts_on_rune |= O
var/mob/dead/observer/ghost_to_spawn = pick(ghosts_on_rune)
- var/mob/living/carbon/human/dummy/new_human = new(get_turf(src))
+ var/mob/living/carbon/human/new_human = new(get_turf(src))
new_human.real_name = ghost_to_spawn.real_name
new_human.alpha = 150 //Makes them translucent
new_human.color = "grey" //heh..cult greytide...litterly...
@@ -983,6 +984,7 @@ var/list/teleport_runes = list()
N.mouse_opacity = 0
new_human.key = ghost_to_spawn.key
ticker.mode.add_cultist(new_human.mind, 0)
+ summoned_guys |= new_human
to_chat(new_human, "You are a servant of [ticker.mode.cultdat.entity_title3]. You have been made semi-corporeal by the cult of [ticker.mode.cultdat.entity_name], and you are to serve them at all costs.")
while(user in get_turf(src))
@@ -997,4 +999,13 @@ var/list/teleport_runes = list()
"Your link to the world fades. Your form breaks apart.")
for(var/obj/I in new_human)
new_human.unEquip(I)
+ summoned_guys -= new_human
new_human.dust()
+
+/obj/effect/rune/manifest/Destroy()
+ for(var/mob/living/carbon/human/guy in summoned_guys)
+ for(var/obj/I in guy)
+ guy.unEquip(I)
+ guy.dust()
+ summoned_guys.Cut()
+ return ..()
diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm
index 13a9e4ec814..0d04c3ee615 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction.dm
@@ -252,7 +252,7 @@
V.flags |= NODROP
agent.equip_to_slot_or_del(V, slot_wear_suit)
agent.equip_to_slot_or_del(new /obj/item/weapon/abductor_baton(agent), slot_in_backpack)
- agent.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/decloner/alien(agent), slot_in_backpack)
+ agent.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/alien(agent), slot_in_backpack)
agent.equip_to_slot_or_del(new /obj/item/device/abductor/silencer(agent), slot_in_backpack)
agent.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/abductor(agent), slot_head)
agent.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/military/abductor/full(agent), slot_belt)
@@ -376,9 +376,23 @@
explanation_text = "Steal all"
/datum/objective/abductee/steal/New()
- var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap"))
+ var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap", "weapons", "computers", "organs"))
explanation_text+=" [target]."
+/datum/objective/abductee/paint
+ explanation_text = "The station is hideous. You must color it all"
+
+/datum/objective/abductee/paint/New()
+ var/color = pick(list("red", "blue", "green", "yellow", "orange", "purple", "black", "in rainbows", "in blood"))
+ explanation_text+= " [color]!"
+
+/datum/objective/abductee/speech
+ explanation_text = "Your brain is broken... you can only communicate in"
+
+/datum/objective/abductee/speech/New()
+ var/style = pick(list("pantomime", "rhyme", "haiku", "extended metaphors", "riddles", "extremely literal terms", "sound effects", "military jargon"))
+ explanation_text+= " [style]."
+
/datum/objective/abductee/capture
explanation_text = "Capture"
@@ -418,16 +432,16 @@
explanation_text = "Start a collection of corpses. Don't kill people to get these corpses."
/datum/objective/abductee/floors
- explanation_text = "Replace all the floor tiles with carpeting, wooden boards, or grass."
+ explanation_text = "Replace all the floor tiles with wood, carpeting, grass or bling."
/datum/objective/abductee/POWERUNLIMITED
explanation_text = "Flood the station's powernet with as much electricity as you can."
/datum/objective/abductee/pristine
- explanation_text = "Ensure the station is in absolutely pristine condition."
+ explanation_text = "The CEO of Nanotrasen is coming! Ensure the station is in absolutely pristine condition."
-/datum/objective/abductee/window
- explanation_text = "Replace all normal windows with reinforced windows."
+/datum/objective/abductee/nowalls
+ explanation_text = "The crew must get to know one another better. Break down the walls inside the station!"
/datum/objective/abductee/nations
explanation_text = "Ensure your department prospers over all else."
@@ -435,17 +449,11 @@
/datum/objective/abductee/abductception
explanation_text = "You have been changed forever. Find the ones that did this to you and give them a taste of their own medicine."
-/datum/objective/abductee/ghosts
- explanation_text = "Conduct a seance with the spirits of the afterlife."
-
/datum/objective/abductee/summon
- explanation_text = "Conduct a ritual to summon an elder god."
+ explanation_text = "The elder gods hunger. Gather a cult and conduct a ritual to summon one."
/datum/objective/abductee/machine
- explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power."
-
-/datum/objective/abductee/prevent
- explanation_text = "You have been enlightened. This knowledge must not escape. Ensure nobody else can become enlightened."
+ explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power so the AI may acknowledge you at last."
/datum/objective/abductee/calling
explanation_text = "Call forth a spirit from the other side."
@@ -453,7 +461,7 @@
/datum/objective/abductee/calling/New()
var/mob/dead/D = pick(dead_mob_list)
if(D)
- explanation_text = "You know that [D] has perished. Call them from the spirit realm."
+ explanation_text = "You know that [D] has perished. Hold a seance to call them from the spirit realm."
/datum/objective/abductee/social_experiment
explanation_text = "This is a secret social experiment conducted by Nanotrasen. Convince the crew that this is the truth."
@@ -465,7 +473,7 @@
explanation_text = "Nanotrasen is abusing the animals! Save as many as you can!"
/datum/objective/abductee/defect
- explanation_text = "Defect from your employer."
+ explanation_text = "Fuck the system! Defect from the station and start an independent colony in space, Mining Outpost or the derelict. Recruit crewmates if you can."
/datum/objective/abductee/promote
explanation_text = "Climb the corporate ladder all the way to the top!"
@@ -478,3 +486,33 @@
/datum/objective/abductee/pragnant
explanation_text = "You are pregnant and soon due. Find a safe place to deliver your baby."
+
+/datum/objective/abductee/engine
+ explanation_text = "Go have a good conversation with the singularity/tesla/supermatter crystal. Bonus points if it responds."
+
+/datum/objective/abductee/music
+ explanation_text = "You burn with passion for music. Share your vision. If anyone hates it, beat them on the head with your instrument!"
+
+/datum/objective/abductee/clown
+ explanation_text = "The clown is not funny. You can do better! Steal his audience and make the crew laugh!"
+
+/datum/objective/abductee/party
+ explanation_text = "You're throwing a huge rager. Make it as awesome as possible so the whole crew comes... OR ELSE!"
+
+/datum/objective/abductee/pets
+ explanation_text = "All the pets around here suck. You need to make them cooler. Replace them with exotic beasts!"
+
+/datum/objective/abductee/conspiracy
+ explanation_text = "The leaders of this station are hiding a grand, evil conspiracy. Only you can learn what it is, and expose it to the people!"
+
+/datum/objective/abductee/stalker
+ explanation_text = "The Syndicate has hired you to compile dossiers on all important members of the crew. Be sure they don't know you're doing it."
+
+/datum/objective/abductee/narrator
+ explanation_text = "You're the narrator of this tale. Follow around the protagonists to tell their story."
+
+/datum/objective/abductee/lurve
+ explanation_text = "You are doomed to feel woefully incomplete forever... until you find your true love on this station. They're waiting for you!"
+
+/datum/objective/abductee/sixthsense
+ explanation_text = "You died back there and went to heaven... or is it hell? No one here seems to know they're dead. Convince them, and maybe you can escape this limbo."
\ No newline at end of file
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index 8f026650b7c..2a72c4a9b9b 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -11,7 +11,7 @@
icon_state = "vest_stealth"
item_state = "armor"
blood_overlay_type = "armor"
- origin_tech = "materials=5;biotech=4;powerstorage=5;abductor=3"
+ origin_tech = "magnets=7;biotech=4;powerstorage=4;abductor=4"
armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15)
actions_types = list(/datum/action/item_action/hands_free/activate)
var/mode = VEST_STEALTH
@@ -34,7 +34,6 @@
mode = VEST_STEALTH
armor = stealth_armor
icon_state = "vest_stealth"
-
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
H.update_inv_wear_suit()
@@ -64,7 +63,6 @@
M.overlays = disguise.overlays
M.update_inv_r_hand()
M.update_inv_l_hand()
- return
/obj/item/clothing/suit/armor/abductor/vest/proc/DeactivateStealth()
if(!stealth_active)
@@ -77,7 +75,6 @@
M.name_override = null
M.overlays.Cut()
M.regenerate_icons()
- return
/obj/item/clothing/suit/armor/abductor/vest/hit_reaction()
DeactivateStealth()
@@ -115,19 +112,11 @@
if(combat_cooldown==initial(combat_cooldown))
processing_objects.Remove(src)
-/obj/item/device/abductor/proc/IsAbductor(user)
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- if(H.get_species() != "Abductor")
- return 0
- return 1
- return 0
-
/obj/item/device/abductor/proc/AbductorCheck(user)
- if(IsAbductor(user))
- return 1
+ if(isabductor(user))
+ return TRUE
to_chat(user, "You can't figure how this works!")
- return 0
+ return FALSE
/obj/item/device/abductor/proc/ScientistCheck(user)
var/mob/living/carbon/human/H = user
@@ -140,7 +129,7 @@
icon = 'icons/obj/abductor.dmi'
icon_state = "gizmo_scan"
item_state = "gizmo"
- origin_tech = "materials=5;magnets=5;bluespace=6;abductor=4"
+ origin_tech = "engineering=7;magnets=4;bluespace=4;abductor=3"
var/mode = GIZMO_SCAN
var/mob/living/marked = null
var/obj/machinery/abductor/console/console
@@ -187,7 +176,7 @@
mark(target, user)
/obj/item/device/abductor/gizmo/proc/scan(atom/target, mob/living/user)
- if(istype(target,/mob/living/carbon/human))
+ if(ishuman(target))
if(console!=null)
console.AddSnapshot(target)
to_chat(user, "You scan [target] and add them to the database.")
@@ -196,8 +185,8 @@
if(marked == target)
to_chat(user, "This specimen is already marked!")
return
- if(istype(target,/mob/living/carbon/human))
- if(IsAbductor(target))
+ if(ishuman(target))
+ if(isabductor(target))
marked = target
to_chat(user, "You mark [target] for future retrieval.")
else
@@ -221,7 +210,7 @@
icon = 'icons/obj/abductor.dmi'
icon_state = "silencer"
item_state = "silencer"
- origin_tech = "materials=5;magnets=5;abductor=3"
+ origin_tech = "materials=4;programming=7;abductor=3"
/obj/item/device/abductor/silencer/attack(mob/living/M, mob/user)
if(!AbductorCheck(user))
@@ -258,61 +247,15 @@
if(!istype(I,/obj/item/device/radio/headset))
r.broadcasting = 0 //goddamned headset hacks
-
-/obj/item/weapon/implant/abductor
- name = "recall implant"
- desc = "Returns you to the mothership."
- icon = 'icons/obj/abductor.dmi'
- icon_state = "implant"
- activated = 1
- origin_tech = "materials=2;biotech=3;magnets=4;bluespace=5;abductor=5"
- var/obj/machinery/abductor/pad/home
- var/cooldown = 30
-
-/obj/item/weapon/implant/abductor/activate()
- if(cooldown == initial(cooldown))
- home.Retrieve(imp_in,1)
- cooldown = 0
- processing_objects.Add(src)
- else
- to_chat(imp_in, "You must wait [30 - cooldown] seconds to use [src] again!")
- return
-
-/obj/item/weapon/implant/abductor/process()
- if(cooldown < initial(cooldown))
- cooldown++
- if(cooldown == initial(cooldown))
- processing_objects.Remove(src)
-
-/obj/item/weapon/implant/abductor/implant(var/mob/source, var/mob/user)
- if(..())
- var/obj/machinery/abductor/console/console
- if(ishuman(source))
- var/mob/living/carbon/human/H = source
- if(H.get_species() == "Abductor")
- console = get_team_console(H.mind.abductor.team)
- home = console.pad
-
- if(!home)
- console = get_team_console(pick(1, 2, 3, 4))
- home = console.pad
- return 1
-
-/obj/item/weapon/implant/abductor/proc/get_team_console(var/team)
- var/obj/machinery/abductor/console/console
- for(var/obj/machinery/abductor/console/c in abductor_equipment)
- if(c.team == team)
- console = c
- break
- return console
-
-/obj/item/weapon/gun/energy/decloner/alien
+/obj/item/weapon/gun/energy/alien
name = "alien pistol"
desc = "A complicated gun that fires bursts of high-intensity radiation."
+ ammo_type = list(/obj/item/ammo_casing/energy/declone)
+ restricted_species = list("Abductor")
icon_state = "alienpistol"
item_state = "alienpistol"
- origin_tech = "combat=5;materials=4;powerstorage=3;abductor=3"
- restricted_species = list("Abductor")
+ origin_tech = "combat=4;magnets=7;powerstorage=3;abductor=3"
+ trigger_guard = TRIGGER_GUARD_ALLOW_ALL
/obj/item/weapon/paper/abductor
name = "Dissection Guide"
@@ -321,25 +264,29 @@
1.Acquire fresh specimen.
- 2.Put the specimen on operating table
- 3.Apply scalpel to the chest, preparing for dissection
- 4.Apply scalpel to specimen torso
- 5.Clamp bleeders on the specimen's torso
- 6.Retract skin from specimen's torso
- 7.Saw through the specimen's torso
- 8.Retract skin from specimen's torso again
- 9.Search through the specimen's torso with your hands to remove their heart
- 10.Insert replacement gland (Retrieve one from gland storage)
- 11.Cauterize the patient's torso
- 12.Consider dressing the specimen back to not disturb the habitat
- 13.Put the specimen in the experiment machinery
- 14.Choose one of the machine options and follow displayed instructions
+ 2.Put the specimen on operating table.
+ 3.Apply scalpel to the chest, preparing for experimental dissection.
+ 4.Apply scalpel to specimen's torso.
+ 5.Clamp bleeders on specimen's torso with a hemostat.
+ 6.Retract skin of specimen's torso with a retractor.
+ 7.Saw through the specimen's torso with a saw.
+ 8.Apply retractor again to specimen's torso.
+ 9.Search through the specimen's torso with your hands to remove any superfluous organs.
+ 10.Insert replacement gland (Retrieve one from gland storage).
+ 11.Cauterize the patient's torso with a cautery.
+ 12.Consider dressing the specimen back to not disturb the habitat.
+ 13.Put the specimen in the experiment machinery.
+ 14.Choose one of the machine options. The target will be analyzed and teleported to the selected drop-off point.
+ 15.You will receive one supply credit, and the subject will be counted towards your quota.
-Congratulations! You are now trained for xenobiology research!"}
+Congratulations! You are now trained for invasive xenobiology research!"}
/obj/item/weapon/paper/abductor/update_icon()
return
+/obj/item/weapon/paper/abductor/AltClick()
+ return
+
#define BATON_STUN 0
#define BATON_SLEEP 1
#define BATON_CUFF 2
@@ -354,9 +301,9 @@ Congratulations! You are now trained for xenobiology research!"}
icon_state = "wonderprodStun"
item_state = "wonderprod"
slot_flags = SLOT_BELT
- origin_tech = "materials=6;combat=5;biotech=7;abductor=4"
+ origin_tech = "materials=4;combat=4;biotech=7;abductor=4"
force = 7
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
actions_types = list(/datum/action/item_action/toggle_mode)
/obj/item/weapon/abductor_baton/proc/toggle(mob/living/user=usr)
@@ -393,16 +340,8 @@ Congratulations! You are now trained for xenobiology research!"}
icon_state = "wonderprodProbe"
item_state = "wonderprodProbe"
-/obj/item/weapon/abductor_baton/proc/IsAbductor(mob/living/user)
- if(!ishuman(user))
- return 0
- var/mob/living/carbon/human/H = user
- if(H.get_species() != "Abductor")
- return 0
- return 1
-
/obj/item/weapon/abductor_baton/attack(mob/target, mob/living/user)
- if(!IsAbductor(user))
+ if(!isabductor(user))
return
if(isrobot(target))
@@ -434,7 +373,7 @@ Congratulations! You are now trained for xenobiology research!"}
/obj/item/weapon/abductor_baton/attack_self(mob/living/user)
toggle(user)
- if(istype(user,/mob/living/carbon/human))
+ if(ishuman(user))
var/mob/living/carbon/human/H = user
H.update_inv_l_hand()
H.update_inv_r_hand()
@@ -456,10 +395,9 @@ Congratulations! You are now trained for xenobiology research!"}
H.forcesay(hit_appends)
add_logs(user, L, "stunned")
- return
/obj/item/weapon/abductor_baton/proc/SleepAttack(mob/living/L,mob/living/user)
- if(L.stunned)
+ if(L.stunned || L.sleeping)
L.visible_message("[user] has induced sleep in [L] with [src]!", \
"You suddenly feel very drowsy!")
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
@@ -470,7 +408,6 @@ Congratulations! You are now trained for xenobiology research!"}
to_chat(user, "Sleep inducement works fully only on stunned specimens! ")
L.visible_message("[user] tried to induce sleep in [L] with [src]!", \
"You suddenly feel drowsy!")
- return
/obj/item/weapon/abductor_baton/proc/CuffAttack(mob/living/L,mob/living/user)
if(!iscarbon(L))
@@ -488,7 +425,6 @@ Congratulations! You are now trained for xenobiology research!"}
add_logs(user, C, "handcuffed")
else
to_chat(user, "You fail to handcuff [C].")
- return
/obj/item/weapon/abductor_baton/proc/ProbeAttack(mob/living/L,mob/living/user)
L.visible_message("[user] probes [L] with [src]!", \
@@ -502,7 +438,7 @@ Congratulations! You are now trained for xenobiology research!"}
species = "[H.species.name]"
if(L.mind && L.mind.changeling)
species = "Changeling lifeform"
- var/obj/item/organ/internal/gland/temp = locate() in H.internal_organs
+ var/obj/item/organ/internal/heart/gland/temp = locate() in H.internal_organs
if(temp)
helptext = "Experimental gland detected!"
else
@@ -517,7 +453,7 @@ Congratulations! You are now trained for xenobiology research!"}
icon_state = "cuff_white" // Needs sprite
breakouttime = 450
trashtype = /obj/item/weapon/restraints/handcuffs/energy/used
- origin_tech = "materials=2;magnets=5;abductor=2"
+ origin_tech = "materials=4;magnets=5;abductor=2"
/obj/item/weapon/restraints/handcuffs/energy/used
desc = "energy discharge"
@@ -545,36 +481,42 @@ Congratulations! You are now trained for xenobiology research!"}
/obj/item/weapon/scalpel/alien
name = "alien scalpel"
+ desc = "It's a gleaming sharp knife made out of silvery-green metal."
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
toolspeed = 0.25
/obj/item/weapon/hemostat/alien
name = "alien hemostat"
+ desc = "You've never seen this before."
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
toolspeed = 0.25
/obj/item/weapon/retractor/alien
name = "alien retractor"
+ desc = "You're not sure if you want the veil pulled back."
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
toolspeed = 0.25
/obj/item/weapon/circular_saw/alien
name = "alien saw"
+ desc = "Do the aliens also lose this, and need to find an alien hatchet?"
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
toolspeed = 0.25
/obj/item/weapon/surgicaldrill/alien
name = "alien drill"
+ desc = "Maybe alien surgeons have finally found a use for the drill."
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
toolspeed = 0.25
/obj/item/weapon/cautery/alien
name = "alien cautery"
+ desc = "Why would bloodless aliens have a tool to stop bleeding? Unless..."
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
toolspeed = 0.25
@@ -585,17 +527,12 @@ Congratulations! You are now trained for xenobiology research!"}
icon_state = "alienhelmet"
item_state = "alienhelmet"
blockTracking = 1
- origin_tech = "materials=6;magnets=5;abductor=3"
+ origin_tech = "materials=7;magnets=4;abductor=3"
flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
// Operating Table / Beds / Lockers
-/obj/machinery/optable/abductor
- icon = 'icons/obj/abductor.dmi'
- icon_state = "bed"
- no_icon_updates = 1 //no icon updates for this; it's static.
-
/obj/structure/stool/bed/abductor
name = "resting contraption"
desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?"
@@ -628,6 +565,16 @@ Congratulations! You are now trained for xenobiology research!"}
new /obj/structure/table/abductor(src.loc)
qdel(src)
return
+ if(istype(I, /obj/item/stack/sheet/mineral/silver))
+ var/obj/item/stack/sheet/P = I
+ if(P.get_amount() < 1)
+ to_chat(user, "You need one sheet of silver to do this!")
+ return
+ to_chat(user, "You start adding [P] to [src]...")
+ if(do_after(user, 50, target = src))
+ P.use(1)
+ new /obj/machinery/optable/abductor(loc)
+ qdel(src)
/obj/structure/table/abductor
name = "alien table"
@@ -637,10 +584,15 @@ Congratulations! You are now trained for xenobiology research!"}
canSmoothWith = null
parts = /obj/item/stack/sheet/mineral/abductor
+/obj/machinery/optable/abductor
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "bed"
+ no_icon_updates = 1 //no icon updates for this; it's static.
+
/obj/structure/closet/abductor
name = "alien locker"
desc = "Contains secrets of the universe."
icon_state = "abductor"
icon_closed = "abductor"
icon_opened = "abductoropen"
- material_drop = /obj/item/stack/sheet/mineral/abductor
+ material_drop = /obj/item/stack/sheet/mineral/abductor
\ No newline at end of file
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
index 6021140b79f..18d073d6077 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
@@ -15,9 +15,9 @@
return 0
var/mob/living/carbon/human/H = user
// You must either: Be of the abductor species, or contain an abductor implant
- if(!(H.get_species() == "Abductor" || (locate(/obj/item/weapon/implant/abductor) in H)))
- return 0
- return 1
+ if((H.get_species() == "Abductor" || (locate(/obj/item/weapon/implant/abductor) in H)))
+ return 1
+ return 0
/datum/surgery_step/internal/extract_organ
@@ -47,11 +47,11 @@
return 1
else
to_chat(user, "You don't find anything in [target]'s [target_zone]!")
- return 0
+ return 1
/datum/surgery_step/internal/gland_insert
name = "insert gland"
- allowed_tools = list(/obj/item/organ/internal/gland = 100)
+ allowed_tools = list(/obj/item/organ/internal/heart/gland = 100)
time = 32
/datum/surgery_step/internal/gland_insert/begin_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -61,6 +61,6 @@
/datum/surgery_step/internal/gland_insert/end_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("[user] inserts [tool] into [target].", "You insert [tool] into [target].")
user.drop_item()
- var/obj/item/organ/internal/gland/gland = tool
+ var/obj/item/organ/internal/heart/gland/gland = tool
gland.insert(target, 2)
return 1
diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm
index d3e60b2fb98..1c481e7c333 100644
--- a/code/game/gamemodes/miniantags/abduction/gland.dm
+++ b/code/game/gamemodes/miniantags/abduction/gland.dm
@@ -1,12 +1,11 @@
-/obj/item/organ/internal/gland
+/obj/item/organ/internal/heart/gland
name = "fleshy mass"
desc = "A nausea-inducing hunk of twisting flesh and metal."
icon = 'icons/obj/abductor.dmi'
- parent_organ = "chest"
- slot = "gland"
icon_state = "gland"
status = ORGAN_ROBOT
- origin_tech = "materials=4;biotech=5;abductor=3"
+ origin_tech = "materials=4;biotech=7;abductor=3"
+ beating = TRUE
var/cooldown_low = 300
var/cooldown_high = 300
var/next_activation = 0
@@ -16,30 +15,33 @@
tough = 1 //not easily broken by combat damage
sterile = 1 //not very germy
-/obj/item/organ/internal/gland/proc/ownerCheck()
+/obj/item/organ/internal/heart/gland/proc/ownerCheck()
if(ishuman(owner))
return 1
if(!human_only && iscarbon(owner))
return 1
return 0
-/obj/item/organ/internal/gland/proc/Start()
+/obj/item/organ/internal/heart/gland/proc/Start()
active = 1
next_activation = world.time + rand(cooldown_low,cooldown_high)
-/obj/item/organ/internal/gland/remove(var/mob/living/carbon/M, special = 0)
+/obj/item/organ/internal/heart/gland/remove(var/mob/living/carbon/M, special = 0)
active = 0
if(initial(uses) == 1)
uses = initial(uses)
- ..()
+ . = ..()
-/obj/item/organ/internal/gland/insert(var/mob/living/carbon/M, special = 0)
+/obj/item/organ/internal/heart/gland/insert(var/mob/living/carbon/M, special = 0)
..()
if(special != 2 && uses) // Special 2 means abductor surgery
Start()
-/obj/item/organ/internal/gland/on_life()
+/obj/item/organ/internal/heart/gland/on_life()
+ if(!beating)
+ // alien glands are immune to stopping.
+ beating = TRUE
if(!active)
return
if(!ownerCheck())
@@ -52,30 +54,28 @@
if(!uses)
active = 0
-/obj/item/organ/internal/gland/proc/activate()
+/obj/item/organ/internal/heart/gland/proc/activate()
return
-/obj/item/organ/internal/gland/heals
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/heals
cooldown_low = 200
cooldown_high = 400
uses = -1
icon_state = "health"
-/obj/item/organ/internal/gland/heals/activate()
+/obj/item/organ/internal/heart/gland/heals/activate()
to_chat(owner, "You feel curiously revitalized.")
owner.adjustBruteLoss(-20)
owner.adjustOxyLoss(-20)
owner.adjustFireLoss(-20)
-/obj/item/organ/internal/gland/slime
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/slime
cooldown_low = 600
cooldown_high = 1200
uses = -1
icon_state = "slime"
-/obj/item/organ/internal/gland/slime/activate()
+/obj/item/organ/internal/heart/gland/slime/activate()
to_chat(owner, "You feel nauseous!")
owner.vomit(20)
@@ -83,14 +83,14 @@
Slime.Friends = list(owner)
Slime.Leader = owner
-/obj/item/organ/internal/gland/mindshock
- origin_tech = "materials=4;biotech=5;magnets=3;abductor=3"
+/obj/item/organ/internal/heart/gland/mindshock
+ origin_tech = "materials=4;biotech=4;magnets=6;abductor=3"
cooldown_low = 300
cooldown_high = 300
uses = -1
icon_state = "mindshock"
-/obj/item/organ/internal/gland/mindshock/activate()
+/obj/item/organ/internal/heart/gland/mindshock/activate()
to_chat(owner, "You get a headache.")
var/turf/T = get_turf(owner)
@@ -100,40 +100,37 @@
to_chat(H, "You hear a buzz in your head.")
H.AdjustConfused(20)
-/obj/item/organ/internal/gland/pop
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/pop
cooldown_low = 900
cooldown_high = 1800
- uses = 6
+ uses = -1
human_only = 1
icon_state = "species"
-/obj/item/organ/internal/gland/pop/activate()
+/obj/item/organ/internal/heart/gland/pop/activate()
to_chat(owner, "You feel unlike yourself.")
var/species = pick("Unathi","Skrell","Diona","Tajaran","Vulpkanin","Kidan","Grey","Diona")
owner.set_species(species)
-/obj/item/organ/internal/gland/ventcrawling
+/obj/item/organ/internal/heart/gland/ventcrawling
origin_tech = "materials=4;biotech=5;bluespace=3;abductor=3"
cooldown_low = 1800
cooldown_high = 2400
uses = 1
icon_state = "vent"
-/obj/item/organ/internal/gland/ventcrawling/activate()
+/obj/item/organ/internal/heart/gland/ventcrawling/activate()
to_chat(owner, "You feel very stretchy.")
owner.ventcrawler = 2
- return
-/obj/item/organ/internal/gland/viral
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/viral
cooldown_low = 1800
cooldown_high = 2400
uses = 1
icon_state = "viral"
-/obj/item/organ/internal/gland/viral/activate()
+/obj/item/organ/internal/heart/gland/viral/activate()
to_chat(owner, "You feel sick.")
var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/magnitis)
var/datum/disease/D = new virus_type()
@@ -144,51 +141,49 @@
owner.med_hud_set_status()
-/obj/item/organ/internal/gland/emp //TODO : Replace with something more interesting
- origin_tech = "materials=4;biotech=5;magnets=3;abductor=3"
+/obj/item/organ/internal/heart/gland/emp //TODO : Replace with something more interesting
+ origin_tech = "materials=4;biotech=4;magnets=6;abductor=3"
cooldown_low = 900
cooldown_high = 1600
uses = 10
icon_state = "emp"
-/obj/item/organ/internal/gland/emp/activate()
+/obj/item/organ/internal/heart/gland/emp/activate()
to_chat(owner, "You feel a spike of pain in your head.")
empulse(get_turf(owner), 2, 5, 1)
-/obj/item/organ/internal/gland/spiderman
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/spiderman
cooldown_low = 450
cooldown_high = 900
uses = 10
icon_state = "spider"
-/obj/item/organ/internal/gland/spiderman/activate()
+/obj/item/organ/internal/heart/gland/spiderman/activate()
to_chat(owner, "You feel something crawling in your skin.")
owner.faction |= "spiders"
new /obj/structure/spider/spiderling(owner.loc)
-/obj/item/organ/internal/gland/egg
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/egg
cooldown_low = 300
cooldown_high = 400
uses = -1
icon_state = "egg"
-/obj/item/organ/internal/gland/egg/activate()
+/obj/item/organ/internal/heart/gland/egg/activate()
to_chat(owner, "You lay an egg!")
var/obj/item/weapon/reagent_containers/food/snacks/egg/egg = new(owner.loc)
egg.reagents.add_reagent("sacid",20)
egg.desc += " It smells bad."
-/obj/item/organ/internal/gland/bloody
- origin_tech = "materials=4;biotech=6;abductor=3"
+/obj/item/organ/internal/heart/gland/bloody
cooldown_low = 200
cooldown_high = 400
uses = -1
-/obj/item/organ/internal/gland/bloody/activate()
- owner.adjustBruteLoss(15)
-
+/obj/item/organ/internal/heart/gland/bloody/activate()
+ if(ishuman(owner))
+ var/mob/living/carbon/human/H = owner
+ H.drip(200)
owner.visible_message("[owner]'s skin erupts with blood!",\
"Blood pours from your skin!")
@@ -202,22 +197,22 @@
H.w_uniform.add_blood(owner)
H.update_inv_w_uniform(0)
-/obj/item/organ/internal/gland/bodysnatch
- origin_tech = "materials=4;biotech=7;abductor=3"
+/obj/item/organ/internal/heart/gland/bodysnatch
cooldown_low = 600
cooldown_high = 600
human_only = 1
uses = 1
-/obj/item/organ/internal/gland/bodysnatch/activate()
+/obj/item/organ/internal/heart/gland/bodysnatch/activate()
to_chat(owner, "You feel something moving around inside you...")
//spawn cocoon with clone greytide snpc inside
if(ishuman(owner))
var/obj/effect/cocoon/abductor/C = new (get_turf(owner))
C.Copy(owner)
C.Start()
- owner.gib()
- return
+ owner.adjustBruteLoss(40)
+ var/turf/T = get_turf(owner)
+ T.add_blood_floor(src)
/obj/effect/cocoon/abductor
name = "slimy cocoon"
@@ -232,11 +227,18 @@
var/mob/living/carbon/human/interactive/greytide/clone = new(src)
var/datum/dna/owner_dna = H.dna
clone.rename_character(clone.name, owner_dna.real_name)
- clone.body_accessory = H.body_accessory
clone.dna = owner_dna.Clone()
clone.set_species(H.species.name)
+ clone.body_accessory = H.body_accessory
domutcheck(clone)
+ for(var/obj/item/I in clone)
+ if(istype(I, /obj/item/weapon/implant))
+ continue
+ if(istype(I, /obj/item/organ))
+ continue
+ qdel(I)
+
//There's no define for this / get all items ?
var/list/slots = list(slot_back,slot_w_uniform,slot_wear_suit,\
slot_wear_mask,slot_head,slot_shoes,slot_gloves,slot_l_ear,slot_r_ear,\
@@ -245,7 +247,7 @@
for(var/slot in slots)
var/obj/item/I = H.get_item_by_slot(slot)
if(I)
- clone.equip_to_slot_if_possible(I,slot)
+ clone.equip_to_slot_or_del(new I.type(clone), slot)
/obj/effect/cocoon/abductor/proc/Start()
hatch_time = world.time + 600
@@ -259,22 +261,25 @@
M.forceMove(get_turf(src))
qdel(src)
-/obj/item/organ/internal/gland/plasma
- cooldown_low = 2400
- cooldown_high = 3000
- origin_tech = "materials=4;biotech=5;plasmatech=3;abductor=3"
- uses = 1
-/obj/item/organ/internal/gland/plasma/activate()
- to_chat(owner, "You feel bloated.")
- sleep(150)
- if(!owner) return
- to_chat(owner, "A massive stomachache overcomes you.")
- sleep(50)
- if(!owner) return
- owner.visible_message("[owner] explodes in a cloud of plasma!")
- var/turf/simulated/T = get_turf(owner)
- if(istype(T))
- T.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C,300)
- owner.gib()
- return
+/obj/item/organ/internal/heart/gland/plasma
+ cooldown_low = 1200
+ cooldown_high = 1800
+ origin_tech = "materials=4;biotech=4;plasmatech=6;abductor=3"
+ uses = -1
+
+/obj/item/organ/internal/heart/gland/plasma/activate()
+ spawn(0)
+ to_chat(owner, "You feel bloated.")
+ sleep(150)
+ if(!owner)
+ return
+ to_chat(owner, "A massive stomachache overcomes you.")
+ sleep(50)
+ if(!owner)
+ return
+ owner.visible_message("[owner] vomits a cloud of plasma!")
+ var/turf/simulated/T = get_turf(owner)
+ if(istype(T))
+ T.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C,50)
+ owner.vomit()
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
index 24b02aea489..219ae4b6e54 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
@@ -49,15 +49,12 @@
set_droppoint_action.target = console
set_droppoint_action.Grant(user)
-/obj/machinery/computer/camera_advanced/abductor/proc/IsAbductor(mob/living/carbon/human/H)
- return H.get_species() == "Abductor"
-
/obj/machinery/computer/camera_advanced/abductor/proc/IsScientist(mob/living/carbon/human/H)
if(H.mind && H.mind.abductor)
return H.mind.abductor.scientist
/obj/machinery/computer/camera_advanced/abductor/attack_hand(mob/user)
- if(!iscarbon(user) || !IsAbductor(user))
+ if(!isabductor(user))
return
return ..()
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm
index 3922b80a9e5..3a93f8abc75 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm
@@ -11,21 +11,6 @@
abductor_equipment.Remove(src)
return ..()
-/obj/machinery/abductor/proc/IsAbductor(mob/living/carbon/human/H)
- return H.get_species() == "Abductor"
-
-/obj/machinery/abductor/proc/IsAgent(mob/living/carbon/human/H)
- if(H.get_species() == "Abductor")
- if(H.mind && H.mind.abductor)
- return H.mind.abductor.agent
- return 0
-
-/obj/machinery/abductor/proc/IsScientist(mob/living/carbon/human/H)
- if(H.get_species() == "Abductor")
- if(H.mind && H.mind.abductor)
- return H.mind.abductor.scientist
- return 0
-
//Console
/obj/machinery/abductor/console
@@ -33,8 +18,8 @@
desc = "Ship command center."
icon = 'icons/obj/abductor.dmi'
icon_state = "console"
- density = 1
- anchored = 1
+ density = TRUE
+ anchored = TRUE
var/obj/item/device/abductor/gizmo/gizmo
var/obj/item/clothing/suit/armor/abductor/vest/vest
var/obj/machinery/abductor/experiment/experiment
@@ -49,7 +34,7 @@
/obj/machinery/abductor/console/attack_hand(mob/user)
if(..())
return
- if(!IsAbductor(user))
+ if(!isabductor(user))
to_chat(user, "You start mashing alien buttons at random!")
if(do_after(user, 100, target = src))
TeleporterSend()
@@ -60,10 +45,13 @@
if(experiment != null)
var/points = experiment.points
+ var/credits = experiment.credits
dat += "Collected Samples : [points]
"
+ dat += "Gear Credits: [credits]
"
dat += "Transfer data in exchange for supplies:
"
dat += "Advanced Baton
"
dat += "Agent Helmet
"
+ dat += "Agent Vest
"
dat += "Radio Silencer
"
dat += "Science Tool
"
else
@@ -92,13 +80,13 @@
dat+="
"
dat += "Select Agent Vest Disguise
"
+ dat += "[vest.flags & NODROP ? "Unlock" : "Lock"] Vest
"
else
dat += "NO AGENT VEST DETECTED"
var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500)
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
- return
/obj/machinery/abductor/console/Topic(href, href_list)
if(..())
@@ -111,6 +99,8 @@
TeleporterRetrieve()
else if(href_list["flip_vest"])
FlipVest()
+ else if(href_list["toggle_vest"])
+ toggle_vest()
else if(href_list["select_disguise"])
SelectDisguise()
else if(href_list["dispense"])
@@ -123,37 +113,28 @@
Dispense(/obj/item/device/abductor/silencer)
if("tool")
Dispense(/obj/item/device/abductor/gizmo)
- src.updateUsrDialog()
+ if("vest")
+ Dispense(/obj/item/clothing/suit/armor/abductor/vest)
+ updateUsrDialog()
/obj/machinery/abductor/console/proc/TeleporterRetrieve()
if(gizmo!=null && pad!=null && gizmo.marked)
pad.Retrieve(gizmo.marked)
- return
/obj/machinery/abductor/console/proc/TeleporterSend()
if(pad!=null)
pad.Send()
- return
/obj/machinery/abductor/console/proc/FlipVest()
if(vest!=null)
vest.flip_mode()
- return
-/obj/machinery/abductor/console/proc/SelectDisguise(remote=0)
- var/list/entries = list()
- var/tempname
- var/datum/icon_snapshot/temp
- for(var/i = 1; i <= disguises.len; i++)
- temp = disguises[i]
- tempname = temp.name
- entries["[tempname]"] = disguises[i]
- var/entry_name = input( "Choose Disguise", "Disguise") in entries
- var/datum/icon_snapshot/chosen = entries[entry_name]
+/obj/machinery/abductor/console/proc/SelectDisguise(remote = 0)
+ var/entry_name = input( "Choose Disguise", "Disguise") as null|anything in disguises
+ var/datum/icon_snapshot/chosen = disguises[entry_name]
if(chosen && (remote || in_range(usr,src)))
vest.SetDisguise(chosen)
- return
/obj/machinery/abductor/console/proc/SetDroppoint(turf/location,user)
if(!istype(location))
@@ -188,13 +169,11 @@
entry.icon = target.icon
entry.icon_state = target.icon_state
entry.overlays = target.get_overlays_copy(list(L_HAND_LAYER,R_HAND_LAYER))
- for(var/i=1,i<=disguises.len,i++)
- var/datum/icon_snapshot/temp = disguises[i]
- if(temp.name == entry.name)
- disguises[i] = entry
- return
- disguises.Add(entry)
- return
+ //Update old disguise instead of adding new one
+ if(disguises[entry.name])
+ disguises[entry.name] = entry
+ return
+ disguises[entry.name] = entry
/obj/machinery/abductor/console/attackby(obj/O, mob/user, params)
if(istype(O, /obj/item/device/abductor/gizmo))
@@ -205,13 +184,16 @@
else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest))
var/obj/item/clothing/suit/armor/abductor/vest/V = O
to_chat(user, "You link the vest to the console.")
+ if(istype(vest))
+ if(vest.flags & NODROP)
+ toggle_vest()
vest = V
else
..()
/obj/machinery/abductor/console/proc/Dispense(item,cost=1)
- if(experiment && experiment.points >= cost)
- experiment.points-=cost
+ if(experiment && experiment.credits >= cost)
+ experiment.credits -=cost
atom_say("Incoming supply!")
if(pad)
flick("alien-pad", pad)
@@ -220,4 +202,9 @@
new item(src.loc)
else
atom_say("Insufficent data!")
- return
+
+/obj/machinery/abductor/console/proc/toggle_vest()
+ vest.flags ^= NODROP
+ var/mob/M = vest.loc
+ if(istype(M))
+ to_chat(M, "[src] is now [vest.flags & NODROP ? "locked" : "unlocked"].")
\ No newline at end of file
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm
index 4ead0232a2f..2b6103632f5 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm
@@ -14,7 +14,8 @@
return rgb(rand(0,255),rand(0,255),rand(0,255))
/obj/machinery/abductor/gland_dispenser/New()
- gland_types = subtypesof(/obj/item/organ/internal/gland)
+ ..()
+ gland_types = subtypesof(/obj/item/organ/internal/heart/gland)
gland_types = shuffle(gland_types)
gland_colors = new/list(gland_types.len)
amounts = new/list(gland_types.len)
@@ -25,7 +26,7 @@
/obj/machinery/abductor/gland_dispenser/attack_hand(mob/user)
if(..())
return
- if(!IsAbductor(user))
+ if(!isabductor(user))
return
user.set_machine(src)
var/box_css = {"
@@ -59,13 +60,15 @@
return
/obj/machinery/abductor/gland_dispenser/attackby(obj/item/weapon/W, mob/user, params)
- if(istype(W, /obj/item/organ/internal/gland))
+ if(istype(W, /obj/item/organ/internal/heart/gland))
if(!user.drop_item())
return
W.forceMove(src)
for(var/i=1,i<=gland_colors.len,i++)
if(gland_types[i] == W.type)
amounts[i]++
+ else
+ ..()
/obj/machinery/abductor/gland_dispenser/Topic(href, href_list)
if(..())
@@ -74,7 +77,7 @@
if(href_list["dispense"])
Dispense(text2num(href_list["dispense"]))
- src.updateUsrDialog()
+ updateUsrDialog()
/obj/machinery/abductor/gland_dispenser/proc/Dispense(count)
if(amounts[count]>0)
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
index 755bd21e2e5..44b2a431c7b 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
@@ -6,6 +6,7 @@
anchored = 1
density = 1
var/points = 0
+ var/credits = 0
var/list/history = list()
var/list/abductee_minds = list()
var/flash = " - || - "
@@ -19,10 +20,10 @@
/obj/machinery/abductor/experiment/MouseDrop_T(mob/living/carbon/human/target, mob/user)
if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target))
return
- if(IsAbductor(target))
+ if(isabductor(target))
return
if(occupant)
- to_chat(user, "\The [src] is already occupied.")
+ to_chat(user, "[src] is already occupied.")
return //occupied
if(target.buckled)
return
@@ -118,7 +119,7 @@
if(H.stat == DEAD)
atom_say("Specimen deceased - please provide fresh sample.")
return "Specimen deceased."
- var/obj/item/organ/internal/gland/GlandTest = locate() in H.internal_organs
+ var/obj/item/organ/internal/heart/gland/GlandTest = locate() in H.internal_organs
if(!GlandTest)
atom_say("Experimental dissection not detected!")
return "No glands detected!"
@@ -147,7 +148,7 @@
obj_count++
ticker.mode.update_abductor_icons_added(H.mind)
- for(var/obj/item/organ/internal/gland/G in H.internal_organs)
+ for(var/obj/item/organ/internal/heart/gland/G in H.internal_organs)
G.Start()
point_reward++
if(point_reward > 0)
@@ -155,6 +156,7 @@
SendBack(H)
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
points += point_reward
+ credits += point_reward
return "Experiment successful! [point_reward] new data-points collected."
else
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 1)
@@ -183,7 +185,7 @@
var/obj/item/weapon/grab/grabbed = G
if(!ishuman(grabbed.affecting))
return
- if(IsAbductor(grabbed.affecting))
+ if(isabductor(grabbed.affecting))
return
if(occupant)
to_chat(user, "The [src] is already occupied!")
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
index 285b097d06a..f0ceac0d6ce 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
@@ -17,6 +17,8 @@
target.forceMove(teleport_target)
spawn(0)
anim(target.loc,target,'icons/mob/mob.dmi',,"uncloak",,target.dir)
+ to_chat(target, "The instability of the warp leaves you disoriented!")
+ target.Stun(3)
/obj/machinery/abductor/pad/proc/Retrieve(mob/living/target)
flick("alien-pad", src)
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index a3ac5a9da6f..c6ea23c4bbc 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -322,7 +322,7 @@
D.pixel_y = target.pixel_y
if(do_mob(src, target, 100))
if(!src.Adjacent(target))
- to_chat(src, "Error:Dismantleing aborted.")
+ to_chat(src, "Error:Dismantling aborted.")
else
to_chat(src, "Dismantling complete.")
var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(target.loc)
@@ -437,7 +437,7 @@
/mob/living/simple_animal/hostile/swarmer/proc/CreateTrap()
set name = "Create trap"
set category = "Swarmer"
- set desc = "Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 5 resources"
+ set desc = "Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 5 resources."
if(locate(/obj/structure/swarmer/trap) in loc)
to_chat(src, "There is already a trap here. Aborting.")
return
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index c3bf543a043..bd4774b50eb 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -35,8 +35,7 @@ var/bomb_set
poi_list |= src
/obj/machinery/nuclearbomb/Destroy()
- qdel(wires)
- wires = null
+ QDEL_NULL(wires)
poi_list.Remove(src)
return ..()
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 6dabdcf49d6..e34174f2beb 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -384,8 +384,17 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) \
return steal_target
/datum/objective/steal/check_completion()
- if(!steal_target) return 1 // Free Objective
- return steal_target.check_completion(owner)
+ if(!steal_target)
+ return 1 // Free Objective
+
+ var/list/all_items = owner.current.GetAllContents()
+
+ for(var/obj/I in all_items)
+ if(istype(I, steal_target.typepath))
+ return steal_target.check_special_completion(I)
+ if(I.type in steal_target.altitems)
+ return steal_target.check_special_completion(I)
+
/datum/objective/steal/exchange
martyr_compatible = 0
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index 08fbf0d4cc7..556b7f50e5b 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -234,7 +234,7 @@
if(rev_mind.assigned_role in command_positions)
return 0
var/mob/living/carbon/human/H = rev_mind.current//Check to see if the potential rev is implanted
- if(isloyal(H))
+ if(ismindshielded(H))
return 0
if((rev_mind in revolutionaries) || (rev_mind in head_revolutionaries))
return 0
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index fd63864442d..8abe51675cb 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -307,14 +307,14 @@
to_chat(target, "A terrible red light floods your mind. You collapse as conscious thought is wiped away.")
target.Weaken(12)
sleep(20)
- if(isloyal(target))
+ if(ismindshielded(target))
to_chat(user, "They have a mindshield implant. You begin to deactivate it - this will take some time.")
user.visible_message("[user] pauses, then dips their head in concentration!")
to_chat(target, "Your mindshield implant becomes hot as it comes under attack!")
sleep(100) //10 seconds - not spawn() so the enthralling takes longer
to_chat(user, "The nanobots composing the mindshield implant have been rendered inert. Now to continue.")
user.visible_message("[user] relaxes again.")
- for(var/obj/item/weapon/implant/loyalty/L in target)
+ for(var/obj/item/weapon/implant/mindshield/L in target)
if(L && L.implanted)
qdel(L)
to_chat(target, "Your mental protection implant unexpectedly falters, dims, dies.")
@@ -718,8 +718,9 @@
var/more_minutes = 9000
var/timer = shuttle_master.emergency.timeLeft()
timer += more_minutes
- event_announcement.Announce("Major system failure aboard the emergency shuttle. This will extend its arrival time by approximately 15 minutes..", "System Failure", 'sound/misc/notice1.ogg')
+ event_announcement.Announce("Major system failure aboard the emergency shuttle. This will extend its arrival time by approximately 15 minutes and the shuttle is unable to be recalled.", "System Failure", 'sound/misc/notice1.ogg')
shuttle_master.emergency.setTimer(timer)
+ shuttle_master.emergency.canRecall = FALSE
user.mind.spell_list.Remove(src) //Can only be used once!
qdel(src)
diff --git a/code/game/gamemodes/steal_items.dm b/code/game/gamemodes/steal_items.dm
index fd3ad379fe0..92573fcc17e 100644
--- a/code/game/gamemodes/steal_items.dm
+++ b/code/game/gamemodes/steal_items.dm
@@ -6,10 +6,11 @@
#define THEFT_FLAG_UNIQUE 2
/datum/theft_objective
- var/name=""
+ var/name = ""
var/typepath=/atom
- var/list/protected_jobs=list()
- var/flags=0
+ var/list/protected_jobs = list()
+ var/list/altitems = list()
+ var/flags = 0
/datum/theft_objective/proc/check_completion(var/datum/mind/owner)
if(!owner.current)
@@ -70,6 +71,16 @@ datum/theft_objective/ai/check_special_completion(var/obj/item/device/aicard/C)
name = "the station blueprints"
typepath = /obj/item/areaeditor/blueprints
protected_jobs = list("Chief Engineer")
+ altitems = list(/obj/item/weapon/photo)
+
+/datum/objective_item/steal/blueprints/check_special_completion(obj/item/I)
+ if(istype(I, /obj/item/areaeditor/blueprints))
+ return 1
+ if(istype(I, /obj/item/weapon/photo))
+ var/obj/item/weapon/photo/P = I
+ if(P.blueprints)
+ return 1
+ return 0
/datum/theft_objective/voidsuit
name = "a nasa voidsuit"
diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm
index 6ec90dc777c..9d1796523f9 100644
--- a/code/game/gamemodes/vampire/vampire_powers.dm
+++ b/code/game/gamemodes/vampire/vampire_powers.dm
@@ -294,7 +294,7 @@
/obj/effect/proc_holder/spell/vampire/targetted/enthrall/proc/can_enthrall(mob/living/user, mob/living/carbon/C)
var/enthrall_safe = 0
- for(var/obj/item/weapon/implant/loyalty/L in C)
+ for(var/obj/item/weapon/implant/mindshield/L in C)
if(L && L.implanted)
enthrall_safe = 1
break
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index 16c9b2f5857..7fcd9c198b4 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -51,7 +51,7 @@
to_chat(user, "There is no power left in the shard.")
return
- if(!ishuman(M) || istype(M, /mob/living/carbon/human/dummy)) //If target is not a human or a dummy
+ if(!ishuman(M)) //If target is not a human
return ..()
if(M.has_brain_worms()) //Borer stuff - RR
diff --git a/code/game/jobs/job/central.dm b/code/game/jobs/job/central.dm
index 9d3d5a7ab7a..64298b70fbe 100644
--- a/code/game/jobs/job/central.dm
+++ b/code/game/jobs/job/central.dm
@@ -34,7 +34,7 @@
/obj/item/weapon/implanter/death_alarm = 1
)
- implants = list(/obj/item/weapon/implant/loyalty)
+ implants = list(/obj/item/weapon/implant/mindshield)
backpack = /obj/item/weapon/storage/backpack/satchel
@@ -77,6 +77,6 @@
/obj/item/weapon/implanter/death_alarm = 1
)
- implants = list(/obj/item/weapon/implant/loyalty)
+ implants = list(/obj/item/weapon/implant/mindshield)
backpack = /obj/item/weapon/storage/backpack/satchel
\ No newline at end of file
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 62b248c4875..a7ed2b6b7a8 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -40,7 +40,7 @@
/obj/item/weapon/melee/classic_baton/telescopic = 1
)
- implants = list(/obj/item/weapon/implant/loyalty)
+ implants = list(/obj/item/weapon/implant/mindshield)
backpack = /obj/item/weapon/storage/backpack/security
satchel = /obj/item/weapon/storage/backpack/satchel_sec
@@ -83,7 +83,7 @@
/obj/item/weapon/restraints/handcuffs = 1
)
- implants = list(/obj/item/weapon/implant/loyalty)
+ implants = list(/obj/item/weapon/implant/mindshield)
backpack = /obj/item/weapon/storage/backpack/security
satchel = /obj/item/weapon/storage/backpack/satchel_sec
@@ -130,7 +130,7 @@
/obj/item/weapon/melee/classic_baton/telescopic = 1
)
- implants = list(/obj/item/weapon/implant/loyalty)
+ implants = list(/obj/item/weapon/implant/mindshield)
/datum/outfit/job/detective/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
. = ..()
@@ -183,7 +183,7 @@
/obj/item/weapon/restraints/handcuffs = 1
)
- implants = list(/obj/item/weapon/implant/loyalty)
+ implants = list(/obj/item/weapon/implant/mindshield)
backpack = /obj/item/weapon/storage/backpack/security
satchel = /obj/item/weapon/storage/backpack/satchel_sec
@@ -218,7 +218,7 @@
l_hand = /obj/item/weapon/storage/firstaid/adv
pda = /obj/item/device/pda/medical
- implants = list(/obj/item/weapon/implant/loyalty)
+ implants = list(/obj/item/weapon/implant/mindshield)
backpack = /obj/item/weapon/storage/backpack/medic
satchel = /obj/item/weapon/storage/backpack/satchel_med
@@ -257,7 +257,7 @@
/obj/item/weapon/restraints/handcuffs = 1
)
- implants = list(/obj/item/weapon/implant/loyalty)
+ implants = list(/obj/item/weapon/implant/mindshield)
backpack = /obj/item/weapon/storage/backpack/security
satchel = /obj/item/weapon/storage/backpack/satchel_sec
diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm
index af91e7788bd..e1b6bfda98e 100644
--- a/code/game/jobs/job/supervisor.dm
+++ b/code/game/jobs/job/supervisor.dm
@@ -41,7 +41,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
/obj/item/weapon/melee/classic_baton/telescopic = 1
)
- implants = list(/obj/item/weapon/implant/loyalty)
+ implants = list(/obj/item/weapon/implant/mindshield)
backpack = /obj/item/weapon/storage/backpack/captain
satchel = /obj/item/weapon/storage/backpack/satchel_cap
@@ -145,7 +145,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
/obj/item/weapon/melee/classic_baton/ntcane = 1
)
- implants = list(/obj/item/weapon/implant/loyalty)
+ implants = list(/obj/item/weapon/implant/mindshield)
@@ -188,7 +188,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
/obj/item/weapon/gun/energy/gun/blueshield = 1
)
- implants = list(/obj/item/weapon/implant/loyalty)
+ implants = list(/obj/item/weapon/implant/mindshield)
backpack = /obj/item/weapon/storage/backpack/security
@@ -232,7 +232,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
/obj/item/weapon/melee/classic_baton/telescopic = 1
)
- implants = list(/obj/item/weapon/implant/loyalty)
+ implants = list(/obj/item/weapon/implant/mindshield)
@@ -269,4 +269,4 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
l_hand = /obj/item/weapon/storage/briefcase
pda = /obj/item/device/pda/lawyer
- implants = list(/obj/item/weapon/implant/loyalty)
+ implants = list(/obj/item/weapon/implant/mindshield)
diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm
index a8b3b4f218e..161a1718d63 100644
--- a/code/game/machinery/Beacon.dm
+++ b/code/game/machinery/Beacon.dm
@@ -22,9 +22,7 @@
hide(T.intact)
/obj/machinery/bluespace_beacon/Destroy()
- if(Beacon)
- qdel(Beacon)
- Beacon = null
+ QDEL_NULL(Beacon)
return ..()
// update the invisibility and icon
diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm
index 485bbd58b0e..4178c9248c0 100644
--- a/code/game/machinery/PDApainter.dm
+++ b/code/game/machinery/PDApainter.dm
@@ -40,9 +40,7 @@
src.colorlist += D
/obj/machinery/pdapainter/Destroy()
- if(storedpda)
- qdel(storedpda)
- storedpda = null
+ QDEL_NULL(storedpda)
return ..()
/obj/machinery/pdapainter/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
@@ -85,7 +83,7 @@
set name = "Eject PDA"
set category = "Object"
set src in oview(1)
-
+
if(usr.incapacitated())
return
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 151dc377f5d..576cc65868b 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -220,7 +220,7 @@
active_power_usage = 500
var/printing = null
var/printing_text = null
- var/known_implants = list(/obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/loyalty, /obj/item/weapon/implant/tracking)
+ var/known_implants = list(/obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/mindshield, /obj/item/weapon/implant/tracking)
/obj/machinery/body_scanconsole/power_change()
if(stat & BROKEN)
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index c139edc19b2..e4cb0028408 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -212,8 +212,7 @@
if(radio_controller)
radio_controller.remove_object(src, frequency)
air_alarm_repository.update_cache(src)
- qdel(wires)
- wires = null
+ QDEL_NULL(wires)
return ..()
/obj/machinery/alarm/proc/first_run()
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index 51c6451b7c3..44ac6caf479 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -36,10 +36,8 @@
/obj/machinery/portable_atmospherics/Destroy()
disconnect()
- qdel(air_contents)
- air_contents = null
- qdel(holding)
- holding = null
+ QDEL_NULL(air_contents)
+ QDEL_NULL(holding)
return ..()
/obj/machinery/portable_atmospherics/update_icon()
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 24bc3e0a2b6..346949414fa 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -67,10 +67,8 @@
RefreshParts()
/obj/machinery/autolathe/Destroy()
- qdel(wires)
- wires = null
- qdel(materials)
- materials = null
+ QDEL_NULL(wires)
+ QDEL_NULL(materials)
return ..()
/obj/machinery/autolathe/interact(mob/user)
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index f98c84c61ac..ca312efc6a7 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -51,18 +51,19 @@
/obj/machinery/camera/Destroy()
toggle_cam(null, 0) //kick anyone viewing out
- if(assembly)
- qdel(assembly)
- assembly = null
+ QDEL_NULL(assembly)
if(istype(bug))
bug.bugged_cameras -= src.c_tag
if(bug.current == src)
bug.current = null
bug = null
- qdel(wires)
- wires = null
+ QDEL_NULL(wires)
cameranet.removeCamera(src) //Will handle removal from the camera network and the chunks, so we don't need to worry about that
cameranet.cameras -= src
+ var/area/ai_monitored/A = get_area(src)
+ if(istype(A))
+ A.motioncamera = null
+ area_motion = null
return ..()
/obj/machinery/camera/emp_act(severity)
diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm
index 99e9273b682..11fcede1fe9 100644
--- a/code/game/machinery/camera/camera_assembly.dm
+++ b/code/game/machinery/camera/camera_assembly.dm
@@ -20,6 +20,12 @@
4 = Screwdriver panel closed and is fully built (you cannot attach upgrades)
*/
+/obj/item/weapon/camera_assembly/Destroy()
+ for(var/thing in upgrades)
+ qdel(thing)
+ upgrades.Cut()
+ return ..()
+
/obj/item/weapon/camera_assembly/attackby(obj/item/W, mob/living/user, params)
switch(state)
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index 9795b161072..69cfd4a6e89 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -16,7 +16,7 @@
if(charging && !(stat & (BROKEN|NOPOWER)) )
- var/newlevel = round(charging.percent() * 4.0 / 99)
+ var/newlevel = round(charging.percent() * 4 / 100)
// to_chat(world, "nl: [newlevel]")
if(chargelevel != newlevel)
@@ -91,7 +91,7 @@
if(!charging || (stat & (BROKEN|NOPOWER)) || !anchored)
return
- use_power(2000) //this used to use CELLRATE, but CELLRATE is fucking awful. feel free to fix this properly!
- charging.give(1750) //inefficiency.
+ use_power(200) //this used to use CELLRATE, but CELLRATE is fucking awful. feel free to fix this properly!
+ charging.give(175) //inefficiency.
updateicon()
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 96579b00cf1..390496842ab 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -82,12 +82,8 @@
/obj/machinery/clonepod/Destroy()
if(connected)
connected.pods -= src
- if(Radio)
- qdel(Radio)
- Radio = null
- if(countdown)
- qdel(countdown)
- countdown = null
+ QDEL_NULL(Radio)
+ QDEL_NULL(countdown)
return ..()
/obj/machinery/clonepod/RefreshParts()
@@ -104,13 +100,17 @@
/obj/item/weapon/disk/data
name = "Cloning Data Disk"
icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk.
- var/datum/dna2/record/buf=null
+ var/datum/dna2/record/buf = null
var/read_only = 0 //Well,it's still a floppy disk
/obj/item/weapon/disk/data/proc/Initialize()
buf = new
buf.dna=new
+/obj/item/weapon/disk/data/Destroy()
+ QDEL_NULL(buf)
+ return ..()
+
/obj/item/weapon/disk/data/demo
name = "data disk - 'God Emperor of Mankind'"
read_only = 1
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index 492baed22e3..7fc95ebfa53 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -10,12 +10,9 @@
var/obj/item/device/mmi/brain = null
/obj/structure/AIcore/Destroy()
- qdel(laws)
- qdel(circuit)
- qdel(brain)
- laws = null
- circuit = null
- brain = null
+ QDEL_NULL(laws)
+ QDEL_NULL(circuit)
+ QDEL_NULL(brain)
return ..()
/obj/structure/AIcore/attackby(obj/item/P as obj, mob/user as mob, params)
diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm
index e91286fe422..2195ee25522 100644
--- a/code/game/machinery/computer/camera_advanced.dm
+++ b/code/game/machinery/computer/camera_advanced.dm
@@ -28,8 +28,7 @@
/obj/machinery/computer/camera_advanced/Destroy()
if(current_user)
current_user.unset_machine()
- if(eyeobj)
- qdel(eyeobj)
+ QDEL_NULL(eyeobj)
return ..()
/obj/machinery/computer/camera_advanced/on_unset_machine(mob/M)
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 8286454dc94..e343135b246 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -19,12 +19,6 @@
overlay_layer = layer
..()
-/obj/machinery/computer/Destroy()
- if(circuit)
- qdel(circuit)
- circuit = null
- return ..()
-
/obj/machinery/computer/initialize()
..()
power_change()
diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index 6d1643fd988..d074091838a 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -15,8 +15,7 @@
..()
/obj/machinery/computer/crew/Destroy()
- qdel(crew_monitor)
- crew_monitor = null
+ QDEL_NULL(crew_monitor)
return ..()
/obj/machinery/computer/crew/attack_ai(mob/user)
diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm
index ca3c1f84410..1c62c24c854 100644
--- a/code/game/machinery/computer/power.dm
+++ b/code/game/machinery/computer/power.dm
@@ -16,7 +16,7 @@
power_monitors += src
power_monitors = sortAtom(power_monitors)
power_monitor = new(src)
-
+
/obj/machinery/computer/monitor/initialize()
..()
powermonitor_repository.update_cache()
@@ -25,8 +25,7 @@
/obj/machinery/computer/monitor/Destroy()
power_monitors -= src
powermonitor_repository.update_cache()
- qdel(power_monitor)
- power_monitor = null
+ QDEL_NULL(power_monitor)
return ..()
/obj/machinery/computer/monitor/power_change()
diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm
index c40e7968145..9c2dde8d3b7 100644
--- a/code/game/machinery/computer/station_alert.dm
+++ b/code/game/machinery/computer/station_alert.dm
@@ -24,8 +24,7 @@
/obj/machinery/computer/station_alert/Destroy()
alarm_monitor.unregister(src)
- qdel(alarm_monitor)
- alarm_monitor = null
+ QDEL_NULL(alarm_monitor)
return ..()
/obj/machinery/computer/station_alert/attack_ai(mob/user)
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 48793165d00..789d4f81b1c 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -178,7 +178,7 @@
var/time_till_despawn = 9000 // This is reduced by 90% if a player manually enters cryo
var/willing_time_divisor = 10
var/time_entered = 0 // Used to keep track of the safe period.
- var/obj/item/device/radio/intercom/announce //
+ var/obj/item/device/radio/intercom/announce
var/obj/machinery/computer/cryopod/control_computer
var/last_no_computer_message = 0
@@ -192,12 +192,18 @@
/obj/item/device/paicard,
/obj/item/weapon/gun,
/obj/item/weapon/pinpointer,
- /obj/item/clothing/suit,
/obj/item/clothing/shoes/magboots,
/obj/item/areaeditor/blueprints,
/obj/item/clothing/head/helmet/space,
+ /obj/item/clothing/suit/space,
+ /obj/item/clothing/suit/armor,
+ /obj/item/weapon/defibrillator/compact,
+ /obj/item/weapon/reagent_containers/hypospray/CMO,
+ /obj/item/clothing/accessory/medal/gold/captain,
+ /obj/item/clothing/gloves/color/black/krav_maga/sec,
/obj/item/weapon/storage/internal,
- /obj/item/device/spacepod_key
+ /obj/item/device/spacepod_key,
+ /obj/item/weapon/nullrod
)
// These items will NOT be preserved
var/list/do_not_preserve_items = list (
@@ -324,6 +330,18 @@
else
W.loc = loc
+ // Skip past any cult sacrifice objective using this person
+ if(GAMEMODE_IS_CULT && is_sacrifice_target(occupant.mind))
+ var/datum/game_mode/cult/cult_mode = ticker.mode
+ var/list/p_s_t = cult_mode.get_possible_sac_targets()
+ if(p_s_t.len)
+ cult_mode.sacrifice_target = pick(p_s_t)
+ for(var/datum/mind/H in ticker.mode.cult)
+ if(H.current)
+ to_chat(H.current, "[ticker.mode.cultdat.entity_name] murmurs, [occupant] is beyond your reach. Sacrifice [cult_mode.sacrifice_target.current] instead...")
+ else
+ cult_mode.bypass_phase()
+
//Update any existing objectives involving this mob.
for(var/datum/objective/O in all_objectives)
// We don't want revs to get objectives that aren't for heads of staff. Letting
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index a2a7907b744..c6dacede143 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -348,8 +348,7 @@ About the new airlock wires panel:
/obj/machinery/door/airlock/Destroy()
- qdel(wires)
- wires = null
+ QDEL_NULL(wires)
if(main_power_timer)
deltimer(main_power_timer)
main_power_timer = null
diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index ecdd959f717..7ec9630a54c 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -63,6 +63,10 @@
stat |= BROKEN
update_icon()
+/obj/machinery/door_timer/Destroy()
+ QDEL_NULL(Radio)
+ targets.Cut()
+ return ..()
//Main door timer loop, if it's timing and time is >0 reduce time by 1.
// if it's less than 0, open door, reset timer
@@ -186,7 +190,7 @@
if(..())
return
interact(user)
-
+
/obj/machinery/door_timer/interact(mob/user)
// Used for the 'time left' display
var/second = round(timeleft() % 60)
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index d29b9d78c87..2cd5f0a7a34 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -25,9 +25,7 @@
density = 0
if(health == 0)
playsound(src, "shatter", 70, 1)
- if(electronics)
- qdel(electronics)
- electronics = null
+ QDEL_NULL(electronics)
return ..()
diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm
index ac3d1b7037c..f872fbcef2d 100644
--- a/code/game/machinery/floodlight.dm
+++ b/code/game/machinery/floodlight.dm
@@ -20,9 +20,7 @@
..()
/obj/machinery/floodlight/Destroy()
- if(cell)
- qdel(cell)
- cell = null
+ QDEL_NULL(cell)
return ..()
/obj/machinery/floodlight/proc/updateicon()
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index 636b36cc416..26785e248b1 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -15,9 +15,7 @@
/obj/machinery/iv_drip/Destroy()
attached = null
- if(beaker)
- qdel(beaker)
- beaker = null
+ QDEL_NULL(beaker)
return ..()
/obj/machinery/iv_drip/update_icon()
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index cf9f97ee6bb..6040f72ab6b 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -113,9 +113,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
/obj/machinery/newscaster/Destroy()
allCasters -= src
viewing_channel = null
- if(photo)
- qdel(photo)
- photo = null
+ QDEL_NULL(photo)
return ..()
/obj/machinery/newscaster/update_icon()
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 461df0e39f7..03f5cc1f8c8 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -20,7 +20,7 @@
var/health = 80 //the turret's health
var/locked = 1 //if the turret's behaviour control access is locked
var/controllock = 0 //if the turret responds to control panels
-
+
var/installation = /obj/item/weapon/gun/energy/gun/turret //the type of weapon installed
var/gun_charge = 0 //the charge of the gun inserted
var/projectile = null //holder for bullettype
@@ -56,7 +56,7 @@
var/screen = 0 // Screen 0: main control, screen 1: access levels
var/one_access = 0 // Determines if access control is set to req_one_access or req_access
-
+
var/syndicate = 0 //is the turret a syndicate turret?
var/faction = ""
var/emp_vulnerable = 1 // Can be empd
@@ -94,8 +94,7 @@
setup()
/obj/machinery/porta_turret/Destroy()
- qdel(spark_system)
- spark_system = null
+ QDEL_NULL(spark_system)
return ..()
/obj/machinery/porta_turret/centcom/New()
@@ -549,8 +548,8 @@ var/list/turret_icons
/obj/machinery/porta_turret/proc/in_faction(mob/living/target)
if(!(faction in target.faction))
return 0
- return 1
-
+ return 1
+
/obj/machinery/porta_turret/proc/assess_and_assign(var/mob/living/L, var/list/targets, var/list/secondarytargets)
switch(assess_living(L))
if(TURRET_PRIORITY_TARGET)
@@ -582,7 +581,7 @@ var/list/turret_icons
if(emagged) // If emagged not even the dead get a rest
return L.stat ? TURRET_SECONDARY_TARGET : TURRET_PRIORITY_TARGET
-
+
if(in_faction(L))
return TURRET_NOT_TARGET
@@ -967,46 +966,46 @@ var/list/turret_icons
/atom/movable/porta_turret_cover
icon = 'icons/obj/turrets.dmi'
-
+
// Syndicate turrets
/obj/machinery/porta_turret/syndicate
projectile = /obj/item/projectile/bullet
eprojectile = /obj/item/projectile/bullet
shot_sound = 'sound/weapons/Gunshot.ogg'
eshot_sound = 'sound/weapons/Gunshot.ogg'
-
+
icon_state = "syndieturret0"
var/icon_state_initial = "syndieturret0"
var/icon_state_active = "syndieturret1"
var/icon_state_destroyed = "syndieturret2"
-
+
syndicate = 1
installation = null
always_up = 1
use_power = 0
has_cover = 0
raised = 1
- scan_range = 9
-
+ scan_range = 9
+
faction = "syndicate"
emp_vulnerable = 0
-
+
lethal = 1
check_arrest = 0
check_records = 0
check_weapons = 0
check_access = 0
- check_anomalies = 1
+ check_anomalies = 1
check_synth = 1
ailock = 1
-
+
/obj/machinery/porta_turret/syndicate/New()
..()
if(req_one_access && req_one_access.len)
req_one_access.Cut()
req_access = list(access_syndicate)
one_access = 0
-
+
/obj/machinery/porta_turret/syndicate/update_icon()
if(stat & BROKEN)
icon_state = icon_state_destroyed
@@ -1025,7 +1024,7 @@ var/list/turret_icons
health = 40
projectile = /obj/item/projectile/bullet/weakbullet3
eprojectile = /obj/item/projectile/bullet/weakbullet3
-
+
/obj/machinery/porta_turret/syndicate/interior
name = "machine gun turret (.45)"
desc = "Syndicate interior defense turret chambered for .45 rounds. Designed to down intruders without damaging the hull."
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 1762840b52f..94513623cfb 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -1,70 +1,78 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-
/obj/machinery/recharger
name = "recharger"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "recharger0"
+ desc = "A charging dock for energy based weaponry."
anchored = 1
use_power = 1
- idle_power_usage = 40
- active_power_usage = 2500
+ idle_power_usage = 4
+ active_power_usage = 250
var/obj/item/charging = null
+ var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/modular_computer, /obj/item/weapon/rcs)
+ var/icon_state_off = "rechargeroff"
var/icon_state_charged = "recharger2"
var/icon_state_charging = "recharger1"
var/icon_state_idle = "recharger0"
-/obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob, params)
- if(istype(user,/mob/living/silicon))
- return
-
- if(!user.canUnEquip(G, 0))
- to_chat(user, "[G] is stuck to your hand, you can't put it in [src]!")
- return
-
- if(istype(G, /obj/item/weapon/gun/energy) || istype(G, /obj/item/weapon/melee/baton) || istype(G,/obj/item/device/laptop) || istype(G, /obj/item/weapon/rcs))
+/obj/machinery/recharger/attackby(obj/item/weapon/G, mob/user, params)
+ if(iswrench(G))
if(charging)
- return
-
- // Checks to make sure he's not in space doing it, and that the area got proper power.
- var/area/a = get_area(src)
- if(!isarea(a))
- to_chat(user, "The [name] blinks red as you try to insert the item!")
- return
- if(a.power_equip == 0 && a.requires_power)
- to_chat(user, "The [name] blinks red as you try to insert the item!")
- return
-
- if(istype(G, /obj/item/weapon/gun/energy))
- var/obj/item/weapon/gun/energy/E = G
- if(!E.can_charge)
- to_chat(user, "Your gun has no external power connector.")
- return
-
- if(istype(G, /obj/item/device/laptop))
- var/obj/item/device/laptop/L = G
- if(!L.stored_computer.battery)
- to_chat(user, "There's no battery in it!")
- return
-
- user.drop_item()
- G.loc = src
- charging = G
- use_power = 2
- update_icon()
- else if(istype(G, /obj/item/weapon/wrench))
- if(charging)
- to_chat(user, "Remove the weapon first!")
+ to_chat(user, "Remove the charging item first!")
return
anchored = !anchored
- to_chat(user, "You [anchored ? "attached" : "detached"] the recharger.")
+ power_change()
+ to_chat(user, "You [anchored ? "attached" : "detached"] [src].")
playsound(loc, G.usesound, 75, 1)
+ return
+
+ var/allowed = is_type_in_list(G, allowed_devices)
+
+ if(allowed)
+ if(anchored)
+ if(charging)
+ return 1
+
+ //Checks to make sure he's not in space doing it, and that the area got proper power.
+ var/area/a = get_area(src)
+ if(!isarea(a) || a.power_equip == 0)
+ to_chat(user, "[src] blinks red as you try to insert [G].")
+ return 1
+
+ if(istype(G, /obj/item/weapon/gun/energy))
+ var/obj/item/weapon/gun/energy/E = G
+ if(!E.can_charge)
+ to_chat(user, "Your gun has no external power connector.")
+ return 1
+
+ if(!user.drop_item())
+ return 1
+ G.forceMove(src)
+ charging = G
+ use_power = 2
+ update_icon()
+ else
+ to_chat(user, "[src] isn't connected to anything!")
+ return 1
+ else
+ ..()
+
+/obj/machinery/recharger/attack_hand(mob/user)
+ if(issilicon(user))
+ return
-/obj/machinery/recharger/attack_hand(mob/user as mob)
add_fingerprint(user)
-
if(charging)
charging.update_icon()
- charging.loc = loc
+ charging.forceMove(loc)
+ user.put_in_hands(charging)
+ charging = null
+ use_power = 1
+ update_icon()
+
+/obj/machinery/recharger/attack_tk(mob/user)
+ if(charging)
+ charging.update_icon()
+ charging.forceMove(loc)
charging = null
use_power = 1
update_icon()
@@ -73,43 +81,42 @@
if(stat & (NOPOWER|BROKEN) || !anchored)
return
+ var/using_power = 0
if(charging)
if(istype(charging, /obj/item/weapon/gun/energy))
var/obj/item/weapon/gun/energy/E = charging
if(E.power_supply.charge < E.power_supply.maxcharge)
- E.power_supply.give(1000)
- icon_state = icon_state_charging
- use_power(2500)
- else
- icon_state = icon_state_charged
- return
+ E.power_supply.give(E.power_supply.chargerate)
+ use_power(250)
+ using_power = 1
+
+
if(istype(charging, /obj/item/weapon/melee/baton))
var/obj/item/weapon/melee/baton/B = charging
- if(B.bcell && B.bcell.charge < B.bcell.maxcharge)
- B.bcell.charge += 1750
- icon_state = icon_state_charging
- use_power(2000)
- else
- icon_state = icon_state_charged
- return
- if(istype(charging, /obj/item/device/laptop))
- var/obj/item/device/laptop/L = charging
- if(L.stored_computer.battery.charge < L.stored_computer.battery.maxcharge)
- L.stored_computer.battery.give(1000)
- icon_state = icon_state_charging
- use_power(2500)
- else
- icon_state = icon_state_charged
+ if(B.bcell)
+ if(B.bcell.give(B.bcell.chargerate))
+ use_power(200)
+ using_power = 1
+
+ if(istype(charging, /obj/item/device/modular_computer))
+ var/obj/item/device/modular_computer/C = charging
+ var/obj/item/weapon/computer_hardware/battery/battery_module = C.all_components[MC_CELL]
+ if(battery_module)
+ var/obj/item/weapon/computer_hardware/battery/B = battery_module
+ if(B.battery)
+ if(B.battery.charge < B.battery.maxcharge)
+ B.battery.give(B.battery.chargerate)
+ use_power(200)
+ using_power = 1
+
if(istype(charging, /obj/item/weapon/rcs))
var/obj/item/weapon/rcs/R = charging
- if(R.rcell && R.rcell.charge < R.rcell.maxcharge)
- R.rcell.charge += 1750
- icon_state = icon_state_charging
- use_power(2000)
- else
- icon_state = icon_state_charged
- return
+ if(R.rcell)
+ if(R.rcell.give(R.rcell.chargerate))
+ use_power(200)
+ using_power = 1
+ update_icon(using_power)
/obj/machinery/recharger/emp_act(severity)
if(stat & (NOPOWER|BROKEN) || !anchored)
@@ -127,17 +134,23 @@
B.bcell.charge = 0
..(severity)
-/obj/machinery/recharger/update_icon() //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier.
+/obj/machinery/recharger/update_icon(using_power = 0) //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier.
+ if(stat & (NOPOWER|BROKEN) || !anchored)
+ icon_state = icon_state_off
+ return
if(charging)
- icon_state = icon_state_charging
- else
- icon_state = icon_state_idle
+ if(using_power)
+ icon_state = icon_state_charging
+ else
+ icon_state = icon_state_charged
+ return
+ icon_state = icon_state_idle
// Atlantis: No need for that copy-pasta code, just use var to store icon_states instead.
obj/machinery/recharger/wallcharger
name = "wall recharger"
- icon = 'icons/obj/stationobjs.dmi'
icon_state = "wrecharger0"
+ icon_state_off = "wrechargeroff"
icon_state_idle = "wrecharger0"
icon_state_charging = "wrecharger1"
icon_state_charged = "wrecharger2"
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 085fc9a9aa1..f0a635c73a8 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -159,10 +159,7 @@
R.adjustFireLoss(-(repairs))
R.updatehealth()
if(R.cell)
- if(R.cell.charge >= R.cell.maxcharge)
- R.cell.charge = R.cell.maxcharge
- else
- R.cell.charge = min(R.cell.charge + recharge_speed, R.cell.maxcharge)
+ R.cell.charge = min(R.cell.charge + recharge_speed, R.cell.maxcharge)
else if(istype(occupant, /mob/living/carbon/human))
var/mob/living/carbon/human/H = occupant
if(H.get_int_organ(/obj/item/organ/internal/cell) && H.nutrition < 450)
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index 4a9d8c439ae..698c1c5fe91 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -29,8 +29,7 @@ var/const/SAFETY_COOLDOWN = 100
update_icon()
/obj/machinery/recycler/Destroy()
- qdel(materials)
- materials = null
+ QDEL_NULL(materials)
return ..()
/obj/machinery/recycler/RefreshParts()
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index 577c24f5dc4..600dc3704fa 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -20,9 +20,7 @@
return
/obj/machinery/space_heater/Destroy()
- if(cell)
- qdel(cell)
- cell = null
+ QDEL_NULL(cell)
return ..()
/obj/machinery/space_heater/update_icon()
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index 2f0dc7b2666..8fb2d173b6f 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -41,8 +41,7 @@
..()
/obj/machinery/syndicatebomb/Destroy()
- qdel(wires)
- wires = null
+ QDEL_NULL(wires)
return ..()
/obj/machinery/syndicatebomb/examine(mob/user)
@@ -102,7 +101,7 @@
to_chat(user, "[payload] is already loaded into [src], you'll have to remove it first.")
else
..()
-
+
/obj/machinery/syndicatebomb/attack_ghost(mob/user)
interact(user)
@@ -122,7 +121,7 @@
return
else if(anchored)
to_chat(user, "The bomb is bolted to the floor!")
-
+
/obj/machinery/syndicatebomb/proc/can_interact(mob/user)
if(user.can_advanced_admin_interact())
return TRUE
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index d9996b6fb9c..e694ac98817 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -146,11 +146,8 @@
product_records.Add(product)
/obj/machinery/vending/Destroy()
- qdel(wires) // qdel
- wires = null
- if(coin)
- qdel(coin) // qdel
- coin = null
+ QDEL_NULL(wires)
+ QDEL_NULL(coin)
return ..()
/obj/machinery/vending/ex_act(severity)
@@ -1162,13 +1159,6 @@
/obj/item/weapon/screwdriver = 5,/obj/item/weapon/crowbar = 5)
//everything after the power cell had no amounts, I improvised. -Sayu
-
-/obj/machinery/vending/eva
- name = "\improper Hardsuit Kits"
- desc = "Conversion kits for your alien hardsuit needs."
- products = list(/obj/item/device/modkit = 6,/obj/item/device/modkit/tajaran = 6,/obj/item/device/modkit/unathi = 6,/obj/item/device/modkit/skrell = 6,/obj/item/device/modkit/vox = 6)
-
-
/obj/machinery/vending/sustenance
name = "\improper Sustenance Vendor"
desc = "A vending machine which vends food, as required by section 47-C of the NT's Prisoner Ethical Treatment Agreement."
diff --git a/code/game/mecha/combat/recitence.dm b/code/game/mecha/combat/reticence.dm
similarity index 83%
rename from code/game/mecha/combat/recitence.dm
rename to code/game/mecha/combat/reticence.dm
index 759d86a95c4..19eb34fb448 100644
--- a/code/game/mecha/combat/recitence.dm
+++ b/code/game/mecha/combat/reticence.dm
@@ -1,6 +1,6 @@
-/obj/mecha/combat/recitence
+/obj/mecha/combat/reticence
desc = "A silent, fast, and nigh-invisible miming exosuit. Popular among mimes and mime assassins."
- name = "\improper Recitence"
+ name = "\improper Reticence"
icon_state = "mime"
initial_icon = "mime"
step_in = 2
@@ -9,7 +9,7 @@
deflect_chance = 30
damage_absorption = list("brute"=0.75,"fire"=1,"bullet"=0.8,"laser"=0.7,"energy"=0.85,"bomb"=1)
max_temperature = 15000
- wreckage = /obj/effect/decal/mecha_wreckage/recitence
+ wreckage = /obj/effect/decal/mecha_wreckage/reticence
operation_req_access = list(access_mime)
add_req_access = 0
internal_damage_threshold = 60
@@ -18,7 +18,7 @@
stepsound = null
turnsound = null
-/obj/mecha/combat/recitence/loaded/New()
+/obj/mecha/combat/reticence/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine/silenced
ME.attach(src)
diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm
index 9e2a754bd4c..3f60c56a952 100644
--- a/code/game/mecha/equipment/tools/other_tools.dm
+++ b/code/game/mecha/equipment/tools/other_tools.dm
@@ -185,7 +185,7 @@
icon_state = "repair_droid"
origin_tech = "magnets=3;programming=3"
equip_cooldown = 20
- energy_drain = 100
+ energy_drain = 50
range = 0
var/health_boost = 1
var/icon/droid_overlay
diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm
index 3493f03dd69..7a0e388b39e 100644
--- a/code/game/mecha/equipment/tools/work_tools.dm
+++ b/code/game/mecha/equipment/tools/work_tools.dm
@@ -285,14 +285,14 @@
/obj/item/mecha_parts/mecha_equipment/mimercd
name = "mounted MRCD"
- desc = "An exosuit-mounted Mime Rapid Construction Device. (Can be attached to: Recitence)"
+ desc = "An exosuit-mounted Mime Rapid Construction Device. (Can be attached to: Reticence)"
icon_state = "mecha_rcd"
origin_tech = "materials=4;bluespace=3;magnets=4;powerstorage=4"
equip_cooldown = 10
energy_drain = 250
range = MELEE|RANGED
-/obj/item/mecha_parts/mecha_equipment/mimercd/can_attach(obj/mecha/combat/recitence/M)
+/obj/item/mecha_parts/mecha_equipment/mimercd/can_attach(obj/mecha/combat/reticence/M)
if(..())
if(istype(M))
return 1
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 0466aa698c6..a4c7b7d2f5d 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -78,7 +78,7 @@
equip_cooldown = 10
name = "CH-LC \"Solaris\" Laser Cannon"
icon_state = "mecha_laser"
- energy_drain = 40
+ energy_drain = 60
projectile = /obj/item/projectile/beam/laser/heavylaser
fire_sound = 'sound/weapons/lasercannonfire.ogg'
@@ -183,7 +183,7 @@
spawn(20)
if(thingy)
walk(thingy,0)
- for(var/obj/mecha/combat/recitence/R in oview(6, chassis))
+ for(var/obj/mecha/combat/reticence/R in oview(6, chassis))
R.occupant_message("\The [R] has protected you from [chassis]'s HONK at the cost of some power.")
R.use_power(R.get_charge() / 4)
@@ -244,7 +244,7 @@
projectiles = 20
projectile_energy_cost = 50
-/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine/silenced/can_attach(obj/mecha/combat/recitence/M as obj)
+/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine/silenced/can_attach(obj/mecha/combat/reticence/M as obj)
if(..())
if(istype(M))
return 1
@@ -448,7 +448,7 @@
desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demloishing solid obstacles."
icon_state = "mecha_plasmacutter"
item_state = "plasmacutter"
- energy_drain = 60
+ energy_drain = 30
origin_tech = "materials=3;combat=2;powerstorage=3;plasmatech=3"
projectile = /obj/item/projectile/plasma/adv/mech
fire_sound = 'sound/weapons/laser.ogg'
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index a3ed3ee1534..cd20b68f10d 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -39,7 +39,7 @@
"Gygax",
"Durand",
"H.O.N.K",
- "Recitence",
+ "Reticence",
"Phazon",
"Exosuit Equipment",
"Cyborg Upgrade Modules",
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 83e3112364e..1ad2bc83d96 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -629,8 +629,7 @@
else
qdel(cabin_air)
cabin_air = null
- qdel(spark_system)
- spark_system = null
+ QDEL_NULL(spark_system)
mechas_list -= src //global mech list
return ..()
@@ -663,7 +662,7 @@
/obj/mecha/emp_act(severity)
if(get_charge())
- use_power((cell.charge / 2) / severity)
+ use_power((cell.charge/3)/(severity*2))
take_damage(50 / severity, "energy")
log_message("EMP detected", 1)
check_for_internal_damage(list(MECHA_INT_FIRE, MECHA_INT_TEMP_CONTROL, MECHA_INT_CONTROL_LOST, MECHA_INT_SHORT_CIRCUIT), 1)
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index 76fa87f6988..b570f17ccfe 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -863,48 +863,48 @@
feedback_inc("mecha_honker_created",1)
return
-/datum/construction/mecha/recitence_chassis
- steps = list(list("key"=/obj/item/mecha_parts/part/recitence_torso),//1
- list("key"=/obj/item/mecha_parts/part/recitence_left_arm),//2
- list("key"=/obj/item/mecha_parts/part/recitence_right_arm),//3
- list("key"=/obj/item/mecha_parts/part/recitence_left_leg),//4
- list("key"=/obj/item/mecha_parts/part/recitence_right_leg),//5
- list("key"=/obj/item/mecha_parts/part/recitence_head)
+/datum/construction/mecha/reticence_chassis
+ steps = list(list("key"=/obj/item/mecha_parts/part/reticence_torso),//1
+ list("key"=/obj/item/mecha_parts/part/reticence_left_arm),//2
+ list("key"=/obj/item/mecha_parts/part/reticence_right_arm),//3
+ list("key"=/obj/item/mecha_parts/part/reticence_left_leg),//4
+ list("key"=/obj/item/mecha_parts/part/reticence_right_leg),//5
+ list("key"=/obj/item/mecha_parts/part/reticence_head)
)
-/datum/construction/mecha/recitence_chassis/action(atom/used_atom,mob/user as mob)
+/datum/construction/mecha/reticence_chassis/action(atom/used_atom,mob/user as mob)
return check_all_steps(used_atom,user)
-/datum/construction/mecha/recitence_chassis/custom_action(step, atom/used_atom, mob/user)
+/datum/construction/mecha/reticence_chassis/custom_action(step, atom/used_atom, mob/user)
user.visible_message("[user] has connected [used_atom] to the [holder].", "You connect [used_atom] to the [holder]")
holder.overlays += used_atom.icon_state + "+o"
qdel(used_atom)
return 1
-/datum/construction/mecha/recitence_chassis/spawn_result()
+/datum/construction/mecha/reticence_chassis/spawn_result()
var/obj/item/mecha_parts/chassis/const_holder = holder
- const_holder.construct = new /datum/construction/mecha/recitence(const_holder)
+ const_holder.construct = new /datum/construction/mecha/reticence(const_holder)
const_holder.density = 1
qdel(src)
return
-/datum/construction/mecha/recitence
- result = "/obj/mecha/combat/recitence"
+/datum/construction/mecha/reticence
+ result = "/obj/mecha/combat/reticence"
steps = list(list("key"=/obj/effect/dummy/mecha_emote_step),//1
list("key"=/obj/item/clothing/suit/suspenders),//2
list("key"=/obj/effect/dummy/mecha_emote_step),//3
list("key"=/obj/item/clothing/mask/gas/mime),//4
list("key"=/obj/effect/dummy/mecha_emote_step),//5
list("key"=/obj/item/clothing/head/beret),//6
- list("key"=/obj/item/weapon/circuitboard/mecha/recitence/targeting),//7
- list("key"=/obj/item/weapon/circuitboard/mecha/recitence/peripherals),//8
- list("key"=/obj/item/weapon/circuitboard/mecha/recitence/main),//9
+ list("key"=/obj/item/weapon/circuitboard/mecha/reticence/targeting),//7
+ list("key"=/obj/item/weapon/circuitboard/mecha/reticence/peripherals),//8
+ list("key"=/obj/item/weapon/circuitboard/mecha/reticence/main),//9
)
-/datum/construction/mecha/recitence/action(atom/used_atom,mob/user)
+/datum/construction/mecha/reticence/action(atom/used_atom,mob/user)
return check_step(used_atom,user)
-/datum/construction/mecha/recitence/custom_action(step, atom/used_atom, mob/user)
+/datum/construction/mecha/reticence/custom_action(step, atom/used_atom, mob/user)
if(!..())
return 0
@@ -935,9 +935,9 @@
qdel(used_atom)
return 1
-/datum/construction/mecha/recitence/spawn_result()
+/datum/construction/mecha/reticence/spawn_result()
..()
- feedback_inc("mecha_recitence_created",1)
+ feedback_inc("mecha_reticence_created",1)
return
/datum/construction/mecha/durand_chassis
diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm
index 60c352c20bd..11fed270bab 100644
--- a/code/game/mecha/mecha_parts.dm
+++ b/code/game/mecha/mecha_parts.dm
@@ -223,14 +223,14 @@
icon_state = "honker_r_leg"
-////////// Recitence
+////////// Reticence
-/obj/item/mecha_parts/chassis/recitence
- name = "Recitence Chassis"
+/obj/item/mecha_parts/chassis/reticence
+ name = "Reticence Chassis"
-/obj/item/mecha_parts/chassis/recitence/New()
+/obj/item/mecha_parts/chassis/reticence/New()
..()
- construct = new /datum/construction/mecha/recitence_chassis(src)
+ construct = new /datum/construction/mecha/reticence_chassis(src)
/obj/effect/dummy/mecha_emote_step
var/emote
@@ -238,37 +238,37 @@
/obj/effect/dummy/mecha_emote_step/New(e)
emote = e
-/obj/item/mecha_parts/chassis/recitence/hear_message(mob/living/M, msg)
- if(!istype(M) || !istype(construct, /datum/construction/mecha/recitence))
+/obj/item/mecha_parts/chassis/reticence/hear_message(mob/living/M, msg)
+ if(!istype(M) || !istype(construct, /datum/construction/mecha/reticence))
return
// is the current step the dummy emote object?
var/list/steps = construct.steps
if(steps[steps.len]["key"] == /obj/effect/dummy/mecha_emote_step)
construct.action(new /obj/effect/dummy/mecha_emote_step(msg), M)
-/obj/item/mecha_parts/part/recitence_torso
- name = "Recitence Torso"
- icon_state = "recitence_harness"
+/obj/item/mecha_parts/part/reticence_torso
+ name = "Reticence Torso"
+ icon_state = "reticence_harness"
-/obj/item/mecha_parts/part/recitence_head
- name = "Recitence Head"
- icon_state = "recitence_head"
+/obj/item/mecha_parts/part/reticence_head
+ name = "Reticence Head"
+ icon_state = "reticence_head"
-/obj/item/mecha_parts/part/recitence_left_arm
- name = "Recitence Left Arm"
- icon_state = "recitence_l_arm"
+/obj/item/mecha_parts/part/reticence_left_arm
+ name = "Reticence Left Arm"
+ icon_state = "reticence_l_arm"
-/obj/item/mecha_parts/part/recitence_right_arm
- name = "Recitence Right Arm"
- icon_state = "recitence_r_arm"
+/obj/item/mecha_parts/part/reticence_right_arm
+ name = "Reticence Right Arm"
+ icon_state = "reticence_r_arm"
-/obj/item/mecha_parts/part/recitence_left_leg
- name = "Recitence Left Leg"
- icon_state = "recitence_l_leg"
+/obj/item/mecha_parts/part/reticence_left_leg
+ name = "Reticence Left Leg"
+ icon_state = "reticence_l_leg"
-/obj/item/mecha_parts/part/recitence_right_leg
- name = "Recitence Right Leg"
- icon_state = "recitence_r_leg"
+/obj/item/mecha_parts/part/reticence_right_leg
+ name = "Reticence Right Leg"
+ icon_state = "reticence_r_leg"
////////// Phazon
@@ -455,19 +455,19 @@
name = "Circuit board (H.O.N.K Central Control module)"
icon_state = "mainboard"
-/obj/item/weapon/circuitboard/mecha/recitence
+/obj/item/weapon/circuitboard/mecha/reticence
origin_tech = "programming=4"
-/obj/item/weapon/circuitboard/mecha/recitence/peripherals
- name = "circuit board (Reticience Peripherals Control module)"
+/obj/item/weapon/circuitboard/mecha/reticence/peripherals
+ name = "circuit board (Reticence Peripherals Control module)"
icon_state = "mcontroller"
-/obj/item/weapon/circuitboard/mecha/recitence/targeting
- name = "circuit board (Reticience Weapon Control and Targeting module)"
+/obj/item/weapon/circuitboard/mecha/reticence/targeting
+ name = "circuit board (Reticence Weapon Control and Targeting module)"
icon_state = "mcontroller"
-/obj/item/weapon/circuitboard/mecha/recitence/main
- name = "circuit board (Reticience Central Control module)"
+/obj/item/weapon/circuitboard/mecha/reticence/main
+ name = "circuit board (Reticence Central Control module)"
icon_state = "mainboard"
/obj/item/weapon/circuitboard/mecha/odysseus
diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm
index c115119cc97..af6f2f20b3f 100644
--- a/code/game/mecha/mecha_wreckage.dm
+++ b/code/game/mecha/mecha_wreckage.dm
@@ -118,8 +118,8 @@
name = "Seraph wreckage"
icon_state = "seraph-broken"
-/obj/effect/decal/mecha_wreckage/recitence
- name = "\improper Recitence wreckage"
+/obj/effect/decal/mecha_wreckage/reticence
+ name = "\improper Reticence wreckage"
icon_state = "mime-broken"
/obj/effect/decal/mecha_wreckage/ripley
diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm
index 434fec620b8..89baf450720 100644
--- a/code/game/objects/effects/anomalies.dm
+++ b/code/game/objects/effects/anomalies.dm
@@ -19,8 +19,9 @@
var/new_frequency = sanitize_frequency(rand(PUBLIC_LOW_FREQ, PUBLIC_HIGH_FREQ))
aSignal.set_frequency(new_frequency)
poi_list |= src
-
+
/obj/effect/anomaly/Destroy()
+ QDEL_NULL(aSignal)
poi_list.Remove(src)
return ..()
diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm
index 48a85e7e704..cfde9ab55a4 100644
--- a/code/game/objects/effects/decals/cleanable.dm
+++ b/code/game/objects/effects/decals/cleanable.dm
@@ -1,9 +1,8 @@
/obj/effect/decal/cleanable
var/list/random_icon_states = list()
- var/targeted_by = null // Used so cleanbots can't claim a mess.
var/noscoop = 0 //if it has this, don't let it be scooped up
var/noclear = 0 //if it has this, don't delete it when its' scooped up
-
+
/obj/effect/decal/cleanable/proc/can_bloodcrawl_in()
return FALSE
diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm
index 4df0c51ed4d..b7967ee02cb 100644
--- a/code/game/objects/effects/glowshroom.dm
+++ b/code/game/objects/effects/glowshroom.dm
@@ -36,9 +36,7 @@
to_chat(user, "This is a [generation]\th generation [name]!")
/obj/structure/glowshroom/Destroy()
- if(myseed)
- qdel(myseed)
- myseed = null
+ QDEL_NULL(myseed)
return ..()
/obj/structure/glowshroom/New(loc, obj/item/seeds/newseed, mutate_stats)
diff --git a/code/game/objects/effects/spawners/random_barrier.dm b/code/game/objects/effects/spawners/random_barrier.dm
index ff165fff38a..3fd81bcf9b0 100644
--- a/code/game/objects/effects/spawners/random_barrier.dm
+++ b/code/game/objects/effects/spawners/random_barrier.dm
@@ -28,15 +28,13 @@
name = "probably a wall"
result = list(
/turf/simulated/wall = 9,
- /obj/structure/falsewall = 1
- )
+ /obj/structure/falsewall = 1)
/obj/effect/spawner/random_barrier/floor_probably
name = "probably a floor"
result = list(
/turf/simulated/floor/plasteel = 3,
- /turf/simulated/wall = 1
- )
+ /turf/simulated/wall = 1)
/obj/effect/spawner/random_barrier/obstruction
name = "obstruction"
@@ -44,12 +42,24 @@
/turf/simulated/wall = 1,
/obj/structure/falsewall = 1,
/obj/structure/barricade/wooden = 1,
- /obj/machinery/door/airlock/welded = 1
- )
+ /obj/machinery/door/airlock/welded = 1)
-/obj/effect/spawner/random_barrier/possibly_welded_airlock
+/obj/effect/spawner/random_barrier/possibly_welded_airlock // these have no access restrictions, so for internal maintenance only
name = "possibly welded airlock"
result = list(
/obj/machinery/door/airlock = 3,
- /obj/machinery/door/airlock/welded = 1
- )
+ /obj/machinery/door/airlock/welded = 1)
+
+/obj/effect/spawner/random_spawners/grille_often
+ name = "grille often"
+ result = list(
+ /obj/structure/grille = 8,
+ /obj/structure/grille/broken = 4,
+ /turf/simulated/floor/plating = 2)
+
+/obj/effect/spawner/random_spawners/grille_maybe
+ name = "grille maybe"
+ result = list(
+ /obj/structure/grille = 2,
+ /obj/structure/grille/broken = 2,
+ /turf/simulated/floor/plating = 5)
diff --git a/code/game/objects/effects/spawners/random_spawners.dm b/code/game/objects/effects/spawners/random_spawners.dm
new file mode 100644
index 00000000000..621c8799cc2
--- /dev/null
+++ b/code/game/objects/effects/spawners/random_spawners.dm
@@ -0,0 +1,110 @@
+/obj/effect/spawner/random_spawners
+ name = "random spawners"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "x2"
+ color = "#00FF00"
+ var/list/result = list(
+ /turf/simulated/floor/plasteel = 1,
+ /turf/simulated/floor/plating = 1,
+ /obj/effect/decal/cleanable/blood/splatter = 1,
+ /obj/effect/decal/cleanable/blood/oil = 1,
+ /obj/effect/decal/cleanable/fungus = 1)
+
+// This needs to come before the initialization wave because
+// the thing it creates might need to be initialized too
+/obj/effect/spawner/random_spawners/New()
+ . = ..()
+ var/turf/T = get_turf(src)
+ if(!T)
+ log_runtime(EXCEPTION("Spawner placed in nullspace!"), src)
+ return
+ var/thing_to_place = pickweight(result)
+ if(ispath(thing_to_place, /turf))
+ T.ChangeTurf(thing_to_place)
+ else
+ new thing_to_place(T)
+ qdel(src)
+
+/obj/effect/spawner/random_spawners/blood_maybe
+ name = "blood maybe"
+ result = list(
+ /turf/simulated/floor/plating = 20,
+ /obj/effect/decal/cleanable/blood/splatter = 1)
+
+/obj/effect/spawner/random_spawners/blood_often
+ name = "blood often"
+ result = list(
+ /turf/simulated/floor/plating = 5,
+ /obj/effect/decal/cleanable/blood/splatter = 1)
+
+/obj/effect/spawner/random_spawners/oil_maybe
+ name = "oil maybe"
+ result = list(
+ /turf/simulated/floor/plating = 20,
+ /obj/effect/decal/cleanable/blood/oil = 1)
+
+/obj/effect/spawner/random_spawners/oil_maybe
+ name = "oil often"
+ result = list(
+ /turf/simulated/floor/plating = 5,
+ /obj/effect/decal/cleanable/blood/oil = 1)
+
+/obj/effect/spawner/random_spawners/wall_rusted_probably
+ name = "rusted wall probably"
+ result = list(
+ /turf/simulated/wall = 2,
+ /turf/simulated/wall/rust = 7)
+
+/obj/effect/spawner/random_spawners/wall_rusted_maybe
+ name = "rusted wall maybe"
+ result = list(
+ /turf/simulated/wall = 7,
+ /turf/simulated/wall/rust = 1)
+
+/obj/effect/spawner/random_spawners/cobweb_left_frequent
+ name = "cobweb left frequent"
+ result = list(
+ /turf/simulated/floor/plating = 1,
+ /obj/effect/decal/cleanable/cobweb = 1)
+
+/obj/effect/spawner/random_spawners/cobweb_right_frequent
+ name = "cobweb right frequent"
+ result = list(
+ /turf/simulated/floor/plating = 1,
+ /obj/effect/decal/cleanable/cobweb2 = 1)
+
+/obj/effect/spawner/random_spawners/cobweb_left_rare
+ name = "cobweb left rare"
+ result = list(
+ /turf/simulated/floor/plating = 10,
+ /obj/effect/decal/cleanable/cobweb = 1)
+
+/obj/effect/spawner/random_spawners/cobweb_right_rare
+ name = "cobweb right rare"
+ result = list(
+ /turf/simulated/floor/plating = 10,
+ /obj/effect/decal/cleanable/cobweb2 = 1)
+
+/obj/effect/spawner/random_spawners/dirt_frequent
+ name = "dirt frequent"
+ result = list(
+ /turf/simulated/floor/plating = 1,
+ /obj/effect/decal/cleanable/dirt = 1)
+
+/obj/effect/spawner/random_spawners/dirt_rare
+ name = "dirt rare"
+ result = list(
+ /turf/simulated/floor/plating = 10,
+ /obj/effect/decal/cleanable/dirt = 1)
+
+/obj/effect/spawner/random_spawners/fungus_maybe
+ name = "rusted wall maybe"
+ result = list(
+ /turf/simulated/wall = 7,
+ /obj/effect/decal/cleanable/fungus = 1)
+
+/obj/effect/spawner/random_spawners/fungus_probably
+ name = "rusted wall maybe"
+ result = list(
+ /turf/simulated/wall = 1,
+ /obj/effect/decal/cleanable/fungus = 7)
diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm
index 8ed8d045de4..0a9f49cd2d0 100644
--- a/code/game/objects/effects/spiders.dm
+++ b/code/game/objects/effects/spiders.dm
@@ -6,6 +6,11 @@
anchored = 1
density = 0
var/health = 15
+ var/master_commander = null
+
+/obj/structure/spider/Destroy()
+ master_commander = null
+ return ..()
//similar to weeds, but only barfed out by nurses manually
/obj/structure/spider/ex_act(severity)
@@ -78,7 +83,6 @@
var/amount_grown = 0
var/player_spiders = 0
var/faction = list()
- var/master_commander = null
/obj/structure/spider/eggcluster/New()
pixel_x = rand(3,-3)
@@ -110,7 +114,6 @@
var/travelling_in_vent = 0
var/player_spiders = 0
var/faction = list()
- var/master_commander = null
var/selecting_player = 0
/obj/structure/spider/spiderling/New()
@@ -118,6 +121,10 @@
pixel_y = rand(6,-6)
processing_objects.Add(src)
+/obj/structure/spider/spiderling/Destroy()
+ entry_vent = null
+ return ..()
+
/obj/structure/spider/spiderling/Bump(atom/user)
if(istype(user, /obj/structure/table))
src.loc = user.loc
diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm
index 4c2c5420d1a..95cf94a3a1e 100644
--- a/code/game/objects/items/control_wand.dm
+++ b/code/game/objects/items/control_wand.dm
@@ -19,9 +19,7 @@
ID.access = get_region_accesses(region_access)
/obj/item/weapon/door_remote/Destroy()
- if(ID)
- qdel(ID)
- ID = null
+ QDEL_NULL(ID)
return ..()
/obj/item/weapon/door_remote/attack_self(mob/user)
diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm
index 991d04fbd63..3125c24837a 100644
--- a/code/game/objects/items/dehy_carp.dm
+++ b/code/game/objects/items/dehy_carp.dm
@@ -8,6 +8,11 @@
var/mob/owner = null // Carp doesn't attack owner, set when using in hand
var/owned = 1 // Boolean, no owner to begin with
+
+/obj/item/toy/carpplushie/dehy_carp/Destroy()
+ owner = null
+ return ..()
+
// Attack self
/obj/item/toy/carpplushie/dehy_carp/attack_self(mob/user as mob)
src.add_fingerprint(user) // Anyone can add their fingerprints to it with this
diff --git a/code/game/objects/items/devices/autopsy.dm b/code/game/objects/items/devices/autopsy.dm
index 53ccc233b68..7ebf13e538b 100644
--- a/code/game/objects/items/devices/autopsy.dm
+++ b/code/game/objects/items/devices/autopsy.dm
@@ -66,12 +66,8 @@
if(O.trace_chemicals[V] > 0 && !chemtraces.Find(V))
chemtraces += V
-/obj/item/weapon/autopsy_scanner/verb/print_data()
- set name = "Print Data"
- set category = "Object"
- set src in oview(1)
-
- if(usr.incapacitated())
+/obj/item/weapon/autopsy_scanner/attack_self(mob/user)
+ if(!wdata.len && !chemtraces.len)
return
var/scan_data = ""
@@ -142,18 +138,17 @@
for(var/chemID in chemtraces)
scan_data += chemID
scan_data += "
"
-
- usr.visible_message("[src] rattles and prints out a sheet of paper.")
+ user.visible_message("[src] rattles and prints out a sheet of paper.")
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
sleep(10)
- var/obj/item/weapon/paper/P = new(usr.loc)
+ var/obj/item/weapon/paper/P = new(user.loc)
P.name = "Autopsy Data ([target_name])"
P.info = "[scan_data]"
P.overlays += "paper_words"
- usr.put_in_hands(P)
+ user.put_in_hands(P)
/obj/item/weapon/autopsy_scanner/attack(mob/living/carbon/human/M, mob/living/carbon/user)
if(!istype(M))
diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm
index 52a9a343e6b..fefb20e90e4 100644
--- a/code/game/objects/items/devices/flash.dm
+++ b/code/game/objects/items/devices/flash.dm
@@ -152,7 +152,7 @@
if(M.stat == CONSCIOUS)
M.mind_initialize() //give them a mind datum if they don't have one.
var/resisted
- if(!isloyal(M))
+ if(!ismindshielded(M))
if(user.mind in ticker.mode.head_revolutionaries)
if(ticker.mode.add_revolutionary(M.mind))
times_used -- //Flashes less likely to burn out for headrevs when used for conversion
diff --git a/code/game/objects/items/devices/guitar.dm b/code/game/objects/items/devices/guitar.dm
index bb11c5f0a2a..6c0e4645cc9 100644
--- a/code/game/objects/items/devices/guitar.dm
+++ b/code/game/objects/items/devices/guitar.dm
@@ -17,8 +17,7 @@
song.instrumentExt = "ogg"
/obj/item/device/guitar/Destroy()
- qdel(song)
- song = null
+ QDEL_NULL(song)
return ..()
/obj/item/device/guitar/attack_self(mob/user as mob)
diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm
index deb677b23dd..b172ea052f0 100644
--- a/code/game/objects/items/devices/laserpointer.dm
+++ b/code/game/objects/items/devices/laserpointer.dm
@@ -35,9 +35,7 @@
pointer_icon_state = pick("red_laser","green_laser","blue_laser","purple_laser")
/obj/item/device/laser_pointer/Destroy()
- if(diode)
- qdel(diode)
- diode = null
+ QDEL_NULL(diode)
return ..()
/obj/item/device/laser_pointer/upgraded/New()
diff --git a/code/game/objects/items/devices/modkit.dm b/code/game/objects/items/devices/modkit.dm
deleted file mode 100644
index a4e0fba0c6c..00000000000
--- a/code/game/objects/items/devices/modkit.dm
+++ /dev/null
@@ -1,87 +0,0 @@
-#define MODKIT_HELMET 1
-#define MODKIT_SUIT 2
-#define MODKIT_FULL 3
-
-/obj/item/device/modkit
- name = "hardsuit modification kit"
- desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user."
- icon_state = "modkit"
- var/parts = MODKIT_FULL
- var/target_species = "Human"
-
- var/list/permitted_types = list(
- /obj/item/clothing/head/helmet/space/hardsuit,
- /obj/item/clothing/suit/space/hardsuit
- )
-
-/obj/item/device/modkit/afterattack(obj/item/O, mob/user as mob, proximity)
- if(!proximity)
- return
-
- if(!target_species)
- return //it shouldn't be null, okay?
-
- if(!parts)
- to_chat(user, "This kit has no parts for this modification left.")
- user.unEquip(src)
- qdel(src)
- return
-
- var/allowed = 0
- for(var/permitted_type in permitted_types)
- if(istype(O, permitted_type))
- allowed = 1
-
- var/obj/item/clothing/I = O
- if(!istype(I) || !allowed)
- to_chat(user, "[src] is unable to modify that.")
- return
-
- var/excluding = ("exclude" in I.species_restricted)
- var/in_list = (target_species in I.species_restricted)
- if(excluding ^ in_list)
- to_chat(user, "[I] is already modified.")
- return
-
- if(!isturf(O.loc))
- to_chat(user, "[O] must be safely placed on the ground for modification.")
- return
-
- playsound(user.loc, O.usesound, 100, 1)
-
- user.visible_message("[user] opens \the [src] and modifies \the [O].","You open \the [src] and modify \the [O].")
-
- I.refit_for_species(target_species)
-
- if(istype(I, /obj/item/clothing/head/helmet))
- parts &= ~MODKIT_HELMET
- if(istype(I, /obj/item/clothing/suit))
- parts &= ~MODKIT_SUIT
-
- if(!parts)
- user.unEquip(src)
- qdel(src)
-
-/obj/item/device/modkit/examine(mob/user)
- ..(user)
- to_chat(user, "It looks as though it modifies hardsuits to fit [target_species] users.")
-
-/obj/item/device/modkit/tajaran
- name = "Tajaran hardsuit modification kit"
- desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user. This one looks like it's meant for Tajaran."
- target_species = "Tajaran"
-
-/obj/item/device/modkit/unathi
- name = "Unathi hardsuit modification kit"
- desc = "A kit containing all the needed tools and parts to modify a hardsuit for another species. This one looks like it's meant for Unathi."
- target_species = "Unathi"
-
-/obj/item/device/modkit/skrell
- name = "Skrell hardsuit modification kit"
- desc = "A kit containing all the needed tools and parts to modify a hardsuit for another species. This one looks like it's meant for Skrell."
- target_species = "Skrell"
-
-/obj/item/device/modkit/vox
- name = "Vox hardsuit modification kit"
- desc = "A kit containing all the needed tools and parts to modify a hardsuit for another species. This one looks like it's meant for Vox."
- target_species = "Vox"
\ No newline at end of file
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index e734f22b97f..4483a920355 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -32,6 +32,9 @@
// Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby.
+/obj/item/device/multitool/Destroy()
+ buffer = null
+ return ..()
/obj/item/device/multitool/ai_detect
var/track_cooldown = 0
@@ -56,7 +59,7 @@
multitool_detect()
icon_state = "[initial(icon_state)][detect_state]"
track_cooldown = world.time + track_delay
-
+
/obj/item/device/multitool/ai_detect/proc/multitool_detect()
var/turf/our_turf = get_turf(src)
for(var/mob/living/silicon/ai/AI in ai_list)
@@ -76,7 +79,7 @@
if(get_dist(our_turf, detect_turf) < rangewarning)
detect_state = PROXIMITY_NEAR
break
-
+
/obj/item/device/multitool/ai_detect/admin
desc = "Used for pulsing wires to test which to cut. Not recommended by doctors. Has a strange tag that says 'Grief in Safety'" //What else should I say for a meme item?
track_delay = 5
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index a29ff438f51..763666f36c7 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -12,7 +12,7 @@
var/looking_for_personality = 0
var/mob/living/silicon/pai/pai
var/list/faction = list("neutral") // The factions the pAI will inherit from the card
-
+
/obj/item/device/paicard/syndicate
name = "syndicate personal AI device"
faction = list("syndicate")
@@ -33,9 +33,7 @@
pai.ghostize()
qdel(pai)
pai = null
- if(radio)
- qdel(radio)
- radio = null
+ QDEL_NULL(radio)
return ..()
/obj/item/device/paicard/attack_self(mob/user)
diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index 25e975fa920..65093361197 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -13,7 +13,7 @@
materials = list(MAT_METAL=750)
origin_tech = "powerstorage=3;syndicate=5"
var/drain_rate = 1600000 // amount of power to drain per tick
- var/apc_drain_rate = 5000 // Max. amount drained from single APC. In Watts.
+ var/apc_drain_rate = 50 // Max. amount drained from single APC. In Watts.
var/dissipation_rate = 20000 // Passive dissipation of drained power. In Watts.
var/power_drained = 0 // Amount of power drained.
var/max_power = 1e10 // Detonation point.
@@ -27,6 +27,8 @@
/obj/item/device/powersink/Destroy()
processing_objects.Remove(src)
processing_power_items.Remove(src)
+ PN = null
+ attached = null
return ..()
/obj/item/device/powersink/attackby(var/obj/item/I, var/mob/user)
@@ -110,10 +112,10 @@
if(istype(T.master, /obj/machinery/power/apc))
var/obj/machinery/power/apc/A = T.master
if(A.operating && A.cell)
- var/cur_charge = A.cell.charge / CELLRATE
- var/drain_val = min(apc_drain_rate, cur_charge)
- A.cell.use(drain_val * CELLRATE)
- drained += drain_val
+ A.cell.charge = max(0, A.cell.charge - apc_drain_rate)
+ drained += apc_drain_rate
+ if(A.charging == 2) // If the cell was full
+ A.charging = 1 // It's no longer full
power_drained += drained
return 1
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 30e02824cd1..9fd1e40b4f7 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -32,12 +32,8 @@
recalculateChannels(1)
/obj/item/device/radio/headset/Destroy()
- if(keyslot1)
- qdel(keyslot1)
- if(keyslot2)
- qdel(keyslot2)
- keyslot1 = null
- keyslot2 = null
+ QDEL_NULL(keyslot1)
+ QDEL_NULL(keyslot2)
return ..()
/obj/item/device/radio/headset/list_channels(var/mob/user)
@@ -63,7 +59,7 @@
return RADIO_CONNECTION_FAIL
return ..()
-
+
/obj/item/device/radio/headset/is_listening()
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
@@ -71,7 +67,7 @@
return ..()
else if(isanimal(loc) || isAI(loc))
return ..()
-
+
return FALSE
/obj/item/device/radio/headset/alt
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index efad9162785..b48f21a60cd 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -30,7 +30,6 @@ var/global/list/default_medbay_channels = list(
var/frequency = PUB_FREQ //common chat
var/traitor_frequency = 0 //tune to frequency to unlock traitor supplies
var/canhear_range = 3 // the range which mobs can hear this radio from
- var/obj/item/device/radio/patch_link = null
var/datum/wires/radio/wires = null
var/b_stat = 0
var/broadcasting = 0
@@ -54,14 +53,14 @@ var/global/list/default_medbay_channels = list(
var/list/internal_channels
-/obj/item/device/radio
var/datum/radio_frequency/radio_connection
var/list/datum/radio_frequency/secure_radio_connections = new
- proc/set_frequency(new_frequency)
- radio_controller.remove_object(src, frequency)
- frequency = new_frequency
- radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT)
+
+/obj/item/device/radio/proc/set_frequency(new_frequency)
+ radio_controller.remove_object(src, frequency)
+ frequency = new_frequency
+ radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT)
/obj/item/device/radio/New()
@@ -74,14 +73,13 @@ var/global/list/default_medbay_channels = list(
global_radios |= src
/obj/item/device/radio/Destroy()
- qdel(wires)
- wires = null
+ QDEL_NULL(wires)
if(radio_controller)
radio_controller.remove_object(src, frequency)
for(var/ch_name in channels)
radio_controller.remove_object(src, radiochannels[ch_name])
- patch_link = null
global_radios -= src
+ follow_target = null
return ..()
@@ -271,7 +269,7 @@ var/global/list/default_medbay_channels = list(
/mob/living/automatedannouncer/Destroy()
if(lifetime_timer)
deltimer(lifetime_timer)
- ..()
+ return ..()
/mob/living/automatedannouncer/proc/autocleanup()
log_runtime(EXCEPTION("An announcer somehow managed to outlive the radio! Deleting!"), src, list("Message: '[message]'"))
diff --git a/code/game/objects/items/devices/sensor_device.dm b/code/game/objects/items/devices/sensor_device.dm
index e1dd31b79be..79fc2f92457 100644
--- a/code/game/objects/items/devices/sensor_device.dm
+++ b/code/game/objects/items/devices/sensor_device.dm
@@ -12,8 +12,7 @@
crew_monitor = new(src)
/obj/item/device/sensor_device/Destroy()
- qdel(crew_monitor)
- crew_monitor = null
+ QDEL_NULL(crew_monitor)
return ..()
/obj/item/device/sensor_device/attack_self(mob/user as mob)
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index 43aff1cb05d..6ec1a36504b 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -21,9 +21,7 @@
update_icon()
/obj/item/device/taperecorder/Destroy()
- if(mytape)
- qdel(mytape)
- mytape = null
+ QDEL_NULL(mytape)
return ..()
/obj/item/device/taperecorder/examine(mob/user)
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index ba62169b886..877cb1a5fc9 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -13,15 +13,9 @@
origin_tech = "materials=1;engineering=1"
/obj/item/device/transfer_valve/Destroy()
- if(tank_one)
- qdel(tank_one)
- tank_one = null
- if(tank_two)
- qdel(tank_two)
- tank_two = null
- if(attached_device)
- qdel(attached_device)
- attached_device = null
+ QDEL_NULL(tank_one)
+ QDEL_NULL(tank_two)
+ QDEL_NULL(attached_device)
attacher = null
return ..()
diff --git a/code/game/objects/items/devices/violin.dm b/code/game/objects/items/devices/violin.dm
index 3ad1e98d6a6..3ef6b2bef85 100644
--- a/code/game/objects/items/devices/violin.dm
+++ b/code/game/objects/items/devices/violin.dm
@@ -18,8 +18,7 @@
song.instrumentExt = "ogg"
/obj/item/device/violin/Destroy()
- qdel(song)
- song = null
+ QDEL_NULL(song)
return ..()
/obj/item/device/violin/initialize()
diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm
index 855c97d9b12..a7a45de8cb8 100644
--- a/code/game/objects/items/latexballoon.dm
+++ b/code/game/objects/items/latexballoon.dm
@@ -12,9 +12,7 @@
var/datum/gas_mixture/air_contents = null
/obj/item/latexballon/Destroy()
- if(air_contents)
- qdel(air_contents)
- air_contents = null
+ QDEL_NULL(air_contents)
return ..()
/obj/item/latexballon/proc/blow(obj/item/weapon/tank/tank, mob/user)
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index f475bb83c98..5598a42cc8f 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -59,8 +59,7 @@ RCD
return
/obj/item/weapon/rcd/Destroy()
- qdel(spark_system)
- spark_system = null
+ QDEL_NULL(spark_system)
rcd_list -= src
return ..()
diff --git a/code/game/objects/items/weapons/RCL.dm b/code/game/objects/items/weapons/RCL.dm
index 524fd38eb80..8e0357ecd13 100644
--- a/code/game/objects/items/weapons/RCL.dm
+++ b/code/game/objects/items/weapons/RCL.dm
@@ -62,9 +62,7 @@
to_chat(user, "It contains [loaded.amount]/[max_amount] cables.")
/obj/item/weapon/twohanded/rcl/Destroy()
- if(loaded)
- qdel(loaded)
- loaded = null
+ QDEL_NULL(loaded)
last = null
active = 0
return ..()
diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm
index f0c4f1e60d6..2b46e8de101 100644
--- a/code/game/objects/items/weapons/cigs.dm
+++ b/code/game/objects/items/weapons/cigs.dm
@@ -46,8 +46,7 @@ LIGHTERS ARE IN LIGHTERS.DM
reagents.set_reacting(FALSE) // so it doesn't react until you light it
/obj/item/clothing/mask/cigarette/Destroy()
- if(reagents)
- qdel(reagents)
+ QDEL_NULL(reagents)
processing_objects -= src
return ..()
@@ -94,6 +93,17 @@ LIGHTERS ARE IN LIGHTERS.DM
else if(istype(W, /obj/item/device/assembly/igniter))
light("[user] fiddles with [W], and manages to light their [name].")
+ else if(istype(W, /obj/item/weapon/gun/magic/wand/fireball))
+ var/obj/item/weapon/gun/magic/wand/fireball/F = W
+ if(F.charges)
+ if(prob(50) || user.mind.assigned_role == "Wizard")
+ light("Holy shit, did [user] just manage to light their [name] with [W], with only moderate eyebrow singing?")
+ else
+ to_chat(user, "Unsure which end of the wand is which, [user] fails to light [name] with [W].")
+ explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2)
+ F.charges--
+
+
//can't think of any other way to update the overlays :<
user.update_inv_wear_mask()
user.update_inv_l_hand()
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index 4151cdc0d05..329ea2f9ce3 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -172,12 +172,8 @@
if(on)
var/M = get(paddles, /mob)
remove_paddles(M)
- if(paddles)
- qdel(paddles)
- paddles = null
- if(bcell)
- qdel(bcell)
- bcell = null
+ QDEL_NULL(paddles)
+ QDEL_NULL(bcell)
return ..()
/obj/item/weapon/defibrillator/proc/deductcharge(var/chrgdeductamt)
diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm
index f82e845d61d..b4d0e0b5eaa 100644
--- a/code/game/objects/items/weapons/dna_injector.dm
+++ b/code/game/objects/items/weapons/dna_injector.dm
@@ -5,7 +5,7 @@
icon_state = "dnainjector"
item_state = "dnainjector"
var/block = 0
- var/datum/dna2/record/buf=null
+ var/datum/dna2/record/buf = null
throw_speed = 3
throw_range = 5
w_class = 1
@@ -26,6 +26,10 @@
buf.dna.ResetSE()
SetValue(value)
+/obj/item/weapon/dnainjector/Destroy()
+ QDEL_NULL(buf)
+ return ..()
+
/obj/item/weapon/dnainjector/proc/GetRealBlock(var/selblock)
if(selblock==0)
return block
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index bd6a18b73c1..13a9186058e 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -18,10 +18,9 @@
..()
/obj/item/weapon/grenade/plastic/Destroy()
- qdel(nadeassembly)
- nadeassembly = null
+ QDEL_NULL(nadeassembly)
target = null
- ..()
+ return ..()
/obj/item/weapon/grenade/plastic/attackby(obj/item/I, mob/user, params)
if(!nadeassembly && istype(I, /obj/item/device/assembly_holder))
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index 71dafff99ff..70fbde22224 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -25,15 +25,10 @@
/obj/item/weapon/flamethrower/Destroy()
- if(weldtool)
- qdel(weldtool)
- weldtool = null
- if(igniter)
- qdel(igniter)
- igniter = null
- if(ptank)
- qdel(ptank)
- ptank = null
+ QDEL_NULL(weldtool)
+ QDEL_NULL(igniter)
+ QDEL_NULL(ptank)
+ previousturf = null
return ..()
diff --git a/code/game/objects/items/weapons/garrote.dm b/code/game/objects/items/weapons/garrote.dm
index 04470cf7854..196b0d269a0 100644
--- a/code/game/objects/items/weapons/garrote.dm
+++ b/code/game/objects/items/weapons/garrote.dm
@@ -13,6 +13,10 @@
var/improvised = 0
var/garrote_time
+/obj/item/weapon/twohanded/garrote/Destroy()
+ strangling = null
+ return ..()
+
/obj/item/weapon/twohanded/garrote/update_icon()
if(strangling) // If we're strangling someone we want our icon to stay wielded
icon_state = "garrot_unwrap"
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 6ca1d53e5db..cf649bae421 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -26,6 +26,12 @@
payload_name += " " // formatting, ignore me
update_icon()
+/obj/item/weapon/grenade/chem_grenade/Destroy()
+ QDEL_NULL(nadeassembly)
+ for(var/thing in beakers)
+ qdel(thing)
+ beakers.Cut()
+ return ..()
/obj/item/weapon/grenade/chem_grenade/examine(mob/user)
..(user)
diff --git a/code/game/objects/items/weapons/holosign.dm b/code/game/objects/items/weapons/holosign.dm
index dac93f9cb04..1a5542b5ef5 100644
--- a/code/game/objects/items/weapons/holosign.dm
+++ b/code/game/objects/items/weapons/holosign.dm
@@ -13,6 +13,12 @@
var/list/signs = list()
var/max_signs = 20
+/obj/item/weapon/holosign_creator/Destroy()
+ for(var/sign in signs)
+ qdel(sign)
+ signs.Cut()
+ return ..()
+
/obj/item/weapon/holosign_creator/afterattack(atom/target, mob/user, flag)
if(flag)
var/turf/T = get_turf(target)
diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm
index 68d75f1e7bb..cda1145d90c 100644
--- a/code/game/objects/items/weapons/holy_weapons.dm
+++ b/code/game/objects/items/weapons/holy_weapons.dm
@@ -592,7 +592,7 @@
to_chat(missionary, "Your faith is strong, but their mind is already slaved to someone else's ideals. Perhaps an inquisition would reveal more...")
faith -= 25 //same faith cost as losing sight of them mid-conversion, but did you just find someone who can lead you to a fellow traitor?
return
- if(isloyal(target))
+ if(ismindshielded(target))
if(prob(20)) //loyalty implants typically overpower this, but you CAN get lucky and convert still (20% chance of success)
faith -= 125 //yes, this puts it negative. it's gonna take longer to recharge if you manage to convert a one of these people to balance the new power you gained through them
to_chat(missionary, "Through sheer willpower, you overcome their closed mind and rally [target] to your cause! You may need a bit longer than usual before your faith is fully recharged, and they won't remain loyal to you for long ...")
diff --git a/code/game/objects/items/weapons/implants/implant_abductor.dm b/code/game/objects/items/weapons/implants/implant_abductor.dm
new file mode 100644
index 00000000000..4985576e66c
--- /dev/null
+++ b/code/game/objects/items/weapons/implants/implant_abductor.dm
@@ -0,0 +1,46 @@
+/obj/item/weapon/implant/abductor
+ name = "recall implant"
+ desc = "Returns you to the mothership."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "implant"
+ activated = 1
+ origin_tech = "materials=2;biotech=7;magnets=4;bluespace=4;abductor=5"
+ var/obj/machinery/abductor/pad/home
+ var/cooldown = 30
+ var/total_cooldown = 30
+
+/obj/item/weapon/implant/abductor/activate()
+ if(cooldown == total_cooldown)
+ home.Retrieve(imp_in,1)
+ cooldown = 0
+ processing_objects.Add(src)
+ else
+ to_chat(imp_in, "You must wait [(total_cooldown - cooldown)*2] seconds to use [src] again!")
+
+/obj/item/weapon/implant/abductor/process()
+ if(cooldown < total_cooldown)
+ cooldown++
+ if(cooldown == total_cooldown)
+ processing_objects.Remove(src)
+
+/obj/item/weapon/implant/abductor/implant(mob/source, mob/user)
+ if(..())
+ var/obj/machinery/abductor/console/console
+ if(ishuman(source))
+ var/mob/living/carbon/human/H = source
+ if(H.get_species() == "Abductor")
+ console = get_team_console(H.mind.abductor.team)
+ home = console.pad
+
+ if(!home)
+ console = get_team_console(pick(1, 2, 3, 4))
+ home = console.pad
+ return 1
+
+/obj/item/weapon/implant/abductor/proc/get_team_console(var/team)
+ var/obj/machinery/abductor/console/console
+ for(var/obj/machinery/abductor/console/c in abductor_equipment)
+ if(c.team == team)
+ console = c
+ break
+ return console
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/implants/implant_mindshield.dm b/code/game/objects/items/weapons/implants/implant_mindshield.dm
index a6efb21661f..a76b373e6b7 100644
--- a/code/game/objects/items/weapons/implants/implant_mindshield.dm
+++ b/code/game/objects/items/weapons/implants/implant_mindshield.dm
@@ -1,10 +1,10 @@
-/obj/item/weapon/implant/loyalty
+/obj/item/weapon/implant/mindshield
name = "mindshield implant"
desc = "Stops people messing with your mind."
origin_tech = "materials=2;biotech=4;programming=4"
activated = 0
-/obj/item/weapon/implant/loyalty/get_data()
+/obj/item/weapon/implant/mindshield/get_data()
var/dat = {"Implant Specifications:
Name: Nanotrasen Employee Management Implant
Life: Ten years.
@@ -17,7 +17,7 @@
return dat
-/obj/item/weapon/implant/loyalty/implant(mob/target)
+/obj/item/weapon/implant/mindshield/implant(mob/target)
if(..())
if(target.mind in ticker.mode.head_revolutionaries || is_shadow_or_thrall(target))
target.visible_message("[target] seems to resist the implant!", "You feel the corporate tendrils of Nanotrasen try to invade your mind!")
@@ -33,7 +33,7 @@
return 1
return 0
-/obj/item/weapon/implant/loyalty/removed(mob/target, var/silent = 0)
+/obj/item/weapon/implant/mindshield/removed(mob/target, var/silent = 0)
if(..())
if(target.stat != DEAD && !silent)
to_chat(target, "You feel a sense of liberation as Nanotrasen's grip on your mind fades away.")
@@ -41,19 +41,19 @@
return 0
-/obj/item/weapon/implanter/loyalty
+/obj/item/weapon/implanter/mindshield
name = "implanter (mindshield)"
-/obj/item/weapon/implanter/loyalty/New()
- imp = new /obj/item/weapon/implant/loyalty(src)
+/obj/item/weapon/implanter/mindshield/New()
+ imp = new /obj/item/weapon/implant/mindshield(src)
..()
update_icon()
-/obj/item/weapon/implantcase/loyalty
+/obj/item/weapon/implantcase/mindshield
name = "implant case - 'mindshield'"
desc = "A glass case containing a mindshield implant."
-/obj/item/weapon/implantcase/loyalty/New()
- imp = new /obj/item/weapon/implant/loyalty(src)
+/obj/item/weapon/implantcase/mindshield/New()
+ imp = new /obj/item/weapon/implant/mindshield(src)
..()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/implants/implant_traitor.dm b/code/game/objects/items/weapons/implants/implant_traitor.dm
index bb80d50845d..47b993b6007 100644
--- a/code/game/objects/items/weapons/implants/implant_traitor.dm
+++ b/code/game/objects/items/weapons/implants/implant_traitor.dm
@@ -38,7 +38,7 @@
removed(M)
qdel(src)
return -1
- if(isloyal(H))
+ if(ismindshielded(H))
H.visible_message("[H] seems to resist the implant!", "You feel a strange sensation in your head that quickly dissipates.")
removed(M)
qdel(src)
diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm
index 141f9b14f89..53183e21d63 100644
--- a/code/game/objects/items/weapons/implants/implantchair.dm
+++ b/code/game/objects/items/weapons/implants/implantchair.dm
@@ -11,7 +11,7 @@
var/ready = 1
var/malfunction = 0
- var/list/obj/item/weapon/implant/loyalty/implant_list = list()
+ var/list/obj/item/weapon/implant/mindshield/implant_list = list()
var/max_implants = 5
var/injection_cooldown = 600
var/replenish_cooldown = 6000
@@ -122,9 +122,9 @@
if(!istype(M, /mob/living/carbon))
return
if(!implant_list.len) return
- for(var/obj/item/weapon/implant/loyalty/imp in implant_list)
+ for(var/obj/item/weapon/implant/mindshield/imp in implant_list)
if(!imp) continue
- if(istype(imp, /obj/item/weapon/implant/loyalty))
+ if(istype(imp, /obj/item/weapon/implant/mindshield))
M.visible_message("[M] has been implanted by the [src.name].")
if(imp.implant(M))
@@ -135,7 +135,7 @@
/obj/machinery/implantchair/add_implants()
for(var/i=0, iIt's out of charge!")
return
..()
diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm
index 2e197926291..4495f637e56 100644
--- a/code/game/objects/items/weapons/mop.dm
+++ b/code/game/objects/items/weapons/mop.dm
@@ -18,6 +18,7 @@
var/mopspeed = 30
/obj/item/weapon/mop/New()
+ ..()
create_reagents(mopcap)
janitorial_equipment += src
diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm
index 78a974240de..c54a31fad05 100644
--- a/code/game/objects/items/weapons/pneumaticCannon.dm
+++ b/code/game/objects/items/weapons/pneumaticCannon.dm
@@ -17,9 +17,7 @@
var/pressureSetting = 1 //How powerful the cannon is - higher pressure = more gas but more powerful throws
/obj/item/weapon/pneumatic_cannon/Destroy()
- if(tank)
- qdel(tank)
- tank = null
+ QDEL_NULL(tank)
for(var/obj/item/I in loadedItems)
qdel(I)
loadedItems.Cut()
diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm
index 005ef313a4f..de5d788a9f3 100644
--- a/code/game/objects/items/weapons/power_cells.dm
+++ b/code/game/objects/items/weapons/power_cells.dm
@@ -5,18 +5,17 @@
icon_state = "cell"
item_state = "cell"
origin_tech = "powerstorage=1"
- force = 5.0
- throwforce = 5.0
- throw_speed = 3
+ force = 5
+ throwforce = 5
+ throw_speed = 2
throw_range = 5
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
var/charge = 0 // note %age conveted to actual charge in New
- var/maxcharge = 10000
- rating = 1
+ var/maxcharge = 1000
materials = list(MAT_METAL=700, MAT_GLASS=50)
var/rigged = 0 // true if rigged to explode
+ var/chargerate = 100 //how much power is given every tick in a recharger
var/minor_fault = 0 //If not 100% reliable, it will build up faults.
- var/chargerate = 1000 //how much power is given every tick in a recharger
var/self_recharge = 0 //does it self recharge, over time, or not?
var/grown_battery = FALSE // If it's a grown that acts as a battery, add a wire overlay to it.
@@ -62,10 +61,9 @@
/obj/item/weapon/stock_parts/cell/crap
name = "\improper Nanotrasen brand rechargable AA battery"
desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT
- origin_tech = null
- maxcharge = 5000
- rating = 2
+ maxcharge = 500
materials = list(MAT_GLASS=40)
+ rating = 2
/obj/item/weapon/stock_parts/cell/crap/empty/New()
..()
@@ -74,9 +72,9 @@
/obj/item/weapon/stock_parts/cell/secborg
name = "\improper Security borg rechargable D battery"
origin_tech = null
- maxcharge = 6000 //6000 max charge / 1000 charge per shot = six shots
- rating = 2.5
+ maxcharge = 600 //600 max charge / 100 charge per shot = six shots
materials = list(MAT_GLASS=40)
+ rating = 2.5
/obj/item/weapon/stock_parts/cell/secborg/empty/New()
..()
@@ -86,11 +84,18 @@
name = "high-capacity power cell"
origin_tech = "powerstorage=2"
icon_state = "hcell"
- maxcharge = 15000
- rating = 3
+ maxcharge = 10000
materials = list(MAT_GLASS=60)
+ rating = 3
chargerate = 1500
+/obj/item/weapon/stock_parts/cell/high/plus
+ name = "high-capacity power cell+"
+ desc = "Where did these come from?"
+ icon_state = "h+cell"
+ maxcharge = 15000
+ chargerate = 2250
+
/obj/item/weapon/stock_parts/cell/high/empty/New()
..()
charge = 0
@@ -100,7 +105,7 @@
origin_tech = "powerstorage=5"
icon_state = "scell"
maxcharge = 20000
- materials = list(MAT_GLASS=70)
+ materials = list(MAT_GLASS=300)
rating = 4
chargerate = 2000
@@ -113,8 +118,8 @@
origin_tech = "powerstorage=6"
icon_state = "hpcell"
maxcharge = 30000
+ materials = list(MAT_GLASS=400)
rating = 5
- materials = list(MAT_GLASS=80)
chargerate = 3000
/obj/item/weapon/stock_parts/cell/hyper/empty/New()
@@ -126,7 +131,7 @@
origin_tech = "powerstorage=7"
icon_state = "bscell"
maxcharge = 40000
- materials = list(MAT_GLASS=80)
+ materials = list(MAT_GLASS=600)
rating = 6
chargerate = 4000
@@ -139,8 +144,8 @@
icon_state = "icell"
origin_tech = null
maxcharge = 30000
+ materials = list(MAT_GLASS=1000)
rating = 6
- materials = list(MAT_GLASS=80)
chargerate = 30000
/obj/item/weapon/stock_parts/cell/infinite/use()
@@ -153,7 +158,7 @@
icon_state = "potato"
origin_tech = "powerstorage=1;biotech=1"
charge = 100
- maxcharge = 3000
+ maxcharge = 300
materials = list()
rating = 1
minor_fault = 1
@@ -170,17 +175,17 @@
/obj/item/weapon/stock_parts/cell/pulse //200 pulse shots
name = "pulse rifle power cell"
- maxcharge = 400000
+ maxcharge = 40000
rating = 3
chargerate = 1500
-/obj/item/weapon/stock_parts/cell/pulse/carbine
+/obj/item/weapon/stock_parts/cell/pulse/carbine //25 pulse shots
name = "pulse carbine power cell"
- maxcharge = 40000
+ maxcharge = 5000
-/obj/item/weapon/stock_parts/cell/pulse/pistol
+/obj/item/weapon/stock_parts/cell/pulse/pistol //10 pulse shots
name = "pulse pistol power cell"
- maxcharge = 16000
+ maxcharge = 2000
/obj/item/weapon/stock_parts/cell/ninja
name = "spider-clan power cell"
@@ -192,7 +197,7 @@
/obj/item/weapon/stock_parts/cell/emproof
name = "\improper EMP-proof cell"
desc = "An EMP-proof cell."
- maxcharge = 5000
+ maxcharge = 500
rating = 2
/obj/item/weapon/stock_parts/cell/emproof/empty/New()
diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm
index 99bf305df42..9ee2c46728e 100644
--- a/code/game/objects/items/weapons/powerfist.dm
+++ b/code/game/objects/items/weapons/powerfist.dm
@@ -17,9 +17,7 @@
/obj/item/weapon/melee/powerfist/Destroy()
- if(tank)
- qdel(tank)
- tank = null
+ QDEL_NULL(tank)
return ..()
/obj/item/weapon/melee/powerfist/examine(mob/user)
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index c20cec521c6..a3f2a21a5fa 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -186,7 +186,7 @@
/obj/item/weapon/storage/fancy/cigarettes/Destroy()
- qdel(reagents)
+ QDEL_NULL(reagents)
return ..()
diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm
index 448395df3e4..b622e469124 100644
--- a/code/game/objects/items/weapons/storage/lockbox.dm
+++ b/code/game/objects/items/weapons/storage/lockbox.dm
@@ -80,16 +80,16 @@
max_combined_w_class = 4 //The sum of the w_classes of all the items in this storage item.
storage_slots = 1
-/obj/item/weapon/storage/lockbox/loyalty
+/obj/item/weapon/storage/lockbox/mindshield
name = "Lockbox (Mindshield Implants)"
req_access = list(access_security)
-/obj/item/weapon/storage/lockbox/loyalty/New()
+/obj/item/weapon/storage/lockbox/mindshield/New()
..()
- new /obj/item/weapon/implantcase/loyalty(src)
- new /obj/item/weapon/implantcase/loyalty(src)
- new /obj/item/weapon/implantcase/loyalty(src)
- new /obj/item/weapon/implanter/loyalty(src)
+ new /obj/item/weapon/implantcase/mindshield(src)
+ new /obj/item/weapon/implantcase/mindshield(src)
+ new /obj/item/weapon/implantcase/mindshield(src)
+ new /obj/item/weapon/implanter/mindshield(src)
/obj/item/weapon/storage/lockbox/clusterbang
name = "lockbox (clusterbang)"
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index e7f2fb29938..e5fb0646169 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -454,8 +454,8 @@
for(var/obj/O in contents)
O.mouse_opacity = initial(O.mouse_opacity)
- qdel(boxes)
- qdel(closer)
+ QDEL_NULL(boxes)
+ QDEL_NULL(closer)
return ..()
/obj/item/weapon/storage/emp_act(severity)
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index f2bd9cafedf..1de82690573 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -2,6 +2,7 @@
name = "stunbaton"
desc = "A stun baton for incapacitating people with."
icon_state = "stunbaton"
+ var/base_icon = "stunbaton"
item_state = "baton"
slot_flags = SLOT_BELT
force = 10
@@ -12,7 +13,7 @@
var/stunforce = 7
var/status = 0
var/obj/item/weapon/stock_parts/cell/high/bcell = null
- var/hitcost = 1500
+ var/hitcost = 1000
/obj/item/weapon/melee/baton/suicide_act(mob/user)
user.visible_message("[user] is putting the live [name] in \his mouth! It looks like \he's trying to commit suicide.")
@@ -24,9 +25,7 @@
return
/obj/item/weapon/melee/baton/Destroy()
- if(bcell)
- qdel(bcell)
- bcell = null
+ QDEL_NULL(bcell)
return ..()
/obj/item/weapon/melee/baton/loaded/New() //this one starts with a cell pre-installed.
@@ -48,11 +47,11 @@
/obj/item/weapon/melee/baton/update_icon()
if(status)
- icon_state = "[initial(name)]_active"
+ icon_state = "[base_icon]_active"
else if(!bcell)
- icon_state = "[initial(name)]_nocell"
+ icon_state = "[base_icon]_nocell"
else
- icon_state = "[initial(name)]"
+ icon_state = "[base_icon]"
/obj/item/weapon/melee/baton/examine(mob/user)
..(user)
@@ -184,28 +183,28 @@
return 1
..()
-
-//secborg stun baton module
-/obj/item/weapon/melee/baton/loaded/robot
- hitcost = 1000
-
//Makeshift stun baton. Replacement for stun gloves.
/obj/item/weapon/melee/baton/cattleprod
name = "stunprod"
desc = "An improvised stun baton."
icon_state = "stunprod_nocell"
+ base_icon = "stunprod"
item_state = "prod"
w_class = 3
force = 3
throwforce = 5
stunforce = 5
- hitcost = 3750
+ hitcost = 2000
slot_flags = SLOT_BACK
- var/obj/item/device/assembly/igniter/sparkler = 0
+ var/obj/item/device/assembly/igniter/sparkler = null
/obj/item/weapon/melee/baton/cattleprod/New()
..()
- sparkler = new (src)
+ sparkler = new(src)
+
+/obj/item/weapon/melee/baton/cattleprod/Destroy()
+ QDEL_NULL(sparkler)
+ return ..()
/obj/item/weapon/melee/baton/cattleprod/baton_stun()
if(sparkler.activate())
diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm
index c9c9497cb71..1bd8d8b761c 100644
--- a/code/game/objects/items/weapons/tanks/jetpack.dm
+++ b/code/game/objects/items/weapons/tanks/jetpack.dm
@@ -19,8 +19,7 @@
ion_trail.set_up(src)
/obj/item/weapon/tank/jetpack/Destroy()
- qdel(ion_trail)
- ion_trail = null
+ QDEL_NULL(ion_trail)
return ..()
/obj/item/weapon/tank/jetpack/ui_action_click(mob/user, actiontype)
@@ -82,7 +81,7 @@
var/datum/gas_mixture/removed = air_contents.remove(num)
if(removed.total_moles() < 0.005)
- turn_off()
+ turn_off()
return 0
var/turf/T = get_turf(user)
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index e3e03e22506..bd62357ba76 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -33,9 +33,7 @@
return
/obj/item/weapon/tank/Destroy()
- if(air_contents)
- qdel(air_contents)
- air_contents = null
+ QDEL_NULL(air_contents)
processing_objects.Remove(src)
diff --git a/code/game/objects/items/weapons/teleprod.dm b/code/game/objects/items/weapons/teleprod.dm
index 0bc1b23f6d6..dfaa52ba396 100644
--- a/code/game/objects/items/weapons/teleprod.dm
+++ b/code/game/objects/items/weapons/teleprod.dm
@@ -2,6 +2,7 @@
name = "teleprod"
desc = "A prod with a bluespace crystal on the end. The crystal doesn't look too fun to touch."
icon_state = "teleprod_nocell"
+ base_icon = "teleprod"
item_state = "teleprod"
origin_tech = "combat=2;bluespace=4;materials=3"
@@ -15,4 +16,4 @@
deductcharge(hitcost)
do_teleport(user, get_turf(user), 50)//honk honk
else if(iscarbon(M) && !M.anchored)
- do_teleport(M, get_turf(M), 15)
\ No newline at end of file
+ do_teleport(M, get_turf(M), 15)
diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm
index 045f58d577d..9636e1407b6 100644
--- a/code/game/objects/structures/artstuff.dm
+++ b/code/game/objects/structures/artstuff.dm
@@ -19,6 +19,9 @@
burntime = 15
var/obj/item/weapon/canvas/painting = null
+/obj/structure/easel/Destroy()
+ QDEL_NULL(painting)
+ return ..()
//Adding canvases
/obj/structure/easel/attackby(var/obj/item/I, var/mob/user, params)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 8d854c384e8..1d7b32fe950 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -112,7 +112,7 @@
new /obj/item/clothing/head/HoS(src)
new /obj/item/clothing/head/HoS/beret(src)
new /obj/item/clothing/glasses/hud/security/sunglasses(src)
- new /obj/item/weapon/storage/lockbox/loyalty(src)
+ new /obj/item/weapon/storage/lockbox/mindshield(src)
new /obj/item/weapon/storage/box/flashbangs(src)
new /obj/item/clothing/mask/gas/sechailer/hos(src)
new /obj/item/weapon/shield/riot/tele(src)
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 2ced72cbcfe..9ecf82a54fb 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -22,6 +22,11 @@ var/global/list/captain_display_cases = list()
var/obj/item/device/assembly/prox_sensor/sensor = null
var/state = DISPLAYCASE_FRAME_CIRCUIT
+/obj/structure/displaycase_frame/Destroy()
+ QDEL_NULL(circuit)
+ QDEL_NULL(sensor)
+ return ..()
+
/obj/structure/displaycase_frame/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
var/pstate = state
var/turf/T = get_turf(src)
@@ -116,8 +121,7 @@ var/global/list/captain_display_cases = list()
/obj/structure/displaycase/Destroy()
dump()
- qdel(circuit)
- circuit = null
+ QDEL_NULL(circuit)
return ..()
/obj/structure/displaycase/captains_laser/Destroy()
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index 78bd8193415..ec68cd16e3e 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -17,6 +17,10 @@
/obj/structure/door_assembly/New()
update_state()
+/obj/structure/door_assembly/Destroy()
+ QDEL_NULL(electronics)
+ return ..()
+
/obj/structure/door_assembly/door_assembly_com
base_icon_state = "com"
base_name = "Command Airlock"
diff --git a/code/game/objects/structures/engicart.dm b/code/game/objects/structures/engicart.dm
index 594139f8d70..56cb984de8a 100644
--- a/code/game/objects/structures/engicart.dm
+++ b/code/game/objects/structures/engicart.dm
@@ -14,6 +14,17 @@
var/obj/item/weapon/storage/toolbox/emergency/myredtoolbox = null
var/obj/item/taperoll/engineering/myengitape = null
+/obj/structure/engineeringcart/Destroy()
+ QDEL_NULL(myglass)
+ QDEL_NULL(mymetal)
+ QDEL_NULL(myplasteel)
+ QDEL_NULL(myflashlight)
+ QDEL_NULL(mybluetoolbox)
+ QDEL_NULL(myyellowtoolbox)
+ QDEL_NULL(myredtoolbox)
+ QDEL_NULL(myengitape)
+ return ..()
+
/obj/structure/engineeringcart/proc/put_in_cart(obj/item/I, mob/user)
user.drop_item()
I.loc = src
diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm
index e5a89aa1fad..a68c387eadb 100644
--- a/code/game/objects/structures/extinguisher.dm
+++ b/code/game/objects/structures/extinguisher.dm
@@ -8,6 +8,9 @@
var/obj/item/weapon/extinguisher/has_extinguisher = new/obj/item/weapon/extinguisher
var/opened = 0
+/obj/structure/extinguisher_cabinet/Destroy()
+ QDEL_NULL(has_extinguisher)
+ return ..()
/obj/structure/extinguisher_cabinet/attackby(obj/item/O, mob/user, params)
if(isrobot(user) || isalien(user))
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 614af2d4ff4..f4ee54ad893 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -19,12 +19,16 @@
/obj/structure/janitorialcart/New()
+ ..()
create_reagents(100)
janitorial_equipment += src
-
/obj/structure/janitorialcart/Destroy()
janitorial_equipment -= src
+ QDEL_NULL(mybag)
+ QDEL_NULL(mymop)
+ QDEL_NULL(myspray)
+ QDEL_NULL(myreplacer)
return ..()
/obj/structure/janitorialcart/proc/wet_mop(obj/item/weapon/mop, mob/user)
diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm
index 133a3d15b39..53805b45886 100644
--- a/code/game/objects/structures/ladders.dm
+++ b/code/game/objects/structures/ladders.dm
@@ -76,7 +76,7 @@
return attack_hand(user)
/obj/structure/ladder/dive_point/buoy
- name = "diving point bouy"
+ name = "diving point buoy"
desc = "A buoy marking the location of an underwater dive area."
icon = 'icons/misc/beach.dmi'
icon_state = "buoy"
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index 848a953324a..003daa76645 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -50,7 +50,6 @@
return
/obj/structure/lattice/attackby(obj/item/C as obj, mob/user as mob, params)
-
if(istype(C, /obj/item/stack/tile/plasteel) || istype(C, /obj/item/stack/rods))
var/turf/T = get_turf(src)
T.attackby(C, user) //BubbleWrap - hand this off to the underlying turf instead
@@ -58,11 +57,10 @@
if(istype(C, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = C
if(WT.remove_fuel(0, user))
- to_chat(user, "Slicing lattice joints ...")
- new /obj/item/stack/rods(src.loc)
- qdel(src)
+ to_chat(user, "Slicing lattice joints...")
+ new /obj/item/stack/rods(src.loc)
+ qdel(src)
- return
/obj/structure/lattice/proc/updateOverlays()
//if(!(istype(src.loc, /turf/space)))
diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm
index a93bb1c5ed9..3a1ee8490db 100644
--- a/code/game/objects/structures/mop_bucket.dm
+++ b/code/game/objects/structures/mop_bucket.dm
@@ -8,6 +8,7 @@
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
/obj/structure/mopbucket/New()
+ ..()
create_reagents(100)
janitorial_equipment += src
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 7b250e5d292..39a7ac21301 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -160,9 +160,7 @@
return
/obj/structure/morgue/Destroy()
- if(connected)
- qdel(connected)
- connected = null
+ QDEL_NULL(connected)
return ..()
/obj/structure/morgue/container_resist(var/mob/living/L)
@@ -405,9 +403,7 @@
return
/obj/structure/crematorium/Destroy()
- if(connected)
- qdel(connected)
- connected = null
+ QDEL_NULL(connected)
return ..()
/obj/structure/crematorium/container_resist(var/mob/living/L)
@@ -471,7 +467,7 @@
connected.connected = null
connected = null
return ..()
-
+
// Crematorium switch
/obj/machinery/crema_switch
desc = "Burn baby burn!"
@@ -484,7 +480,7 @@
var/area/area = null
var/otherarea = null
var/id = 1
-
+
/obj/machinery/crema_switch/attack_ghost(mob/user)
if(user.can_advanced_admin_interact())
return attack_hand(user)
diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm
index b2a4dfd3299..db917ca5588 100644
--- a/code/game/objects/structures/musician.dm
+++ b/code/game/objects/structures/musician.dm
@@ -281,8 +281,7 @@
icon_state = "piano"
/obj/structure/piano/Destroy()
- qdel(song)
- song = null
+ QDEL_NULL(song)
return ..()
/obj/structure/piano/initialize()
diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm
index 504b2abfa80..a51f58e5ec6 100644
--- a/code/game/objects/structures/target_stake.dm
+++ b/code/game/objects/structures/target_stake.dm
@@ -8,45 +8,48 @@
flags = CONDUCT
var/obj/item/target/pinned_target // the current pinned target
- Move()
- ..()
- // Move the pinned target along with the stake
- if(pinned_target in view(3, src))
- pinned_target.loc = loc
+/obj/structure/target_stake/Destroy()
+ QDEL_NULL(pinned_target)
+ return ..()
- else // Sanity check: if the pinned target can't be found in immediate view
- pinned_target = null
- density = 1
+/obj/structure/target_stake/Move()
+ ..()
+ // Move the pinned target along with the stake
+ if(pinned_target in view(3, src))
+ pinned_target.loc = loc
- attackby(obj/item/W as obj, mob/user as mob, params)
- // Putting objects on the stake. Most importantly, targets
- if(pinned_target)
- return // get rid of that pinned target first!
+ else // Sanity check: if the pinned target can't be found in immediate view
+ pinned_target = null
+ density = 1
- if(istype(W, /obj/item/target))
- density = 0
- W.density = 1
- user.drop_item(src)
- W.loc = loc
- W.layer = 3.1
- pinned_target = W
- to_chat(user, "You slide the target into the stake.")
- return
+/obj/structure/target_stake/attackby(obj/item/W, mob/user, params)
+ // Putting objects on the stake. Most importantly, targets
+ if(pinned_target)
+ return // get rid of that pinned target first!
- attack_hand(mob/user as mob)
- // taking pinned targets off!
- if(pinned_target)
- density = 1
- pinned_target.density = 0
- pinned_target.layer = OBJ_LAYER
+ if(istype(W, /obj/item/target))
+ density = 0
+ W.density = 1
+ user.drop_item(src)
+ W.loc = loc
+ W.layer = 3.1
+ pinned_target = W
+ to_chat(user, "You slide the target into the stake.")
- pinned_target.loc = user.loc
- if(ishuman(user))
- if(!user.get_active_hand())
- user.put_in_hands(pinned_target)
- to_chat(user, "You take the target out of the stake.")
- else
- pinned_target.loc = get_turf(user)
+/obj/structure/target_stake/attack_hand(mob/user)
+ // taking pinned targets off!
+ if(pinned_target)
+ density = 1
+ pinned_target.density = 0
+ pinned_target.layer = OBJ_LAYER
+
+ pinned_target.loc = user.loc
+ if(ishuman(user))
+ if(!user.get_active_hand())
+ user.put_in_hands(pinned_target)
to_chat(user, "You take the target out of the stake.")
+ else
+ pinned_target.loc = get_turf(user)
+ to_chat(user, "You take the target out of the stake.")
- pinned_target = null
\ No newline at end of file
+ pinned_target = null
\ No newline at end of file
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 26d97a52671..fa59fdc3cd1 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -14,9 +14,13 @@
/obj/structure/toilet/New()
+ ..()
open = round(rand(0, 1))
update_icon()
+/obj/structure/toilet/Destroy()
+ swirlie = null
+ return ..()
/obj/structure/toilet/attack_hand(mob/living/user)
if(swirlie)
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index ceba6687143..0c273e7f1fa 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -34,6 +34,7 @@ obj/structure/windoor_assembly/New(dir=NORTH)
obj/structure/windoor_assembly/Destroy()
density = 0
+ QDEL_NULL(electronics)
air_update_turf(1)
return ..()
diff --git a/code/game/response_team.dm b/code/game/response_team.dm
index 40a09c01de1..5b0cec99de1 100644
--- a/code/game/response_team.dm
+++ b/code/game/response_team.dm
@@ -313,7 +313,7 @@ var/ert_request_answered = 0
id = /obj/item/weapon/card/id/ert
l_ear = /obj/item/device/radio/headset/ert/alt
- implants = list(/obj/item/weapon/implant/loyalty)
+ implants = list(/obj/item/weapon/implant/mindshield)
/datum/outfit/job/centcom/response_team/pre_equip()
. = ..()
@@ -367,7 +367,7 @@ var/ert_request_answered = 0
/obj/item/clothing/head/helmet/ert/command = 1,
/obj/item/clothing/mask/gas/sechailer = 1,
/obj/item/weapon/restraints/handcuffs = 1,
- /obj/item/weapon/storage/lockbox/loyalty = 1
+ /obj/item/weapon/storage/lockbox/mindshield = 1
)
/datum/outfit/job/centcom/response_team/commander/red
@@ -383,7 +383,7 @@ var/ert_request_answered = 0
/obj/item/clothing/head/helmet/space/hardsuit/ert/commander = 1,
/obj/item/clothing/mask/gas/sechailer/swat = 1,
/obj/item/weapon/restraints/handcuffs = 1,
- /obj/item/weapon/storage/lockbox/loyalty = 1
+ /obj/item/weapon/storage/lockbox/mindshield = 1
)
/datum/outfit/job/centcom/response_team/commander/gamma
@@ -399,7 +399,7 @@ var/ert_request_answered = 0
/obj/item/clothing/head/helmet/space/hardsuit/ert/commander = 1,
/obj/item/clothing/mask/gas/sechailer/swat = 1,
/obj/item/weapon/restraints/handcuffs = 1,
- /obj/item/weapon/storage/lockbox/loyalty = 1,
+ /obj/item/weapon/storage/lockbox/mindshield = 1,
/obj/item/weapon/gun/energy/pulse/pistol = 1
)
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index e0a2aa87008..0476df52ceb 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -41,9 +41,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
builtin_tile = new floor_tile
/turf/simulated/floor/Destroy()
- if(builtin_tile)
- qdel(builtin_tile)
- builtin_tile = null
+ QDEL_NULL(builtin_tile)
return ..()
diff --git a/code/game/turfs/unsimulated/beach.dm b/code/game/turfs/unsimulated/beach.dm
index 970467c2ced..262727e97ee 100644
--- a/code/game/turfs/unsimulated/beach.dm
+++ b/code/game/turfs/unsimulated/beach.dm
@@ -59,8 +59,7 @@
water_overlay = new(src)
/turf/unsimulated/beach/water/drop/Destroy()
- qdel(water_overlay)
- water_overlay = null
+ QDEL_NULL(water_overlay)
return ..()
/obj/effect/effect/beach_drop_overlay
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 130b792b1d0..0d479dcd2dd 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -157,7 +157,7 @@ var/list/admin_verbs_debug = list(
/client/proc/enable_debug_verbs,
/client/proc/toggledebuglogs,
/client/proc/qdel_toggle,
- /client/proc/gc_dump_hdl,
+ /client/proc/cmd_display_del_log,
/client/proc/debugNatureMapGenerator,
/client/proc/check_bomb_impacts,
/client/proc/test_movable_UI,
diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm
index b5c02c368a7..d90c8a50a84 100644
--- a/code/modules/admin/verbs/striketeam.dm
+++ b/code/modules/admin/verbs/striketeam.dm
@@ -157,7 +157,7 @@ var/global/sent_strike_team = 0
equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse(src), slot_r_hand)
- var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(src)//Here you go Deuryn
+ var/obj/item/weapon/implant/mindshield/L = new/obj/item/weapon/implant/mindshield(src)
L.imp_in = src
L.implanted = 1
sec_hud_set_implants()
diff --git a/code/modules/arcade/mob_hunt/battle_computer.dm b/code/modules/arcade/mob_hunt/battle_computer.dm
index 97055664cdb..dc0b47cd4b0 100644
--- a/code/modules/arcade/mob_hunt/battle_computer.dm
+++ b/code/modules/arcade/mob_hunt/battle_computer.dm
@@ -51,8 +51,7 @@
mob_hunt_server.red_terminal = null
if(mob_hunt_server.blue_terminal == src)
mob_hunt_server.blue_terminal = null
- if(avatar)
- qdel(avatar)
+ QDEL_NULL(avatar)
return ..()
/obj/machinery/computer/mob_battle_terminal/attackby(obj/item/O, mob/user)
diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm
index e6505e385ad..b1c76236853 100644
--- a/code/modules/assembly/igniter.dm
+++ b/code/modules/assembly/igniter.dm
@@ -12,8 +12,7 @@
sparks.attach(src)
/obj/item/device/assembly/igniter/Destroy()
- qdel(sparks)
- sparks = null
+ QDEL_NULL(sparks)
return ..()
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index 7f9181ca937..60f3014d357 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -255,9 +255,7 @@
/obj/effect/beam/i_beam/Destroy()
if(master.first == src)
master.first = null
- if(next)
- qdel(next)
- next = null
+ QDEL_NULL(next)
if(previous)
previous.next = null
master.last = previous
diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm
index 3aa24a2d014..6ffe6f42d12 100644
--- a/code/modules/assembly/shock_kit.dm
+++ b/code/modules/assembly/shock_kit.dm
@@ -10,10 +10,8 @@
flags = CONDUCT
/obj/item/assembly/shock_kit/Destroy()
- qdel(part1)
- part1 = null
- qdel(part2)
- part2 = null
+ QDEL_NULL(part1)
+ QDEL_NULL(part2)
return ..()
/obj/item/assembly/shock_kit/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
diff --git a/code/modules/awaymissions/mission_code/beach.dm b/code/modules/awaymissions/mission_code/beach.dm
index fd54ffaa7ee..7ae37e759c1 100644
--- a/code/modules/awaymissions/mission_code/beach.dm
+++ b/code/modules/awaymissions/mission_code/beach.dm
@@ -18,6 +18,7 @@
if(water_timer)
deltimer(water_timer)
water_timer = null
+ return ..()
/obj/effect/waterfall/proc/drip()
var/obj/effect/effect/water/W = new(loc)
diff --git a/code/modules/awaymissions/mission_code/spacehotel.dm b/code/modules/awaymissions/mission_code/spacehotel.dm
index 357b0ca519e..0cd06c5d6a7 100644
--- a/code/modules/awaymissions/mission_code/spacehotel.dm
+++ b/code/modules/awaymissions/mission_code/spacehotel.dm
@@ -116,8 +116,7 @@
if(roomtimer)
deltimer(roomtimer)
roomtimer = null
- qdel(card)
- card = null
+ QDEL_NULL(card)
return ..()
/obj/machinery/door/unpowered/hotel_door/examine(mob/user)
@@ -220,9 +219,7 @@
vacant_rooms.Cut()
guests.Cut()
- if(radio)
- qdel(radio)
- radio = null
+ QDEL_NULL(radio)
return ..()
diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm
index d340fc6a651..50b09d72788 100644
--- a/code/modules/awaymissions/zlevel.dm
+++ b/code/modules/awaymissions/zlevel.dm
@@ -70,6 +70,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
log_startup_progress(" No away missions found.")
return
+
/proc/createALLZlevels()
if(awaydestinations.len) //crude, but it saves another var!
return
diff --git a/code/modules/awaymissions/zvis.dm b/code/modules/awaymissions/zvis.dm
index 735dd307ddb..73bbff2198f 100644
--- a/code/modules/awaymissions/zvis.dm
+++ b/code/modules/awaymissions/zvis.dm
@@ -111,8 +111,7 @@
init(R)
/turf/unsimulated/floor/upperlevel/Destroy()
- qdel(sensor)
- sensor = null
+ QDEL_NULL(sensor)
return ..()
/turf/unsimulated/floor/upperlevel/proc/init(var/obj/effect/levelref/R)
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index aefb7188f5c..ee5022a1793 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -63,16 +63,14 @@
desc = "Horrendous and awful. It smells like cancer. The fact it has wires attached to it is incidental."
var/obj/item/weapon/stock_parts/cell/cell = null
var/stun_strength = 5
- var/stun_cost = 3750
+ var/stun_cost = 2000
/obj/item/clothing/gloves/color/yellow/stun/New()
..()
update_icon()
/obj/item/clothing/gloves/color/yellow/stun/Destroy()
- if(cell)
- qdel(cell)
- cell = null
+ QDEL_NULL(cell)
return ..()
/obj/item/clothing/gloves/color/yellow/stun/Touch(atom/A, proximity)
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index bf40cf7127e..33bb0bcd269 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -165,10 +165,8 @@
M.unEquip(piece)
qdel(piece)
processing_objects -= src
- qdel(wires)
- wires = null
- qdel(spark_system)
- spark_system = null
+ QDEL_NULL(wires)
+ QDEL_NULL(spark_system)
return ..()
/obj/item/weapon/rig/proc/suit_is_deployed()
diff --git a/code/modules/clothing/suits/hood.dm b/code/modules/clothing/suits/hood.dm
index 0683394ce9f..7e2307c96b4 100644
--- a/code/modules/clothing/suits/hood.dm
+++ b/code/modules/clothing/suits/hood.dm
@@ -10,7 +10,7 @@
..()
/obj/item/clothing/suit/hooded/Destroy()
- qdel(hood)
+ QDEL_NULL(hood)
return ..()
/obj/item/clothing/suit/hooded/proc/MakeHood()
diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm
index 82a468d2a63..70fa8a30227 100644
--- a/code/modules/clothing/suits/storage.dm
+++ b/code/modules/clothing/suits/storage.dm
@@ -9,8 +9,7 @@
pockets.max_combined_w_class = 4
/obj/item/clothing/suit/storage/Destroy()
- qdel(pockets)
- pockets = null
+ QDEL_NULL(pockets)
return ..()
/obj/item/clothing/suit/storage/attack_hand(mob/user as mob)
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index 380a11f0d43..2e79b68a11a 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -386,9 +386,7 @@
var/obj/item/weapon/card/id/access_id
/obj/item/clothing/accessory/petcollar/Destroy()
- if(access_id)
- qdel(access_id)
- access_id = null
+ QDEL_NULL(access_id)
processing_objects -= src
return ..()
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 10376b48ba8..33100a474a0 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -761,7 +761,7 @@
..()
/obj/item/clothing/under/contortionist/dropped(mob/living/carbon/human/user)
- if(!user.get_int_organ(/obj/item/organ/internal/gland/ventcrawling))
+ if(!user.get_int_organ(/obj/item/organ/internal/heart/gland/ventcrawling))
user.ventcrawler = 0
..()
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index c58d932bf29..6cc353d0b17 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -235,6 +235,33 @@
to_chat(target, "You comb your tail with the [src].")
used = 1
+/obj/item/device/fluff/desolate_baton_kit //DesolateG: Michael steampunk_witch
+ name = "stun baton converstion kit"
+ desc = "Some sci-fi looking parts for a stun baton."
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "scifikit"
+ w_class = 2
+
+/obj/item/device/fluff/desolate_baton_kit/afterattack(atom/target, mob/user, proximity)
+ if(!proximity || !ishuman(user) || user.incapacitated())
+ return
+
+ if(istype(target, /obj/item/weapon/melee/baton) && !istype(target, /obj/item/weapon/melee/baton/cattleprod))
+ to_chat(user, "You modify the appearance of [target].")
+ //because batons use the initial() proc, we can't just swap the icon state, sadly
+ var/obj/item/weapon/melee/baton/the_baton = target
+ the_baton.base_icon = "desolate_baton"
+ the_baton.item_state = "desolate_baton"
+ the_baton.icon = 'icons/obj/custom_items.dmi'
+ the_baton.lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi'
+ the_baton.righthand_file = 'icons/mob/inhands/fluff_righthand.dmi'
+ the_baton.update_icon()
+ user.update_icons()
+ qdel(src)
+ return
+
+ to_chat(user, "You can't modify [target]!")
+
/obj/item/device/fluff/cardgage_helmet_kit //captain cardgage: Richard Ulery
name = "welding helmet modkit"
desc = "Some spraypaint and a stencil, perfect for painting flames onto a welding helmet!"
@@ -244,14 +271,14 @@
throwforce = 0
/obj/item/device/fluff/cardgage_helmet_kit/afterattack(atom/target, mob/user, proximity)
- if(!proximity || !ishuman(user) || user.lying)
+ if(!proximity || !ishuman(user) || user.incapacitated())
return
if(istype(target, /obj/item/clothing/head/welding))
to_chat(user, "You modify the appearance of [target].")
var/obj/item/clothing/head/welding/flamedecal/P = new(get_turf(target))
- transfer_fingerprints_to(P)
+ target.transfer_fingerprints_to(P)
qdel(target)
qdel(src)
return
@@ -269,7 +296,7 @@
throwforce = 0
/obj/item/device/fluff/shadey_plasman_modkit/afterattack(atom/target, mob/user, proximity)
- if(!proximity || !ishuman(user) || user.lying)
+ if(!proximity || !ishuman(user) || user.incapacitated())
return
var/mob/living/carbon/human/H = user
@@ -744,4 +771,3 @@
new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass(src)
new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass(src)
new /obj/item/weapon/reagent_containers/food/drinks/bottle/fluff/moonshine(src)
-
diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm
index 8245f24b291..67f4a93d339 100644
--- a/code/modules/events/brand_intelligence.dm
+++ b/code/modules/events/brand_intelligence.dm
@@ -29,6 +29,7 @@
vendingMachines.Remove(originMachine)
originMachine.shut_up = 0
originMachine.shoot_inventory = 1
+ log_debug("Original brand intelligence machine: [originMachine] [ADMIN_VV(originMachine)] [ADMIN_JMP(originMachine)]")
/datum/event/brand_intelligence/tick()
if(!originMachine || !isnull(originMachine.gcDestroyed) || originMachine.shut_up || originMachine.wires.IsAllCut()) //if the original vending machine is missing or has it's voice switch flipped
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index d6148b429e0..3a079e99da4 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -1218,28 +1218,19 @@
var/monkey_type = "Monkey"
list_reagents = list("nutriment" = 2)
-/obj/item/weapon/reagent_containers/food/snacks/monkeycube/afterattack(obj/O, mob/user, proximity)
- if(!proximity)
- return
- if(istype(O, /obj/structure/sink))
- to_chat(user, "You place [src] under a stream of water...")
- user.drop_item()
- forceMove(get_turf(O))
- return Expand()
- ..()
-
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/water_act(volume, temperature)
if(volume >= 5)
return Expand()
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wash(mob/user, atom/source)
- if(do_after(user, 40, target = source))
- return 1
+ user.drop_item()
+ forceMove(get_turf(source))
+ return 1
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Expand()
if(isnull(gcDestroyed))
visible_message("[src] expands!")
- new/mob/living/carbon/human(get_turf(src),monkey_type)
+ new/mob/living/carbon/human(get_turf(src), monkey_type)
qdel(src)
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/farwacube
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index 936b9e30827..6b8d9cebd26 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -50,8 +50,7 @@
wires = new/datum/wires/smartfridge(src)
/obj/machinery/smartfridge/Destroy()
- qdel(wires)
- wires = null
+ QDEL_NULL(wires)
for(var/atom/movable/A in contents)
A.forceMove(loc)
return ..()
diff --git a/code/modules/garbage_collection/garbage_collector.dm b/code/modules/garbage_collection/garbage_collector.dm
index e2204788016..f0ca2d64474 100644
--- a/code/modules/garbage_collection/garbage_collector.dm
+++ b/code/modules/garbage_collection/garbage_collector.dm
@@ -7,8 +7,12 @@
#define GC_FORCE_DEL_PER_TICK 30
//#define GC_DEBUG
-// A list of types that were queued in the GC, and had to be soft deleted; used in testing
-var/list/gc_hard_del_types = list()
+var/list/didntgc = list() // list of all types that have failed to GC associated with the number of times that's happened.
+ // the types are stored as strings
+var/list/sleptDestroy = list() //Same as above but these are paths that slept during their Destroy call
+
+var/list/noqdelhint = list() // list of all types that do not return a QDEL_HINT
+
var/global/datum/controller/process/garbage_collector/garbageCollector
// The time a datum was destroyed by the GC, or null if it hasn't been
@@ -82,7 +86,7 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
#undef GC_COLLECTIONS_PER_TICK
/datum/controller/process/garbage_collector/proc/hardDel(var/datum/D)
- gc_hard_del_types |= D.type
+ didntgc["[D.type]"]++
D.hard_deleted = 1
if(!D.gcDestroyed)
spawn(-1)
@@ -126,6 +130,7 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
return
if(!isnull(D.gcDestroyed) && D.gcDestroyed != world.time)
gcwarning("Sleep detected in Destroy() call of [D.type]")
+ sleptDestroy["[D.type]"]++
D.gcDestroyed = world.time
switch(hint)
@@ -155,7 +160,9 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
#endif
garbageCollector.addTrash(D)
else
-// to_chat(world, "WARNING GC DID NOT GET A RETURN VALUE FOR [D], [D.type]!")
+ if(!noqdelhint["[D.type]"])
+ noqdelhint["[D.type]"] = "[D.type]"
+ gcwarning("WARNING: [D.type] is not returning a qdel hint. It is being placed in the queue. Further instances of this type will also be queued.")
garbageCollector.addTrash(D)
diff --git a/code/modules/garbage_collection/gc_testing.dm b/code/modules/garbage_collection/gc_testing.dm
index 25378d19e9c..934a93adc21 100644
--- a/code/modules/garbage_collection/gc_testing.dm
+++ b/code/modules/garbage_collection/gc_testing.dm
@@ -13,21 +13,27 @@
log_admin("[key_name(usr)] turned qdel [garbageCollector.del_everything ? "off" : "on"].")
message_admins("[key_name_admin(usr)] turned qdel [garbageCollector.del_everything ? "off" : "on"].", 1)
-/client/proc/gc_dump_hdl()
- set name = "(GC) Hard Del List"
- set desc = "List types that are hard del()'d by the GC."
+/client/proc/cmd_display_del_log()
set category = "Debug"
+ set name = "(GC) Display del() Log"
+ set desc = "Displays a list of things that have failed to GC this round"
if(!check_rights(R_DEBUG))
return
- if(!gc_hard_del_types || !gc_hard_del_types.len)
- to_chat(usr, "No hard del()'d types found.")
- return
+ var/dat = "List of things that failed to GC this round
"
+ for(var/path in didntgc)
+ dat += "[path] - [didntgc[path]] times
"
- to_chat(usr, "Types hard del()'d by the GC:")
- for(var/A in gc_hard_del_types)
- to_chat(usr, "[A]")
+ dat += "List of paths that did not return a qdel hint in Destroy()
"
+ for(var/path in noqdelhint)
+ dat += "[path]
"
+
+ dat += "List of paths that slept in Destroy()
"
+ for(var/path in sleptDestroy)
+ dat += "[path]
"
+
+ usr << browse(dat, "window=dellog")
#ifdef TESTING
/client/var/running_find_references
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index ce393c16e15..deac3c6660d 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -31,9 +31,8 @@
RefreshParts()
/obj/machinery/biogenerator/Destroy()
- if(beaker)
- qdel(beaker)
- beaker = null
+ QDEL_NULL(beaker)
+ QDEL_NULL(files)
return ..()
/obj/machinery/biogenerator/ex_act(severity)
@@ -208,7 +207,7 @@
/obj/machinery/biogenerator/attack_hand(mob/user)
interact(user)
-
+
/obj/machinery/biogenerator/attack_ghost(mob/user)
interact(user)
diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm
index 95e195caaf7..ebe74316ed4 100644
--- a/code/modules/hydroponics/gene_modder.dm
+++ b/code/modules/hydroponics/gene_modder.dm
@@ -24,13 +24,22 @@
/obj/machinery/plantgenes/New()
..()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/plantgenes(src)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
- component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
- component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/circuitboard/plantgenes(null)
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
+ component_parts += new /obj/item/weapon/stock_parts/scanning_module(null)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
RefreshParts()
+/obj/machinery/plantgenes/Destroy()
+ core_genes.Cut()
+ reagent_genes.Cut()
+ trait_genes.Cut()
+ target = null
+ QDEL_NULL(seed)
+ QDEL_NULL(disk)
+ return ..()
+
/obj/machinery/plantgenes/RefreshParts()
rating = 0
for(var/I in component_parts)
@@ -90,7 +99,7 @@
if(..())
return
interact(user)
-
+
/obj/machinery/plantgenes/attack_ghost(mob/user)
interact(user)
@@ -282,9 +291,9 @@
repaint_seed()
if("extract")
if(disk && !disk.read_only)
- disk.gene = G
- if(istype(G, /datum/plant_gene/core/potency))
- var/datum/plant_gene/core/gene = G
+ disk.gene = G.Copy()
+ if(istype(disk.gene, /datum/plant_gene/core/potency))
+ var/datum/plant_gene/core/gene = disk.gene
gene.value = min(gene.value, max_extract_pot)
disk.update_name()
qdel(seed)
@@ -370,6 +379,10 @@
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
+/obj/item/weapon/disk/plantgene/Destroy()
+ QDEL_NULL(gene)
+ return ..()
+
/obj/item/weapon/disk/plantgene/attackby(obj/item/weapon/W, mob/user, params)
..()
if(istype(W, /obj/item/weapon/pen))
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 2322bbad5ca..130fc2730ac 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -39,7 +39,9 @@
transform *= TransformUsingVariable(seed.potency, 100, 0.5) //Makes the resulting produce's sprite larger or smaller based on potency!
add_juice()
-
+/obj/item/weapon/reagent_containers/food/snacks/grown/Destroy()
+ QDEL_NULL(seed)
+ return ..()
/obj/item/weapon/reagent_containers/food/snacks/grown/proc/add_juice()
if(reagents)
diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm
index 64d2eff90b7..c94706f00e5 100644
--- a/code/modules/hydroponics/growninedible.dm
+++ b/code/modules/hydroponics/growninedible.dm
@@ -31,6 +31,9 @@
transform *= TransformUsingVariable(seed.potency, 100, 0.5)
add_juice()
+/obj/item/weapon/grown/Destroy()
+ QDEL_NULL(seed)
+ return ..()
/obj/item/weapon/grown/attackby(obj/item/O, mob/user, params)
..()
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 46f6f317434..7e7aa825411 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -75,9 +75,7 @@
plant_hud_set_water()
/obj/machinery/hydroponics/Destroy()
- if(myseed)
- qdel(myseed)
- myseed = null
+ QDEL_NULL(myseed)
return ..()
/obj/machinery/hydroponics/constructable/attackby(obj/item/I, mob/user, params)
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index d35621e4c59..9aa93f9f92b 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -68,6 +68,12 @@
for(var/reag_id in reagents_add)
genes += new /datum/plant_gene/reagent(reag_id, reagents_add[reag_id])
+/obj/item/seeds/Destroy()
+ for(var/thing in genes)
+ qdel(thing)
+ genes.Cut()
+ return ..()
+
/obj/item/seeds/proc/Copy()
var/obj/item/seeds/S = new type(null, 1)
// Copy all the stats
diff --git a/code/modules/karma/karma.dm b/code/modules/karma/karma.dm
index be808a2c7b9..bdbe222990a 100644
--- a/code/modules/karma/karma.dm
+++ b/code/modules/karma/karma.dm
@@ -79,7 +79,7 @@ var/list/karma_spenders = list()
to_chat(src, "You can't spend karma on someone connected from the same IP.")
return 0
return 1
-
+
/mob/verb/spend_karma_list()
set name = "Award Karma"
@@ -118,8 +118,6 @@ var/list/karma_spenders = list()
if(!M)
to_chat(usr, "Please right click a mob to award karma directly, or use the 'Award Karma' verb to select a player from the player listing.")
return
- if(!can_give_karma_to_mob(M))
- return
if(alert("Give [M.name] good karma?", "Karma", "Yes", "No") != "Yes")
return
if(!can_give_karma_to_mob(M))
diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm
index ed8b400337a..dec8712eb74 100644
--- a/code/modules/mining/lavaland/loot/tendril_loot.dm
+++ b/code/modules/mining/lavaland/loot/tendril_loot.dm
@@ -33,7 +33,7 @@
if(bag)
bag.loc = user
bag.attackby(W, user, params)
-
+
/obj/item/device/shared_storage/attack_self(mob/living/carbon/user)
if(!iscarbon(user))
return
@@ -116,7 +116,7 @@
H.adjustBruteLoss(20)
H.emote("scream")
..()*/
-
+
//Boat
/obj/vehicle/lavaboat
@@ -183,7 +183,7 @@
generic_pixel_y = 2
generic_pixel_x = 1
vehicle_move_delay = 1
-
+
// Wisp Lantern
/obj/item/device/wisp_lantern
name = "spooky lantern"
@@ -238,16 +238,16 @@
layer = ABOVE_ALL_MOB_LAYER
light_power = 1
light_range = 7
-
+
//Red/Blue Cubes
-
+
/obj/item/device/warp_cube
name = "blue cube"
desc = "A mysterious blue cube."
icon = 'icons/obj/lavaland/artefacts.dmi'
icon_state = "blue_cube"
var/obj/item/device/warp_cube/linked
-
+
/obj/item/device/warp_cube/Destroy()
if(linked)
linked.linked = null
@@ -260,14 +260,14 @@
return
var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
- smoke.set_up(1, 0, user.loc)
+ smoke.set_up(1, 0, user.loc)
smoke.start()
user.forceMove(get_turf(linked))
feedback_add_details("warp_cube","[src.type]")
var/datum/effect/system/harmless_smoke_spread/smoke2 = new /datum/effect/system/harmless_smoke_spread()
- smoke2.set_up(1, 0, user.loc)
+ smoke2.set_up(1, 0, user.loc)
smoke2.start()
/obj/item/device/warp_cube/red
@@ -281,7 +281,7 @@
var/obj/item/device/warp_cube/blue = new(src.loc)
linked = blue
blue.linked = src
-
+
//Meat Hook
/obj/item/weapon/gun/magic/hook
@@ -329,9 +329,9 @@
L.forceMove(get_turf(firer))
/obj/item/projectile/hook/Destroy()
- qdel(chain)
+ QDEL_NULL(chain)
return ..()
-
+
//Immortality Talisman
/obj/item/device/immortality_talisman
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 395f6842a1f..2935ed25d04 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -226,6 +226,7 @@
/obj/item/device/mobcapsule/Destroy()
if(captured)
+ captured.ghostize()
qdel(captured)
captured = null
return ..()
diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm
index 2b671317b64..cc50f46b9e5 100644
--- a/code/modules/mining/ore.dm
+++ b/code/modules/mining/ore.dm
@@ -62,7 +62,7 @@
points = 1
refined_type = /obj/item/stack/sheet/glass
materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
-
+
/obj/item/weapon/ore/glass/basalt
name = "volcanic ash"
icon_state = "volcanic_sand"
@@ -163,8 +163,7 @@
var/datum/wires/explosive/gibtonite/wires
/obj/item/weapon/twohanded/required/gibtonite/Destroy()
- qdel(wires)
- wires = null
+ QDEL_NULL(wires)
return ..()
/obj/item/weapon/twohanded/required/gibtonite/attackby(obj/item/I, mob/user, params)
@@ -192,7 +191,7 @@
quality = 1
return
..()
-
+
/obj/item/weapon/twohanded/required/gibtonite/attack_ghost(mob/user)
if(wires)
wires.Interact(user)
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index ca520ba9289..b5fa736dfc3 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -220,7 +220,7 @@
threatcount += 4
//Mindshield implants imply trustworthyness
- if(isloyal(src))
+ if(ismindshielded(src))
threatcount -= 1
return threatcount
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index f495e5b7f75..15c52d2693c 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -167,12 +167,8 @@
if(isrobot(loc))
var/mob/living/silicon/robot/borg = loc
borg.mmi = null
- if(brainmob)
- qdel(brainmob)
- brainmob = null
- if(held_brain)
- qdel(held_brain)
- held_brain = null
+ QDEL_NULL(brainmob)
+ QDEL_NULL(held_brain)
return ..()
/obj/item/device/mmi/syndie
diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm
index 4c24562ecc1..56a98142f80 100644
--- a/code/modules/mob/living/carbon/brain/brain_item.dm
+++ b/code/modules/mob/living/carbon/brain/brain_item.dm
@@ -123,7 +123,5 @@
icon_state = "scroll"
/obj/item/organ/internal/brain/Destroy() //copypasted from MMIs.
- if(brainmob)
- qdel(brainmob)
- brainmob = null
+ QDEL_NULL(brainmob)
return ..()
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index a5fc0a1c4de..b0a7dfd57a0 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -53,6 +53,19 @@
if(!found_slime_bodypart) //Everyone else fails, skip the emote attempt
return
+
+ if("clack", "clacks")
+ if(species.name == "Kidan") //Only Kidan can clack and rightfully so.
+ on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
+ else //Everyone else fails, skip the emote attempt
+ return
+
+ if("click", "clicks")
+ if(species.name == "Kidan") //Only Kidan can click and rightfully so.
+ on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
+ else //Everyone else fails, skip the emote attempt
+ return
+
if("scream", "screams")
on_CD = handle_emote_CD(50) //longer cooldown
if("fart", "farts", "flip", "flips", "snap", "snaps")
@@ -163,6 +176,40 @@
playsound(loc, 'sound/effects/slime_squish.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound.
m_type = 2
+ if("clack", "clacks")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] clacks their mandibles at [param]."
+ else
+ message = "[src] clacks their mandibles."
+ playsound(loc, 'sound/effects/Kidanclack.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound.
+ m_type = 2
+
+ if("click", "clicks")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] clicks their mandibles at [param]."
+ else
+ message = "[src] clicks their mandibles."
+ playsound(loc, 'sound/effects/Kidanclack2.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound.
+ m_type = 2
+
if("yes")
var/M = null
if(param)
@@ -225,12 +272,12 @@
if(!restrained())
message = "[src] is strumming the air and headbanging like a safari chimp."
m_type = 1
-
+
if("dance")
if(!restrained())
message = "[src] dances around happily."
m_type = 1
-
+
if("jump")
if(!restrained())
message = "[src] jumps!"
@@ -836,11 +883,11 @@
// playsound(loc, 'sound/effects/fart.ogg', 50, 1, -3) //Admins still vote no to fun
if(locate(/obj/item/weapon/storage/bible) in get_turf(src))
to_chat(viewers(src), "[src] farts on the Bible!")
- var/image/cross = image('icons/obj/storage.dmi',"bible")
- var/adminbfmessage = "\blue [bicon(cross)] Bible Fart: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src)]) (CA) (SMITE):"
- for(var/client/X in admins)
- if(check_rights(R_EVENT,0,X.mob))
- to_chat(X, adminbfmessage)
+ var/image/cross = image('icons/obj/storage.dmi',"bible")
+ var/adminbfmessage = "\blue [bicon(cross)] Bible Fart: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src)]) (CA) (SMITE):"
+ for(var/client/X in admins)
+ if(check_rights(R_EVENT,0,X.mob))
+ to_chat(X, adminbfmessage)
else if(TOXIC_FARTS in mutations)
message = "[src] unleashes a [pick("horrible","terrible","foul","disgusting","awful")] fart."
else if(SUPER_FART in mutations)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 57ea7121074..10b21d8b946 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1892,7 +1892,7 @@
//Mindshield implants imply slight trustworthiness
- if(isloyal(src))
+ if(ismindshielded(src))
threatcount -= 1
//Agent cards lower threatlevel.
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 63378d1a776..15f9b6d112e 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -1,7 +1,7 @@
var/global/default_martial_art = new/datum/martial_art
/mob/living/carbon/human
- hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,NATIONS_HUD)
+ hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPMINDSHIELD_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,NATIONS_HUD)
//Marking colour and style
var/list/m_colours = DEFAULT_MARKING_COLOURS //All colours set to #000000.
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 624b4a9ca84..c7018183da3 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1181,7 +1181,8 @@
else
AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3)
adjustOxyLoss(5)
- adjustBruteLoss(1)
+ Paralyse(4)
+ adjustBruteLoss(2)
diff --git a/code/modules/mob/living/carbon/human/species/abductor.dm b/code/modules/mob/living/carbon/human/species/abductor.dm
index 4690529524f..8e9c61992aa 100644
--- a/code/modules/mob/living/carbon/human/species/abductor.dm
+++ b/code/modules/mob/living/carbon/human/species/abductor.dm
@@ -18,7 +18,7 @@
"eyes" = /obj/item/organ/internal/eyes/abductor //3 darksight.
)
- flags = HAS_LIPS | NO_BLOOD | NO_BREATHE
+ flags = HAS_LIPS | NO_BLOOD | NO_BREATHE | NOGUNS
oxy_mod = 0
@@ -27,11 +27,14 @@
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
blood_color = "#FF5AFF"
+ female_scream_sound = 'sound/goonstation/voice/male_scream.ogg'
+ female_cough_sounds = list('sound/effects/mob_effects/m_cougha.ogg','sound/effects/mob_effects/m_coughb.ogg', 'sound/effects/mob_effects/m_coughc.ogg')
+ female_sneeze_sound = 'sound/effects/mob_effects/sneeze.ogg' //Abductors always scream like guys
-/datum/species/abductor/can_understand(var/mob/other) //Abductors can understand everyone, but they can only speak over their mindlink to another team-member
+/datum/species/abductor/can_understand(mob/other) //Abductors can understand everyone, but they can only speak over their mindlink to another team-member
return 1
-/datum/species/abductor/handle_post_spawn(var/mob/living/carbon/human/H)
+/datum/species/abductor/handle_post_spawn(mob/living/carbon/human/H)
H.gender = NEUTER
if(H.mind)
H.mind.abductor = new /datum/abductor
diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm
index 04cbbe653ba..10e39022315 100644
--- a/code/modules/mob/living/carbon/human/species/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station.dm
@@ -486,7 +486,7 @@
brute_mod = 0.8
flags = IS_WHITELISTED
- clothing_flags = HAS_SOCKS
+ clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = FEET_CLAWS | HAS_HEAD_ACCESSORY
eyes = "kidan_eyes_s"
dietflags = DIET_HERB
@@ -512,6 +512,8 @@
"is attempting to bite their antenna off!",
"is jamming their claws into their eye sockets!",
"is twisting their own neck!",
+ "is cracking their exoskeleton!",
+ "is stabbing themselves with their mandibles!",
"is holding their breath!")
/datum/species/slime
diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm
index fac41aa66f7..7a8ab4c0701 100644
--- a/code/modules/mob/living/carbon/superheroes.dm
+++ b/code/modules/mob/living/carbon/superheroes.dm
@@ -189,7 +189,7 @@
to_chat(target, "You feel yourself agreeing with [user], and a surge of loyalty begins building.")
target.Weaken(12)
sleep(20)
- if(isloyal(target))
+ if(ismindshielded(target))
to_chat(user, "They are enslaved by Nanotrasen. You feel their interest in your cause wane and disappear.")
user.visible_message("[user] stops talking for a moment, then moves back away from [target].")
to_chat(target, "Your mindshield implant activates, protecting you from conversion.")
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 239f0e6330a..06021939ac9 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -246,7 +246,7 @@ var/list/ai_verbs_default = list(
ai_list -= src
shuttle_caller_list -= src
shuttle_master.autoEvac()
- qdel(eyeobj) // No AI, no Eye
+ QDEL_NULL(eyeobj) // No AI, no Eye
malfhack = null
return ..()
@@ -299,22 +299,59 @@ var/list/ai_verbs_default = list(
for(var/i = 1 to Entry.len)
Entry[i] = trim(Entry[i])
- if(Entry.len < 2)
+ if(Entry.len < 2 || Entry[1] != "ai") //ignore incorrectly formatted entries or entries that aren't marked for AI
continue
- if(Entry.len < 3 && Entry[1] == ckey && Entry[2] == real_name)
- custom_sprite = 1 //They're in the list? Custom sprite time
- icon = 'icons/mob/custom-synthetic.dmi'
+ if(Entry[2] == ckey) //They're in the list? Custom sprite time, var and icon change required
+ custom_sprite = 1
+ var/display_choices = list(
+ "Monochrome",
+ "Blue",
+ "Clown",
+ "Inverted",
+ "Text",
+ "Smiley",
+ "Angry",
+ "Dorf",
+ "Matrix",
+ "Bliss",
+ "Firewall",
+ "Green",
+ "Red",
+ "Static",
+ "Triumvirate",
+ "Triumvirate Static",
+ "Red October",
+ "Sparkles",
+ "ANIMA",
+ "President",
+ "NT",
+ "NT2",
+ "Rainbow",
+ "Angel",
+ "Heartline",
+ "Hades",
+ "Helios",
+ "Syndicat Meow",
+ "Too Deep",
+ "Goon",
+ "Murica",
+ "Fuzzy",
+ "Glitchman",
+ "House",
+ "Database"
+ )
+ if(custom_sprite)
+ display_choices += "Custom"
//if(icon_state == initial(icon_state))
var/icontype = ""
- if(custom_sprite == 1)
- icontype = ("Custom")//automagically selects custom sprite if one is available
- else
- icontype = input("Select an icon!", "AI", null, null) in list("Monochrome", "Blue", "Clown", "Inverted", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Firewall", "Green", "Red", "Static", "Triumvirate", "Triumvirate Static", "Red October", "Sparkles", "ANIMA", "President", "NT", "NT2", "Rainbow", "Angel", "Heartline", "Hades", "Helios", "Syndicat Meow", "Too Deep", "Goon", "Murica", "Fuzzy", "Glitchman", "House", "Database")
+ icontype = input("Select an icon!", "AI", null, null) in display_choices
+ icon = 'icons/mob/AI.dmi' //reset this in case we were on a custom sprite and want to change to a standard one
switch(icontype)
if("Custom")
+ icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi' //set this here so we can use the custom_sprite
icon_state = "[ckey]-ai"
if("Clown")
icon_state = "ai-clown"
@@ -859,10 +896,10 @@ var/list/ai_verbs_default = list(
for(var/i = 1 to Entry.len)
Entry[i] = trim(Entry[i])
- if(Entry.len < 3)
+ if(Entry.len < 2 || Entry[1] != "hologram")
continue
- if (Entry[1] == ckey && Entry[2] == real_name && Entry[3] == "Hologram") //Custom holograms
+ if (Entry[2] == ckey) //Custom holograms
custom_hologram = 1 // option is given in hologram menu
var/input
@@ -971,10 +1008,10 @@ var/list/ai_verbs_default = list(
if("ancient machine")
holo_icon = getHologramIcon(icon('icons/mob/ancient_machine.dmi', "ancient_machine"))
if("custom")
- if("[ckey]-ai-holo" in icon_states('icons/mob/custom-synthetic.dmi'))
- holo_icon = getHologramIcon(icon('icons/mob/custom-synthetic.dmi', "[ckey]-ai-holo"))
- else if("[ckey]-ai-holo" in icon_states('icons/mob/custom-synthetic64.dmi'))
- holo_icon = getHologramIcon(icon('icons/mob/custom-synthetic64.dmi', "[ckey]-ai-holo"))
+ if("[ckey]-ai-holo" in icon_states('icons/mob/custom_synthetic/custom-synthetic.dmi'))
+ holo_icon = getHologramIcon(icon('icons/mob/custom_synthetic/custom-synthetic.dmi', "[ckey]-ai-holo"))
+ else if("[ckey]-ai-holo" in icon_states('icons/mob/custom_synthetic/custom-synthetic64.dmi'))
+ holo_icon = getHologramIcon(icon('icons/mob/custom_synthetic/custom-synthetic64.dmi', "[ckey]-ai-holo"))
else
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo1"))
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index d3ecd92da08..5218d399007 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -81,6 +81,7 @@
var/translator_on = 0 // keeps track of the translator module
var/current_pda_messaging = null
+ var/custom_sprite = 0
/mob/living/silicon/pai/New(var/obj/item/device/paicard)
loc = paicard
@@ -394,17 +395,47 @@
set category = "pAI Commands"
set name = "Choose Chassis"
+ var/list/my_choices = list()
var/choice
var/finalized = "No"
+
+ //check for custom_sprite
+ if(!custom_sprite)
+ var/file = file2text("config/custom_sprites.txt")
+ var/lines = splittext(file, "\n")
+
+ for(var/line in lines)
+ // split & clean up
+ var/list/Entry = splittext(line, ":")
+ for(var/i = 1 to Entry.len)
+ Entry[i] = trim(Entry[i])
+
+ if(Entry.len < 2 || Entry[1] != "pai") //ignore incorrectly formatted entries or entries that aren't marked for pAI
+ continue
+
+ if(Entry[2] == ckey) //They're in the list? Custom sprite time, var and icon change required
+ custom_sprite = 1
+ my_choices["Custom"] = "[ckey]-pai"
+
+ my_choices = possible_chassis.Copy()
+ if(custom_sprite)
+ my_choices["Custom"] = "[ckey]-pai"
+
+ if(loc == card) //don't let them continue in card form, since they won't be able to actually see their new mobile form sprite.
+ to_chat(src, "You must be in your mobile form to reconfigure your chassis.")
+ return
+
while(finalized == "No" && client)
-
- choice = input(usr,"What would you like to use for your mobile chassis icon? This decision can only be made once.") as null|anything in possible_chassis
+ choice = input(usr,"What would you like to use for your mobile chassis icon? This decision can only be made once.") as null|anything in my_choices
if(!choice) return
-
- icon_state = possible_chassis[choice]
+ if(choice == "Custom")
+ icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi'
+ else
+ icon = 'icons/mob/pai.dmi'
+ icon_state = my_choices[choice]
finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes")
- chassis = possible_chassis[choice]
+ chassis = my_choices[choice]
verbs -= /mob/living/silicon/pai/proc/choose_chassis
/mob/living/silicon/pai/proc/choose_verbs()
@@ -562,15 +593,23 @@
// Handle being picked up.
-/mob/living/silicon/pai/get_scooped(var/mob/living/carbon/grabber)
+/mob/living/silicon/pai/get_scooped(mob/living/carbon/grabber)
var/obj/item/weapon/holder/H = ..()
if(!istype(H))
return
if(resting)
icon_state = "[chassis]"
resting = 0
- H.icon_state = "pai-[icon_state]"
- H.item_state = "pai-[icon_state]"
+ if(custom_sprite)
+ H.icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi'
+ H.icon_override = 'icons/mob/custom_synthetic/custom_head.dmi'
+ H.lefthand_file = 'icons/mob/custom_synthetic/custom_lefthand.dmi'
+ H.righthand_file = 'icons/mob/custom_synthetic/custom_righthand.dmi'
+ H.icon_state = "[icon_state]"
+ H.item_state = "[icon_state]_hand"
+ else
+ H.icon_state = "pai-[icon_state]"
+ H.item_state = "pai-[icon_state]"
grabber.put_in_active_hand(H)//for some reason unless i call this it dosen't work
grabber.update_inv_l_hand()
grabber.update_inv_r_hand()
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index a16bfa4b005..4c52f2f415d 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -281,7 +281,7 @@
if(!player) return
- src.ckey = player.ckey
+ ckey = player.ckey
if(player.mob && player.mob.mind)
player.mob.mind.transfer_to(src)
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
index 2196b421f87..f9c711b4b17 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
@@ -47,4 +47,55 @@
if(M.a_intent == I_HELP)
get_scooped(M)
- ..()
\ No newline at end of file
+ ..()
+
+/mob/living/silicon/robot/drone/verb/customize()
+ set name = "Customize Chassis"
+ set desc = "Reconfigure your chassis into a customized version."
+ set category = "Drone"
+
+ if(!custom_sprite) //Check to see if custom sprite time, checking the appopriate file to change a var
+ var/file = file2text("config/custom_sprites.txt")
+ var/lines = splittext(file, "\n")
+
+ for(var/line in lines)
+ // split & clean up
+ var/list/Entry = splittext(line, ":")
+ for(var/i = 1 to Entry.len)
+ Entry[i] = trim(Entry[i])
+
+ if(Entry.len < 2 || Entry[1] != "drone")
+ continue
+
+ if (Entry[2] == ckey) //Custom holograms
+ custom_sprite = 1 // option is given in hologram menu
+
+ if(!custom_sprite)
+ to_chat(src, "Error 404: Custom chassis not found. Revoking customization option.")
+ else
+ icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi'
+ icon_state = "[ckey]-drone"
+ to_chat(src, "You reconfigure your chassis and improve the station through your new aesthetics.")
+ verbs -= /mob/living/silicon/robot/drone/verb/customize
+
+/mob/living/silicon/robot/drone/get_scooped(mob/living/carbon/grabber)
+ var/obj/item/weapon/holder/H = ..()
+ if(!istype(H))
+ return
+ if(resting)
+ resting = 0
+ if(custom_sprite)
+ H.icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi'
+ H.icon_override = 'icons/mob/custom_synthetic/custom_head.dmi'
+ H.lefthand_file = 'icons/mob/custom_synthetic/custom_lefthand.dmi'
+ H.righthand_file = 'icons/mob/custom_synthetic/custom_righthand.dmi'
+ H.icon_state = "[icon_state]"
+ H.item_state = "[icon_state]_hand"
+ else
+ H.icon_state = "drone"
+ H.item_state = "drone"
+ grabber.put_in_active_hand(H)//for some reason unless i call this it dosen't work
+ grabber.update_inv_l_hand()
+ grabber.update_inv_r_hand()
+
+ return H
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 0c44545e72f..2b0ded32896 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -180,16 +180,15 @@ var/list/robot_verbs_default = list(
for(var/line in lines)
// split & clean up
- var/list/Entry = splittext(line, ";")
+ var/list/Entry = splittext(line, ":")
for(var/i = 1 to Entry.len)
Entry[i] = trim(Entry[i])
- if(Entry.len < 2)
- continue;
+ if(Entry.len < 2 || Entry[1] != "cyborg") //ignore incorrectly formatted entries or entries that aren't marked for cyborg
+ continue
- if(Entry[1] == src.ckey && Entry[2] == src.real_name) //They're in the list? Custom sprite time, var and icon change required
+ if(Entry[2] == ckey) //They're in the list? Custom sprite time, var and icon change required
custom_sprite = 1
- icon = 'icons/mob/custom-synthetic.dmi'
return 1
@@ -252,12 +251,10 @@ var/list/robot_verbs_default = list(
mmi = null
if(connected_ai)
connected_ai.connected_robots -= src
- qdel(wires)
- wires = null
- qdel(module)
- module = null
- camera = null
- cell = null
+ QDEL_NULL(wires)
+ QDEL_NULL(module)
+ QDEL_NULL(camera)
+ QDEL_NULL(cell)
return ..()
/mob/living/silicon/robot/proc/pick_module()
@@ -1252,15 +1249,14 @@ var/list/robot_verbs_default = list(
triesleft--
var/icontype
-
- if(custom_sprite == 1)
- icontype = "Custom"
- triesleft = 0
- else
- lockcharge = 1 //Locks borg until it select an icon to avoid secborgs running around with a standard sprite
- icontype = input("Select an icon! [triesleft ? "You have [triesleft] more chances." : "This is your last try."]", "Robot", null, null) in module_sprites
+ lockcharge = 1 //Locks borg until it select an icon to avoid secborgs running around with a standard sprite
+ icontype = input("Select an icon! [triesleft ? "You have [triesleft] more chances." : "This is your last try."]", "Robot", null, null) in module_sprites
if(icontype)
+ if(icontype == "Custom")
+ icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi'
+ else
+ icon = 'icons/mob/robots.dmi'
icon_state = module_sprites[icontype]
if(icontype == "Bro")
module.module_type = "Brobot"
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 55c3a8fba0f..9365da25f8d 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -35,8 +35,7 @@
for(var/module in modules)
qdel(module)
modules.Cut()
- qdel(emag)
- emag = null
+ QDEL_NULL(emag)
return ..()
/obj/item/weapon/robot_module/proc/fix_modules()
@@ -222,7 +221,7 @@
/obj/item/weapon/robot_module/security/New()
..()
modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
- modules += new /obj/item/weapon/melee/baton/loaded/robot(src)
+ modules += new /obj/item/weapon/melee/baton/loaded(src)
modules += new /obj/item/weapon/gun/energy/disabler/cyborg(src)
modules += new /obj/item/taperoll/police(src)
modules += new /obj/item/clothing/mask/gas/sechailer/cyborg(src)
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 23466c3e7b4..063fc07badf 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -169,14 +169,11 @@
/mob/living/simple_animal/bot/Destroy()
if(paicard)
ejectpai()
- qdel(Radio)
- Radio = null
- qdel(access_card)
- access_card = null
+ QDEL_NULL(Radio)
+ QDEL_NULL(access_card)
if(radio_controller && bot_filter)
radio_controller.remove_object(bot_core, control_freq)
- qdel(bot_core)
- bot_core = null
+ QDEL_NULL(bot_core)
return ..()
/mob/living/simple_animal/bot/death(gibbed)
@@ -263,7 +260,7 @@
interact(H)
else
return ..()
-
+
/mob/living/simple_animal/bot/attack_ghost(mob/M)
interact(M)
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index 871c8694725..e95d2409921 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -65,12 +65,8 @@
/mob/living/simple_animal/bot/mulebot/Destroy()
unload(0)
- if(wires)
- qdel(wires)
- wires = null
- if(cell)
- qdel(cell)
- cell = null
+ QDEL_NULL(wires)
+ QDEL_NULL(cell)
return ..()
/mob/living/simple_animal/bot/mulebot/proc/set_suffix(suffix)
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index 76577327b61..904762d6c27 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -295,8 +295,7 @@
queen = new(src)
/obj/item/queen_bee/Destroy()
- qdel(queen)
- queen = null
+ QDEL_NULL(queen)
return ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index dfb9948a1e3..228f4df9ad6 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -108,7 +108,7 @@ Difficulty: Hard
..()
/mob/living/simple_animal/hostile/megafauna/hierophant/Destroy()
- qdel(spawned_rune)
+ QDEL_NULL(spawned_rune)
. = ..()
/mob/living/simple_animal/hostile/megafauna/hierophant/devour(mob/living/L)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
index bd916532519..a8102b94b94 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -43,7 +43,7 @@
mouse_opacity = 2 // Easier to click on in melee, they're giant targets anyway
/mob/living/simple_animal/hostile/megafauna/Destroy()
- qdel(internal_gps)
+ QDEL_NULL(internal_gps)
. = ..()
/mob/living/simple_animal/hostile/megafauna/death(gibbed)
@@ -77,7 +77,7 @@
OpenFire()
else
devour(L)
-
+
/mob/living/simple_animal/hostile/megafauna/onShuttleMove()
var/turf/oldloc = loc
. = ..()
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index aec9d2d0c95..7c951cebbc9 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -96,6 +96,7 @@
if(collar)
collar.forceMove(loc)
collar = null
+ master_commander = null
simple_animal_list -= src
return ..()
@@ -303,7 +304,7 @@
/mob/living/simple_animal/proc/attacked_by(obj/item/I, mob/living/user) // Handled in _onclick/click.dm
return
-
+
/mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj)
if(!Proj)
return
@@ -662,15 +663,15 @@
. = ..()
/mob/living/simple_animal/can_equip(obj/item/I, slot, disable_warning = 0)
- // . = ..() // Do not call parent. We do not want animals using their hand slots.
- switch(slot)
- if(slot_collar)
- if(collar)
- return 0
- if(!can_collar)
- return 0
- if(!istype(I, /obj/item/clothing/accessory/petcollar))
- return 0
+ // . = ..() // Do not call parent. We do not want animals using their hand slots.
+ switch(slot)
+ if(slot_collar)
+ if(collar)
+ return 0
+ if(!can_collar)
+ return 0
+ if(!istype(I, /obj/item/clothing/accessory/petcollar))
+ return 0
return 1
/mob/living/simple_animal/equip_to_slot(obj/item/W, slot)
@@ -692,13 +693,13 @@
name = collar.tagname
real_name = collar.tagname
regenerate_icons()
-
-/mob/living/simple_animal/unEquip(obj/item/I, force)
- . = ..()
- if(!. || !I)
- return
-
- if(I == collar)
+
+/mob/living/simple_animal/unEquip(obj/item/I, force)
+ . = ..()
+ if(!. || !I)
+ return
+
+ if(I == collar)
collar = null
regenerate_icons()
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 4a58410aea2..e52854621bd 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -444,8 +444,7 @@
if(assailant.client)
assailant.client.screen -= hud
assailant = null
- qdel(hud)
- hud = null
+ QDEL_NULL(hud)
return ..()
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 6926e08af52..69bba669de0 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -41,8 +41,8 @@
else if(eyes) //If they're not, check to see if their eyes got one of them there colour matrices. Will be null if eyes are robotic/the mob isn't colourblind and they have no default colour matrix.
return eyes.get_colourmatrix()
-/proc/isloyal(A) //Checks to see if the person contains a mindshield implant, then checks that the implant is actually inside of them
- for(var/obj/item/weapon/implant/loyalty/L in A)
+/proc/ismindshielded(A) //Checks to see if the person contains a mindshield implant, then checks that the implant is actually inside of them
+ for(var/obj/item/weapon/implant/mindshield/L in A)
if(L && L.implanted)
return 1
return 0
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 3451d3bf5e7..ea80c4def16 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -559,10 +559,67 @@
/datum/sprite_accessory/hair/unathi
species_allowed = list("Unathi")
glasses_over = 1
+ icon = 'icons/mob/body_accessory.dmi'
-/datum/sprite_accessory/hair/unathi/una_horns
- name = "Unathi Horns"
- icon_state = "soghun_horns"
+/datum/sprite_accessory/hair/unathi/una_side_frills
+ icon = 'icons/mob/human_face.dmi'
+ name = "Unathi Side Frills"
+ icon_state = "unathi_sidefrills"
+ secondary_theme = "webbing"
+
+/datum/sprite_accessory/hair/unathi/una_frills_dorsal
+ icon = 'icons/mob/human_face.dmi'
+ name = "Dorsal Frills"
+ icon_state = "unathi_dorsalfrills"
+ secondary_theme = "webbing"
+
+/datum/sprite_accessory/hair/unathi/simple
+ name = "Simple Horns"
+ icon_state = "horns_simple"
+
+/datum/sprite_accessory/hair/unathi/short
+ name = "Short Horns"
+ icon_state = "horns_short"
+
+/datum/sprite_accessory/hairy/unathi/curled
+ name = "Curled Horns"
+ icon_state = "horns_curled"
+
+/datum/sprite_accessory/hair/unathi/ram
+ name = "Ram Horns"
+ icon_state = "horns_ram"
+
+/datum/sprite_accessory/hair/unathi/double
+ name = "Double Horns"
+ icon_state = "horns_drac"
+
+/datum/sprite_accessory/hair/unathi/lower
+ name = "Lower Horns"
+ icon_state = "horns_lower"
+
+/datum/sprite_accessory/hair/unathi/big
+ name = "Big"
+ icon_state = "horns_big"
+
+/datum/sprite_accessory/hair/unathi/ram2
+ name = "Ram alt."
+ icon_state = "horns_ram2"
+
+/datum/sprite_accessory/hair/unathi/small
+ name = "Small"
+ icon_state = "horns_small"
+
+/datum/sprite_accessory/hair/unathi/chin
+ name = "Chin"
+ icon_state = "horns_chin"
+
+/datum/sprite_accessory/hair/unathi/adorns
+ name = "Adorns"
+ icon_state = "horns_adorns"
+
+/datum/sprite_accessory/hair/unathi/spikes
+ name = "Spikes"
+ icon_state = "horns_spikes"
/datum/sprite_accessory/hair/skrell
species_allowed = list("Skrell")
@@ -747,6 +804,20 @@
icon_state = "braided"
secondary_theme = "beads"
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_punkbraided
+ name = "Punk Braided"
+ icon_state = "punkbraided"
+ secondary_theme = "flare"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_short2
+ name = "Short Alt."
+ icon_state = "short2"
+ glasses_over = 1
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_rough
+ name = "Rough-Cropped Mane"
+ icon_state = "rough"
+
/datum/sprite_accessory/hair/vox
species_allowed = list("Vox")
glasses_over = 1
@@ -984,6 +1055,10 @@
name = "Tajara Goatee"
icon_state = "facial_goatee"
+/datum/sprite_accessory/facial_hair/tajara/taj_goatee_faded
+ name = "Tajara Faded Goatee"
+ icon_state = "facial_goatee_faded"
+
/datum/sprite_accessory/facial_hair/tajara/taj_smallstache
name = "Tajara Smallstache"
icon_state = "facial_smallstache"
@@ -1048,6 +1123,15 @@
name = "Swift"
icon_state = "vulp_facial_swift"
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_elder
+ name = "Elder"
+ icon_state = "vulp_facial_elder"
+ secondary_theme = "chin"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_slash
+ name = "Slash"
+ icon_state = "vulp_facial_slash"
+
/datum/sprite_accessory/facial_hair/unathi
species_allowed = list("Unathi")
gender = NEUTER
@@ -1055,39 +1139,74 @@
/datum/sprite_accessory/facial_hair/unathi/una_spines_long
name = "Long Spines"
- icon_state = "soghun_longspines"
+ icon_state = "unathi_longspines"
/datum/sprite_accessory/facial_hair/unathi/una_spines_short
name = "Short Spines"
- icon_state = "soghun_shortspines"
+ icon_state = "unathi_shortspines"
+
+/datum/sprite_accessory/facial_hair/unathi/una_frills_aquaspine
+ name = "Spiny Aquatic Frills"
+ icon_state = "unathi_dracfrills"
/datum/sprite_accessory/facial_hair/unathi/una_frills_aquatic
name = "Aquatic Frills"
- icon_state = "soghun_aquaticfrills"
+ icon_state = "unathi_aquaticfrills"
/datum/sprite_accessory/facial_hair/unathi/una_frills_long
name = "Long Frills"
- icon_state = "soghun_longfrills"
+ icon_state = "unathi_longfrills"
/datum/sprite_accessory/facial_hair/unathi/una_frills_short
name = "Short Frills"
- icon_state = "soghun_shortfrills"
+ icon_state = "unathi_shortfrills"
+
+/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_aquaspine
+ name = "Spiny Aquatic Webbed Frills"
+ icon_state = "unathi_dracfrills"
+ secondary_theme = "webbing"
/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_aquatic
name = "Aquatic Webbed Frills"
- icon_state = "soghun_aquaticfrills"
+ icon_state = "unathi_aquaticfrills"
secondary_theme = "webbing"
/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_long
name = "Long Webbed Frills"
- icon_state = "soghun_longfrills"
+ icon_state = "unathi_longfrills"
secondary_theme = "webbing"
/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_short
name = "Short Webbed Frills"
- icon_state = "soghun_shortfrills"
+ icon_state = "unathi_shortfrills"
secondary_theme = "webbing"
+/datum/sprite_accessory/facial_hair/unathi/una_side_frills
+ name = "Side Frills"
+ icon_state = "unathi_sidefrills"
+ secondary_theme = "webbing"
+
+/datum/sprite_accessory/facial_hair/unathi/una_frills_dorsal
+ over_hair = null
+ name = "Dorsal Frills"
+ icon_state = "unathi_dorsalfrills"
+ secondary_theme = "webbing"
+
+/datum/sprite_accessory/facial_hair/unathi/una_chin_horns
+ name = "Chin Horns"
+ icon = 'icons/mob/body_accessory.dmi'
+ icon_state = "horns_chin"
+
+/datum/sprite_accessory/facial_hair/unathi/una_horn_adorns
+ name = "Horn Adorns"
+ icon = 'icons/mob/body_accessory.dmi'
+ icon_state = "horns_adorns"
+
+/datum/sprite_accessory/facial_hair/unathi/una_spikes
+ name = "Spikes"
+ icon = 'icons/mob/body_accessory.dmi'
+ icon_state = "horns_spikes"
+
//skin styles - WIP
//going to have to re-integrate this with surgery
//let the icon_state hold an icon preview for now
@@ -1649,6 +1768,38 @@
name = "Ram"
icon_state = "horns_ram"
+/datum/sprite_accessory/head_accessory/unathi/double
+ name = "Double"
+ icon_state = "horns_drac"
+
+/datum/sprite_accessory/head_accessory/unathi/lower
+ name = "Lower"
+ icon_state = "horns_lower"
+
+/datum/sprite_accessory/head_accessory/unathi/big
+ name = "Big"
+ icon_state = "horns_big"
+
+/datum/sprite_accessory/head_accessory/unathi/ram2
+ name = "Ram alt."
+ icon_state = "horns_ram2"
+
+/datum/sprite_accessory/head_accessory/unathi/small
+ name = "Small"
+ icon_state = "horns_small"
+
+/datum/sprite_accessory/head_accessory/unathi/chin
+ name = "Chin"
+ icon_state = "horns_chin"
+
+/datum/sprite_accessory/head_accessory/unathi/adorns
+ name = "Adorns"
+ icon_state = "horns_adorns"
+
+/datum/sprite_accessory/head_accessory/unathi/spikes
+ name = "Spikes"
+ icon_state = "horns_spikes"
+
/datum/sprite_accessory/head_accessory/tajara
species_allowed = list("Tajaran")
@@ -1729,6 +1880,20 @@
name = "Vulpkanin Nose"
icon_state = "markings_face_nose_vulp"
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_nose2
+ name = "Vulpkanin Nose Alt."
+ icon_state = "markings_face_nose2_vulp"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_elder
+ icon = 'icons/mob/human_face.dmi'
+ name = "Elder"
+ icon_state = "vulp_facial_elder"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_slash
+ icon = 'icons/mob/human_face.dmi'
+ name = "Slash"
+ icon_state = "vulp_facial_slash"
+
/datum/sprite_accessory/head_accessory/ipc
species_allowed = list("Machine")
over_hair = 1
@@ -1749,11 +1914,31 @@
name = "Head Light"
icon_state = "light"
+/datum/sprite_accessory/head_accessory/ipc/ipc_side_lights
+ name = "Side Lights"
+ icon_state = "sidelights"
+
+/datum/sprite_accessory/head_accessory/ipc/ipc_side_cyber_head
+ name = "Cyber Pipes"
+ icon_state = "cyberhead"
+
+/datum/sprite_accessory/head_accessory/ipc/ipc_side_antlers
+ name = "Antlers"
+ icon_state = "antlers"
+
+/datum/sprite_accessory/head_accessory/ipc/ipc_side_drone_eyes
+ name = "Drone Eyes"
+ icon_state = "droneeyes"
+
+/datum/sprite_accessory/head_accessory/ipc/ipc_crowned
+ name = "Crowned"
+ icon_state = "crowned"
+
/datum/sprite_accessory/head_accessory/kidan
icon = 'icons/mob/human_face.dmi'
species_allowed = list("Kidan")
over_hair = 1
- do_colouration = 0
+ do_colouration = 1
/datum/sprite_accessory/head_accessory/kidan/perked_antennae
name = "Perked-up Antennae"
@@ -1956,6 +2141,10 @@
name = "Vulpkanin Nose"
icon_state = "markings_face_nose_vulp"
+/datum/sprite_accessory/body_markings/head/vulpkanin/nose2_default_vulp
+ name = "Vulpkanin Nose Alt."
+ icon_state = "markings_face_nose2_vulp"
+
/datum/sprite_accessory/body_markings/head/vulpkanin/muzzle_vulp //Companion marking for Vulpkanin Belly Alt..
name = "Vulpkanin Muzzle"
icon_state = "markings_face_full_vulp"
diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm
index a28184fed7a..9e07fc19ddb 100644
--- a/code/modules/modular_computers/computers/machinery/modular_computer.dm
+++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm
@@ -41,9 +41,7 @@ var/list/global_modular_computers = list()
global_modular_computers.Add(src)
/obj/machinery/modular_computer/Destroy()
- if(cpu)
- qdel(cpu)
- cpu = null
+ QDEL_NULL(cpu)
return ..()
/obj/machinery/modular_computer/attack_ghost(mob/dead/observer/user)
diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm
index 15ae12a2859..40860cb58e0 100644
--- a/code/modules/modular_computers/file_system/computer_file.dm
+++ b/code/modules/modular_computers/file_system/computer_file.dm
@@ -23,7 +23,7 @@ var/global/file_uid = 0
if(holder.holder && holder.holder.active_program == src)
holder.holder.kill_program(forced = TRUE)
holder = null
- ..()
+ return ..()
// Returns independent copy of this file.
/datum/computer_file/proc/clone(rename = 0)
diff --git a/code/modules/modular_computers/file_system/programs/engineering/alarm.dm b/code/modules/modular_computers/file_system/programs/engineering/alarm.dm
index db5966314da..254559c2580 100644
--- a/code/modules/modular_computers/file_system/programs/engineering/alarm.dm
+++ b/code/modules/modular_computers/file_system/programs/engineering/alarm.dm
@@ -16,11 +16,10 @@
AH.register(src, /datum/computer_file/program/alarm_monitor/proc/update_icon)
/datum/computer_file/program/alarm_monitor/Destroy()
- ..()
for(var/datum/alarm_handler/AH in alarm_handlers)
AH.unregister(src)
- qdel(alarm_handlers)
- alarm_handlers = null
+ QDEL_NULL(alarm_handlers)
+ return ..()
/datum/computer_file/program/alarm_monitor/proc/update_icon()
for(var/datum/alarm_handler/AH in alarm_handlers)
diff --git a/code/modules/modular_computers/hardware/ai_slot.dm b/code/modules/modular_computers/hardware/ai_slot.dm
index 5fd3ca1fc6b..4de202ba8b5 100644
--- a/code/modules/modular_computers/hardware/ai_slot.dm
+++ b/code/modules/modular_computers/hardware/ai_slot.dm
@@ -11,9 +11,7 @@
var/locked = FALSE
/obj/item/weapon/computer_hardware/ai_slot/Destroy()
- if(stored_card)
- qdel(stored_card)
- stored_card = null
+ QDEL_NULL(stored_card)
return ..()
diff --git a/code/modules/modular_computers/hardware/battery_module.dm b/code/modules/modular_computers/hardware/battery_module.dm
index 5ef74b74f4b..06ecff641c3 100644
--- a/code/modules/modular_computers/hardware/battery_module.dm
+++ b/code/modules/modular_computers/hardware/battery_module.dm
@@ -14,9 +14,7 @@
..()
/obj/item/weapon/computer_hardware/battery/Destroy()
- if(battery)
- qdel(battery)
- battery = null
+ QDEL_NULL(battery)
return ..()
/obj/item/weapon/computer_hardware/battery/on_remove(obj/item/device/modular_computer/M, mob/living/user = null)
diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm
index 6d323bb7fca..ff02b69bace 100644
--- a/code/modules/modular_computers/hardware/card_slot.dm
+++ b/code/modules/modular_computers/hardware/card_slot.dm
@@ -11,12 +11,8 @@
var/obj/item/weapon/card/id/stored_card2 = null
/obj/item/weapon/computer_hardware/card_slot/Destroy()
- if(stored_card)
- qdel(stored_card)
- stored_card = null
- if(stored_card2)
- qdel(stored_card2)
- stored_card2 = null
+ QDEL_NULL(stored_card)
+ QDEL_NULL(stored_card2)
return ..()
/obj/item/weapon/computer_hardware/card_slot/GetAccess()
diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm
index 701c4e7080b..0865536bc36 100644
--- a/code/modules/ninja/energy_katana.dm
+++ b/code/modules/ninja/energy_katana.dm
@@ -74,6 +74,5 @@
spark_system.attach(src)
/obj/item/weapon/katana/energy/Destroy()
- qdel(spark_system)
- spark_system = null
+ QDEL_NULL(spark_system)
return ..()
\ No newline at end of file
diff --git a/code/modules/paperwork/frames.dm b/code/modules/paperwork/frames.dm
index 6a2e7d2d8b9..1e16049f4b8 100644
--- a/code/modules/paperwork/frames.dm
+++ b/code/modules/paperwork/frames.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/bureaucracy.dmi'
usesound = 'sound/items/Deconstruct.ogg'
-
+
var/icon_base
var/obj/displayed
@@ -198,9 +198,7 @@
verbs |= /obj/structure/sign/picture_frame/proc/tilt
/obj/structure/sign/picture_frame/Destroy()
- if(frame)
- qdel(frame)
- frame = null
+ QDEL_NULL(frame)
return ..()
/obj/structure/sign/picture_frame/update_icon()
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index 11faf20a703..a9e232560fc 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -30,6 +30,7 @@
w_class = 2
burn_state = FLAMMABLE
burntime = 5
+ var/blueprints = 0 // Does this have the blueprints?
var/icon/img //Big photo image
var/scribble //Scribble on the back.
var/icon/tiny
@@ -151,6 +152,7 @@
var/pictures_max = 10
var/pictures_left = 10
var/on = 1
+ var/blueprints = 0
var/icon_on = "camera"
var/icon_off = "camera_off"
var/size = 3
@@ -253,6 +255,8 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
var/atom/A = sorted[i]
if(A)
var/icon/img = getFlatIcon(A)//build_composite_icon(A)
+ if(istype(A, /obj/item/areaeditor/blueprints))
+ blueprints = 1
// If what we got back is actually a picture, draw it.
if(istype(img, /icon))
@@ -351,7 +355,7 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
y_c--
x_c = x_c - size
- var/datum/picture/P = createpicture(target, user, turfs, mobs, flag)
+ var/datum/picture/P = createpicture(target, user, turfs, mobs, flag, blueprints)
printpicture(user, P)
/obj/item/device/camera/proc/createpicture(atom/target, mob/user, list/turfs, mobs, flag)
@@ -388,6 +392,10 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
Photo.loc = user.loc
if(!user.get_inactive_hand())
user.put_in_inactive_hand(Photo)
+
+ if(blueprints)
+ Photo.blueprints = 1
+ blueprints = 0
Photo.construct(P)
/obj/item/weapon/photo/proc/construct(var/datum/picture/P)
@@ -409,6 +417,7 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
p.name = name
p.desc = desc
p.scribble = scribble
+ p.blueprints = blueprints
return p
diff --git a/code/modules/pda/PDA.dm b/code/modules/pda/PDA.dm
index d8b959e6225..966a418e5ad 100755
--- a/code/modules/pda/PDA.dm
+++ b/code/modules/pda/PDA.dm
@@ -440,7 +440,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
scanmode.scan_atom(A, user)
/obj/item/device/pda/proc/explode() //This needs tuning.
- if(!detonate)
+ if(!detonate)
return
var/turf/T = get_turf(src.loc)
@@ -467,9 +467,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
for(var/A in programs)
qdel(A)
programs.Cut()
- if(cartridge)
- qdel(cartridge)
- cartridge = null
+ QDEL_NULL(cartridge)
return ..()
// Pass along the pulse to atoms in contents, largely added so pAIs are vulnerable to EMP
diff --git a/code/modules/pda/cart.dm b/code/modules/pda/cart.dm
index 30d26607113..0fa2c10c88e 100644
--- a/code/modules/pda/cart.dm
+++ b/code/modules/pda/cart.dm
@@ -24,9 +24,7 @@
..()
/obj/item/weapon/cartridge/Destroy()
- if(radio)
- qdel(radio)
- radio = null
+ QDEL_NULL(radio)
for(var/A in programs)
qdel(A)
programs.Cut()
diff --git a/code/modules/pda/chatroom.dm b/code/modules/pda/chatroom.dm
index af03356f01f..de6f434a7dd 100644
--- a/code/modules/pda/chatroom.dm
+++ b/code/modules/pda/chatroom.dm
@@ -78,6 +78,7 @@ var/list/chatrooms = list(new /datum/chatroom("General Discussion"))
ch.users -= src
if(src in ch.invites)
ch.invites -= src
+ return ..()
/datum/data/pda/app/chatroom/start()
. = ..()
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 0c22b76cd2e..03a84d161e5 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -90,7 +90,6 @@
var/update_overlay = -1
var/global/status_overlays = 0
var/updating_icon = 0
- var/standard_max_charge
var/datum/wires/apc/wires = null
//var/debug = 0
var/global/list/status_overlays_lock
@@ -142,9 +141,6 @@
apcs += src
apcs = sortAtom(apcs)
wires = new(src)
- var/tmp/obj/item/weapon/stock_parts/cell/tmp_cell = new
- standard_max_charge = tmp_cell.maxcharge
- qdel(tmp_cell)
// offset 24 pixels in direction of dir
// this allows the APC to be embedded in a wall, yet still inside an area
@@ -178,11 +174,8 @@
area.power_change()
if(occupier)
malfvacate(1)
- qdel(wires)
- wires = null
- if(cell)
- qdel(cell) // qdel
- cell = null
+ QDEL_NULL(wires)
+ QDEL_NULL(cell)
if(terminal)
disconnect_terminal()
area.apc -= src
@@ -201,7 +194,7 @@
if(cell_type)
src.cell = new/obj/item/weapon/stock_parts/cell(src)
cell.maxcharge = cell_type // cell_type is maximum charge (old default was 1000 or 2500 (values one and two respectively)
- cell.charge = start_charge * cell.maxcharge / 100.0 // (convert percentage to actual value)
+ cell.charge = start_charge * cell.maxcharge / 100 // (convert percentage to actual value)
var/area/A = get_area(src)
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 164b9cb26db..942ed2ac98a 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -5,24 +5,25 @@
return 100.0*charge/maxcharge
// use power from a cell
-/obj/item/weapon/stock_parts/cell/proc/use(var/amount)
+/obj/item/weapon/stock_parts/cell/proc/use(amount)
if(rigged && amount > 0)
explode()
return 0
-
- if(charge < amount) return 0
+ if(charge < amount)
+ return 0
charge = (charge - amount)
return 1
// recharge the cell
-/obj/item/weapon/stock_parts/cell/proc/give(var/amount)
+/obj/item/weapon/stock_parts/cell/proc/give(amount)
if(rigged && amount > 0)
explode()
return 0
-
- if(maxcharge < amount) return 0
+ if(maxcharge < amount)
+ return 0
var/power_used = min(maxcharge-charge,amount)
- if(crit_fail) return 0
+ if(crit_fail)
+ return 0
if(!prob(reliability))
minor_fault++
if(prob(minor_fault))
@@ -31,7 +32,6 @@
charge += power_used
return power_used
-
/obj/item/weapon/stock_parts/cell/examine(mob/user)
if(..(user, 1))
if(maxcharge <= 2500)
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 5b015fcf58d..08b848657b0 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -52,8 +52,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
/obj/machinery/gravity_generator/part/Destroy()
set_broken()
- if(main_part)
- qdel(main_part)
+ QDEL_NULL(main_part)
return ..()
//
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index 4593ed69072..d0bdc9c6490 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -30,8 +30,7 @@
/obj/machinery/particle_accelerator/control_box/Destroy()
if(active)
toggle_power()
- qdel(wires)
- wires = null
+ QDEL_NULL(wires)
return ..()
/obj/machinery/particle_accelerator/control_box/attack_ghost(user as mob)
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index c1a202fa134..344971d42a2 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -72,9 +72,7 @@
/obj/machinery/power/supermatter_shard/Destroy()
investigate_log("has been destroyed.", "supermatter")
- if(radio)
- qdel(radio)
- radio = null
+ QDEL_NULL(radio)
poi_list.Remove(src)
return ..()
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index d0b4488d557..cdb0e063184 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -3,7 +3,7 @@
desc = "The part of the gun that makes the laser go pew"
caliber = "energy"
projectile_type = /obj/item/projectile/energy
- var/e_cost = 1000 //The amount of energy a cell needs to expend to create this shot.
+ var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot.
var/select_name = "energy"
fire_sound = 'sound/weapons/Laser.ogg'
@@ -13,10 +13,11 @@
/obj/item/ammo_casing/energy/lasergun
projectile_type = /obj/item/projectile/beam/laser
- e_cost = 830
+ e_cost = 83
select_name = "kill"
/obj/item/ammo_casing/energy/laser/hos //allows balancing of HoS and blueshit guns seperately from other energy weapons
+ e_cost = 100
/obj/item/ammo_casing/energy/laser/practice
projectile_type = /obj/item/projectile/beam/practice
@@ -35,13 +36,13 @@
/obj/item/ammo_casing/energy/laser/pulse
projectile_type = /obj/item/projectile/beam/pulse
- e_cost = 2000
+ e_cost = 200
select_name = "DESTROY"
fire_sound = 'sound/weapons/pulse.ogg'
/obj/item/ammo_casing/energy/laser/scatter/pulse
projectile_type = /obj/item/projectile/beam/pulse
- e_cost = 2000
+ e_cost = 200
select_name = "ANNIHILATE"
fire_sound = 'sound/weapons/pulse.ogg'
@@ -55,26 +56,27 @@
/obj/item/ammo_casing/energy/xray
projectile_type = /obj/item/projectile/beam/xray
- e_cost = 500
+ e_cost = 50
fire_sound = 'sound/weapons/laser3.ogg'
/obj/item/ammo_casing/energy/immolator
projectile_type = /obj/item/projectile/beam/immolator
fire_sound = 'sound/weapons/laser3.ogg'
- e_cost = 1250
+ e_cost = 125
/obj/item/ammo_casing/energy/electrode
projectile_type = /obj/item/projectile/energy/electrode
select_name = "stun"
fire_sound = 'sound/weapons/taser.ogg'
- e_cost = 2000
+ e_cost = 200
delay = 15
/obj/item/ammo_casing/energy/electrode/gun
fire_sound = 'sound/weapons/gunshot.ogg'
- e_cost = 1000
+ e_cost = 100
/obj/item/ammo_casing/energy/electrode/hos //allows balancing of HoS and blueshit guns seperately from other energy weapons
+ e_cost = 200
/obj/item/ammo_casing/energy/ion
projectile_type = /obj/item/projectile/ion
@@ -121,7 +123,7 @@
/obj/item/ammo_casing/energy/disabler
projectile_type = /obj/item/projectile/beam/disabler
select_name = "disable"
- e_cost = 500
+ e_cost = 50
fire_sound = 'sound/weapons/taser2.ogg'
/obj/item/ammo_casing/energy/plasma
@@ -129,12 +131,12 @@
select_name = "plasma burst"
fire_sound = 'sound/weapons/plasma_cutter.ogg'
delay = 15
- e_cost = 250
+ e_cost = 25
/obj/item/ammo_casing/energy/plasma/adv
projectile_type = /obj/item/projectile/plasma/adv
delay = 10
- e_cost = 100
+ e_cost = 10
/obj/item/ammo_casing/energy/wormhole
projectile_type = /obj/item/projectile/beam/wormhole
@@ -153,7 +155,7 @@
/obj/item/ammo_casing/energy/bolt
projectile_type = /obj/item/projectile/energy/bolt
select_name = "bolt"
- e_cost = 5000
+ e_cost = 500
fire_sound = 'sound/weapons/Genhit.ogg'
/obj/item/ammo_casing/energy/bolt/large
@@ -163,7 +165,7 @@
/obj/item/ammo_casing/energy/dart
projectile_type = /obj/item/projectile/energy/dart
fire_sound = 'sound/weapons/Genhit.ogg'
- e_cost = 5000
+ e_cost = 500
select_name = "toxic dart"
/obj/item/ammo_casing/energy/instakill
@@ -187,7 +189,7 @@
/obj/item/ammo_casing/energy/shock_revolver
fire_sound = 'sound/magic/lightningbolt.ogg'
- e_cost = 2000
+ e_cost = 200
select_name = "lightning beam"
projectile_type = /obj/item/projectile/energy/shock_revolver
@@ -210,7 +212,7 @@
/obj/item/ammo_casing/energy/teleport
projectile_type = /obj/item/projectile/energy/teleport
fire_sound = 'sound/weapons/wave.ogg'
- e_cost = 1250
+ e_cost = 250
select_name = "teleport beam"
var/teleport_target
diff --git a/code/modules/projectiles/ammunition/special.dm b/code/modules/projectiles/ammunition/special.dm
index d5c7df48200..1af728100f8 100644
--- a/code/modules/projectiles/ammunition/special.dm
+++ b/code/modules/projectiles/ammunition/special.dm
@@ -26,7 +26,7 @@
/obj/item/ammo_casing/magic/chaos
projectile_type = /obj/item/projectile/magic
-
+
/obj/item/ammo_casing/magic/spellblade
projectile_type = /obj/item/projectile/magic/spellblade
@@ -49,4 +49,4 @@
projectile_type = /obj/item/projectile/bullet/midbullet3
select_name = "spraydown"
fire_sound = 'sound/weapons/gunshot_smg.ogg'
- e_cost = 200
+ e_cost = 20
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 4e5bbce386c..7b848dca5c7 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -34,7 +34,7 @@
if(selfcharge)
processing_objects.Add(src)
update_icon()
-
+
/obj/item/weapon/gun/energy/proc/update_ammo_types()
var/obj/item/ammo_casing/energy/shot
for(var/i = 1, i <= ammo_type.len, i++)
@@ -61,9 +61,9 @@
var/obj/item/ammo_casing/energy/E = ammo_type[select]
if(use_external_power)
var/obj/item/weapon/stock_parts/cell/external = get_external_power_supply()
- if(!external || !external.use((E.e_cost)/10)) //Take power from the borg...
+ if(!external || !external.use(E.e_cost)) //Take power from the borg...
return //Note, uses /10 because of shitty mods to the cell system
- power_supply.give(1000) //... to recharge the shot
+ power_supply.give(100) //... to recharge the shot
update_icon()
/obj/item/weapon/gun/energy/attack_self(mob/living/user as mob)
@@ -176,7 +176,7 @@
var/mob/living/silicon/robot/R = loc
if(R && R.cell)
var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot
- if(R.cell.use(shot.e_cost/10)) //Take power from the borg... //Divided by 10 because cells and charge costs are fucked.
+ if(R.cell.use(shot.e_cost)) //Take power from the borg...
power_supply.give(shot.e_cost) //... to recharge the shot
/obj/item/weapon/gun/energy/proc/get_external_power_supply()
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index fb811c19d78..bdc4126a25c 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -94,7 +94,7 @@
empty()
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty()
- power_supply.use(5000)
+ power_supply.use(500)
update_icon()
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload()
@@ -120,7 +120,7 @@
return
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/reload()
- power_supply.give(5000)
+ power_supply.give(500)
if(!suppressed)
playsound(loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
else if(isliving(loc))
@@ -144,7 +144,7 @@
/obj/item/ammo_casing/energy/kinetic
projectile_type = /obj/item/projectile/kinetic
select_name = "kinetic"
- e_cost = 5000
+ e_cost = 500
fire_sound = 'sound/weapons/Kenetic_accel.ogg' // fine spelling there chap
/obj/item/ammo_casing/energy/kinetic/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
@@ -181,7 +181,7 @@
/obj/item/projectile/kinetic/pod
range = 4
-
+
/obj/item/projectile/kinetic/pod/regular
damage = 50
pressure_decrease = 0.5
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index ef184bd8d5b..727ebdd7082 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -39,8 +39,8 @@
/obj/item/weapon/gun/energy/gun/mini/New()
gun_light = new /obj/item/device/flashlight/seclite(src)
..()
- power_supply.maxcharge = 6000
- power_supply.charge = 6000
+ power_supply.maxcharge = 600
+ power_supply.charge = 600
/obj/item/weapon/gun/energy/gun/mini/update_icon()
..()
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 3131e49c4f2..3595b9c7ea8 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -157,11 +157,11 @@
if(istype(A, /obj/item/stack/sheet/mineral/plasma))
var/obj/item/stack/sheet/S = A
S.use(1)
- power_supply.give(10000)
+ power_supply.give(1000)
to_chat(user, "You insert [A] in [src], recharging it.")
else if(istype(A, /obj/item/weapon/ore/plasma))
qdel(A)
- power_supply.give(5000)
+ power_supply.give(500)
to_chat(user, "You insert [A] in [src], recharging it.")
else
..()
@@ -308,12 +308,10 @@
desc = "A gun that changes the body temperature of its targets."
var/temperature = 300
var/target_temperature = 300
- var/e_cost = 1000
origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2"
ammo_type = list(/obj/item/ammo_casing/energy/temp)
selfcharge = 1
- cell_type = /obj/item/weapon/stock_parts/cell
var/powercost = ""
var/powercostcolor = ""
@@ -369,19 +367,19 @@
T.temp = temperature
switch(temperature)
if(0 to 100)
- T.e_cost = 3000
+ T.e_cost = 300
powercost = "High"
if(100 to 250)
- T.e_cost = 2000
+ T.e_cost = 200
powercost = "Medium"
if(251 to 300)
- T.e_cost = 1000
+ T.e_cost = 100
powercost = "Low"
if(301 to 400)
- T.e_cost = 2000
+ T.e_cost = 200
powercost = "Medium"
if(401 to 1000)
- T.e_cost = 3000
+ T.e_cost = 300
powercost = "High"
switch(powercost)
if("High")
@@ -471,16 +469,16 @@
/obj/item/weapon/gun/energy/temperature/proc/update_charge()
var/charge = power_supply.charge
switch(charge)
- if(9000 to INFINITY) overlays += "900"
- if(8000 to 9000) overlays += "800"
- if(7000 to 8000) overlays += "700"
- if(6000 to 7000) overlays += "600"
- if(5000 to 6000) overlays += "500"
- if(4000 to 5000) overlays += "400"
- if(3000 to 4000) overlays += "300"
- if(2000 to 3000) overlays += "200"
- if(1000 to 2002) overlays += "100"
- if(-INFINITY to 1000) overlays += "0"
+ if(900 to INFINITY) overlays += "900"
+ if(800 to 900) overlays += "800"
+ if(700 to 800) overlays += "700"
+ if(600 to 700) overlays += "600"
+ if(500 to 600) overlays += "500"
+ if(400 to 500) overlays += "400"
+ if(300 to 400) overlays += "300"
+ if(200 to 300) overlays += "200"
+ if(100 to 202) overlays += "100"
+ if(-INFINITY to 100) overlays += "0"
/obj/item/weapon/gun/energy/mimicgun
name = "mimic gun"
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index 9728a9442e1..ea92cb06449 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -5,23 +5,12 @@
item_state = null //so the human update icon uses the icon_state instead.
ammo_type = list(/obj/item/ammo_casing/energy/electrode)
ammo_x_offset = 3
- cell_type = /obj/item/weapon/stock_parts/cell/crap
/obj/item/weapon/gun/energy/taser/mounted
name = "mounted taser gun"
selfcharge = 1
use_external_power = 1
-/obj/item/weapon/gun/energy/taser/cyborg
- name = "taser gun"
- desc = "A small, low capacity gun used for non-lethal takedowns."
- icon_state = "taser"
- cell_type = /obj/item/weapon/stock_parts/cell/secborg
-
-/obj/item/weapon/gun/energy/disabler/cyborg/newshot()
- ..()
- robocharge()
-
/obj/item/weapon/gun/energy/shock_revolver
name = "tesla revolver"
desc = "A high-tech revolver that fires internal, reusable shock cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers."
diff --git a/code/modules/projectiles/guns/energy/telegun.dm b/code/modules/projectiles/guns/energy/telegun.dm
index 7b94698f0e9..2e66b00643f 100644
--- a/code/modules/projectiles/guns/energy/telegun.dm
+++ b/code/modules/projectiles/guns/energy/telegun.dm
@@ -6,7 +6,6 @@
icon_state = "telegun"
item_state = "ionrifle"
origin_tech = "combat=6;materials=7;powerstorage=5;bluespace=5;syndicate=4"
- cell_type = /obj/item/weapon/stock_parts/cell/crap
ammo_type = list(/obj/item/ammo_casing/energy/teleport)
shaded_charge = 1
var/teleport_target = null
diff --git a/code/modules/projectiles/guns/throw.dm b/code/modules/projectiles/guns/throw.dm
index d1bcda59067..7b1fa350fc7 100644
--- a/code/modules/projectiles/guns/throw.dm
+++ b/code/modules/projectiles/guns/throw.dm
@@ -36,8 +36,7 @@
notify_ammo_count(user)
/obj/item/weapon/gun/throw/Destroy()
- qdel(to_launch)
- to_launch = null
+ QDEL_NULL(to_launch)
for(var/atom/A in loaded_projectiles)
qdel(A)
loaded_projectiles = null
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index 0e8fee1926c..2714b8d1b16 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -93,9 +93,7 @@
return
/obj/machinery/reagentgrinder/Destroy()
- if(beaker)
- qdel(beaker)
- beaker = null
+ QDEL_NULL(beaker)
return ..()
/obj/machinery/reagentgrinder/ex_act(severity)
diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm
index 286af5d4863..70d2a9f76c0 100644
--- a/code/modules/reagents/chemistry/reagents/water.dm
+++ b/code/modules/reagents/chemistry/reagents/water.dm
@@ -48,8 +48,7 @@
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
- if(!cube.wrapped)
- cube.Expand()
+ cube.Expand()
// Dehydrated carp
if(istype(O, /obj/item/toy/carpplushie/dehy_carp))
var/obj/item/toy/carpplushie/dehy_carp/dehy = O
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index f050f6708e7..11abc89a343 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -78,9 +78,7 @@
var/accepts_rig = 1
/obj/structure/reagent_dispensers/fueltank/Destroy()
- if(rig)
- qdel(rig)
- rig = null
+ QDEL_NULL(rig)
return ..()
/obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/P)
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index c242759ed3c..961edb70450 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -500,7 +500,7 @@
var/hasmob = 0 //If it contains a mob
Destroy()
- qdel(gas)
+ QDEL_NULL(gas)
active = 0
return ..()
@@ -1146,11 +1146,11 @@
update()
return
-
+
/obj/structure/disposalpipe/trunk/Destroy()
if(istype(linked, /obj/structure/disposaloutlet))
var/obj/structure/disposaloutlet/O = linked
- O.expel()
+ O.expel(animation = 0)
else if(istype(linked, /obj/machinery/disposal))
var/obj/machinery/disposal/D = linked
if(D.trunk == src)
@@ -1207,7 +1207,7 @@
playsound(loc, W.usesound, 100, 1)
to_chat(user, "Slicing the disposal pipe.")
if(do_after(user, 30 * W.toolspeed, target = src))
- if(!W.isOn())
+ if(!W.isOn())
return
welded()
else
@@ -1290,12 +1290,13 @@
// expel the contents of the holder object, then delete it
// called when the holder exits the outlet
- proc/expel(var/obj/structure/disposalholder/H)
+ proc/expel(var/obj/structure/disposalholder/H, animation = 1)
- flick("outlet-open", src)
- playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0)
- sleep(20) //wait until correct animation frame
- playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
+ if(animation)
+ flick("outlet-open", src)
+ playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0)
+ sleep(20) //wait until correct animation frame
+ playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
if(H)
for(var/atom/movable/AM in H)
@@ -1308,7 +1309,6 @@
H.vent_gas(src.loc)
qdel(H)
- return
attackby(var/obj/item/I, var/mob/user, params)
if(!I || !user)
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index 104036d5c0a..a8d3902e6f3 100755
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -429,7 +429,5 @@
desc += " The package is not sealed."
/obj/item/shippingPackage/Destroy()
- if(wrapped)
- qdel(wrapped)
- wrapped = null
+ QDEL_NULL(wrapped)
return ..()
\ No newline at end of file
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 280fea0b66c..29370cbc04b 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -608,6 +608,14 @@
build_path = /obj/item/weapon/rcd
category = list("hacked", "Construction")
+/datum/design/rcl
+ name = "Rapid Cable Layer"
+ id = "rcl"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 5000)
+ build_path = /obj/item/weapon/twohanded/rcl
+ category = list("hacked", "Construction")
+
/datum/design/electropack
name = "Electropack"
id = "electropack"
diff --git a/code/modules/research/designs/equipment_designs.dm b/code/modules/research/designs/equipment_designs.dm
index e63211dc35b..9792f007c55 100644
--- a/code/modules/research/designs/equipment_designs.dm
+++ b/code/modules/research/designs/equipment_designs.dm
@@ -190,7 +190,7 @@
materials = list("$metal" = 200, "$glass" = 200, "$uranium" = 1000, "$plasma" = 200)
build_path = /obj/item/clothing/glasses/hud/hydroponic/night
category = list("Equipment")
-
+
/datum/design/handdrill
name = "Hand Drill"
desc = "A small electric hand drill with an interchangable screwdriver and bolt bit"
@@ -210,7 +210,7 @@
build_type = PROTOLATHE
materials = list(MAT_METAL = 4500, MAT_SILVER = 2500, MAT_DIAMOND = 1000)
category = list("Equipment")
-
+
/datum/design/alienwrench
name = "Alien Wrench"
desc = "An advanced wrench obtained through Abductor technology."
diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm
index 15e2fb66056..4b00be0b932 100644
--- a/code/modules/research/designs/mecha_designs.dm
+++ b/code/modules/research/designs/mecha_designs.dm
@@ -167,32 +167,32 @@
build_path = /obj/item/weapon/circuitboard/mecha/honker/targeting
category = list("Exosuit Modules")
-/datum/design/recitence_main
- name = "Exosuit Module (\"Recitence\" Central Control module)"
- desc = "Allows for the construction of a \"Recitence\" Central Control module."
- id = "recitence_main"
+/datum/design/reticence_main
+ name = "Exosuit Module (\"Reticence\" Central Control module)"
+ desc = "Allows for the construction of a \"Reticence\" Central Control module."
+ id = "reticence_main"
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/mecha/recitence/main
+ build_path = /obj/item/weapon/circuitboard/mecha/reticence/main
category = list("Exosuit Modules")
-/datum/design/recitence_peri
- name = "Exosuit Module (\"Recitence\" Peripherals Control module)"
- desc = "Allows for the construction of a \"Recitence\" Peripheral Control module."
- id = "recitence_peri"
+/datum/design/reticence_peri
+ name = "Exosuit Module (\"Reticence\" Peripherals Control module)"
+ desc = "Allows for the construction of a \"Reticence\" Peripheral Control module."
+ id = "reticence_peri"
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/mecha/recitence/peripherals
+ build_path = /obj/item/weapon/circuitboard/mecha/reticence/peripherals
category = list("Exosuit Modules")
-/datum/design/recitence_targ
- name = "Exosuit Module (\"Recitence\" Weapons & Targeting Control module)"
- desc = "Allows for the construction of a \"Recitence\" Weapons & Targeting Control module."
- id = "recitence_targ"
+/datum/design/reticence_targ
+ name = "Exosuit Module (\"Reticence\" Weapons & Targeting Control module)"
+ desc = "Allows for the construction of a \"Reticence\" Weapons & Targeting Control module."
+ id = "reticence_targ"
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/mecha/recitence/targeting
+ build_path = /obj/item/weapon/circuitboard/mecha/reticence/targeting
category = list("Exosuit Modules")
\ No newline at end of file
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index 779a0809577..876a4352fe9 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -459,69 +459,69 @@
construction_time = 200
category = list("H.O.N.K")
-//Recitence
-/datum/design/recitence_chassis
- name = "Exosuit Chassis (\"Recitence\")"
- id = "recitence_chassis"
+//Reticence
+/datum/design/reticence_chassis
+ name = "Exosuit Chassis (\"Reticence\")"
+ id = "reticence_chassis"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/chassis/recitence
+ build_path = /obj/item/mecha_parts/chassis/reticence
materials = list(MAT_METAL=20000)
construction_time = 100
- category = list("Recitence")
+ category = list("Reticence")
-/datum/design/recitence_torso
- name = "Exosuit Torso (\"Recitence\")"
- id = "recitence_torso"
+/datum/design/reticence_torso
+ name = "Exosuit Torso (\"Reticence\")"
+ id = "reticence_torso"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/recitence_torso
+ build_path = /obj/item/mecha_parts/part/reticence_torso
materials = list(MAT_METAL=20000,MAT_GLASS=10000,MAT_TRANQUILLITE=10000)
construction_time = 300
- category = list("Recitence")
+ category = list("Reticence")
-/datum/design/recitence_head
- name = "Exosuit Head (\"Recitence\")"
- id = "recitence_head"
+/datum/design/reticence_head
+ name = "Exosuit Head (\"Reticence\")"
+ id = "reticence_head"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/recitence_head
+ build_path = /obj/item/mecha_parts/part/reticence_head
materials = list(MAT_METAL=10000,MAT_GLASS=5000,MAT_TRANQUILLITE=5000)
construction_time = 200
- category = list("Recitence")
+ category = list("Reticence")
-/datum/design/recitence_left_arm
- name = "Exosuit Left Arm (\"Recitence\")"
- id = "recitence_left_arm"
+/datum/design/reticence_left_arm
+ name = "Exosuit Left Arm (\"Reticence\")"
+ id = "reticence_left_arm"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/recitence_left_arm
+ build_path = /obj/item/mecha_parts/part/reticence_left_arm
materials = list(MAT_METAL=15000,MAT_TRANQUILLITE=5000)
construction_time = 200
- category = list("Recitence")
+ category = list("Reticence")
-/datum/design/recitence_right_arm
- name = "Exosuit Right Arm (\"Recitence\")"
- id = "recitence_right_arm"
+/datum/design/reticence_right_arm
+ name = "Exosuit Right Arm (\"Reticence\")"
+ id = "reticence_right_arm"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/recitence_right_arm
+ build_path = /obj/item/mecha_parts/part/reticence_right_arm
materials = list(MAT_METAL=15000,MAT_TRANQUILLITE=5000)
construction_time = 200
- category = list("Recitence")
+ category = list("Reticence")
-/datum/design/recitence_left_leg
- name = "Exosuit Left Leg (\"Recitence\")"
- id = "recitence_left_leg"
+/datum/design/reticence_left_leg
+ name = "Exosuit Left Leg (\"Reticence\")"
+ id = "reticence_left_leg"
build_type = MECHFAB
- build_path =/obj/item/mecha_parts/part/recitence_left_leg
+ build_path =/obj/item/mecha_parts/part/reticence_left_leg
materials = list(MAT_METAL=20000,MAT_TRANQUILLITE=5000)
construction_time = 200
- category = list("Recitence")
+ category = list("Reticence")
-/datum/design/recitence_right_leg
- name = "Exosuit Right Leg (\"Recitence\")"
- id = "recitence_right_leg"
+/datum/design/reticence_right_leg
+ name = "Exosuit Right Leg (\"Reticence\")"
+ id = "reticence_right_leg"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/part/recitence_right_leg
+ build_path = /obj/item/mecha_parts/part/reticence_right_leg
materials = list(MAT_METAL=20000,MAT_TRANQUILLITE=5000)
construction_time = 200
- category = list("Recitence")
+ category = list("Reticence")
//Phazon
/datum/design/phazon_chassis
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index 2084e2a93c4..20093e7771b 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -62,8 +62,7 @@ Note: Must be placed west/left of and R&D console to function.
reagents.my_atom = src
/obj/machinery/r_n_d/protolathe/Destroy()
- qdel(materials)
- materials = null
+ QDEL_NULL(materials)
return ..()
/obj/machinery/r_n_d/protolathe/RefreshParts()
diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm
index 9e0e26a0252..40f20ea4dde 100644
--- a/code/modules/research/xenobiology/xenobio_camera.dm
+++ b/code/modules/research/xenobiology/xenobio_camera.dm
@@ -77,11 +77,11 @@
else if(istype(O, /obj/item/weapon/storage/bag))
var/obj/item/weapon/storage/P = O
var/loaded = 0
- for(var/obj/G in P.contents)
- if(istype(G, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
- loaded = 1
- monkeys++
- qdel(G)
+ for(var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/MC in P.contents)
+ loaded = 1
+ monkeys++
+ P.remove_from_storage(MC)
+ qdel(MC)
if(loaded)
to_chat(user, "You fill [src] with the monkey cubes stored in [O]. [src] now has [monkeys] monkey cubes stored.")
return
diff --git a/code/modules/spacepods/construction.dm b/code/modules/spacepods/construction.dm
index 0426b940d0b..a997a23f585 100644
--- a/code/modules/spacepods/construction.dm
+++ b/code/modules/spacepods/construction.dm
@@ -19,6 +19,10 @@
dir = EAST
+/obj/structure/spacepod_frame/Destroy()
+ QDEL_NULL(construct)
+ return ..()
+
/obj/structure/spacepod_frame/attackby(obj/item/W as obj, mob/user as mob, params)
if(!construct || !construct.action(W, user))
..()
diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm
index 0f7373c2d19..0881c821431 100644
--- a/code/modules/spacepods/spacepod.dm
+++ b/code/modules/spacepods/spacepod.dm
@@ -124,22 +124,14 @@
/obj/spacepod/Destroy()
if(equipment_system.cargo_system)
equipment_system.cargo_system.removed(null)
- qdel(equipment_system)
- equipment_system = null
- qdel(cargo_hold)
- cargo_hold = null
- qdel(battery)
- battery = null
- qdel(cabin_air)
- cabin_air = null
- qdel(internal_tank)
- internal_tank = null
- qdel(pr_int_temp_processor)
- pr_int_temp_processor = null
- qdel(pr_give_air)
- pr_give_air = null
- qdel(ion_trail)
- ion_trail = null
+ QDEL_NULL(equipment_system)
+ QDEL_NULL(cargo_hold)
+ QDEL_NULL(battery)
+ QDEL_NULL(cabin_air)
+ QDEL_NULL(internal_tank)
+ QDEL_NULL(pr_int_temp_processor)
+ QDEL_NULL(pr_give_air)
+ QDEL_NULL(ion_trail)
occupant_sanity_check()
if(pilot)
pilot.forceMove(get_turf(src))
@@ -275,7 +267,7 @@
cargo_hold.emp_act(severity)
if(battery && battery.charge > 0)
- battery.use((battery.charge / 2) / severity)
+ battery.use((battery.charge/3)/(severity*2))
deal_damage(80 / severity)
if(empcounter < (40 / severity))
empcounter = 40 / severity
diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm
index b3bb3f61e07..44d7a7f1315 100644
--- a/code/modules/surgery/organs/subtypes/machine.dm
+++ b/code/modules/surgery/organs/subtypes/machine.dm
@@ -150,8 +150,7 @@
var/obj/item/device/mmi/stored_mmi
/obj/item/organ/internal/brain/mmi_holder/Destroy()
- if(stored_mmi)
- qdel(stored_mmi)
+ QDEL_NULL(stored_mmi)
return ..()
/obj/item/organ/internal/brain/mmi_holder/insert(var/mob/living/target,special = 0)
diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm
index ed330821f06..f8a177e413d 100644
--- a/code/modules/telesci/telepad.dm
+++ b/code/modules/telesci/telepad.dm
@@ -128,7 +128,7 @@
var/rand_y = 0
var/emagged = 0
var/teleporting = 0
- var/chargecost = 1500
+ var/chargecost = 1000
/obj/item/weapon/rcs/New()
..()
@@ -140,9 +140,7 @@
to_chat(user, "There are [round(rcell.charge/chargecost)] charge\s left.")
/obj/item/weapon/rcs/Destroy()
- if(rcell)
- qdel(rcell)
- rcell = null
+ QDEL_NULL(rcell)
return ..()
/obj/item/weapon/rcs/attack_self(mob/user)
diff --git a/config/example/custom_sprites.txt b/config/example/custom_sprites.txt
index db3930a4ae2..471764270d4 100644
--- a/config/example/custom_sprites.txt
+++ b/config/example/custom_sprites.txt
@@ -1 +1,5 @@
-ckey-state
\ No newline at end of file
+Each entry should be composed of 2 parts, divided by a colon (:) with no spaces, in order to work. Failure to do so will result in that entry being disregarded by the code.
+- The first part should be either "cyborg", "ai", "hologram", "pai", or "drone". This tells the code what type of custom sprite this entry is for. The "ai" option is for AI core displays, while "hologram" is for AI hologram projections.
+- The second part should be the ckey of the player this entry is for. This tells the code who it works for and also is used to retrieve the proper sprite for them to use.
+
+example:example
\ No newline at end of file
diff --git a/html/changelog.html b/html/changelog.html
index 47986c6290d..2c6921bdff1 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,108 @@
-->
+
11 April 2017
+
FalseIncarnate updated:
+
+ - Damage done to the shuttle engines by a shadowling's "Extend Shuttle" ability now prevent the shuttle from being recalled to CentComm.
+
+
+
09 April 2017
+
Fox McCloud updated:
+
+ - abductor glands now act as actual hearts; removing them induces heart failure
+ - plasma gland no longer gibs you, but makes you vomit plasma instead
+ - bodysnatcher gland no longer gibs you, but will deal brute damage instead
+ - bloody gland will now drain blood instead of dealing brute damage
+ - species change gland will now change your species until the gland is removed
+ - adjusted the origin tech on a few gland
+ - heart attacks will once again paralyse you and do slightly more brute damage
+ - body snatch clones look more like their originator
+ - Abductors can no longer use guns (minus their own alien energy gun)
+ - Sending someone with an abductor teleport via the console will stun them for 3 cycles (doesn't apply with the advanced camera console)
+ - Abductors can now purchase additional abductor vests
+ - Abductors can lock/unlock vests
+ - Purchasing supplies from the abductor console will no longer increase the amount of experiments you must do
+ - Wonderprods will not induce sleep in those who are stunned OR sleeping
+ - altered the origin tech of abductor tools
+ - Can make abductor surgery tables from regular tables by adding silver sheets to an abductor table frame
+ - Added a bunch more abductee objectives
+ - abductors no long scream like girls
+ - High capacity cells have 10,000 charge instead of 15,000
+ - Mech equipment power costs minorly adjusted
+ - APCs charge a bit faster
+ - EMPs less effective against pods and mechs
+ - Fixes not being able to recharge modular laptops/tablets
+
+
Purpose2 updated:
+
+ - Welders must now been fueled and active to cut lattices.
+
+
+
06 April 2017
+
Fox McCloud updated:
+
+ - Fixes autopsy report printing; print reports by clicking the device itself
+
+
davipatury updated:
+
+ - Rapid Cable Layer now have an autolathe design.
+
+
+
05 April 2017
+
KasparoVy updated:
+
+ - Adds a Tajaran facial hair style.
+ - Adds a few new frill styles for Unathi.
+ - Adds some new horn styles for Unathi.
+ - Adds a couple new facial hair styles for Vulpkanin.
+ - Adds a few new hair styles for Vulpkanin.
+ - Updates Vulpkanin Adhara & Kajam hairstyles.
+
+
Purpose2 updated:
+
+ - Can now take photos of the Blueprints to count as a completed objective.
+ - Cryostorage console now stores the Null Rod & all variations.
+ - Mime mech is now 'Reticence' as it should be
+ - Fixes missing cult's Berserker Robe sprite.
+ - Cryostorage console no longer stores hundreds of bomber jackets, and now stores hardsuits
+ - Cryostorage console now catches and stores most unique objective items.
+ - Corrects some typos and grammar.
+ - You can now light cigarettes with Wands of Fireball, at the cost of your eyebrows.
+
+
Twinmold93 updated:
+
+ - Buying poison pen will actually give you the poison pen now.
+
+
+
04 April 2017
+
FalseIncarnate updated:
+
+ - Adds FullofSkittles's custom pAI sprites. Thanks FoS!
+ - Custom sprites for cyborgs, AI, AI holograms, and pAI units no longer are restricted to a single name. Get your money's worth by using that borg sprite regardless of your version number!
+
+
+
03 April 2017
+
Kyep updated:
+
+ - Ghosts manifested by cultists are no longer invincible, and an exploit allowing them to be made permanent has been fixed.
+
+
+
02 April 2017
+
KasparoVy updated:
+
+ - Nuclear Operatives/ERT Members/Abductors will no longer spawn in with genetic quirks.
+ - Thrown objects that cross a tile with non-full windows will no longer hit the window even if it isn't visually obstructing the path.
+ - Shooting guns (i.e. tasers) in the above circumstances means that the taser shots won't be blocked by windows that aren't visually obstructing the path.
+
+
Kyep updated:
+
+ - Adjusted Black Market Packers away mission. It now has some danger to it (carp), some more interesting stuff to find (syndi lab) and a challenge (fix the ship powergrid).
+ - Slight adjustment to word lists based on our rules.
+ - Removed thunderdome armor from centcom away mission.
+ - Cultists now get a new sacrifice target when the current one cryos.
+
+
31 March 2017
Krausus updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 0e0c0b1f0f6..54b7742ff91 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -4373,3 +4373,89 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
Kyep:
- rscadd: Access to jobs is now based solely on Playtime, NOT days since BYOND account
was registered.
+2017-04-02:
+ KasparoVy:
+ - bugfix: Nuclear Operatives/ERT Members/Abductors will no longer spawn in with
+ genetic quirks.
+ - bugfix: Thrown objects that cross a tile with non-full windows will no longer
+ hit the window even if it isn't visually obstructing the path.
+ - bugfix: Shooting guns (i.e. tasers) in the above circumstances means that the
+ taser shots won't be blocked by windows that aren't visually obstructing the
+ path.
+ Kyep:
+ - tweak: Adjusted Black Market Packers away mission. It now has some danger to it
+ (carp), some more interesting stuff to find (syndi lab) and a challenge (fix
+ the ship powergrid).
+ - tweak: Slight adjustment to word lists based on our rules.
+ - tweak: Removed thunderdome armor from centcom away mission.
+ - bugfix: Cultists now get a new sacrifice target when the current one cryos.
+2017-04-03:
+ Kyep:
+ - bugfix: Ghosts manifested by cultists are no longer invincible, and an exploit
+ allowing them to be made permanent has been fixed.
+2017-04-04:
+ FalseIncarnate:
+ - rscadd: Adds FullofSkittles's custom pAI sprites. Thanks FoS!
+ - tweak: Custom sprites for cyborgs, AI, AI holograms, and pAI units no longer are
+ restricted to a single name. Get your money's worth by using that borg sprite
+ regardless of your version number!
+2017-04-05:
+ KasparoVy:
+ - rscadd: Adds a Tajaran facial hair style.
+ - rscadd: Adds a few new frill styles for Unathi.
+ - rscadd: Adds some new horn styles for Unathi.
+ - rscadd: Adds a couple new facial hair styles for Vulpkanin.
+ - rscadd: Adds a few new hair styles for Vulpkanin.
+ - tweak: Updates Vulpkanin Adhara & Kajam hairstyles.
+ Purpose2:
+ - rscadd: Can now take photos of the Blueprints to count as a completed objective.
+ - rscadd: Cryostorage console now stores the Null Rod & all variations.
+ - bugfix: Mime mech is now 'Reticence' as it should be
+ - bugfix: Fixes missing cult's Berserker Robe sprite.
+ - tweak: Cryostorage console no longer stores hundreds of bomber jackets, and now
+ stores hardsuits
+ - tweak: Cryostorage console now catches and stores most unique objective items.
+ - tweak: Corrects some typos and grammar.
+ - rscadd: You can now light cigarettes with Wands of Fireball, at the cost of your
+ eyebrows.
+ Twinmold93:
+ - bugfix: Buying poison pen will actually give you the poison pen now.
+2017-04-06:
+ Fox McCloud:
+ - bugfix: Fixes autopsy report printing; print reports by clicking the device itself
+ davipatury:
+ - rscadd: Rapid Cable Layer now have an autolathe design.
+2017-04-09:
+ Fox McCloud:
+ - tweak: abductor glands now act as actual hearts; removing them induces heart failure
+ - tweak: plasma gland no longer gibs you, but makes you vomit plasma instead
+ - tweak: bodysnatcher gland no longer gibs you, but will deal brute damage instead
+ - tweak: bloody gland will now drain blood instead of dealing brute damage
+ - tweak: species change gland will now change your species until the gland is removed
+ - tweak: adjusted the origin tech on a few gland
+ - tweak: heart attacks will once again paralyse you and do slightly more brute damage
+ - bugfix: body snatch clones look more like their originator
+ - tweak: Abductors can no longer use guns (minus their own alien energy gun)
+ - tweak: Sending someone with an abductor teleport via the console will stun them
+ for 3 cycles (doesn't apply with the advanced camera console)
+ - rscadd: Abductors can now purchase additional abductor vests
+ - rscadd: Abductors can lock/unlock vests
+ - tweak: Purchasing supplies from the abductor console will no longer increase the
+ amount of experiments you must do
+ - tweak: Wonderprods will not induce sleep in those who are stunned OR sleeping
+ - tweak: altered the origin tech of abductor tools
+ - rscadd: Can make abductor surgery tables from regular tables by adding silver
+ sheets to an abductor table frame
+ - rscadd: Added a bunch more abductee objectives
+ - tweak: abductors no long scream like girls
+ - tweak: High capacity cells have 10,000 charge instead of 15,000
+ - tweak: Mech equipment power costs minorly adjusted
+ - tweak: APCs charge a bit faster
+ - tweak: EMPs less effective against pods and mechs
+ - bugfix: Fixes not being able to recharge modular laptops/tablets
+ Purpose2:
+ - bugfix: Welders must now been fueled and active to cut lattices.
+2017-04-11:
+ FalseIncarnate:
+ - tweak: Damage done to the shuttle engines by a shadowling's "Extend Shuttle" ability
+ now prevent the shuttle from being recalled to CentComm.
diff --git a/html/changelogs/AutoChangeLog-pr-7003.yml b/html/changelogs/AutoChangeLog-pr-7003.yml
deleted file mode 100644
index ded600af9bd..00000000000
--- a/html/changelogs/AutoChangeLog-pr-7003.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "KasparoVy"
-delete-after: True
-changes:
- - bugfix: "Nuclear Operatives/ERT Members/Abductors will no longer spawn in with genetic quirks."
diff --git a/html/changelogs/AutoChangeLog-pr-7005.yml b/html/changelogs/AutoChangeLog-pr-7005.yml
deleted file mode 100644
index d7f6ac1e035..00000000000
--- a/html/changelogs/AutoChangeLog-pr-7005.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Kyep"
-delete-after: True
-changes:
- - tweak: "Slight adjustment to word lists based on our rules."
diff --git a/html/changelogs/AutoChangeLog-pr-7006.yml b/html/changelogs/AutoChangeLog-pr-7006.yml
deleted file mode 100644
index 4ffeca814ec..00000000000
--- a/html/changelogs/AutoChangeLog-pr-7006.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "KasparoVy"
-delete-after: True
-changes:
- - bugfix: "Thrown objects that cross a tile with non-full windows will no longer hit the window even if it isn't visually obstructing the path."
- - bugfix: "Shooting guns (i.e. tasers) in the above circumstances means that the taser shots won't be blocked by windows that aren't visually obstructing the path."
diff --git a/icons/mecha/mech_construct.dmi b/icons/mecha/mech_construct.dmi
index 8d97261c9bb..10a6d9b86fd 100644
Binary files a/icons/mecha/mech_construct.dmi and b/icons/mecha/mech_construct.dmi differ
diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi
index 8d635c2c2df..5400c933c7f 100644
Binary files a/icons/mob/body_accessory.dmi and b/icons/mob/body_accessory.dmi differ
diff --git a/icons/mob/custom-synthetic.dmi b/icons/mob/custom-synthetic.dmi
deleted file mode 100644
index 0434efd900f..00000000000
Binary files a/icons/mob/custom-synthetic.dmi and /dev/null differ
diff --git a/icons/mob/custom_synthetic/custom-synthetic.dmi b/icons/mob/custom_synthetic/custom-synthetic.dmi
new file mode 100644
index 00000000000..29917049c85
Binary files /dev/null and b/icons/mob/custom_synthetic/custom-synthetic.dmi differ
diff --git a/icons/mob/custom-synthetic64.dmi b/icons/mob/custom_synthetic/custom-synthetic64.dmi
similarity index 100%
rename from icons/mob/custom-synthetic64.dmi
rename to icons/mob/custom_synthetic/custom-synthetic64.dmi
diff --git a/icons/mob/custom_synthetic/custom_head.dmi b/icons/mob/custom_synthetic/custom_head.dmi
new file mode 100644
index 00000000000..76ffcedcc82
Binary files /dev/null and b/icons/mob/custom_synthetic/custom_head.dmi differ
diff --git a/icons/mob/custom_synthetic/custom_lefthand.dmi b/icons/mob/custom_synthetic/custom_lefthand.dmi
new file mode 100644
index 00000000000..8d469195434
Binary files /dev/null and b/icons/mob/custom_synthetic/custom_lefthand.dmi differ
diff --git a/icons/mob/custom_synthetic/custom_righthand.dmi b/icons/mob/custom_synthetic/custom_righthand.dmi
new file mode 100644
index 00000000000..8d469195434
Binary files /dev/null and b/icons/mob/custom_synthetic/custom_righthand.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 929e490f63a..a3233b8bac5 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 2f99bc4828b..4959f0ebb53 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/inhands/fluff_lefthand.dmi b/icons/mob/inhands/fluff_lefthand.dmi
new file mode 100644
index 00000000000..8e3ccdbfbff
Binary files /dev/null and b/icons/mob/inhands/fluff_lefthand.dmi differ
diff --git a/icons/mob/inhands/fluff_righthand.dmi b/icons/mob/inhands/fluff_righthand.dmi
new file mode 100644
index 00000000000..21dc49c50ea
Binary files /dev/null and b/icons/mob/inhands/fluff_righthand.dmi differ
diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi
index ec4bb9e314e..e52c0e5b9f4 100644
Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ
diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi
index 5977cd3cb66..e9de23533ed 100644
Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ
diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi
index 72084b5675b..fd89b23d19d 100755
Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ
diff --git a/paradise.dme b/paradise.dme
index b87c0b16ab0..431b0f954ed 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -66,6 +66,7 @@
#include "code\__HELPERS\matrices.dm"
#include "code\__HELPERS\mobs.dm"
#include "code\__HELPERS\names.dm"
+#include "code\__HELPERS\qdel.dm"
#include "code\__HELPERS\sanitize_values.dm"
#include "code\__HELPERS\text.dm"
#include "code\__HELPERS\time.dm"
@@ -643,7 +644,7 @@
#include "code\game\mecha\combat\honker.dm"
#include "code\game\mecha\combat\marauder.dm"
#include "code\game\mecha\combat\phazon.dm"
-#include "code\game\mecha\combat\recitence.dm"
+#include "code\game\mecha\combat\reticence.dm"
#include "code\game\mecha\equipment\mecha_equipment.dm"
#include "code\game\mecha\equipment\tools\medical_tools.dm"
#include "code\game\mecha\equipment\tools\mining_tools.dm"
@@ -693,6 +694,7 @@
#include "code\game\objects\effects\spawners\gibspawner.dm"
#include "code\game\objects\effects\spawners\lootdrop.dm"
#include "code\game\objects\effects\spawners\random_barrier.dm"
+#include "code\game\objects\effects\spawners\random_spawners.dm"
#include "code\game\objects\effects\spawners\vaultspawner.dm"
#include "code\game\objects\effects\spawners\windowspawner.dm"
#include "code\game\objects\items\ashtray.dm"
@@ -724,7 +726,6 @@
#include "code\game\objects\items\devices\laserpointer.dm"
#include "code\game\objects\items\devices\lightreplacer.dm"
#include "code\game\objects\items\devices\megaphone.dm"
-#include "code\game\objects\items\devices\modkit.dm"
#include "code\game\objects\items\devices\multitool.dm"
#include "code\game\objects\items\devices\paicard.dm"
#include "code\game\objects\items\devices\pipe_painter.dm"
@@ -846,6 +847,7 @@
#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm"
#include "code\game\objects\items\weapons\grenades\syndieminibomb.dm"
#include "code\game\objects\items\weapons\implants\implant.dm"
+#include "code\game\objects\items\weapons\implants\implant_abductor.dm"
#include "code\game\objects\items\weapons\implants\implant_chem.dm"
#include "code\game\objects\items\weapons\implants\implant_death_alarm.dm"
#include "code\game\objects\items\weapons\implants\implant_explosive.dm"
diff --git a/sound/effects/Kidanclack.ogg b/sound/effects/Kidanclack.ogg
new file mode 100644
index 00000000000..a25cf3efab7
Binary files /dev/null and b/sound/effects/Kidanclack.ogg differ
diff --git a/sound/effects/kidanclack2.ogg b/sound/effects/kidanclack2.ogg
new file mode 100644
index 00000000000..de2d625bc13
Binary files /dev/null and b/sound/effects/kidanclack2.ogg differ