diff --git a/_maps/map_files/Cerestation/cerestation.dmm b/_maps/map_files/Cerestation/cerestation.dmm
index 0bcbf8da32a..0df3264dcee 100644
--- a/_maps/map_files/Cerestation/cerestation.dmm
+++ b/_maps/map_files/Cerestation/cerestation.dmm
@@ -1,5 +1,4 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-//Model dictionary trimmed on: 12-05-2017 18:47 (UTC)
"aaa" = (
/turf/open/space,
/area/space)
@@ -46766,6 +46765,7 @@
})
"bCK" = (
/obj/effect/turf_decal/stripes/asteroid/line,
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
/turf/open/floor/plating/astplate{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -46773,7 +46773,6 @@
name = "Central Asteroid Maintenance"
})
"bCL" = (
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
/obj/structure/rack,
/turf/open/floor/plating/astplate{
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -47412,18 +47411,22 @@
density = 0;
layer = 4
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6
+ },
/turf/closed/wall/r_wall{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
"bDX" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
/obj/machinery/door/airlock/maintenance{
name = "Atmospehrics Maintenance";
req_access_txt = "12;24"
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -47977,6 +47980,7 @@
/area/hydroponics)
"bEY" = (
/obj/effect/turf_decal/delivery,
+/obj/machinery/portable_atmospherics/canister/air,
/turf/open/floor/plasteel/vault{
baseturf = /turf/open/floor/plating/asteroid/airless;
dir = 5
@@ -48011,21 +48015,26 @@
icon_state = "tube1";
dir = 8
},
+/obj/item/weapon/twohanded/required/kirbyplants{
+ tag = "icon-plant-21";
+ icon_state = "plant-21"
+ },
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
"bFd" = (
/obj/structure/closet/firecloset/full,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
"bFe" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -48036,7 +48045,6 @@
/obj/item/stack/rods{
amount = 50
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -48063,6 +48071,11 @@
/obj/structure/table,
/obj/item/weapon/grenade/chem_grenade/metalfoam,
/obj/item/weapon/grenade/chem_grenade/metalfoam,
+/obj/machinery/airalarm{
+ frequency = 1439;
+ locked = 0;
+ pixel_y = 23
+ },
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -49042,6 +49055,10 @@
icon_state = "1-2";
pixel_y = 0
},
+/obj/machinery/atmospherics/components/unary/vent_pump{
+ dir = 4;
+ on = 1
+ },
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -49051,6 +49068,10 @@
dir = 4
},
/obj/effect/landmark/start/atmospheric_technician,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ icon_state = "intact";
+ dir = 8
+ },
/turf/open/floor/plasteel/yellow/side{
tag = "icon-yellow (EAST)";
icon_state = "yellow";
@@ -49065,13 +49086,22 @@
id = "atmodesk"
},
/obj/machinery/door/window/eastright{
+ name = "Atmospherics Desk";
req_access_txt = "24"
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ icon_state = "intact";
+ dir = 8
+ },
/turf/open/floor/plasteel/yellow{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
"bGU" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ icon_state = "intact";
+ dir = 8
+ },
/turf/open/floor/plasteel/yellow/side{
tag = "icon-yellow (WEST)";
icon_state = "yellow";
@@ -49091,13 +49121,11 @@
icon_state = "1-2";
pixel_y = 0
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
/obj/structure/disposalpipe/segment{
dir = 4;
icon_state = "pipe-c"
},
+/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -50714,6 +50742,7 @@
icon_state = "camera";
network = list("SS13","CE")
},
+/obj/machinery/portable_atmospherics/scrubber,
/turf/open/floor/plasteel/vault{
baseturf = /turf/open/floor/plating/asteroid/airless;
dir = 5
@@ -50744,16 +50773,19 @@
},
/area/atmos)
"bJM" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 5
+/obj/machinery/atmospherics/components/unary/vent_scrubber{
+ dir = 4;
+ on = 1;
+ scrub_N2O = 0;
+ scrub_Toxins = 0
},
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
"bJN" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 10
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
@@ -51249,31 +51281,30 @@
name = "Lounge"
})
"bKF" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = -24
- },
-/turf/open/floor/plasteel/yellow/side{
- baseturf = /turf/open/floor/plating/asteroid/airless
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/visible,
+/obj/machinery/meter,
+/turf/open/floor/plasteel/yellow/corner{
+ dir = 8
},
/area/atmos)
"bKG" = (
-/obj/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ icon_state = "intact";
dir = 8
},
-/turf/open/floor/plasteel/yellow/side{
+/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
"bKH" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+/obj/effect/landmark/lightsout,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 10;
icon_state = "intact";
- dir = 10
+ tag = "icon-intact (SOUTHEAST)"
},
-/turf/open/floor/plasteel/yellow/corner{
- tag = "icon-yellowcorner (WEST)";
- icon_state = "yellowcorner";
- dir = 8;
+/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
@@ -51306,6 +51337,8 @@
icon_state = "camera";
network = list("SS13","CE")
},
+/obj/structure/closet/secure_closet/atmospherics,
+/obj/item/weapon/pickaxe/mini,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -51964,7 +51997,11 @@
},
/area/atmos)
"bLV" = (
-/obj/machinery/pipedispenser/disposal/transit_tube,
+/obj/machinery/door/window/eastright{
+ dir = 1;
+ name = "Interior Pipe Access";
+ req_access_txt = "24"
+ },
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -51975,16 +52012,14 @@
},
/area/atmos)
"bLX" = (
-/obj/structure/window/reinforced{
- dir = 4
- },
/obj/machinery/atmospherics/components/binary/pump{
- dir = 2;
- name = "Waste To Filter";
- on = 1
+ dir = 1;
+ name = "Mix To Engine";
+ on = 0;
+ target_pressure = 101
},
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/asteroid/airless
+/turf/open/floor/plasteel/yellow/corner{
+ dir = 8
},
/area/atmos)
"bLY" = (
@@ -52015,6 +52050,8 @@
pixel_x = 30;
pixel_y = 0
},
+/obj/structure/closet/secure_closet/atmospherics,
+/obj/item/weapon/pickaxe/mini,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -53034,6 +53071,8 @@
dir = 4;
icon_state = "tube1"
},
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -53546,23 +53585,8 @@
/turf/open/floor/plating,
/area/atmos)
"bOv" = (
-/obj/machinery/computer/atmos_control/tank{
- frequency = 1441;
- input_tag = "n2_in";
- name = "Nitrogen Supply Control";
- output_tag = "n2_out";
- sensors = list("n2_sensor" = "Tank")
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/asteroid/airless
- },
-/area/atmos)
-"bOw" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- icon_state = "intact";
- dir = 5
- },
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
+/obj/machinery/meter,
/turf/open/floor/plasteel/yellow/side{
tag = "icon-yellow (WEST)";
icon_state = "yellow";
@@ -53570,17 +53594,31 @@
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
+"bOw" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 5
+ },
+/obj/machinery/meter,
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
"bOx" = (
-/obj/machinery/atmospherics/pipe/manifold/yellow/visible,
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 10;
+ pixel_x = 0;
+ initialize_directions = 10
+ },
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
"bOy" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
-/turf/open/floor/plasteel{
+/obj/machinery/atmospherics/pipe/simple/general/visible,
+/turf/open/floor/plasteel/yellow/side{
+ tag = "icon-yellow (WEST)";
+ icon_state = "yellow";
+ dir = 8;
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
@@ -53590,9 +53628,11 @@
d2 = 4;
icon_state = "1-4"
},
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
+/obj/structure/disposalpipe/segment{
+ dir = 1;
+ icon_state = "pipe-c"
},
+/obj/structure/chair/stool/bar,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -53603,9 +53643,12 @@
d2 = 8;
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/table,
+/obj/item/weapon/storage/fancy/cigarettes,
+/obj/item/weapon/lighter/greyscale,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -53616,14 +53659,15 @@
d2 = 8;
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
/obj/item/device/radio/intercom{
broadcasting = 0;
name = "Station Intercom (General)";
pixel_y = 20
},
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/chair/stool/bar,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -53634,13 +53678,12 @@
d2 = 8;
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- icon_state = "intact";
- dir = 10
- },
/obj/structure/sign/atmosplaque{
pixel_y = 32
},
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -53651,11 +53694,11 @@
d2 = 8;
icon_state = "1-8"
},
-/obj/machinery/atmospherics/pipe/simple/supply/visible,
/obj/structure/disposalpipe/segment{
- dir = 1;
+ dir = 8;
icon_state = "pipe-c"
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -54301,14 +54344,6 @@
},
/area/atmos)
"bPC" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/asteroid/airless
- },
-/area/atmos)
-"bPD" = (
/obj/machinery/atmospherics/pipe/simple/green/visible,
/obj/machinery/atmospherics/components/binary/pump{
dir = 4;
@@ -54316,9 +54351,19 @@
on = 1
},
/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/floor/plasteel/red,
+/area/atmos)
+"bPD" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
},
-/turf/open/floor/plasteel/black{
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
+/turf/open/floor/plasteel/yellow/side{
+ tag = "icon-yellow (WEST)";
+ icon_state = "yellow";
+ dir = 8;
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
@@ -54382,7 +54427,9 @@
},
/area/atmos)
"bPL" = (
-/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -54973,9 +55020,9 @@
/area/atmos)
"bQG" = (
/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- icon_state = "intact";
- dir = 10
+ dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/yellow/side{
tag = "icon-yellow (WEST)";
icon_state = "yellow";
@@ -54990,12 +55037,11 @@
},
/area/atmos)
"bQI" = (
-/obj/structure/closet/secure_closet/atmospherics,
-/obj/item/weapon/pickaxe/mini,
-/turf/open/floor/plasteel/yellow/side{
- tag = "icon-yellow (EAST)";
- icon_state = "yellow";
- dir = 4;
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "North Canister to Waste"
+ },
+/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
@@ -55008,13 +55054,11 @@
},
/area/atmos)
"bQK" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- tag = "icon-connector_map (EAST)";
- icon_state = "connector_map";
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/general/visible{
+ dir = 1
},
-/obj/machinery/portable_atmospherics/canister,
-/turf/open/floor/plasteel/delivery{
+/obj/machinery/meter,
+/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
@@ -55042,10 +55086,7 @@
/obj/structure/fireaxecabinet{
pixel_x = 32
},
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 1
- },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -55530,8 +55571,9 @@
},
/area/atmos)
"bRI" = (
-/obj/machinery/atmospherics/pipe/manifold4w/yellow/visible,
-/obj/machinery/meter,
+/obj/machinery/atmospherics/pipe/manifold/general/visible{
+ dir = 1
+ },
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -55548,22 +55590,17 @@
/obj/machinery/light{
dir = 1
},
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- tag = "icon-connector_map (EAST)";
- icon_state = "connector_map";
- dir = 4
- },
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
"bRL" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- tag = "icon-intact (WEST)";
- icon_state = "intact";
- dir = 8
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ tag = "icon-connector_map (EAST)";
+ icon_state = "connector_map";
+ dir = 4
},
+/obj/machinery/portable_atmospherics/pump,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -55574,6 +55611,7 @@
icon_state = "intact";
dir = 8
},
+/obj/machinery/meter,
/turf/open/floor/plasteel/yellow/side{
tag = "icon-yellow (EAST)";
icon_state = "yellow";
@@ -55595,6 +55633,7 @@
/area/atmos)
"bRO" = (
/obj/machinery/portable_atmospherics/canister,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/yellow/side{
tag = "icon-yellow (WEST)";
icon_state = "yellow";
@@ -55603,9 +55642,7 @@
},
/area/atmos)
"bRP" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- tag = "icon-intact (SOUTHEAST)";
- icon_state = "intact";
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
dir = 6
},
/turf/open/floor/plasteel{
@@ -55614,8 +55651,8 @@
/area/atmos)
"bRQ" = (
/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Waste to Filter";
+ dir = 4;
+ name = "Filter to Waste";
on = 1
},
/turf/open/floor/plasteel{
@@ -56039,19 +56076,16 @@
},
/area/atmos)
"bSI" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 9
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 1
},
-/turf/open/floor/plasteel{
+/turf/open/floor/plasteel/delivery{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
"bSJ" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- icon_state = "intact";
- dir = 5
- },
-/turf/open/floor/plasteel{
+/obj/machinery/pipedispenser/disposal,
+/turf/open/floor/plasteel/yellow/corner{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
@@ -56064,19 +56098,18 @@
},
/area/atmos)
"bSL" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Pure To Canisters";
+ on = 0
},
-/obj/machinery/meter,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
"bSM" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Mix To Canisters";
- on = 0
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+ dir = 4
},
/turf/open/floor/plasteel/yellow/side{
tag = "icon-yellow (EAST)";
@@ -56099,11 +56132,8 @@
},
/area/atmos)
"bSO" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 2;
- name = "Mix to Filter";
- on = 1
- },
+/obj/machinery/atmospherics/pipe/manifold/yellow/visible,
+/obj/machinery/meter,
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -56503,11 +56533,7 @@
},
/area/atmos)
"bTA" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- tag = "icon-intact (NORTHEAST)";
- icon_state = "intact";
- dir = 5
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/yellow/side{
tag = "icon-yellow (WEST)";
icon_state = "yellow";
@@ -56747,13 +56773,20 @@
/area/atmos)
"bTZ" = (
/obj/effect/landmark/event_spawn,
+/obj/machinery/atmospherics/components/unary/vent_scrubber{
+ dir = 4;
+ on = 1;
+ scrub_N2O = 0;
+ scrub_Toxins = 0
+ },
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
"bUa" = (
-/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
/turf/open/floor/plasteel/yellow/side{
tag = "icon-yellow (EAST)";
@@ -57157,16 +57190,16 @@
},
/area/atmos)
"bUL" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
tag = "icon-intact (WEST)";
icon_state = "intact";
dir = 8
},
-/obj/structure/window/reinforced{
- dir = 8
- },
-/turf/open/floor/plasteel/yellow{
+/turf/open/floor/plasteel/yellow/side{
+ tag = "icon-yellow (WEST)";
+ icon_state = "yellow";
+ dir = 8;
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
@@ -57185,20 +57218,16 @@
},
/area/atmos)
"bUN" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- tag = "icon-intact (NORTHWEST)";
- icon_state = "intact";
- dir = 9
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 5
},
-/turf/open/floor/plasteel/yellow/side{
+/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
"bUO" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 6
- },
-/turf/open/floor/plasteel/yellow/side{
+/obj/machinery/atmospherics/pipe/manifold/general/visible,
+/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
@@ -57262,6 +57291,10 @@
dir = 4;
icon_state = "tube1"
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ icon_state = "intact";
+ dir = 4
+ },
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -57451,32 +57484,22 @@
},
/area/atmos)
"bVt" = (
-/obj/machinery/computer/atmos_control/tank{
- frequency = 1441;
- input_tag = "air_in";
- name = "Mixed Air Supply Control";
- output_tag = "air_out";
- sensors = list("air_sensor" = "Tank")
+/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- tag = "icon-intact (NORTHEAST)";
- icon_state = "intact";
- dir = 5
- },
-/turf/open/floor/plasteel/vault{
- baseturf = /turf/open/floor/plating/asteroid/airless;
- dir = 5
+/turf/open/floor/plasteel/yellow/side{
+ tag = "icon-yellow (SOUTHWEST)";
+ icon_state = "yellow";
+ dir = 10;
+ baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
"bVu" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- tag = "icon-intact (WEST)";
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
icon_state = "intact";
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/obj/structure/window/reinforced,
-/turf/open/floor/plasteel/yellow{
+/turf/open/floor/plasteel/yellow/side{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
@@ -57532,14 +57555,11 @@
},
/area/atmos)
"bVy" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
dir = 4
},
-/obj/structure/window/reinforced{
- dir = 1;
- layer = 2.9
- },
-/turf/open/floor/plasteel/black{
+/obj/machinery/atmospherics/pipe/simple/general/visible,
+/turf/open/floor/plasteel/yellow/side{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
@@ -57939,75 +57959,129 @@
},
/area/atmos)
"bWe" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1;
- initialize_directions = 11
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 10;
+ initialize_directions = 10
},
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
"bWf" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Air to Pure"
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ tag = "icon-intact (NORTHEAST)";
+ icon_state = "intact";
+ dir = 5
},
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/asteroid/airless
+/obj/structure/window/reinforced{
+ dir = 8
},
+/obj/structure/window/reinforced,
+/obj/structure/table,
+/obj/item/weapon/paper_bin{
+ pixel_x = -3;
+ pixel_y = 7
+ },
+/turf/open/floor/plasteel/barber,
/area/atmos)
"bWg" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+/obj/machinery/atmospherics/pipe/simple/green/visible{
tag = "icon-intact (WEST)";
icon_state = "intact";
dir = 8
},
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/asteroid/airless
+/obj/structure/window/reinforced,
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ name = "Air to Pure";
+ on = 0
},
+/turf/open/floor/plasteel/barber,
/area/atmos)
"bWh" = (
-/obj/machinery/atmospherics/pipe/manifold/yellow/visible,
-/obj/machinery/meter,
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/machinery/door/window/eastright{
+ dir = 1;
+ name = "Interior Pipe Access";
+ req_access_txt = "24"
+ },
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
/area/atmos)
"bWi" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- tag = "icon-intact (WEST)";
- icon_state = "intact";
- dir = 8
+/obj/machinery/atmospherics/components/trinary/filter{
+ dir = 4;
+ filter_type = "co2";
+ name = "co2 filter";
+ on = 1
},
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/asteroid/airless
+/obj/structure/window/reinforced,
+/turf/open/floor/plasteel/vault{
+ initial_gas_mix = "n2=100;TEMP=80";
+ temperature = 80
},
/area/atmos)
"bWj" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- tag = "icon-intact (NORTHWEST)";
- icon_state = "intact";
- dir = 9
+/obj/machinery/computer/atmos_control/tank{
+ frequency = 1441;
+ input_tag = "co2_in";
+ name = "Carbon Dioxide Supply Control";
+ output_tag = "co2_out";
+ sensors = list("co2_sensor" = "Tank")
},
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/asteroid/airless
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
+/obj/structure/window/reinforced,
+/turf/open/floor/plasteel/vault{
+ dir = 5;
+ initial_gas_mix = "n2=500;TEMP=80";
+ temperature = 80
},
/area/atmos)
"bWk" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/asteroid/airless
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ name = "CO2 to Pure";
+ on = 0
+ },
+/obj/structure/window/reinforced,
+/turf/open/floor/plasteel/vault{
+ initial_gas_mix = "n2=100;TEMP=80";
+ temperature = 80
},
/area/atmos)
"bWl" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/plasteel/black{
- baseturf = /turf/open/floor/plating/asteroid/airless
+/obj/machinery/atmospherics/components/trinary/filter{
+ dir = 4;
+ filter_type = "plasma";
+ name = "plasma filter";
+ on = 1
},
+/obj/structure/window/reinforced,
+/turf/open/floor/plasteel/purple,
/area/atmos)
"bWm" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 2;
+ name = "Unfiltered to Mix";
+ on = 1
+ },
/turf/open/floor/plasteel/yellow/side{
tag = "icon-yellow (WEST)";
icon_state = "yellow";
@@ -58019,6 +58093,11 @@
/obj/structure/extinguisher_cabinet{
pixel_x = 24
},
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ tag = "icon-intact (NORTHWEST)";
+ icon_state = "intact";
+ dir = 9
+ },
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -58219,7 +58298,6 @@
/obj/machinery/light{
dir = 8
},
-/obj/machinery/pipedispenser/disposal,
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -58251,15 +58329,13 @@
},
/area/atmos)
"bWJ" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
/obj/machinery/camera{
c_tag = "Atmoshperic Tanks 1";
dir = 1;
icon_state = "camera";
network = list("SS13","CE")
},
+/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
/turf/open/floor/plasteel/black{
baseturf = /turf/open/floor/plating/asteroid/airless
},
@@ -79479,9 +79555,9 @@
},
/area/crew_quarters/fitness)
"cHs" = (
-/obj/effect/landmark/start/atmospheric_technician,
-/turf/open/floor/plasteel{
- baseturf = /turf/open/floor/plating/asteroid/airless
+/obj/machinery/pipedispenser/disposal/transit_tube,
+/turf/open/floor/plasteel/yellow/corner{
+ dir = 4
},
/area/atmos)
"cHt" = (
@@ -91948,6 +92024,754 @@
/area/maintenance/port{
name = "Port Asteroid Maintenance"
})
+"deK" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ icon_state = "intact";
+ dir = 8
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"deL" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ icon_state = "intact";
+ dir = 8
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"deM" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -24
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"deN" = (
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/machinery/meter,
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"deO" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/structure/closet/secure_closet/atmospherics,
+/obj/item/weapon/pickaxe/mini,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"deP" = (
+/obj/machinery/atmospherics/components/unary/outlet_injector/on{
+ dir = 4;
+ frequency = 1441;
+ id = "n2_in"
+ },
+/obj/structure/lattice/catwalk,
+/turf/open/space/basic,
+/area/maintenance/maintcentral{
+ name = "Central Asteroid Maintenance"
+ })
+"deQ" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/mineral,
+/area/maintenance/maintcentral{
+ name = "Central Asteroid Maintenance"
+ })
+"deR" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/mineral,
+/area/maintenance/maintcentral{
+ name = "Central Asteroid Maintenance"
+ })
+"deS" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/mineral,
+/area/maintenance/maintcentral{
+ name = "Central Asteroid Maintenance"
+ })
+"deT" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/mineral,
+/area/maintenance/maintcentral{
+ name = "Central Asteroid Maintenance"
+ })
+"deU" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/mineral/random/labormineral,
+/area/maintenance/maintcentral{
+ name = "Central Asteroid Maintenance"
+ })
+"deV" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/wall{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/maintenance/maintcentral{
+ name = "Central Asteroid Maintenance"
+ })
+"deW" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/maintenance/maintcentral{
+ name = "Central Asteroid Maintenance"
+ })
+"deX" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/maintenance/maintcentral{
+ name = "Central Asteroid Maintenance"
+ })
+"deY" = (
+/obj/effect/turf_decal/delivery,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/portable_atmospherics/scrubber/huge,
+/turf/open/floor/plasteel/vault{
+ baseturf = /turf/open/floor/plating/asteroid/airless;
+ dir = 5
+ },
+/area/atmos)
+"deZ" = (
+/obj/machinery/portable_atmospherics/canister/carbon_dioxide,
+/obj/effect/turf_decal/delivery,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/vault{
+ baseturf = /turf/open/floor/plating/asteroid/airless;
+ dir = 5
+ },
+/area/atmos)
+"dfa" = (
+/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
+/obj/effect/turf_decal/delivery,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/vault{
+ baseturf = /turf/open/floor/plating/asteroid/airless;
+ dir = 5
+ },
+/area/atmos)
+"dfb" = (
+/obj/machinery/portable_atmospherics/canister/nitrogen,
+/obj/effect/turf_decal/delivery,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/vault{
+ baseturf = /turf/open/floor/plating/asteroid/airless;
+ dir = 5
+ },
+/area/atmos)
+"dfc" = (
+/obj/machinery/atmospherics/components/binary/valve/digital{
+ dir = 4;
+ name = "Waste Release"
+ },
+/turf/open/floor/plasteel/yellow/side{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfd" = (
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/turf/open/floor/plasteel/yellow/side{
+ tag = "icon-yellow (SOUTHWEST)";
+ icon_state = "yellow";
+ dir = 10;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfe" = (
+/obj/machinery/atmospherics/components/trinary/filter{
+ dir = 2;
+ filter_type = "n2";
+ name = "nitogren filter";
+ on = 1
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/floor/plasteel/red,
+/area/atmos)
+"dff" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible,
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfg" = (
+/obj/structure/sign/nosmoking_2,
+/turf/closed/wall/r_wall{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfh" = (
+/obj/machinery/computer/atmos_control/tank{
+ frequency = 1441;
+ input_tag = "n2_in";
+ name = "Nitrogen Supply Control";
+ output_tag = "n2_out";
+ sensors = list("n2_sensor" = "Tank")
+ },
+/obj/machinery/atmospherics/pipe/simple/green/visible,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/floor/plasteel/red,
+/area/atmos)
+"dfi" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible,
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfj" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 5
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfk" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible,
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 4;
+ name = "N2 to Pure"
+ },
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/structure/window/reinforced,
+/obj/machinery/door/window/eastright{
+ name = "Interior Pipe Access";
+ req_access_txt = "24"
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfl" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible,
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfm" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
+ },
+/turf/closed/wall{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/crew_quarters/chief)
+"dfn" = (
+/obj/machinery/atmospherics/components/trinary/filter{
+ dir = 2;
+ filter_type = "o2";
+ name = "oxygen filter";
+ on = 1
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/floor/plasteel/blue,
+/area/atmos)
+"dfo" = (
+/obj/machinery/atmospherics/pipe/manifold/general/visible{
+ dir = 8
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfp" = (
+/obj/machinery/atmospherics/pipe/manifold/general/visible{
+ dir = 1
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfq" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 10
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfr" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfs" = (
+/obj/machinery/computer/atmos_control/tank{
+ frequency = 1441;
+ input_tag = "o2_in";
+ name = "Oxygen Supply Control";
+ output_tag = "o2_out";
+ sensors = list("o2_sensor" = "Tank")
+ },
+/obj/machinery/atmospherics/pipe/simple/green/visible,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/floor/plasteel/blue,
+/area/atmos)
+"dft" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible,
+/turf/open/floor/plasteel/yellow/side{
+ tag = "icon-yellow (EAST)";
+ icon_state = "yellow";
+ dir = 4
+ },
+/area/atmos)
+"dfu" = (
+/obj/machinery/pipedispenser,
+/obj/machinery/light,
+/turf/open/floor/plasteel/yellow/corner{
+ tag = "icon-yellowcorner (WEST)";
+ icon_state = "yellowcorner";
+ dir = 8
+ },
+/area/atmos)
+"dfv" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 1
+ },
+/turf/open/floor/plasteel/delivery{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfw" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 1
+ },
+/turf/open/floor/plasteel/delivery{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfx" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ icon_state = "intact";
+ dir = 6
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfy" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible,
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 4;
+ name = "O2 to Airmix";
+ on = 1
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/floor/plasteel/blue,
+/area/atmos)
+"dfz" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible,
+/obj/machinery/camera{
+ c_tag = "Atmospherics Distro";
+ dir = 9;
+ icon_state = "camera";
+ network = list("SS13","CE")
+ },
+/turf/open/floor/plasteel/yellow/side{
+ tag = "icon-yellow (EAST)";
+ icon_state = "yellow";
+ dir = 4
+ },
+/area/atmos)
+"dfA" = (
+/obj/structure/sign/poster/official/safety_internals,
+/turf/closed/wall,
+/area/atmos)
+"dfB" = (
+/obj/machinery/camera{
+ c_tag = "Atmospherics South";
+ dir = 4;
+ icon_state = "camera";
+ network = list("SS13","CE")
+ },
+/obj/machinery/atmospherics/pipe/manifold/general/visible{
+ dir = 8
+ },
+/obj/machinery/meter,
+/turf/open/floor/plasteel/yellow/side{
+ tag = "icon-yellow (WEST)";
+ icon_state = "yellow";
+ dir = 8;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfC" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ icon_state = "intact";
+ dir = 4
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfD" = (
+/obj/machinery/atmospherics/pipe/manifold/general/visible,
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfE" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4;
+ initialize_directions = 11
+ },
+/turf/closed/wall/r_wall{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfF" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible,
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 4;
+ name = "O2 to Pure"
+ },
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/structure/window/reinforced,
+/obj/machinery/door/window/eastright{
+ name = "Interior Pipe Access";
+ req_access_txt = "24"
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfG" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ name = "South Canister To Waste";
+ on = 0;
+ target_pressure = 101
+ },
+/turf/open/floor/plasteel/yellow/side{
+ tag = "icon-yellow (EAST)";
+ icon_state = "yellow";
+ dir = 4
+ },
+/area/atmos)
+"dfH" = (
+/obj/machinery/atmospherics/components/unary/thermomachine/freezer,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/yellow/corner{
+ dir = 1
+ },
+/area/atmos)
+"dfI" = (
+/obj/machinery/portable_atmospherics/canister,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible,
+/turf/open/floor/plasteel/delivery{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfJ" = (
+/obj/machinery/portable_atmospherics/canister,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible,
+/turf/open/floor/plasteel/delivery{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfK" = (
+/obj/machinery/portable_atmospherics/canister,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible,
+/turf/open/floor/plasteel/delivery{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfL" = (
+/obj/effect/landmark/start/atmospheric_technician,
+/obj/machinery/atmospherics/pipe/simple/general/visible,
+/turf/open/floor/plasteel/yellow/side{
+ tag = "icon-yellow (WEST)";
+ icon_state = "yellow";
+ dir = 8;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfM" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
+/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfN" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/turf/open/floor/plasteel/yellow/side{
+ tag = "icon-yellow (WEST)";
+ icon_state = "yellow";
+ dir = 8;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfO" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber{
+ dir = 8;
+ on = 1;
+ scrub_Toxins = 0
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfP" = (
+/obj/machinery/status_display{
+ density = 0;
+ layer = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfQ" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible,
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ tag = "icon-intact (WEST)";
+ icon_state = "intact";
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/floor/plasteel/barber,
+/area/atmos)
+"dfR" = (
+/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
+/obj/machinery/meter,
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfS" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 9
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfT" = (
+/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
+ dir = 8
+ },
+/obj/machinery/meter,
+/turf/open/floor/plasteel/yellow/side{
+ tag = "icon-yellow (EAST)";
+ icon_state = "yellow";
+ dir = 4;
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfU" = (
+/obj/machinery/atmospherics/components/unary/vent_pump{
+ dir = 4;
+ on = 1
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfV" = (
+/obj/machinery/computer/atmos_control/tank{
+ frequency = 1441;
+ input_tag = "air_in";
+ name = "Mixed Air Supply Control";
+ output_tag = "air_out";
+ sensors = list("air_sensor" = "Tank")
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/green/visible,
+/turf/open/floor/plasteel/barber,
+/area/atmos)
+"dfW" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
+/obj/machinery/airalarm{
+ dir = 8;
+ icon_state = "alarm0";
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfX" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/machinery/door/window/eastright{
+ dir = 1;
+ name = "Interior Pipe Access";
+ req_access_txt = "24"
+ },
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ name = "Air to South Canister";
+ on = 0
+ },
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dfY" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
+/obj/machinery/computer/atmos_control/tank{
+ frequency = 1441;
+ input_tag = "tox_in";
+ name = "Plasma Supply Control";
+ output_tag = "tox_out";
+ sensors = list("tox_sensor" = "Tank")
+ },
+/obj/structure/window/reinforced,
+/turf/open/floor/plasteel/purple,
+/area/atmos)
+"dfZ" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ name = "Plasma to Pure";
+ on = 0
+ },
+/obj/structure/window/reinforced,
+/turf/open/floor/plasteel/purple,
+/area/atmos)
+"dga" = (
+/obj/machinery/atmospherics/components/trinary/filter{
+ dir = 4;
+ filter_type = "n2";
+ name = "nitogren filter";
+ on = 1
+ },
+/obj/structure/window/reinforced,
+/turf/open/floor/plasteel/escape{
+ dir = 10
+ },
+/area/atmos)
+"dgb" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
+/obj/machinery/computer/atmos_control/tank{
+ frequency = 1441;
+ input_tag = "n2o_in";
+ name = "Nitrous Oxide Supply Control";
+ output_tag = "n2o_out";
+ sensors = list("n2o_sensor" = "Tank")
+ },
+/obj/structure/window/reinforced,
+/turf/open/floor/plasteel/escape,
+/area/atmos)
+"dgc" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ name = "N2O to Pure";
+ on = 0
+ },
+/obj/structure/window/reinforced,
+/turf/open/floor/plasteel/escape{
+ dir = 6
+ },
+/area/atmos)
+"dgd" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
+/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
+/turf/open/floor/plating{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
+"dge" = (
+/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
+/turf/open/floor/plasteel/black{
+ baseturf = /turf/open/floor/plating/asteroid/airless
+ },
+/area/atmos)
(1,1,1) = {"
aaa
@@ -107243,7 +108067,7 @@ btk
btk
btk
ddI
-cJW
+ddI
btk
btk
btk
@@ -108016,7 +108840,7 @@ bxl
ddJ
ddX
bte
-bBF
+dem
cHi
bDU
bte
@@ -108273,7 +109097,7 @@ bte
byn
bzm
bte
-bBF
+dem
bCC
bDO
bte
@@ -109041,10 +109865,10 @@ bzr
ddn
bwc
ddB
-ddL
+ddv
dea
bAq
-dep
+ddo
dey
deE
bzr
@@ -109297,12 +110121,12 @@ brI
btj
ddo
bwc
-ddC
-ddM
-deb
+ddB
+ddv
+dea
dej
-deq
-dez
+ddo
+dey
cUI
bzr
bGC
@@ -109559,7 +110383,7 @@ ddN
bzn
bAr
buB
-bzo
+ddY
bDP
bzr
bGD
@@ -109809,14 +110633,14 @@ boR
aYW
brI
btj
-ddp
+ddo
ddv
-ddE
-ddO
-dec
+ddB
+ddv
+dea
bwc
-der
-deA
+ddo
+dey
bDQ
bzr
bGE
@@ -110066,14 +110890,14 @@ boR
aYW
brJ
bzr
-ddq
-ddw
-ddF
-ddP
-ded
+ddn
+ddv
+ddB
+ddv
+dea
bwc
-des
-deB
+ddo
+dey
bDR
bzr
bGF
@@ -110327,7 +111151,7 @@ byq
bwd
bxn
ddQ
-bzo
+ddY
byp
det
bzm
@@ -110581,7 +111405,7 @@ bqm
brL
bzr
ddr
-ddx
+ddr
bxo
ddR
dee
@@ -111098,10 +111922,10 @@ buC
ddy
bxq
ddT
-def
+ddV
bAu
-deu
-bCF
+ddG
+ddV
bDT
bzr
bGJ
@@ -111359,7 +112183,7 @@ bzp
dek
bBG
bwg
-deG
+ddG
bzr
bGK
bIk
@@ -111612,11 +112436,11 @@ buE
ddz
ddG
ddV
-deg
+ddG
del
-dev
+ddV
deC
-bCF
+ddV
bzr
bQB
bGL
@@ -111875,7 +112699,7 @@ btk
btk
btk
bEX
-deI
+dei
bTq
aXZ
bCG
@@ -116504,9 +117328,9 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
+deP
+abC
+abC
abC
aaa
aaa
@@ -116761,7 +117585,7 @@ aaa
aaa
aaa
aXS
-aXS
+deQ
aXS
aXE
aYh
@@ -117018,7 +117842,7 @@ aaa
aXE
aXE
aXS
-aXS
+deR
aXS
aXS
aXS
@@ -117275,7 +118099,7 @@ aXS
aXS
aXS
aXS
-aXS
+deS
aXS
aXS
aXS
@@ -117532,7 +118356,7 @@ aYg
aYg
aXS
aXS
-aXS
+deT
aXS
aXS
aXS
@@ -117789,7 +118613,7 @@ bzs
bzs
bzs
bzs
-bzs
+deU
bxK
bxK
bwA
@@ -118046,7 +118870,7 @@ cHu
bwA
bzs
bwA
-bwA
+deV
cHu
bwA
bvh
@@ -118303,7 +119127,7 @@ cQI
bwA
cHu
cHu
-bYq
+deW
cQe
cQC
cRq
@@ -118560,7 +119384,7 @@ cUT
cUU
cUV
cUW
-cUX
+deX
cUY
cUY
cUY
@@ -118817,7 +119641,7 @@ bDV
bDV
bDV
bDV
-bDV
+bDZ
bDV
bxK
cHu
@@ -119074,7 +119898,7 @@ bEY
bEY
bIm
bJI
-bEY
+deY
bLU
bLU
bLU
@@ -119331,7 +120155,7 @@ bEZ
bGM
bIn
bJJ
-bJJ
+deZ
bLU
bNt
bOr
@@ -119588,7 +120412,7 @@ bFa
bFa
bIn
bJK
-bJK
+dfa
bLU
bNt
bOs
@@ -119845,7 +120669,7 @@ bFb
bFb
bIn
bJL
-bJL
+dfb
bLU
bNu
bOt
@@ -120102,7 +120926,7 @@ bDV
bDV
bIo
bDV
-bDV
+bDZ
bLU
bNv
bOu
@@ -120352,14 +121176,14 @@ aXS
bxK
bwA
bxM
-bBJ
+cQB
bxK
bDV
bFc
bGN
bGO
-bGO
-bDV
+deM
+dfc
bLV
bNw
bLW
@@ -120609,25 +121433,25 @@ aXS
bxK
cHu
bwy
-cQB
+cUQ
bCJ
bDW
bFd
-bGO
-bGO
-bGO
+bGP
+bGP
+bGP
bKF
-bLW
-bNw
-bLW
+dfd
+dfe
+dfh
bPC
-bPC
-bNw
-bLW
-bPC
-bPC
-bUK
-bLW
+dfk
+dfn
+dfs
+dfy
+dfF
+dfQ
+dfV
bWf
bUK
bDV
@@ -120866,27 +121690,27 @@ aXS
bxK
bxK
cQu
-cUQ
+cUR
bCK
bDX
bFe
-bGP
-bGP
-bGP
+bGQ
+bGQ
+deN
bKG
bLX
-bNx
+bNy
bOv
bPD
-bQF
-bRH
-bSH
-bTt
-bTX
+bTY
+bNy
+bNy
+bTu
+bTY
bUL
bVt
bWg
-bUK
+dge
bDV
cHx
cHz
@@ -121123,24 +121947,24 @@ aYK
aYK
aYK
bAB
-cUR
+bBJ
bCL
-bDY
+bDZ
bFf
-bGQ
-bGQ
+bGO
+bGO
bJM
bKH
-bLY
-bNy
+bQM
+dff
bOw
-bPE
-bQG
-bNy
-bNy
-bTu
-bTY
-bUM
+bPF
+bQH
+bQH
+bQH
+bTv
+bQH
+bVK
bVu
bWh
bUK
@@ -121387,18 +122211,18 @@ bFg
bGR
bIp
bJN
-bKI
-bGQ
-bNz
+bGO
+bGO
+bGO
bOx
-bPF
-bQH
-bQH
-bQH
-bTv
-bQH
+dfi
+dfl
+dfo
+dft
+dfz
+dfG
bUN
-bVv
+bVu
bWi
bWG
bXg
@@ -121641,21 +122465,21 @@ bBJ
bwA
bDZ
bFh
-bGO
+deK
bIq
-bGO
+bJN
bKJ
bGO
-bNA
-bOy
-bPG
-bQI
-bQI
-bQI
-bPG
bGO
+bGO
+bNA
+bGO
+bQI
+dfu
+bPH
+dfH
bUO
-bVw
+bVu
bWj
bWH
bOu
@@ -121898,21 +122722,21 @@ bBK
cHu
bDZ
bFi
-bGO
+deL
bIr
-bGR
+deO
bKK
bLZ
bNB
bOz
-bPH
-bQJ
-bQJ
-bQJ
-bQO
bGO
+bGO
+dfp
+dfv
+bQJ
+dfI
+bUO
bUP
-bVx
bWk
bWI
bXh
@@ -122157,20 +122981,20 @@ bDZ
bFj
bGS
bIs
+bDZ
bDV
bDV
-bDV
-bDV
+dfg
bOA
-bPI
-bQK
-bQK
-bQK
-bTw
bGO
-bUQ
+bGO
+bQK
+dfw
+bQJ
+dfJ
+dfR
bVy
-bLW
+dfX
bWJ
bLU
bLU
@@ -122414,19 +123238,19 @@ bEa
bFk
bGT
bIt
-bJO
+bJP
bKL
bMa
bDV
bOB
bGO
-bQL
+bGO
bRI
bSI
-bGO
-bGO
+bQJ
+dfK
+bUO
bUQ
-bVz
bWl
bWG
bXg
@@ -122676,15 +123500,15 @@ bKM
bMb
bDV
bOC
-bPJ
-bQM
-bRJ
-bSJ
bGO
+bGO
+bQI
+bSJ
+dfA
cHs
+bQI
bUQ
-bVA
-bLW
+dfY
bWH
bOu
bXD
@@ -122933,15 +123757,15 @@ bKN
bMc
bNC
bOD
-bPK
-bGO
+dfj
bGO
+dfq
bOy
-bGO
-bGO
+dfB
+dfL
+dfS
bUP
-bVB
-bWk
+dfZ
bWI
bXh
bXE
@@ -123189,16 +124013,16 @@ bDZ
bKM
bMb
bDV
-bOE
+bGO
bPL
bQN
+dfr
+bPK
+dfC
bGO
-bSK
-bSJ
bGO
bUQ
-bVy
-bLW
+bWh
bWK
bLU
bLU
@@ -123450,12 +124274,12 @@ bOF
bPM
bQO
bRK
-bOy
-bTx
+dfx
+dfD
bTZ
+bGO
bUQ
-bVC
-bWl
+dga
bWG
bXg
bXF
@@ -123707,12 +124531,12 @@ cRb
cRb
bQP
bRL
+bTx
bSL
-bSL
+bJN
bGO
bUQ
-bVD
-bLW
+dgb
bWH
bOu
bXG
@@ -123967,10 +124791,10 @@ bRM
bSM
bTy
bUa
+dfT
bUR
-bVE
-bWk
-bWL
+dgc
+bWI
bXh
bXH
bYl
@@ -124223,10 +125047,10 @@ bQQ
bRN
bSN
bTz
+dfM
bUb
bTz
-bVF
-bTz
+dgd
bWM
bLU
bLU
@@ -124476,13 +125300,13 @@ bMg
cRk
cRs
bPP
-bQQ
+dfm
bRO
bQG
bTA
+dfN
bUc
bUS
-bVG
bWm
bWN
bXg
@@ -124736,11 +125560,11 @@ cRA
cWQ
bRP
bSO
-bOx
+bGO
+dfO
bUd
bUT
bVH
-bGO
bWO
bOu
bXJ
@@ -124992,12 +125816,12 @@ cRu
cRB
cWR
bRQ
-bGO
bQL
+bPJ
bUe
bPJ
-bVI
bPJ
+bVI
bWP
bXh
bXK
@@ -125252,9 +126076,9 @@ bRR
bSP
bTB
bUf
+dfU
bGO
bVJ
-bQH
bWQ
bLU
bLU
@@ -125510,7 +126334,7 @@ bSQ
bTC
bUg
bUU
-bVK
+dfW
bWn
bWR
bDV
@@ -125764,9 +126588,9 @@ cRc
bQS
bRT
bSR
+dfE
+dfP
bTD
-bDW
-bDV
bDV
bDV
bDV
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 4a91a5b85fb..3c7218915c2 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -10134,14 +10134,11 @@
/turf/open/space,
/area/space)
"aux" = (
-/obj/item/weapon/twohanded/required/kirbyplants{
- icon_state = "plant-21";
- layer = 4.1;
- pixel_x = -3;
- pixel_y = 3
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/bot,
+/obj/item/weapon/twohanded/required/kirbyplants{
+ icon_state = "plant-22"
+ },
/turf/open/floor/plasteel,
/area/engine/gravity_generator{
name = "Atmospherics Engine"
@@ -10777,25 +10774,28 @@
/turf/closed/wall/mineral/titanium,
/area/shuttle/supply)
"avM" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/heater{
- dir = 4;
- on = 1
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/bot,
+/obj/item/weapon/twohanded/required/kirbyplants{
+ icon_state = "plant-21";
+ layer = 4.1;
+ pixel_x = -3;
+ pixel_y = 3
+ },
/turf/open/floor/plasteel,
/area/engine/gravity_generator{
name = "Atmospherics Engine"
})
"avN" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- icon_state = "manifold";
- dir = 4
- },
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ icon_state = "pump_map";
+ name = "Thermo to Gas"
+ },
/turf/open/floor/plasteel,
/area/engine/gravity_generator{
name = "Atmospherics Engine"
@@ -11296,10 +11296,6 @@
/turf/open/space,
/area/space)
"awR" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
- icon_state = "freezer";
- dir = 4
- },
/obj/structure/sign/securearea{
pixel_x = -32
},
@@ -11311,6 +11307,10 @@
network = list("SS13","Engine")
},
/obj/effect/turf_decal/bot,
+/obj/machinery/atmospherics/components/unary/thermomachine/heater{
+ dir = 4;
+ on = 1
+ },
/turf/open/floor/plasteel,
/area/engine/gravity_generator{
name = "Atmospherics Engine"
@@ -11765,12 +11765,13 @@
name = "Atmospherics Engine"
})
"axM" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/machinery/atmospherics/pipe/manifold/general/visible{
+ icon_state = "manifold";
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/gravity_generator{
name = "Atmospherics Engine"
@@ -11778,11 +11779,6 @@
"axN" = (
/obj/machinery/atmospherics/pipe/simple/general/visible,
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- icon_state = "intact";
- dir = 4
- },
-/obj/machinery/meter,
/turf/open/floor/plasteel/neutral,
/area/engine/gravity_generator{
name = "Atmospherics Engine"
@@ -11794,9 +11790,6 @@
icon_state = "1-2";
pixel_y = 0
},
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
- },
/obj/machinery/light{
dir = 4;
icon_state = "tube1"
@@ -12429,11 +12422,9 @@
/turf/open/floor/plasteel,
/area/shuttle/supply)
"aza" = (
-/obj/machinery/atmospherics/components/trinary/filter{
- dir = 1;
+/obj/machinery/atmospherics/components/trinary/filter/flipped{
filter_type = "n2";
- name = "nitogren filter";
- on = 1
+ name = "nitrogen filter"
},
/turf/open/floor/plasteel/yellow,
/area/engine/gravity_generator{
@@ -63633,6 +63624,7 @@
dir = 8
},
/obj/effect/turf_decal/bot,
+/obj/machinery/portable_atmospherics/canister/freon,
/turf/open/floor/plasteel,
/area/engine/engineering)
"cqt" = (
@@ -112327,6 +112319,29 @@
/obj/structure/displaycase/trophy,
/turf/open/floor/wood,
/area/library)
+"ehS" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/bot,
+/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
+ icon_state = "freezer";
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engine/gravity_generator{
+ name = "Atmospherics Engine"
+ })
+"ehT" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 5
+ },
+/obj/machinery/meter,
+/turf/open/floor/plasteel,
+/area/engine/gravity_generator{
+ name = "Atmospherics Engine"
+ })
(1,1,1) = {"
aaa
@@ -136049,11 +136064,11 @@ aiW
apF
aqY
asd
-ati
+axL
aux
avM
awR
-axL
+ehS
axL
axL
asd
@@ -136311,7 +136326,7 @@ auy
avN
awS
axM
-aqZ
+ehT
azZ
aAV
aCc
@@ -136569,7 +136584,7 @@ ato
awT
axN
aza
-aAa
+ato
aAW
aCd
aDD
@@ -136825,7 +136840,7 @@ ebT
avO
auA
axO
-azb
+atk
atk
aAX
aCe
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 26c4cc57191..303005c32f9 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -56825,7 +56825,6 @@
icon_state = "4-8"
},
/turf/open/floor/plasteel{
- desc = "";
icon_state = "L13";
name = "floor"
},
@@ -57517,7 +57516,6 @@
dir = 4
},
/turf/open/floor/plasteel{
- desc = "";
icon_state = "L14"
},
/area/hallway/primary/central)
diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm
index 2500d2a963d..3b30420bee4 100644
--- a/_maps/map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/map_files/OmegaStation/OmegaStation.dmm
@@ -14511,14 +14511,6 @@
tag = "icon-4-8";
icon_state = "4-8"
},
-/obj/structure/cable/white{
- tag = "icon-2-4";
- icon_state = "2-4"
- },
-/obj/structure/cable/white{
- tag = "icon-2-8";
- icon_state = "2-8"
- },
/turf/open/floor/plasteel/vault{
dir = 5
},
@@ -14893,11 +14885,6 @@
/obj/item/stack/cable_coil/random,
/obj/item/stack/cable_coil/random,
/obj/machinery/light,
-/obj/machinery/power/apc{
- dir = 2;
- name = "Bar APC";
- pixel_y = -26
- },
/obj/structure/cable/white,
/turf/open/floor/plasteel/black,
/area/crew_quarters/bar)
@@ -77588,7 +77575,7 @@ aaa
aaa
aaa
aaa
-bwn
+bwb
aaa
aaa
aaa
@@ -77846,7 +77833,7 @@ aaa
aaa
bwb
bwo
-bwA
+bwb
aaa
aaa
aaa
@@ -78102,7 +78089,7 @@ aaa
aaa
aaa
bwc
-bwp
+bwi
bwB
aaa
aaa
@@ -78358,9 +78345,9 @@ aaa
aaa
aaa
aaa
-bwd
+bvS
bwq
-bwC
+bvS
aaa
aaa
aaa
@@ -78615,10 +78602,10 @@ aaa
aaa
aaa
bvS
-bwe
+bvS
bwr
-bwD
-bwM
+bvS
+bvS
aaa
aaa
aaa
@@ -78873,9 +78860,9 @@ aaa
aaa
bvT
bwf
-bws
+bwi
bwE
-bwN
+bvT
aaa
aaa
aaa
@@ -79128,11 +79115,11 @@ aaa
aaa
aaa
aaa
-bvU
-bwg
-bwt
-bwF
-bwO
+bvS
+bwf
+bwi
+bwE
+bvS
aaa
aaa
aaa
@@ -79385,11 +79372,11 @@ aaa
aaa
aaa
aaa
-bvV
+bvS
bwh
-bwu
-bwG
-bwP
+bwi
+bwi
+bvS
aaa
aaa
aaa
@@ -79645,7 +79632,7 @@ aaa
bvW
bwi
bwv
-bwH
+bwi
bwQ
aaa
aaa
@@ -79899,11 +79886,11 @@ aaa
aaa
aaa
aaa
-bvX
-bwj
-bww
+bvS
+bwi
+bwi
bwI
-bwR
+bvS
aaa
aaa
aaa
@@ -80156,11 +80143,11 @@ aaa
aaa
aaa
aaa
-bvY
-bwk
-bwx
-bwJ
-bwS
+bvS
+bwf
+bwi
+bwE
+bvS
aaa
aaa
aaa
@@ -80413,11 +80400,11 @@ aaa
aaa
aaa
aaa
-bvZ
-bwl
-bwy
-bwK
-bwT
+bvT
+bwf
+bwi
+bwE
+bvT
aaa
aaa
aaa
@@ -80670,11 +80657,11 @@ aaa
aaa
aaa
aaa
-bwa
-bwm
+bvS
+bvT
bwz
-bwL
-bwU
+bvT
+bvS
aaa
aaa
aaa
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index bd71cc47948..99cef30ebd5 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -47062,6 +47062,11 @@
icon_state = "1-2"
},
/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"bPR" = (
@@ -55914,6 +55919,20 @@
/obj/machinery/light,
/turf/open/floor/pod/light,
/area/shuttle/transport)
+"cjQ" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/power/apc{
+ cell_type = 15000;
+ dir = 2;
+ name = "Engineering APC";
+ pixel_y = -24
+ },
+/obj/structure/cable{
+ d2 = 8;
+ icon_state = "0-8"
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
(1,1,1) = {"
aaa
@@ -89495,7 +89514,7 @@ bNt
bOE
bNt
bNt
-bPE
+cjQ
bMb
bQy
bMb
diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm
index 26c0b8c984e..165690571f1 100644
--- a/code/__DEFINES/antagonists.dm
+++ b/code/__DEFINES/antagonists.dm
@@ -3,3 +3,6 @@
#define ANTAG_DATUM_CLOCKCULT /datum/antagonist/clockcult
#define ANTAG_DATUM_CLOCKCULT_SILENT /datum/antagonist/clockcult/silent
#define ANTAG_DATUM_DEVIL /datum/antagonist/devil
+#define ANTAG_DATUM_NINJA /datum/antagonist/ninja
+#define ANTAG_DATUM_NINJA_FRIENDLY /datum/antagonist/ninja/friendly
+#define ANTAG_DATUM_NINJA_RANDOM /datum/antagonist/ninja/randomAllegiance/
diff --git a/code/__DEFINES/cult.dm b/code/__DEFINES/cult.dm
new file mode 100644
index 00000000000..71d4ad3af9b
--- /dev/null
+++ b/code/__DEFINES/cult.dm
@@ -0,0 +1,9 @@
+//rune colors, for easy reference
+#define RUNE_COLOR_TALISMAN "#0000FF"
+#define RUNE_COLOR_TELEPORT "#551A8B"
+#define RUNE_COLOR_OFFER "#FFFFFF"
+#define RUNE_COLOR_DARKRED "#7D1717"
+#define RUNE_COLOR_MEDIUMRED "#C80000"
+#define RUNE_COLOR_RED "#FF0000"
+#define RUNE_COLOR_EMP "#4D94FF"
+#define RUNE_COLOR_SUMMON "#00FF00"
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index a0516bfd5c6..8d9af56105b 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -27,6 +27,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define BLOCK_GAS_SMOKE_EFFECT 4096 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY!
#define THICKMATERIAL 8192 //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body.
#define DROPDEL 16384 // When dropped, it calls qdel on itself
+#define PREVENT_CLICK_UNDER 32768 //Prevent clicking things below it on the same turf eg. doors/ fulltile windows
/* Secondary atom flags, access using the SECONDARY_FLAG macros */
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 7edf1f5959b..463c7cfee5e 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -402,3 +402,7 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
//Error handler defines
#define ERROR_USEFUL_LEN 2
+
+#define NO_FIELD 0
+#define FIELD_TURF 1
+#define FIELD_EDGE 2
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 9a0bf8d401e..371bad418c1 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -40,6 +40,7 @@
// Subsystem init_order, from highest priority to lowest priority
// The numbers just define the ordering, they are meaningless otherwise.
+#define INIT_ORDER_SERVER_MAINT 16
#define INIT_ORDER_JOBS 15
#define INIT_ORDER_EVENTS 14
#define INIT_ORDER_TICKER 13
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index a722da2efba..e81cf7bfc5c 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -177,7 +177,7 @@ Proc for attack log creation, because really why not
if(target && isliving(target))
living_target = target
-
+
var/hp =" "
if(living_target)
hp = "(NEWHP: [living_target.health])"
@@ -255,6 +255,20 @@ Proc for attack log creation, because really why not
qdel(progbar)
+//some additional checks as a callback for for do_afters that want to break on losing health or on the mob taking action
+/mob/proc/break_do_after_checks(list/checked_health, check_clicks)
+ if(check_clicks && next_move > world.time)
+ return FALSE
+ return TRUE
+
+//pass a list in the format list("health" = mob's health var) to check health during this
+/mob/living/break_do_after_checks(list/checked_health, check_clicks)
+ if(islist(checked_health))
+ if(health < checked_health["health"])
+ return FALSE
+ checked_health["health"] = health
+ return ..()
+
/proc/do_after(mob/user, delay, needhand = 1, atom/target = null, progress = 1, datum/callback/extra_checks = null)
if(!user)
return 0
diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm
index 49be0a12c3b..58b8fbaa0f0 100644
--- a/code/__HELPERS/names.dm
+++ b/code/__HELPERS/names.dm
@@ -167,9 +167,13 @@ GLOBAL_VAR(syndicate_code_response) //Code response for traitors.
/N
*/
-/proc/generate_code_phrase()//Proc is used for phrase and response in master_controller.dm
+/proc/generate_code_phrase(return_list=FALSE)//Proc is used for phrase and response in master_controller.dm
+
+ if(!return_list)
+ . = ""
+ else
+ . = list()
- var/code_phrase = ""//What is returned when the proc finishes.
var/words = pick(//How many words there will be. Minimum of two. 2, 4 and 5 have a lesser chance of being selected. 3 is the most likely.
50; 2,
200; 3,
@@ -204,39 +208,39 @@ GLOBAL_VAR(syndicate_code_response) //Code response for traitors.
switch(rand(1,2))//Mainly to add more options later.
if(1)
if(names.len&&prob(70))
- code_phrase += pick(names)
+ . += pick(names)
else
if(prob(10))
- code_phrase += pick(lizard_name(MALE),lizard_name(FEMALE))
+ . += pick(lizard_name(MALE),lizard_name(FEMALE))
else
- code_phrase += pick(pick(GLOB.first_names_male,GLOB.first_names_female))
- code_phrase += " "
- code_phrase += pick(GLOB.last_names)
+ var/new_name = pick(pick(GLOB.first_names_male,GLOB.first_names_female))
+ new_name += " "
+ new_name += pick(GLOB.last_names)
+ . += new_name
if(2)
- code_phrase += pick(get_all_jobs())//Returns a job.
+ . += pick(get_all_jobs())//Returns a job.
safety -= 1
if(2)
switch(rand(1,3))//Food, drinks, or things. Only selectable once.
if(1)
- code_phrase += lowertext(pick(drinks))
+ . += lowertext(pick(drinks))
if(2)
- code_phrase += lowertext(pick(foods))
+ . += lowertext(pick(foods))
if(3)
- code_phrase += lowertext(pick(locations))
+ . += lowertext(pick(locations))
safety -= 2
if(3)
switch(rand(1,4))//Abstract nouns, objects, adjectives, threats. Can be selected more than once.
if(1)
- code_phrase += lowertext(pick(nouns))
+ . += lowertext(pick(nouns))
if(2)
- code_phrase += lowertext(pick(objects))
+ . += lowertext(pick(objects))
if(3)
- code_phrase += lowertext(pick(adjectives))
+ . += lowertext(pick(adjectives))
if(4)
- code_phrase += lowertext(pick(threats))
- if(words==1)
- code_phrase += "."
- else
- code_phrase += ", "
-
- return code_phrase
+ . += lowertext(pick(threats))
+ if(!return_list)
+ if(words==1)
+ . += "."
+ else
+ . += ", "
diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm
index ba50d63aae0..59326c5c170 100644
--- a/code/_globalvars/misc.dm
+++ b/code/_globalvars/misc.dm
@@ -8,7 +8,7 @@ GLOBAL_VAR_INIT(fileaccess_timer, 0)
GLOBAL_VAR_INIT(TAB, " ")
-GLOBAL_DATUM(data_core, /datum/datacore)
+GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
GLOBAL_VAR_INIT(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)
GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 0c40be56ac5..f178b83656a 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -92,6 +92,9 @@
if(next_move > world.time) // in the year 2000...
return
+ if(A.IsObscured())
+ return
+
if(istype(loc,/obj/mecha))
var/obj/mecha/M = loc
return M.click_action(A,src,params)
@@ -141,6 +144,22 @@
else
RangedAttack(A,params)
+//Is the atom obscured by a PREVENT_CLICK_UNDER object above it
+/atom/proc/IsObscured()
+ if(!isturf(loc)) //This only makes sense for things directly on turfs for now
+ return FALSE
+ var/turf/T = loc
+ for(var/atom/movable/AM in T)
+ if(AM.flags & PREVENT_CLICK_UNDER && AM.density && AM.layer > layer)
+ return TRUE
+ return FALSE
+
+/turf/IsObscured()
+ for(var/atom/movable/AM in src)
+ if(AM.flags & PREVENT_CLICK_UNDER && AM.density)
+ return TRUE
+ return FALSE
+
/atom/movable/proc/CanReach(atom/target,obj/item/tool,view_only = FALSE)
if(isturf(target) || isturf(target.loc) || DirectAccess(target)) //Directly accessible atoms
if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index b1c5a6bb1ed..4400070dfb4 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -28,7 +28,7 @@
if(sharpness)
to_chat(user, "You begin to butcher [src]...")
playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1)
- if(do_mob(user, src, 80/sharpness))
+ if(do_mob(user, src, 80/sharpness) && Adjacent(I))
harvest(user)
return 1
return I.attack(src, user)
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index 90b3983d821..c7ad66440ea 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -13,7 +13,7 @@
/atom/proc/attack_tk(mob/user)
if(user.stat)
return
- new /obj/effect/overlay/temp/telekinesis(loc)
+ new /obj/effect/temp_visual/telekinesis(loc)
user.UnarmedAttack(src,0) // attack_hand, attack_paw, etc
return
@@ -163,7 +163,7 @@
/obj/item/tk_grab/proc/apply_focus_overlay()
if(!focus)
return
- new /obj/effect/overlay/temp/telekinesis(get_turf(focus))
+ new /obj/effect/temp_visual/telekinesis(get_turf(focus))
/obj/item/tk_grab/update_icon()
cut_overlays()
diff --git a/code/controllers/master.dm b/code/controllers/master.dm
index c245c33e519..773f334b673 100644
--- a/code/controllers/master.dm
+++ b/code/controllers/master.dm
@@ -83,6 +83,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
sortTim(subsystems, /proc/cmp_subsystem_init)
reverseRange(subsystems)
for(var/datum/controller/subsystem/ss in subsystems)
+ testing("Shutdown [ss.name] subsystem")
ss.Shutdown()
// Returns 1 if we created a new mc, 0 if we couldn't due to a recent restart,
@@ -132,7 +133,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
msg = "The [BadBoy.name] subsystem seems to be destabilizing the MC and will be offlined."
BadBoy.flags |= SS_NO_FIRE
if(msg)
- to_chat(GLOB.admins, "[msg]")
+ to_chat(GLOB.admins, "[msg]")
log_world(msg)
if (istype(Master.subsystems))
@@ -189,9 +190,15 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
// Loop.
Master.StartProcessing(0)
-/datum/controller/master/proc/SetRunLevel(runlevel)
- testing("MC: Runlevel changed from [isnull(current_runlevel) ? "NULL" : current_runlevel] to [runlevel]")
- current_runlevel = runlevel
+/datum/controller/master/proc/SetRunLevel(new_runlevel)
+ var/old_runlevel = current_runlevel
+ if(isnull(old_runlevel))
+ old_runlevel = "NULL"
+
+ testing("MC: Runlevel changed from [old_runlevel] to [new_runlevel]")
+ current_runlevel = log(2, new_runlevel) + 1
+ if(current_runlevel < 1)
+ CRASH("Attempted to set invalid runlevel: [new_runlevel]")
// Starts the mc, and sticks around to restart it if the loop ever ends.
/datum/controller/master/proc/StartProcessing(delay)
@@ -233,7 +240,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
timer += world.tick_lag * rand(1, 5)
SS.next_fire = timer
continue
-
+
var/ss_runlevels = SS.runlevels
var/added_to_any = FALSE
for(var/I in 1 to GLOB.bitflags.len)
@@ -253,7 +260,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
for(var/I in runlevel_sorted_subsystems)
sortTim(runlevel_sorted_subsystems, /proc/cmp_subsystem_priority)
I += tickersubsystems
-
+
var/cached_runlevel = current_runlevel
var/list/current_runlevel_subsystems = runlevel_sorted_subsystems[cached_runlevel]
diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm
index 98e3ba2330c..31af608bfd4 100644
--- a/code/controllers/subsystem/atoms.dm
+++ b/code/controllers/subsystem/atoms.dm
@@ -150,9 +150,9 @@ SUBSYSTEM_DEF(atoms)
/datum/controller/subsystem/atoms/Shutdown()
var/initlog = InitLog()
if(initlog)
- log_world(initlog)
+ text2file("[GLOB.log_directory]/initialize.log", initlog)
#undef BAD_INIT_QDEL_BEFORE
#undef BAD_INIT_DIDNT_INIT
#undef BAD_INIT_SLEPT
-#undef BAD_INIT_NO_HINT
\ No newline at end of file
+#undef BAD_INIT_NO_HINT
diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm
index 5b2c67c2969..76daddcf6a4 100644
--- a/code/controllers/subsystem/blackbox.dm
+++ b/code/controllers/subsystem/blackbox.dm
@@ -54,6 +54,8 @@ SUBSYSTEM_DEF(blackbox)
return FALSE
/datum/controller/subsystem/blackbox/Shutdown()
+ set_val("ahelp_unresolved", GLOB.ahelp_tickets.active_tickets.len)
+
var/pda_msg_amt = 0
var/rc_msg_amt = 0
@@ -87,7 +89,7 @@ SUBSYSTEM_DEF(blackbox)
var/list/sqlrowlist = list()
for (var/datum/feedback_variable/FV in feedback)
- sqlrowlist += list("time" = "Now()", "round_id" = GLOB.round_id, "var_name" = "'[sanitizeSQL(FV.get_variable())]'", "var_value" = FV.get_value(), "details" = "'[sanitizeSQL(FV.get_details())]'")
+ sqlrowlist += list(list("time" = "Now()", "round_id" = GLOB.round_id, "var_name" = "'[sanitizeSQL(FV.get_variable())]'", "var_value" = FV.get_value(), "details" = "'[sanitizeSQL(FV.get_details())]'"))
if (!length(sqlrowlist))
return
diff --git a/code/controllers/subsystem/fields.dm b/code/controllers/subsystem/fields.dm
new file mode 100644
index 00000000000..8e9f387478a
--- /dev/null
+++ b/code/controllers/subsystem/fields.dm
@@ -0,0 +1,27 @@
+
+SUBSYSTEM_DEF(fields)
+ name = "Fields"
+ wait = 2
+ priority = 40
+ flags = SS_KEEP_TIMING
+ var/list/datum/proximity_monitor/advanced/running = list()
+ var/list/datum/proximity_monitor/advanced/currentrun = list()
+
+/datum/controller/subsystem/fields/fire(resumed = 0)
+ if(!resumed)
+ src.currentrun = running.Copy()
+ var/list/currentrun = src.currentrun
+ while(currentrun.len)
+ var/datum/proximity_monitor/advanced/F = currentrun[currentrun.len]
+ currentrun.len--
+ if(!F.requires_processing)
+ continue
+ F.process()
+ if(MC_TICK_CHECK)
+ return
+
+/datum/controller/subsystem/fields/proc/register_new_field(datum/proximity_monitor/advanced/F)
+ running += F
+
+/datum/controller/subsystem/fields/proc/unregister_field(datum/proximity_monitor/advanced/F)
+ running -= F
diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm
index 628c6a14eac..84d79009c05 100644
--- a/code/controllers/subsystem/garbage.dm
+++ b/code/controllers/subsystem/garbage.dm
@@ -61,7 +61,7 @@ SUBSYSTEM_DEF(garbage)
for(var/path in sleptDestroy)
dellog += "Path : [path] \n"
dellog += "Sleeps : [sleptDestroy[path]] \n"
- log_world(dellog.Join())
+ text2file("[GLOB.log_directory]/qdel.log", dellog.Join())
/datum/controller/subsystem/garbage/fire()
HandleToBeQueued()
diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm
index a24d952b9dc..3400c6b9509 100644
--- a/code/controllers/subsystem/server_maint.dm
+++ b/code/controllers/subsystem/server_maint.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(server_maint)
wait = 6
flags = SS_POST_FIRE_TIMING
priority = 10
+ init_order = INIT_ORDER_SERVER_MAINT
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
var/list/currentrun
@@ -37,4 +38,11 @@ SUBSYSTEM_DEF(server_maint)
if (MC_TICK_CHECK) //one day, when ss13 has 1000 people per server, you guys are gonna be glad I added this tick check
return
+/datum/controller/subsystem/server_maint/Shutdown()
+ kick_clients_in_lobby("The round came to an end with you in the lobby.", TRUE) //second parameter ensures only afk clients are kicked
+ for(var/thing in GLOB.clients)
+ var/client/C = thing
+ if(C && config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite
+ C << link("byond://[config.server]")
+
#undef PING_BUFFER_TIME
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index e3c8f47471e..dab36e8e33e 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -20,6 +20,7 @@ SUBSYSTEM_DEF(ticker)
var/login_music //music played in pregame lobby
var/round_end_sound //music/jingle played when the world reboots
+ var/round_end_sound_sent = TRUE //If all clients have loaded it
var/list/datum/mind/minds = list() //The characters in the game. Used for objective tracking.
@@ -61,6 +62,7 @@ SUBSYSTEM_DEF(ticker)
var/list/round_start_events
/datum/controller/subsystem/ticker/Initialize(timeofday)
+ load_mode()
var/list/music = world.file2list(ROUND_START_MUSIC_LIST, "\n")
login_music = pick(music)
@@ -616,9 +618,9 @@ SUBSYSTEM_DEF(ticker)
sleep(50)
if(mode.station_was_nuked)
- world.Reboot("Station destroyed by Nuclear Device.", "end_proper", "nuke")
+ Reboot("Station destroyed by Nuclear Device.", "end_proper", "nuke")
else
- world.Reboot("Round ended.", "end_proper", "proper completion")
+ Reboot("Round ended.", "end_proper", "proper completion")
/datum/controller/subsystem/ticker/proc/send_tip_of_the_round()
var/m
@@ -779,3 +781,69 @@ SUBSYSTEM_DEF(ticker)
start_at = world.time + newtime
else
timeLeft = newtime
+
+/datum/controller/subsystem/ticker/proc/load_mode()
+ var/mode = trim(file2text("data/mode.txt"))
+ if(mode)
+ GLOB.master_mode = mode
+ else
+ GLOB.master_mode = "extended"
+ log_game("Saved mode is '[GLOB.master_mode]'")
+
+/datum/controller/subsystem/ticker/proc/save_mode(the_mode)
+ var/F = file("data/mode.txt")
+ fdel(F)
+ F << the_mode
+
+/datum/controller/subsystem/ticker/proc/SetRoundEndSound(the_sound)
+ set waitfor = FALSE
+ round_end_sound_sent = FALSE
+ round_end_sound = fcopy_rsc(the_sound)
+ for(var/thing in GLOB.clients)
+ var/client/C = thing
+ if (!C)
+ continue
+ C.Export("##action=load_rsc", round_end_sound)
+ round_end_sound_sent = TRUE
+
+/datum/controller/subsystem/ticker/proc/Reboot(reason, feedback_c, feedback_r, delay)
+ set waitfor = FALSE
+ if(usr && !check_rights(R_SERVER, TRUE))
+ return
+
+ if(!delay)
+ delay = config.round_end_countdown * 10
+
+ if(delay_end)
+ to_chat(world, "An admin has delayed the round end.")
+ return
+
+ to_chat(world, "Rebooting World in [delay/10] [(delay >= 10 && delay < 20) ? "second" : "seconds"]. [reason]")
+
+ var/start_wait = world.time
+ UNTIL(round_end_sound_sent && (world.time - start_wait) > (delay * 2)) //don't wait forever
+ sleep(delay - (world.time - start_wait))
+
+ if(delay_end)
+ to_chat(world, "Reboot was cancelled by an admin.")
+ return
+
+ SSblackbox.set_details("[feedback_c]","[feedback_r]")
+
+ log_game("Rebooting World. [reason]")
+
+ world.Reboot()
+
+/datum/controller/subsystem/ticker/Shutdown()
+ if(!round_end_sound)
+ round_end_sound = pick(\
+ 'sound/roundend/newroundsexy.ogg',
+ 'sound/roundend/apcdestroyed.ogg',
+ 'sound/roundend/bangindonk.ogg',
+ 'sound/roundend/leavingtg.ogg',
+ 'sound/roundend/its_only_game.ogg',
+ 'sound/roundend/yeehaw.ogg',
+ 'sound/roundend/disappointed.ogg'\
+ )
+
+ world << sound(round_end_sound)
\ No newline at end of file
diff --git a/code/controllers/subsystem/title.dm b/code/controllers/subsystem/title.dm
index d9f4ef99386..6c5466d8d9f 100644
--- a/code/controllers/subsystem/title.dm
+++ b/code/controllers/subsystem/title.dm
@@ -55,6 +55,12 @@ SUBSYSTEM_DEF(title)
var/F = file("data/previous_title.dat")
F << file_path
+ for(var/thing in GLOB.clients)
+ if(!thing)
+ continue
+ var/obj/screen/splash/S = new(thing, FALSE)
+ S.Fade(FALSE,FALSE)
+
/datum/controller/subsystem/title/Recover()
icon = SStitle.icon
splash_turf = SStitle.splash_turf
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index a914074a418..05c45988ca4 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -118,7 +118,7 @@ SUBSYSTEM_DEF(vote)
restart = 1
if("gamemode")
if(GLOB.master_mode != .)
- world.save_mode(.)
+ SSticker.save_mode(.)
if(SSticker.HasRoundStarted())
restart = 1
else
@@ -130,7 +130,7 @@ SUBSYSTEM_DEF(vote)
active_admins = 1
break
if(!active_admins)
- world.Reboot("Restart vote successful.", "end_error", "restart vote")
+ SSticker.Reboot("Restart vote successful.", "end_error", "restart vote")
else
to_chat(world, "Notice:Restart vote will not restart the server automatically because there are active admins on.")
message_admins("A restart vote has passed, but there are active admins on with +server, so it has been canceled. If you wish, you may restart the server.")
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 5a397fe3bda..ba3dc04f567 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -358,6 +358,59 @@
active = FALSE
..()
+/datum/action/item_action/initialize_ninja_suit
+ name = "Toggle ninja suit"
+
+/datum/action/item_action/ninjajaunt
+ name = "Phase Jaunt (10E)"
+ desc = "Utilizes the internal VOID-shift device to rapidly transit in direction facing."
+ button_icon_state = "ninja_phase"
+
+/datum/action/item_action/ninjasmoke
+ name = "Smoke Bomb"
+ desc = "Blind your enemies momentarily with a well-placed smoke bomb."
+ button_icon_state = "smoke"
+
+/datum/action/item_action/ninjaboost
+ name = "Adrenaline Boost"
+ desc = "Inject a secret chemical that will counteract all movement-impairing effect."
+ button_icon_state = "repulse"
+
+/datum/action/item_action/ninjapulse
+ name = "EM Burst (25E)"
+ desc = "Disable any nearby technology with a electro-magnetic pulse."
+ button_icon_state = "emp"
+
+/datum/action/item_action/ninjastar
+ name = "Create Throwing Stars (1E)"
+ desc = "Creates some throwing stars"
+ button_icon_state = "throwingstar"
+ icon_icon = 'icons/obj/weapons.dmi'
+
+/datum/action/item_action/ninjanet
+ name = "Energy Net (20E)"
+ desc = "Captures a fallen opponent in a net of energy. Will teleport them to a holding facility after 30 seconds."
+ button_icon_state = "energynet"
+ icon_icon = 'icons/effects/effects.dmi'
+
+/datum/action/item_action/ninja_sword_recall
+ name = "Recall Energy Katana (Variable Cost)"
+ desc = "Teleports the Energy Katana linked to this suit to its wearer, cost based on distance."
+ button_icon_state = "energy_katana"
+ icon_icon = 'icons/obj/weapons.dmi'
+
+/datum/action/item_action/ninja_stealth
+ name = "Toggle Stealth"
+ desc = "Toggles stealth mode on and off."
+ button_icon_state = "ninja_cloak"
+
+/datum/action/item_action/toggle_glove
+ name = "Toggle interaction"
+ desc = "Switch between normal interaction and drain mode."
+ button_icon_state = "s-ninjan"
+ icon_icon = 'icons/obj/clothing/gloves.dmi'
+
+
/datum/action/item_action/organ_action
check_flags = AB_CHECK_CONSCIOUS
diff --git a/code/datums/antagonists/ninja.dm b/code/datums/antagonists/ninja.dm
new file mode 100644
index 00000000000..d3b6da5b19c
--- /dev/null
+++ b/code/datums/antagonists/ninja.dm
@@ -0,0 +1,153 @@
+/datum/antagonist/ninja
+ name = "Ninja"
+ var/team
+ var/helping_station = 0
+ var/give_objectives = TRUE
+
+/datum/antagonist/ninja/friendly
+ helping_station = 1
+
+/datum/antagonist/ninja/friendly/noobjective
+ give_objectives = FALSE
+
+/datum/antagonist/ninja/New(datum/mind/new_owner)
+ if(new_owner && !ishuman(new_owner.current))//It's fine if we aren't passed a mind, but if we are, they have to be human.
+ throw EXCEPTION("Only humans and/or humanoids may be ninja'ed")
+ ..(new_owner)
+
+/datum/antagonist/ninja/randomAllegiance/New(datum/mind/new_owner)
+ ..(new_owner)
+ helping_station = rand(0,1)
+
+/datum/antagonist/ninja/proc/equip_space_ninja(mob/living/carbon/human/H = owner.current, safety=0)//Safety in case you need to unequip stuff for existing characters.
+ if(safety)
+ qdel(H.w_uniform)
+ qdel(H.wear_suit)
+ qdel(H.wear_mask)
+ qdel(H.head)
+ qdel(H.shoes)
+ qdel(H.gloves)
+
+ var/obj/item/clothing/suit/space/space_ninja/theSuit = new(H)
+ var/obj/item/weapon/katana/energy/EK = new(H)
+ theSuit.energyKatana = EK
+
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_ears)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/space_ninja(H), slot_shoes)
+ H.equip_to_slot_or_del(theSuit, slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/gloves/space_ninja(H), slot_gloves)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/space_ninja(H), slot_head)
+ H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/space_ninja(H), slot_wear_mask)
+ H.equip_to_slot_or_del(new /obj/item/clothing/glasses/night(H), slot_glasses)
+ H.equip_to_slot_or_del(EK, slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/device/flashlight(H), slot_r_store)
+ H.equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/x4(H), slot_l_store)
+ H.equip_to_slot_or_del(new /obj/item/weapon/tank/internals/emergency_oxygen(H), slot_s_store)
+ H.equip_to_slot_or_del(new /obj/item/weapon/tank/jetpack/carbondioxide(H), slot_back)
+ theSuit.randomize_param()
+
+ var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(H)
+ E.implant(H)
+ return 1
+
+/datum/antagonist/ninja/proc/addMemories()
+ owner.store_memory("I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!")
+ owner.store_memory("Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!")
+ owner.store_memory("Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.")
+
+/datum/antagonist/ninja/proc/addObjectives(quantity = 6)
+ var/list/possible_targets = list()
+ for(var/datum/mind/M in SSticker.minds)
+ if(M.current && M.current.stat != DEAD)
+ if(ishuman(M.current))
+ if(M.special_role)
+ possible_targets[M] = 0 //bad-guy
+ else if(M.assigned_role in GLOB.command_positions)
+ possible_targets[M] = 1 //good-guy
+
+ var/list/objectives = list(1,2,3,4)
+ while(owner.objectives.len < quantity)
+ switch(pick_n_take(objectives))
+ if(1) //research
+ var/datum/objective/download/O = new /datum/objective/download()
+ O.owner = owner
+ O.gen_amount_goal()
+ owner.objectives += O
+
+ if(2) //steal
+ var/datum/objective/steal/special/O = new /datum/objective/steal/special()
+ O.owner = owner
+ owner.objectives += O
+
+ if(3) //protect/kill
+ if(!possible_targets.len) continue
+ var/index = rand(1,possible_targets.len)
+ var/datum/mind/M = possible_targets[index]
+ var/is_bad_guy = possible_targets[M]
+ possible_targets.Cut(index,index+1)
+
+ if(is_bad_guy ^ helping_station) //kill (good-ninja + bad-guy or bad-ninja + good-guy)
+ var/datum/objective/assassinate/O = new /datum/objective/assassinate()
+ O.owner = owner
+ O.target = M
+ O.explanation_text = "Slay \the [M.current.real_name], the [M.assigned_role]."
+ owner.objectives += O
+ else //protect
+ var/datum/objective/protect/O = new /datum/objective/protect()
+ O.owner = owner
+ O.target = M
+ O.explanation_text = "Protect \the [M.current.real_name], the [M.assigned_role], from harm."
+ owner.objectives += O
+ if(4) //debrain/capture
+ if(!possible_targets.len) continue
+ var/selected = rand(1,possible_targets.len)
+ var/datum/mind/M = possible_targets[selected]
+ var/is_bad_guy = possible_targets[M]
+ possible_targets.Cut(selected,selected+1)
+
+ if(is_bad_guy ^ helping_station) //debrain (good-ninja + bad-guy or bad-ninja + good-guy)
+ var/datum/objective/debrain/O = new /datum/objective/debrain()
+ O.owner = owner
+ O.target = M
+ O.explanation_text = "Steal the brain of [M.current.real_name]."
+ owner.objectives += O
+ else //capture
+ var/datum/objective/capture/O = new /datum/objective/capture()
+ O.owner = owner
+ O.gen_amount_goal()
+ owner.objectives += O
+ else
+ break
+ var/datum/objective/O = new /datum/objective/survive()
+ O.owner = owner
+ owner.objectives += O
+
+
+/proc/remove_ninja(mob/living/L)
+ if(!L || !L.mind)
+ return FALSE
+ var/datum/antagonist/datum = L.mind.has_antag_datum(ANTAG_DATUM_NINJA)
+ datum.on_removal()
+ return TRUE
+
+/proc/add_ninja(mob/living/carbon/human/H, type = ANTAG_DATUM_NINJA_RANDOM)
+ if(!H || !H.mind)
+ return FALSE
+ return H.mind.add_antag_datum(type)
+
+/proc/is_ninja(mob/living/M)
+ return M && M.mind && M.mind.has_antag_datum(ANTAG_DATUM_NINJA)
+
+
+/datum/antagonist/ninja/greet()
+ owner.current << sound('sound/effects/ninja_greeting.ogg')
+ to_chat(owner.current, "I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!")
+ to_chat(owner.current, "Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!")
+ to_chat(owner.current, "Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.")
+ return
+
+/datum/antagonist/ninja/on_gain()
+ if(give_objectives)
+ addObjectives()
+ addMemories()
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index 3ba7efb4c98..35bc4bc33a0 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -737,18 +737,6 @@
src.give_disease(M)
href_list["datumrefresh"] = href_list["give_spell"]
- else if(href_list["ninja"])
- if(!check_rights(R_FUN))
- return
-
- var/mob/M = locate(href_list["ninja"])
- if(!istype(M))
- to_chat(usr, "This can only be used on instances of type /mob")
- return
-
- src.cmd_admin_ninjafy(M)
- href_list["datumrefresh"] = href_list["ninja"]
-
else if(href_list["gib"])
if(!check_rights(R_FUN))
return
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index 5b8b77cf8a5..8fc9e05fd18 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -36,7 +36,7 @@ Bonus
/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A)
var/heal_amt = 0.5
if(M.toxloss > 0 && prob(20))
- new /obj/effect/overlay/temp/heal(get_turf(M), "#66FF99")
+ new /obj/effect/temp_visual/heal(get_turf(M), "#66FF99")
M.adjustToxLoss(-heal_amt)
return 1
@@ -67,7 +67,7 @@ Bonus
/datum/symptom/heal/plus/Heal(mob/living/M, datum/disease/advance/A)
var/heal_amt = 1
if(M.toxloss > 0 && prob(20))
- new /obj/effect/overlay/temp/heal(get_turf(M), "#00FF00")
+ new /obj/effect/temp_visual/heal(get_turf(M), "#00FF00")
M.adjustToxLoss(-heal_amt)
return 1
@@ -110,7 +110,7 @@ Bonus
M.update_damage_overlays()
if(prob(20))
- new /obj/effect/overlay/temp/heal(get_turf(M), "#FF3333")
+ new /obj/effect/temp_visual/heal(get_turf(M), "#FF3333")
return 1
@@ -148,7 +148,7 @@ Bonus
if(M.getCloneLoss() > 0)
M.adjustCloneLoss(-1)
M.take_bodypart_damage(0, 1) //Deals BURN damage, which is not cured by this symptom
- new /obj/effect/overlay/temp/heal(get_turf(M), "#33FFCC")
+ new /obj/effect/temp_visual/heal(get_turf(M), "#33FFCC")
if(!parts.len)
return
@@ -158,7 +158,7 @@ Bonus
M.update_damage_overlays()
if(prob(20))
- new /obj/effect/overlay/temp/heal(get_turf(M), "#CC1100")
+ new /obj/effect/temp_visual/heal(get_turf(M), "#CC1100")
return 1
@@ -201,7 +201,7 @@ Bonus
M.update_damage_overlays()
if(prob(20))
- new /obj/effect/overlay/temp/heal(get_turf(M), "#FF9933")
+ new /obj/effect/temp_visual/heal(get_turf(M), "#FF9933")
return 1
@@ -248,7 +248,7 @@ Bonus
M.update_damage_overlays()
if(prob(20))
- new /obj/effect/overlay/temp/heal(get_turf(M), "#CC6600")
+ new /obj/effect/temp_visual/heal(get_turf(M), "#CC6600")
return 1
diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm
index 24774da158d..9177f87f07f 100644
--- a/code/datums/holocall.dm
+++ b/code/datums/holocall.dm
@@ -30,6 +30,7 @@
var/obj/machinery/holopad/H = I
if(!QDELETED(H) && H.is_operational())
dialed_holopads += H
+ H.say("Incoming call.")
LAZYADD(H.holo_calls, src)
if(!dialed_holopads.len)
@@ -41,12 +42,16 @@
//cleans up ALL references :)
/datum/holocall/Destroy()
- QDEL_NULL(eye)
-
user.reset_perspective()
+ if(user.client)
+ for(var/datum/camerachunk/chunk in eye.visibleCameraChunks)
+ user.client.images -= chunk.obscured
+ user.remote_control = null
+ QDEL_NULL(eye)
user = null
- hologram.HC = null
+ if(hologram)
+ hologram.HC = null
hologram = null
calling_holopad.outgoing_call = null
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index d3058fafe94..04bec0a7a43 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -326,7 +326,8 @@
"traitor", // "traitorchan",
"monkey",
"clockcult",
- "devil"
+ "devil",
+ "ninja"
)
var/text = ""
@@ -614,9 +615,27 @@
text += "|Disabled in Prefs"
sections["devil"] = text
+/** NINJA ***/
+ text = "ninja"
+ if(SSticker.mode.config_tag == "ninja")
+ text = uppertext(text)
+ text = "[text]: "
+ var/datum/antagonist/ninja/ninjainfo = has_antag_datum(ANTAG_DATUM_NINJA)
+ if(ninjainfo)
+ if(ninjainfo.helping_station)
+ text += "employee | syndicate | NANOTRASEN | EQUIP"
+ else
+ text += "employee | SYNDICATE | nanotrasen | EQUIP"
+ else
+ text += "EMPLOYEE | syndicate | nanotrasen | random allegiance"
+ if(current && current.client && (ROLE_NINJA in current.client.prefs.be_special))
+ text += " | Enabled in Prefs"
+ else
+ text += " | Disabled in Prefs"
+ sections["ninja"] = text
- /** SILICON ***/
+/** SILICON ***/
if(issilicon(current))
text = "silicon"
var/mob/living/silicon/robot/robot = current
@@ -1202,7 +1221,28 @@
else
to_chat(usr, "This only works on humans!")
return
-
+ else if(href_list["ninja"])
+ var/datum/antagonist/ninja/ninjainfo = has_antag_datum(ANTAG_DATUM_NINJA)
+ switch(href_list["ninja"])
+ if("clear")
+ remove_ninja(current)
+ message_admins("[key_name_admin(usr)] has de-ninja'ed [current].")
+ log_admin("[key_name(usr)] has de-ninja'ed [current].")
+ if("equip")
+ ninjainfo.equip_space_ninja()
+ return
+ if("nanotrasen")
+ add_ninja(current, ANTAG_DATUM_NINJA_FRIENDLY)
+ message_admins("[key_name_admin(usr)] has friendly ninja'ed [current].")
+ log_admin("[key_name(usr)] has friendly ninja'ed [current].")
+ if("syndicate")
+ add_ninja(current, ANTAG_DATUM_NINJA)
+ message_admins("[key_name_admin(usr)] has syndie ninja'ed [current].")
+ log_admin("[key_name(usr)] has syndie ninja'ed [current].")
+ if("random")
+ add_ninja(current)
+ message_admins("[key_name_admin(usr)] has random ninja'ed [current].")
+ log_admin("[key_name(usr)] has random ninja'ed [current].")
else if(href_list["abductor"])
switch(href_list["abductor"])
if("clear")
@@ -1330,7 +1370,7 @@
obj_count++
/datum/mind/proc/find_syndicate_uplink()
- var/list/L = current.get_contents()
+ var/list/L = current.GetAllContents()
for (var/obj/item/I in L)
if (I.hidden_uplink)
return I.hidden_uplink
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 23deaf99621..af9672c3df2 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -42,6 +42,30 @@
return FALSE //PLEASE no.
if((var_name in careful_edits) && (var_value % world.icon_size) != 0)
return FALSE
+ switch(var_name)
+ if("x")
+ var/turf/T = locate(var_value, y, z)
+ if(T)
+ forceMove(T)
+ return TRUE
+ return FALSE
+ if("y")
+ var/turf/T = locate(x, var_value, z)
+ if(T)
+ forceMove(T)
+ return TRUE
+ return FALSE
+ if("z")
+ var/turf/T = locate(x, y, var_value)
+ if(T)
+ forceMove(T)
+ return TRUE
+ return FALSE
+ if("loc")
+ if(var_value == null || istype(var_value, /atom))
+ forceMove(var_value)
+ return TRUE
+ return FALSE
return ..()
/atom/movable/Move(atom/newloc, direct = 0)
@@ -602,6 +626,10 @@
var/datum/language_holder/H = get_language_holder()
. = H.has_language(dt)
+/atom/movable/proc/copy_known_languages_from(thing, replace=FALSE)
+ var/datum/language_holder/H = get_language_holder()
+ . = H.copy_known_languages_from(thing, replace)
+
// Whether an AM can speak in a language or not, independent of whether
// it KNOWS the language
/atom/movable/proc/could_speak_in_language(datum/language/dt)
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index 46853995cb3..8ad8861cbd5 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -32,7 +32,7 @@
/mob/living/simple_animal/hostile/blob/blob_act(obj/structure/blob/B)
if(stat != DEAD && health < maxHealth)
for(var/i in 1 to 2)
- var/obj/effect/overlay/temp/heal/H = new /obj/effect/overlay/temp/heal(get_turf(src)) //hello yes you are being healed
+ var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src)) //hello yes you are being healed
if(overmind)
H.color = overmind.blob_reagent_datum.complementary_color
else
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index f9eb16c7a92..e80e92337ed 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -140,7 +140,7 @@
loc.blob_act(src) //don't ask how a wall got on top of the core, just eat it
/obj/structure/blob/proc/blob_attack_animation(atom/A = null, controller) //visually attacks an atom
- var/obj/effect/overlay/temp/blob/O = new /obj/effect/overlay/temp/blob(src.loc)
+ var/obj/effect/temp_visual/blob/O = new /obj/effect/temp_visual/blob(src.loc)
O.setDir(dir)
if(controller)
var/mob/camera/blob/BO = controller
@@ -208,7 +208,7 @@
if(overmind)
overmind.blob_reagent_datum.emp_reaction(src, severity)
if(prob(100 - severity * 30))
- new /obj/effect/overlay/temp/emp(get_turf(src))
+ new /obj/effect/temp_visual/emp(get_turf(src))
/obj/structure/blob/tesla_act(power)
..()
diff --git a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm
index cf709f09b0d..7d8c3eb1f97 100644
--- a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm
+++ b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm
@@ -73,7 +73,7 @@
L.visible_message("[src] appears around [L] in a burst of light!", \
"[target_flashed ? "An unseen force":"The glowing sigil around you"] holds you in place!")
L.Stun(5)
- new /obj/effect/overlay/temp/ratvar/sigil/transgression(get_turf(src))
+ new /obj/effect/temp_visual/ratvar/sigil/transgression(get_turf(src))
qdel(src)
@@ -102,7 +102,7 @@
L.visible_message("[src] begins to glow a piercing magenta!", "You feel something start to invade your mind...")
var/oldcolor = color
animate(src, color = "#AF0AAF", time = convert_time)
- var/obj/effect/overlay/temp/ratvar/sigil/glow
+ var/obj/effect/temp_visual/ratvar/sigil/glow
if(glow_type)
glow = new glow_type(get_turf(src))
animate(glow, alpha = 255, time = convert_time)
@@ -158,7 +158,7 @@
light_color = "#A97F1B"
delete_on_finish = FALSE
sigil_name = "Sigil of Accession"
- glow_type = /obj/effect/overlay/temp/ratvar/sigil/accession
+ glow_type = /obj/effect/temp_visual/ratvar/sigil/accession
resist_string = "glows bright orange"
/obj/effect/clockwork/sigil/submission/accession/post_channel(mob/living/L)
@@ -321,14 +321,14 @@
while(L && (!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && (GLOB.ratvar_awakens || vitality))) && get_turf(L) == get_turf(src))
sigil_active = TRUE
if(animation_number >= 4)
- new /obj/effect/overlay/temp/ratvar/sigil/vitality(get_turf(src))
+ new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src))
animation_number = 0
animation_number++
if(!is_servant_of_ratvar(L))
var/vitality_drained = 0
if(L.stat == DEAD)
vitality_drained = L.maxHealth
- var/obj/effect/overlay/temp/ratvar/sigil/vitality/V = new /obj/effect/overlay/temp/ratvar/sigil/vitality(get_turf(src))
+ var/obj/effect/temp_visual/ratvar/sigil/vitality/V = new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src))
animate(V, alpha = 0, transform = matrix()*2, time = 8)
playsound(L, 'sound/magic/WandODeath.ogg', 50, 1)
L.visible_message("[L] collapses in on [L.p_them()]self as [src] flares bright blue!")
@@ -356,7 +356,7 @@
if(ghost)
ghost.reenter_corpse()
L.revive(1, 1)
- var/obj/effect/overlay/temp/ratvar/sigil/vitality/V = new /obj/effect/overlay/temp/ratvar/sigil/vitality(get_turf(src))
+ var/obj/effect/temp_visual/ratvar/sigil/vitality/V = new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src))
animate(V, alpha = 0, transform = matrix()*2, time = 8)
playsound(L, 'sound/magic/Staff_Healing.ogg', 50, 1)
L.visible_message("[L] suddenly gets back up, [GLOB.ratvar_awakens ? "[L.p_their()] body dripping blue ichor":"even as [src] scatters into blue sparks around [L.p_them()]"]!", \
diff --git a/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm b/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm
index 120ed0ff601..ec35ae4c5b8 100644
--- a/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm
+++ b/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm
@@ -124,15 +124,15 @@
/proc/get_component_animation_type(id)
switch(id)
if(BELLIGERENT_EYE)
- return /obj/effect/overlay/temp/ratvar/component
+ return /obj/effect/temp_visual/ratvar/component
if(VANGUARD_COGWHEEL)
- return /obj/effect/overlay/temp/ratvar/component/cogwheel
+ return /obj/effect/temp_visual/ratvar/component/cogwheel
if(GEIS_CAPACITOR)
- return /obj/effect/overlay/temp/ratvar/component/capacitor
+ return /obj/effect/temp_visual/ratvar/component/capacitor
if(REPLICANT_ALLOY)
- return /obj/effect/overlay/temp/ratvar/component/alloy
+ return /obj/effect/temp_visual/ratvar/component/alloy
if(HIEROPHANT_ANSIBLE)
- return /obj/effect/overlay/temp/ratvar/component/ansible
+ return /obj/effect/temp_visual/ratvar/component/ansible
else
return null
diff --git a/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm b/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm
index 529f38d832f..7e1574726c6 100644
--- a/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm
+++ b/code/game/gamemodes/clock_cult/clock_helpers/proselytizer_helpers.dm
@@ -5,48 +5,48 @@
//otherwise, return literally any non-list thing but preferably FALSE
//returning TRUE won't produce the "cannot be proselytized" message and will still prevent proselytizing
-/atom/proc/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/atom/proc/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
return FALSE
//Turf conversion
-/turf/closed/wall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) //four sheets of metal
+/turf/closed/wall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //four sheets of metal
return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 4), "spawn_dir" = SOUTH)
-/turf/closed/wall/mineral/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) //two sheets of metal
+/turf/closed/wall/mineral/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //two sheets of metal
return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 2), "spawn_dir" = SOUTH)
-/turf/closed/wall/mineral/iron/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) //two sheets of metal, five rods
+/turf/closed/wall/mineral/iron/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //two sheets of metal, five rods
return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 2) - (POWER_ROD * 5), "spawn_dir" = SOUTH)
-/turf/closed/wall/mineral/cult/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) //no metal
+/turf/closed/wall/mineral/cult/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //no metal
return list("operation_time" = 80, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL, "spawn_dir" = SOUTH)
-/turf/closed/wall/shuttle/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) //two sheets of metal
+/turf/closed/wall/shuttle/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //two sheets of metal
return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 2), "spawn_dir" = SOUTH)
-/turf/closed/wall/r_wall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/turf/closed/wall/r_wall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
return FALSE
-/turf/closed/wall/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/turf/closed/wall/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
return list("operation_time" = 50, "new_obj_type" = /turf/open/floor/clockwork, "power_cost" = -POWER_WALL_MINUS_FLOOR, "spawn_dir" = SOUTH)
-/turf/open/floor/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/turf/open/floor/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
if(floor_tile == /obj/item/stack/tile/plasteel)
new floor_tile(src)
make_plating()
playsound(src, 'sound/items/Crowbar.ogg', 10, 1) //clink
return list("operation_time" = 30, "new_obj_type" = /turf/open/floor/clockwork, "power_cost" = POWER_FLOOR, "spawn_dir" = SOUTH)
-/turf/open/floor/plating/asteroid/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/turf/open/floor/plating/asteroid/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
return FALSE
-/turf/open/floor/plating/ashplanet/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/turf/open/floor/plating/ashplanet/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
return FALSE
-/turf/open/floor/plating/lava/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/turf/open/floor/plating/lava/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
return FALSE
-/turf/open/floor/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/turf/open/floor/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
if(locate(/obj/structure/table) in src)
return FALSE
if(is_blocked_turf(src, TRUE))
@@ -58,7 +58,7 @@
return list("operation_time" = operation_time, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_MINUS_FLOOR, "spawn_dir" = SOUTH)
//False wall conversion
-/obj/structure/falsewall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/structure/falsewall/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
var/cost = POWER_WALL_MINUS_FLOOR
if(ispath(mineral, /obj/item/stack/sheet/metal))
cost -= (POWER_METAL * (2 + mineral_amount)) //four sheets of metal, plus an assumption that the girder is also two
@@ -66,17 +66,17 @@
cost -= (POWER_METAL * 2) //anything that doesn't use metal just has the girder
return list("operation_time" = 50, "new_obj_type" = /obj/structure/falsewall/brass, "power_cost" = cost, "spawn_dir" = SOUTH)
-/obj/structure/falsewall/iron/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer) //two sheets of metal, two rods; special assumption
+/obj/structure/falsewall/iron/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent) //two sheets of metal, two rods; special assumption
return list("operation_time" = 50, "new_obj_type" = /obj/structure/falsewall/brass, "power_cost" = POWER_WALL_MINUS_FLOOR - (POWER_METAL * 2) - (POWER_ROD * 2), "spawn_dir" = SOUTH)
-/obj/structure/falsewall/reinforced/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/structure/falsewall/reinforced/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
return FALSE
-/obj/structure/falsewall/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/structure/falsewall/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
return FALSE
//Metal conversion
-/obj/item/stack/tile/plasteel/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/item/stack/tile/plasteel/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
if(source)
return FALSE
var/amount_temp = get_amount()
@@ -90,7 +90,7 @@
no_delete = TRUE
use(amount_temp)
amount_temp *= 12.5 //each tile is 12.5 power so this is 2 tiles to 25 power
- return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -amount_temp, "spawn_dir" = SOUTH, "no_target_deletion" = no_delete)
+ return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -amount_temp, "spawn_dir" = SOUTH, "no_target_deletion" = no_delete)
if(amount_temp >= 20)
var/sheets_to_make = round(amount_temp * 0.05) //and 20 to 1 brass
var/used = sheets_to_make * 20
@@ -104,11 +104,11 @@
to_chat(user, "You need at least 20 floor tiles to convert into brass.")
return TRUE
-/obj/item/stack/rods/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/item/stack/rods/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
if(source)
return FALSE
if(proselytizer.metal_to_power)
- return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_ROD), "spawn_dir" = SOUTH)
+ return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_ROD), "spawn_dir" = SOUTH)
if(get_amount() >= 10)
var/sheets_to_make = round(get_amount() * 0.1)
var/used = sheets_to_make * 10
@@ -122,11 +122,11 @@
to_chat(user, "You need at least 10 rods to convert into brass.")
return TRUE
-/obj/item/stack/sheet/metal/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/item/stack/sheet/metal/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
if(source)
return FALSE
if(proselytizer.metal_to_power)
- return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_METAL), "spawn_dir" = SOUTH)
+ return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_METAL), "spawn_dir" = SOUTH)
if(get_amount() >= 5)
var/sheets_to_make = round(get_amount() * 0.2)
var/used = sheets_to_make * 5
@@ -140,11 +140,11 @@
to_chat(user, "You need at least 5 sheets of metal to convert into brass.")
return TRUE
-/obj/item/stack/sheet/plasteel/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/item/stack/sheet/plasteel/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
if(source)
return FALSE
if(proselytizer.metal_to_power)
- return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_PLASTEEL), "spawn_dir" = SOUTH)
+ return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_PLASTEEL), "spawn_dir" = SOUTH)
if(get_amount() >= 2)
var/sheets_to_make = round(get_amount() * 0.5)
var/used = sheets_to_make * 2
@@ -159,23 +159,23 @@
return TRUE
//Brass directly to power
-/obj/item/stack/tile/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/item/stack/tile/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
if(source)
return FALSE
- return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_FLOOR), "spawn_dir" = SOUTH)
+ return list("operation_time" = 0, "new_obj_type" = /obj/effect/temp_visual/ratvar/beam/itemconsume, "power_cost" = -(amount*POWER_FLOOR), "spawn_dir" = SOUTH)
//Airlock conversion
-/obj/machinery/door/airlock/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/machinery/door/airlock/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
var/doortype = /obj/machinery/door/airlock/clockwork
if(glass)
doortype = /obj/machinery/door/airlock/clockwork/brass
return list("operation_time" = 60, "new_obj_type" = doortype, "power_cost" = POWER_WALL_TOTAL, "spawn_dir" = dir)
-/obj/machinery/door/airlock/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/machinery/door/airlock/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
return FALSE
//Table conversion
-/obj/structure/table/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/structure/table/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
var/prosel_cost = POWER_STANDARD
if(framestack == /obj/item/stack/rods)
prosel_cost -= POWER_ROD*framestackamount
@@ -187,10 +187,10 @@
prosel_cost -= POWER_PLASTEEL*buildstackamount
return list("operation_time" = 20, "new_obj_type" = /obj/structure/table/reinforced/brass, "power_cost" = prosel_cost, "spawn_dir" = SOUTH)
-/obj/structure/table/reinforced/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/structure/table/reinforced/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
return FALSE
-/obj/structure/table_frame/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/structure/table_frame/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
var/prosel_cost = POWER_FLOOR
if(framestack == /obj/item/stack/rods)
prosel_cost -= POWER_ROD*framestackamount
@@ -198,11 +198,11 @@
prosel_cost -= POWER_FLOOR*framestackamount
return list("operation_time" = 10, "new_obj_type" = /obj/structure/table_frame/brass, "power_cost" = prosel_cost, "spawn_dir" = SOUTH)
-/obj/structure/table_frame/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/structure/table_frame/brass/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
return FALSE
//Window conversion
-/obj/structure/window/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/structure/window/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
var/windowtype = /obj/structure/window/reinforced/clockwork
var/new_dir = TRUE
var/prosel_time = 15
@@ -220,18 +220,18 @@
INVOKE_ASYNC(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/proselytize, G, user)
return list("operation_time" = prosel_time, "new_obj_type" = windowtype, "power_cost" = prosel_cost, "spawn_dir" = dir, "dir_in_new" = new_dir)
-/obj/structure/window/reinforced/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/structure/window/reinforced/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
return FALSE
//Windoor conversion
-/obj/machinery/door/window/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/machinery/door/window/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
return list("operation_time" = 30, "new_obj_type" = /obj/machinery/door/window/clockwork, "power_cost" = POWER_STANDARD, "spawn_dir" = dir, "dir_in_new" = TRUE)
-/obj/machinery/door/window/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/machinery/door/window/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
return FALSE
//Grille conversion
-/obj/structure/grille/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/structure/grille/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
var/grilletype = /obj/structure/grille/ratvar
var/prosel_time = 15
if(broken)
@@ -239,32 +239,32 @@
prosel_time = 5
return list("operation_time" = prosel_time, "new_obj_type" = grilletype, "power_cost" = 0, "spawn_dir" = dir)
-/obj/structure/grille/ratvar/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/structure/grille/ratvar/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
return FALSE
//Lattice conversion
-/obj/structure/lattice/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/structure/lattice/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
return list("operation_time" = 0, "new_obj_type" = /obj/structure/lattice/clockwork, "power_cost" = 0, "spawn_dir" = SOUTH, "no_target_deletion" = TRUE)
-/obj/structure/lattice/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/structure/lattice/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
ratvar_act() //just in case we're the wrong type for some reason??
return FALSE
-/obj/structure/lattice/catwalk/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/structure/lattice/catwalk/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
return list("operation_time" = 0, "new_obj_type" = /obj/structure/lattice/catwalk/clockwork, "power_cost" = 0, "spawn_dir" = SOUTH, "no_target_deletion" = TRUE)
-/obj/structure/lattice/catwalk/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/structure/lattice/catwalk/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
return FALSE
//Girder conversion
-/obj/structure/girder/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/structure/girder/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
var/prosel_cost = POWER_GEAR - (POWER_METAL * 2)
if(state == GIRDER_REINF_STRUTS || state == GIRDER_REINF)
prosel_cost -= POWER_PLASTEEL
return list("operation_time" = 20, "new_obj_type" = /obj/structure/destructible/clockwork/wall_gear, "power_cost" = prosel_cost, "spawn_dir" = SOUTH)
//Hitting a clockwork structure will try to repair it.
-/obj/structure/destructible/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/structure/destructible/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
. = TRUE
var/list/repair_values = list()
if(!proselytizer.proselytizer_repair_checks(repair_values, src, user))
@@ -287,7 +287,7 @@
"You finish repairing [src]. It is now at [obj_integrity]/[max_integrity] integrity.")
//Hitting a sigil of transmission will try to charge from it.
-/obj/effect/clockwork/sigil/transmission/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/obj/effect/clockwork/sigil/transmission/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
. = TRUE
var/list/charge_values = list()
if(!proselytizer.sigil_charge_checks(charge_values, src, user))
@@ -337,7 +337,7 @@
adjustHealth(-amount)
//Hitting a ratvar'd silicon will also try to repair it.
-/mob/living/silicon/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/mob/living/silicon/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
. = TRUE
if(health == maxHealth) //if we're at maximum health, prosel the turf under us
return FALSE
@@ -346,7 +346,7 @@
"You finish repairin[src == user ? "g yourself. You are":"g [src]. [p_they(TRUE)] [p_are()]"] now at [abs(HEALTH_THRESHOLD_DEAD - health)]/[abs(HEALTH_THRESHOLD_DEAD - maxHealth)] health.")
//Same with clockwork mobs.
-/mob/living/simple_animal/hostile/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/mob/living/simple_animal/hostile/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
. = TRUE
if(health == maxHealth) //if we're at maximum health, prosel the turf under us
return FALSE
@@ -355,7 +355,7 @@
"You finish repairin[src == user ? "g yourself. You are":"g [src]. [p_they(TRUE)] [p_are()]"] now at [health]/[maxHealth] health.")
//Cogscarabs get special interaction because they're drones and have innate self-heals/revives.
-/mob/living/simple_animal/drone/cogscarab/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+/mob/living/simple_animal/drone/cogscarab/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent)
. = TRUE
if(stat == DEAD)
try_reactivate(user) //if we're at maximum health, prosel the turf under us
@@ -374,17 +374,36 @@
proselytizer.repairing = null
//Convert shards and gear bits directly to power
-/obj/item/clockwork/alloy_shards/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
- return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -POWER_STANDARD, "spawn_dir" = SOUTH)
+/obj/item/clockwork/alloy_shards/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount)
+ if(!power_amount)
+ power_amount = -POWER_STANDARD
+ if(proselytizer.can_use_power(power_amount))
+ var/obj/effect/temp_visual/ratvar/beam/itemconsume/B = new /obj/effect/temp_visual/ratvar/beam/itemconsume(get_turf(src))
+ B.pixel_x = pixel_x
+ B.pixel_y = pixel_y
+ if(!silent) //looper no looping
+ for(var/obj/item/clockwork/alloy_shards/S in get_turf(src)) //convert all other shards in the turf if we can
+ if(S == src)
+ continue //we want the shards to be proselytized after the main shard, thus this delay
+ addtimer(CALLBACK(proselytizer, /obj/item/clockwork/clockwork_proselytizer.proc/proselytize, S, user, TRUE), 0)
+ return list("operation_time" = 0, "new_obj_type" = null, "power_cost" = power_amount, "spawn_dir" = SOUTH)
-/obj/item/clockwork/alloy_shards/medium/gear_bit/large/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
- return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(CLOCKCULT_POWER_UNIT*0.08), "spawn_dir" = SOUTH)
+/obj/item/clockwork/alloy_shards/medium/gear_bit/large/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount)
+ if(!power_amount)
+ power_amount = -(CLOCKCULT_POWER_UNIT*0.08)
+ return ..()
-/obj/item/clockwork/alloy_shards/large/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
- return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(CLOCKCULT_POWER_UNIT*0.06), "spawn_dir" = SOUTH)
+/obj/item/clockwork/alloy_shards/large/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount)
+ if(!power_amount)
+ power_amount = -(CLOCKCULT_POWER_UNIT*0.06)
+ return ..()
-/obj/item/clockwork/alloy_shards/medium/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
- return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(CLOCKCULT_POWER_UNIT*0.04), "spawn_dir" = SOUTH)
+/obj/item/clockwork/alloy_shards/medium/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount)
+ if(!power_amount)
+ power_amount = -(CLOCKCULT_POWER_UNIT*0.04)
+ return ..()
-/obj/item/clockwork/alloy_shards/small/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
- return list("operation_time" = 0, "new_obj_type" = /obj/effect/overlay/temp/ratvar/beam/itemconsume, "power_cost" = -(CLOCKCULT_POWER_UNIT*0.02), "spawn_dir" = SOUTH)
+/obj/item/clockwork/alloy_shards/small/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer, silent, power_amount)
+ if(!power_amount)
+ power_amount = -(CLOCKCULT_POWER_UNIT*0.02)
+ return ..()
diff --git a/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm b/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm
index 57a68078df4..ccf7aead44a 100644
--- a/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm
+++ b/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm
@@ -124,7 +124,7 @@
L.adjustToxLoss(totaldamage * 0.5, TRUE, TRUE)
var/healseverity = max(round(totaldamage*0.05, 1), 1) //shows the general severity of the damage you just healed, 1 glow per 20
for(var/i in 1 to healseverity)
- new /obj/effect/overlay/temp/heal(targetturf, "#1E8CE1")
+ new /obj/effect/temp_visual/heal(targetturf, "#1E8CE1")
clockwork_say(ranged_ability_user, text2ratvar("Mend wounded flesh!"))
add_logs(ranged_ability_user, L, "healed with Sentinel's Compromise")
else
@@ -173,7 +173,7 @@
if(usable_power > 0 && C.cell.use(usable_power))
multiplier += (usable_power * 0.001)
qdel(VC)
- new/obj/effect/overlay/temp/ratvar/volt_hit/true(targetturf, ranged_ability_user, multiplier)
+ new/obj/effect/temp_visual/ratvar/volt_hit/true(targetturf, ranged_ability_user, multiplier)
add_logs(ranged_ability_user, targetturf, "fired a volt ray")
remove_ranged_ability()
diff --git a/code/game/gamemodes/clock_cult/clock_items/clock_components.dm b/code/game/gamemodes/clock_cult/clock_items/clock_components.dm
index 16cfef5d721..f64b361ac1b 100644
--- a/code/game/gamemodes/clock_cult/clock_items/clock_components.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/clock_components.dm
@@ -162,14 +162,15 @@
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/randomsinglesprite = FALSE
var/randomspritemax = 2
+ var/sprite_shift = 9
/obj/item/clockwork/alloy_shards/Initialize()
. = ..()
if(randomsinglesprite)
replace_name_desc()
icon_state = "[icon_state][rand(1, randomspritemax)]"
- pixel_x = rand(-9, 9)
- pixel_y = rand(-9, 9)
+ pixel_x = rand(-sprite_shift, sprite_shift)
+ pixel_y = rand(-sprite_shift, sprite_shift)
/obj/item/clockwork/alloy_shards/proc/replace_name_desc()
name = "replicant alloy shard"
@@ -177,16 +178,21 @@
clockwork_desc = "A broken shard of replicant alloy. Can be proselytized for additional power."
/obj/item/clockwork/alloy_shards/large
+ w_class = WEIGHT_CLASS_TINY
randomsinglesprite = TRUE
icon_state = "shard_large"
+ sprite_shift = 9
/obj/item/clockwork/alloy_shards/medium
+ w_class = WEIGHT_CLASS_TINY
randomsinglesprite = TRUE
icon_state = "shard_medium"
+ sprite_shift = 10
/obj/item/clockwork/alloy_shards/medium/gear_bit
randomspritemax = 4
icon_state = "gear_bit"
+ sprite_shift = 12
/obj/item/clockwork/alloy_shards/medium/gear_bit/replace_name_desc()
name = "gear bit"
@@ -200,9 +206,11 @@
name = "complex gear bit"
/obj/item/clockwork/alloy_shards/small
+ w_class = WEIGHT_CLASS_TINY
randomsinglesprite = TRUE
randomspritemax = 3
icon_state = "shard_small"
+ sprite_shift = 12
/obj/item/clockwork/alloy_shards/pinion_lock
name = "pinion lock"
diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm
index 60df56b6ef4..1d34ea2814c 100644
--- a/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_proselytizer.dm
@@ -178,21 +178,24 @@
return TRUE
//A note here; return values are for if we CAN BE PUT ON A TABLE, not IF WE ARE SUCCESSFUL, unless no_table_check is TRUE
-/obj/item/clockwork/clockwork_proselytizer/proc/proselytize(atom/target, mob/living/user, no_table_check)
+/obj/item/clockwork/clockwork_proselytizer/proc/proselytize(atom/target, mob/living/user, silent, no_table_check)
if(!target || !user)
return FALSE
if(repairing)
- to_chat(user, "You are currently repairing [repairing] with [src]!")
+ if(!silent)
+ to_chat(user, "You are currently repairing [repairing] with [src]!")
return FALSE
if(recharging)
- to_chat(user, "You are currently recharging [src] from the [recharging.sigil_name]!")
+ if(!silent)
+ to_chat(user, "You are currently recharging [src] from the [recharging.sigil_name]!")
return FALSE
- var/list/proselytize_values = target.proselytize_vals(user, src) //relevant values for proselytizing stuff, given as an associated list
+ var/list/proselytize_values = target.proselytize_vals(user, src, silent) //relevant values for proselytizing stuff, given as an associated list
if(!islist(proselytize_values))
if(proselytize_values != TRUE) //if we get true, fail, but don't send a message for whatever reason
if(!isturf(target)) //otherwise, if we didn't get TRUE and the original target wasn't a turf, try to proselytize the turf
return proselytize(get_turf(target), user, no_table_check)
- to_chat(user, "[target] cannot be proselytized!")
+ if(!silent)
+ to_chat(user, "[target] cannot be proselytized!")
if(!no_table_check)
return TRUE
return FALSE
@@ -207,19 +210,22 @@
var/target_type = target.type
- if(!proselytize_checks(proselytize_values, target, target_type, user))
+ if(!proselytize_checks(proselytize_values, target, target_type, user, silent))
return FALSE
proselytize_values["operation_time"] *= speed_multiplier
playsound(target, 'sound/machines/click.ogg', 50, 1)
if(proselytize_values["operation_time"])
- user.visible_message("[user]'s [name] begins tearing apart [target]!", "You begin proselytizing [target]...")
+ if(!silent)
+ user.visible_message("[user]'s [name] begins tearing apart [target]!", "You begin proselytizing [target]...")
if(!do_after(user, proselytize_values["operation_time"], target = target, extra_checks = CALLBACK(src, .proc/proselytize_checks, proselytize_values, target, target_type, user, TRUE)))
return FALSE
- user.visible_message("[user]'s [name] covers [target] in golden energy!", "You proselytize [target].")
+ if(!silent)
+ user.visible_message("[user]'s [name] covers [target] in golden energy!", "You proselytize [target].")
else
- user.visible_message("[user]'s [name] tears apart [target], covering it in golden energy!", "You proselytize [target].")
+ if(!silent)
+ user.visible_message("[user]'s [name] tears apart [target], covering it in golden energy!", "You proselytize [target].")
playsound(target, 'sound/items/Deconstruct.ogg', 50, 1)
var/new_thing_type = proselytize_values["new_obj_type"]
@@ -227,11 +233,12 @@
var/turf/T = target
T.ChangeTurf(new_thing_type)
else
- if(proselytize_values["dir_in_new"])
- new new_thing_type(get_turf(target), proselytize_values["spawn_dir"]) //please verify that your new object actually wants to get a dir in New()
- else
- var/atom/A = new new_thing_type(get_turf(target))
- A.setDir(proselytize_values["spawn_dir"])
+ if(new_thing_type)
+ if(proselytize_values["dir_in_new"])
+ new new_thing_type(get_turf(target), proselytize_values["spawn_dir"]) //please verify that your new object actually wants to get a dir in New()
+ else
+ var/atom/A = new new_thing_type(get_turf(target))
+ A.setDir(proselytize_values["spawn_dir"])
if(!proselytize_values["no_target_deletion"]) //for some cases where proselytize_vals() modifies the object but doesn't want it deleted
qdel(target)
modify_stored_power(-proselytize_values["power_cost"])
diff --git a/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm b/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm
index 976cd1cb4b3..a54b019d536 100644
--- a/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm
@@ -96,13 +96,13 @@
impale_cooldown = world.time + initial(impale_cooldown)
attack_cooldown = world.time + initial(attack_cooldown) //can't attack until we're done impaling
if(target)
- new /obj/effect/overlay/temp/dir_setting/bloodsplatter(get_turf(target), get_dir(user, target))
+ new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(target), get_dir(user, target))
target.Stun(2) //brief stun
to_chat(user, "You prepare to remove your ratvarian spear from [target]...")
var/remove_verb = pick("pull", "yank", "drag")
if(do_after(user, 10, 1, target))
var/turf/T = get_turf(target)
- var/obj/effect/overlay/temp/dir_setting/bloodsplatter/B = new /obj/effect/overlay/temp/dir_setting/bloodsplatter(T, get_dir(target, user))
+ var/obj/effect/temp_visual/dir_setting/bloodsplatter/B = new /obj/effect/temp_visual/dir_setting/bloodsplatter(T, get_dir(target, user))
playsound(T, 'sound/misc/splort.ogg', 200, 1)
playsound(T, 'sound/weapons/pierce.ogg', 200, 1)
if(target.stat != CONSCIOUS)
@@ -151,5 +151,5 @@
T = get_turf(src)
if(T) //make sure we're not in null or something
T.visible_message("[src] [pick("cracks in two and fades away", "snaps in two and dematerializes")]!")
- new /obj/effect/overlay/temp/ratvar/spearbreak(T)
+ new /obj/effect/temp_visual/ratvar/spearbreak(T)
qdel(src)
diff --git a/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm b/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm
index 6006c257243..376526febb4 100644
--- a/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm
+++ b/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm
@@ -150,7 +150,7 @@
if(iscarbon(host))
resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - host.health) / abs(HEALTH_THRESHOLD_DEAD - host.maxHealth)) * 100)
if(GLOB.ratvar_awakens || resulthealth <= MARAUDER_EMERGE_THRESHOLD)
- new /obj/effect/overlay/temp/heal(host.loc, "#AF0AAF")
+ new /obj/effect/temp_visual/heal(host.loc, "#AF0AAF")
host.heal_ordered_damage(4, damage_heal_order)
/mob/living/simple_animal/hostile/clockwork/marauder/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm
index bc5ec1b9d83..9efb9a8eb2c 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm
@@ -114,7 +114,7 @@
for(var/i in 1 to heal_attempts)
if(S.health < S.maxHealth)
S.adjustHealth(-heal_amount)
- new /obj/effect/overlay/temp/heal(T, "#1E8CE1")
+ new /obj/effect/temp_visual/heal(T, "#1E8CE1")
if(i == heal_attempts && S.health >= S.maxHealth) //we finished healing on the last tick, give them the message
to_chat(S, "\"[text2ratvar(pick(heal_finish_messages))]\"")
break
@@ -129,7 +129,7 @@
for(var/i in 1 to heal_attempts)
if(S.health < S.maxHealth)
S.heal_ordered_damage(heal_amount, damage_heal_order)
- new /obj/effect/overlay/temp/heal(T, "#1E8CE1")
+ new /obj/effect/temp_visual/heal(T, "#1E8CE1")
if(i == heal_attempts && S.health >= S.maxHealth)
to_chat(S, "\"[text2ratvar(pick(heal_finish_messages))]\"")
break
@@ -158,7 +158,7 @@
for(var/i in 1 to heal_ticks)
if(H.health < H.maxHealth)
H.heal_ordered_damage(heal_amount, damage_heal_order)
- new /obj/effect/overlay/temp/heal(T, "#1E8CE1")
+ new /obj/effect/temp_visual/heal(T, "#1E8CE1")
if(i == heal_ticks && H.health >= H.maxHealth)
to_chat(H, "\"[text2ratvar(pick(heal_finish_messages))]\"")
break
@@ -174,10 +174,10 @@
if(C.obj_integrity < C.max_integrity)
C.obj_integrity = min(C.obj_integrity + 5, C.max_integrity)
C.update_icon()
- new /obj/effect/overlay/temp/heal(T, "#1E8CE1")
+ new /obj/effect/temp_visual/heal(T, "#1E8CE1")
else
break
- new /obj/effect/overlay/temp/ratvar/mending_mantra(get_turf(invoker))
+ new /obj/effect/temp_visual/ratvar/mending_mantra(get_turf(invoker))
return TRUE
@@ -389,7 +389,7 @@
usable_power = min(Floor(C.cell.charge * 0.2, MIN_CLOCKCULT_POWER), 1000) - prev_power
if(usable_power > 0 && C.cell.use(usable_power))
multiplier += (usable_power * 0.0005)
- var/obj/effect/overlay/temp/ratvar/volt_hit/VH = new /obj/effect/overlay/temp/ratvar/volt_hit(get_turf(invoker), null, multiplier)
+ var/obj/effect/temp_visual/ratvar/volt_hit/VH = new /obj/effect/temp_visual/ratvar/volt_hit(get_turf(invoker), null, multiplier)
invoker.visible_message("[invoker] is struck by [invoker.p_their()] own [VH.name]!", "You're struck by your own [VH.name]!")
invoker.adjustFireLoss(VH.damage) //you have to fail all five blasts to die to this
playsound(invoker, 'sound/machines/defib_zap.ogg', VH.damage, 1, -1)
diff --git a/code/game/gamemodes/clock_cult/clock_structure.dm b/code/game/gamemodes/clock_cult/clock_structure.dm
index 0a193e75585..64c71359719 100644
--- a/code/game/gamemodes/clock_cult/clock_structure.dm
+++ b/code/game/gamemodes/clock_cult/clock_structure.dm
@@ -131,7 +131,7 @@
if(anchored && unanchored_icon)
anchored = FALSE
update_anchored(null, obj_integrity > max_integrity * 0.25)
- new /obj/effect/overlay/temp/emp(loc)
+ new /obj/effect/temp_visual/emp(loc)
//for the ark and Ratvar
@@ -222,7 +222,7 @@
/obj/structure/destructible/clockwork/powered/emp_act(severity)
if(forced_disable(TRUE))
- new /obj/effect/overlay/temp/emp(loc)
+ new /obj/effect/temp_visual/emp(loc)
/obj/structure/destructible/clockwork/powered/proc/total_accessable_power() //how much power we have and can use
if(!needs_power || GLOB.ratvar_awakens)
diff --git a/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm b/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm
index 1203c7119a7..84098fca578 100644
--- a/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm
@@ -31,7 +31,7 @@
return
/obj/structure/destructible/clockwork/geis_binding/emp_act(severity)
- new /obj/effect/overlay/temp/emp(loc)
+ new /obj/effect/temp_visual/emp(loc)
qdel(src)
/obj/structure/destructible/clockwork/geis_binding/post_buckle_mob(mob/living/M)
@@ -54,8 +54,8 @@
if(!can_resist)
repair_and_interrupt()
else
- var/obj/effect/overlay/temp/ratvar/geis_binding/G = new /obj/effect/overlay/temp/ratvar/geis_binding(M.loc)
- var/obj/effect/overlay/temp/ratvar/geis_binding/T = new /obj/effect/overlay/temp/ratvar/geis_binding/top(M.loc)
+ var/obj/effect/temp_visual/ratvar/geis_binding/G = new /obj/effect/temp_visual/ratvar/geis_binding(M.loc)
+ var/obj/effect/temp_visual/ratvar/geis_binding/T = new /obj/effect/temp_visual/ratvar/geis_binding/top(M.loc)
G.layer = mob_layer - 0.01
T.layer = mob_layer + 0.01
G.alpha = alpha
@@ -93,10 +93,10 @@
var/mob/living/carbon/C = L
C.silent += 4
visible_message("[src] flares brightly!")
- var/obj/effect/overlay/temp/ratvar/geis_binding/G1 = new /obj/effect/overlay/temp/ratvar/geis_binding(loc)
- var/obj/effect/overlay/temp/ratvar/geis_binding/G2 = new /obj/effect/overlay/temp/ratvar/geis_binding(loc)
- var/obj/effect/overlay/temp/ratvar/geis_binding/T1 = new /obj/effect/overlay/temp/ratvar/geis_binding/top(loc)
- var/obj/effect/overlay/temp/ratvar/geis_binding/T2 = new /obj/effect/overlay/temp/ratvar/geis_binding/top(loc)
+ var/obj/effect/temp_visual/ratvar/geis_binding/G1 = new /obj/effect/temp_visual/ratvar/geis_binding(loc)
+ var/obj/effect/temp_visual/ratvar/geis_binding/G2 = new /obj/effect/temp_visual/ratvar/geis_binding(loc)
+ var/obj/effect/temp_visual/ratvar/geis_binding/T1 = new /obj/effect/temp_visual/ratvar/geis_binding/top(loc)
+ var/obj/effect/temp_visual/ratvar/geis_binding/T2 = new /obj/effect/temp_visual/ratvar/geis_binding/top(loc)
G1.layer = mob_layer - 0.01
G2.layer = mob_layer - 0.01
T1.layer = mob_layer + 0.01
diff --git a/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm b/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm
index c4415dfed86..9c7b5e9518e 100644
--- a/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm
@@ -87,7 +87,7 @@
var/obj/mecha/M = target
M.take_damage(damage_per_tick * get_efficiency_mod(), BURN, "melee", 1, get_dir(src, M))
- new /obj/effect/overlay/temp/ratvar/ocular_warden(get_turf(target))
+ new /obj/effect/temp_visual/ratvar/ocular_warden(get_turf(target))
setDir(get_dir(get_turf(src), get_turf(target)))
if(!target)
diff --git a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm
index b82e9a9c85e..25f151def54 100644
--- a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm
@@ -28,7 +28,7 @@
var/mutable_appearance/alert_overlay = mutable_appearance('icons/effects/clockwork_effects.dmi', "ratvar_alert")
var/area/A = get_area(src)
notify_ghosts("The Justiciar's light calls to you! Reach out to Ratvar in [A.name] to be granted a shell to spread his glory!", null, source = src, alert_overlay = alert_overlay)
- INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency..proc/request, null, 0, 0)
+ INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency.proc/request, null, 0, null, FALSE, 0)
/obj/structure/destructible/clockwork/massive/ratvar/Destroy()
GLOB.ratvar_awakens--
diff --git a/code/game/gamemodes/clock_cult/clock_structures/wall_gear.dm b/code/game/gamemodes/clock_cult/clock_structures/wall_gear.dm
index 94bf35b6a76..8dc2fb06f05 100644
--- a/code/game/gamemodes/clock_cult/clock_structures/wall_gear.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures/wall_gear.dm
@@ -19,7 +19,7 @@
/obj/structure/destructible/clockwork/wall_gear/Initialize()
. = ..()
- new /obj/effect/overlay/temp/ratvar/gear(get_turf(src))
+ new /obj/effect/temp_visual/ratvar/gear(get_turf(src))
/obj/structure/destructible/clockwork/wall_gear/emp_act(severity)
return
diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm
index 7e516da4832..1f380dfb5e1 100644
--- a/code/game/gamemodes/cult/cult_comms.dm
+++ b/code/game/gamemodes/cult/cult_comms.dm
@@ -177,13 +177,13 @@
var/turf/mobloc = get_turf(B.current)
switch(i)
if(1)
- new /obj/effect/overlay/temp/cult/sparks(mobloc, B.current.dir)
+ new /obj/effect/temp_visual/cult/sparks(mobloc, B.current.dir)
playsound(mobloc, "sparks", 50, 1)
if(2)
- new /obj/effect/overlay/temp/dir_setting/cult/phase/out(mobloc, B.current.dir)
+ new /obj/effect/temp_visual/dir_setting/cult/phase/out(mobloc, B.current.dir)
playsound(mobloc, "sparks", 75, 1)
if(3)
- new /obj/effect/overlay/temp/dir_setting/cult/phase(mobloc, B.current.dir)
+ new /obj/effect/temp_visual/dir_setting/cult/phase(mobloc, B.current.dir)
playsound(mobloc, "sparks", 100, 1)
if(4)
playsound(mobloc, 'sound/magic/exit_blood.ogg', 100, 1)
@@ -193,7 +193,7 @@
var/obj/item/device/soulstone/S = B.current.loc
S.release_shades(owner)
B.current.setDir(SOUTH)
- new /obj/effect/overlay/temp/cult/blood(final)
+ new /obj/effect/temp_visual/cult/blood(final)
addtimer(CALLBACK(B.current, /mob/.proc/reckon, final), 10)
else
return
@@ -201,7 +201,7 @@
Remove(owner)
/mob/proc/reckon(turf/final)
- new /obj/effect/overlay/temp/cult/blood/out(get_turf(src))
+ new /obj/effect/temp_visual/cult/blood/out(get_turf(src))
forceMove(final)
/datum/action/innate/cult/master/finalreck/proc/chant(chant_number)
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index 821edd1613c..a59d7cd3cfe 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -204,7 +204,7 @@
if(current_charges)
owner.visible_message("\The [attack_text] is deflected in a burst of blood-red sparks!")
current_charges--
- new /obj/effect/overlay/temp/cult/sparks(get_turf(owner))
+ new /obj/effect/temp_visual/cult/sparks(get_turf(owner))
if(!current_charges)
owner.visible_message("The runed shield around [owner] suddenly disappears!")
owner.update_inv_wear_suit()
@@ -214,7 +214,7 @@
/obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands)
. = list()
if(!isinhands && current_charges)
- . += mutable_appearance('icons/effects/effects.dmi', "shield-cult", MOB_LAYER + 0.01)
+ . += mutable_appearance('icons/effects/cult_effects.dmi', "shield-cult", MOB_LAYER + 0.01)
/obj/item/clothing/suit/hooded/cultrobes/berserker
name = "flagellant's robes"
@@ -356,14 +356,14 @@
if(uses <= 0)
icon_state ="shifter_drained"
playsound(mobloc, "sparks", 50, 1)
- new /obj/effect/overlay/temp/dir_setting/cult/phase/out(mobloc, C.dir)
+ new /obj/effect/temp_visual/dir_setting/cult/phase/out(mobloc, C.dir)
var/atom/movable/pulled = handle_teleport_grab(destination, C)
C.forceMove(destination)
if(pulled)
C.start_pulling(pulled) //forcemove resets pulls, so we need to re-pull
- new /obj/effect/overlay/temp/dir_setting/cult/phase(destination, C.dir)
+ new /obj/effect/temp_visual/dir_setting/cult/phase(destination, C.dir)
playsound(destination, 'sound/effects/phasein.ogg', 25, 1)
playsound(destination, "sparks", 50, 1)
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index 51c622858dd..63e5b97b9ed 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -152,7 +152,7 @@
for(var/mob/living/L in range(5, src))
if(iscultist(L) || isshade(L) || isconstruct(L))
if(L.health != L.maxHealth)
- new /obj/effect/overlay/temp/heal(get_turf(src), "#960000")
+ new /obj/effect/temp_visual/heal(get_turf(src), "#960000")
if(ishuman(L))
L.adjustBruteLoss(-1, 0)
L.adjustFireLoss(-1, 0)
@@ -190,7 +190,7 @@
else
var/turf/open/floor/engine/cult/F = safepick(cultturfs)
if(F)
- new /obj/effect/overlay/temp/cult/turf/floor(F)
+ new /obj/effect/temp_visual/cult/turf/floor(F)
else
// Are we in space or something? No cult turfs or
// convertable turfs?
diff --git a/code/game/gamemodes/cult/rune_spawn_action.dm b/code/game/gamemodes/cult/rune_spawn_action.dm
new file mode 100644
index 00000000000..7412a5d6bbb
--- /dev/null
+++ b/code/game/gamemodes/cult/rune_spawn_action.dm
@@ -0,0 +1,70 @@
+//after a delay, creates a rune below you. for constructs creating runes.
+/datum/action/innate/cult/create_rune
+ background_icon_state = "bg_cult"
+ var/obj/effect/rune/rune_type
+ var/cooldown = 0
+ var/base_cooldown = 900
+ var/scribe_time = 100
+ var/damage_interrupt = TRUE
+ var/action_interrupt = TRUE
+ var/obj/effect/temp_visual/cult/rune_spawn/rune_word_type
+ var/obj/effect/temp_visual/cult/rune_spawn/rune_innerring_type
+ var/obj/effect/temp_visual/cult/rune_spawn/rune_center_type
+ var/rune_color
+
+/datum/action/innate/cult/create_rune/IsAvailable()
+ if(!rune_type || cooldown > world.time)
+ return FALSE
+ return ..()
+
+/datum/action/innate/cult/create_rune/Activate()
+ var/chosen_keyword
+ if(!isturf(owner.loc))
+ to_chat(owner, "")
var/oldcolor = color
- color = "#7D1717"
+ color = RUNE_COLOR_DARKRED
var/mob/living/L = pick(myriad_targets)
var/is_clock = is_servant_of_ratvar(L)
var/is_convertable = is_convertable_to_cult(L)
@@ -410,7 +410,7 @@ structure_check() searches for nearby cultist structures required for the invoca
else
GLOB.sacrificed += sacrificial
- new /obj/effect/overlay/temp/cult/sac(get_turf(src))
+ new /obj/effect/temp_visual/cult/sac(get_turf(src))
for(var/M in invokers)
if(big_sac)
to_chat(M, "\"Yes! This is the one I desire! You have done well.\"")
@@ -442,7 +442,7 @@ structure_check() searches for nearby cultist structures required for the invoca
invocation = "TOK-LYR RQA-NAP G'OLT-ULOFT!!"
req_cultists = 9
icon = 'icons/effects/96x96.dmi'
- color = "#7D1717"
+ color = RUNE_COLOR_DARKRED
icon_state = "rune_large"
pixel_x = -32 //So the big ol' 96x96 sprite shows up right
pixel_y = -32
@@ -478,12 +478,10 @@ structure_check() searches for nearby cultist structures required for the invoca
send_to_playing_players('sound/effects/dimensional_rend.ogg')
var/turf/T = get_turf(src)
sleep(40)
- SSticker.mode.eldergod = FALSE
if(src)
- color = "#FF0000"
- deltimer(GLOB.blood_target_reset_timer)
- new /obj/singularity/narsie/large/cult(T) //Causes Nar-Sie to spawn and makes it the blood target even if the rune has been removed
-
+ color = RUNE_COLOR_RED
+ SSticker.mode.eldergod = FALSE
+ new /obj/singularity/narsie/large/cult(T) //Causes Nar-Sie to spawn even if the rune has been removed
/obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal.
if((istype(I, /obj/item/weapon/tome) && iscultist(user)))
@@ -504,7 +502,7 @@ structure_check() searches for nearby cultist structures required for the invoca
cultist_desc = "requires the corpse of a cultist placed upon the rune. Provided there have been sufficient sacrifices, they will be revived."
invocation = "Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!" //Depends on the name of the user - see below
icon_state = "1"
- color = "#C80000"
+ color = RUNE_COLOR_MEDIUMRED
var/static/revives_used = 0
/obj/effect/rune/raise_dead/examine(mob/user)
@@ -595,7 +593,7 @@ structure_check() searches for nearby cultist structures required for the invoca
invocation = "Ta'gh fara'qha fel d'amar det!"
icon_state = "5"
allow_excess_invokers = 1
- color = "#4D94FF"
+ color = RUNE_COLOR_EMP
/obj/effect/rune/emp/invoke(var/list/invokers)
var/turf/E = get_turf(src)
@@ -625,7 +623,7 @@ structure_check() searches for nearby cultist structures required for the invoca
cultist_desc = "severs the link between one's spirit and body. This effect is taxing and one's physical body will take damage while this is active."
invocation = "Fwe'sh mah erl nyag r'ya!"
icon_state = "7"
- color = "#7D1717"
+ color = RUNE_COLOR_DARKRED
rune_in_use = 0 //One at a time, please!
construct_invoke = 0
var/mob/living/affecting = null
@@ -651,9 +649,9 @@ structure_check() searches for nearby cultist structures required for the invoca
var/mob/living/user = invokers[1]
..()
var/turf/T = get_turf(src)
- rune_in_use = 1
+ rune_in_use = TRUE
affecting = user
- user.color = "#7D1717"
+ user.add_atom_colour(RUNE_COLOR_DARKRED, ADMIN_COLOUR_PRIORITY)
user.visible_message("[user] freezes statue-still, glowing an unearthly red.", \
"You see what lies beyond. All is revealed. While this is a wondrous experience, your physical form will waste away in this state. Hurry...")
user.ghostize(1)
@@ -661,7 +659,7 @@ structure_check() searches for nearby cultist structures required for the invoca
if(!affecting)
visible_message("[src] pulses gently before falling dark.")
affecting = null //In case it's assigned to a number or something
- rune_in_use = 0
+ rune_in_use = FALSE
return
affecting.apply_damage(0.1, BRUTE)
if(!(user in T))
@@ -671,9 +669,9 @@ structure_check() searches for nearby cultist structures required for the invoca
if(user.key)
user.visible_message("[user] slowly relaxes, the glow around [user.p_them()] dimming.", \
"You are re-united with your physical form. [src] releases its hold over you.")
- user.color = initial(user.color)
+ user.remove_atom_colour(ADMIN_COLOUR_PRIORITY, RUNE_COLOR_DARKRED)
user.Weaken(3)
- rune_in_use = 0
+ rune_in_use = FALSE
affecting = null
return
if(user.stat == UNCONSCIOUS)
@@ -681,14 +679,14 @@ structure_check() searches for nearby cultist structures required for the invoca
var/mob/dead/observer/G = user.get_ghost()
to_chat(G, "You feel the link between you and your body weakening... you must hurry!")
if(user.stat == DEAD)
- user.color = initial(user.color)
- rune_in_use = 0
+ user.remove_atom_colour(ADMIN_COLOUR_PRIORITY, RUNE_COLOR_DARKRED)
+ rune_in_use = FALSE
affecting = null
var/mob/dead/observer/G = user.get_ghost()
to_chat(G, "You suddenly feel your physical form pass on. [src]'s exertion has killed you!")
return
sleep(1)
- rune_in_use = 0
+ rune_in_use = FALSE
//Rite of the Corporeal Shield: When invoked, becomes solid and cannot be passed. Invoke again to undo.
/obj/effect/rune/wall
@@ -696,7 +694,7 @@ structure_check() searches for nearby cultist structures required for the invoca
cultist_desc = "when invoked, makes a temporary invisible wall to block passage. Can be invoked again to reverse this."
invocation = "Khari'd! Eske'te tannin!"
icon_state = "1"
- color = "#C80000"
+ color = RUNE_COLOR_MEDIUMRED
CanAtmosPass = ATMOS_PASS_DENSITY
var/density_timer
var/recharging = FALSE
@@ -755,7 +753,7 @@ structure_check() searches for nearby cultist structures required for the invoca
/obj/effect/rune/wall/proc/recharge()
recharging = FALSE
- add_atom_colour("#C80000", FIXED_COLOUR_PRIORITY)
+ add_atom_colour(RUNE_COLOR_MEDIUMRED, FIXED_COLOUR_PRIORITY)
/obj/effect/rune/wall/proc/update_state()
deltimer(density_timer)
@@ -766,10 +764,10 @@ structure_check() searches for nearby cultist structures required for the invoca
shimmer.alpha = 60
shimmer.color = "#701414"
add_overlay(shimmer)
- add_atom_colour("#FF0000", FIXED_COLOUR_PRIORITY)
+ add_atom_colour(RUNE_COLOR_RED, FIXED_COLOUR_PRIORITY)
else
cut_overlays()
- add_atom_colour("#C80000", FIXED_COLOUR_PRIORITY)
+ add_atom_colour(RUNE_COLOR_MEDIUMRED, FIXED_COLOUR_PRIORITY)
//Rite of Joined Souls: Summons a single cultist.
/obj/effect/rune/summon
@@ -779,7 +777,7 @@ structure_check() searches for nearby cultist structures required for the invoca
req_cultists = 2
allow_excess_invokers = 1
icon_state = "5"
- color = "#00FF00"
+ color = RUNE_COLOR_SUMMON
/obj/effect/rune/summon/invoke(var/list/invokers)
var/mob/living/user = invokers[1]
@@ -824,7 +822,7 @@ structure_check() searches for nearby cultist structures required for the invoca
cultist_desc = "boils the blood of non-believers who can see the rune, rapidly dealing extreme amounts of damage. Requires 3 invokers."
invocation = "Dedo ol'btoh!"
icon_state = "4"
- color = "#C80000"
+ color = RUNE_COLOR_MEDIUMRED
light_color = LIGHT_COLOR_LAVA
req_cultists = 3
construct_invoke = 0
@@ -891,7 +889,7 @@ structure_check() searches for nearby cultist structures required for the invoca
invocation = "Gal'h'rfikk harfrandid mud'gib!" //how the fuck do you pronounce this
icon_state = "6"
construct_invoke = 0
- color = "#C80000"
+ color = RUNE_COLOR_MEDIUMRED
var/ghost_limit = 5
var/ghosts = 0
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index 027df31acd6..9a9d8c582b3 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -49,7 +49,7 @@
/obj/item/weapon/paper/talisman/teleport
cultist_name = "Talisman of Teleportation"
cultist_desc = "A single-use talisman that will teleport a user to a random rune of the same keyword."
- color = "#551A8B" // purple
+ color = RUNE_COLOR_TELEPORT
invocation = "Sas'so c'arta forbici!"
health_cost = 5
creation_time = 80
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 8f90cd892da..9def30992ec 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -328,7 +328,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
/obj/effect/meteor/tunguska/Move()
. = ..()
if(.)
- new /obj/effect/overlay/temp/revenant(get_turf(src))
+ new /obj/effect/temp_visual/revenant(get_turf(src))
/obj/effect/meteor/tunguska/meteor_effect()
..()
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index d7ab46cb9cd..de11c2ed94d 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -64,7 +64,7 @@
stealth_active = 1
if(ishuman(loc))
var/mob/living/carbon/human/M = loc
- new /obj/effect/overlay/temp/dir_setting/ninja/cloak(get_turf(M), M.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja/cloak(get_turf(M), M.dir)
M.name_override = disguise.name
M.icon = disguise.icon
M.icon_state = disguise.icon_state
@@ -78,7 +78,7 @@
stealth_active = 0
if(ishuman(loc))
var/mob/living/carbon/human/M = loc
- new /obj/effect/overlay/temp/dir_setting/ninja(get_turf(M), M.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja(get_turf(M), M.dir)
M.name_override = null
M.cut_overlays()
M.regenerate_icons()
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
index 083e610587a..a12515a6257 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm
@@ -16,38 +16,38 @@
flick("alien-pad", src)
for(var/mob/living/target in loc)
target.forceMove(teleport_target)
- new /obj/effect/overlay/temp/dir_setting/ninja(get_turf(target), target.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), 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)
- new /obj/effect/overlay/temp/dir_setting/ninja(get_turf(target), target.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir)
Warp(target)
/obj/machinery/abductor/pad/proc/MobToLoc(place,mob/living/target)
- new /obj/effect/overlay/temp/teleport_abductor(place)
+ new /obj/effect/temp_visual/teleport_abductor(place)
sleep(80)
flick("alien-pad", src)
target.forceMove(place)
- new /obj/effect/overlay/temp/dir_setting/ninja(get_turf(target), target.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir)
/obj/machinery/abductor/pad/proc/PadToLoc(place)
- new /obj/effect/overlay/temp/teleport_abductor(place)
+ new /obj/effect/temp_visual/teleport_abductor(place)
sleep(80)
flick("alien-pad", src)
for(var/mob/living/target in get_turf(src))
target.forceMove(place)
- new /obj/effect/overlay/temp/dir_setting/ninja(get_turf(target), target.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir)
-/obj/effect/overlay/temp/teleport_abductor
+/obj/effect/temp_visual/teleport_abductor
name = "Huh"
icon = 'icons/obj/abductor.dmi'
icon_state = "teleport"
duration = 80
-/obj/effect/overlay/temp/teleport_abductor/Initialize()
+/obj/effect/temp_visual/teleport_abductor/Initialize()
. = ..()
var/datum/effect_system/spark_spread/S = new
S.set_up(10,0,loc)
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index 3b315bb6682..1b929e917b9 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -435,7 +435,7 @@
resources += resource_gain
do_attack_animation(target)
changeNext_move(CLICK_CD_MELEE)
- var/obj/effect/overlay/temp/swarmer/integrate/I = new /obj/effect/overlay/temp/swarmer/integrate(get_turf(target))
+ var/obj/effect/temp_visual/swarmer/integrate/I = new /obj/effect/temp_visual/swarmer/integrate(get_turf(target))
I.pixel_x = target.pixel_x
I.pixel_y = target.pixel_y
I.pixel_z = target.pixel_z
@@ -452,7 +452,7 @@
/mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(atom/movable/target)
- new /obj/effect/overlay/temp/swarmer/disintegration(get_turf(target))
+ new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target))
do_attack_animation(target)
changeNext_move(CLICK_CD_MELEE)
target.ex_act(3)
@@ -497,7 +497,7 @@
/mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(obj/machinery/target)
do_attack_animation(target)
to_chat(src, "We begin to dismantle this machine. We will need to be uninterrupted.")
- var/obj/effect/overlay/temp/swarmer/dismantle/D = new /obj/effect/overlay/temp/swarmer/dismantle(get_turf(target))
+ var/obj/effect/temp_visual/swarmer/dismantle/D = new /obj/effect/temp_visual/swarmer/dismantle(get_turf(target))
D.pixel_x = target.pixel_x
D.pixel_y = target.pixel_y
D.pixel_z = target.pixel_z
@@ -507,7 +507,7 @@
M.amount = 5
for(var/obj/item/I in target.component_parts)
I.loc = M.loc
- var/obj/effect/overlay/temp/swarmer/disintegration/N = new /obj/effect/overlay/temp/swarmer/disintegration(get_turf(target))
+ var/obj/effect/temp_visual/swarmer/disintegration/N = new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target))
N.pixel_x = target.pixel_x
N.pixel_y = target.pixel_y
N.pixel_z = target.pixel_z
@@ -519,23 +519,23 @@
qdel(target)
-/obj/effect/overlay/temp/swarmer //temporary swarmer visual feedback objects
+/obj/effect/temp_visual/swarmer //temporary swarmer visual feedback objects
icon = 'icons/mob/swarmer.dmi'
layer = BELOW_MOB_LAYER
-/obj/effect/overlay/temp/swarmer/disintegration
+/obj/effect/temp_visual/swarmer/disintegration
icon_state = "disintegrate"
duration = 10
-/obj/effect/overlay/temp/swarmer/disintegration/Initialize()
+/obj/effect/temp_visual/swarmer/disintegration/Initialize()
. = ..()
playsound(loc, "sparks", 100, 1)
-/obj/effect/overlay/temp/swarmer/dismantle
+/obj/effect/temp_visual/swarmer/dismantle
icon_state = "dismantle"
duration = 25
-/obj/effect/overlay/temp/swarmer/integrate
+/obj/effect/temp_visual/swarmer/integrate
icon_state = "integrate"
duration = 5
diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm
index 265688a15b6..293b114b369 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant.dm
@@ -14,7 +14,7 @@
var/icon_reveal = "revenant_revealed"
var/icon_stun = "revenant_stun"
var/icon_drain = "revenant_draining"
- var/stasis = 0
+ var/stasis = FALSE
incorporeal_move = 3
invisibility = INVISIBILITY_REVENANT
health = INFINITY //Revenants don't use health, they use essence instead
@@ -205,6 +205,7 @@
/mob/living/simple_animal/revenant/death()
if(!revealed || stasis) //Revenants cannot die if they aren't revealed //or are already dead
return 0
+ stasis = TRUE
to_chat(src, "NO! No... it's too late, you can feel your essence [pick("breaking apart", "drifting away")]...")
notransform = TRUE
revealed = TRUE
@@ -222,8 +223,7 @@
R.client_to_revive = client //If the essence reforms, the old revenant is put back in the body
R.revenant = src
invisibility = INVISIBILITY_ABSTRACT
- revealed = 0
- stasis = 1
+ revealed = FALSE
ghostize(0)//Don't re-enter invisible corpse
return
@@ -317,7 +317,7 @@
incorporeal_move = 3
invisibility = INVISIBILITY_REVENANT
alpha=255
- stasis = 0
+ stasis = FALSE
//reforming
diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
index 580515d4ecd..ed51fb4caa4 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
@@ -202,7 +202,7 @@
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(4, 0, L)
s.start()
- new /obj/effect/overlay/temp/revenant(L.loc)
+ new /obj/effect/temp_visual/revenant(L.loc)
sleep(20)
if(!L.on) //wait, wait, don't shock me
return
@@ -237,7 +237,7 @@
/obj/effect/proc_holder/spell/aoe_turf/revenant/defile/proc/defile(turf/T)
if(T.flags & NOJAUNT)
T.flags -= NOJAUNT
- new /obj/effect/overlay/temp/revenant(T)
+ new /obj/effect/temp_visual/revenant(T)
if(!istype(T, /turf/open/floor/plating) && !istype(T, /turf/open/floor/engine/cult) && isfloorturf(T) && prob(15))
var/turf/open/floor/floor = T
if(floor.intact && floor.floor_tile)
@@ -246,10 +246,10 @@
floor.burnt = 0
floor.make_plating(1)
if(T.type == /turf/closed/wall && prob(15))
- new /obj/effect/overlay/temp/revenant(T)
+ new /obj/effect/temp_visual/revenant(T)
T.ChangeTurf(/turf/closed/wall/rust)
if(T.type == /turf/closed/wall/r_wall && prob(10))
- new /obj/effect/overlay/temp/revenant(T)
+ new /obj/effect/temp_visual/revenant(T)
T.ChangeTurf(/turf/closed/wall/r_wall/rust)
for(var/obj/structure/closet/closet in T.contents)
closet.open()
@@ -261,7 +261,7 @@
for(var/obj/structure/window/window in T)
window.take_damage(rand(30,80))
if(window && window.fulltile)
- new /obj/effect/overlay/temp/revenant/cracks(window.loc)
+ new /obj/effect/temp_visual/revenant/cracks(window.loc)
for(var/obj/machinery/light/light in T)
light.flicker(20) //spooky
@@ -284,7 +284,7 @@
/obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction/proc/malfunction(turf/T, mob/user)
for(var/mob/living/simple_animal/bot/bot in T)
if(!bot.emagged)
- new /obj/effect/overlay/temp/revenant(bot.loc)
+ new /obj/effect/temp_visual/revenant(bot.loc)
bot.locked = 0
bot.open = 1
bot.emag_act()
@@ -292,21 +292,21 @@
if(human == user)
continue
to_chat(human, "You feel [pick("your sense of direction flicker out", "a stabbing pain in your head", "your mind fill with static")].")
- new /obj/effect/overlay/temp/revenant(human.loc)
+ new /obj/effect/temp_visual/revenant(human.loc)
human.emp_act(1)
for(var/obj/thing in T)
if(istype(thing, /obj/machinery/dominator) || istype(thing, /obj/machinery/power/apc) || istype(thing, /obj/machinery/power/smes)) //Doesn't work on dominators, SMES and APCs, to prevent kekkery
continue
if(prob(20))
if(prob(50))
- new /obj/effect/overlay/temp/revenant(thing.loc)
+ new /obj/effect/temp_visual/revenant(thing.loc)
thing.emag_act(null)
else
if(!istype(thing, /obj/machinery/clonepod)) //I hate everything but mostly the fact there's no better way to do this without just not affecting it at all
thing.emp_act(1)
for(var/mob/living/silicon/robot/S in T) //Only works on cyborgs, not AI
playsound(S, 'sound/machines/warning-buzzer.ogg', 50, 1)
- new /obj/effect/overlay/temp/revenant(S.loc)
+ new /obj/effect/temp_visual/revenant(S.loc)
S.spark_system.start()
S.emp_act(1)
@@ -329,7 +329,7 @@
for(var/mob/living/mob in T)
if(mob == user)
continue
- new /obj/effect/overlay/temp/revenant(mob.loc)
+ new /obj/effect/temp_visual/revenant(mob.loc)
if(iscarbon(mob))
if(ishuman(mob))
var/mob/living/carbon/human/H = mob
@@ -350,14 +350,14 @@
mob.adjustToxLoss(5)
for(var/obj/structure/spacevine/vine in T) //Fucking with botanists, the ability.
vine.add_atom_colour("#823abb", TEMPORARY_COLOUR_PRIORITY)
- new /obj/effect/overlay/temp/revenant(vine.loc)
+ new /obj/effect/temp_visual/revenant(vine.loc)
QDEL_IN(vine, 10)
for(var/obj/structure/glowshroom/shroom in T)
shroom.add_atom_colour("#823abb", TEMPORARY_COLOUR_PRIORITY)
- new /obj/effect/overlay/temp/revenant(shroom.loc)
+ new /obj/effect/temp_visual/revenant(shroom.loc)
QDEL_IN(shroom, 10)
for(var/obj/machinery/hydroponics/tray in T)
- new /obj/effect/overlay/temp/revenant(tray.loc)
+ new /obj/effect/temp_visual/revenant(tray.loc)
tray.pestlevel = rand(8, 10)
tray.weedlevel = rand(8, 10)
tray.toxic = rand(45, 55)
diff --git a/code/game/gamemodes/miniantags/revenant/revenant_blight.dm b/code/game/gamemodes/miniantags/revenant/revenant_blight.dm
index 8b766aad370..913efb34ce8 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant_blight.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant_blight.dm
@@ -33,11 +33,11 @@
to_chat(affected_mob, "You suddenly feel [pick("sick and tired", "disoriented", "tired and confused", "nauseated", "faint", "dizzy")]...")
affected_mob.confused += 8
affected_mob.adjustStaminaLoss(8)
- new /obj/effect/overlay/temp/revenant(affected_mob.loc)
+ new /obj/effect/temp_visual/revenant(affected_mob.loc)
if(stagedamage < stage)
stagedamage++
affected_mob.adjustToxLoss(stage*2) //should, normally, do about 30 toxin damage.
- new /obj/effect/overlay/temp/revenant(affected_mob.loc)
+ new /obj/effect/temp_visual/revenant(affected_mob.loc)
if(prob(45))
affected_mob.adjustStaminaLoss(stage)
..() //So we don't increase a stage before applying the stage damage.
@@ -56,7 +56,7 @@
finalstage = TRUE
to_chat(affected_mob, "You feel like [pick("nothing's worth it anymore", "nobody ever needed your help", "nothing you did mattered", "everything you tried to do was worthless")].")
affected_mob.adjustStaminaLoss(45)
- new /obj/effect/overlay/temp/revenant(affected_mob.loc)
+ new /obj/effect/temp_visual/revenant(affected_mob.loc)
if(affected_mob.dna && affected_mob.dna.species)
affected_mob.dna.species.handle_mutant_bodyparts(affected_mob,"#1d2953")
affected_mob.dna.species.handle_hair(affected_mob,"#1d2953")
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index 1f01b38860d..5964983b095 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -459,8 +459,7 @@
var/datum/game_mode/nuclear/NM = SSticker.mode
NM.nukes_left --
if(!SSticker.mode.check_finished())//If the mode does not deal with the nuke going off so just reboot because everyone is stuck as is
- spawn()
- world.Reboot("Station destroyed by Nuclear Device.", "end_error", "nuke - unhandled ending")
+ SSticker.Reboot("Station destroyed by Nuclear Device.", "end_error", "nuke - unhandled ending")
/*
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 0ebfceef6d0..10a6a98b4a5 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -206,6 +206,7 @@
if(issilicon(traitor.current))
add_law_zero(traitor.current)
traitor.current.playsound_local('sound/ambience/antag/Malf.ogg',100,0)
+ traitor.current.grant_language(/datum/language/codespeak)
else
equip_traitor(traitor.current)
traitor.current.playsound_local('sound/ambience/antag/TatorAlert.ogg',100,0)
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index dde67fb664e..c07ed401ad0 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -584,7 +584,7 @@
var/turf/T = get_turf(user)
playsound(T,'sound/magic/WarpWhistle.ogg', 200, 1)
user.canmove = 0
- new /obj/effect/overlay/temp/tornado(T)
+ new /obj/effect/temp_visual/tornado(T)
sleep(20)
if(interrupted(user))
return
@@ -602,7 +602,7 @@
T = potential_T
break
breakout += 1
- new /obj/effect/overlay/temp/tornado(T)
+ new /obj/effect/temp_visual/tornado(T)
sleep(20)
if(interrupted(user))
return
@@ -620,7 +620,7 @@
last_user.canmove = 1
return ..()
-/obj/effect/overlay/temp/tornado
+/obj/effect/temp_visual/tornado
icon = 'icons/obj/wizard.dmi'
icon_state = "tornado"
name = "tornado"
@@ -630,6 +630,6 @@
duration = 40
pixel_x = 500
-/obj/effect/overlay/temp/tornado/Initialize()
+/obj/effect/temp_visual/tornado/Initialize()
. = ..()
animate(src, pixel_x = -500, time = 40)
diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm
index ace9b543d16..0ebae75da69 100644
--- a/code/game/machinery/bank_machine.dm
+++ b/code/game/machinery/bank_machine.dm
@@ -25,9 +25,6 @@
if(istype(I, /obj/item/stack/spacecash))
var/obj/item/stack/spacecash/C = I
value = C.value * C.amount
- if(istype(I, /obj/item/weapon/coin))
- var/obj/item/weapon/coin/C = I
- value = C.value
if(value)
SSshuttle.points += value
to_chat(user, "You deposit [I]. The station now has [SSshuttle.points] credits.")
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 643282ab4a6..1fdfd61f07f 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -43,7 +43,8 @@
/obj/item/weapon/grenade/chem_grenade/glitter/pink = 1,
/obj/item/weapon/grenade/chem_grenade/glitter/blue = 1,
/obj/item/weapon/grenade/chem_grenade/glitter/white = 1,
- /obj/item/toy/eightball = 2)
+ /obj/item/toy/eightball = 2,
+ /obj/item/toy/windupToolbox = 2)
light_color = LIGHT_COLOR_GREEN
diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm
index 3e367767733..8632243b67a 100644
--- a/code/game/machinery/dance_machine.dm
+++ b/code/game/machinery/dance_machine.dm
@@ -236,7 +236,7 @@
/obj/machinery/disco/proc/hierofunk()
for(var/i in 1 to 10)
- spawn_atom_to_turf(/obj/effect/overlay/temp/hierophant/telegraph/edge, src, 1, FALSE)
+ spawn_atom_to_turf(/obj/effect/temp_visual/hierophant/telegraph/edge, src, 1, FALSE)
sleep(5)
/obj/machinery/disco/proc/lights_spin()
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index 18d60559bd3..7f914971b29 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -363,7 +363,7 @@
assemblytype = /obj/structure/door_assembly/door_assembly_cult
hackProof = 1
aiControlDisabled = 1
- var/openingoverlaytype = /obj/effect/overlay/temp/cult/door
+ var/openingoverlaytype = /obj/effect/temp_visual/cult/door
var/friendly = FALSE
/obj/machinery/door/airlock/cult/New()
@@ -380,7 +380,7 @@
new openingoverlaytype(loc)
return 1
else
- new /obj/effect/overlay/temp/cult/sac(loc)
+ new /obj/effect/temp_visual/cult/sac(loc)
var/atom/throwtarget
throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(M, src)))
M << pick(sound('sound/hallucinations/turn_around1.ogg',0,1,50), sound('sound/hallucinations/turn_around2.ogg',0,1,50))
@@ -407,7 +407,7 @@
icon = 'icons/obj/doors/airlocks/cult/unruned/cult.dmi'
overlays_file = 'icons/obj/doors/airlocks/cult/unruned/overlays.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_cult/unruned
- openingoverlaytype = /obj/effect/overlay/temp/cult/door/unruned
+ openingoverlaytype = /obj/effect/temp_visual/cult/door/unruned
/obj/machinery/door/airlock/cult/unruned/friendly
friendly = TRUE
@@ -438,8 +438,8 @@
/obj/machinery/door/airlock/clockwork/New()
..()
var/turf/T = get_turf(src)
- new /obj/effect/overlay/temp/ratvar/door(T)
- new /obj/effect/overlay/temp/ratvar/beam/door(T)
+ new /obj/effect/temp_visual/ratvar/door(T)
+ new /obj/effect/temp_visual/ratvar/beam/door(T)
change_construction_value(5)
/obj/machinery/door/airlock/clockwork/Destroy()
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 51695317344..35e6d2ddf49 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -12,6 +12,7 @@
max_integrity = 350
armor = list(melee = 30, bullet = 30, laser = 20, energy = 20, bomb = 10, bio = 100, rad = 100, fire = 80, acid = 70)
CanAtmosPass = ATMOS_PASS_DENSITY
+ flags = PREVENT_CLICK_UNDER
var/secondsElectrified = 0
var/shockedby = list()
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 77f33e45138..be51bf008d1 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -328,7 +328,7 @@
/obj/machinery/door/window/clockwork/setDir(direct)
if(!made_glow)
- var/obj/effect/E = new /obj/effect/overlay/temp/ratvar/door/window(get_turf(src))
+ var/obj/effect/E = new /obj/effect/temp_visual/ratvar/door/window(get_turf(src))
E.setDir(direct)
made_glow = TRUE
..()
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 0aec5d9cca7..41cdf87537a 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -26,8 +26,6 @@ Possible to do for anyone motivated enough:
#define HOLOPAD_PASSIVE_POWER_USAGE 1
#define HOLOGRAM_POWER_USAGE 2
-
-GLOBAL_LIST_EMPTY(holopads)
#define HOLOPAD_MODE RANGE_BASED
/obj/machinery/holopad
@@ -295,7 +293,7 @@ GLOBAL_LIST_EMPTY(holopads)
Hologram.add_atom_colour("#77abff", FIXED_COLOUR_PRIORITY)
Hologram.Impersonation = user
- Hologram.language_holder = user.get_language_holder()
+ Hologram.copy_known_languages_from(user,replace = TRUE)
Hologram.mouse_opacity = 0//So you can't click on it.
Hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them.
Hologram.anchored = 1//So space wind cannot drag it.
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 96b0029134d..a224efd91ce 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -159,7 +159,7 @@ Class Procs:
/obj/machinery/emp_act(severity)
if(use_power && !stat)
use_power(7500/severity)
- new /obj/effect/overlay/temp/emp(loc)
+ new /obj/effect/temp_visual/emp(loc)
..()
/obj/machinery/proc/open_machine(drop = 1)
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index 35679ba514b..924e4cfbf43 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -87,6 +87,7 @@
if(has_cover)
cover = new /obj/machinery/porta_turret_cover(loc)
cover.parent_turret = src
+ underlays += image('icons/obj/turrets.dmi',icon_state = "basedark")
if(!has_cover)
INVOKE_ASYNC(src, .proc/popUp)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 929bcca658a..f98454fd06b 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -48,6 +48,7 @@
var/icon_deny //Icon_state when vending!
var/seconds_electrified = 0 //Shock customers like an airlock.
var/shoot_inventory = 0 //Fire items at customers! We're broken!
+ var/shoot_inventory_chance = 2
var/shut_up = 0 //Stop spouting those godawful pitches!
var/extended_inventory = 0 //can we access the hidden inventory?
var/scan_id = 1
@@ -561,7 +562,7 @@
speak(slogan)
last_slogan = world.time
- if(shoot_inventory && prob(2))
+ if(shoot_inventory && prob(shoot_inventory_chance))
throw_item()
@@ -592,7 +593,7 @@
if(!target)
return 0
- for(var/datum/data/vending_product/R in product_records)
+ for(var/datum/data/vending_product/R in shuffle(product_records))
if(R.amount <= 0) //Try to use a record that actually has something to dump.
continue
var/dump_path = R.product_path
@@ -605,19 +606,22 @@
if(!throw_item)
return 0
+ pre_throw(throw_item)
+
throw_item.throw_at(target, 16, 3)
visible_message("[src] launches [throw_item] at [target]!")
return 1
+/obj/machinery/vending/proc/pre_throw(obj/item/I)
+ return
+
/obj/machinery/vending/proc/shock(mob/user, prb)
if(stat & (BROKEN|NOPOWER)) // unpowered, no shock
return FALSE
if(!prob(prb))
return FALSE
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
+ do_sparks(5, TRUE, src)
var/tmp/check_range = TRUE
if(electrocute_mob(user, get_area(src), src, 0.7, check_range))
return TRUE
@@ -864,6 +868,11 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/weapon/storage/fancy/cigarettes/cigars = 1, /obj/item/weapon/storage/fancy/cigarettes/cigars/havana = 1, /obj/item/weapon/storage/fancy/cigarettes/cigars/cohiba = 1)
refill_canister = /obj/item/weapon/vending_refill/cigarette
+/obj/machinery/vending/cigarette/pre_throw(obj/item/I)
+ if(istype(I, /obj/item/weapon/lighter))
+ var/obj/item/weapon/lighter/L = I
+ L.set_lit(TRUE)
+
/obj/machinery/vending/medical
name = "\improper NanoMed Plus"
desc = "Medical drug dispenser."
@@ -919,6 +928,15 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
resistance_flags = FIRE_PROOF
+/obj/machinery/vending/security/pre_throw(obj/item/I)
+ if(istype(I, /obj/item/weapon/grenade))
+ var/obj/item/weapon/grenade/G = I
+ G.preprime()
+ else if(istype(I, /obj/item/device/flashlight))
+ var/obj/item/device/flashlight/F = I
+ F.on = TRUE
+ F.update_brightness()
+
/obj/machinery/vending/hydronutrients
name = "\improper NutriMax"
desc = "A plant nutrients vendor."
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 1d7d9072c93..1cd46f24eab 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -8,7 +8,7 @@
var/variance = 0
var/randomspread = 0 //use random spread for machineguns, instead of shotgun scatter
var/projectile_delay = 0
- var/firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect //the visual effect appearing when the weapon is fired.
+ var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the weapon is fired.
/obj/item/mecha_parts/mecha_equipment/weapon/can_attach(obj/mecha/combat/M)
if(..())
@@ -60,7 +60,7 @@
//Base energy weapon type
/obj/item/mecha_parts/mecha_equipment/weapon/energy
name = "general energy weapon"
- firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/energy
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy
/obj/item/mecha_parts/mecha_equipment/weapon/energy/get_shot_amount()
return min(round(chassis.cell.charge / energy_drain), projectiles_per_shot)
diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm
index 2994a6a629e..829ed6f6f55 100644
--- a/code/game/objects/effects/decals/misc.dm
+++ b/code/game/objects/effects/decals/misc.dm
@@ -1,11 +1,11 @@
-/obj/effect/overlay/temp/point
+/obj/effect/temp_visual/point
name = "pointer"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "arrow"
layer = POINT_LAYER
duration = 25
-/obj/effect/overlay/temp/point/Initialize(mapload, set_invis = 0)
+/obj/effect/temp_visual/point/Initialize(mapload, set_invis = 0)
..()
var/atom/old_loc = loc
loc = get_turf(src)
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index 12225321d74..9d9694b076d 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -18,620 +18,6 @@
..()
QDEL_IN(src, 10)
-/obj/effect/overlay/temp
- icon_state = "nothing"
- anchored = 1
- layer = ABOVE_MOB_LAYER
- mouse_opacity = 0
- var/duration = 10 //in deciseconds
- var/randomdir = TRUE
- var/timerid
-
-/obj/effect/overlay/temp/Destroy()
- . = ..()
- deltimer(timerid)
-
-/obj/effect/overlay/temp/Initialize()
- . = ..()
- if(randomdir)
- setDir(pick(GLOB.cardinal))
-
- timerid = QDEL_IN(src, duration)
-
-/obj/effect/overlay/temp/ex_act()
- return
-
-/obj/effect/overlay/temp/dir_setting
- randomdir = FALSE
-
-/obj/effect/overlay/temp/dir_setting/Initialize(mapload, set_dir)
- if(set_dir)
- setDir(set_dir)
- . = ..()
-
-/obj/effect/overlay/temp/dir_setting/bloodsplatter
- icon = 'icons/effects/blood.dmi'
- duration = 5
- randomdir = FALSE
- layer = BELOW_MOB_LAYER
- var/splatter_type = "splatter"
-
-/obj/effect/overlay/temp/dir_setting/bloodsplatter/Initialize(mapload, set_dir)
- if(set_dir in GLOB.diagonals)
- icon_state = "[splatter_type][pick(1, 2, 6)]"
- else
- icon_state = "[splatter_type][pick(3, 4, 5)]"
- . = ..()
- var/target_pixel_x = 0
- var/target_pixel_y = 0
- switch(set_dir)
- if(NORTH)
- target_pixel_y = 16
- if(SOUTH)
- target_pixel_y = -16
- layer = ABOVE_MOB_LAYER
- if(EAST)
- target_pixel_x = 16
- if(WEST)
- target_pixel_x = -16
- if(NORTHEAST)
- target_pixel_x = 16
- target_pixel_y = 16
- if(NORTHWEST)
- target_pixel_x = -16
- target_pixel_y = 16
- if(SOUTHEAST)
- target_pixel_x = 16
- target_pixel_y = -16
- layer = ABOVE_MOB_LAYER
- if(SOUTHWEST)
- target_pixel_x = -16
- target_pixel_y = -16
- layer = ABOVE_MOB_LAYER
- animate(src, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = duration)
-
-/obj/effect/overlay/temp/dir_setting/bloodsplatter/xenosplatter
- splatter_type = "xsplatter"
-
-/obj/effect/overlay/temp/dir_setting/speedbike_trail
- name = "speedbike trails"
- icon_state = "ion_fade"
- layer = BELOW_MOB_LAYER
- duration = 10
- randomdir = 0
-
-/obj/effect/overlay/temp/dir_setting/firing_effect
- icon = 'icons/effects/effects.dmi'
- icon_state = "firing_effect"
- duration = 2
-
-/obj/effect/overlay/temp/dir_setting/firing_effect/setDir(newdir)
- switch(newdir)
- if(NORTH)
- layer = BELOW_MOB_LAYER
- pixel_x = rand(-3,3)
- pixel_y = rand(4,6)
- if(SOUTH)
- pixel_x = rand(-3,3)
- pixel_y = rand(-1,1)
- else
- pixel_x = rand(-1,1)
- pixel_y = rand(-1,1)
- ..()
-
-/obj/effect/overlay/temp/dir_setting/firing_effect/energy
- icon_state = "firing_effect_energy"
- duration = 3
-
-/obj/effect/overlay/temp/dir_setting/firing_effect/magic
- icon_state = "shieldsparkles"
- duration = 3
-
-/obj/effect/overlay/temp/dir_setting/ninja
- name = "ninja shadow"
- icon = 'icons/mob/mob.dmi'
- icon_state = "uncloak"
- duration = 9
-
-/obj/effect/overlay/temp/dir_setting/ninja/cloak
- icon_state = "cloak"
-
-/obj/effect/overlay/temp/dir_setting/ninja/shadow
- icon_state = "shadow"
-
-/obj/effect/overlay/temp/dir_setting/ninja/phase
- name = "ninja energy"
- icon_state = "phasein"
-
-/obj/effect/overlay/temp/dir_setting/ninja/phase/out
- icon_state = "phaseout"
-
-/obj/effect/overlay/temp/dir_setting/wraith
- name = "blood"
- icon = 'icons/mob/mob.dmi'
- icon_state = "phase_shift2"
- duration = 12
-
-/obj/effect/overlay/temp/dir_setting/wraith/out
- icon_state = "phase_shift"
-
-/obj/effect/overlay/temp/dir_setting/tailsweep
- icon_state = "tailsweep"
- duration = 4
-
-/obj/effect/overlay/temp/wizard
- name = "water"
- icon = 'icons/mob/mob.dmi'
- icon_state = "reappear"
- duration = 5
-
-/obj/effect/overlay/temp/wizard/out
- icon_state = "liquify"
- duration = 12
-
-/obj/effect/overlay/temp/monkeyify
- icon = 'icons/mob/mob.dmi'
- icon_state = "h2monkey"
- duration = 22
-
-/obj/effect/overlay/temp/monkeyify/humanify
- icon_state = "monkey2h"
-
-/obj/effect/overlay/temp/borgflash
- icon = 'icons/mob/mob.dmi'
- icon_state = "blspell"
- duration = 5
-
-/obj/effect/overlay/temp/guardian
- randomdir = 0
-
-/obj/effect/overlay/temp/guardian/phase
- duration = 5
- icon_state = "phasein"
-
-/obj/effect/overlay/temp/guardian/phase/out
- icon_state = "phaseout"
-
-/obj/effect/overlay/temp/decoy
- desc = "It's a decoy!"
- duration = 15
-
-/obj/effect/overlay/temp/decoy/Initialize(mapload, atom/mimiced_atom)
- . = ..()
- alpha = initial(alpha)
- if(mimiced_atom)
- name = mimiced_atom.name
- appearance = mimiced_atom.appearance
- setDir(mimiced_atom.dir)
- mouse_opacity = 0
-
-/obj/effect/overlay/temp/decoy/fading/Initialize(mapload, atom/mimiced_atom)
- . = ..()
- animate(src, alpha = 0, time = duration)
-
-/obj/effect/overlay/temp/decoy/fading/fivesecond
- duration = 50
-
-/obj/effect/overlay/temp/small_smoke
- icon_state = "smoke"
- duration = 50
-
-/obj/effect/overlay/temp/fire
- icon = 'icons/effects/fire.dmi'
- icon_state = "3"
- duration = 20
-
-/obj/effect/overlay/temp/cult
- randomdir = 0
- duration = 10
-
-/obj/effect/overlay/temp/cult/sparks
- randomdir = 1
- name = "blood sparks"
- icon_state = "bloodsparkles"
-
-/obj/effect/overlay/temp/cult/blood // The traditional teleport
- name = "blood jaunt"
- duration = 12
- icon_state = "bloodin"
-
-/obj/effect/overlay/temp/cult/blood/out
- icon_state = "bloodout"
-
-/obj/effect/overlay/temp/dir_setting/cult/phase // The veil shifter teleport
- name = "phase glow"
- duration = 7
- icon_state = "cultin"
-
-/obj/effect/overlay/temp/dir_setting/cult/phase/out
- icon_state = "cultout"
-
-/obj/effect/overlay/temp/cult/sac
- name = "maw of Nar-Sie"
- icon_state = "sacconsume"
-
-/obj/effect/overlay/temp/cult/door
- name = "unholy glow"
- icon_state = "doorglow"
- layer = CLOSED_FIREDOOR_LAYER //above closed doors
-
-/obj/effect/overlay/temp/cult/door/unruned
- icon_state = "unruneddoorglow"
-
-/obj/effect/overlay/temp/cult/turf
- name = "unholy glow"
- icon_state = "wallglow"
- layer = ABOVE_NORMAL_TURF_LAYER
-
-/obj/effect/overlay/temp/cult/turf/floor
- icon_state = "floorglow"
- duration = 5
-
-
-/obj/effect/overlay/temp/ratvar
- name = "ratvar's light"
- icon = 'icons/effects/clockwork_effects.dmi'
- duration = 8
- randomdir = 0
- layer = ABOVE_NORMAL_TURF_LAYER
-
-/obj/effect/overlay/temp/ratvar/door
- icon_state = "ratvardoorglow"
- layer = CLOSED_DOOR_LAYER //above closed doors
-
-/obj/effect/overlay/temp/ratvar/door/window
- icon_state = "ratvarwindoorglow"
- layer = ABOVE_WINDOW_LAYER
-
-/obj/effect/overlay/temp/ratvar/beam
- icon_state = "ratvarbeamglow"
-
-/obj/effect/overlay/temp/ratvar/beam/door
- layer = CLOSED_DOOR_LAYER
-
-/obj/effect/overlay/temp/ratvar/beam/grille
- layer = BELOW_OBJ_LAYER
-
-/obj/effect/overlay/temp/ratvar/beam/itemconsume
- layer = HIGH_OBJ_LAYER
-
-/obj/effect/overlay/temp/ratvar/beam/falsewall
- layer = OBJ_LAYER
-
-/obj/effect/overlay/temp/ratvar/beam/catwalk
- layer = LATTICE_LAYER
-
-/obj/effect/overlay/temp/ratvar/wall
- icon_state = "ratvarwallglow"
-
-/obj/effect/overlay/temp/ratvar/wall/false
- layer = OBJ_LAYER
-
-/obj/effect/overlay/temp/ratvar/floor
- icon_state = "ratvarfloorglow"
-
-/obj/effect/overlay/temp/ratvar/floor/catwalk
- layer = LATTICE_LAYER
-
-/obj/effect/overlay/temp/ratvar/window
- icon_state = "ratvarwindowglow"
- layer = ABOVE_OBJ_LAYER
-
-/obj/effect/overlay/temp/ratvar/window/single
- icon_state = "ratvarwindowglow_s"
-
-/obj/effect/overlay/temp/ratvar/gear
- icon_state = "ratvargearglow"
- layer = BELOW_OBJ_LAYER
-
-/obj/effect/overlay/temp/ratvar/grille
- icon_state = "ratvargrilleglow"
- layer = BELOW_OBJ_LAYER
-
-/obj/effect/overlay/temp/ratvar/grille/broken
- icon_state = "ratvarbrokengrilleglow"
-
-/obj/effect/overlay/temp/ratvar/mending_mantra
- layer = ABOVE_MOB_LAYER
- duration = 20
- alpha = 200
- icon_state = "mending_mantra"
- light_range = 1.5
- light_color = "#1E8CE1"
-
-/obj/effect/overlay/temp/ratvar/mending_mantra/Initialize(mapload)
- . = ..()
- transform = matrix()*2
- var/matrix/M = transform
- M.Turn(90)
- animate(src, alpha = 20, time = duration, easing = BOUNCE_EASING, flags = ANIMATION_PARALLEL)
- animate(src, transform = M, time = duration, flags = ANIMATION_PARALLEL)
-
-/obj/effect/overlay/temp/ratvar/volt_hit
- name = "volt blast"
- layer = ABOVE_MOB_LAYER
- duration = 5
- icon_state = "volt_hit"
- light_range = 1.5
- light_power = 2
- light_color = LIGHT_COLOR_ORANGE
- var/mob/user
- var/damage = 20
-
-/obj/effect/overlay/temp/ratvar/volt_hit/Initialize(mapload, caster, multiplier)
- if(multiplier)
- damage *= multiplier
- duration = max(round(damage * 0.2), 1)
- . = ..()
-
-/obj/effect/overlay/temp/ratvar/volt_hit/true/Initialize(mapload, caster, multiplier)
- . = ..()
- user = caster
- if(user)
- var/matrix/M = new
- M.Turn(Get_Angle(src, user))
- transform = M
- INVOKE_ASYNC(src, .proc/volthit)
-
-/obj/effect/overlay/temp/ratvar/volt_hit/proc/volthit()
- if(user)
- Beam(get_turf(user), "volt_ray", time=duration, maxdistance=8, beam_type=/obj/effect/ebeam/volt_ray)
- var/hit_amount = 0
- var/turf/T = get_turf(src)
- for(var/mob/living/L in T)
- if(is_servant_of_ratvar(L))
- continue
- var/obj/item/I = L.null_rod_check()
- if(I)
- L.visible_message("Strange energy flows into [L]'s [I.name]!", \
- "Your [I.name] shields you from [src]!")
- continue
- L.visible_message("[L] is struck by a [name]!", "You're struck by a [name]!")
- L.apply_damage(damage, BURN, "chest", L.run_armor_check("chest", "laser", "Your armor absorbs [src]!", "Your armor blocks part of [src]!", 0, "Your armor was penetrated by [src]!"))
- add_logs(user, L, "struck with a volt blast")
- hit_amount++
- for(var/obj/mecha/M in T)
- if(M.occupant)
- if(is_servant_of_ratvar(M.occupant))
- continue
- to_chat(M.occupant, "Your [M.name] is struck by a [name]!")
- M.visible_message("[M] is struck by a [name]!")
- M.take_damage(damage, BURN, 0, 0)
- hit_amount++
- if(hit_amount)
- playsound(src, 'sound/machines/defib_zap.ogg', damage*hit_amount, 1, -1)
- else
- playsound(src, "sparks", 50, 1)
-
-/obj/effect/overlay/temp/ratvar/ocular_warden
- name = "warden's gaze"
- layer = ABOVE_MOB_LAYER
- icon_state = "warden_gaze"
- duration = 3
-
-/obj/effect/overlay/temp/ratvar/ocular_warden/Initialize()
- . = ..()
- pixel_x = rand(-8, 8)
- pixel_y = rand(-10, 10)
- animate(src, alpha = 0, time = 3, easing = EASE_OUT)
-
-/obj/effect/overlay/temp/ratvar/spearbreak
- icon = 'icons/effects/64x64.dmi'
- icon_state = "ratvarspearbreak"
- layer = BELOW_MOB_LAYER
- pixel_y = -16
- pixel_x = -16
-
-/obj/effect/overlay/temp/ratvar/geis_binding
- icon_state = "geisbinding"
-
-/obj/effect/overlay/temp/ratvar/geis_binding/top
- icon_state = "geisbinding_top"
-
-/obj/effect/overlay/temp/ratvar/component
- icon = 'icons/obj/clockwork_objects.dmi'
- icon_state = "belligerent_eye"
- layer = ABOVE_MOB_LAYER
- duration = 10
-
-/obj/effect/overlay/temp/ratvar/component/Initialize()
- . = ..()
- transform = matrix()*0.75
- pixel_x = rand(-10, 10)
- pixel_y = rand(-10, -2)
- animate(src, pixel_y = pixel_y + 10, alpha = 50, time = 10, easing = EASE_OUT)
-
-/obj/effect/overlay/temp/ratvar/component/cogwheel
- icon_state = "vanguard_cogwheel"
-
-/obj/effect/overlay/temp/ratvar/component/capacitor
- icon_state = "geis_capacitor"
-
-/obj/effect/overlay/temp/ratvar/component/alloy
- icon_state = "replicant_alloy"
-
-/obj/effect/overlay/temp/ratvar/component/ansible
- icon_state = "hierophant_ansible"
-
-/obj/effect/overlay/temp/ratvar/sigil
- name = "glowing circle"
- icon_state = "sigildull"
-
-/obj/effect/overlay/temp/ratvar/sigil/transgression
- color = "#FAE48C"
- layer = ABOVE_MOB_LAYER
- duration = 70
- light_range = 5
- light_power = 2
- light_color = "#FAE48C"
-
-/obj/effect/overlay/temp/ratvar/sigil/transgression/Initialize()
- . = ..()
- var/oldtransform = transform
- animate(src, transform = matrix()*2, time = 5)
- animate(transform = oldtransform, alpha = 0, time = 65)
-
-/obj/effect/overlay/temp/ratvar/sigil/vitality
- color = "#1E8CE1"
- icon_state = "sigilactivepulse"
- layer = ABOVE_MOB_LAYER
- light_range = 1.4
- light_power = 0.5
- light_color = "#1E8CE1"
-
-/obj/effect/overlay/temp/ratvar/sigil/accession
- color = "#AF0AAF"
- layer = ABOVE_MOB_LAYER
- duration = 70
- icon_state = "sigilactiveoverlay"
- alpha = 0
-
-
-/obj/effect/overlay/temp/revenant
- name = "spooky lights"
- icon_state = "purplesparkles"
-
-/obj/effect/overlay/temp/revenant/cracks
- name = "glowing cracks"
- icon_state = "purplecrack"
- duration = 6
-
-
-/obj/effect/overlay/temp/gravpush
- name = "gravity wave"
- icon_state = "shieldsparkles"
- duration = 5
-
-/obj/effect/overlay/temp/telekinesis
- name = "telekinetic force"
- icon_state = "empdisable"
- duration = 5
-
-/obj/effect/overlay/temp/emp
- name = "emp sparks"
- icon_state = "empdisable"
-
-/obj/effect/overlay/temp/emp/pulse
- name = "emp pulse"
- icon_state = "emppulse"
- duration = 8
- randomdir = 0
-
-/obj/effect/overlay/temp/gib_animation
- icon = 'icons/mob/mob.dmi'
- duration = 15
-
-/obj/effect/overlay/temp/gib_animation/Initialize(mapload, gib_icon)
- icon_state = gib_icon // Needs to be before ..() so icon is correct
- . = ..()
-
-/obj/effect/overlay/temp/gib_animation/ex_act(severity)
- return //so the overlay isn't deleted by the explosion that gibbed the mob.
-
-/obj/effect/overlay/temp/gib_animation/animal
- icon = 'icons/mob/animal.dmi'
-
-/obj/effect/overlay/temp/dust_animation
- icon = 'icons/mob/mob.dmi'
- duration = 15
-
-/obj/effect/overlay/temp/dust_animation/Initialize(mapload, dust_icon)
- icon_state = dust_icon // Before ..() so the correct icon is flick()'d
- . = ..()
-
-/obj/effect/overlay/temp/mummy_animation
- icon = 'icons/mob/mob.dmi'
- icon_state = "mummy_revive"
- duration = 20
-
-/obj/effect/overlay/temp/heal //color is white by default, set to whatever is needed
- name = "healing glow"
- icon_state = "heal"
- duration = 15
-
-/obj/effect/overlay/temp/heal/Initialize(mapload, colour)
- if(colour)
- color = colour
- . = ..()
- pixel_x = rand(-12, 12)
- pixel_y = rand(-9, 0)
-
-/obj/effect/overlay/temp/kinetic_blast
- name = "kinetic explosion"
- icon = 'icons/obj/projectiles.dmi'
- icon_state = "kinetic_blast"
- layer = ABOVE_ALL_MOB_LAYER
- duration = 4
-
-/obj/effect/overlay/temp/explosion
- name = "explosion"
- icon = 'icons/effects/96x96.dmi'
- icon_state = "explosion"
- pixel_x = -32
- pixel_y = -32
- duration = 8
-
-/obj/effect/overlay/temp/explosion/fast
- icon_state = "explosionfast"
- duration = 4
-
-/obj/effect/overlay/temp/blob
- name = "blob"
- icon_state = "blob_attack"
- alpha = 140
- randomdir = 0
- duration = 6
-
-/obj/effect/overlay/temp/impact_effect
- icon_state = "impact_bullet"
- duration = 5
-
-/obj/effect/overlay/temp/impact_effect/Initialize(mapload, atom/target, obj/item/projectile/P)
- if(target == P.original) //the projectile hit the target originally clicked
- pixel_x = P.p_x + target.pixel_x - 16 + rand(-4,4)
- pixel_y = P.p_y + target.pixel_y - 16 + rand(-4,4)
- else
- pixel_x = target.pixel_x + rand(-4,4)
- pixel_y = target.pixel_y + rand(-4,4)
- . = ..()
-
-/obj/effect/overlay/temp/impact_effect/red_laser
- icon_state = "impact_laser"
- duration = 4
-
-/obj/effect/overlay/temp/impact_effect/red_laser/wall
- icon_state = "impact_laser_wall"
- duration = 10
-
-/obj/effect/overlay/temp/impact_effect/blue_laser
- icon_state = "impact_laser_blue"
- duration = 4
-
-/obj/effect/overlay/temp/impact_effect/green_laser
- icon_state = "impact_laser_green"
- duration = 4
-
-/obj/effect/overlay/temp/impact_effect/purple_laser
- icon_state = "impact_laser_purple"
- duration = 4
-
-/obj/effect/overlay/temp/impact_effect/ion
- icon_state = "shieldsparkles"
- duration = 6
-
-/obj/effect/overlay/temp/heart
- name = "heart"
- icon = 'icons/mob/animal.dmi'
- icon_state = "heart"
- duration = 25
-
-/obj/effect/overlay/temp/heart/Initialize(mapload)
- . = ..()
- pixel_x = rand(-4,4)
- pixel_y = rand(-4,4)
-
- animate(src, pixel_y = pixel_y + 32, alpha = 0, time = 25)
-
/obj/effect/overlay/palmtree_r
name = "Palm tree"
icon = 'icons/misc/beach2.dmi'
diff --git a/code/game/objects/effects/spawners/xeno_egg_delivery.dm b/code/game/objects/effects/spawners/xeno_egg_delivery.dm
index 91db494d9b8..a452dae7497 100644
--- a/code/game/objects/effects/spawners/xeno_egg_delivery.dm
+++ b/code/game/objects/effects/spawners/xeno_egg_delivery.dm
@@ -10,7 +10,7 @@
var/area/A = get_area(T)
new /obj/structure/alien/egg(T)
- new /obj/effect/overlay/temp/gravpush(T)
+ new /obj/effect/temp_visual/gravpush(T)
playsound(T, 'sound/items/party_horn.ogg', 50, 1, -1)
message_admins("An alien egg has been delivered to [A] at [ADMIN_COORDJMP(T)].")
diff --git a/code/game/objects/effects/temporary_visuals/clockcult.dm b/code/game/objects/effects/temporary_visuals/clockcult.dm
new file mode 100644
index 00000000000..1eae2a3c643
--- /dev/null
+++ b/code/game/objects/effects/temporary_visuals/clockcult.dm
@@ -0,0 +1,218 @@
+//temporary visual effects(/obj/effect/temp_visual) used by clockcult stuff
+/obj/effect/temp_visual/ratvar
+ name = "ratvar's light"
+ icon = 'icons/effects/clockwork_effects.dmi'
+ duration = 8
+ randomdir = 0
+ layer = ABOVE_NORMAL_TURF_LAYER
+
+/obj/effect/temp_visual/ratvar/door
+ icon_state = "ratvardoorglow"
+ layer = CLOSED_DOOR_LAYER //above closed doors
+
+/obj/effect/temp_visual/ratvar/door/window
+ icon_state = "ratvarwindoorglow"
+ layer = ABOVE_WINDOW_LAYER
+
+/obj/effect/temp_visual/ratvar/beam
+ icon_state = "ratvarbeamglow"
+
+/obj/effect/temp_visual/ratvar/beam/door
+ layer = CLOSED_DOOR_LAYER
+
+/obj/effect/temp_visual/ratvar/beam/grille
+ layer = BELOW_OBJ_LAYER
+
+/obj/effect/temp_visual/ratvar/beam/itemconsume
+ layer = HIGH_OBJ_LAYER
+
+/obj/effect/temp_visual/ratvar/beam/falsewall
+ layer = OBJ_LAYER
+
+/obj/effect/temp_visual/ratvar/beam/catwalk
+ layer = LATTICE_LAYER
+
+/obj/effect/temp_visual/ratvar/wall
+ icon_state = "ratvarwallglow"
+
+/obj/effect/temp_visual/ratvar/wall/false
+ layer = OBJ_LAYER
+
+/obj/effect/temp_visual/ratvar/floor
+ icon_state = "ratvarfloorglow"
+
+/obj/effect/temp_visual/ratvar/floor/catwalk
+ layer = LATTICE_LAYER
+
+/obj/effect/temp_visual/ratvar/window
+ icon_state = "ratvarwindowglow"
+ layer = ABOVE_OBJ_LAYER
+
+/obj/effect/temp_visual/ratvar/window/single
+ icon_state = "ratvarwindowglow_s"
+
+/obj/effect/temp_visual/ratvar/gear
+ icon_state = "ratvargearglow"
+ layer = BELOW_OBJ_LAYER
+
+/obj/effect/temp_visual/ratvar/grille
+ icon_state = "ratvargrilleglow"
+ layer = BELOW_OBJ_LAYER
+
+/obj/effect/temp_visual/ratvar/grille/broken
+ icon_state = "ratvarbrokengrilleglow"
+
+/obj/effect/temp_visual/ratvar/mending_mantra
+ layer = ABOVE_MOB_LAYER
+ duration = 20
+ alpha = 200
+ icon_state = "mending_mantra"
+ light_range = 1.5
+ light_color = "#1E8CE1"
+
+/obj/effect/temp_visual/ratvar/mending_mantra/Initialize(mapload)
+ . = ..()
+ transform = matrix()*2
+ var/matrix/M = transform
+ M.Turn(90)
+ animate(src, alpha = 20, time = duration, easing = BOUNCE_EASING, flags = ANIMATION_PARALLEL)
+ animate(src, transform = M, time = duration, flags = ANIMATION_PARALLEL)
+
+/obj/effect/temp_visual/ratvar/volt_hit
+ name = "volt blast"
+ layer = ABOVE_MOB_LAYER
+ duration = 5
+ icon_state = "volt_hit"
+ light_range = 1.5
+ light_power = 2
+ light_color = LIGHT_COLOR_ORANGE
+ var/mob/user
+ var/damage = 20
+
+/obj/effect/temp_visual/ratvar/volt_hit/Initialize(mapload, caster, multiplier)
+ if(multiplier)
+ damage *= multiplier
+ duration = max(round(damage * 0.2), 1)
+ . = ..()
+
+/obj/effect/temp_visual/ratvar/volt_hit/true/Initialize(mapload, caster, multiplier)
+ . = ..()
+ user = caster
+ if(user)
+ var/matrix/M = new
+ M.Turn(Get_Angle(src, user))
+ transform = M
+ INVOKE_ASYNC(src, .proc/volthit)
+
+/obj/effect/temp_visual/ratvar/volt_hit/proc/volthit()
+ if(user)
+ Beam(get_turf(user), "volt_ray", time=duration, maxdistance=8, beam_type=/obj/effect/ebeam/volt_ray)
+ var/hit_amount = 0
+ var/turf/T = get_turf(src)
+ for(var/mob/living/L in T)
+ if(is_servant_of_ratvar(L))
+ continue
+ var/obj/item/I = L.null_rod_check()
+ if(I)
+ L.visible_message("Strange energy flows into [L]'s [I.name]!", \
+ "Your [I.name] shields you from [src]!")
+ continue
+ L.visible_message("[L] is struck by a [name]!", "You're struck by a [name]!")
+ L.apply_damage(damage, BURN, "chest", L.run_armor_check("chest", "laser", "Your armor absorbs [src]!", "Your armor blocks part of [src]!", 0, "Your armor was penetrated by [src]!"))
+ add_logs(user, L, "struck with a volt blast")
+ hit_amount++
+ for(var/obj/mecha/M in T)
+ if(M.occupant)
+ if(is_servant_of_ratvar(M.occupant))
+ continue
+ to_chat(M.occupant, "Your [M.name] is struck by a [name]!")
+ M.visible_message("[M] is struck by a [name]!")
+ M.take_damage(damage, BURN, 0, 0)
+ hit_amount++
+ if(hit_amount)
+ playsound(src, 'sound/machines/defib_zap.ogg', damage*hit_amount, 1, -1)
+ else
+ playsound(src, "sparks", 50, 1)
+
+/obj/effect/temp_visual/ratvar/ocular_warden
+ name = "warden's gaze"
+ layer = ABOVE_MOB_LAYER
+ icon_state = "warden_gaze"
+ duration = 3
+
+/obj/effect/temp_visual/ratvar/ocular_warden/Initialize()
+ . = ..()
+ pixel_x = rand(-8, 8)
+ pixel_y = rand(-10, 10)
+ animate(src, alpha = 0, time = 3, easing = EASE_OUT)
+
+/obj/effect/temp_visual/ratvar/spearbreak
+ icon = 'icons/effects/64x64.dmi'
+ icon_state = "ratvarspearbreak"
+ layer = BELOW_MOB_LAYER
+ pixel_y = -16
+ pixel_x = -16
+
+/obj/effect/temp_visual/ratvar/geis_binding
+ icon_state = "geisbinding"
+
+/obj/effect/temp_visual/ratvar/geis_binding/top
+ icon_state = "geisbinding_top"
+
+/obj/effect/temp_visual/ratvar/component
+ icon = 'icons/obj/clockwork_objects.dmi'
+ icon_state = "belligerent_eye"
+ layer = ABOVE_MOB_LAYER
+ duration = 10
+
+/obj/effect/temp_visual/ratvar/component/Initialize()
+ . = ..()
+ transform = matrix()*0.75
+ pixel_x = rand(-10, 10)
+ pixel_y = rand(-10, -2)
+ animate(src, pixel_y = pixel_y + 10, alpha = 50, time = 10, easing = EASE_OUT)
+
+/obj/effect/temp_visual/ratvar/component/cogwheel
+ icon_state = "vanguard_cogwheel"
+
+/obj/effect/temp_visual/ratvar/component/capacitor
+ icon_state = "geis_capacitor"
+
+/obj/effect/temp_visual/ratvar/component/alloy
+ icon_state = "replicant_alloy"
+
+/obj/effect/temp_visual/ratvar/component/ansible
+ icon_state = "hierophant_ansible"
+
+/obj/effect/temp_visual/ratvar/sigil
+ name = "glowing circle"
+ icon_state = "sigildull"
+
+/obj/effect/temp_visual/ratvar/sigil/transgression
+ color = "#FAE48C"
+ layer = ABOVE_MOB_LAYER
+ duration = 70
+ light_range = 5
+ light_power = 2
+ light_color = "#FAE48C"
+
+/obj/effect/temp_visual/ratvar/sigil/transgression/Initialize()
+ . = ..()
+ var/oldtransform = transform
+ animate(src, transform = matrix()*2, time = 5)
+ animate(transform = oldtransform, alpha = 0, time = 65)
+
+/obj/effect/temp_visual/ratvar/sigil/vitality
+ color = "#1E8CE1"
+ icon_state = "sigilactivepulse"
+ layer = ABOVE_MOB_LAYER
+ light_range = 1.4
+ light_power = 0.5
+ light_color = "#1E8CE1"
+
+/obj/effect/temp_visual/ratvar/sigil/accession
+ color = "#AF0AAF"
+ layer = ABOVE_MOB_LAYER
+ duration = 70
+ icon_state = "sigilactiveoverlay"
+ alpha = 0
diff --git a/code/game/objects/effects/temporary_visuals/cult.dm b/code/game/objects/effects/temporary_visuals/cult.dm
new file mode 100644
index 00000000000..78cc50cfc1e
--- /dev/null
+++ b/code/game/objects/effects/temporary_visuals/cult.dm
@@ -0,0 +1,144 @@
+//temporary visual effects(/obj/effect/temp_visual) used by cult stuff
+/obj/effect/temp_visual/cult
+ icon = 'icons/effects/cult_effects.dmi'
+ randomdir = 0
+ duration = 10
+
+/obj/effect/temp_visual/cult/sparks
+ randomdir = 1
+ name = "blood sparks"
+ icon_state = "bloodsparkles"
+
+/obj/effect/temp_visual/cult/blood // The traditional teleport
+ name = "blood jaunt"
+ duration = 12
+ icon_state = "bloodin"
+
+/obj/effect/temp_visual/cult/blood/out
+ icon_state = "bloodout"
+
+/obj/effect/temp_visual/dir_setting/cult/phase // The veil shifter teleport
+ name = "phase glow"
+ duration = 7
+ icon_state = "cultin"
+
+/obj/effect/temp_visual/dir_setting/cult/phase/out
+ icon_state = "cultout"
+
+/obj/effect/temp_visual/cult/sac
+ name = "maw of Nar-Sie"
+ icon_state = "sacconsume"
+
+/obj/effect/temp_visual/cult/door
+ name = "unholy glow"
+ icon_state = "doorglow"
+ layer = CLOSED_FIREDOOR_LAYER //above closed doors
+
+/obj/effect/temp_visual/cult/door/unruned
+ icon_state = "unruneddoorglow"
+
+/obj/effect/temp_visual/cult/turf
+ name = "unholy glow"
+ icon_state = "wallglow"
+ layer = ABOVE_NORMAL_TURF_LAYER
+
+/obj/effect/temp_visual/cult/turf/floor
+ icon_state = "floorglow"
+ duration = 5
+
+//visuals for runes being magically created
+/obj/effect/temp_visual/cult/rune_spawn
+ icon_state = "runeouter"
+ alpha = 0
+ var/turnedness = 179 //179 turns counterclockwise, 181 turns clockwise
+
+/obj/effect/temp_visual/cult/rune_spawn/Initialize(mapload, set_duration, set_color)
+ if(isnum(set_duration))
+ duration = set_duration
+ if(set_color)
+ add_atom_colour(set_color, FIXED_COLOUR_PRIORITY)
+ . = ..()
+ var/oldtransform = transform
+ transform = matrix()*2
+ var/matrix/M = transform
+ M.Turn(turnedness)
+ transform = M
+ animate(src, alpha = 255, time = duration, easing = BOUNCE_EASING, flags = ANIMATION_PARALLEL)
+ animate(src, transform = oldtransform, time = duration, flags = ANIMATION_PARALLEL)
+
+/obj/effect/temp_visual/cult/rune_spawn/rune1
+ icon_state = "rune1words"
+ turnedness = 181
+
+/obj/effect/temp_visual/cult/rune_spawn/rune1/inner
+ icon_state = "rune1inner"
+ turnedness = 179
+
+/obj/effect/temp_visual/cult/rune_spawn/rune1/center
+ icon_state = "rune1center"
+
+/obj/effect/temp_visual/cult/rune_spawn/rune2
+ icon_state = "rune2words"
+ turnedness = 181
+
+/obj/effect/temp_visual/cult/rune_spawn/rune2/inner
+ icon_state = "rune2inner"
+ turnedness = 179
+
+/obj/effect/temp_visual/cult/rune_spawn/rune2/center
+ icon_state = "rune2center"
+
+/obj/effect/temp_visual/cult/rune_spawn/rune3
+ icon_state = "rune3words"
+ turnedness = 181
+
+/obj/effect/temp_visual/cult/rune_spawn/rune3/inner
+ icon_state = "rune3inner"
+ turnedness = 179
+
+/obj/effect/temp_visual/cult/rune_spawn/rune3/center
+ icon_state = "rune3center"
+
+/obj/effect/temp_visual/cult/rune_spawn/rune4
+ icon_state = "rune4words"
+ turnedness = 181
+
+/obj/effect/temp_visual/cult/rune_spawn/rune4/inner
+ icon_state = "rune4inner"
+ turnedness = 179
+
+/obj/effect/temp_visual/cult/rune_spawn/rune4/center
+ icon_state = "rune4center"
+
+/obj/effect/temp_visual/cult/rune_spawn/rune5
+ icon_state = "rune5words"
+ turnedness = 181
+
+/obj/effect/temp_visual/cult/rune_spawn/rune5/inner
+ icon_state = "rune5inner"
+ turnedness = 179
+
+/obj/effect/temp_visual/cult/rune_spawn/rune5/center
+ icon_state = "rune5center"
+
+/obj/effect/temp_visual/cult/rune_spawn/rune6
+ icon_state = "rune6words"
+ turnedness = 181
+
+/obj/effect/temp_visual/cult/rune_spawn/rune6/inner
+ icon_state = "rune6inner"
+ turnedness = 179
+
+/obj/effect/temp_visual/cult/rune_spawn/rune6/center
+ icon_state = "rune6center"
+
+/obj/effect/temp_visual/cult/rune_spawn/rune7
+ icon_state = "rune7words"
+ turnedness = 181
+
+/obj/effect/temp_visual/cult/rune_spawn/rune7/inner
+ icon_state = "rune7inner"
+ turnedness = 179
+
+/obj/effect/temp_visual/cult/rune_spawn/rune7/center
+ icon_state = "rune7center"
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
new file mode 100644
index 00000000000..c3cf2a51039
--- /dev/null
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -0,0 +1,312 @@
+//unsorted miscellaneous temporary visuals
+/obj/effect/temp_visual/dir_setting/bloodsplatter
+ icon = 'icons/effects/blood.dmi'
+ duration = 5
+ randomdir = FALSE
+ layer = BELOW_MOB_LAYER
+ var/splatter_type = "splatter"
+
+/obj/effect/temp_visual/dir_setting/bloodsplatter/Initialize(mapload, set_dir)
+ if(set_dir in GLOB.diagonals)
+ icon_state = "[splatter_type][pick(1, 2, 6)]"
+ else
+ icon_state = "[splatter_type][pick(3, 4, 5)]"
+ . = ..()
+ var/target_pixel_x = 0
+ var/target_pixel_y = 0
+ switch(set_dir)
+ if(NORTH)
+ target_pixel_y = 16
+ if(SOUTH)
+ target_pixel_y = -16
+ layer = ABOVE_MOB_LAYER
+ if(EAST)
+ target_pixel_x = 16
+ if(WEST)
+ target_pixel_x = -16
+ if(NORTHEAST)
+ target_pixel_x = 16
+ target_pixel_y = 16
+ if(NORTHWEST)
+ target_pixel_x = -16
+ target_pixel_y = 16
+ if(SOUTHEAST)
+ target_pixel_x = 16
+ target_pixel_y = -16
+ layer = ABOVE_MOB_LAYER
+ if(SOUTHWEST)
+ target_pixel_x = -16
+ target_pixel_y = -16
+ layer = ABOVE_MOB_LAYER
+ animate(src, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = duration)
+
+/obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter
+ splatter_type = "xsplatter"
+
+/obj/effect/temp_visual/dir_setting/speedbike_trail
+ name = "speedbike trails"
+ icon_state = "ion_fade"
+ layer = BELOW_MOB_LAYER
+ duration = 10
+ randomdir = 0
+
+/obj/effect/temp_visual/dir_setting/firing_effect
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "firing_effect"
+ duration = 2
+
+/obj/effect/temp_visual/dir_setting/firing_effect/setDir(newdir)
+ switch(newdir)
+ if(NORTH)
+ layer = BELOW_MOB_LAYER
+ pixel_x = rand(-3,3)
+ pixel_y = rand(4,6)
+ if(SOUTH)
+ pixel_x = rand(-3,3)
+ pixel_y = rand(-1,1)
+ else
+ pixel_x = rand(-1,1)
+ pixel_y = rand(-1,1)
+ ..()
+
+/obj/effect/temp_visual/dir_setting/firing_effect/energy
+ icon_state = "firing_effect_energy"
+ duration = 3
+
+/obj/effect/temp_visual/dir_setting/firing_effect/magic
+ icon_state = "shieldsparkles"
+ duration = 3
+
+/obj/effect/temp_visual/dir_setting/ninja
+ name = "ninja shadow"
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "uncloak"
+ duration = 9
+
+/obj/effect/temp_visual/dir_setting/ninja/cloak
+ icon_state = "cloak"
+
+/obj/effect/temp_visual/dir_setting/ninja/shadow
+ icon_state = "shadow"
+
+/obj/effect/temp_visual/dir_setting/ninja/phase
+ name = "ninja energy"
+ icon_state = "phasein"
+
+/obj/effect/temp_visual/dir_setting/ninja/phase/out
+ icon_state = "phaseout"
+
+/obj/effect/temp_visual/dir_setting/wraith
+ name = "blood"
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "phase_shift2"
+ duration = 12
+
+/obj/effect/temp_visual/dir_setting/wraith/out
+ icon_state = "phase_shift"
+
+/obj/effect/temp_visual/dir_setting/tailsweep
+ icon_state = "tailsweep"
+ duration = 4
+
+/obj/effect/temp_visual/wizard
+ name = "water"
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "reappear"
+ duration = 5
+
+/obj/effect/temp_visual/wizard/out
+ icon_state = "liquify"
+ duration = 12
+
+/obj/effect/temp_visual/monkeyify
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "h2monkey"
+ duration = 22
+
+/obj/effect/temp_visual/monkeyify/humanify
+ icon_state = "monkey2h"
+
+/obj/effect/temp_visual/borgflash
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "blspell"
+ duration = 5
+
+/obj/effect/temp_visual/guardian
+ randomdir = 0
+
+/obj/effect/temp_visual/guardian/phase
+ duration = 5
+ icon_state = "phasein"
+
+/obj/effect/temp_visual/guardian/phase/out
+ icon_state = "phaseout"
+
+/obj/effect/temp_visual/decoy
+ desc = "It's a decoy!"
+ duration = 15
+
+/obj/effect/temp_visual/decoy/Initialize(mapload, atom/mimiced_atom)
+ . = ..()
+ alpha = initial(alpha)
+ if(mimiced_atom)
+ name = mimiced_atom.name
+ appearance = mimiced_atom.appearance
+ setDir(mimiced_atom.dir)
+ mouse_opacity = 0
+
+/obj/effect/temp_visual/decoy/fading/Initialize(mapload, atom/mimiced_atom)
+ . = ..()
+ animate(src, alpha = 0, time = duration)
+
+/obj/effect/temp_visual/decoy/fading/fivesecond
+ duration = 50
+
+/obj/effect/temp_visual/small_smoke
+ icon_state = "smoke"
+ duration = 50
+
+/obj/effect/temp_visual/fire
+ icon = 'icons/effects/fire.dmi'
+ icon_state = "3"
+ duration = 20
+
+/obj/effect/temp_visual/revenant
+ name = "spooky lights"
+ icon_state = "purplesparkles"
+
+/obj/effect/temp_visual/revenant/cracks
+ name = "glowing cracks"
+ icon_state = "purplecrack"
+ duration = 6
+
+/obj/effect/temp_visual/gravpush
+ name = "gravity wave"
+ icon_state = "shieldsparkles"
+ duration = 5
+
+/obj/effect/temp_visual/telekinesis
+ name = "telekinetic force"
+ icon_state = "empdisable"
+ duration = 5
+
+/obj/effect/temp_visual/emp
+ name = "emp sparks"
+ icon_state = "empdisable"
+
+/obj/effect/temp_visual/emp/pulse
+ name = "emp pulse"
+ icon_state = "emppulse"
+ duration = 8
+ randomdir = 0
+
+/obj/effect/temp_visual/gib_animation
+ icon = 'icons/mob/mob.dmi'
+ duration = 15
+
+/obj/effect/temp_visual/gib_animation/Initialize(mapload, gib_icon)
+ icon_state = gib_icon // Needs to be before ..() so icon is correct
+ . = ..()
+
+/obj/effect/temp_visual/gib_animation/animal
+ icon = 'icons/mob/animal.dmi'
+
+/obj/effect/temp_visual/dust_animation
+ icon = 'icons/mob/mob.dmi'
+ duration = 15
+
+/obj/effect/temp_visual/dust_animation/Initialize(mapload, dust_icon)
+ icon_state = dust_icon // Before ..() so the correct icon is flick()'d
+ . = ..()
+
+/obj/effect/temp_visual/mummy_animation
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "mummy_revive"
+ duration = 20
+
+/obj/effect/temp_visual/heal //color is white by default, set to whatever is needed
+ name = "healing glow"
+ icon_state = "heal"
+ duration = 15
+
+/obj/effect/temp_visual/heal/Initialize(mapload, set_color)
+ if(set_color)
+ add_atom_colour(set_color, FIXED_COLOUR_PRIORITY)
+ . = ..()
+ pixel_x = rand(-12, 12)
+ pixel_y = rand(-9, 0)
+
+/obj/effect/temp_visual/kinetic_blast
+ name = "kinetic explosion"
+ icon = 'icons/obj/projectiles.dmi'
+ icon_state = "kinetic_blast"
+ layer = ABOVE_ALL_MOB_LAYER
+ duration = 4
+
+/obj/effect/temp_visual/explosion
+ name = "explosion"
+ icon = 'icons/effects/96x96.dmi'
+ icon_state = "explosion"
+ pixel_x = -32
+ pixel_y = -32
+ duration = 8
+
+/obj/effect/temp_visual/explosion/fast
+ icon_state = "explosionfast"
+ duration = 4
+
+/obj/effect/temp_visual/blob
+ name = "blob"
+ icon_state = "blob_attack"
+ alpha = 140
+ randomdir = 0
+ duration = 6
+
+/obj/effect/temp_visual/impact_effect
+ icon_state = "impact_bullet"
+ duration = 5
+
+/obj/effect/temp_visual/impact_effect/Initialize(mapload, atom/target, obj/item/projectile/P)
+ if(target == P.original) //the projectile hit the target originally clicked
+ pixel_x = P.p_x + target.pixel_x - 16 + rand(-4,4)
+ pixel_y = P.p_y + target.pixel_y - 16 + rand(-4,4)
+ else
+ pixel_x = target.pixel_x + rand(-4,4)
+ pixel_y = target.pixel_y + rand(-4,4)
+ . = ..()
+
+/obj/effect/temp_visual/impact_effect/red_laser
+ icon_state = "impact_laser"
+ duration = 4
+
+/obj/effect/temp_visual/impact_effect/red_laser/wall
+ icon_state = "impact_laser_wall"
+ duration = 10
+
+/obj/effect/temp_visual/impact_effect/blue_laser
+ icon_state = "impact_laser_blue"
+ duration = 4
+
+/obj/effect/temp_visual/impact_effect/green_laser
+ icon_state = "impact_laser_green"
+ duration = 4
+
+/obj/effect/temp_visual/impact_effect/purple_laser
+ icon_state = "impact_laser_purple"
+ duration = 4
+
+/obj/effect/temp_visual/impact_effect/ion
+ icon_state = "shieldsparkles"
+ duration = 6
+
+/obj/effect/temp_visual/heart
+ name = "heart"
+ icon = 'icons/mob/animal.dmi'
+ icon_state = "heart"
+ duration = 25
+
+/obj/effect/temp_visual/heart/Initialize(mapload)
+ . = ..()
+ pixel_x = rand(-4,4)
+ pixel_y = rand(-4,4)
+ animate(src, pixel_y = pixel_y + 32, alpha = 0, time = 25)
diff --git a/code/game/objects/effects/temporary_visuals/temporary_visual.dm b/code/game/objects/effects/temporary_visuals/temporary_visual.dm
new file mode 100644
index 00000000000..44b9b91224a
--- /dev/null
+++ b/code/game/objects/effects/temporary_visuals/temporary_visual.dm
@@ -0,0 +1,37 @@
+//temporary visual effects
+/obj/effect/temp_visual
+ icon_state = "nothing"
+ anchored = 1
+ layer = ABOVE_MOB_LAYER
+ mouse_opacity = 0
+ var/duration = 10 //in deciseconds
+ var/randomdir = TRUE
+ var/timerid
+
+/obj/effect/temp_visual/Initialize()
+ . = ..()
+ if(randomdir)
+ setDir(pick(GLOB.cardinal))
+
+ timerid = QDEL_IN(src, duration)
+
+/obj/effect/temp_visual/Destroy()
+ . = ..()
+ deltimer(timerid)
+
+/obj/effect/temp_visual/singularity_act()
+ return
+
+/obj/effect/temp_visual/singularity_pull()
+ return
+
+/obj/effect/temp_visual/ex_act()
+ return
+
+/obj/effect/temp_visual/dir_setting
+ randomdir = FALSE
+
+/obj/effect/temp_visual/dir_setting/Initialize(mapload, set_dir)
+ if(set_dir)
+ setDir(set_dir)
+ . = ..()
diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm
index 0a87fc55dba..eb8602da5da 100644
--- a/code/game/objects/empulse.dm
+++ b/code/game/objects/empulse.dm
@@ -9,7 +9,7 @@
log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ")
if(heavy_range > 1)
- new /obj/effect/overlay/temp/emp/pulse(epicenter)
+ new /obj/effect/temp_visual/emp/pulse(epicenter)
if(heavy_range > light_range)
light_range = heavy_range
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 28388d656d3..f275862caa5 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -528,6 +528,9 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
/obj/item/throw_impact(atom/A)
if(A && !QDELETED(A))
+ if(is_hot() && isliving(A))
+ var/mob/living/L = A
+ L.IgniteMob()
var/itempush = 1
if(w_class < 4)
itempush = 0 //too light to push anything
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index 0e4f7200bb1..3ab826ec418 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -56,13 +56,13 @@
qdel(active_dummy)
active_dummy = null
to_chat(usr, "You deactivate \the [src].")
- new /obj/effect/overlay/temp/emp/pulse(get_turf(src))
+ new /obj/effect/temp_visual/emp/pulse(get_turf(src))
else
playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6)
var/obj/effect/dummy/chameleon/C = new/obj/effect/dummy/chameleon(usr.loc)
C.activate(usr, saved_appearance, src)
to_chat(usr, "You activate \the [src].")
- new /obj/effect/overlay/temp/emp/pulse(get_turf(src))
+ new /obj/effect/temp_visual/emp/pulse(get_turf(src))
/obj/item/device/chameleon/proc/disrupt(delete_dummy = 1)
if(active_dummy)
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 7ed563d6b78..dd506c1ad43 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -162,18 +162,18 @@
return
var/T = get_turf(target)
if(locate(/mob/living) in T)
- new /obj/effect/overlay/temp/medical_holosign(T,user) //produce a holographic glow
+ new /obj/effect/temp_visual/medical_holosign(T,user) //produce a holographic glow
holo_cooldown = world.time + 100
return
..()
-/obj/effect/overlay/temp/medical_holosign
+/obj/effect/temp_visual/medical_holosign
name = "medical holosign"
desc = "A small holographic glow that indicates a medic is coming to treat a patient."
icon_state = "medi_holo"
duration = 30
-/obj/effect/overlay/temp/medical_holosign/Initialize(mapload, creator)
+/obj/effect/temp_visual/medical_holosign/Initialize(mapload, creator)
. = ..()
playsound(loc, 'sound/machines/ping.ogg', 50, 0) //make some noise!
if(creator)
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 5b82a2cb412..fbc41fb1bb8 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -293,7 +293,6 @@
// --- Cold, emotionless machines. ---
else if(isobj(M))
jobname = "Machine"
- voice = capitalize(voice)
// --- Unidentifiable mob ---
else
diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm
index 28e42813b6f..ae3a45f457f 100644
--- a/code/game/objects/items/eightball.dm
+++ b/code/game/objects/items/eightball.dm
@@ -4,6 +4,7 @@
icon = 'icons/obj/toy.dmi'
icon_state = "eightball"
+ w_class = WEIGHT_CLASS_TINY
verb_say = "rattles"
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index 73581f9269d..01d7bfd9bdc 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -504,6 +504,113 @@
S.change_head_color(color2)
dropped = TRUE
+//Peacekeeper Cyborg Projectile Dampenening Field
+/obj/item/borg/projectile_dampen
+ name = "Hyperkinetic Dampening projector"
+ desc = "A device that projects a dampening field that weakens kinetic energy above a certain threshold. Projects a field that drains power per second \
+ while active, that will weaken and slow damaging projectiles inside its field. Still being a prototype, it tends to induce a charge on ungrounded metallic surfaces."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "shield"
+ var/maxenergy = 1500
+ var/energy = 1500
+ var/energy_recharge = 7.5
+ var/energy_recharge_cyborg_drain_coefficient = 0.4
+ var/cyborg_cell_critical_percentage = 0.05
+ var/mob/living/silicon/robot/host = null
+ var/datum/proximity_monitor/advanced/dampening_field
+ var/projectile_damage_coefficient = 0.5
+ var/projectile_damage_tick_ecost_coefficient = 2 //Lasers get half their damage chopped off, drains 50 power/tick. Note that fields are processed 5 times per second.
+ var/projectile_speed_coefficient = 1.5 //Higher the coefficient slower the projectile.
+ var/projectile_tick_speed_ecost = 15
+ var/current_damage_dampening = 0
+ var/list/obj/item/projectile/tracked
+ var/image/projectile_effect
+ var/field_radius = 3
+
+/obj/item/borg/projectile_dampen/debug
+ maxenergy = 50000
+ energy = 50000
+ energy_recharge = 5000
+
+/obj/item/borg/projectile_dampen/Initialize()
+ . = ..()
+ projectile_effect = image('icons/effects/fields.dmi', "projectile_dampen_effect")
+ tracked = list()
+ icon_state = "shield0"
+ START_PROCESSING(SSfastprocess, src)
+
+/obj/item/borg/projectile_dampen/Destroy()
+ STOP_PROCESSING(SSfastprocess, src)
+ return ..()
+
+/obj/item/borg/projectile_dampen/attack_self(mob/user)
+ var/active = FALSE
+ if(!istype(dampening_field))
+ activate_field()
+ active = TRUE
+ else
+ deactivate_field()
+ active = FALSE
+ to_chat(user, "You [active? "activate":"deactivate"] the [src].")
+ icon_state = "[initial(icon_state)][active]"
+
+/obj/item/borg/projectile_dampen/proc/activate_field()
+ if(!istype(dampening_field))
+ dampening_field = make_field(/datum/proximity_monitor/advanced/peaceborg_dampener, list("current_range" = field_radius, "host" = src, "projector" = src))
+
+/obj/item/borg/projectile_dampen/proc/deactivate_field()
+ QDEL_NULL(dampening_field)
+ visible_message("The [src] shuts off!")
+ for(var/obj/item/projectile/P in tracked)
+ restore_projectile(P)
+
+/obj/item/borg/projectile_dampen/process()
+ process_recharge()
+ process_usage()
+ update_location()
+
+/obj/item/borg/projectile_dampen/proc/update_location()
+ if(dampening_field)
+ dampening_field.HandleMove()
+
+/obj/item/borg/projectile_dampen/proc/process_usage()
+ var/usage = 0
+ for(var/I in tracked)
+ if(!tracked[I]) //No damage
+ continue
+ usage += projectile_tick_speed_ecost
+ usage += (current_damage_dampening * projectile_damage_tick_ecost_coefficient)
+ energy = Clamp(energy - usage, 0, maxenergy)
+ if(energy <= 0)
+ deactivate_field()
+ visible_message("The [src] blinks \"ENERGY DEPLETED\"")
+
+/obj/item/borg/projectile_dampen/proc/process_recharge()
+ if(!istype(host))
+ energy = Clamp(energy + energy_recharge, 0, maxenergy)
+ return
+ if((host.cell.charge >= (host.cell.maxcharge * cyborg_cell_critical_percentage)) && (energy < maxenergy))
+ host.cell.use(energy_recharge*energy_recharge_cyborg_drain_coefficient)
+ energy += energy_recharge
+
+/obj/item/borg/projectile_dampen/proc/dampen_projectile(obj/item/projectile/P, track_projectile = TRUE)
+ if(tracked[P])
+ return
+ if(track_projectile)
+ tracked[P] = P.damage
+ current_damage_dampening += P.damage
+ P.damage *= projectile_damage_coefficient
+ P.speed *= projectile_speed_coefficient
+ P.add_overlay(projectile_effect)
+
+/obj/item/borg/projectile_dampen/proc/restore_projectile(obj/item/projectile/P)
+ tracked -= P
+ P.damage *= (1/projectile_damage_coefficient)
+ P.speed *= (1/projectile_speed_coefficient)
+ P.cut_overlay(projectile_effect)
+ current_damage_dampening -= P.damage
+
+
/**********************************************************************
HUD/SIGHT things
***********************************************************************/
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 5353341ab6c..69e00e057eb 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -279,6 +279,28 @@
resistance_flags = FLAMMABLE
+/obj/item/toy/windupToolbox
+ name = "windup toolbox"
+ desc = "A replica toolbox that rumbles when you turn the key"
+ icon_state = "his_grace"
+ item_state = "artistic_toolbox"
+ var/active = FALSE
+ icon = 'icons/obj/weapons.dmi'
+ attack_verb = list("robusted")
+
+/obj/item/toy/windupToolbox/attack_self(mob/user)
+ if(!active)
+ icon_state = "his_grace_awakened"
+ to_chat(user, "You wind up [src], it begins to rumble.")
+ active = TRUE
+ addtimer(CALLBACK(src, .proc/stopRumble), 600)
+ else
+ to_chat(user, "[src] is already active.")
+
+/obj/item/toy/windupToolbox/proc/stopRumble()
+ icon_state = initial(icon_state)
+ active = FALSE
+
/*
* Subtype of Double-Bladed Energy Swords
*/
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index f53c9f66976..302ec5e6de8 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -472,8 +472,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM
flags = CONDUCT
slot_flags = SLOT_BELT
var/lit = 0
+ var/fancy = TRUE
heat = 1500
resistance_flags = FIRE_PROOF
+ light_color = LIGHT_COLOR_FIRE
/obj/item/weapon/lighter/update_icon()
if(lit)
@@ -484,37 +486,28 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/weapon/lighter/ignition_effect(atom/A, mob/user)
. = "With a single flick of their wrist, [user] smoothly lights [A] with [src]. Damn [user.p_theyre()] cool."
-/obj/item/weapon/lighter/greyscale
- name = "cheap lighter"
- desc = "A cheap-as-free lighter."
- icon_state = "lighter"
-
-/obj/item/weapon/lighter/greyscale/Initialize()
- . = ..()
- add_atom_colour(color2hex(randomColor(1)), FIXED_COLOUR_PRIORITY)
- update_icon()
-
-/obj/item/weapon/lighter/greyscale/update_icon()
- cut_overlays()
- var/mutable_appearance/base_overlay = mutable_appearance(icon,"[initial(icon_state)]_base")
- base_overlay.appearance_flags = RESET_COLOR //the edging doesn't change color
+/obj/item/weapon/lighter/proc/set_lit(new_lit)
+ lit = new_lit
if(lit)
- base_overlay.icon_state = "[initial(icon_state)]_on"
- add_overlay(base_overlay)
-
-/obj/item/weapon/lighter/greyscale/ignition_effect(atom/A, mob/user)
- . = "After some fiddling, [user] manages to light [A] with [src]."
+ force = 5
+ damtype = "fire"
+ hitsound = 'sound/items/welder.ogg'
+ attack_verb = list("burnt", "singed")
+ set_light(1)
+ START_PROCESSING(SSobj, src)
+ else
+ hitsound = "swing_hit"
+ force = 0
+ attack_verb = null //human_defense.dm takes care of it
+ set_light(0)
+ STOP_PROCESSING(SSobj, src)
+ update_icon()
/obj/item/weapon/lighter/attack_self(mob/living/user)
if(user.is_holding(src))
if(!lit)
- lit = 1
- update_icon()
- force = 5
- damtype = "fire"
- hitsound = 'sound/items/welder.ogg'
- attack_verb = list("burnt", "singed")
- if(!istype(src, /obj/item/weapon/lighter/greyscale))
+ set_lit(TRUE)
+ if(fancy)
user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.", "Without even breaking stride, you flip open and lights [src] in one smooth movement.")
else
var/prot = FALSE
@@ -534,20 +527,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM
user.apply_damage(5, BURN, hitzone)
user.visible_message("After a few attempts, [user] manages to light [src] - however, [user.p_they()] burn their finger in the process.", "You burn yourself while lighting the lighter!")
- set_light(1)
- START_PROCESSING(SSobj, src)
else
- lit = 0
- update_icon()
- hitsound = "swing_hit"
- force = 0
- attack_verb = null //human_defense.dm takes care of it
- if(!istype(src, /obj/item/weapon/lighter/greyscale))
+ set_lit(FALSE)
+ if(fancy)
user.visible_message("You hear a quiet click, as [user] shuts off [src] without even looking at what [user.p_theyre()] doing. Wow.", "You quietly shut off [src] without even looking at what you're doing. Wow.")
else
user.visible_message("[user] quietly shuts off [src].", "You quietly shut off [src].")
- set_light(0)
- STOP_PROCESSING(SSobj, src)
else
. = ..()
@@ -562,7 +547,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if(M == user)
cig.attackby(src, user)
else
- if(!istype(src, /obj/item/weapon/lighter/greyscale))
+ if(fancy)
cig.light("[user] whips the [name] out and holds it for [M]. [user.p_their(TRUE)] arm is as steady as the unflickering flame they light \the [cig] with.")
else
cig.light("[user] holds the [name] out for [M], and lights the [cig.name].")
@@ -575,6 +560,30 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/weapon/lighter/is_hot()
return lit * heat
+
+/obj/item/weapon/lighter/greyscale
+ name = "cheap lighter"
+ desc = "A cheap-as-free lighter."
+ icon_state = "lighter"
+ fancy = FALSE
+
+/obj/item/weapon/lighter/greyscale/Initialize()
+ . = ..()
+ add_atom_colour(color2hex(randomColor(1)), FIXED_COLOUR_PRIORITY)
+ update_icon()
+
+/obj/item/weapon/lighter/greyscale/update_icon()
+ cut_overlays()
+ var/mutable_appearance/base_overlay = mutable_appearance(icon,"[initial(icon_state)]_base")
+ base_overlay.appearance_flags = RESET_COLOR //the edging doesn't change color
+ if(lit)
+ base_overlay.icon_state = "[initial(icon_state)]_on"
+ add_overlay(base_overlay)
+
+/obj/item/weapon/lighter/greyscale/ignition_effect(atom/A, mob/user)
+ . = "After some fiddling, [user] manages to light [A] with [src]."
+
+
///////////
//ROLLING//
///////////
diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm
index 1989d15af13..008b39ea51d 100644
--- a/code/game/objects/items/weapons/grenades/grenade.dm
+++ b/code/game/objects/items/weapons/grenades/grenade.dm
@@ -48,23 +48,27 @@
/obj/item/weapon/grenade/attack_self(mob/user)
if(!active)
if(clown_check(user))
- to_chat(user, "You prime the [name]! [det_time/10] seconds!")
- playsound(user.loc, 'sound/weapons/armbomb.ogg', 60, 1)
- active = 1
- icon_state = initial(icon_state) + "_active"
- add_fingerprint(user)
- var/turf/bombturf = get_turf(src)
- var/area/A = get_area(bombturf)
- var/message = "[ADMIN_LOOKUPFLW(user)]) has primed a [name] for detonation at [ADMIN_COORDJMP(bombturf)]"
- GLOB.bombers += message
- message_admins(message)
- log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] [COORD(bombturf)].")
+ preprime(user)
if(iscarbon(user))
var/mob/living/carbon/C = user
C.throw_mode_on()
- spawn(det_time)
- prime()
+/obj/item/weapon/grenade/proc/preprime(mob/user)
+ if(user)
+ to_chat(user, "You prime the [name]! [det_time/10] seconds!")
+ playsound(loc, 'sound/weapons/armbomb.ogg', 60, 1)
+ active = TRUE
+ icon_state = initial(icon_state) + "_active"
+ add_fingerprint(user)
+ var/turf/bombturf = get_turf(src)
+ var/area/A = get_area(bombturf)
+ if(user)
+ var/message = "[ADMIN_LOOKUPFLW(user)]) has primed a [name] for detonation at [ADMIN_COORDJMP(bombturf)]"
+ GLOB.bombers += message
+ message_admins(message)
+ log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] [COORD(bombturf)].")
+
+ addtimer(CALLBACK(src, .proc/prime), det_time)
/obj/item/weapon/grenade/proc/prime()
@@ -104,4 +108,4 @@
if(damage && attack_type == PROJECTILE_ATTACK && prob(15))
owner.visible_message("[attack_text] hits [owner]'s [src], setting it off! What a shot!")
prime()
- return 1 //It hit the grenade, not them
\ No newline at end of file
+ return 1 //It hit the grenade, not them
diff --git a/code/game/objects/items/weapons/grenades/plastic.dm b/code/game/objects/items/weapons/grenades/plastic.dm
index 3118d731f22..21a71f371d6 100644
--- a/code/game/objects/items/weapons/grenades/plastic.dm
+++ b/code/game/objects/items/weapons/grenades/plastic.dm
@@ -18,6 +18,10 @@
plastic_overlay = mutable_appearance(icon, "[item_state]2")
..()
+/obj/item/weapon/grenade/plastic/Initialize(mapload)
+ . = ..()
+ SET_SECONDARY_FLAG(src, NO_EMP_WIRES)
+
/obj/item/weapon/grenade/plastic/Destroy()
qdel(nadeassembly)
nadeassembly = null
diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm
index 68015380983..bc26417b0ca 100644
--- a/code/game/objects/items/weapons/pneumaticCannon.dm
+++ b/code/game/objects/items/weapons/pneumaticCannon.dm
@@ -243,7 +243,7 @@
range_multiplier = 3
fire_mode = PCANNON_FIFO
throw_amount = 1
- maxWeightClass = 100 //50 pies. :^)
+ maxWeightClass = 150 //50 pies. :^)
clumsyCheck = FALSE
/obj/item/weapon/pneumatic_cannon/pie/can_load_item(obj/item/I, mob/user)
@@ -251,3 +251,22 @@
return ..()
to_chat(user, "[src] only accepts pies!")
return FALSE
+
+/obj/item/weapon/pneumatic_cannon/pie/selfcharge
+ automatic = TRUE
+ var/charge_amount = 1
+ var/charge_ticks = 1
+ var/charge_tick = 0
+ maxWeightClass = 60 //20 pies.
+
+/obj/item/weapon/pneumatic_cannon/pie/selfcharge/Initialize()
+ . = ..()
+ START_PROCESSING(SSobj, src)
+
+/obj/item/weapon/pneumatic_cannon/pie/selfcharge/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/item/weapon/pneumatic_cannon/pie/selfcharge/process()
+ if(++charge_tick >= charge_ticks)
+ fill_with_type(/obj/item/weapon/reagent_containers/food/snacks/pie, charge_amount)
diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm
index 1f5a2298644..7b26c58a5df 100644
--- a/code/game/objects/items/weapons/powerfist.dm
+++ b/code/game/objects/items/weapons/powerfist.dm
@@ -80,7 +80,7 @@
target.apply_damage(force * fisto_setting, BRUTE)
target.visible_message("[user]'s powerfist lets out a loud hiss as they punch [target.name]!", \
"You cry out in pain as [user]'s punch flings you backwards!")
- new /obj/effect/overlay/temp/kinetic_blast(target.loc)
+ new /obj/effect/temp_visual/kinetic_blast(target.loc)
playsound(loc, 'sound/weapons/resonator_blast.ogg', 50, 1)
playsound(loc, 'sound/weapons/genhit2.ogg', 50, 1)
diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm
index 7775b3692a4..3b655550b46 100644
--- a/code/game/objects/items/weapons/storage/book.dm
+++ b/code/game/objects/items/weapons/storage/book.dm
@@ -85,8 +85,8 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
playsound(src.loc, "punch", 25, 1, -1)
return 1
-/obj/item/weapon/storage/book/bible/attack(mob/living/M, mob/living/carbon/human/user)
-
+/obj/item/weapon/storage/book/bible/attack(mob/living/M, mob/living/carbon/human/user, heal_mode = TRUE)
+
if (!user.IsAdvancedToolUser())
to_chat(user, "You don't have the dexterity to do this!")
return
@@ -105,7 +105,10 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
to_chat(user, "The book sizzles in your hands.")
user.take_bodypart_damage(0,10)
return
-
+
+ if (!heal_mode)
+ return ..()
+
var/smack = 1
if (M.stat != DEAD)
@@ -156,3 +159,38 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
/obj/item/weapon/storage/book/bible/booze/PopulateContents()
new /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey(src)
+
+/obj/item/weapon/storage/book/bible/syndicate
+ icon_state ="ebook"
+ deity_name = "The Syndicate"
+ throw_speed = 2
+ throwforce = 18
+ throw_range = 7
+ force = 18
+ hitsound = 'sound/weapons/sear.ogg'
+ damtype = BURN
+ name = "Syndicate Tome"
+ attack_verb = list("attacked", "burned", "blessed", "damned", "scorched")
+ var/uses = 1
+
+
+
+/obj/item/weapon/storage/book/bible/syndicate/attack_self(mob/living/carbon/human/H)
+ if (uses)
+ H.mind.isholy = TRUE
+ uses -= 1
+ to_chat(H, "You try to open the book AND IT BITES YOU!")
+ playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
+ H.apply_damage(5, BRUTE, pick("l_arm", "r_arm"))
+ to_chat(H, "Your name appears on the inside cover, in blood.")
+ var/ownername = H.real_name
+ desc += "The name [ownername] is written in blood inside the cover."
+
+/obj/item/weapon/storage/book/bible/syndicate/attack(mob/living/M, mob/living/carbon/human/user, heal_mode = TRUE)
+ if (user.a_intent == INTENT_HELP)
+ return ..()
+ else
+ return ..(M,user,heal_mode = FALSE)
+
+/obj/item/storage/book/bible/syndicate/add_blood(list/blood_dna)
+ return FALSE
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index 94b0709ae20..b1301a3e8aa 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -21,8 +21,8 @@
if(has_latches)
if(prob(10))
latches = "double_latch"
- else if(prob(1))
- latches = "triple_latch"
+ if(prob(1))
+ latches = "triple_latch"
update_icon()
/obj/item/weapon/storage/toolbox/update_icon()
diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm
old mode 100644
new mode 100755
index 9617f8820a5..f451c9b56cf
--- a/code/game/objects/items/weapons/tanks/tank_types.dm
+++ b/code/game/objects/items/weapons/tanks/tank_types.dm
@@ -140,6 +140,8 @@
item_state = "plasmaman_tank_belt"
slot_flags = SLOT_BELT
force = 5
+ volume = 3
+ w_class = WEIGHT_CLASS_SMALL //thanks i forgot this
/obj/item/weapon/tank/internals/plasmaman/belt/full/New()
..()
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 389ae40e880..43e0de52a14 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -331,8 +331,8 @@
/obj/structure/falsewall/brass/New(loc)
..()
var/turf/T = get_turf(src)
- new /obj/effect/overlay/temp/ratvar/wall/false(T)
- new /obj/effect/overlay/temp/ratvar/beam/falsewall(T)
+ new /obj/effect/temp_visual/ratvar/wall/false(T)
+ new /obj/effect/temp_visual/ratvar/beam/falsewall(T)
change_construction_value(4)
/obj/structure/falsewall/brass/Destroy()
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 2dc159d4828..64d93e914e1 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -254,10 +254,10 @@
/obj/structure/grille/ratvar/New()
..()
if(broken)
- new /obj/effect/overlay/temp/ratvar/grille/broken(get_turf(src))
+ new /obj/effect/temp_visual/ratvar/grille/broken(get_turf(src))
else
- new /obj/effect/overlay/temp/ratvar/grille(get_turf(src))
- new /obj/effect/overlay/temp/ratvar/beam/grille(get_turf(src))
+ new /obj/effect/temp_visual/ratvar/grille(get_turf(src))
+ new /obj/effect/temp_visual/ratvar/beam/grille(get_turf(src))
/obj/structure/grille/ratvar/narsie_act()
take_damage(rand(1, 3), BRUTE)
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index ba9e5f8a338..2f6b03bef16 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -102,8 +102,8 @@
/obj/structure/lattice/catwalk/clockwork/Initialize(mapload)
..()
- new /obj/effect/overlay/temp/ratvar/floor/catwalk(loc)
- new /obj/effect/overlay/temp/ratvar/beam/catwalk(loc)
+ new /obj/effect/temp_visual/ratvar/floor/catwalk(loc)
+ new /obj/effect/temp_visual/ratvar/beam/catwalk(loc)
/obj/structure/lattice/catwalk/clockwork/ratvar_act()
return
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index d5027a0c754..0c114180030 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -440,7 +440,7 @@
dir = FULLTILE_WINDOW_DIR
max_integrity = 50
fulltile = 1
- flags = NONE
+ flags = PREVENT_CLICK_UNDER
smooth = SMOOTH_TRUE
canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile,/obj/structure/window/reinforced/highpressure/fulltile, /obj/structure/window/reinforced/tinted/fulltile)
glass_amount = 2
@@ -454,7 +454,7 @@
dir = FULLTILE_WINDOW_DIR
max_integrity = 100
fulltile = 1
- flags = NONE
+ flags = PREVENT_CLICK_UNDER
smooth = SMOOTH_TRUE
canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile,/obj/structure/window/reinforced/highpressure/fulltile, /obj/structure/window/reinforced/tinted/fulltile)
@@ -467,7 +467,7 @@
dir = FULLTILE_WINDOW_DIR
max_integrity = 1000
fulltile = 1
- flags = NONE
+ flags = PREVENT_CLICK_UNDER
smooth = SMOOTH_TRUE
canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile,/obj/structure/window/reinforced/highpressure/fulltile, /obj/structure/window/reinforced/tinted/fulltile)
level = 3
@@ -481,7 +481,7 @@
icon_state = "tinted_window"
dir = FULLTILE_WINDOW_DIR
fulltile = 1
- flags = NONE
+ flags = PREVENT_CLICK_UNDER
smooth = SMOOTH_TRUE
canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile,/obj/structure/window/reinforced/highpressure/fulltile, /obj/structure/window/reinforced/tinted/fulltile/)
level = 3
@@ -504,7 +504,7 @@
max_integrity = 100
wtype = "shuttle"
fulltile = 1
- flags = NONE
+ flags = PREVENT_CLICK_UNDER
reinf = 1
heat_resistance = 1600
armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 25, bio = 100, rad = 100, fire = 80, acid = 100)
@@ -545,7 +545,7 @@
qdel(I)
var/amount_of_gears = 2
if(fulltile)
- new /obj/effect/overlay/temp/ratvar/window(get_turf(src))
+ new /obj/effect/temp_visual/ratvar/window(get_turf(src))
amount_of_gears = 4
for(var/i in 1 to amount_of_gears)
debris += new/obj/item/clockwork/alloy_shards/medium/gear_bit()
@@ -553,7 +553,7 @@
/obj/structure/window/reinforced/clockwork/setDir(direct)
if(!made_glow)
- var/obj/effect/E = new /obj/effect/overlay/temp/ratvar/window/single(get_turf(src))
+ var/obj/effect/E = new /obj/effect/temp_visual/ratvar/window/single(get_turf(src))
E.setDir(direct)
made_glow = TRUE
..()
@@ -583,7 +583,7 @@
smooth = SMOOTH_TRUE
canSmoothWith = null
fulltile = 1
- flags = NONE
+ flags = PREVENT_CLICK_UNDER
dir = FULLTILE_WINDOW_DIR
max_integrity = 120
level = 3
diff --git a/code/game/say.dm b/code/game/say.dm
index 93351137d60..1aaa3d60413 100644
--- a/code/game/say.dm
+++ b/code/game/say.dm
@@ -143,7 +143,7 @@ GLOBAL_LIST_INIT(freqtospan, list(
return "0"
/atom/movable/proc/GetVoice()
- return name
+ return "[src]" //Returns the atom's name, prepended with 'The' if it's not a proper noun
/atom/movable/proc/IsVocal()
return 1
diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm
index 9144cbc8715..810a77fc423 100644
--- a/code/game/turfs/simulated/floor/misc_floor.dm
+++ b/code/game/turfs/simulated/floor/misc_floor.dm
@@ -133,8 +133,8 @@
/turf/open/floor/clockwork/Initialize()
..()
- new /obj/effect/overlay/temp/ratvar/floor(src)
- new /obj/effect/overlay/temp/ratvar/beam(src)
+ new /obj/effect/temp_visual/ratvar/floor(src)
+ new /obj/effect/temp_visual/ratvar/beam(src)
realappearence = new /obj/effect/clockwork/overlay/floor(src)
realappearence.linked = src
change_construction_value(1)
diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm
index 9c40b8276f2..544d6375716 100644
--- a/code/game/turfs/simulated/floor/reinf_floor.dm
+++ b/code/game/turfs/simulated/floor/reinf_floor.dm
@@ -108,7 +108,7 @@
/turf/open/floor/engine/cult/Initialize()
..()
- new /obj/effect/overlay/temp/cult/turf/floor(src)
+ new /obj/effect/temp_visual/cult/turf/floor(src)
realappearence = new /obj/effect/clockwork/overlay/floor/bloodcult(src)
realappearence.linked = src
diff --git a/code/game/turfs/simulated/wall/misc_walls.dm b/code/game/turfs/simulated/wall/misc_walls.dm
index 9fa69fc6a79..21015e82d09 100644
--- a/code/game/turfs/simulated/wall/misc_walls.dm
+++ b/code/game/turfs/simulated/wall/misc_walls.dm
@@ -10,7 +10,7 @@
girder_type = /obj/structure/girder/cult
/turf/closed/wall/mineral/cult/Initialize()
- new /obj/effect/overlay/temp/cult/turf(src)
+ new /obj/effect/temp_visual/cult/turf(src)
. = ..()
/turf/closed/wall/mineral/cult/devastate_wall()
@@ -39,11 +39,11 @@
desc = "A cold stone wall engraved with indecipherable symbols. Studying them causes your head to pound."
/turf/closed/wall/mineral/cult/artificer/break_wall()
- new /obj/effect/overlay/temp/cult/turf(get_turf(src))
+ new /obj/effect/temp_visual/cult/turf(get_turf(src))
return null //excuse me we want no runed metal here
/turf/closed/wall/mineral/cult/artificer/devastate_wall()
- new /obj/effect/overlay/temp/cult/turf(get_turf(src))
+ new /obj/effect/temp_visual/cult/turf(get_turf(src))
//Clockwork wall: Causes nearby tinkerer's caches to generate components.
/turf/closed/wall/clockwork
@@ -60,8 +60,8 @@
/turf/closed/wall/clockwork/Initialize()
..()
- new /obj/effect/overlay/temp/ratvar/wall(src)
- new /obj/effect/overlay/temp/ratvar/beam(src)
+ new /obj/effect/temp_visual/ratvar/wall(src)
+ new /obj/effect/temp_visual/ratvar/beam(src)
realappearence = new /obj/effect/clockwork/overlay/wall(src)
realappearence.linked = src
change_construction_value(5)
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index a0940eded1f..1876d6f782a 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -42,7 +42,7 @@
if (opacity)
has_opaque_atom = TRUE
-
+
return INITIALIZE_HINT_NORMAL
/turf/open/space/attack_ghost(mob/dead/observer/user)
@@ -177,7 +177,7 @@
ChangeTurf(/turf/open/floor/plating)
return TRUE
return FALSE
-
+
/turf/open/space/ReplaceWithLattice()
var/dest_x = destination_x
var/dest_y = destination_y
@@ -186,4 +186,4 @@
destination_x = dest_x
destination_y = dest_y
destination_z = dest_z
-
+
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 96e3b9c5905..c4d35d7bd1c 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -92,39 +92,39 @@
LC.attackby(C,user)
return
coil.place_turf(src, user)
- return 1
+ return TRUE
- return 0
+ return FALSE
/turf/CanPass(atom/movable/mover, turf/target, height=1.5)
- if(!target) return 0
+ if(!target) return FALSE
if(istype(mover)) // turf/Enter(...) will perform more advanced checks
return !density
else // Now, doing more detailed checks for air movement and air group formation
if(target.blocks_air||blocks_air)
- return 0
+ return FALSE
for(var/obj/obstacle in src)
if(!obstacle.CanPass(mover, target, height))
- return 0
+ return FALSE
for(var/obj/obstacle in target)
if(!obstacle.CanPass(mover, src, height))
- return 0
+ return FALSE
- return 1
+ return TRUE
/turf/Enter(atom/movable/mover as mob|obj, atom/forget as mob|obj|turf|area)
if (!mover)
- return 1
+ return TRUE
// First, make sure it can leave its square
if(isturf(mover.loc))
// Nothing but border objects stop you from leaving a tile, only one loop is needed
for(var/obj/obstacle in mover.loc)
if(!obstacle.CheckExit(mover, src) && obstacle != mover && obstacle != forget)
mover.Bump(obstacle, 1)
- return 0
+ return FALSE
var/list/large_dense = list()
//Next, check objects to block entry that are on the border
@@ -132,14 +132,14 @@
if(border_obstacle.flags & ON_BORDER)
if(!border_obstacle.CanPass(mover, mover.loc, 1) && (forget != border_obstacle))
mover.Bump(border_obstacle, 1)
- return 0
+ return FALSE
else
large_dense += border_obstacle
//Then, check the turf itself
if (!src.CanPass(mover, src))
mover.Bump(src, 1)
- return 0
+ return FALSE
//Finally, check objects/mobs to block entry that are not on the border
var/atom/movable/tompost_bump
@@ -151,8 +151,9 @@
top_layer = obstacle.layer
if(tompost_bump)
mover.Bump(tompost_bump,1)
- return 0
- return 1 //Nothing found to block so return success!
+ return FALSE
+
+ return TRUE //Nothing found to block so return success!
/turf/Entered(atom/movable/AM)
if(explosion_level && AM.ex_check(explosion_id))
@@ -185,7 +186,7 @@
O.make_unfrozen()
/turf/proc/is_plasteel_floor()
- return 0
+ return FALSE
/turf/proc/levelupdate()
for(var/obj/O in src)
@@ -303,7 +304,7 @@
if(src_object.contents.len)
to_chat(usr, "You start dumping out the contents...")
if(!do_after(usr,20,target=src_object))
- return 0
+ return FALSE
var/list/things = src_object.contents.Copy()
var/datum/progressbar/progress = new(user, things.len, src)
@@ -311,7 +312,7 @@
sleep(1)
qdel(progress)
- return 1
+ return TRUE
//////////////////////////////
//Distance procs
@@ -325,7 +326,7 @@
// possible. It results in more efficient (CPU-wise) pathing
// for bots and anything else that only moves in cardinal dirs.
/turf/proc/Distance_cardinal(turf/T)
- if(!src || !T) return 0
+ if(!src || !T) return FALSE
return abs(x - T.x) + abs(y - T.y)
////////////////////////////////////////////////////
@@ -341,7 +342,7 @@
return(2)
/turf/proc/can_have_cabling()
- return 1
+ return TRUE
/turf/proc/can_lay_cable()
return can_have_cabling() & !intact
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 954283d1183..3371914bb83 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -421,13 +421,18 @@
set desc="Restarts the world immediately"
if (!usr.client.holder)
return
- var/confirm = alert("Restart the game world?", "Restart", "Yes", "Cancel")
- if(confirm == "Cancel")
- return
- if(confirm == "Yes")
- SSticker.delay_end = 0
+
+ var/list/options = list("Regular Restart", "Hard Restart (No Delay/Feeback Reason)", "Hardest Restart (No actions, just reboot)")
+ var result = input(usr, "Select reboot method", "World Reboot", options[1]) as null|anything in options
+ if(result)
SSblackbox.add_details("admin_verb","Reboot World") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- world.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10)
+ switch(result)
+ if("Regular Restart")
+ SSticker.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10)
+ if("Hard Restart (No Delay, No Feeback Reason)")
+ world.Reboot()
+ if("Hardest Restart (No actions, just reboot)")
+ world.Reboot(fast_track = TRUE)
/datum/admins/proc/end_round()
set category = "Server"
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 728db7372cb..bbc65277118 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -78,7 +78,6 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
/client/proc/drop_dynex_bomb,
/client/proc/cinematic,
/client/proc/one_click_antag,
- /client/proc/send_space_ninja,
/client/proc/cmd_admin_add_freeform_ai_law,
/client/proc/object_say,
/client/proc/toggle_random_events,
@@ -193,7 +192,6 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
/client/proc/get_dynex_power,
/client/proc/set_dynex_scale,
/client/proc/cinematic,
- /client/proc/send_space_ninja,
/client/proc/cmd_admin_add_freeform_ai_law,
/client/proc/cmd_admin_create_centcom_report,
/client/proc/cmd_change_command_name,
diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm
index b886232e005..d288c634838 100644
--- a/code/modules/admin/fun_balloon.dm
+++ b/code/modules/admin/fun_balloon.dm
@@ -60,7 +60,7 @@
message_admins("[key_name_admin(ghost)] has taken control of ([key_name_admin(body)])")
body.ghostize(0)
body.key = ghost.key
- new /obj/effect/overlay/temp/gravpush(get_turf(body))
+ new /obj/effect/temp_visual/gravpush(get_turf(body))
/obj/effect/fun_balloon/sentience/emergency_shuttle
name = "shuttle sentience fun balloon"
@@ -79,7 +79,7 @@
/obj/effect/fun_balloon/scatter/effect()
for(var/mob/living/M in range(effect_range, get_turf(src)))
var/turf/T = find_safe_turf()
- new /obj/effect/overlay/temp/gravpush(get_turf(M))
+ new /obj/effect/temp_visual/gravpush(get_turf(M))
M.forceMove(T)
to_chat(M, "Pop!")
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 98c26857a25..eb6f03e7d0f 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1206,7 +1206,7 @@
message_admins("[key_name_admin(usr)] set the mode as [GLOB.master_mode].")
to_chat(world, "The mode is now: [GLOB.master_mode]")
Game() // updates the main game menu
- world.save_mode(GLOB.master_mode)
+ SSticker.save_mode(GLOB.master_mode)
.(href, list("c_mode"=1))
else if(href_list["f_secret2"])
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index e781473634c..eb4c3a5f10f 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -52,10 +52,7 @@
if(!check_rights(R_SOUNDS))
return
- if(SSticker)
- SSticker.round_end_sound = fcopy_rsc(S)
- else
- return
+ SSticker.SetRoundEndSound(S)
log_admin("[key_name(src)] set the round end sound to [S]")
message_admins("[key_name_admin(src)] set the round end sound to [S]")
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 22dfa9e5ee7..67951fc26ae 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -386,9 +386,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
if(L.name=="carpspawn")
ninja_spawn += L
- new_character.equip_space_ninja()
- new_character.internal = new_character.s_store
- new_character.update_internals_hud_icon(1)
+ var/datum/antagonist/ninja/ninjadatum = new_character.mind.has_antag_datum(ANTAG_DATUM_NINJA)
+ ninjadatum.equip_space_ninja()
if(ninja_spawn.len)
var/obj/effect/landmark/ninja_spawn_here = pick(ninja_spawn)
new_character.loc = ninja_spawn_here.loc
@@ -586,7 +585,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
empulse(O, heavy, light)
log_admin("[key_name(usr)] created an EM Pulse ([heavy],[light]) at ([O.x],[O.y],[O.z])")
- message_admins("[key_name_admin(usr)] created an EM PUlse ([heavy],[light]) at ([O.x],[O.y],[O.z])")
+ message_admins("[key_name_admin(usr)] created an EM Pulse ([heavy],[light]) at ([O.x],[O.y],[O.z])")
SSblackbox.add_details("admin_verb","EM Pulse") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm
index e816e883c9a..0e4fd0d7944 100644
--- a/code/modules/assembly/flash.dm
+++ b/code/modules/assembly/flash.dm
@@ -172,11 +172,11 @@
/obj/item/device/assembly/flash/cyborg/attack(mob/living/M, mob/user)
..()
- new /obj/effect/overlay/temp/borgflash(get_turf(src))
+ new /obj/effect/temp_visual/borgflash(get_turf(src))
/obj/item/device/assembly/flash/cyborg/attack_self(mob/user)
..()
- new /obj/effect/overlay/temp/borgflash(get_turf(src))
+ new /obj/effect/temp_visual/borgflash(get_turf(src))
/obj/item/device/assembly/flash/cyborg/attackby(obj/item/weapon/W, mob/user, params)
return
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index 93b9b6b3f96..b06c9a55793 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -433,7 +433,7 @@
/obj/item/projectile/beam/ctf/red
icon_state = "laser"
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser
// BLUE TEAM GUNS
@@ -448,7 +448,7 @@
/obj/item/projectile/beam/ctf/blue
icon_state = "bluelaser"
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
/datum/outfit/ctf
name = "CTF"
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 32cb9dfaa77..150c4b32eee 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -636,3 +636,7 @@ GLOBAL_LIST(external_rsc_urls)
CRASH("change_view called without argument.")
view = new_size
+
+/client/proc/AnnouncePR(announcement)
+ if(prefs && prefs.chat_toggles & CHAT_PULLR)
+ to_chat(src, announcement)
\ No newline at end of file
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index b43bf3fe3a8..0f5cdd3020e 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -444,7 +444,7 @@
/datum/spacevine_controller/Topic(href, href_list)
if(..() || !check_rights(R_ADMIN, FALSE))
return
-
+
if(href_list["purge_vines"])
if(alert(usr, "Are you sure you want to delete this spacevine cluster?", "Delete Vines", "Yes", "No") != "Yes")
return
@@ -476,6 +476,7 @@
for(var/datum/spacevine_mutation/SM in SV.mutations)
SM.on_birth(SV)
+ location.Entered(SV)
/datum/spacevine_controller/proc/VineDestroyed(obj/structure/spacevine/S)
S.master = null
diff --git a/code/modules/fields/fields.dm b/code/modules/fields/fields.dm
new file mode 100644
index 00000000000..4b083d7e026
--- /dev/null
+++ b/code/modules/fields/fields.dm
@@ -0,0 +1,309 @@
+
+//Movable and easily code-modified fields! Allows for custom AOE effects that affect movement and anything inside of them, and can do custom turf effects!
+//Supports automatic recalculation/reset on movement.
+//If there's any way to make this less CPU intensive than I've managed, gimme a call or do it yourself! - kevinz000
+
+//Field shapes
+#define FIELD_NO_SHAPE 0 //Does not update turfs automatically
+#define FIELD_SHAPE_RADIUS_SQUARE 1 //Uses current_range and square_depth_up/down
+#define FIELD_SHAPE_CUSTOM_SQUARE 2 //Uses square_height and square_width and square_depth_up/down
+
+//Proc to make fields. make_field(field_type, field_params_in_associative_list)
+/proc/make_field(field_type, list/field_params, override_checks = FALSE, start_field = TRUE)
+ var/datum/proximity_monitor/advanced/F = new field_type()
+ if(!F.assume_params(field_params) && !override_checks)
+ QDEL_NULL(F)
+ if(!F.check_variables() && !override_checks)
+ QDEL_NULL(F)
+ if(start_field && (F || override_checks))
+ F.Initialize()
+ return F
+
+/datum/proximity_monitor/advanced
+ var/name = "\improper Energy Field"
+ //Field setup specifications
+ var/field_shape = FIELD_NO_SHAPE
+ var/square_height = 0
+ var/square_width = 0
+ var/square_depth_up = 0
+ var/square_depth_down = 0
+ //Processing
+ var/requires_processing = FALSE
+ var/process_inner_turfs = FALSE //Don't do this unless it's absolutely necessary
+ var/process_edge_turfs = FALSE //Don't do this either unless it's absolutely necessary, you can just track what things are inside manually or on the initial setup.
+ var/setup_edge_turfs = FALSE //Setup edge turfs/all field turfs. Set either or both to ON when you need it, it's defaulting to off unless you do to save CPU.
+ var/setup_field_turfs = FALSE
+
+ var/list/turf/field_turfs = list()
+ var/list/turf/edge_turfs = list()
+ var/list/turf/field_turfs_new = list()
+ var/list/turf/edge_turfs_new = list()
+
+/datum/proximity_monitor/advanced/New()
+ SSfields.register_new_field(src)
+
+/datum/proximity_monitor/advanced/Destroy()
+ SSfields.unregister_field(src)
+ full_cleanup()
+ return ..()
+
+/datum/proximity_monitor/advanced/proc/assume_params(list/field_params)
+ var/pass_check = TRUE
+ for(var/param in field_params)
+ if(vars[param] || isnull(vars[param]) || (param in vars))
+ vars[param] = field_params[param]
+ else
+ pass_check = FALSE
+ return pass_check
+
+/datum/proximity_monitor/advanced/proc/check_variables()
+ var/pass = TRUE
+ if(field_shape == FIELD_NO_SHAPE) //If you're going to make a manually updated field you shouldn't be using automatic checks so don't.
+ pass = FALSE
+ if(current_range < 0 || square_height < 0 || square_width < 0 || square_depth_up < 0 || square_depth_down < 0)
+ pass = FALSE
+ if(!istype(host))
+ pass = FALSE
+ return pass
+
+/datum/proximity_monitor/advanced/process()
+ if(process_inner_turfs)
+ for(var/turf/T in field_turfs)
+ process_inner_turf(T)
+ CHECK_TICK //Really crappy lagchecks, needs improvement once someone starts using processed fields.
+ if(process_edge_turfs)
+ for(var/turf/T in edge_turfs)
+ process_edge_turf(T)
+ CHECK_TICK //Same here.
+
+/datum/proximity_monitor/advanced/proc/process_inner_turf(turf/T)
+
+/datum/proximity_monitor/advanced/proc/process_edge_turf(turf/T)
+
+/datum/proximity_monitor/advanced/proc/Initialize()
+ setup_field()
+ post_setup_field()
+
+/datum/proximity_monitor/advanced/proc/full_cleanup() //Full cleanup for when you change something that would require complete resetting.
+ for(var/turf/T in edge_turfs)
+ cleanup_edge_turf(T)
+ for(var/turf/T in field_turfs)
+ cleanup_field_turf(T)
+
+/datum/proximity_monitor/advanced/proc/recalculate_field(ignore_movement_check = FALSE) //Call every time the field moves (done automatically if you use update_center) or a setup specification is changed.
+ if(!(ignore_movement_check || ((host.loc != last_host_loc) && (field_shape != FIELD_NO_SHAPE))))
+ return
+ update_new_turfs()
+ var/list/turf/needs_setup = field_turfs_new.Copy()
+ if(setup_field_turfs)
+ for(var/turf/T in field_turfs)
+ if(!(T in needs_setup))
+ cleanup_field_turf(T)
+ else
+ needs_setup -= T
+ CHECK_TICK
+ for(var/turf/T in needs_setup)
+ setup_field_turf(T)
+ CHECK_TICK
+ if(setup_edge_turfs)
+ for(var/turf/T in edge_turfs)
+ cleanup_edge_turf(T)
+ CHECK_TICK
+ for(var/turf/T in edge_turfs_new)
+ setup_edge_turf(T)
+ CHECK_TICK
+
+/datum/proximity_monitor/advanced/proc/field_turf_canpass(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_turf/F, turf/entering)
+ return TRUE
+
+/datum/proximity_monitor/advanced/proc/field_turf_uncross(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_turf/F)
+ return TRUE
+
+/datum/proximity_monitor/advanced/proc/field_turf_crossed(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_turf/F)
+ return TRUE
+
+/datum/proximity_monitor/advanced/proc/field_turf_uncrossed(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_turf/F)
+ return TRUE
+
+/datum/proximity_monitor/advanced/proc/field_edge_canpass(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_edge/F, turf/entering)
+ return TRUE
+
+/datum/proximity_monitor/advanced/proc/field_edge_uncross(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_edge/F)
+ return TRUE
+
+/datum/proximity_monitor/advanced/proc/field_edge_crossed(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_edge/F)
+ return TRUE
+
+/datum/proximity_monitor/advanced/proc/field_edge_uncrossed(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_edge/F)
+ return TRUE
+
+/datum/proximity_monitor/advanced/HandleMove()
+ var/atom/_host = host
+ var/atom/new_host_loc = _host.loc
+ if(last_host_loc != new_host_loc)
+ recalculate_field()
+
+/datum/proximity_monitor/advanced/proc/post_setup_field()
+
+/datum/proximity_monitor/advanced/proc/setup_field()
+ update_new_turfs()
+ if(setup_field_turfs)
+ for(var/turf/T in field_turfs_new)
+ setup_field_turf(T)
+ CHECK_TICK
+ if(setup_edge_turfs)
+ for(var/turf/T in edge_turfs_new)
+ setup_edge_turf(T)
+ CHECK_TICK
+
+/datum/proximity_monitor/advanced/proc/cleanup_field_turf(turf/T)
+ qdel(field_turfs[T])
+ field_turfs -= T
+
+/datum/proximity_monitor/advanced/proc/cleanup_edge_turf(turf/T)
+ qdel(edge_turfs[T])
+ edge_turfs -= T
+
+/datum/proximity_monitor/advanced/proc/setup_field_turf(turf/T)
+ field_turfs[T] = new /obj/effect/abstract/proximity_checker/advanced/field_turf(T, src)
+
+/datum/proximity_monitor/advanced/proc/setup_edge_turf(turf/T)
+ edge_turfs[T] = new /obj/effect/abstract/proximity_checker/advanced/field_edge(T, src)
+
+/datum/proximity_monitor/advanced/proc/update_new_turfs()
+ if(!istype(host))
+ return FALSE
+ last_host_loc = host.loc
+ var/turf/center = get_turf(host)
+ field_turfs_new = list()
+ edge_turfs_new = list()
+ switch(field_shape)
+ if(FIELD_NO_SHAPE)
+ return FALSE
+ if(FIELD_SHAPE_RADIUS_SQUARE)
+ for(var/turf/T in block(locate(center.x-current_range,center.y-current_range,center.z-square_depth_down),locate(center.x+current_range, center.y+current_range,center.z+square_depth_up)))
+ field_turfs_new += T
+ edge_turfs_new = field_turfs_new.Copy()
+ if(current_range >= 1)
+ var/list/turf/center_turfs = list()
+ for(var/turf/T in block(locate(center.x-current_range+1,center.y-current_range+1,center.z-square_depth_down),locate(center.x+current_range-1, center.y+current_range-1,center.z+square_depth_up)))
+ center_turfs += T
+ for(var/turf/T in center_turfs)
+ edge_turfs_new -= T
+ if(FIELD_SHAPE_CUSTOM_SQUARE)
+ for(var/turf/T in block(locate(center.x-square_width,center.y-square_height,center.z-square_depth_down),locate(center.x+square_width, center.y+square_height,center.z+square_depth_up)))
+ field_turfs_new += T
+ edge_turfs_new = field_turfs_new.Copy()
+ if(square_height >= 1 && square_width >= 1)
+ var/list/turf/center_turfs = list()
+ for(var/turf/T in block(locate(center.x-square_width+1,center.y-square_height+1,center.z-square_depth_down),locate(center.x+square_width-1, center.y+square_height-1,center.z+square_depth_up)))
+ center_turfs += T
+ for(var/turf/T in center_turfs)
+ edge_turfs_new -= T
+
+//Gets edge direction/corner, only works with square radius/WDH fields!
+/datum/proximity_monitor/advanced/proc/get_edgeturf_direction(turf/T, turf/center_override = null)
+ var/turf/checking_from = get_turf(host)
+ if(istype(center_override))
+ checking_from = center_override
+ if(field_shape != FIELD_SHAPE_RADIUS_SQUARE && field_shape != FIELD_SHAPE_CUSTOM_SQUARE)
+ return
+ if(!(T in edge_turfs))
+ return
+ switch(field_shape)
+ if(FIELD_SHAPE_RADIUS_SQUARE)
+ if(((T.x == (checking_from.x + current_range)) || (T.x == (checking_from.x - current_range))) && ((T.y == (checking_from.y + current_range)) || (T.y == (checking_from.y - current_range))))
+ return get_dir(checking_from, T)
+ if(T.x == (checking_from.x + current_range))
+ return EAST
+ if(T.x == (checking_from.x - current_range))
+ return WEST
+ if(T.y == (checking_from.y - current_range))
+ return SOUTH
+ if(T.y == (checking_from.y + current_range))
+ return NORTH
+ if(FIELD_SHAPE_CUSTOM_SQUARE)
+ if(((T.x == (checking_from.x + square_width)) || (T.x == (checking_from.x - square_width))) && ((T.y == (checking_from.y + square_height)) || (T.y == (checking_from.y - square_height))))
+ return get_dir(checking_from, T)
+ if(T.x == (checking_from.x + square_width))
+ return EAST
+ if(T.x == (checking_from.x - square_width))
+ return WEST
+ if(T.y == (checking_from.y - square_height))
+ return SOUTH
+ if(T.y == (checking_from.y + square_height))
+ return NORTH
+
+//DEBUG FIELDS
+/datum/proximity_monitor/advanced/debug
+ name = "\improper Color Matrix Field"
+ field_shape = FIELD_SHAPE_RADIUS_SQUARE
+ current_range = 5
+ var/set_fieldturf_color = "#aaffff"
+ var/set_edgeturf_color = "#ffaaff"
+ setup_field_turfs = TRUE
+ setup_edge_turfs = TRUE
+
+/datum/proximity_monitor/advanced/debug/recalculate_field()
+ ..()
+
+/datum/proximity_monitor/advanced/debug/post_setup_field()
+ ..()
+
+/datum/proximity_monitor/advanced/debug/setup_edge_turf(turf/T)
+ T.color = set_edgeturf_color
+ ..()
+
+/datum/proximity_monitor/advanced/debug/cleanup_edge_turf(turf/T)
+ T.color = initial(T.color)
+ ..()
+ if(T in field_turfs)
+ T.color = set_fieldturf_color
+
+/datum/proximity_monitor/advanced/debug/setup_field_turf(turf/T)
+ T.color = set_fieldturf_color
+ ..()
+
+/datum/proximity_monitor/advanced/debug/cleanup_field_turf(turf/T)
+ T.color = initial(T.color)
+ ..()
+
+//DEBUG FIELD ITEM
+/obj/item/device/multitool/field_debug
+ name = "strange multitool"
+ desc = "Seems to project a colored field!"
+ var/list/field_params = list("field_shape" = FIELD_SHAPE_RADIUS_SQUARE, "current_range" = 5, "set_fieldturf_color" = "#aaffff", "set_edgeturf_color" = "#ffaaff")
+ var/field_type = /datum/proximity_monitor/advanced/debug
+ var/operating = FALSE
+ var/datum/proximity_monitor/advanced/current = null
+
+/obj/item/device/multitool/field_debug/New()
+ START_PROCESSING(SSobj, src)
+ ..()
+
+/obj/item/device/multitool/field_debug/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ QDEL_NULL(current)
+ ..()
+
+/obj/item/device/multitool/field_debug/proc/setup_debug_field()
+ var/list/new_params = field_params.Copy()
+ new_params["host"] = src
+ current = make_field(field_type, new_params)
+
+/obj/item/device/multitool/field_debug/attack_self(mob/user)
+ operating = !operating
+ to_chat(user, "You turn the [src] [operating? "on":"off"].")
+ if(!istype(current) && operating)
+ setup_debug_field()
+ else if(!operating)
+ QDEL_NULL(current)
+
+/obj/item/device/multitool/field_debug/on_mob_move()
+ check_turf(get_turf(src))
+
+/obj/item/device/multitool/field_debug/process()
+ check_turf(get_turf(src))
+
+/obj/item/device/multitool/field_debug/proc/check_turf(turf/T)
+ current.HandleMove()
diff --git a/code/modules/fields/peaceborg_dampener.dm b/code/modules/fields/peaceborg_dampener.dm
new file mode 100644
index 00000000000..bcf8a885851
--- /dev/null
+++ b/code/modules/fields/peaceborg_dampener.dm
@@ -0,0 +1,106 @@
+
+//Projectile dampening field that slows projectiles and lowers their damage for an energy cost deducted every 1/5 second.
+//Only use square radius for this!
+/datum/proximity_monitor/advanced/peaceborg_dampener
+ name = "\improper Hyperkinetic Dampener Field"
+ requires_processing = TRUE
+ setup_edge_turfs = TRUE
+ setup_field_turfs = TRUE
+ field_shape = FIELD_SHAPE_RADIUS_SQUARE
+ var/static/image/edgeturf_south = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_south")
+ var/static/image/edgeturf_north = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_north")
+ var/static/image/edgeturf_west = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_west")
+ var/static/image/edgeturf_east = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_east")
+ var/static/image/northwest_corner = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_northwest")
+ var/static/image/southwest_corner = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_southwest")
+ var/static/image/northeast_corner = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_northeast")
+ var/static/image/southeast_corner = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_southeast")
+ var/obj/item/borg/projectile_dampen/projector = null
+ var/list/obj/item/projectile/tracked
+ var/list/obj/item/projectile/staging
+
+/datum/proximity_monitor/advanced/peaceborg_dampener/New()
+ tracked = list()
+ staging = list()
+ ..()
+
+/datum/proximity_monitor/advanced/peaceborg_dampener/process()
+ if(!istype(projector))
+ qdel(src)
+ var/list/ranged = list()
+ for(var/obj/item/projectile/P in range(current_range, get_turf(host)))
+ ranged += P
+ for(var/obj/item/projectile/P in tracked)
+ if(!(P in ranged) || !P.loc)
+ release_projectile(P)
+ for(var/mob/living/silicon/robot/R in range(current_range, get_turf(host)))
+ if(R.has_buckled_mobs())
+ for(var/mob/living/L in R.buckled_mobs)
+ L.visible_message("[L] is knocked off of [R] by the charge in [R]'s chassis induced by [name]!") //I know it's bad.
+ L.Weaken(3)
+ R.unbuckle_mob(L)
+ do_sparks(5, 0, L)
+ ..()
+
+/datum/proximity_monitor/advanced/peaceborg_dampener/setup_edge_turf(turf/T)
+ ..()
+ var/image/I = get_edgeturf_overlay(get_edgeturf_direction(T))
+ var/obj/effect/abstract/proximity_checker/advanced/F = edge_turfs[T]
+ F.appearance = I.appearance
+ F.invisibility = 0
+ F.layer = 5
+
+/datum/proximity_monitor/advanced/peaceborg_dampener/cleanup_edge_turf(turf/T)
+ ..()
+
+/datum/proximity_monitor/advanced/peaceborg_dampener/proc/get_edgeturf_overlay(direction)
+ switch(direction)
+ if(NORTH)
+ return edgeturf_north
+ if(SOUTH)
+ return edgeturf_south
+ if(EAST)
+ return edgeturf_east
+ if(WEST)
+ return edgeturf_west
+ if(NORTHEAST)
+ return northeast_corner
+ if(NORTHWEST)
+ return northwest_corner
+ if(SOUTHEAST)
+ return southeast_corner
+ if(SOUTHWEST)
+ return southwest_corner
+
+/datum/proximity_monitor/advanced/peaceborg_dampener/proc/capture_projectile(obj/item/projectile/P, track_projectile = TRUE)
+ if(P in tracked)
+ return
+ projector.dampen_projectile(P, track_projectile)
+ if(track_projectile)
+ tracked += P
+
+/datum/proximity_monitor/advanced/peaceborg_dampener/proc/release_projectile(obj/item/projectile/P)
+ projector.restore_projectile(P)
+ tracked -= P
+
+/datum/proximity_monitor/advanced/peaceborg_dampener/field_edge_uncrossed(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_edge/F)
+ if(!is_turf_in_field(get_turf(AM), src))
+ if(istype(AM, /obj/item/projectile))
+ if(AM in tracked)
+ release_projectile(AM)
+ else
+ capture_projectile(AM, FALSE)
+ return ..()
+
+/datum/proximity_monitor/advanced/peaceborg_dampener/field_edge_crossed(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_edge/F)
+ if(istype(AM, /obj/item/projectile) && !(AM in tracked) && staging[AM] && !is_turf_in_field(staging[AM], src))
+ capture_projectile(AM)
+ staging -= AM
+ return ..()
+
+/datum/proximity_monitor/advanced/peaceborg_dampener/field_edge_canpass(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_edge/F, turf/entering)
+ if(istype(AM, /obj/item/projectile))
+ staging[AM] = get_turf(AM)
+ . = ..()
+ if(!.)
+ staging -= AM //This one ain't goin' through.
diff --git a/code/modules/fields/turf_objects.dm b/code/modules/fields/turf_objects.dm
new file mode 100644
index 00000000000..683fa67c962
--- /dev/null
+++ b/code/modules/fields/turf_objects.dm
@@ -0,0 +1,76 @@
+
+/obj/effect/abstract/proximity_checker/advanced
+ name = "field"
+ desc = "Why can you see energy fields?!"
+ icon = null
+ icon_state = null
+ alpha = 0
+ invisibility = INVISIBILITY_ABSTRACT
+ flags = ABSTRACT|ON_BORDER
+ var/datum/proximity_monitor/advanced/parent = null
+
+/obj/effect/abstract/proximity_checker/advanced/Initialize(mapload, _monitor)
+ if(_monitor)
+ parent = _monitor
+ return ..()
+
+/obj/effect/abstract/proximity_checker/advanced/center
+ name = "field anchor"
+ desc = "No."
+
+/obj/effect/abstract/proximity_checker/advanced/field_turf
+ name = "energy field"
+ desc = "Get off my turf!"
+
+/obj/effect/abstract/proximity_checker/advanced/field_turf/CanPass(atom/movable/AM, turf/target, height)
+ if(parent)
+ return parent.field_turf_canpass(AM, src, target)
+ return TRUE
+
+/obj/effect/abstract/proximity_checker/advanced/field_turf/Crossed(atom/movable/AM)
+ if(parent)
+ return parent.field_turf_crossed(AM, src)
+ return TRUE
+
+/obj/effect/abstract/proximity_checker/advanced/field_turf/Uncross(atom/movable/AM)
+ if(parent)
+ return parent.field_turf_uncross(AM, src)
+ return TRUE
+
+/obj/effect/abstract/proximity_checker/advanced/field_turf/Uncrossed(atom/movable/AM)
+ if(parent)
+ return parent.field_turf_uncrossed(AM, src)
+ return TRUE
+
+/obj/effect/abstract/proximity_checker/advanced/field_edge
+ name = "energy field edge"
+ desc = "Edgy description here."
+
+/obj/effect/abstract/proximity_checker/advanced/field_edge/CanPass(atom/movable/AM, turf/target, height)
+ if(parent)
+ return parent.field_edge_canpass(AM, src, target)
+ return TRUE
+
+/obj/effect/abstract/proximity_checker/advanced/field_edge/Crossed(atom/movable/AM)
+ if(parent)
+ return parent.field_edge_crossed(AM, src)
+ return TRUE
+
+/obj/effect/abstract/proximity_checker/advanced/field_edge/Uncross(atom/movable/AM)
+ if(parent)
+ return parent.field_edge_uncross(AM, src)
+ return TRUE
+
+/obj/effect/abstract/proximity_checker/advanced/field_edge/Uncrossed(atom/movable/AM)
+ if(parent)
+ return parent.field_edge_uncrossed(AM, src)
+ return TRUE
+
+/proc/is_turf_in_field(turf/T, datum/proximity_monitor/advanced/F) //Looking for ways to optimize this!
+ for(var/obj/effect/abstract/proximity_checker/advanced/O in T)
+ if(istype(O, /obj/effect/abstract/proximity_checker/advanced/field_edge))
+ if(O.parent == F)
+ return FIELD_EDGE
+ if(O.parent == F)
+ return FIELD_TURF
+ return NO_FIELD
diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm
index 3a6c2d91f66..7a1682aedd0 100644
--- a/code/modules/food_and_drinks/food/customizables.dm
+++ b/code/modules/food_and_drinks/food/customizables.dm
@@ -135,7 +135,6 @@
/obj/item/weapon/reagent_containers/food/snacks/customizable/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/slice, reagents_per_slice)
..()
- slice.name = "[customname] [initial(slice.name)]"
slice.filling_color = filling_color
slice.update_overlays(src)
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 148541922ff..95d3a7993b9 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -215,8 +215,9 @@
/obj/item/weapon/reagent_containers/food/snacks/proc/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/slice, reagents_per_slice)
slice.create_reagents(slice.volume)
reagents.trans_to(slice,reagents_per_slice)
- if( name != initial(name) || desc != initial(desc) )
- slice.name = "slice of [src]"
+ if(name != initial(name))
+ slice.name = "slice of [name]"
+ if(desc != initial(desc))
slice.desc = "[desc]"
/obj/item/weapon/reagent_containers/food/snacks/proc/generate_trash(atom/location)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index 81e36923768..f4ffb4123a0 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -174,7 +174,6 @@
var/mob/living/carbon/human/gibee = occupant
sourcejob = gibee.job
var/sourcenutriment = mob_occupant.nutrition / 15
- var/sourcetotalreagents = mob_occupant.reagents.total_volume
var/gibtype = /obj/effect/decal/cleanable/blood/gibs
var/typeofmeat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human
var/typeofskin = /obj/item/stack/sheet/animalhide/human
@@ -207,7 +206,6 @@
newmeat.reagents.add_reagent ("nutriment", sourcenutriment / meat_produced) // Thehehe. Fat guys go first
if(sourcejob)
newmeat.subjectjob = sourcejob
- src.occupant.reagents.trans_to (newmeat, round (sourcetotalreagents / meat_produced, 1)) // Transfer all the reagents from the
allmeat[i] = newmeat
allskin = newskin
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index 6a1c877b97f..dd322e57d39 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -107,20 +107,45 @@
anchored = TRUE
buckle_lying = 0
var/burning = 0
+ var/grill = FALSE
var/fire_stack_strength = 5
/obj/structure/bonfire/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/stack/rods) && !can_buckle)
+ if(istype(W, /obj/item/stack/rods) && !can_buckle && !grill)
var/obj/item/stack/rods/R = W
- R.use(1)
- can_buckle = 1
- buckle_requires_restraints = 1
- to_chat(user, "You add a rod to [src].")
- var/mutable_appearance/rod_underlay = mutable_appearance('icons/obj/hydroponics/equipment.dmi', "bonfire_rod")
- rod_underlay.pixel_y = 16
- underlays += rod_underlay
+ var/choice = input(user, "What would you like to construct?", "Bonfire") as null|anything in list("Stake","Grill")
+ switch(choice)
+ if("Stake")
+ R.use(1)
+ can_buckle = TRUE
+ buckle_requires_restraints = TRUE
+ to_chat(user, "You add a rod to \the [src].")
+ var/mutable_appearance/rod_underlay = mutable_appearance('icons/obj/hydroponics/equipment.dmi', "bonfire_rod")
+ rod_underlay.pixel_y = 16
+ underlays += rod_underlay
+ if("Grill")
+ R.use(1)
+ grill = TRUE
+ to_chat(user, "You add a grill to \the [src].")
+ var/mutable_appearance/grill_overlay = mutable_appearance('icons/obj/hydroponics/equipment.dmi', "bonfire_grill")
+ overlays += grill_overlay
+ else
+ return ..()
if(W.is_hot())
StartBurning()
+ if(grill)
+ if(user.a_intent != INTENT_HARM && !(W.flags & ABSTRACT))
+ if(user.temporarilyRemoveItemFromInventory(W))
+ W.forceMove(get_turf(src))
+ var/list/click_params = params2list(params)
+ //Center the icon where the user clicked.
+ if(!click_params || !click_params["icon-x"] || !click_params["icon-y"])
+ return
+ //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf)
+ W.pixel_x = Clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2)
+ W.pixel_y = Clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2)
+ else
+ return ..()
/obj/structure/bonfire/attack_hand(mob/user)
@@ -158,7 +183,7 @@
StartBurning()
/obj/structure/bonfire/Crossed(atom/movable/AM)
- if(burning)
+ if(burning & !grill)
Burn()
/obj/structure/bonfire/proc/Burn()
@@ -175,11 +200,27 @@
L.adjust_fire_stacks(fire_stack_strength)
L.IgniteMob()
+/obj/structure/bonfire/proc/Cook()
+ var/turf/current_location = get_turf(src)
+ for(var/A in current_location)
+ if(A == src)
+ continue
+ else if(isliving(A)) //It's still a fire, idiot.
+ var/mob/living/L = A
+ L.adjust_fire_stacks(fire_stack_strength)
+ L.IgniteMob()
+ else if(istype(A, /obj/item) && prob(20))
+ var/obj/item/O = A
+ O.microwave_act()
+
/obj/structure/bonfire/process()
if(!CheckOxygen())
extinguish()
return
- Burn()
+ if(!grill)
+ Burn()
+ else
+ Cook()
/obj/structure/bonfire/extinguish()
if(burning)
diff --git a/code/modules/language/codespeak.dm b/code/modules/language/codespeak.dm
new file mode 100644
index 00000000000..35fc6e0aa76
--- /dev/null
+++ b/code/modules/language/codespeak.dm
@@ -0,0 +1,83 @@
+/datum/language/codespeak
+ name = "Codespeak"
+ desc = "Syndicate operatives can use a series of codewords to convey complex information, while sounding like random concepts and drinks to anyone listening in."
+ key = "t"
+ default_priority = 0
+ flags = TONGUELESS_SPEECH | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD
+ icon_state = "codespeak"
+
+/datum/language/codespeak/scramble(input)
+ var/lookup = check_cache(input)
+ if(lookup)
+ return lookup
+
+ . = ""
+ var/list/words = list()
+ while(length(.) < length(input))
+ words += generate_code_phrase(return_list=TRUE)
+ . = jointext(words, ", ")
+
+ . = capitalize(.)
+
+ var/input_ending = copytext(input, length(input))
+
+ var/static/list/endings
+ if(!endings)
+ endings = list("!", "?", ".")
+
+ if(input_ending in endings)
+ . += input_ending
+
+ add_to_cache(input, .)
+
+/obj/item/weapon/codespeak_manual
+ name = "codespeak manual"
+ desc = "The book's cover reads: \"Codespeak(tm) - Secure your communication with metaphors so elaborate, they seem randomly generated!\""
+ icon = 'icons/obj/library.dmi'
+ icon_state = "book2"
+ var/charges = 1
+
+/obj/item/weapon/codespeak_manual/attack_self(mob/living/user)
+ if(!isliving(user))
+ return
+
+ if(user.has_language(/datum/language/codespeak))
+ to_chat(user, "You start skimming through [src], but you already know Codespeak.")
+ return
+
+ to_chat(user, "You start skimming through [src], and suddenly your mind is filled with codewords and responses.")
+ user.grant_language(/datum/language/codespeak)
+
+ use_charge(user)
+
+/obj/item/weapon/codespeak_manual/attack(mob/living/M, mob/living/user)
+ if(!istype(M) || !istype(user))
+ return
+ if(M == user)
+ attack_self(user)
+ return
+
+ playsound(loc, "punch", 25, 1, -1)
+
+ if(M.stat == DEAD)
+ M.visible_message("[user] smacks [M]'s lifeless corpse with [src].", "[user] smacks your lifeless corpse with [src].", "You hear smacking.")
+ else if(M.has_language(/datum/language/codespeak))
+ M.visible_message("[user] beats [M] over the head with [src]!", "[user] beats you over the head with [src]!", "You hear smacking.")
+ else
+ M.visible_message("[user] teaches [M] by beating them over the head with [src]!", "As [user] hits you with [src], codewords and responses flow through your mind.", "You hear smacking.")
+ M.grant_language(/datum/language/codespeak)
+ use_charge(user)
+
+/obj/item/weapon/codespeak_manual/proc/use_charge(mob/user)
+ charges--
+ if(!charges)
+ var/turf/T = get_turf(src)
+ T.visible_message("The cover and contents of [src] start shifting and changing!")
+
+ qdel(src)
+ var/obj/item/weapon/book/manual/random/book = new(T)
+ user.put_in_active_hand(book)
+
+/obj/item/weapon/codespeak_manual/unlimited
+ name = "deluxe codespeak manual"
+ charges = INFINITY
diff --git a/code/modules/language/language.dm b/code/modules/language/language.dm
index 55a57de9941..7e7e5bc20d2 100644
--- a/code/modules/language/language.dm
+++ b/code/modules/language/language.dm
@@ -56,16 +56,27 @@
return "[trim(full_name)]"
+/datum/language/proc/check_cache(input)
+ var/lookup = scramble_cache[input]
+ if(lookup)
+ scramble_cache -= input
+ scramble_cache[input] = lookup
+ . = lookup
+
+/datum/language/proc/add_to_cache(input, scrambled_text)
+ // Add it to cache, cutting old entries if the list is too long
+ scramble_cache[input] = scrambled_text
+ if(scramble_cache.len > SCRAMBLE_CACHE_LEN)
+ scramble_cache.Cut(1, scramble_cache.len-SCRAMBLE_CACHE_LEN-1)
+
/datum/language/proc/scramble(input)
if(!syllables || !syllables.len)
return stars(input)
// If the input is cached already, move it to the end of the cache and return it
- var/lookup = scramble_cache[input]
+ var/lookup = check_cache(input)
if(lookup)
- scramble_cache -= input
- scramble_cache[input] = lookup
return lookup
var/input_size = length(input)
@@ -93,10 +104,7 @@
if(input_ending in list("!","?","."))
scrambled_text += input_ending
- // Add it to cache, cutting old entries if the list is too long
- scramble_cache[input] = scrambled_text
- if(scramble_cache.len > SCRAMBLE_CACHE_LEN)
- scramble_cache.Cut(1, scramble_cache.len-SCRAMBLE_CACHE_LEN-1)
+ add_to_cache(input, scrambled_text)
return scrambled_text
diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm
index 580ca9294a7..3973893b8f1 100644
--- a/code/modules/language/language_holder.dm
+++ b/code/modules/language/language_holder.dm
@@ -64,6 +64,24 @@
return LANGUAGE_SHADOWED
return FALSE
+/datum/language_holder/proc/copy_known_languages_from(thing, replace=FALSE)
+ var/datum/language_holder/other
+ if(istype(thing, /datum/language_holder))
+ other = thing
+ else if(istype(thing, /atom/movable))
+ var/atom/movable/AM = thing
+ other = AM.get_language_holder()
+ else if(istype(thing, /datum/mind))
+ var/datum/mind/M = thing
+ other = M.get_language_holder()
+
+ if(replace)
+ src.remove_all_languages()
+
+ for(var/l in other.languages)
+ src.grant_language(l)
+
+
/datum/language_holder/proc/open_language_menu(mob/user)
if(!language_menu)
language_menu = new(src)
diff --git a/code/modules/mining/equipment.dm b/code/modules/mining/equipment.dm
index dd8766bdc9a..2f9fccba82c 100644
--- a/code/modules/mining/equipment.dm
+++ b/code/modules/mining/equipment.dm
@@ -447,10 +447,10 @@
minerals += M
if(minerals.len)
for(var/turf/closed/mineral/M in minerals)
- var/obj/effect/overlay/temp/mining_overlay/C = new /obj/effect/overlay/temp/mining_overlay(M)
+ var/obj/effect/temp_visual/mining_overlay/C = new /obj/effect/temp_visual/mining_overlay(M)
C.icon_state = M.scan_state
-/obj/effect/overlay/temp/mining_overlay
+/obj/effect/temp_visual/mining_overlay
layer = FLASH_LAYER
icon = 'icons/turf/smoothrocks.dmi'
anchored = 1
@@ -543,7 +543,7 @@
var/target_turf = get_turf(target)
if(ismineralturf(target_turf))
var/turf/closed/mineral/M = target_turf
- new /obj/effect/overlay/temp/kinetic_blast(M)
+ new /obj/effect/temp_visual/kinetic_blast(M)
M.gets_drilled(firer)
..()
@@ -568,7 +568,7 @@
return
if(proximity_flag && target == mark && isliving(target))
var/mob/living/L = target
- new /obj/effect/overlay/temp/kinetic_blast(get_turf(L))
+ new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
mark = 0
if(L.mob_size >= MOB_SIZE_LARGE)
L.underlays -= marked_underlay
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 9e4996135d5..65ca340d995 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -673,7 +673,7 @@
if(!istype(T))
return
if(!istype(T, turf_type))
- var/obj/effect/overlay/temp/lavastaff/L = new /obj/effect/overlay/temp/lavastaff(T)
+ var/obj/effect/temp_visual/lavastaff/L = new /obj/effect/temp_visual/lavastaff(T)
L.alpha = 0
animate(L, alpha = 255, time = create_delay)
user.visible_message("[user] points [src] at [T]!")
@@ -696,7 +696,7 @@
timer = world.time + reset_cooldown
playsound(T,'sound/magic/Fireball.ogg', 200, 1)
-/obj/effect/overlay/temp/lavastaff
+/obj/effect/temp_visual/lavastaff
icon_state = "lavastaff_warn"
duration = 50
@@ -821,7 +821,7 @@
timer = world.time + cooldown_time
if(isliving(target) && chaser_timer <= world.time) //living and chasers off cooldown? fire one!
chaser_timer = world.time + chaser_cooldown
- var/obj/effect/overlay/temp/hierophant/chaser/C = new(get_turf(user), user, target, chaser_speed, friendly_fire_check)
+ var/obj/effect/temp_visual/hierophant/chaser/C = new(get_turf(user), user, target, chaser_speed, friendly_fire_check)
C.damage = 30
C.monster_damage_boost = FALSE
add_logs(user, target, "fired a chaser at", src)
@@ -878,7 +878,7 @@
if(do_after(user, 50, target = user) && !beacon)
var/turf/T = get_turf(user)
playsound(T,'sound/magic/Blind.ogg', 200, 1, -4)
- new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, user)
+ new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, user)
beacon = new/obj/effect/hierophant(T)
user.update_action_buttons_icon()
user.visible_message("[user] places a strange machine beneath [user.p_their()] feet!", \
@@ -905,8 +905,8 @@
timer = world.time + 50
INVOKE_ASYNC(src, .proc/prepare_icon_update)
beacon.icon_state = "hierophant_tele_on"
- var/obj/effect/overlay/temp/hierophant/telegraph/edge/TE1 = new /obj/effect/overlay/temp/hierophant/telegraph/edge(user.loc)
- var/obj/effect/overlay/temp/hierophant/telegraph/edge/TE2 = new /obj/effect/overlay/temp/hierophant/telegraph/edge(beacon.loc)
+ var/obj/effect/temp_visual/hierophant/telegraph/edge/TE1 = new /obj/effect/temp_visual/hierophant/telegraph/edge(user.loc)
+ var/obj/effect/temp_visual/hierophant/telegraph/edge/TE2 = new /obj/effect/temp_visual/hierophant/telegraph/edge(beacon.loc)
if(do_after(user, 40, target = user) && user && beacon)
var/turf/T = get_turf(beacon)
var/turf/source = get_turf(user)
@@ -918,8 +918,8 @@
INVOKE_ASYNC(src, .proc/prepare_icon_update)
beacon.icon_state = "hierophant_tele_off"
return
- new /obj/effect/overlay/temp/hierophant/telegraph(T, user)
- new /obj/effect/overlay/temp/hierophant/telegraph(source, user)
+ new /obj/effect/temp_visual/hierophant/telegraph(T, user)
+ new /obj/effect/temp_visual/hierophant/telegraph(source, user)
playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1)
playsound(source,'sound/machines/AirlockOpen.ogg', 200, 1)
if(!do_after(user, 3, target = user) || !user || !beacon || QDELETED(beacon)) //no walking away shitlord
@@ -940,13 +940,13 @@
beacon.icon_state = "hierophant_tele_off"
return
add_logs(user, beacon, "teleported self from ([source.x],[source.y],[source.z]) to")
- new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, user)
- new /obj/effect/overlay/temp/hierophant/telegraph/teleport(source, user)
+ new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, user)
+ new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, user)
for(var/t in RANGE_TURFS(1, T))
- var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, user, TRUE) //No friendly fire, this is a utility tool
+ var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, user, TRUE) //blasts produced will not hurt allies
B.damage = 30
for(var/t in RANGE_TURFS(1, source))
- var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, user, TRUE)
+ var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, user, TRUE) //but absolutely will hurt enemies
B.damage = 30
for(var/mob/living/L in range(1, source))
INVOKE_ASYNC(src, .proc/teleport_mob, source, L, T, user) //regardless, take all mobs near us along
@@ -991,10 +991,10 @@
/obj/item/weapon/hierophant_club/proc/cardinal_blasts(turf/T, mob/living/user) //fire cardinal cross blasts with a delay
if(!T)
return
- new /obj/effect/overlay/temp/hierophant/telegraph/cardinal(T, user)
+ new /obj/effect/temp_visual/hierophant/telegraph/cardinal(T, user)
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
- new /obj/effect/overlay/temp/hierophant/blast(T, user, friendly_fire_check)
+ new /obj/effect/temp_visual/hierophant/blast(T, user, friendly_fire_check)
for(var/d in GLOB.cardinal)
INVOKE_ASYNC(src, .proc/blast_wall, T, d, user)
@@ -1007,7 +1007,7 @@
for(var/i in 1 to range)
if(!J)
return
- var/obj/effect/overlay/temp/hierophant/blast/B = new(J, user, friendly_fire_check)
+ var/obj/effect/temp_visual/hierophant/blast/B = new(J, user, friendly_fire_check)
B.damage = 30
B.monster_damage_boost = FALSE
previousturf = J
@@ -1016,9 +1016,9 @@
/obj/item/weapon/hierophant_club/proc/aoe_burst(turf/T, mob/living/user) //make a 3x3 blast around a target
if(!T)
return
- new /obj/effect/overlay/temp/hierophant/telegraph(T, user)
+ new /obj/effect/temp_visual/hierophant/telegraph(T, user)
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
for(var/t in RANGE_TURFS(1, T))
- var/obj/effect/overlay/temp/hierophant/blast/B = new(t, user, friendly_fire_check)
+ var/obj/effect/temp_visual/hierophant/blast/B = new(t, user, friendly_fire_check)
B.damage = 15 //keeps monster damage boost due to lower damage
diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm
index 9382dc392db..46facdc4547 100644
--- a/code/modules/mob/living/carbon/alien/death.dm
+++ b/code/modules/mob/living/carbon/alien/death.dm
@@ -5,10 +5,10 @@
new /obj/effect/gibspawner/xenobodypartless(loc,viruses)
/mob/living/carbon/alien/gib_animation()
- new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-a")
+ new /obj/effect/temp_visual/gib_animation(loc, "gibbed-a")
/mob/living/carbon/alien/spawn_dust()
new /obj/effect/decal/remains/xeno(loc)
/mob/living/carbon/alien/dust_animation()
- new /obj/effect/overlay/temp/dust_animation(loc, "dust-a")
+ new /obj/effect/temp_visual/dust_animation(loc, "dust-a")
diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm
index 16d2f534e08..585e5779c62 100644
--- a/code/modules/mob/living/carbon/alien/larva/death.dm
+++ b/code/modules/mob/living/carbon/alien/larva/death.dm
@@ -13,10 +13,10 @@
new /obj/effect/gibspawner/larvabodypartless(loc,viruses)
/mob/living/carbon/alien/larva/gib_animation()
- new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-l")
+ new /obj/effect/temp_visual/gib_animation(loc, "gibbed-l")
/mob/living/carbon/alien/larva/spawn_dust()
new /obj/effect/decal/remains/xeno(loc)
/mob/living/carbon/alien/larva/dust_animation()
- new /obj/effect/overlay/temp/dust_animation(loc, "dust-l")
+ new /obj/effect/temp_visual/dust_animation(loc, "dust-l")
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 86ed1220fa8..04dba44ee5f 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -1,8 +1,8 @@
/mob/living/carbon/human/gib_animation()
- new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-h")
+ new /obj/effect/temp_visual/gib_animation(loc, "gibbed-h")
/mob/living/carbon/human/dust_animation()
- new /obj/effect/overlay/temp/dust_animation(loc, "dust-h")
+ new /obj/effect/temp_visual/dust_animation(loc, "dust-h")
/mob/living/carbon/human/spawn_gibs(with_bodyparts)
if(with_bodyparts)
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index bb84bb460f2..85fa57063ee 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -664,7 +664,7 @@
return
invisibility = INVISIBILITY_MAXIMUM //disappear before the animation
- new /obj/effect/overlay/temp/mummy_animation(get_turf(src))
+ new /obj/effect/temp_visual/mummy_animation(get_turf(src))
if(cloth_golem.revive(full_heal = TRUE, admin_revive = TRUE))
cloth_golem.grab_ghost() //won't pull if it's a suicide
sleep(20)
diff --git a/code/modules/mob/living/carbon/monkey/death.dm b/code/modules/mob/living/carbon/monkey/death.dm
index a45209c5c21..3c5cdf3b38d 100644
--- a/code/modules/mob/living/carbon/monkey/death.dm
+++ b/code/modules/mob/living/carbon/monkey/death.dm
@@ -1,5 +1,5 @@
/mob/living/carbon/monkey/gib_animation()
- new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-m")
+ new /obj/effect/temp_visual/gib_animation(loc, "gibbed-m")
/mob/living/carbon/monkey/dust_animation()
- new /obj/effect/overlay/temp/dust_animation(loc, "dust-m")
+ new /obj/effect/temp_visual/dust_animation(loc, "dust-m")
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index f080a54e84c..c74d21b7181 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -820,7 +820,7 @@
/mob/living/proc/has_bane(banetype)
var/datum/antagonist/devil/devilInfo = is_devil(src)
- return (banetype == devilInfo.bane)
+ return devilInfo && banetype == devilInfo.bane
/mob/living/proc/check_weakness(obj/item/weapon, mob/living/attacker)
if(mind && mind.has_antag_datum(ANTAG_DATUM_DEVIL))
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index 4df0c54d1a1..246ea1e060a 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -1,6 +1,6 @@
/mob/living/silicon/robot/gib_animation()
- new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-r")
+ new /obj/effect/temp_visual/gib_animation(loc, "gibbed-r")
/mob/living/silicon/robot/dust()
if(mmi)
@@ -11,7 +11,7 @@
new /obj/effect/decal/remains/robot(loc)
/mob/living/silicon/robot/dust_animation()
- new /obj/effect/overlay/temp/dust_animation(loc, "dust-r")
+ new /obj/effect/temp_visual/dust_animation(loc, "dust-r")
/mob/living/silicon/robot/death(gibbed)
if(stat == DEAD)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index fde80220572..fb723d28b18 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -198,9 +198,9 @@
/obj/item/weapon/robot_module/proc/do_transform_animation()
var/mob/living/silicon/robot/R = loc
R.notransform = TRUE
- var/obj/effect/overlay/temp/decoy/fading/fivesecond/ANM = new /obj/effect/overlay/temp/decoy/fading/fivesecond(R.loc, R)
+ var/obj/effect/temp_visual/decoy/fading/fivesecond/ANM = new /obj/effect/temp_visual/decoy/fading/fivesecond(R.loc, R)
ANM.layer = R.layer - 0.01
- new /obj/effect/overlay/temp/small_smoke(R.loc)
+ new /obj/effect/temp_visual/small_smoke(R.loc)
if(R.hat)
R.hat.forceMove(get_turf(R))
R.hat = null
@@ -359,7 +359,8 @@
/obj/item/weapon/reagent_containers/borghypo/peace,
/obj/item/weapon/holosign_creator/cyborg,
/obj/item/borg/cyborghug/peacekeeper,
- /obj/item/weapon/extinguisher)
+ /obj/item/weapon/extinguisher,
+ /obj/item/borg/projectile_dampen)
emag_modules = list(/obj/item/weapon/reagent_containers/borghypo/peace/hacked)
ratvar_modules = list(
/obj/item/clockwork/slab/cyborg/peacekeeper,
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 1dfdf2a14f9..796705e4c8d 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -299,7 +299,7 @@
/mob/living/simple_animal/bot/emp_act(severity)
var/was_on = on
stat |= EMPED
- new /obj/effect/overlay/temp/emp(loc)
+ new /obj/effect/temp_visual/emp(loc)
if(paicard)
paicard.emp_act(severity)
src.visible_message("[paicard] is flies out of [bot_name]!","You are forcefully ejected from [bot_name]!")
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index 07ea0d7b5dd..6b8f8339cef 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -444,7 +444,7 @@ Auto Patrol[]"},
if(severity==2 && prob(70))
..(severity-1)
else
- new /obj/effect/overlay/temp/emp(loc)
+ new /obj/effect/temp_visual/emp(loc)
var/list/mob/living/carbon/targets = new
for(var/mob/living/carbon/C in view(12,src))
if(C.stat==2)
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 0e51630b4c1..40978f04ff5 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -215,7 +215,7 @@
if(change)
if(change > 0)
if(M && stat != DEAD)
- new /obj/effect/overlay/temp/heart(loc)
+ new /obj/effect/temp_visual/heart(loc)
emote("me", 1, "purrs!")
else
if(M && stat != DEAD)
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index d73b74e4a0f..5a4cd366b92 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -552,7 +552,7 @@
if(change)
if(change > 0)
if(M && stat != DEAD) // Added check to see if this mob (the dog) is dead to fix issue 2454
- new /obj/effect/overlay/temp/heart(loc)
+ new /obj/effect/temp_visual/heart(loc)
emote("me", 1, "yaps happily!")
else
if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case)
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index fe6e22bcab2..a0f46922b7f 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -175,9 +175,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
if(istype(summoner.loc, /obj/effect))
Recall(TRUE)
else
- new /obj/effect/overlay/temp/guardian/phase/out(loc)
+ new /obj/effect/temp_visual/guardian/phase/out(loc)
forceMove(summoner.loc)
- new /obj/effect/overlay/temp/guardian/phase(loc)
+ new /obj/effect/temp_visual/guardian/phase(loc)
/mob/living/simple_animal/hostile/guardian/canSuicide()
return 0
@@ -315,7 +315,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
return FALSE
if(loc == summoner)
forceMove(summoner.loc)
- new /obj/effect/overlay/temp/guardian/phase(loc)
+ new /obj/effect/temp_visual/guardian/phase(loc)
cooldown = world.time + 10
return TRUE
return FALSE
@@ -323,7 +323,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
/mob/living/simple_animal/hostile/guardian/proc/Recall(forced)
if(!summoner || loc == summoner || (cooldown > world.time && !forced))
return FALSE
- new /obj/effect/overlay/temp/guardian/phase/out(loc)
+ new /obj/effect/temp_visual/guardian/phase/out(loc)
forceMove(summoner)
cooldown = world.time + 10
diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
index 1fa54dfd216..0f4b15b4f4d 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
@@ -72,7 +72,7 @@
armour_penetration = 100
obj_damage = 0
environment_smash = 0
- new /obj/effect/overlay/temp/guardian/phase/out(get_turf(src))
+ new /obj/effect/temp_visual/guardian/phase/out(get_turf(src))
alpha = 15
if(!forced)
to_chat(src, "You enter stealth, empowering your next attack.")
diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm
index 708a1e2ce6b..c1be82b8208 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm
@@ -40,7 +40,7 @@
/mob/living/simple_animal/hostile/guardian/charger/Move()
if(charging)
- new /obj/effect/overlay/temp/decoy/fading(loc,src)
+ new /obj/effect/temp_visual/decoy/fading(loc,src)
. = ..()
/mob/living/simple_animal/hostile/guardian/charger/snapback()
diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
index 9da40c0c7c5..1e6fa727b9d 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
@@ -21,14 +21,14 @@
if(. && prob(40) && isliving(target))
var/mob/living/M = target
if(!M.anchored && M != summoner && !hasmatchingsummoner(M))
- new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M))
+ new /obj/effect/temp_visual/guardian/phase/out(get_turf(M))
do_teleport(M, M, 10)
for(var/mob/living/L in range(1, M))
if(hasmatchingsummoner(L)) //if the summoner matches don't hurt them
continue
if(L != src && L != summoner)
L.apply_damage(15, BRUTE)
- new /obj/effect/overlay/temp/explosion(get_turf(M))
+ new /obj/effect/temp_visual/explosion(get_turf(M))
/mob/living/simple_animal/hostile/guardian/bomb/AltClickOn(atom/movable/A)
if(!istype(A))
@@ -75,7 +75,7 @@
var/turf/T = get_turf(src)
stored_obj.forceMove(T)
playsound(T,'sound/effects/Explosion2.ogg', 200, 1)
- new /obj/effect/overlay/temp/explosion(T)
+ new /obj/effect/temp_visual/explosion(T)
user.ex_act(2)
qdel(src)
else
diff --git a/code/modules/mob/living/simple_animal/guardian/types/protector.dm b/code/modules/mob/living/simple_animal/guardian/types/protector.dm
index eacf58410b4..cabb6854b2f 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/protector.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/protector.dm
@@ -63,6 +63,6 @@
else
to_chat(summoner, "You moved out of range, and were pulled back! You can only move [range] meters from [real_name]!")
summoner.visible_message("\The [summoner] jumps back to [summoner.p_their()] protector.")
- new /obj/effect/overlay/temp/guardian/phase/out(get_turf(summoner))
+ new /obj/effect/temp_visual/guardian/phase/out(get_turf(summoner))
summoner.forceMove(get_turf(src))
- new /obj/effect/overlay/temp/guardian/phase(get_turf(summoner))
+ new /obj/effect/temp_visual/guardian/phase(get_turf(summoner))
diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm
index 159e6df5f4c..3d7ae484432 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/support.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm
@@ -34,7 +34,7 @@
C.adjustFireLoss(-5)
C.adjustOxyLoss(-5)
C.adjustToxLoss(-5)
- var/obj/effect/overlay/temp/heal/H = new /obj/effect/overlay/temp/heal(get_turf(C))
+ var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(C))
if(namedatum)
H.color = namedatum.colour
if(C == summoner)
@@ -136,11 +136,11 @@
to_chat(src, "You need to hold still!")
return
- new /obj/effect/overlay/temp/guardian/phase/out(T)
+ new /obj/effect/temp_visual/guardian/phase/out(T)
if(isliving(A))
var/mob/living/L = A
L.flash_act()
A.visible_message("[A] disappears in a flash of light!", \
"Your vision is obscured by a flash of light!")
do_teleport(A, beacon, 0)
- new /obj/effect/overlay/temp/guardian/phase(get_turf(A))
+ new /obj/effect/temp_visual/guardian/phase(get_turf(A))
diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
index 951589daaf1..601233c4247 100644
--- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
@@ -16,7 +16,7 @@
melee_damage_upper = 20
health = 1000
maxHealth = 1000
- loot = list(/obj/effect/overlay/temp/paperwiz_dying)
+ loot = list(/obj/effect/temp_visual/paperwiz_dying)
projectiletype = /obj/item/projectile/temp
projectilesound = 'sound/weapons/emitter.ogg'
attack_sound = 'sound/hallucinations/growl1.ogg'
@@ -129,7 +129,7 @@
qdel(src) //I see through your ruse!
//fancy effects
-/obj/effect/overlay/temp/paper_scatter
+/obj/effect/temp_visual/paper_scatter
name = "scattering paper"
desc = "Pieces of paper scattering to the wind."
layer = ABOVE_OPEN_TURF_LAYER
@@ -139,7 +139,7 @@
duration = 5
randomdir = FALSE
-/obj/effect/overlay/temp/paperwiz_dying
+/obj/effect/temp_visual/paperwiz_dying
name = "craft portal"
desc = "A wormhole sucking the wizard into the void. Neat."
layer = ABOVE_OPEN_TURF_LAYER
@@ -149,18 +149,18 @@
duration = 18
randomdir = FALSE
-/obj/effect/overlay/temp/paperwiz_dying/Initialize()
+/obj/effect/temp_visual/paperwiz_dying/Initialize()
. = ..()
visible_message("The wizard cries out in pain as a gate appears behind him, sucking him in!")
playsound(get_turf(src),'sound/magic/MandSwap.ogg', 50, 1, 1)
playsound(get_turf(src),'sound/hallucinations/wail.ogg', 50, 1, 1)
-/obj/effect/overlay/temp/paperwiz_dying/Destroy()
+/obj/effect/temp_visual/paperwiz_dying/Destroy()
for(var/mob/M in range(7,src))
shake_camera(M, 7, 1)
var/turf/T = get_turf(src)
playsound(T,'sound/magic/Summon_Magic.ogg', 50, 1, 1)
- new /obj/effect/overlay/temp/paper_scatter(T)
+ new /obj/effect/temp_visual/paper_scatter(T)
new /obj/item/clothing/suit/wizrobe/paper(T)
new /obj/item/clothing/head/collectable/paper(T)
return ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index fa61a16e517..2645ebcef78 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -134,7 +134,7 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/Move()
if(charging)
- new /obj/effect/overlay/temp/decoy/fading(loc,src)
+ new /obj/effect/temp_visual/decoy/fading(loc,src)
DestroySurroundings()
. = ..()
if(!stat && .)
@@ -150,12 +150,12 @@ Difficulty: Hard
var/turf/T = get_turf(target)
if(!T || T == loc)
return
- new /obj/effect/overlay/temp/dragon_swoop/bubblegum(T)
+ new /obj/effect/temp_visual/dragon_swoop/bubblegum(T)
charging = TRUE
DestroySurroundings()
walk(src, 0)
setDir(get_dir(src, T))
- var/obj/effect/overlay/temp/decoy/D = new /obj/effect/overlay/temp/decoy(loc,src)
+ var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(loc,src)
animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 3)
sleep(3)
throw_at(T, get_dist(src, T), 1, src, 0, callback = CALLBACK(src, .charge_end, bonus_charges))
@@ -245,9 +245,9 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodsmack(turf/T, handedness)
if(handedness)
- new /obj/effect/overlay/temp/bubblegum_hands/rightsmack(T)
+ new /obj/effect/temp_visual/bubblegum_hands/rightsmack(T)
else
- new /obj/effect/overlay/temp/bubblegum_hands/leftsmack(T)
+ new /obj/effect/temp_visual/bubblegum_hands/leftsmack(T)
sleep(2.5)
for(var/mob/living/L in T)
if(!faction_check_mob(L))
@@ -259,11 +259,11 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodgrab(turf/T, handedness)
if(handedness)
- new /obj/effect/overlay/temp/bubblegum_hands/rightpaw(T)
- new /obj/effect/overlay/temp/bubblegum_hands/rightthumb(T)
+ new /obj/effect/temp_visual/bubblegum_hands/rightpaw(T)
+ new /obj/effect/temp_visual/bubblegum_hands/rightthumb(T)
else
- new /obj/effect/overlay/temp/bubblegum_hands/leftpaw(T)
- new /obj/effect/overlay/temp/bubblegum_hands/leftthumb(T)
+ new /obj/effect/temp_visual/bubblegum_hands/leftpaw(T)
+ new /obj/effect/temp_visual/bubblegum_hands/leftthumb(T)
sleep(6)
for(var/mob/living/L in T)
if(!faction_check_mob(L))
@@ -276,31 +276,31 @@ Difficulty: Hard
addtimer(CALLBACK(src, .proc/devour, L), 2)
sleep(1)
-/obj/effect/overlay/temp/dragon_swoop/bubblegum
+/obj/effect/temp_visual/dragon_swoop/bubblegum
duration = 10
-/obj/effect/overlay/temp/bubblegum_hands
+/obj/effect/temp_visual/bubblegum_hands
icon = 'icons/effects/bubblegum.dmi'
duration = 9
-/obj/effect/overlay/temp/bubblegum_hands/rightthumb
+/obj/effect/temp_visual/bubblegum_hands/rightthumb
icon_state = "rightthumbgrab"
-/obj/effect/overlay/temp/bubblegum_hands/leftthumb
+/obj/effect/temp_visual/bubblegum_hands/leftthumb
icon_state = "leftthumbgrab"
-/obj/effect/overlay/temp/bubblegum_hands/rightpaw
+/obj/effect/temp_visual/bubblegum_hands/rightpaw
icon_state = "rightpawgrab"
layer = BELOW_MOB_LAYER
-/obj/effect/overlay/temp/bubblegum_hands/leftpaw
+/obj/effect/temp_visual/bubblegum_hands/leftpaw
icon_state = "leftpawgrab"
layer = BELOW_MOB_LAYER
-/obj/effect/overlay/temp/bubblegum_hands/rightsmack
+/obj/effect/temp_visual/bubblegum_hands/rightsmack
icon_state = "rightsmack"
-/obj/effect/overlay/temp/bubblegum_hands/leftsmack
+/obj/effect/temp_visual/bubblegum_hands/leftsmack
icon_state = "leftsmack"
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_warp()
@@ -316,7 +316,7 @@ Difficulty: Hard
if(!pools.len)
return FALSE
- var/obj/effect/overlay/temp/decoy/DA = new /obj/effect/overlay/temp/decoy(loc,src)
+ var/obj/effect/temp_visual/decoy/DA = new /obj/effect/temp_visual/decoy(loc,src)
DA.color = "#FF0000"
var/oldtransform = DA.transform
DA.transform = matrix()*2
@@ -358,7 +358,7 @@ Difficulty: Hard
new /obj/effect/decal/cleanable/blood/bubblegum(J)
for(var/i in 1 to range)
J = get_step(previousturf, targetdir)
- new /obj/effect/overlay/temp/dir_setting/bloodsplatter(previousturf, get_dir(previousturf, J))
+ new /obj/effect/temp_visual/dir_setting/bloodsplatter(previousturf, get_dir(previousturf, J))
playsound(previousturf,'sound/effects/splat.ogg', 100, 1, -1)
if(!J || !previousturf.atmos_adjacent_turfs || !previousturf.atmos_adjacent_turfs[J])
break
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index cd2f11f399e..f3cb534ff29 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -95,7 +95,7 @@ Difficulty: Very Hard
..()
internal = new/obj/item/device/gps/internal/colossus(src)
-/obj/effect/overlay/temp/at_shield
+/obj/effect/temp_visual/at_shield
name = "anti-toolbox field"
desc = "A shimmering forcefield protecting the colossus."
icon = 'icons/effects/effects.dmi'
@@ -105,14 +105,14 @@ Difficulty: Very Hard
duration = 8
var/target
-/obj/effect/overlay/temp/at_shield/Initialize(mapload, new_target)
+/obj/effect/temp_visual/at_shield/Initialize(mapload, new_target)
. = ..()
target = new_target
INVOKE_ASYNC(src, /atom/movable/proc/orbit, target, 0, FALSE, 0, 0, FALSE, TRUE)
/mob/living/simple_animal/hostile/megafauna/colossus/bullet_act(obj/item/projectile/P)
if(!stat)
- var/obj/effect/overlay/temp/at_shield/AT = new /obj/effect/overlay/temp/at_shield(src.loc, src)
+ var/obj/effect/temp_visual/at_shield/AT = new /obj/effect/temp_visual/at_shield(src.loc, src)
var/random_x = rand(-32, 32)
AT.pixel_x += random_x
@@ -581,7 +581,7 @@ Difficulty: Very Hard
if(..())
for(var/i in range(1, src))
if(isturf(i))
- new /obj/effect/overlay/temp/cult/sparks(i)
+ new /obj/effect/temp_visual/cult/sparks(i)
continue
if(ishuman(i))
var/mob/living/carbon/human/H = i
@@ -675,7 +675,7 @@ Difficulty: Very Hard
var/mob/living/L = target
if(L.stat != DEAD)
L.heal_overall_damage(heal_power, heal_power)
- new /obj/effect/overlay/temp/heal(get_turf(target), "#80F5FF")
+ new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF")
/mob/living/simple_animal/hostile/lightgeist/ghostize()
. = ..()
@@ -699,7 +699,7 @@ Difficulty: Very Hard
if(..())
var/list/L = list()
var/turf/T = get_step(src, dir)
- new /obj/effect/overlay/temp/emp/pulse(T)
+ new /obj/effect/temp_visual/emp/pulse(T)
for(var/i in T)
if(istype(i, /obj/item) && !is_type_in_typecache(i, banned_items_typecache))
var/obj/item/W = i
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
index 45139747fa0..1c1fc8fb9ee 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
@@ -124,7 +124,7 @@ Difficulty: Medium
target.visible_message("Fire rains from the sky!")
for(var/turf/turf in range(9,get_turf(target)))
if(prob(11))
- new /obj/effect/overlay/temp/target(turf)
+ new /obj/effect/temp_visual/target(turf)
/mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_walls()
playsound(get_turf(src),'sound/magic/Fireball.ogg', 200, 1)
@@ -179,7 +179,7 @@ Difficulty: Medium
negative = FALSE
else if(target.x == initial_x) //if their x is the same, pick a direction
negative = prob(50)
- var/obj/effect/overlay/temp/dragon_flight/F = new /obj/effect/overlay/temp/dragon_flight(loc, negative)
+ var/obj/effect/temp_visual/dragon_flight/F = new /obj/effect/temp_visual/dragon_flight(loc, negative)
negative = !negative //invert it for the swoop down later
@@ -208,7 +208,7 @@ Difficulty: Medium
if(L.stat == DEAD)
break //target is dead and we're on em, slam they
if(fire_rain)
- new /obj/effect/overlay/temp/target(loc, flame_hit)
+ new /obj/effect/temp_visual/target(loc, flame_hit)
forceMove(get_step(src, get_dir(src, target)))
if(loc == get_turf(target))
if(!fire_rain)
@@ -228,8 +228,8 @@ Difficulty: Medium
else
if(IsInRange(x, initial_x - DRAKE_SWOOP_DIRECTION_CHANGE_RANGE, initial_x - 1))
negative = TRUE
- new /obj/effect/overlay/temp/dragon_flight/end(loc, negative)
- new /obj/effect/overlay/temp/dragon_swoop(loc)
+ new /obj/effect/temp_visual/dragon_flight/end(loc, negative)
+ new /obj/effect/temp_visual/dragon_swoop(loc)
animate(src, transform = oldtransform, time = 5)
sleep(5)
swooping &= ~SWOOP_INVULNERABLE
@@ -271,7 +271,7 @@ Difficulty: Medium
invisibility = 100
-/obj/effect/overlay/temp/fireball
+/obj/effect/temp_visual/fireball
icon = 'icons/obj/wizard.dmi'
icon_state = "fireball"
name = "fireball"
@@ -281,28 +281,28 @@ Difficulty: Medium
duration = 9
pixel_z = DRAKE_SWOOP_HEIGHT
-/obj/effect/overlay/temp/fireball/Initialize()
+/obj/effect/temp_visual/fireball/Initialize()
. = ..()
animate(src, pixel_z = 0, time = duration)
-/obj/effect/overlay/temp/target
+/obj/effect/temp_visual/target
icon = 'icons/mob/actions.dmi'
icon_state = "sniper_zoom"
layer = BELOW_MOB_LAYER
light_range = 2
duration = 9
-/obj/effect/overlay/temp/target/ex_act()
+/obj/effect/temp_visual/target/ex_act()
return
-/obj/effect/overlay/temp/target/Initialize(mapload, list/flame_hit)
+/obj/effect/temp_visual/target/Initialize(mapload, list/flame_hit)
. = ..()
INVOKE_ASYNC(src, .proc/fall, flame_hit)
-/obj/effect/overlay/temp/target/proc/fall(list/flame_hit)
+/obj/effect/temp_visual/target/proc/fall(list/flame_hit)
var/turf/T = get_turf(src)
playsound(T,'sound/magic/Fireball.ogg', 80, 1)
- new /obj/effect/overlay/temp/fireball(T)
+ new /obj/effect/temp_visual/fireball(T)
sleep(duration)
if(ismineralturf(T))
var/turf/closed/mineral/M = T
@@ -320,7 +320,7 @@ Difficulty: Medium
else
L.adjustFireLoss(10) //if we've already hit them, do way less damage
-/obj/effect/overlay/temp/dragon_swoop
+/obj/effect/temp_visual/dragon_swoop
name = "certain death"
desc = "Don't just stand there, move!"
icon = 'icons/effects/96x96.dmi'
@@ -331,7 +331,7 @@ Difficulty: Medium
color = "#FF0000"
duration = 5
-/obj/effect/overlay/temp/dragon_flight
+/obj/effect/temp_visual/dragon_flight
icon = 'icons/mob/lavaland/dragon.dmi'
icon_state = "dragon"
layer = ABOVE_ALL_MOB_LAYER
@@ -339,11 +339,11 @@ Difficulty: Medium
duration = 10
randomdir = FALSE
-/obj/effect/overlay/temp/dragon_flight/Initialize(mapload, negative)
+/obj/effect/temp_visual/dragon_flight/Initialize(mapload, negative)
. = ..()
INVOKE_ASYNC(src, .proc/flight, negative)
-/obj/effect/overlay/temp/dragon_flight/proc/flight(negative)
+/obj/effect/temp_visual/dragon_flight/proc/flight(negative)
if(negative)
animate(src, pixel_x = -DRAKE_SWOOP_HEIGHT*0.10, pixel_z = DRAKE_SWOOP_HEIGHT*0.15, time = 3, easing = BOUNCE_EASING)
else
@@ -355,12 +355,12 @@ Difficulty: Medium
else
animate(src, pixel_x = DRAKE_SWOOP_HEIGHT, pixel_z = DRAKE_SWOOP_HEIGHT, time = 7)
-/obj/effect/overlay/temp/dragon_flight/end
+/obj/effect/temp_visual/dragon_flight/end
pixel_x = DRAKE_SWOOP_HEIGHT
pixel_z = DRAKE_SWOOP_HEIGHT
duration = 5
-/obj/effect/overlay/temp/dragon_flight/end/flight(negative)
+/obj/effect/temp_visual/dragon_flight/end/flight(negative)
if(negative)
pixel_x = -DRAKE_SWOOP_HEIGHT
animate(src, pixel_x = -16, pixel_z = 0, time = 5)
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 79ac234ab98..fc884abe199 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -150,7 +150,7 @@ Difficulty: Hard
var/prevloc = loc
. = ..()
if(!stat && .)
- var/obj/effect/overlay/temp/hierophant/squares/HS = new /obj/effect/overlay/temp/hierophant/squares(prevloc)
+ var/obj/effect/temp_visual/hierophant/squares/HS = new /obj/effect/temp_visual/hierophant/squares(prevloc)
HS.dir = dir
playsound(loc, 'sound/mecha/mechmove04.ogg', 150, 1, -4)
if(target)
@@ -250,7 +250,7 @@ Difficulty: Hard
pickedtarget = pick_n_take(targets)
if(!istype(pickedtarget) || pickedtarget.stat == DEAD)
pickedtarget = target
- var/obj/effect/overlay/temp/hierophant/chaser/C = new /obj/effect/overlay/temp/hierophant/chaser(loc, src, pickedtarget, chaser_speed, FALSE)
+ var/obj/effect/temp_visual/hierophant/chaser/C = new /obj/effect/temp_visual/hierophant/chaser(loc, src, pickedtarget, chaser_speed, FALSE)
C.moving = 3
C.moving_dir = pick_n_take(cardinal_copy)
sleep(10)
@@ -280,10 +280,10 @@ Difficulty: Hard
else
INVOKE_ASYNC(src, .proc/diagonal_blasts, target)
else if(chaser_cooldown < world.time) //if chasers are off cooldown, fire some!
- var/obj/effect/overlay/temp/hierophant/chaser/C = new /obj/effect/overlay/temp/hierophant/chaser(loc, src, target, chaser_speed, FALSE)
+ var/obj/effect/temp_visual/hierophant/chaser/C = new /obj/effect/temp_visual/hierophant/chaser(loc, src, target, chaser_speed, FALSE)
chaser_cooldown = world.time + initial(chaser_cooldown)
if((prob(anger_modifier) || target.Adjacent(src)) && target != src)
- var/obj/effect/overlay/temp/hierophant/chaser/OC = new /obj/effect/overlay/temp/hierophant/chaser(loc, src, target, max(1.5, 5 - anger_modifier * 0.07), FALSE)
+ var/obj/effect/temp_visual/hierophant/chaser/OC = new /obj/effect/temp_visual/hierophant/chaser(loc, src, target, max(1.5, 5 - anger_modifier * 0.07), FALSE)
OC.moving = 4
OC.moving_dir = pick(GLOB.cardinal - C.moving_dir)
else //just release a burst of power
@@ -293,10 +293,10 @@ Difficulty: Hard
var/turf/T = get_turf(victim)
if(!T)
return
- new /obj/effect/overlay/temp/hierophant/telegraph/diagonal(T, src)
+ new /obj/effect/temp_visual/hierophant/telegraph/diagonal(T, src)
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
- new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
+ new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE)
for(var/d in GLOB.diagonals)
INVOKE_ASYNC(src, .proc/blast_wall, T, d)
@@ -304,10 +304,10 @@ Difficulty: Hard
var/turf/T = get_turf(victim)
if(!T)
return
- new /obj/effect/overlay/temp/hierophant/telegraph/cardinal(T, src)
+ new /obj/effect/temp_visual/hierophant/telegraph/cardinal(T, src)
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
- new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
+ new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE)
for(var/d in GLOB.cardinal)
INVOKE_ASYNC(src, .proc/blast_wall, T, d)
@@ -315,10 +315,10 @@ Difficulty: Hard
var/turf/T = get_turf(victim)
if(!T)
return
- new /obj/effect/overlay/temp/hierophant/telegraph(T, src)
+ new /obj/effect/temp_visual/hierophant/telegraph(T, src)
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
- new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
+ new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE)
for(var/d in GLOB.alldirs)
INVOKE_ASYNC(src, .proc/blast_wall, T, d)
@@ -327,7 +327,7 @@ Difficulty: Hard
var/turf/previousturf = T
var/turf/J = get_step(previousturf, set_dir)
for(var/i in 1 to range)
- new /obj/effect/overlay/temp/hierophant/blast(J, src, FALSE)
+ new /obj/effect/temp_visual/hierophant/blast(J, src, FALSE)
previousturf = J
J = get_step(previousturf, set_dir)
@@ -342,8 +342,8 @@ Difficulty: Hard
INVOKE_ASYNC(src, .proc/arena_squares, T, d)
for(var/t in RANGE_TURFS(11, T))
if(t && get_dist(t, T) == 11)
- new /obj/effect/overlay/temp/hierophant/wall(t)
- new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE)
+ new /obj/effect/temp_visual/hierophant/wall(t)
+ new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE)
if(get_dist(src, T) >= 11) //hey you're out of range I need to get closer to you!
INVOKE_ASYNC(src, .proc/blink, T)
@@ -351,7 +351,7 @@ Difficulty: Hard
var/turf/previousturf = T
var/turf/J = get_step(previousturf, set_dir)
for(var/i in 1 to 10)
- var/obj/effect/overlay/temp/hierophant/squares/HS = new /obj/effect/overlay/temp/hierophant/squares(J)
+ var/obj/effect/temp_visual/hierophant/squares/HS = new /obj/effect/temp_visual/hierophant/squares(J)
HS.dir = set_dir
previousturf = J
J = get_step(previousturf, set_dir)
@@ -362,19 +362,19 @@ Difficulty: Hard
return
var/turf/T = get_turf(victim)
var/turf/source = get_turf(src)
- new /obj/effect/overlay/temp/hierophant/telegraph(T, src)
- new /obj/effect/overlay/temp/hierophant/telegraph(source, src)
+ new /obj/effect/temp_visual/hierophant/telegraph(T, src)
+ new /obj/effect/temp_visual/hierophant/telegraph(source, src)
playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1)
playsound(source,'sound/machines/AirlockOpen.ogg', 200, 1)
blinking = TRUE
sleep(2) //short delay before we start...
- new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, src)
- new /obj/effect/overlay/temp/hierophant/telegraph/teleport(source, src)
+ new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, src)
+ new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, src)
for(var/t in RANGE_TURFS(1, T))
- var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE)
+ var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE)
B.damage = 30
for(var/t in RANGE_TURFS(1, source))
- var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE)
+ var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE)
B.damage = 30
animate(src, alpha = 0, time = 2, easing = EASE_OUT) //fade out
sleep(1)
@@ -396,11 +396,11 @@ Difficulty: Hard
var/turf/T = get_turf(victim)
if(!T)
return
- new /obj/effect/overlay/temp/hierophant/telegraph(T, src)
+ new /obj/effect/temp_visual/hierophant/telegraph(T, src)
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
for(var/t in RANGE_TURFS(1, T))
- new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE)
+ new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE)
/mob/living/simple_animal/hostile/megafauna/hierophant/proc/burst(turf/original) //release a wave of blasts
playsound(original,'sound/machines/AirlockOpen.ogg', 200, 1)
@@ -413,7 +413,7 @@ Difficulty: Hard
if(dist > last_dist)
last_dist = dist
sleep(1 + min(burst_range - last_dist, 12) * 0.5) //gets faster as it gets further out
- new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
+ new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE)
/mob/living/simple_animal/hostile/megafauna/hierophant/AltClickOn(atom/A) //player control handler(don't give this to a player holy fuck)
if(!istype(A) || get_dist(A, src) <= 2)
@@ -421,29 +421,29 @@ Difficulty: Hard
blink(A)
//Hierophant overlays
-/obj/effect/overlay/temp/hierophant
+/obj/effect/temp_visual/hierophant
name = "vortex energy"
layer = BELOW_MOB_LAYER
var/mob/living/caster //who made this, anyway
-/obj/effect/overlay/temp/hierophant/Initialize(mapload, new_caster)
+/obj/effect/temp_visual/hierophant/Initialize(mapload, new_caster)
. = ..()
if(new_caster)
caster = new_caster
-/obj/effect/overlay/temp/hierophant/squares
+/obj/effect/temp_visual/hierophant/squares
icon_state = "hierophant_squares"
duration = 3
light_range = 1
randomdir = FALSE
-/obj/effect/overlay/temp/hierophant/squares/Initialize(mapload, new_caster)
+/obj/effect/temp_visual/hierophant/squares/Initialize(mapload, new_caster)
. = ..()
if(ismineralturf(loc))
var/turf/closed/mineral/M = loc
M.gets_drilled(caster)
-/obj/effect/overlay/temp/hierophant/wall //smoothing and pooling were not friends, but pooling is dead.
+/obj/effect/temp_visual/hierophant/wall //smoothing and pooling were not friends, but pooling is dead.
name = "vortex wall"
icon = 'icons/turf/walls/hierophant_wall_temp.dmi'
icon_state = "wall"
@@ -451,21 +451,21 @@ Difficulty: Hard
duration = 100
smooth = SMOOTH_TRUE
-/obj/effect/overlay/temp/hierophant/wall/Initialize(mapload, new_caster)
+/obj/effect/temp_visual/hierophant/wall/Initialize(mapload, new_caster)
. = ..()
queue_smooth_neighbors(src)
queue_smooth(src)
-/obj/effect/overlay/temp/hierophant/wall/Destroy()
+/obj/effect/temp_visual/hierophant/wall/Destroy()
queue_smooth_neighbors(src)
return ..()
-/obj/effect/overlay/temp/hierophant/wall/CanPass(atom/movable/mover, turf/target, height = 0)
+/obj/effect/temp_visual/hierophant/wall/CanPass(atom/movable/mover, turf/target, height = 0)
if(mover == caster)
return TRUE
return FALSE
-/obj/effect/overlay/temp/hierophant/chaser //a hierophant's chaser. follows target around, moving and producing a blast every speed deciseconds.
+/obj/effect/temp_visual/hierophant/chaser //a hierophant's chaser. follows target around, moving and producing a blast every speed deciseconds.
duration = 98
var/mob/living/target //what it's following
var/turf/targetturf //what turf the target is actually on
@@ -481,7 +481,7 @@ Difficulty: Hard
var/monster_damage_boost = TRUE
var/damage = 10
-/obj/effect/overlay/temp/hierophant/chaser/Initialize(mapload, new_caster, new_target, new_speed, is_friendly_fire)
+/obj/effect/temp_visual/hierophant/chaser/Initialize(mapload, new_caster, new_target, new_speed, is_friendly_fire)
. = ..()
target = new_target
friendly_fire_check = is_friendly_fire
@@ -489,14 +489,14 @@ Difficulty: Hard
speed = new_speed
addtimer(CALLBACK(src, .proc/seek_target), 1)
-/obj/effect/overlay/temp/hierophant/chaser/proc/get_target_dir()
+/obj/effect/temp_visual/hierophant/chaser/proc/get_target_dir()
. = get_cardinal_dir(src, targetturf)
if((. != previous_moving_dir && . == more_previouser_moving_dir) || . == 0) //we're alternating, recalculate
var/list/cardinal_copy = GLOB.cardinal.Copy()
cardinal_copy -= more_previouser_moving_dir
. = pick(cardinal_copy)
-/obj/effect/overlay/temp/hierophant/chaser/proc/seek_target()
+/obj/effect/temp_visual/hierophant/chaser/proc/seek_target()
if(!currently_seeking)
currently_seeking = TRUE
targetturf = get_turf(target)
@@ -523,33 +523,33 @@ Difficulty: Hard
moving--
sleep(speed)
targetturf = get_turf(target)
-/obj/effect/overlay/temp/hierophant/chaser/proc/make_blast()
- var/obj/effect/overlay/temp/hierophant/blast/B = new(loc, caster, friendly_fire_check)
+/obj/effect/temp_visual/hierophant/chaser/proc/make_blast()
+ var/obj/effect/temp_visual/hierophant/blast/B = new(loc, caster, friendly_fire_check)
B.damage = damage
B.monster_damage_boost = monster_damage_boost
-/obj/effect/overlay/temp/hierophant/telegraph
+/obj/effect/temp_visual/hierophant/telegraph
icon = 'icons/effects/96x96.dmi'
icon_state = "hierophant_telegraph"
pixel_x = -32
pixel_y = -32
duration = 3
-/obj/effect/overlay/temp/hierophant/telegraph/diagonal
+/obj/effect/temp_visual/hierophant/telegraph/diagonal
icon_state = "hierophant_telegraph_diagonal"
-/obj/effect/overlay/temp/hierophant/telegraph/cardinal
+/obj/effect/temp_visual/hierophant/telegraph/cardinal
icon_state = "hierophant_telegraph_cardinal"
-/obj/effect/overlay/temp/hierophant/telegraph/teleport
+/obj/effect/temp_visual/hierophant/telegraph/teleport
icon_state = "hierophant_telegraph_teleport"
duration = 9
-/obj/effect/overlay/temp/hierophant/telegraph/edge
+/obj/effect/temp_visual/hierophant/telegraph/edge
icon_state = "hierophant_telegraph_edge"
duration = 40
-/obj/effect/overlay/temp/hierophant/blast
+/obj/effect/temp_visual/hierophant/blast
icon_state = "hierophant_blast"
name = "vortex blast"
light_range = 1
@@ -561,7 +561,7 @@ Difficulty: Hard
var/friendly_fire_check = FALSE
var/bursting = FALSE //if we're bursting and need to hit anyone crossing us
-/obj/effect/overlay/temp/hierophant/blast/Initialize(mapload, new_caster, friendly_fire)
+/obj/effect/temp_visual/hierophant/blast/Initialize(mapload, new_caster, friendly_fire)
. = ..()
friendly_fire_check = friendly_fire
if(new_caster)
@@ -571,7 +571,7 @@ Difficulty: Hard
M.gets_drilled(caster)
INVOKE_ASYNC(src, .proc/blast)
-/obj/effect/overlay/temp/hierophant/blast/proc/blast()
+/obj/effect/temp_visual/hierophant/blast/proc/blast()
var/turf/T = get_turf(src)
if(!T)
return
@@ -582,12 +582,12 @@ Difficulty: Hard
sleep(1.3) //slightly forgiving; the burst animation is 1.5 deciseconds
bursting = FALSE //we no longer damage crossers
-/obj/effect/overlay/temp/hierophant/blast/Crossed(atom/movable/AM)
+/obj/effect/temp_visual/hierophant/blast/Crossed(atom/movable/AM)
..()
if(bursting)
do_damage(get_turf(src))
-/obj/effect/overlay/temp/hierophant/blast/proc/do_damage(turf/T)
+/obj/effect/temp_visual/hierophant/blast/proc/do_damage(turf/T)
for(var/mob/living/L in T.contents - hit_things) //find and damage mobs...
hit_things += L
if((friendly_fire_check && caster && caster.faction_check_mob(L)) || L.stat == DEAD)
@@ -634,7 +634,7 @@ Difficulty: Hard
INVOKE_ASYNC(H, /obj/item/weapon/hierophant_club.proc/prepare_icon_update)
if(do_after(user, 50, target = src))
playsound(src,'sound/magic/Blind.ogg', 200, 1, -4)
- new /obj/effect/overlay/temp/hierophant/telegraph/teleport(get_turf(src), user)
+ new /obj/effect/temp_visual/hierophant/telegraph/teleport(get_turf(src), user)
to_chat(user, "You collect [src], reattaching it to the club!")
H.beacon = null
user.update_action_buttons_icon()
diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm
index 3f4267e164b..b85151ad97b 100644
--- a/code/modules/mob/living/simple_animal/hostile/stickman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/stickman.dm
@@ -52,7 +52,7 @@
/mob/living/simple_animal/hostile/stickman/Initialize(mapload, var/wizard_summoned)
..()
- new /obj/effect/overlay/temp/paper_scatter(src)
+ new /obj/effect/temp_visual/paper_scatter(src)
summoned_by_wizard = wizard_summoned
/mob/living/simple_animal/hostile/stickman/death()
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 831058a284f..5cb0d3b113a 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -249,7 +249,7 @@
/mob/living/simple_animal/gib_animation()
if(icon_gib)
- new /obj/effect/overlay/temp/gib_animation/animal(loc, icon_gib)
+ new /obj/effect/temp_visual/gib_animation/animal(loc, icon_gib)
/mob/living/simple_animal/say_mod(input, message_mode)
if(speak_emote && speak_emote.len)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index b1421f3b07a..78118fcba46 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -292,14 +292,14 @@
if(!src || !isturf(src.loc) || !(A in view(src.loc)))
return 0
- if(istype(A, /obj/effect/overlay/temp/point))
+ if(istype(A, /obj/effect/temp_visual/point))
return 0
var/tile = get_turf(A)
if (!tile)
return 0
- new /obj/effect/overlay/temp/point(A,invisibility)
+ new /obj/effect/temp_visual/point(A,invisibility)
return 1
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index c8ed520c28d..c8dc6456742 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -242,12 +242,12 @@
L.loc = locate(locx,locy,mobloc.z)
var/limit = 2//For only two trailing shadows.
for(var/turf/T in getline(mobloc, L.loc))
- new /obj/effect/overlay/temp/dir_setting/ninja/shadow(T, L.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja/shadow(T, L.dir)
limit--
if(limit<=0)
break
else
- new /obj/effect/overlay/temp/dir_setting/ninja/shadow(mobloc, L.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir)
L.loc = get_step(L, direct)
L.setDir(direct)
if(3) //Incorporeal move, but blocked by holy-watered tiles and salt piles.
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 6545fcb505c..f91a6cd5538 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -36,7 +36,7 @@
cut_overlays()
invisibility = INVISIBILITY_MAXIMUM
- new /obj/effect/overlay/temp/monkeyify(loc)
+ new /obj/effect/temp_visual/monkeyify(loc)
sleep(22)
var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey( loc )
@@ -186,7 +186,7 @@
icon = null
cut_overlays()
invisibility = INVISIBILITY_MAXIMUM
- new /obj/effect/overlay/temp/monkeyify/humanify(loc)
+ new /obj/effect/temp_visual/monkeyify/humanify(loc)
sleep(22)
var/mob/living/carbon/human/O = new( loc )
for(var/obj/item/C in O.loc)
diff --git a/code/modules/ninja/admin_ninja_verbs.dm b/code/modules/ninja/admin_ninja_verbs.dm
deleted file mode 100644
index 7338d9bb0be..00000000000
--- a/code/modules/ninja/admin_ninja_verbs.dm
+++ /dev/null
@@ -1,64 +0,0 @@
-
-/*
-
-Contents:
-- Admin procs that make ninjas
-
-*/
-
-
-//ADMIN CREATE NINJA (From Player)
-/client/proc/cmd_admin_ninjafy(mob/living/carbon/human/H in GLOB.player_list)
- set category = null
- set name = "Make Space Ninja"
-
- if (!SSticker.mode)
- alert("Wait until the game starts")
- return
-
- if(!istype(H))
- return
-
- if(alert(src, "You sure?", "Confirm", "Yes", "No") != "Yes")
- return
-
- log_admin("[key_name(src)] turned [H.key] into a Space Ninja.")
- H.mind = create_ninja_mind(H.key)
- H.mind_initialize()
- H.equip_space_ninja(1)
- if(istype(H.wear_suit, /obj/item/clothing/suit/space/space_ninja))
- H.wear_suit:randomize_param()
- spawn(0)
- H.wear_suit:ninitialize(10,H)
- SSticker.mode.update_ninja_icons_added(H)
-
-
-//ADMIN CREATE NINJA (From Ghost)
-/client/proc/send_space_ninja()
- set category = "Fun"
- set name = "Spawn Space Ninja"
- set desc = "Spawns a space ninja for when you need a teenager with attitude."
- set popup_menu = 0
-
- if(!holder)
- to_chat(src, "Only administrators may use this command.")
- return
- if(!SSticker.mode)
- alert("The game hasn't started yet!")
- return
- if(alert("Are you sure you want to send in a space ninja?",,"Yes","No")=="No")
- return
-
- var/client/C = input("Pick character to spawn as the Space Ninja", "Key", "") as null|anything in GLOB.clients
- if(!C)
- return
-
- // passing FALSE means the event doesn't start immediately
- var/datum/round_event/ghost_role/ninja/E = new(FALSE)
- E.priority_candidates += C
- E.processing = TRUE
-
- message_admins("[key_name_admin(key)] has spawned [key_name_admin(C.key)] as a Space Ninja.")
- log_admin("[key] used Spawn Space Ninja.")
-
- return
diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm
index e83f3a17e2e..8ff36523676 100644
--- a/code/modules/ninja/ninja_event.dm
+++ b/code/modules/ninja/ninja_event.dm
@@ -63,98 +63,21 @@ Contents:
Mind.active = 1
//generate objectives - You'll generally get 6 objectives (Ninja is meant to be hardmode!)
- var/list/possible_targets = list()
- for(var/datum/mind/M in SSticker.minds)
- if(M.current && M.current.stat != DEAD)
- if(ishuman(M.current))
- if(M.special_role)
- possible_targets[M] = 0 //bad-guy
- else if(M.assigned_role in GLOB.command_positions)
- possible_targets[M] = 1 //good-guy
- var/list/objectives = list(1,2,3,4)
- while(give_objectives && Mind.objectives.len < 6)
- switch(pick_n_take(objectives))
- if(1) //research
- var/datum/objective/download/O = new /datum/objective/download()
- O.owner = Mind
- O.gen_amount_goal()
- Mind.objectives += O
-
- if(2) //steal
- var/datum/objective/steal/special/O = new /datum/objective/steal/special()
- O.owner = Mind
- Mind.objectives += O
-
- if(3) //protect/kill
- if(!possible_targets.len) continue
- var/index = rand(1,possible_targets.len)
- var/datum/mind/M = possible_targets[index]
- var/is_bad_guy = possible_targets[M]
- possible_targets.Cut(index,index+1)
-
- if(is_bad_guy ^ helping_station) //kill (good-ninja + bad-guy or bad-ninja + good-guy)
- var/datum/objective/assassinate/O = new /datum/objective/assassinate()
- O.owner = Mind
- O.target = M
- O.explanation_text = "Slay \the [M.current.real_name], the [M.assigned_role]."
- Mind.objectives += O
- else //protect
- var/datum/objective/protect/O = new /datum/objective/protect()
- O.owner = Mind
- O.target = M
- O.explanation_text = "Protect \the [M.current.real_name], the [M.assigned_role], from harm."
- Mind.objectives += O
- if(4) //debrain/capture
- if(!possible_targets.len) continue
- var/selected = rand(1,possible_targets.len)
- var/datum/mind/M = possible_targets[selected]
- var/is_bad_guy = possible_targets[M]
- possible_targets.Cut(selected,selected+1)
-
- if(is_bad_guy ^ helping_station) //debrain (good-ninja + bad-guy or bad-ninja + good-guy)
- var/datum/objective/debrain/O = new /datum/objective/debrain()
- O.owner = Mind
- O.target = M
- O.explanation_text = "Steal the brain of [M.current.real_name]."
- Mind.objectives += O
- else //capture
- var/datum/objective/capture/O = new /datum/objective/capture()
- O.owner = Mind
- O.gen_amount_goal()
- Mind.objectives += O
- else
- break
-
- //Add a survival objective since it's usually broad enough for any round type.
- if(give_objectives)
- var/datum/objective/O = new /datum/objective/survive()
- O.owner = Mind
- Mind.objectives += O
-
- //add some RP-fluff
- Mind.store_memory("I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!")
- Mind.store_memory("Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!")
- Mind.store_memory("Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.")
//spawn the ninja and assign the candidate
var/mob/living/carbon/human/Ninja = create_space_ninja(spawn_loc)
Mind.transfer_to(Ninja)
-
- //initialise equipment
- if(istype(Ninja.wear_suit,/obj/item/clothing/suit/space/space_ninja))
- //Should be true but we have to check these things.
- var/obj/item/clothing/suit/space/space_ninja/N = Ninja.wear_suit
- N.randomize_param()
+ var/datum/antagonist/ninja/ninjadatum = add_ninja(Ninja)
+ ninjadatum.equip_space_ninja()
Ninja.internal = Ninja.s_store
Ninja.update_internals_hud_icon(1)
if(Ninja.mind != Mind) //something has gone wrong!
throw EXCEPTION("Ninja created with incorrect mind")
- return
- Ninja << sound('sound/effects/ninja_greeting.ogg') //so ninja you probably wouldn't even know if you were made one
+
SSticker.mode.update_ninja_icons_added(Ninja)
spawned_mobs += Ninja
message_admins("[key_name_admin(Ninja)] has been made into a ninja by an event.")
@@ -171,7 +94,6 @@ Contents:
A.real_name = "[pick(GLOB.ninja_titles)] [pick(GLOB.ninja_names)]"
A.copy_to(new_ninja)
new_ninja.dna.update_dna_identity()
- new_ninja.equip_space_ninja()
return new_ninja
@@ -183,38 +105,6 @@ Contents:
return Mind
-/mob/living/carbon/human/proc/equip_space_ninja(safety=0)//Safety in case you need to unequip stuff for existing characters.
- if(safety)
- qdel(w_uniform)
- qdel(wear_suit)
- qdel(wear_mask)
- qdel(head)
- qdel(shoes)
- qdel(gloves)
-
- var/obj/item/device/radio/R = new /obj/item/device/radio/headset(src)
- var/obj/item/clothing/suit/space/space_ninja/theSuit = new(src)
- var/obj/item/weapon/katana/energy/EK = new(src)
- theSuit.energyKatana = EK
-
- equip_to_slot_or_del(R, slot_ears)
- equip_to_slot_or_del(new /obj/item/clothing/under/color/black(src), slot_w_uniform)
- equip_to_slot_or_del(new /obj/item/clothing/shoes/space_ninja(src), slot_shoes)
- equip_to_slot_or_del(theSuit, slot_wear_suit)
- equip_to_slot_or_del(new /obj/item/clothing/gloves/space_ninja(src), slot_gloves)
- equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/space_ninja(src), slot_head)
- equip_to_slot_or_del(new /obj/item/clothing/mask/gas/space_ninja(src), slot_wear_mask)
- equip_to_slot_or_del(new /obj/item/clothing/glasses/night(src), slot_glasses)
- equip_to_slot_or_del(EK, slot_belt)
- equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_r_store)
- equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/x4(src), slot_l_store)
- equip_to_slot_or_del(new /obj/item/weapon/tank/internals/emergency_oxygen(src), slot_s_store)
- equip_to_slot_or_del(new /obj/item/weapon/tank/jetpack/carbondioxide(src), slot_back)
-
- var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(src)
- E.implant(src)
- return 1
-
/datum/game_mode/proc/update_ninja_icons_added(var/mob/living/carbon/human/ninja)
var/datum/atom_hud/antag/ninjahud = GLOB.huds[ANTAG_HUD_NINJA]
ninjahud.join_hud(ninja)
diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm
index d26e4cbd363..e9a350eae31 100644
--- a/code/modules/ninja/suit/gloves.dm
+++ b/code/modules/ninja/suit/gloves.dm
@@ -58,30 +58,23 @@
A.add_fingerprint(H)
draining = 1
- var/drained = A.ninjadrain_act(suit,H,src)
+ . = A.ninjadrain_act(suit,H,src)
draining = 0
- if(isnum(drained)) //Numerical values of drained handle their feedback here, Alpha values handle it themselves (Research hacking)
- if(drained)
- to_chat(H, "Gained [drained] energy from \the [A].")
+ if(isnum(.)) //Numerical values of drained handle their feedback here, Alpha values handle it themselves (Research hacking)
+ if(.)
+ to_chat(H, "Gained [.] energy from \the [A].")
else
to_chat(H, "\The [A] has run dry of power, you must find another source!")
else
- drained = 0 //as to not cancel attack_hand()
-
- return drained
+ . = 0 //as to not cancel attack_hand()
-/obj/item/clothing/gloves/space_ninja/proc/toggled()
- set name = "Toggle Interaction"
- set desc = "Toggles special interaction on or off."
- set category = "Ninja Equip"
-
+/obj/item/clothing/gloves/space_ninja/proc/toggledrain()
var/mob/living/carbon/human/U = loc
to_chat(U, "You [candrain?"disable":"enable"] special interaction.")
candrain=!candrain
-
/obj/item/clothing/gloves/space_ninja/examine(mob/user)
..()
if(flags & NODROP)
diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
index 1f5fdc6ea05..619ae359d35 100644
--- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
@@ -72,7 +72,7 @@ It is possible to destroy the net by the occupant or someone else.
M.dropItemToGround(W)
playsound(M.loc, 'sound/effects/sparks4.ogg', 50, 1)
- new /obj/effect/overlay/temp/dir_setting/ninja/phase/out(get_turf(M), M.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja/phase/out(get_turf(M), M.dir)
visible_message("[M] suddenly vanishes!")
M.forceMove(pick(GLOB.holdingfacility)) //Throw mob in to the holding facility.
@@ -86,7 +86,7 @@ It is possible to destroy the net by the occupant or someone else.
spark_system.start()
playsound(M.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(M.loc, 'sound/effects/sparks2.ogg', 50, 1)
- new /obj/effect/overlay/temp/dir_setting/ninja/phase(get_turf(M), M.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja/phase(get_turf(M), M.dir)
qdel(src)
else//And they are free.
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm
index 30085fdac54..e1c378f9f3d 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm
@@ -1,12 +1,6 @@
-
-
//Wakes the user so they are able to do their thing. Also injects a decent dose of radium.
//Movement impairing would indicate drugs and the like.
/obj/item/clothing/suit/space/space_ninja/proc/ninjaboost()
- set name = "Adrenaline Boost"
- set desc = "Inject a secret chemical that will counteract all movement-impairing effect."
- set category = "Ninja Ability"
- set popup_menu = 0
if(!ninjacost(0,N_ADRENALINE))//Have to make sure stat is not counted for this ability.
var/mob/living/carbon/human/H = affecting
@@ -25,4 +19,3 @@
a_boost--
to_chat(H, "There are [a_boost] adrenaline boosts remaining.")
s_coold = 3
- return
\ No newline at end of file
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_cost_check.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_cost_check.dm
index 977279082e3..1d728084b34 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_cost_check.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_cost_check.dm
@@ -26,4 +26,4 @@
if(!a_boost)
to_chat(H, "You do not have any more adrenaline boosters.")
return 1
- return (s_coold)//Returns the value of the variable which counts down to zero.
\ No newline at end of file
+ return (s_coold)//Returns the value of the variable which counts down to zero.
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_empulse.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_empulse.dm
index 8cfc6b89370..48e3cf69a97 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_empulse.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_empulse.dm
@@ -2,14 +2,9 @@
//Disables nearby tech equipment.
/obj/item/clothing/suit/space/space_ninja/proc/ninjapulse()
- set name = "EM Burst (25E)"
- set desc = "Disable any nearby technology with a electro-magnetic pulse."
- set category = "Ninja Ability"
- set popup_menu = 0
if(!ninjacost(250,N_STEALTH_CANCEL))
var/mob/living/carbon/human/H = affecting
playsound(H.loc, 'sound/effects/EMPulse.ogg', 60, 2)
empulse(H, 4, 6) //Procs sure are nice. Slightly weaker than wizard's disable tch.
s_coold = 2
- return
\ No newline at end of file
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
index 481c4d46b5f..18682e87eb9 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
@@ -1,10 +1,6 @@
//Allows the ninja to kidnap people
/obj/item/clothing/suit/space/space_ninja/proc/ninjanet(mob/living/carbon/C in oview())//Only living carbon mobs.
- set name = "Energy Net (20E)"
- set desc = "Captures a fallen opponent in a net of energy. Will teleport them to a holding facility after 30 seconds."
- set category = null
- set src = usr.contents
if(!ninjacost(200,N_STEALTH_CANCEL) && iscarbon(C))
var/mob/living/carbon/human/H = affecting
@@ -26,4 +22,3 @@
to_chat(H, "[C.p_they(TRUE)] are already trapped inside an energy net!")
else
to_chat(H, "[C.p_they(TRUE)] will bring no honor to your Clan!")
- return
\ No newline at end of file
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm
index 3596976e9b0..3c19162048c 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm
@@ -2,10 +2,6 @@
//Smoke bomb
/obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke()
- set name = "Smoke Bomb"
- set desc = "Blind your enemies momentarily with a well-placed smoke bomb."
- set category = "Ninja Ability"
- set popup_menu = 0//Will not see it when right clicking.
if(!ninjacost(0,N_SMOKE_BOMB))
var/mob/living/carbon/human/H = affecting
@@ -16,4 +12,3 @@
s_bombs--
to_chat(H, "There are [s_bombs] smoke bombs remaining.")
s_coold = 1
- return
\ No newline at end of file
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm
index bed0eafd599..336b061a6f2 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm
@@ -2,11 +2,6 @@
//Creates a throwing star
/obj/item/clothing/suit/space/space_ninja/proc/ninjastar()
- set name = "Create Throwing Stars (1E)"
- set desc = "Creates some throwing stars"
- set category = "Ninja Ability"
- set popup_menu = 0
-
if(!ninjacost(10))
var/mob/living/carbon/human/H = affecting
var/obj/item/weapon/throwing_star/ninja/N = new(H)
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm
index 12e80d5c098..8103fa24152 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm
@@ -21,7 +21,6 @@ Contents:
animate(U, alpha = 50,time = 15)
U.visible_message("[U.name] vanishes into thin air!", \
"You are now mostly invisible to normal detection.")
- return
/obj/item/clothing/suit/space/space_ninja/proc/cancel_stealth()
@@ -38,12 +37,7 @@ Contents:
/obj/item/clothing/suit/space/space_ninja/proc/stealth()
- set name = "Toggle Stealth"
- set desc = "Utilize the internal CLOAK-tech device to activate or deactivate stealth-camo."
- set category = "Ninja Equip"
-
if(!s_busy)
toggle_stealth()
else
to_chat(affecting, "Stealth does not appear to work!")
-
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm
index 4183e83fbfc..73c7082eec6 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm
@@ -1,10 +1,5 @@
/obj/item/clothing/suit/space/space_ninja/proc/ninja_sword_recall()
- set name = "Recall Energy Katana (Variable Cost)"
- set desc = "Teleports the Energy Katana linked to this suit to its wearer, cost based on distance."
- set category = "Ninja Ability"
- set popup_menu = 0
-
var/mob/living/carbon/human/H = affecting
var/cost = 0
@@ -42,4 +37,3 @@
else //Else just TP it to us.
energyKatana.returnToOwner(H,1)
-
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm
index 339b0b2857f..74dcec12ce8 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm
@@ -16,16 +16,10 @@ Contents:
var/mob/living/victim = H.pulling
if(!victim.anchored)
victim.forceMove(locate(T.x+rand(-1,1),T.y+rand(-1,1),T.z))
- return
//Jaunt
/obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt()
- set name = "Phase Jaunt (10E)"
- set desc = "Utilizes the internal VOID-shift device to rapidly transit in direction facing."
- set category = "Ninja Ability"
- set popup_menu = 0
-
if(!ninjacost(100,N_STEALTH_CANCEL))
var/mob/living/carbon/human/H = affecting
var/turf/destination = get_teleport_loc(H.loc,H,9,1,3,1,0,1)
@@ -33,7 +27,7 @@ Contents:
if(destination && isturf(mobloc))//So we don't teleport out of containers
playsound(H.loc, "sparks", 50, 1)
- new /obj/effect/overlay/temp/dir_setting/ninja/phase/out(get_turf(H), H.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja/phase/out(get_turf(H), H.dir)
handle_teleport_grab(destination, H)
H.loc = destination
@@ -41,13 +35,12 @@ Contents:
spark_system.start()
playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(H.loc, "sparks", 50, 1)
- new /obj/effect/overlay/temp/dir_setting/ninja/phase(get_turf(H), H.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja/phase(get_turf(H), H.dir)
destination.phase_damage_creatures(20,H)//Paralyse and damage mobs and mechas on the turf
s_coold = 1
else
to_chat(H, "The VOID-shift device is malfunctioning, teleportation failed.")
- return
//Right-Click teleport: It's basically admin "jump to turf"
@@ -62,7 +55,7 @@ Contents:
var/turf/mobloc = get_turf(H.loc)//To make sure that certain things work properly below.
if(!T.density && isturf(mobloc))
playsound(H.loc, "sparks", 50, 1)
- new /obj/effect/overlay/temp/dir_setting/ninja/phase/out(get_turf(H), H.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja/phase/out(get_turf(H), H.dir)
handle_teleport_grab(T, H)
H.forceMove(T)
@@ -70,12 +63,9 @@ Contents:
spark_system.start()
playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(H.loc, "sparks", 50, 1)
- new /obj/effect/overlay/temp/dir_setting/ninja/phase(get_turf(H), H.dir)
+ new /obj/effect/temp_visual/dir_setting/ninja/phase(get_turf(H), H.dir)
T.phase_damage_creatures(20,H)//Paralyse and damage mobs and mechas on the turf
s_coold = 1
else
to_chat(H, "You cannot teleport into solid walls or from solid matter")
- return
-
-
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index 827047c93ea..d5811e32c93 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -22,6 +22,8 @@ Contents:
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 100, acid = 100)
strip_delay = 12
+ actions_types = list(/datum/action/item_action/initialize_ninja_suit, /datum/action/item_action/ninjajaunt, /datum/action/item_action/ninjasmoke, /datum/action/item_action/ninjaboost, /datum/action/item_action/ninjapulse, /datum/action/item_action/ninjastar, /datum/action/item_action/ninjanet, /datum/action/item_action/ninja_sword_recall, /datum/action/item_action/ninja_stealth, /datum/action/item_action/toggle_glove)
+
//Important parts of the suit.
var/mob/living/carbon/human/affecting = null
var/obj/item/weapon/stock_parts/cell/cell
@@ -57,7 +59,6 @@ Contents:
/obj/item/clothing/suit/space/space_ninja/New()
..()
- verbs += /obj/item/clothing/suit/space/space_ninja/proc/init//suit initialize verb
//Spark Init
spark_system = new()
@@ -109,40 +110,38 @@ Contents:
//This proc prevents the suit from being taken off.
-/obj/item/clothing/suit/space/space_ninja/proc/lock_suit(mob/living/carbon/human/H, checkIcons = 0)
+/obj/item/clothing/suit/space/space_ninja/proc/lock_suit(mob/living/carbon/human/H)
if(!istype(H))
return 0
- if(checkIcons)
- icon_state = H.gender==FEMALE ? "s-ninjanf" : "s-ninjan"
- H.gloves.icon_state = "s-ninjan"
- H.gloves.item_state = "s-ninjan"
- else
- if(H.mind.special_role!="Space Ninja")
- to_chat(H, "\red fÄTaL ÈÈRRoR: 382200-*#00CÖDE RED\nUNAUHORIZED USÈ DETÈCeD\nCoMMÈNCING SUB-R0UIN3 13...\nTÈRMInATING U-U-USÈR...")
- H.gib()
- return 0
- if(!istype(H.head, /obj/item/clothing/head/helmet/space/space_ninja))
- to_chat(H, "ERROR: 100113 UNABLE TO LOCATE HEAD GEAR\nABORTING...")
- return 0
- if(!istype(H.shoes, /obj/item/clothing/shoes/space_ninja))
- to_chat(H, "ERROR: 122011 UNABLE TO LOCATE FOOT GEAR\nABORTING...")
- return 0
- if(!istype(H.gloves, /obj/item/clothing/gloves/space_ninja))
- to_chat(H, "ERROR: 110223 UNABLE TO LOCATE HAND GEAR\nABORTING...")
- return 0
+ if(!is_ninja(H))
+ to_chat(H, "\red fÄTaL ÈÈRRoR: 382200-*#00CÖDE RED\nUNAUHORIZED USÈ DETÈCeD\nCoMMÈNCING SUB-R0UIN3 13...\nTÈRMInATING U-U-USÈR...")
+ H.gib()
+ return FALSE
+ if(!istype(H.head, /obj/item/clothing/head/helmet/space/space_ninja))
+ to_chat(H, "ERROR: 100113 UNABLE TO LOCATE HEAD GEAR\nABORTING...")
+ return FALSE
+ if(!istype(H.shoes, /obj/item/clothing/shoes/space_ninja))
+ to_chat(H, "ERROR: 122011 UNABLE TO LOCATE FOOT GEAR\nABORTING...")
+ return FALSE
+ if(!istype(H.gloves, /obj/item/clothing/gloves/space_ninja))
+ to_chat(H, "ERROR: 110223 UNABLE TO LOCATE HAND GEAR\nABORTING...")
+ return FALSE
+ affecting = H
+ flags |= NODROP //colons make me go all |=
+ slowdown = FALSE
+ n_hood = H.head
+ n_hood.flags |= NODROP
+ n_shoes = H.shoes
+ n_shoes.flags |= NODROP
+ n_shoes.slowdown--
+ n_gloves = H.gloves
+ n_gloves.flags |= NODROP
+ return TRUE
- affecting = H
- flags |= NODROP //colons make me go all |=
- slowdown = 0
- n_hood = H.head
- n_hood.flags |= NODROP
- n_shoes = H.shoes
- n_shoes.flags |= NODROP
- n_shoes.slowdown--
- n_gloves = H.gloves
- n_gloves.flags |= NODROP
-
- return 1
+/obj/item/clothing/suit/space/space_ninja/proc/lockIcons(mob/living/carbon/human/H)
+ icon_state = H.gender==FEMALE ? "s-ninjanf" : "s-ninjan"
+ H.gloves.icon_state = "s-ninjan"
+ H.gloves.item_state = "s-ninjan"
//This proc allows the suit to be taken off.
@@ -172,3 +171,39 @@ Contents:
to_chat(user, "The CLOAK-tech device is [s_active?"active":"inactive"].")
to_chat(user, "There are [s_bombs] smoke bomb\s remaining.")
to_chat(user, "There are [a_boost] adrenaline booster\s remaining.")
+
+/obj/item/clothing/suit/space/space_ninja/ui_action_click(mob/user, action)
+ if(istype(action, /datum/action/item_action/initialize_ninja_suit))
+ toggle_on_off()
+ return TRUE
+ if(!s_initialized)
+ to_chat(user, "ERROR: suit offline. Please activate suit.")
+ return FALSE
+ if(istype(action, /datum/action/item_action/ninjajaunt))
+ ninjajaunt()
+ return TRUE
+ if(istype(action, /datum/action/item_action/ninjasmoke))
+ ninjasmoke()
+ return TRUE
+ if(istype(action, /datum/action/item_action/ninjaboost))
+ ninjaboost()
+ return TRUE
+ if(istype(action, /datum/action/item_action/ninjapulse))
+ ninjapulse()
+ return TRUE
+ if(istype(action, /datum/action/item_action/ninjastar))
+ ninjastar()
+ return TRUE
+ if(istype(action, /datum/action/item_action/ninjanet))
+ ninjanet()
+ return TRUE
+ if(istype(action, /datum/action/item_action/ninja_sword_recall))
+ ninja_sword_recall()
+ return TRUE
+ if(istype(action, /datum/action/item_action/ninja_stealth))
+ stealth()
+ return TRUE
+ if(istype(action, /datum/action/item_action/toggle_glove))
+ n_gloves.toggledrain()
+ return TRUE
+ return FALSE
diff --git a/code/modules/ninja/suit/suit_initialisation.dm b/code/modules/ninja/suit/suit_initialisation.dm
index 6851eb9b483..f26912df24d 100644
--- a/code/modules/ninja/suit/suit_initialisation.dm
+++ b/code/modules/ninja/suit/suit_initialisation.dm
@@ -1,102 +1,98 @@
-
-//Verbs link to procs because verb-like procs have a bug which prevents their use if the arguments are not readily referenced.
-//^ Old coder words may be false these days, Not taking the risk for now.
-
-/obj/item/clothing/suit/space/space_ninja/proc/init()
- set name = "Initialize Suit"
- set desc = "Initializes the suit for field operation."
- set category = "Ninja Equip"
-
- ninitialize()
-
-/obj/item/clothing/suit/space/space_ninja/proc/deinit()
- set name = "De-Initialize Suit"
- set desc = "Begins procedure to remove the suit."
- set category = "Ninja Equip"
-
- if(!s_busy)
+/obj/item/clothing/suit/space/space_ninja/proc/toggle_on_off()
+ if(s_busy)
+ to_chat(loc, "ERROR: You cannot use this function at this time.")
+ return FALSE
+ if(s_initialized)
deinitialize()
else
- to_chat(affecting, "The function did not trigger!")
-
+ ninitialize()
+ . = TRUE
/obj/item/clothing/suit/space/space_ninja/proc/ninitialize(delay = s_delay, mob/living/carbon/human/U = loc)
- if(U.mind && U.mind.assigned_role==U.mind.special_role && !s_initialized && !s_busy)//Shouldn't be busy... but anything is possible I guess.
- s_busy = 1
- for(var/i,i<7,i++)
- switch(i)
- if(0)
- to_chat(U, "Now initializing...")
- if(1)
- if(!lock_suit(U))//To lock the suit onto wearer.
- break
- to_chat(U, "Securing external locking mechanism...\nNeural-net established.")
- if(2)
- to_chat(U, "Extending neural-net interface...\nNow monitoring brain wave pattern...")
- if(3)
- if(U.stat==2||U.health<=0)
- to_chat(U, "FÄAL �Rr�R: 344--93#�&&21 BR��N |/|/aV� PATT$RN RED\nA-A-aB�rT�NG...")
- unlock_suit()
- break
- lock_suit(U,1)//Check for icons.
- U.regenerate_icons()
- to_chat(U, "Linking neural-net interface...\nPattern\green GREEN, continuing operation.")
- if(4)
- to_chat(U, "VOID-shift device status: ONLINE.\nCLOAK-tech device status: ONLINE.")
- if(5)
- to_chat(U, "Primary system status: ONLINE.\nBackup system status: ONLINE.\nCurrent energy capacity: [cell.charge].")
- if(6)
- to_chat(U, "All systems operational. Welcome to SpiderOS, [U.real_name].")
- grant_ninja_verbs()
- grant_equip_verbs()
- ntick()
- sleep(delay)
- s_busy = 0
- else
- if(!U.mind||U.mind.assigned_role!=U.mind.special_role)//Your run of the mill persons shouldn't know what it is. Or how to turn it on.
- to_chat(U, "You do not understand how this suit functions. Where the heck did it even come from?")
- else if(s_initialized)
- to_chat(U, "The suit is already functioning. Please report this bug.")
- else
- to_chat(U, "ERROR: You cannot use this function at this time.")
- return
+ if(!U.mind)
+ return //Not sure how this could happen.
+ if(!is_ninja(U))
+ to_chat(U, "You do not understand how this suit functions. Where the heck did it even come from?")
+ return
+ s_busy = TRUE
+ to_chat(U, "Now initializing...")
+ addtimer(CALLBACK(src, .proc/ninitialize_two, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_two(delay, mob/living/carbon/human/U)
+ if(!lock_suit(U))//To lock the suit onto wearer.
+ s_busy = FALSE
+ return
+ to_chat(U, "Securing external locking mechanism...\nNeural-net established.")
+ addtimer(CALLBACK(src, .proc/ninitialize_three, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_three(delay, mob/living/carbon/human/U)
+ to_chat(U, "Extending neural-net interface...\nNow monitoring brain wave pattern...")
+ addtimer(CALLBACK(src, .proc/ninitialize_four, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_four(delay, mob/living/carbon/human/U)
+ if(U.stat==2||U.health<=0)
+ to_chat(U, "FÄAL �Rr�R: 344--93#�&&21 BR��N |/|/aV� PATT$RN RED\nA-A-aB�rT�NG...")
+ unlock_suit()
+ return
+ lockIcons(U)//Check for icons.
+ U.regenerate_icons()
+ to_chat(U, "Linking neural-net interface...\nPattern\green GREEN, continuing operation.")
+ addtimer(CALLBACK(src, .proc/ninitialize_five, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_five(delay, mob/living/carbon/human/U)
+ to_chat(U, "VOID-shift device status: ONLINE.\nCLOAK-tech device status: ONLINE.")
+ addtimer(CALLBACK(src, .proc/ninitialize_six, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_six(delay, mob/living/carbon/human/U)
+ to_chat(U, "Primary system status: ONLINE.\nBackup system status: ONLINE.\nCurrent energy capacity: [cell.charge].")
+ addtimer(CALLBACK(src, .proc/ninitialize_seven, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_seven(delay, mob/living/carbon/human/U)
+ to_chat(U, "All systems operational. Welcome to SpiderOS, [U.real_name].")
+ grant_ninja_verbs()
+ grant_equip_verbs()
+ ntick()
+ s_busy = FALSE
/obj/item/clothing/suit/space/space_ninja/proc/deinitialize(delay = s_delay)
- if(affecting==loc&&!s_busy)
+ if(affecting==loc)
var/mob/living/carbon/human/U = affecting
- if(!s_initialized)
- to_chat(U, "The suit is not initialized. Please report this bug.")
- return
if(alert("Are you certain you wish to remove the suit? This will take time and remove all abilities.",,"Yes","No")=="No")
return
- if(s_busy)
- to_chat(U, "ERROR: You cannot use this function at this time.")
- return
- s_busy = 1
- for(var/i = 0,i<7,i++)
- switch(i)
- if(0)
- to_chat(U, "Now de-initializing...")
- spideros = 0//Spideros resets.
- if(1)
- to_chat(U, "Logging off, [U:real_name]. Shutting down SpiderOS.")
- remove_ninja_verbs()
- if(2)
- to_chat(U, "Primary system status: OFFLINE.\nBackup system status: OFFLINE.")
- if(3)
- to_chat(U, "VOID-shift device status: OFFLINE.\nCLOAK-tech device status: OFFLINE.")
- cancel_stealth()//Shutdowns stealth.
- if(4)
- to_chat(U, "Disconnecting neural-net interface...\greenSuccess.")
- if(5)
- to_chat(U, "Disengaging neural-net interface...\greenSuccess.")
- if(6)
- to_chat(U, "Unsecuring external locking mechanism...\nNeural-net abolished.\nOperation status: FINISHED.")
- remove_equip_verbs()
- unlock_suit()
- U.regenerate_icons()
- sleep(delay)
- s_busy = 0
- return
\ No newline at end of file
+ s_busy = TRUE
+ addtimer(CALLBACK(src, .proc/deinitialize_two, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/deinitialize_two(delay, mob/living/carbon/human/U)
+ to_chat(U, "Now de-initializing...")
+ spideros = 0//Spideros resets.
+ addtimer(CALLBACK(src, .proc/deinitialize_three, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/deinitialize_three(delay, mob/living/carbon/human/U)
+ to_chat(U, "Logging off, [U:real_name]. Shutting down SpiderOS.")
+ remove_ninja_verbs()
+ addtimer(CALLBACK(src, .proc/deinitialize_four, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/deinitialize_four(delay, mob/living/carbon/human/U)
+ to_chat(U, "Primary system status: OFFLINE.\nBackup system status: OFFLINE.")
+ addtimer(CALLBACK(src, .proc/deinitialize_five, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/deinitialize_five(delay, mob/living/carbon/human/U)
+ to_chat(U, "VOID-shift device status: OFFLINE.\nCLOAK-tech device status: OFFLINE.")
+ cancel_stealth()//Shutdowns stealth.
+ addtimer(CALLBACK(src, .proc/deinitialize_six, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/deinitialize_six(delay, mob/living/carbon/human/U)
+ to_chat(U, "Disconnecting neural-net interface...\greenSuccess.")
+ addtimer(CALLBACK(src, .proc/deinitialize_seven, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/deinitialize_seven(delay, mob/living/carbon/human/U)
+ to_chat(U, "Disengaging neural-net interface...\greenSuccess.")
+ addtimer(CALLBACK(src, .proc/deinitialize_eight, delay, U), delay)
+
+/obj/item/clothing/suit/space/space_ninja/proc/deinitialize_eight(delay, mob/living/carbon/human/U)
+ to_chat(U, "Unsecuring external locking mechanism...\nNeural-net abolished.\nOperation status: FINISHED.")
+ remove_equip_verbs()
+ U.regenerate_icons()
+ s_busy = FALSE
diff --git a/code/modules/ninja/suit/suit_process.dm b/code/modules/ninja/suit/suit_process.dm
index 4b341c91980..99f801ed76a 100644
--- a/code/modules/ninja/suit/suit_process.dm
+++ b/code/modules/ninja/suit/suit_process.dm
@@ -20,5 +20,3 @@
cancel_stealth()
sleep(10)//Checks every second.
-
-
diff --git a/code/modules/ninja/suit/suit_verbs_handlers.dm b/code/modules/ninja/suit/suit_verbs_handlers.dm
index 24797a272b0..7c887da1d2a 100644
--- a/code/modules/ninja/suit/suit_verbs_handlers.dm
+++ b/code/modules/ninja/suit/suit_verbs_handlers.dm
@@ -9,33 +9,20 @@ Contents:
*/
/obj/item/clothing/suit/space/space_ninja/proc/grant_equip_verbs()
- verbs -= /obj/item/clothing/suit/space/space_ninja/proc/init
- verbs += /obj/item/clothing/suit/space/space_ninja/proc/deinit
- verbs += /obj/item/clothing/suit/space/space_ninja/proc/stealth
- n_gloves.verbs += /obj/item/clothing/gloves/space_ninja/proc/toggled
+ n_gloves.verbs += /obj/item/clothing/gloves/space_ninja/proc/toggledrain
s_initialized = 1
/obj/item/clothing/suit/space/space_ninja/proc/remove_equip_verbs()
- verbs += /obj/item/clothing/suit/space/space_ninja/proc/init
- verbs -= /obj/item/clothing/suit/space/space_ninja/proc/deinit
- verbs -= /obj/item/clothing/suit/space/space_ninja/proc/stealth
if(n_gloves)
- n_gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/toggled
+ n_gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/toggledrain
s_initialized = 0
/obj/item/clothing/suit/space/space_ninja/proc/grant_ninja_verbs()
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
- verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
- verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke
- verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjaboost
- verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
- verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
- verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
- verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninja_sword_recall
s_initialized=1
slowdown=0
@@ -43,10 +30,3 @@ Contents:
/obj/item/clothing/suit/space/space_ninja/proc/remove_ninja_verbs()
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
- verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
- verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke
- verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjaboost
- verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
- verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
- verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
- verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninja_sword_recall
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
index 55373e4b1c7..a52d99bcccd 100644
--- a/code/modules/power/singularity/narsie.dm
+++ b/code/modules/power/singularity/narsie.dm
@@ -34,7 +34,7 @@
var/area/A = get_area(src)
if(A)
- var/mutable_appearance/alert_overlay = mutable_appearance('icons/effects/effects.dmi', "ghostalertsie")
+ var/mutable_appearance/alert_overlay = mutable_appearance('icons/effects/cult_effects.dmi', "ghostalertsie")
notify_ghosts("Nar-Sie has risen in \the [A.name]. Reach out to the Geometer to be given a new shell for your soul.", source = src, alert_overlay = alert_overlay, action=NOTIFY_ATTACK)
INVOKE_ASYNC(src, .proc/narsie_spawn_animation)
@@ -52,6 +52,7 @@
/obj/singularity/narsie/large/cult/Initialize()
. = ..()
GLOB.cult_narsie = src
+ deltimer(GLOB.blood_target_reset_timer)
GLOB.blood_target = src
resize(0.6)
for(var/datum/mind/cult_mind in SSticker.mode.cult)
@@ -59,7 +60,7 @@
var/mob/living/L = cult_mind.current
L.narsie_act()
for(var/mob/living/player in GLOB.player_list)
- if(player.stat != DEAD && player.loc.z == ZLEVEL_STATION && !iscultist(player) && isliving(player))
+ if(player.stat != DEAD && player.loc.z == ZLEVEL_STATION && !iscultist(player))
souls_needed[player] = TRUE
soul_goal = round(1 + LAZYLEN(souls_needed) * 0.6)
INVOKE_ASYNC(src, .proc/begin_the_end)
diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm
index f0941946dcf..e7e85bc8c47 100644
--- a/code/modules/projectiles/ammunition.dm
+++ b/code/modules/projectiles/ammunition.dm
@@ -16,7 +16,7 @@
var/randomspread = 0 //Randomspread for automatics
var/delay = 0 //Delay for energy weapons
var/click_cooldown_override = 0 //Override this to make your gun have a faster fire rate, in tenths of a second. 4 is the default gun cooldown.
- var/firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect //the visual effect appearing when the ammo is fired.
+ var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the ammo is fired.
/obj/item/ammo_casing/New()
diff --git a/code/modules/projectiles/ammunition/caseless.dm b/code/modules/projectiles/ammunition/caseless.dm
index 9ba066ef95b..0480476a74d 100644
--- a/code/modules/projectiles/ammunition/caseless.dm
+++ b/code/modules/projectiles/ammunition/caseless.dm
@@ -45,7 +45,7 @@
icon_state = "s-casing-live"
projectile_type = /obj/item/projectile/beam
fire_sound = 'sound/weapons/Laser.ogg'
- firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/energy
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy
/obj/item/ammo_casing/caseless/laser/gatling
projectile_type = /obj/item/projectile/beam/weak
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index bf695cffedc..93b7d1a3eba 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -6,7 +6,7 @@
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'
- firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/energy
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy
/obj/item/ammo_casing/energy/chameleon
e_cost = 0
diff --git a/code/modules/projectiles/ammunition/special.dm b/code/modules/projectiles/ammunition/special.dm
index 68681c1124f..6e99c5f1bdd 100644
--- a/code/modules/projectiles/ammunition/special.dm
+++ b/code/modules/projectiles/ammunition/special.dm
@@ -2,7 +2,7 @@
name = "magic casing"
desc = "I didn't even know magic needed ammo..."
projectile_type = /obj/item/projectile/magic
- firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/magic
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic
/obj/item/ammo_casing/magic/change
projectile_type = /obj/item/projectile/magic/change
@@ -70,4 +70,4 @@
select_name = "spraydown"
fire_sound = 'sound/weapons/gunshot_smg.ogg'
e_cost = 20
- firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 6a5dab12bf6..4a7115b0c6d 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -195,7 +195,7 @@
if(ismineralturf(target_turf))
var/turf/closed/mineral/M = target_turf
M.gets_drilled(firer)
- var/obj/effect/overlay/temp/kinetic_blast/K = new /obj/effect/overlay/temp/kinetic_blast(target_turf)
+ var/obj/effect/temp_visual/kinetic_blast/K = new /obj/effect/temp_visual/kinetic_blast(target_turf)
K.color = color
for(var/type in hit_overlays)
new type(target_turf)
@@ -319,7 +319,7 @@
/obj/item/borg/upgrade/modkit/aoe/modify_projectile(obj/item/projectile/kinetic/K)
K.name = "kinetic explosion"
if(!K.turf_aoe && !K.mob_aoe)
- K.hit_overlays += /obj/effect/overlay/temp/explosion/fast
+ K.hit_overlays += /obj/effect/temp_visual/explosion/fast
K.mob_aoe += modifier
/obj/item/borg/upgrade/modkit/aoe/turfs
diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm
index 32646ee1e8f..37d576a8ffd 100644
--- a/code/modules/projectiles/guns/medbeam.dm
+++ b/code/modules/projectiles/guns/medbeam.dm
@@ -113,7 +113,7 @@
/obj/item/weapon/gun/medbeam/proc/on_beam_tick(var/mob/living/target)
if(target.health != target.maxHealth)
- new /obj/effect/overlay/temp/heal(get_turf(target), "#80F5FF")
+ new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF")
target.adjustBruteLoss(-4)
target.adjustFireLoss(-4)
return
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 3dedaa9ae1c..3dbadc85c5e 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -90,9 +90,9 @@
if(starting)
splatter_dir = get_dir(starting, target_loca)
if(isalien(L))
- new /obj/effect/overlay/temp/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir)
+ new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir)
else
- new /obj/effect/overlay/temp/dir_setting/bloodsplatter(target_loca, splatter_dir)
+ new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir)
if(prob(33))
L.add_splatter_floor(target_loca)
else if(impact_effect_type)
@@ -224,7 +224,7 @@
pixel_y_offset += 32
old_pixel_y += 32
new_y--
-
+
pixel_x = old_pixel_x
pixel_y = old_pixel_y
step_towards(src, locate(new_x, new_y, z))
@@ -237,7 +237,7 @@
animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = max(1, (delay <= 3 ? delay - 1 : delay)), flags = ANIMATION_END_NOW)
old_pixel_x = pixel_x_offset
old_pixel_y = pixel_y_offset
-
+
if(original && (original.layer>=2.75) || ismob(original))
if(loc == get_turf(original))
if(!(original in permutated))
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 7d651ef6f61..edc8c325ac5 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -9,7 +9,7 @@
hitsound_wall = 'sound/weapons/effects/searwall.ogg'
flag = "laser"
eyeblur = 2
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser
light_color = LIGHT_COLOR_RED
/obj/item/projectile/beam/laser
@@ -25,7 +25,7 @@
var/mob/living/carbon/M = target
M.IgniteMob()
else if(isturf(target))
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser/wall
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser/wall
/obj/item/projectile/beam/weak
damage = 15
@@ -48,7 +48,7 @@
irradiate = 30
range = 15
forcedodge = 1
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/green_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
light_color = LIGHT_COLOR_GREEN
/obj/item/projectile/beam/disabler
@@ -59,14 +59,14 @@
flag = "energy"
hitsound = 'sound/weapons/tap.ogg'
eyeblur = 0
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
light_color = LIGHT_COLOR_BLUE
/obj/item/projectile/beam/pulse
name = "pulse"
icon_state = "u_laser"
damage = 50
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
light_color = LIGHT_COLOR_BLUE
/obj/item/projectile/beam/pulse/on_hit(atom/target, blocked = 0)
@@ -94,7 +94,7 @@
damage = 30
legacy = 1
animate_movement = SLIDE_STEPS
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/green_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
light_color = LIGHT_COLOR_GREEN
/obj/item/projectile/beam/emitter/singularity_pull()
@@ -108,7 +108,7 @@
damage_type = STAMINA
flag = "laser"
var/suit_types = list(/obj/item/clothing/suit/redtag, /obj/item/clothing/suit/bluetag)
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
light_color = LIGHT_COLOR_BLUE
/obj/item/projectile/beam/lasertag/on_hit(atom/target, blocked = 0)
@@ -122,7 +122,7 @@
/obj/item/projectile/beam/lasertag/redtag
icon_state = "laser"
suit_types = list(/obj/item/clothing/suit/bluetag)
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser
light_color = LIGHT_COLOR_RED
/obj/item/projectile/beam/lasertag/bluetag
@@ -134,17 +134,17 @@
icon_state = "purple_laser"
damage = 200
damage_type = BURN
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/purple_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser
light_color = LIGHT_COLOR_PURPLE
/obj/item/projectile/beam/instakill/blue
icon_state = "blue_laser"
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
light_color = LIGHT_COLOR_BLUE
/obj/item/projectile/beam/instakill/red
icon_state = "red_laser"
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser
light_color = LIGHT_COLOR_RED
/obj/item/projectile/beam/instakill/on_hit(atom/target)
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index ad517c698e5..51958223d18 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -6,7 +6,7 @@
nodamage = 0
flag = "bullet"
hitsound_wall = "ricochet"
- impact_effect_type = /obj/effect/overlay/temp/impact_effect
+ impact_effect_type = /obj/effect/temp_visual/impact_effect
/obj/item/projectile/bullet/weakbullet //beanbag, heavy stamina damage
damage = 5
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index bd5ad14c48f..6e73989c2cd 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -133,7 +133,7 @@
damage = 20
damage_type = CLONE
irradiate = 10
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/green_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
/obj/item/projectile/energy/dart //ninja throwing dart
name = "dart"
@@ -162,7 +162,7 @@
/obj/item/projectile/energy/tesla
name = "tesla bolt"
icon_state = "tesla_projectile"
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
var/chain
/obj/item/projectile/energy/tesla/fire(setAngle)
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index f5df46cb7b5..e93a252a1ae 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -5,7 +5,7 @@
damage_type = BURN
nodamage = 1
flag = "energy"
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/ion
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/ion
/obj/item/projectile/ion/on_hit(atom/target, blocked = 0)
@@ -202,7 +202,7 @@
damage = 5
range = 3.5 //works as 4, but doubles to 7
dismemberment = 20
- impact_effect_type = /obj/effect/overlay/temp/impact_effect/purple_laser
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser
/obj/item/projectile/plasma/Initialize()
. = ..()
@@ -270,7 +270,7 @@
A.throw_at(throwtarget,power+1,1)
thrown_items[A] = A
for(var/turf/F in range(T,power))
- new /obj/effect/overlay/temp/gravpush(F)
+ new /obj/effect/temp_visual/gravpush(F)
/obj/item/projectile/gravityattract
name = "attraction bolt"
@@ -300,7 +300,7 @@
A.throw_at(T, power+1, 1)
thrown_items[A] = A
for(var/turf/F in range(T,power))
- new /obj/effect/overlay/temp/gravpush(F)
+ new /obj/effect/temp_visual/gravpush(F)
/obj/item/projectile/gravitychaos
name = "gravitational blast"
@@ -330,5 +330,5 @@
A.throw_at(get_edge_target_turf(A, pick(GLOB.cardinal)), power+1, 1)
thrown_items[A] = A
for(var/turf/Z in range(T,power))
- new /obj/effect/overlay/temp/gravpush(Z)
+ new /obj/effect/temp_visual/gravpush(Z)
diff --git a/code/modules/reagents/chemistry/reagents/blob_reagents.dm b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
index 948da607f83..9b1117bcc55 100644
--- a/code/modules/reagents/chemistry/reagents/blob_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
@@ -298,7 +298,7 @@
var/initial_volume = reac_volume
reac_volume = ..()
if(reac_volume >= 10) //if it's not a spore cloud, bad time incoming
- var/obj/effect/overlay/temp/explosion/fast/E = new /obj/effect/overlay/temp/explosion/fast(get_turf(M))
+ var/obj/effect/temp_visual/explosion/fast/E = new /obj/effect/temp_visual/explosion/fast(get_turf(M))
E.alpha = 150
for(var/mob/living/L in orange(get_turf(M), 1))
if("blob" in L.faction) //no friendly fire
diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm
index 647068a43e0..ef657f59224 100644
--- a/code/modules/ruins/lavaland_ruin_code.dm
+++ b/code/modules/ruins/lavaland_ruin_code.dm
@@ -143,6 +143,7 @@
has_id = 1
flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Continue your research as best you can, and try to keep a low profile. Do not abandon the base without good cause. The base is rigged with explosives should the worst happen, do not let the base fall into enemy hands!"
id_access_list = list(GLOB.access_syndicate)
+ faction = list("syndicate")
/obj/effect/mob_spawn/human/lavaland_syndicate/comms
name = "Syndicate Comms Agent"
diff --git a/code/modules/shuttle/ripple.dm b/code/modules/shuttle/ripple.dm
index ca49f50ae51..a757a86430a 100644
--- a/code/modules/shuttle/ripple.dm
+++ b/code/modules/shuttle/ripple.dm
@@ -1,4 +1,4 @@
-/obj/effect/overlay/temp/ripple
+/obj/effect/temp_visual/ripple
name = "hyperspace ripple"
desc = "Something is coming through hyperspace, you can see the \
visual disturbances. It's probably best not to be on top of these \
@@ -13,10 +13,10 @@
duration = 3 * SHUTTLE_RIPPLE_TIME
-/obj/effect/overlay/temp/ripple/Initialize(mapload, time_left)
+/obj/effect/temp_visual/ripple/Initialize(mapload, time_left)
. = ..()
animate(src, alpha=255, time=time_left)
addtimer(CALLBACK(src, .proc/stop_animation), 8, TIMER_CLIENT_TIME)
-/obj/effect/overlay/temp/ripple/proc/stop_animation()
+/obj/effect/temp_visual/ripple/proc/stop_animation()
icon_state = "medi_holo_no_anim"
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index a5d60b1e8d6..96db9d0ac39 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -404,7 +404,7 @@
/obj/docking_port/mobile/proc/create_ripples(obj/docking_port/stationary/S1, animate_time)
var/list/turfs = ripple_area(S1)
for(var/t in turfs)
- ripples += new /obj/effect/overlay/temp/ripple(t, animate_time)
+ ripples += new /obj/effect/temp_visual/ripple(t, animate_time)
/obj/docking_port/mobile/proc/remove_ripples()
for(var/R in ripples)
@@ -764,6 +764,6 @@
if(T in block(T0,T1))
return TRUE
return FALSE
-
+
#undef DOCKING_PORT_HIGHLIGHT
diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm
index b6898afdef4..c8a7c387eef 100644
--- a/code/modules/spells/spell_types/construct_spells.dm
+++ b/code/modules/spells/spell_types/construct_spells.dm
@@ -128,8 +128,8 @@
action_icon_state = "phaseshift"
action_background_icon_state = "bg_demon"
jaunt_in_time = 12
- jaunt_in_type = /obj/effect/overlay/temp/dir_setting/wraith
- jaunt_out_type = /obj/effect/overlay/temp/dir_setting/wraith/out
+ jaunt_in_type = /obj/effect/temp_visual/dir_setting/wraith
+ jaunt_out_type = /obj/effect/temp_visual/dir_setting/wraith/out
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/jaunt_steam(mobloc)
return
@@ -256,7 +256,7 @@
S.add_atom_colour("#990000", FIXED_COLOUR_PRIORITY)
S.faction = list("cult")
playsound(get_turf(S), 'sound/effects/ghost.ogg', 100, 1)
- new /obj/effect/overlay/temp/cult/sac(get_turf(S))
+ new /obj/effect/temp_visual/cult/sac(get_turf(S))
/obj/effect/proc_holder/spell/targeted/dominate/can_target(mob/living/target)
if(!isanimal(target) || target.stat)
@@ -267,5 +267,5 @@
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/golem
charge_max = 800
- jaunt_in_type = /obj/effect/overlay/temp/dir_setting/cult/phase
- jaunt_out_type = /obj/effect/overlay/temp/dir_setting/cult/phase/out
\ No newline at end of file
+ jaunt_in_type = /obj/effect/temp_visual/dir_setting/cult/phase
+ jaunt_out_type = /obj/effect/temp_visual/dir_setting/cult/phase/out
\ No newline at end of file
diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm
index a282ec72b7c..4d881d5bd53 100644
--- a/code/modules/spells/spell_types/ethereal_jaunt.dm
+++ b/code/modules/spells/spell_types/ethereal_jaunt.dm
@@ -13,8 +13,8 @@
nonabstract_req = 1
var/jaunt_duration = 50 //in deciseconds
var/jaunt_in_time = 5
- var/jaunt_in_type = /obj/effect/overlay/temp/wizard
- var/jaunt_out_type = /obj/effect/overlay/temp/wizard/out
+ var/jaunt_in_type = /obj/effect/temp_visual/wizard
+ var/jaunt_out_type = /obj/effect/temp_visual/wizard/out
action_icon_state = "jaunt"
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets,mob/user = usr) //magnets, so mostly hardcoded
diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm
index b8296a1da5b..f62259f67b5 100644
--- a/code/modules/spells/spell_types/wizard.dm
+++ b/code/modules/spells/spell_types/wizard.dm
@@ -257,7 +257,7 @@
selection_type = "view"
sound = 'sound/magic/Repulse.ogg'
var/maxthrow = 5
- var/sparkle_path = /obj/effect/overlay/temp/gravpush
+ var/sparkle_path = /obj/effect/temp_visual/gravpush
action_icon_state = "repulse"
@@ -300,7 +300,7 @@
range = 2
cooldown_min = 150
invocation_type = "none"
- sparkle_path = /obj/effect/overlay/temp/dir_setting/tailsweep
+ sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep
action_icon_state = "tailsweep"
action_background_icon_state = "bg_alien"
diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm
index 2636e2e5d55..f2764ca386a 100644
--- a/code/modules/surgery/organs/tongue.dm
+++ b/code/modules/surgery/organs/tongue.dm
@@ -14,6 +14,7 @@
languages_possible = typecacheof(list(
/datum/language/common,
/datum/language/draconic,
+ /datum/language/codespeak,
/datum/language/monkey,
/datum/language/narsie,
/datum/language/ratvar
diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm
index 71a530a8fb9..a48075b2d0b 100644
--- a/code/modules/uplink/uplink_item.dm
+++ b/code/modules/uplink/uplink_item.dm
@@ -929,6 +929,15 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
cost = 4
include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang)
+/datum/uplink_item/device_tools/syndietome
+ name = "Syndicate Tome"
+ desc = "Using rare artifacts acquired at great cost, the syndicate has reverse engineered \
+ the seemingly magical books of a certain cult. Though lacking the esoteric abilities \
+ of the originals, these inferior copies are still quite useful, being able to provide \
+ both weal and woe on the battlefield, even if they do occasionally bite off a finger."
+ item = /obj/item/weapon/storage/book/bible/syndicate
+ cost = 9
+
/datum/uplink_item/device_tools/thermal
name = "Thermal Imaging Glasses"
desc = "These goggles can be turned to resemble common eyewears throughout the station. \
@@ -1127,6 +1136,19 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
item = /obj/item/device/jammer
cost = 5
+/datum/uplink_item/device_tools/codespeak_manual
+ name = "Codespeak Manual"
+ desc = "Syndicate agents can be trained to use a series of codewords to comvey complex information, which sounds like random concepts and drinks to anyone listening. This manual teaches you this Codespeak. You can also hit someone else with the manual in order to teach them. One use."
+ item = /obj/item/weapon/codespeak_manual
+ cost = 2
+ exclude_modes = list(/datum/game_mode/nuclear)
+
+/datum/uplink_item/device_tools/codespeak_manual_deluxe
+ name = "Deluxe Codespeak Manual"
+ desc = "Syndicate agents can be trained to use a series of codewords to comvey complex information, which sounds like random concepts and drinks to anyone listening. This manual teaches you this Codespeak. You can also hit someone else with the manual in order to teach them. This is the deluxe edition, which has unlimited uses."
+ cost = 8
+ include_modes = list(/datum/game_mode/nuclear)
+
// Implants
/datum/uplink_item/implants
category = "Implants"
@@ -1267,6 +1289,14 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
restricted_roles = list("Chaplain")
surplus = 5 //Very low chance to get it in a surplus crate even without being the chaplain
+/datum/uplink_item/role_restricted/pie_cannon
+ name = "Banana Cream Pie Cannon"
+ desc = "A special pie cannon for a special clown, this gadget can hold up to 20 pies and automatically fabricates one every two seconds!"
+ cost = 10
+ item = /obj/item/weapon/pneumatic_cannon/pie/selfcharge
+ restricted_roles = list("Clown")
+ surplus = 0 //No fun unless you're the clown!
+
/datum/uplink_item/role_restricted/ancient_jumpsuit
name = "Ancient Jumpsuit"
desc = "A tattered old jumpsuit that will provide absolutely no benefit to you. It fills the wearer with a strange compulsion to blurt out 'glorf'."
diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm
index cc909e27755..134eea97298 100644
--- a/code/modules/vehicles/speedbike.dm
+++ b/code/modules/vehicles/speedbike.dm
@@ -17,7 +17,7 @@
/obj/vehicle/space/speedbike/Move(newloc,move_dir)
if(has_buckled_mobs())
- new /obj/effect/overlay/temp/dir_setting/speedbike_trail(loc,move_dir)
+ new /obj/effect/temp_visual/dir_setting/speedbike_trail(loc,move_dir)
. = ..()
/obj/vehicle/space/speedbike/red
diff --git a/code/world.dm b/code/world.dm
index 9858ab0c9ba..6e3f4d79843 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -16,6 +16,32 @@
/world/New()
log_world("World loaded at [time_stamp()]")
+ SetupExternalRSC()
+
+ GLOB.config_error_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl
+
+ make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
+
+ config = new
+
+ SetRoundID()
+
+ SetupLogs()
+
+ GLOB.revdata.DownloadPRDetails()
+
+ load_motd()
+ load_admins()
+ load_menu()
+ if(config.usewhitelist)
+ load_whitelist()
+ LoadBans()
+
+ GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000
+
+ Master.Initialize(10, FALSE)
+
+/world/proc/SetupExternalRSC()
#if (PRELOAD_RSC == 0)
external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n")
var/i=1
@@ -25,23 +51,25 @@
else
external_rsc_urls.Cut(i,i+1)
#endif
- GLOB.config_error_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl
- make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
- config = new
- GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-"
+
+/world/proc/SetRoundID()
if(config.sql_enabled)
if(SSdbcore.Connect())
log_world("Database connection established.")
- var/datum/DBQuery/query_feedback_create_round = SSdbcore.NewQuery("INSERT INTO [format_table_name("feedback")] SELECT null, Now(), MAX(round_id)+1, \"server_ip\", 0, \"[world.internet_address]:[world.port]\" FROM [format_table_name("feedback")]")
+ var/datum/DBQuery/query_feedback_create_round = SSdbcore.NewQuery("INSERT INTO [format_table_name("feedback")] SELECT null, Now(), IFNULL(MAX(round_id),0)+1, \"server_ip\", 0, \"[world.internet_address]:[world.port]\" FROM [format_table_name("feedback")]")
query_feedback_create_round.Execute()
var/datum/DBQuery/query_feedback_max_id = SSdbcore.NewQuery("SELECT MAX(round_id) FROM [format_table_name("feedback")]")
query_feedback_max_id.Execute()
if(query_feedback_max_id.NextRow())
GLOB.round_id = query_feedback_max_id.item[1]
- GLOB.log_directory += "[GLOB.round_id]"
else
log_world("Your server failed to establish a connection with the database.")
- if(!GLOB.round_id)
+
+/world/proc/SetupLogs()
+ GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-"
+ if(GLOB.round_id)
+ GLOB.log_directory += "[GLOB.round_id]"
+ else
GLOB.log_directory += "[replacetext(time_stamp(), ":", ".")]"
GLOB.world_game_log = file("[GLOB.log_directory]/game.log")
GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log")
@@ -58,21 +86,6 @@
if(GLOB.round_id)
log_game("Round ID: [GLOB.round_id]")
- GLOB.revdata.DownloadPRDetails()
- load_mode()
- load_motd()
- load_admins()
- load_menu()
- if(config.usewhitelist)
- load_whitelist()
- LoadBans()
-
- GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000
-
- GLOB.data_core = new /datum/datacore()
-
- Master.Initialize(10, FALSE)
-
#define IRC_STATUS_THROTTLE 50
/world/Topic(T, addr, master, key)
if(config && config.log_world_topic)
@@ -198,99 +211,21 @@
if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND)
return
-#define CHAT_PULLR 64 //defined in preferences.dm, but not available here at compilation time
+ var/final_composed = "PR: [announcement]"
for(var/client/C in GLOB.clients)
- if(C.prefs && (C.prefs.chat_toggles & CHAT_PULLR))
- C << "PR: [announcement]"
-#undef CHAT_PULLR
+ C.AnnouncePR(final_composed)
-#define WORLD_REBOOT(X) log_world("World rebooted at [time_stamp()]"); ..(X); return;
-
-/world/Reboot(var/reason, var/feedback_c, var/feedback_r, var/time)
- if (reason == 1) //special reboot, do none of the normal stuff
+/world/Reboot(reason = 0, fast_track = FALSE)
+ if (reason || fast_track) //special reboot, do none of the normal stuff
if (usr)
log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools")
message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools")
to_chat(world, "Rebooting World immediately due to host request")
- WORLD_REBOOT(1)
- var/delay
- if(time)
- delay = time
else
- delay = config.round_end_countdown * 10
- if(SSticker.delay_end)
- to_chat(world, "An admin has delayed the round end.")
- return
- to_chat(world, "Rebooting World in [delay/10] [(delay >= 10 && delay < 20) ? "second" : "seconds"]. [reason]")
- var/round_end_sound_sent = FALSE
- if(SSticker.round_end_sound)
- round_end_sound_sent = TRUE
- for(var/thing in GLOB.clients)
- var/client/C = thing
- if (!C)
- continue
- C.Export("##action=load_rsc", SSticker.round_end_sound)
- sleep(delay)
- if(SSticker.delay_end)
- to_chat(world, "Reboot was cancelled by an admin.")
- return
- OnReboot(reason, feedback_c, feedback_r, round_end_sound_sent)
- WORLD_REBOOT(0)
-#undef WORLD_REBOOT
-
-/world/proc/OnReboot(reason, feedback_c, feedback_r, round_end_sound_sent)
- SSblackbox.set_details("[feedback_c]","[feedback_r]")
- log_game("Rebooting World. [reason]")
- SSblackbox.set_val("ahelp_unresolved", GLOB.ahelp_tickets.active_tickets.len)
- Master.Shutdown() //run SS shutdowns
- RoundEndAnimation(round_end_sound_sent)
- kick_clients_in_lobby("The round came to an end with you in the lobby.", 1) //second parameter ensures only afk clients are kicked
- to_chat(world, "Rebooting world...")
- for(var/thing in GLOB.clients)
- var/client/C = thing
- if(C && config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite
- C << link("byond://[config.server]")
-
-/world/proc/RoundEndAnimation(round_end_sound_sent)
- set waitfor = FALSE
- var/round_end_sound
- if(SSticker.round_end_sound)
- round_end_sound = SSticker.round_end_sound
- if (!round_end_sound_sent)
- for(var/thing in GLOB.clients)
- var/client/C = thing
- if (!C)
- continue
- C.Export("##action=load_rsc", round_end_sound)
- else
- round_end_sound = pick(\
- 'sound/roundend/newroundsexy.ogg',
- 'sound/roundend/apcdestroyed.ogg',
- 'sound/roundend/bangindonk.ogg',
- 'sound/roundend/leavingtg.ogg',
- 'sound/roundend/its_only_game.ogg',
- 'sound/roundend/yeehaw.ogg',
- 'sound/roundend/disappointed.ogg'\
- )
-
- for(var/thing in GLOB.clients)
- var/obj/screen/splash/S = new(thing, FALSE)
- S.Fade(FALSE,FALSE)
-
- world << sound(round_end_sound)
-
-/world/proc/load_mode()
- var/mode = trim(file2text("data/mode.txt"))
- if(mode)
- GLOB.master_mode = mode
- else
- GLOB.master_mode = "extended"
- log_game("Saved mode is '[GLOB.master_mode]'")
-
-/world/proc/save_mode(the_mode)
- var/F = file("data/mode.txt")
- fdel(F)
- F << the_mode
+ to_chat(world, "Rebooting world...")
+ Master.Shutdown() //run SS shutdowns
+ log_world("World rebooted at [time_stamp()]");
+ ..()
/world/proc/load_motd()
GLOB.join_motd = file2text("config/motd.txt") + "
" + GLOB.revdata.GetTestMergeInfo()
diff --git a/html/changelog.html b/html/changelog.html
index cac680a4a78..2f8fe7ebbcb 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,33 @@
-->
+
18 May 2017
+
coiax updated:
+
+ - Syndicate agents can purchase a "codespeak manual", that teaches them a language that sounds like a series of codewords. You can also hit other people with the manual to teach them. One use per manual.
+ - Nuclear operatives have access to a deluxe manual that is more expensive but has unlimited uses.
+ - Syndicate AIs know Codespeak for free.
+ - Spacevines can no longer spread on space transit turfs.
+
+
+
17 May 2017
+
4dplanner updated:
+
+ - revenant respawning will not spam up deadchat so much, and is less likely to break.
+
+
Expletive updated:
+
+ - Syndicate Tomes have been added to traitor uplinks for 9 TC. They let an agent or an operative provide both weal and woe.
+
+
Penguaro updated:
+
+ - Centcom Engineering has reviewed the power schematic for the engine room and added an Area Power Controller.
+
+
coiax updated:
+
+ - Magic eightballs are now tiny items, able to fit into a box and pocket.
+
+
16 May 2017
Moonlighting Mac says updated:
@@ -77,6 +104,10 @@
- New Harvester Sprite
- Harvesters can now track a random survivor on the station, then switch back to tracking Nar'Sie, via a new action button.
+
fludd12 updated:
+
+ - You can now add grills to a bonfire, letting you cook things on top of them.
+
15 May 2017
Dorsidwarf updated:
@@ -1360,86 +1391,6 @@
- Added the power flow control console, which allows remote manipulation of most APCs on the z-level. You can find them in the Chief Engineer's office on all maps.
-
-
16 March 2017
-
BASILMAN YOUR MAIN MAN updated:
-
- - The BM Speedwagon has been improved both in terms of aesthetics and performance!
-
-
Cyberboss updated:
-
- - The shield generators in Boxstation Xenobiology now have the correct access
-
-
Joan updated:
-
- - Cult structures that emitted light now have colored light.
-
-
MrPerson updated:
-
- - Humans can see in darkness slightly again. This is only so you can see where you are when the lights go out.
-
-
MrStonedOne updated:
-
- - Fixed lighting not updating when a opaque object was deleted
-
-
Penguaro updated:
-
- - Increased Synchronization Range on Exosuit Fabricator
-
-
Tofa01 updated:
-
- - [Delta] Fixes telecoms temperature and gas mixing / being contaminated.
- - [Delta] Fixes some doubled up turfs causing items and objects to get stuck to stuff
- - [Omega] Makes telecoms room cool down and be cold.
-
-
Tokiko1 updated:
-
- - Most gases now have unique effects when surrounding the supermatter crystal.
- - The supermatter crystal can now take damage from too much energy and too much gas.
- - Added a dangerous overcharged state to the supermatter crystal.
- - Readded explosion delaminations, a new tesla delamination and allowed the singulo delamination to absorb the supermatter.
- - The type of delamination now depends on the state of the supermatter crystal.
- - Various supermatter engine rebalancing and fixes.
-
-
kevinz000 updated:
-
- - SDQL2 now supports outputting proccalls to variables, and associative lists
-
-
peoplearestrange updated:
-
- - Fixed buildmodes full tile window to be correct path
-
-
rock updated:
-
- - if we can have glowsticks in toolvends why not flashlights amirite guys
-
-
-
15 March 2017
-
Cyberboss updated:
-
- - You can no longer depart on the arrivals shuttle by hiding inside things
-
-
Joan updated:
-
- - Proselytizers converting clockwork floors to walls now always take 10 seconds, regardless of how fast the proselytizer is.
- - Clockwork grilles no longer provide CV.
-
-
Penguaro updated:
-
- - **Engineering** - Changed Access Level from **24** (_Atmo_) to **10** (_Engine_) on **Radiation Shutter Control**
-
-
TrustyGun updated:
-
- - Traitor Mimes with the finger guns spell now fire 3 bullets at a time, as opposed to just 1.
-
-
octareenroon91 updated:
-
- - Allow new reflector frames to be built from metal sheets.
-
-
oranges updated:
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 312b4898716..398c8550afe 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -11287,3 +11287,27 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: New Harvester Sprite
- rscadd: Harvesters can now track a random survivor on the station, then switch
back to tracking Nar'Sie, via a new action button.
+ fludd12:
+ - rscadd: You can now add grills to a bonfire, letting you cook things on top of
+ them.
+2017-05-17:
+ 4dplanner:
+ - bugfix: revenant respawning will not spam up deadchat so much, and is less likely
+ to break.
+ Expletive:
+ - rscadd: Syndicate Tomes have been added to traitor uplinks for 9 TC. They let
+ an agent or an operative provide both weal and woe.
+ Penguaro:
+ - bugfix: Centcom Engineering has reviewed the power schematic for the engine room
+ and added an Area Power Controller.
+ coiax:
+ - balance: Magic eightballs are now tiny items, able to fit into a box and pocket.
+2017-05-18:
+ coiax:
+ - rscadd: Syndicate agents can purchase a "codespeak manual", that teaches them
+ a language that sounds like a series of codewords. You can also hit other people
+ with the manual to teach them. One use per manual.
+ - rscadd: Nuclear operatives have access to a deluxe manual that is more expensive
+ but has unlimited uses.
+ - rscadd: Syndicate AIs know Codespeak for free.
+ - bugfix: Spacevines can no longer spread on space transit turfs.
diff --git a/html/changelogs/AutoChangeLog-pr-27234.yml b/html/changelogs/AutoChangeLog-pr-27234.yml
new file mode 100644
index 00000000000..55add0d61b3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-27234.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - rscadd: "Peacekeeper cyborgs now have projectile dampening fields."
diff --git a/html/changelogs/AutoChangeLog-pr-27316.yml b/html/changelogs/AutoChangeLog-pr-27316.yml
new file mode 100644
index 00000000000..ac36de1da25
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-27316.yml
@@ -0,0 +1,4 @@
+author: "Lordpidey"
+delete-after: True
+changes:
+ - tweak: "Space ninjas now use action buttons instead of verbs for a more consistent user experience."
diff --git a/html/changelogs/AutoChangeLog-pr-27337.yml b/html/changelogs/AutoChangeLog-pr-27337.yml
new file mode 100644
index 00000000000..55633298a8f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-27337.yml
@@ -0,0 +1,4 @@
+author: "Joan"
+delete-after: True
+changes:
+ - rscadd: "Proselytizing alloy shards will now proselytize all the shards in the tile, instead of requiring you to proselytize each one at a time."
diff --git a/html/changelogs/AutoChangeLog-pr-27359.yml b/html/changelogs/AutoChangeLog-pr-27359.yml
new file mode 100644
index 00000000000..26b56e1b299
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-27359.yml
@@ -0,0 +1,4 @@
+author: "coiax"
+delete-after: True
+changes:
+ - balance: "Plastic explosives can no longer be detonated by EMPs."
diff --git a/html/changelogs/AutoChangeLog-pr-27361.yml b/html/changelogs/AutoChangeLog-pr-27361.yml
new file mode 100644
index 00000000000..85daa80c5e6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-27361.yml
@@ -0,0 +1,8 @@
+author: "coiax"
+delete-after: True
+changes:
+ - rscadd: "Various vending machines, when shooting their inventory at nearby
+people, will \"demonstrate their products features\". This means that if a
+cigarette vending machine throws a lighter at you, it will be on.
+Vending machines also choose random products when throwing, rather than
+the first available one."
diff --git a/html/changelogs/AutoChangeLog-pr-27371.yml b/html/changelogs/AutoChangeLog-pr-27371.yml
new file mode 100644
index 00000000000..5557069616b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-27371.yml
@@ -0,0 +1,4 @@
+author: "Lordpidey"
+delete-after: True
+changes:
+ - rscadd: "Toy toolboxes with realistic rumbling action have been added to arcade prizes."
diff --git a/html/changelogs/AutoChangeLog-pr-27372.yml b/html/changelogs/AutoChangeLog-pr-27372.yml
new file mode 100644
index 00000000000..40e5e1abd01
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-27372.yml
@@ -0,0 +1,4 @@
+author: "Tacolizard Forever: Plasmaman Powercreep"
+delete-after: True
+changes:
+ - tweak: "Plasmaman tanks are the same size as emergency oxygen tanks."
diff --git a/icons/effects/cult_effects.dmi b/icons/effects/cult_effects.dmi
new file mode 100644
index 00000000000..58a2d3c9c97
Binary files /dev/null and b/icons/effects/cult_effects.dmi differ
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index fe537a8e739..eab44acdd79 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/effects/fields.dmi b/icons/effects/fields.dmi
new file mode 100644
index 00000000000..5eadb96a1a0
Binary files /dev/null and b/icons/effects/fields.dmi differ
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index b9f0b18b90b..7f6f85b0044 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/obj/clockwork_objects.dmi b/icons/obj/clockwork_objects.dmi
index 4b52f332052..a7c80ba5361 100644
Binary files a/icons/obj/clockwork_objects.dmi and b/icons/obj/clockwork_objects.dmi differ
diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi
index fc2c0585940..b0de3ddda27 100644
Binary files a/icons/obj/hydroponics/equipment.dmi and b/icons/obj/hydroponics/equipment.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index afdd5c36307..19e2cc0e483 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/turrets.dmi b/icons/obj/turrets.dmi
index f6ee047933f..ca852d06bc5 100644
Binary files a/icons/obj/turrets.dmi and b/icons/obj/turrets.dmi differ
diff --git a/storage.dmi b/storage.dmi
new file mode 100644
index 00000000000..91055cc42c5
Binary files /dev/null and b/storage.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 56e998bbd45..60b4a72758c 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -31,6 +31,7 @@
#include "code\__DEFINES\combat.dm"
#include "code\__DEFINES\construction.dm"
#include "code\__DEFINES\contracts.dm"
+#include "code\__DEFINES\cult.dm"
#include "code\__DEFINES\DNA.dm"
#include "code\__DEFINES\events.dm"
#include "code\__DEFINES\flags.dm"
@@ -167,6 +168,7 @@
#include "code\controllers\subsystem\dbcore.dm"
#include "code\controllers\subsystem\disease.dm"
#include "code\controllers\subsystem\events.dm"
+#include "code\controllers\subsystem\fields.dm"
#include "code\controllers\subsystem\fire_burning.dm"
#include "code\controllers\subsystem\garbage.dm"
#include "code\controllers\subsystem\icon_smooth.dm"
@@ -234,6 +236,7 @@
#include "code\datums\antagonists\antag_datum.dm"
#include "code\datums\antagonists\datum_clockcult.dm"
#include "code\datums\antagonists\datum_cult.dm"
+#include "code\datums\antagonists\ninja.dm"
#include "code\datums\diseases\_disease.dm"
#include "code\datums\diseases\_MobProcs.dm"
#include "code\datums\diseases\anxiety.dm"
@@ -437,6 +440,7 @@
#include "code\game\gamemodes\cult\cult_items.dm"
#include "code\game\gamemodes\cult\cult_structures.dm"
#include "code\game\gamemodes\cult\ritual.dm"
+#include "code\game\gamemodes\cult\rune_spawn_action.dm"
#include "code\game\gamemodes\cult\runes.dm"
#include "code\game\gamemodes\cult\supply.dm"
#include "code\game\gamemodes\cult\talisman.dm"
@@ -677,10 +681,10 @@
#include "code\game\objects\effects\decals\decal.dm"
#include "code\game\objects\effects\decals\misc.dm"
#include "code\game\objects\effects\decals\remains.dm"
-#include "code\game\objects\effects\decals\Cleanable\aliens.dm"
-#include "code\game\objects\effects\decals\Cleanable\humans.dm"
-#include "code\game\objects\effects\decals\Cleanable\misc.dm"
-#include "code\game\objects\effects\decals\Cleanable\robots.dm"
+#include "code\game\objects\effects\decals\cleanable\aliens.dm"
+#include "code\game\objects\effects\decals\cleanable\humans.dm"
+#include "code\game\objects\effects\decals\cleanable\misc.dm"
+#include "code\game\objects\effects\decals\cleanable\robots.dm"
#include "code\game\objects\effects\effect_system\effect_system.dm"
#include "code\game\objects\effects\effect_system\effects_explosion.dm"
#include "code\game\objects\effects\effect_system\effects_foam.dm"
@@ -695,6 +699,10 @@
#include "code\game\objects\effects\spawners\structure.dm"
#include "code\game\objects\effects\spawners\vaultspawner.dm"
#include "code\game\objects\effects\spawners\xeno_egg_delivery.dm"
+#include "code\game\objects\effects\temporary_visuals\clockcult.dm"
+#include "code\game\objects\effects\temporary_visuals\cult.dm"
+#include "code\game\objects\effects\temporary_visuals\miscellaneous.dm"
+#include "code\game\objects\effects\temporary_visuals\temporary_visual.dm"
#include "code\game\objects\items\apc_frame.dm"
#include "code\game\objects\items\blueprints.dm"
#include "code\game\objects\items\body_egg.dm"
@@ -1258,6 +1266,9 @@
#include "code\modules\events\wizard\rpgloot.dm"
#include "code\modules\events\wizard\shuffle.dm"
#include "code\modules\events\wizard\summons.dm"
+#include "code\modules\fields\fields.dm"
+#include "code\modules\fields\peaceborg_dampener.dm"
+#include "code\modules\fields\turf_objects.dm"
#include "code\modules\flufftext\Dreaming.dm"
#include "code\modules\flufftext\Hallucination.dm"
#include "code\modules\flufftext\TextFilters.dm"
@@ -1380,6 +1391,7 @@
#include "code\modules\jobs\job_types\security.dm"
#include "code\modules\jobs\job_types\silicon.dm"
#include "code\modules\jobs\map_changes\map_changes.dm"
+#include "code\modules\language\codespeak.dm"
#include "code\modules\language\common.dm"
#include "code\modules\language\draconic.dm"
#include "code\modules\language\drone.dm"
@@ -1754,7 +1766,6 @@
#include "code\modules\modular_computers\NTNet\NTNet_relay.dm"
#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm"
#include "code\modules\ninja\__ninjaDefines.dm"
-#include "code\modules\ninja\admin_ninja_verbs.dm"
#include "code\modules\ninja\energy_katana.dm"
#include "code\modules\ninja\ninja_event.dm"
#include "code\modules\ninja\Ninja_Readme.dm"