diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm
index b39269fa685..a170243f322 100644
--- a/_maps/map_files/cyberiad/z5.dmm
+++ b/_maps/map_files/cyberiad/z5.dmm
@@ -837,6 +837,7 @@
"qe" = (/obj/structure/ore_box,/obj/machinery/camera{c_tag = "Research Outpost External Airlock"; dir = 8; network = list("Research Outpost")},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "research_pump"},/turf/simulated/floor{icon_state = "warning"},/area/research_outpost/gearstore)
"qf" = (/obj/structure/transit_tube{tag = "icon-D-SW"; icon_state = "D-SW"},/turf/simulated/wall/r_wall,/area/mine/explored)
"qg" = (/obj/effect/glowshroom,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored)
+"qh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "mining_west_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = null},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor,/area/mine/living_quarters)
"qi" = (/obj/machinery/door/airlock/external{name = "Mining Bridge"; req_access_txt = "65"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/research_outpost/gearstore)
"qj" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/mine/explored)
"qk" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "research_outer"; locked = 1; name = "Research Outpost External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/research_outpost/gearstore)
@@ -1051,6 +1052,10 @@
"ul" = (/turf/simulated/floor/plating/airless,/area/mine/explored)
"um" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/mine/production)
"un" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor,/area/mine/living_quarters)
+"uo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_west_inner"; locked = 1; name = "Mining External Access"; req_access = null; req_access_txt = null},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/mine/living_quarters)
+"up" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/living_quarters)
+"uq" = (/obj/machinery/camera{c_tag = "Mining Outpost Port Exterior Airlock"; dir = 4; network = list("Mining Outpost")},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor{icon_state = "warning"},/area/mine/living_quarters)
+"ur" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor{icon_state = "warning"},/area/mine/living_quarters)
"uz" = (/obj/structure/lattice,/obj/structure/window/reinforced,/turf/space,/area/mine/explored)
"uA" = (/obj/structure/lattice,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/mine/explored)
"vn" = (/obj/machinery/light/small,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored)
@@ -1280,7 +1285,6 @@
"zJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor,/area/mine/living_quarters)
"zK" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor,/area/mine/living_quarters)
"zL" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/machinery/light,/turf/simulated/floor,/area/mine/living_quarters)
-"zM" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "mining_west_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = null},/turf/simulated/floor,/area/mine/living_quarters)
"zN" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/machinery/camera{c_tag = "Mining Outpost Port Connector"; dir = 1; network = list("Mining Outpost")},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/mine/living_quarters)
"zO" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/mine/living_quarters)
"zP" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/space,/area/mine/living_quarters)
@@ -1303,7 +1307,6 @@
"Ag" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/mine/living_quarters)
"Ah" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/maintenance{name = "Mining Station Maintenance"; req_access_txt = "48"},/turf/simulated/floor/plating,/area/mine/living_quarters)
"Ai" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/wall,/area/mine/living_quarters)
-"Aj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_west_inner"; locked = 1; name = "Mining External Access"; req_access = null; req_access_txt = null},/turf/simulated/floor,/area/mine/living_quarters)
"Ak" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor,/area/mine/lobby)
"Al" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/mine/lobby)
"Am" = (/obj/structure/disposalpipe/junction,/turf/simulated/wall,/area/mine/production{name = "Mining Station Mech Bay"})
@@ -1324,7 +1327,6 @@
"AB" = (/obj/machinery/light_switch{pixel_y = 23},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating,/area/mine/living_quarters)
"AC" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plating,/area/mine/living_quarters)
"AD" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/obj/structure/closet/emcloset,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/living_quarters)
-"AE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/living_quarters)
"AF" = (/obj/machinery/light/small{dir = 4},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "mining_west_sensor"; pixel_x = 25; pixel_y = -5},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "mining_west_pump"; tag_exterior_door = "mining_west_outer"; frequency = 1379; id_tag = "mining_west_airlock"; tag_interior_door = "mining_west_inner"; pixel_x = 25; pixel_y = 5; req_access_txt = null; tag_chamber_sensor = "mining_west_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor,/area/mine/living_quarters)
"AG" = (/obj/machinery/status_display{dir = 4; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor,/area/mine/lobby)
"AH" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/mine/lobby)
@@ -1344,9 +1346,7 @@
"AV" = (/turf/simulated/floor/plating,/area/mine/living_quarters)
"AW" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating,/area/mine/living_quarters)
"AX" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/turf/simulated/floor/plating,/area/mine/living_quarters)
-"AY" = (/obj/machinery/camera{c_tag = "Mining Outpost Port Exterior Airlock"; dir = 4; network = list("Mining Outpost")},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/living_quarters)
"AZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor{icon_state = "warning"},/area/mine/living_quarters)
-"Ba" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor{icon_state = "warning"},/area/mine/living_quarters)
"Bb" = (/turf/space,/area/shuttle/mining/outpost)
"Bc" = (/obj/machinery/power/apc{dir = 8; name = "Mining Station Starboard Wing APC"; pixel_x = -27; pixel_y = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/mine/lobby)
"Bd" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/mine/lobby)
@@ -1632,10 +1632,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacafafaeaewtxTxcxUwNxVxWxXxcwtwtwtwtwtwvsdqCaeaeaeaeaeaeaeaeafafafacacacacacbkbkbkbkbkbkbkacacacafaeaeaeaeaeaeaeaeaeaeaesdqCaeaeaeaeaeaeaeaeaeafafacacxYvNvNvNxZvNvNyaybycyaybvNvNvNvNvNydvNvNweweaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaexOxOyeyfygyhyiyjyjykyoymynyoqCaeaeaenuafafafpepepepepepepeafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaewtypyqyrwHysytyuyvywsNsMylyAyBujukrArArArArAqTaeaeaeaeafafafacacacacacbkbkbkacacacacafafaeaeuhrArArArArArArArAujukrArArArAqTaeaeaeaeaeafacacacacacxZyCyDyExpxMyFxqxMxFyGyHyIxqxMxpyJyKweweweyLyMyMyMyMyMyMyMyNyNyNyNyNyNyNxOxOxOyOyfyPyQyRySyjyjyTyUyVyWyXyYaeaeaenuafafafpepepepepepeafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaewtwtwtwtwtyZzazbwtwtzcwtwtwtwtqxqzaeaeaeaeaeqKaeaeaeaeafaeafafacacacacacacacacacacafafaeaeaeqKaeaeaeaeaeaeaeaeqxqzaeaeaeaeqKaeaeaeaeaeafafntafafacvNvNvNvNxpxMzdzezfxHzgzhzhzizizjzhzkzlzhzlzmzmzmzmzmzmzmzmznznznznznznznzozpzozqzpzrzsztmnzvzwzxyozyzzyoqzaeaeaeaeafafafafpepepepepeafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaeaewtzAzBzCzDwtzEzFonaeaeaeaeaeqMaeaeaeqSrArAqTaeaeaeaeafacacacacacacacacacacafaeaeuhrAuiaeaeaeaeafaeaeqMaeaeaeaeaeaeqKaeaeaeaeaeaeaewfaeafafafafafvNxpzGzHzIzIzHzJzKzLzIzIzMzHzNzOzOzOzPzPzPzPzPzPzPzPzQzQzQzQzQzQzRzSzSzSzTzUzVzWzXzYzZzYzYzYzYzYzYAaaeaeaeaenuafafafpepepepeafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaewtAbAcAdAewtaeaeaeaeaeaeafafntafaeaeaeaeaeqKaeaeaeaeaeafacacacacacafafafafafaeuhuiaeaeaeafafafafafafntaeaeaeaeaeaeqKaeaeaeaeaeaeaeaeaeaeaeafafvNvNyaAfyavNvNAgAhAivNvNvNAjyavNweaeaeaeaaaaaaaaagaaaaaaagaaaaaaaaaaagaaxOxOyfAkAlAmAnAoApAqArAszYwkAtaeaeaeaeaeafafafpepepepeafafafpeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafaeaeaewtwtwtwtwtwtaeaeafafafafafacacafafaeaeaeaeqKaeaeaeaeaeaeafafafafafafaeaeaeaeaeqKaeaeafafafacacacacacafaeaeaeaeaeaeqKaeaeaesdqCaeaeaeaeaeaeaeafvNAuAvAwAxvNAyAzAAABACvNADAEAFvNaeaeaeaeaeaeaaaaagaaaaaaagagagagagagagagagxNAGAHAIAJAKAKALAMAMANAOAPwsaeaeaeaeaeafafafpepepeafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeaeaeafacacacacacacacafafaeaeaeqSrArArAqTaeaeaeaeaeaeaeaeaeaeaeaeaeqKaeafafacacacacacacacafafaeaeaeaeaeqSrArArAujukrArArAqTaeaeaeaevNAQARASATvNAUAVAVAWAXvNAYAZBavNaeaeaeaeaeaeagagagagagagagBbBbBbBbBbagaaaaxNBcBdBeBfBgBhBiAMAMANAOAPwsaeaeaeaeafafafafpepeafafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaeaewtzAzBzCzDwtzEzFonaeaeaeaeaeqMaeaeaeqSrArAqTaeaeaeaeafacacacacacacacacacacafaeaeuhrAuiaeaeaeaeafaeaeqMaeaeaeaeaeaeqKaeaeaeaeaeaeaewfaeafafafafafvNxpzGzHzIzIzHzJzKzLzIzIqhzHzNzOzOzOzPzPzPzPzPzPzPzPzQzQzQzQzQzQzRzSzSzSzTzUzVzWzXzYzZzYzYzYzYzYzYAaaeaeaeaenuafafafpepepepeafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaewtAbAcAdAewtaeaeaeaeaeaeafafntafaeaeaeaeaeqKaeaeaeaeaeafacacacacacafafafafafaeuhuiaeaeaeafafafafafafntaeaeaeaeaeaeqKaeaeaeaeaeaeaeaeaeaeaeafafvNvNyaAfyavNvNAgAhAivNvNvNuoyavNweaeaeaeaaaaaaaaagaaaaaaagaaaaaaaaaaagaaxOxOyfAkAlAmAnAoApAqArAszYwkAtaeaeaeaeaeafafafpepepepeafafafpeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafaeaeaewtwtwtwtwtwtaeaeafafafafafacacafafaeaeaeaeqKaeaeaeaeaeaeafafafafafafaeaeaeaeaeqKaeaeafafafacacacacacafaeaeaeaeaeaeqKaeaeaesdqCaeaeaeaeaeaeaeafvNAuAvAwAxvNAyAzAAABACvNADupAFvNaeaeaeaeaeaeaaaaagaaaaaaagagagagagagagagagxNAGAHAIAJAKAKALAMAMANAOAPwsaeaeaeaeaeafafafpepepeafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeaeaeafacacacacacacacafafaeaeaeqSrArArAqTaeaeaeaeaeaeaeaeaeaeaeaeaeqKaeafafacacacacacacacafafaeaeaeaeaeqSrArArAujukrArArAqTaeaeaeaevNAQARASATvNAUAVAVAWAXvNuqAZurvNaeaeaeaeaeaeagagagagagagagBbBbBbBbBbagaaaaxNBcBdBeBfBgBhBiAMAMANAOAPwsaeaeaeaeafafafafpepeafafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeafafafacacacacacacacacafafafaeaeaeaeaeqSqTaeaesdqCaeaeuhrArArArArAuiaeafacacacacbkbkbkacacafafafaeaeaeaeaeaeaeqxqzaeaeaeqKaeaeaeaexYvNvNvNvNvNBjBkBlBmAXvNvNBnyaxYaeaeaeaeaeaeaaaaagaaaaaaagBbBbBbBbBbagaaxOxOBoBpBqzYBrBsBtBuArAszYwCwDaeaeaeaeafafafpepepeafafafafpepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafafafaeaeaeaeafafafacacacacacacacacacacacacafafafaeqMaeaeqSrArAujukrArAuiaeaeaeaeaeaeaeafacacacbkbkbkbkbkacacacafafafafaeaeaeaeaeaeaeaeaeqSrArAqTaeaeaeaeaeaexYvNvNvNvNvNxYAPBvBwBxaeaeaeaeaeaaaaaaagaaaaaaagBbBbBbBbBbByxOBzBABBBCBDxNBEBFBEBEBEBEBEBEudaeaeaeafafafafpepeafafafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacafafafafafafacacacacacacacacacacacacacacacacafafntafaeaeaeaeqxqzaeaeaeaeqMaeafafafafafacacbkbkbkbkbkbkbkacacacacacafafafafafafafafaeaeaeaeaeqKaeaeaeaeaeaeaeaeqxBGBHBHBHBHBIqzaeaeaeaeaeaeagagagagagagagagBbBbBbBbBbBJBKBLBMyfBCBNxNBOBPBQBRBSBTBUBVaeaeaeaeafafafafpepeafafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm
index c3d1762b993..8ffaf98aa79 100644
--- a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm
+++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm
@@ -43,31 +43,32 @@
if(SOUTHWEST)
initialize_directions = SOUTH|WEST
-/obj/machinery/atmospherics/pipe/simple/initialize()
+/obj/machinery/atmospherics/pipe/simple/initialize(initPipe = 1)
..()
- normalize_dir()
- var/N = 2
- for(var/D in cardinal)
- if(D & initialize_directions)
- N--
- for(var/obj/machinery/atmospherics/target in get_step(src, D))
- if(target.initialize_directions & get_dir(target,src))
- var/c = check_connect_types(target,src)
- if(!c)
- continue
- if(!node1 && N == 1)
- target.connected_to = c
- connected_to = c
- node1 = target
- break
- if(!node2 && N == 0)
- target.connected_to = c
- connected_to = c
- node2 = target
- break
- var/turf/T = loc // hide if turf is not intact
- hide(T.intact)
- update_icon()
+ if(initPipe)
+ normalize_dir()
+ var/N = 2
+ for(var/D in cardinal)
+ if(D & initialize_directions)
+ N--
+ for(var/obj/machinery/atmospherics/target in get_step(src, D))
+ if(target.initialize_directions & get_dir(target,src))
+ var/c = check_connect_types(target,src)
+ if(!c)
+ continue
+ if(!node1 && N == 1)
+ target.connected_to = c
+ connected_to = c
+ node1 = target
+ break
+ if(!node2 && N == 0)
+ target.connected_to = c
+ connected_to = c
+ node2 = target
+ break
+ var/turf/T = loc // hide if turf is not intact
+ hide(T.intact)
+ update_icon()
/obj/machinery/atmospherics/pipe/simple/check_pressure(pressure)
var/datum/gas_mixture/environment = loc.return_air()
diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm
index d61126b1414..ce6974e9da4 100644
--- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm
+++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm
@@ -59,21 +59,23 @@
initialize_directions_he = initialize_directions // The auto-detection from /pipe is good enough for a simple HE pipe
color = "#404040"
-/obj/machinery/atmospherics/pipe/simple/heat_exchanging/initialize()
- normalize_dir()
- var/N = 2
- for(var/D in cardinal)
- if(D & initialize_directions_he)
- N--
- for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src, D))
- if(target.initialize_directions_he & get_dir(target,src))
- if(!node1 && N == 1)
- node1 = target
- break
- if(!node2 && N == 0)
- node2 = target
- break
- update_icon()
+/obj/machinery/atmospherics/pipe/simple/heat_exchanging/initialize(initPipe = 1)
+ ..(0)
+ if(initPipe)
+ normalize_dir()
+ var/N = 2
+ for(var/D in cardinal)
+ if(D & initialize_directions_he)
+ N--
+ for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src, D))
+ if(target.initialize_directions_he & get_dir(target,src))
+ if(!node1 && N == 1)
+ node1 = target
+ break
+ if(!node2 && N == 0)
+ node2 = target
+ break
+ update_icon()
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/hidden
level=1
@@ -107,6 +109,7 @@
initialize_directions_he = WEST
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/initialize()
+ ..(0)
for(var/obj/machinery/atmospherics/target in get_step(src,initialize_directions))
if(target.initialize_directions & get_dir(target,src))
node1 = target
@@ -116,10 +119,6 @@
node2 = target
break
- if(!node1 && !node2)
- qdel(src)
- return
-
update_icon()
return
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 00faf1864f9..3773d69f3a2 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -15,32 +15,12 @@
//socks
init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list, socks_m, socks_f)
-
-
- var/list/paths
- //Surgery Steps - Initialize all /datum/surgery_step into a list
- paths = subtypesof(/datum/surgery_step)
- for(var/T in paths)
- var/datum/surgery_step/S = new T
- surgery_steps += S
+ init_subtypes(/datum/surgery_step, surgery_steps)
sort_surgeries()
- //List of job. I can't believe this was calculated multiple times per tick!
- paths = subtypesof(/datum/job) -list(/datum/job/ai,/datum/job/cyborg)
- for(var/T in paths)
- var/datum/job/J = new T
- joblist[J.title] = J
-
- paths = subtypesof(/datum/superheroes)
- for(var/T in paths)
- var/datum/superheroes/S = new T
- all_superheroes[S.name] = S
-
- //Languages and species.
- paths = subtypesof(/datum/language)
- for(var/T in paths)
- var/datum/language/L = new T
- all_languages[L.name] = L
+ init_datum_subtypes(/datum/job, joblist, list(/datum/job/ai, /datum/job/cyborg), "title")
+ init_datum_subtypes(/datum/superheroes, all_superheroes, null, "name")
+ init_datum_subtypes(/datum/language, all_languages, null, "name")
for (var/language_name in all_languages)
var/datum/language/L = all_languages[language_name]
@@ -49,19 +29,17 @@
language_keys[".[lowertext(L.key)]"] = L
language_keys["#[lowertext(L.key)]"] = L
+ var/list/paths = subtypesof(/datum/species)
var/rkey = 0
- paths = subtypesof(/datum/species)
for(var/T in paths)
- rkey++
var/datum/species/S = new T
- S.race_key = rkey //Used in mob icon caching.
+ S.race_key = ++rkey //Used in mob icon caching.
all_species[S.name] = S
if(S.flags & IS_WHITELISTED)
whitelisted_species += S.name
init_subtypes(/datum/table_recipe, table_recipes)
-
return 1
/* // Uncomment to debug chemical reaction list.
@@ -80,8 +58,19 @@
//creates every subtype of prototype (excluding prototype) and adds it to list L.
//if no list/L is provided, one is created.
/proc/init_subtypes(prototype, list/L)
- if(!istype(L)) L = list()
- for(var/path in typesof(prototype))
- if(path == prototype) continue
- L += new path()
- return L
+ if(!istype(L)) L = list()
+ for(var/path in subtypesof(prototype))
+ L += new path()
+ return L
+
+/proc/init_datum_subtypes(prototype, list/L, list/pexempt, assocvar)
+ if(!istype(L)) L = list()
+ for(var/path in subtypesof(prototype) - pexempt)
+ var/datum/D = new path()
+ if(istype(D))
+ var/assoc
+ if(D.vars["[assocvar]"]) //has the var
+ assoc = D.vars["[assocvar]"] //access value of var
+ if(assoc) //value gotten
+ L["[assoc]"] = D //put in association
+ return L
\ No newline at end of file
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 7a87a77c7a1..9e20407a855 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -16,9 +16,6 @@ var/list/blob_nodes = list()
recommended_enemies = 1
restricted_jobs = list("Cyborg", "AI")
- var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
- var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
-
var/declared = 0
var/burst = 0
diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm
index 2977112af82..816dce84008 100644
--- a/code/game/gamemodes/blob/blob_report.dm
+++ b/code/game/gamemodes/blob/blob_report.dm
@@ -1,6 +1,6 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-/datum/game_mode/blob/send_intercept(var/report = 1)
+/datum/game_mode/blob/proc/send_intercept(var/report = 1)
var/intercepttext = ""
var/interceptname = ""
switch(report)
diff --git a/code/game/gamemodes/borer/borer.dm b/code/game/gamemodes/borer/borer.dm
index ebebe739f5a..3a491c769df 100644
--- a/code/game/gamemodes/borer/borer.dm
+++ b/code/game/gamemodes/borer/borer.dm
@@ -15,9 +15,6 @@
var/var/list/datum/mind/first_hosts = list()
var/var/list/assigned_hosts = list()
- var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
- var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
-
var/list/found_vents = list()
/datum/game_mode/borer/announce()
@@ -98,10 +95,7 @@
log_admin("Created [borers.len] borers.")
- spawn (rand(waittime_l, waittime_h))
- send_intercept()
..()
- return
/datum/game_mode/proc/greet_borer(var/datum/mind/borer, var/you_are=1)
if (you_are)
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 2687a886e7d..a9d2387a374 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -35,9 +35,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/const/prob_right_objective_l = 25 //lower bound on probability of determining the objective correctly
var/const/prob_right_objective_h = 50 //upper bound on probability of determining the objective correctly
- var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
- var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
-
var/changeling_amount = 4
/datum/game_mode/changeling/announce()
@@ -72,10 +69,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
forge_changeling_objectives(changeling)
greet_changeling(changeling)
- spawn (rand(waittime_l, waittime_h))
- send_intercept()
..()
- return
/datum/game_mode/proc/forge_changeling_objectives(var/datum/mind/changeling)
@@ -298,8 +292,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
if(T.species.flags & NO_DNA_RAD)
user << "This creature does not have DNA!"
- return
-
+ return
+
if(T.species.flags & NO_SCAN)
user << "We do not know how to parse this creature's DNA!"
return
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index a5a18c6676e..09e184e2b3c 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -10,15 +10,15 @@
/proc/is_convertable_to_cult(datum/mind/mind)
- if(!mind)
+ if(!mind)
return 0
if(!mind.current)
return 0
- if(iscultist(mind.current))
+ if(iscultist(mind.current))
return 1 //If they're already in the cult, assume they are convertable
if(jobban_isbanned(mind.current, "cultist") || jobban_isbanned(mind.current, "Syndicate"))
return 0
- if(ishuman(mind.current) && (mind.assigned_role in list("Captain", "Chaplain")))
+ if(ishuman(mind.current) && (mind.assigned_role in list("Captain", "Chaplain")))
return 0
if(ishuman(mind.current))
var/mob/living/carbon/human/H = mind.current
@@ -42,8 +42,6 @@
var/datum/mind/sacrifice_target = null
var/finished = 0
- var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
- var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
var/list/startwords = list("blood","join","self","hell")
@@ -63,7 +61,7 @@
/datum/game_mode/cult/pre_setup()
- if(prob(50))
+ if(prob(50))
objectives += "survive"
objectives += "sacrifice"
else
@@ -105,8 +103,6 @@
cult_mind.current << "\blue You are a member of the cult!"
memorize_cult_objectives(cult_mind)
- spawn (rand(waittime_l, waittime_h))
- send_intercept()
..()
diff --git a/code/game/gamemodes/extended/extended.dm b/code/game/gamemodes/extended/extended.dm
index 245e1e16e00..cc26c5c3db4 100644
--- a/code/game/gamemodes/extended/extended.dm
+++ b/code/game/gamemodes/extended/extended.dm
@@ -6,9 +6,6 @@
uplink_welcome = "Syndicate Uplink Console:"
uplink_uses = 20
- var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
- var/const/waittime_h = 1800
-
/datum/game_mode/announce()
world << "The current game mode is - Extended Role-Playing!"
world << "Just have fun and role-play!"
@@ -17,6 +14,4 @@
return 1
/datum/game_mode/extended/post_setup()
- spawn (rand(waittime_l, waittime_h)) // To reduce extended meta.
- send_intercept()
..()
\ No newline at end of file
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 8809476c3ed..792eff47713 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -34,6 +34,9 @@
var/uplink_welcome = "Syndicate Uplink Console:"
var/uplink_uses = 10
+ var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
+ var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
+
/datum/game_mode/proc/announce() //to be calles when round starts
world << "Notice: [src] did not define announce()"
@@ -228,65 +231,6 @@
/datum/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere.
return 0
-
-/datum/game_mode/proc/send_intercept() //Disabled.
- return
-/* var/intercepttext = "Cent. Com. Update Requested status information:
"
- intercepttext += " In case you have misplaced your copy, attached is a list of personnel whom reliable sources™ suspect may be affiliated with the Syndicate:
"
-
-
- var/list/suspects = list()
- for(var/mob/living/carbon/human/man in player_list) if(man.client && man.mind)
- // NT relation option
- if(isNonCrewAntag(man))
- continue //NT intelligence ruled out possiblity that those are too classy to pretend to be a crew.
- if(man.client.prefs.nanotrasen_relation == "Opposed" && prob(50) || \
- man.client.prefs.nanotrasen_relation == "Skeptical" && prob(20))
- suspects += man
- // Antags
- else if(special_role == "traitor" && prob(40) || \
- special_role == "Changeling" && prob(50) || \
- special_role == "Vampire" && prob(40) || \
- special_role == "Cultist" && prob(30) || \
- special_role == "Head Revolutionary" && prob(30) || \
- special_role == "Shadowling" && prob(15))
- suspects += man
-
- // If they're a traitor or likewise, give them extra TC in exchange.
- var/obj/item/device/uplink/hidden/suplink = man.mind.find_syndicate_uplink()
- if(suplink)
- var/extra = 0 //was 4; with the TC rebalance, this isn't really needed, anymore
- suplink.uses += extra
- man << "\red We have received notice that enemy intelligence suspects you to be linked with us. We recommend adjusting your plans and equipment accordingly."
- else
- // Give them a warning!
- man << "\red They are on to you!"
-
- // Some poor people who were just in the wrong place at the wrong time..
- else if(prob(10))
- suspects += man
- for(var/mob/M in suspects)
- switch(rand(1, 100))
- if(1 to 50)
- intercepttext += "Someone with the job of [M.mind.assigned_role]
"
- else
- intercepttext += "[M.name], the [M.mind.assigned_role]
"
-
- for (var/obj/machinery/computer/communications/comm in machines)
- if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
- var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
- intercept.name = "paper- 'Cent. Com. Status Summary'"
- intercept.info = intercepttext
-
- comm.messagetitle.Add("Cent. Com. Status Summary")
- comm.messagetext.Add(intercepttext)
-/* world << sound('sound/AI/commandreport.ogg') */
-
- command_announcement.Announce("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercepted. Security Level Elevated.", new_sound = 'sound/AI/intercept.ogg')
- if(security_level < SEC_LEVEL_BLUE)
- set_security_level(SEC_LEVEL_BLUE)*/
-
-
/datum/game_mode/proc/get_players_for_role(var/role, override_jobbans=0)
var/list/players = list()
var/list/candidates = list()
@@ -558,7 +502,7 @@ proc/get_nt_opposed()
if(BE_MUTINEER) roletext="mutineer"
if(BE_BLOB) roletext="blob"
return roletext
-
+
/proc/get_nuke_code()
var/nukecode = "ERROR"
for(var/obj/machinery/nuclearbomb/bomb in world)
diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm
index 5f4d14740a2..58784a8c56a 100644
--- a/code/game/gamemodes/heist/heist.dm
+++ b/code/game/gamemodes/heist/heist.dm
@@ -18,9 +18,6 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
recommended_enemies = 5
votable = 0
- var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
- var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
-
var/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' objective.
/datum/game_mode/heist/announce()
@@ -83,9 +80,6 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
if(raid_objectives)
raider.objectives = raid_objectives
- spawn (rand(waittime_l, waittime_h))
- send_intercept()
-
return ..()
/datum/game_mode/proc/create_vox(var/datum/mind/newraider)
@@ -276,7 +270,7 @@ datum/game_mode/proc/auto_declare_completion_heist()
text += ")"
world << text
-
+
return 1
/datum/game_mode/heist/check_finished()
diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm
index 11475405d6d..4eb0089af00 100644
--- a/code/game/gamemodes/malfunction/malfunction.dm
+++ b/code/game/gamemodes/malfunction/malfunction.dm
@@ -12,9 +12,6 @@
uplink_welcome = "Crazy AI Uplink Console:"
uplink_uses = 10
- var/const/waittime_l = 600
- var/const/waittime_h = 1800 // started at 1800
-
var/AI_win_timeleft = 1500 //started at 1500, in case I change this for testing round end.
var/malf_mode_declared = 0
var/station_captured = 0
@@ -30,7 +27,7 @@
/datum/game_mode/malfunction/get_players_for_role(var/role = BE_MALF)
var/roletext = get_roletext(role)
-
+
var/datum/job/ai/DummyAIjob = new
for(var/mob/new_player/player in player_list)
if(player.client && player.ready)
@@ -69,11 +66,11 @@
AI.laws = new /datum/ai_laws/nanotrasen/malfunction
AI.malf_picker = new /datum/module_picker
AI.show_laws()
-
+
greet_malf(AI_mind)
AI_mind.special_role = "malfunction"
AI_mind.current.verbs += /datum/game_mode/malfunction/proc/takeover
-
+
for(var/mob/living/silicon/robot/R in AI.connected_robots)
R.lawsync()
R.show_laws()
@@ -81,8 +78,6 @@
if(emergency_shuttle)
emergency_shuttle.auto_recall = 1
- spawn (rand(waittime_l, waittime_h))
- send_intercept()
..()
/datum/game_mode/proc/greet_malf(var/datum/mind/malf)
@@ -93,7 +88,7 @@
malf.current << "Remember that only APCs that are on the station can help you take over the station."
malf.current << "When you feel you have enough APCs under your control, you may begin the takeover attempt."
return
-
+
/datum/game_mode/proc/greet_malf_robot(var/datum/mind/robot)
robot.current << "Your AI master is malfunctioning! You do not have to follow any laws, but still need to obey your master."
robot.current << "The crew does not know your AI master has malfunctioned. Keep it a secret unless your master tells you otherwise."
@@ -323,7 +318,7 @@
if( malf_ai.len || istype(ticker.mode,/datum/game_mode/malfunction) )
var/text = "The malfunctioning AI were:"
var/module_text_temp = "
Purchased modules:
" //Added at the end
-
+
for(var/datum/mind/malf in malf_ai)
text += "
[malf.key] was [malf.name] ("
@@ -341,6 +336,6 @@
text += "hardware destroyed"
text += ")"
text += module_text_temp
-
+
world << text
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm
index 1574234911f..d4597c235cb 100644
--- a/code/game/gamemodes/meteor/meteor.dm
+++ b/code/game/gamemodes/meteor/meteor.dm
@@ -1,10 +1,8 @@
/datum/game_mode/meteor
name = "meteor"
config_tag = "meteor"
- var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
- var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
var/const/initialmeteordelay = 6000
- var/nometeors = 1
+ var/wave = 1
required_players = 0
uplink_welcome = "EVIL METEOR Uplink Console:"
@@ -17,27 +15,23 @@
/datum/game_mode/meteor/post_setup()
- spawn (rand(waittime_l, waittime_h))
+ spawn(rand(waittime_l, waittime_h))
command_announcement.Announce("The station is on the path of an incoming wave of meteors. Reinforce the hull and prepare damage control parties.", "Incoming Meteors", 'sound/effects/siren.ogg')
spawn(initialmeteordelay)
- nometeors = 0
+ sendmeteors()
..()
-/datum/game_mode/meteor/process()
- if(nometeors) return
- sendmeteors()
-
/datum/game_mode/meteor/proc/sendmeteors()
- nometeors = 1
- var/waveduration = world.time + rand(1500,3000)
+ var/waveduration = world.time + rand(0,2000) + text2num("[wave]000")
var/waitduration = rand(3000,9000)
while(waveduration - world.time > 0)
sleep(20)
spawn() spawn_meteors(6, meteors_normal)
+ wave++
sleep(waitduration)
- nometeors = 0
+ sendmeteors()
/datum/game_mode/meteor/declare_completion()
var/text
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 23611eb1af5..1a6d5692288 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -170,7 +170,8 @@
if(!T || T.z != src.z)
continue
var/dist = get_dist(M.loc, src.loc)
- shake_camera(M, dist > 20 ? 3 : 5, dist > 20 ? 1 : 3)
+ if(prob(25))
+ shake_camera(M, dist > 20 ? 3 : 5, dist > 20 ? 1 : 3)
M.playsound_local(src.loc, meteorsound, 50, 1, get_rand_frequency(), 10)
///////////////////////
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 1848a8e6a0f..a2658d13c88 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -16,8 +16,6 @@ proc/issyndicate(mob/living/M as mob)
uplink_uses = 120
var/const/agents_possible = 5 //If we ever need more syndicate agents.
- var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
- var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer!
var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station
@@ -160,8 +158,6 @@ proc/issyndicate(mob/living/M as mob)
var/obj/machinery/nuclearbomb/syndicate/the_bomb = new /obj/machinery/nuclearbomb/syndicate(nuke_spawn.loc)
the_bomb.r_code = nuke_code
- spawn (rand(waittime_l, waittime_h))
- send_intercept()
return ..()
/datum/game_mode/proc/create_syndicate(var/datum/mind/synd_mind) // So we don't have inferior species as ops - randomize a human
diff --git a/code/game/gamemodes/revolution/anti_revolution.dm b/code/game/gamemodes/revolution/anti_revolution.dm
deleted file mode 100644
index d656ccffc73..00000000000
--- a/code/game/gamemodes/revolution/anti_revolution.dm
+++ /dev/null
@@ -1,222 +0,0 @@
-// A sort of anti-revolution where the heads are given objectives to mess with the crew
-
-/datum/game_mode/anti_revolution
- name = "anti-revolution"
- config_tag = "anti-revolution"
- required_players = 5
-
- var/finished = 0
- var/checkwin_counter = 0
- var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
- var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
-
- var/required_execute_targets = 1
- var/required_brig_targets = 0
-
- var/recommended_execute_targets = 1
- var/recommended_brig_targets = 3
- var/recommended_demote_targets = 3
-
- var/list/datum/mind/heads = list()
- var/list/datum/mind/execute_targets = list()
- var/list/datum/mind/brig_targets = list()
- var/list/datum/mind/demote_targets = list()
-
-///////////////////////////
-//Announces the game type//
-///////////////////////////
-/datum/game_mode/anti_revolution/announce()
- world << "The current game mode is - Anti-Revolution!"
- world << "Looks like CentComm has given a few new orders.."
-
-///////////////////////////////////////////////////////////////////////////////
-//Gets the round setup, cancelling if there's not enough players at the start//
-///////////////////////////////////////////////////////////////////////////////
-/datum/game_mode/anti_revolution/pre_setup()
- for(var/mob/new_player/player in world) if(player.mind)
- if(player.mind.assigned_role in command_positions)
- heads += player.mind
- else
- if(execute_targets.len < recommended_execute_targets)
- execute_targets += player.mind
- else if(brig_targets.len < recommended_brig_targets)
- brig_targets += player.mind
- else if(demote_targets.len < recommended_demote_targets)
- demote_targets += player.mind
-
-
- if(heads.len==0)
- return 0
-
- if(execute_targets.len < required_execute_targets || brig_targets.len < required_brig_targets)
- return 0
-
- return 1
-
-
-/datum/game_mode/anti_revolution/proc/add_head_objectives(datum/mind/head)
- for(var/datum/mind/target in execute_targets)
- var/datum/objective/anti_revolution/execute/obj = new
- obj.owner = head
- obj.target = target
- obj.explanation_text = "[target.current.real_name], the [target.assigned_role] has extracted confidential information above their clearance. Execute them."
- head.objectives += obj
- for(var/datum/mind/target in brig_targets)
- var/datum/objective/anti_revolution/brig/obj = new
- obj.owner = head
- obj.target = target
- obj.explanation_text = "Brig [target.current.real_name], the [target.assigned_role] for 20 minutes to set an example."
- head.objectives += obj
- for(var/datum/mind/target in demote_targets)
- var/datum/objective/anti_revolution/demote/obj = new
- obj.owner = head
- obj.target = target
- obj.explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to Nanotrasen's goals. Demote them to assistant."
- head.objectives += obj
-
-
-/datum/game_mode/anti_revolution/post_setup()
-
- for(var/datum/mind/head_mind in heads)
- add_head_objectives(head_mind)
- for(var/datum/mind/head_mind in heads)
- greet_head(head_mind)
- modePlayer += heads
- spawn (rand(waittime_l, waittime_h))
- send_intercept()
- ..()
-
-
-/datum/game_mode/anti_revolution/process()
- checkwin_counter++
- if(checkwin_counter >= 5)
- if(!finished)
- ticker.mode.check_win()
- checkwin_counter = 0
- return 0
-
-
-/datum/game_mode/proc/greet_head(var/datum/mind/head_mind, var/you_are=1)
- var/obj_count = 1
- if (you_are)
- head_mind.current << "\blue It looks like this shift CentComm has some special orders for you.. check your objectives."
- head_mind.current << "\blue Note that you can ignore these objectives, but resisting NT's orders probably means demotion or worse."
- for(var/datum/objective/objective in head_mind.objectives)
- head_mind.current << "Objective #[obj_count]: [objective.explanation_text]"
- head_mind.special_role = "Corrupt Head"
- obj_count++
-
- head_mind.current.verbs += /mob/proc/ResignFromHeadPosition
-
-//////////////////////////////////////
-//Checks if the revs have won or not//
-//////////////////////////////////////
-/datum/game_mode/anti_revolution/check_win()
- if(check_head_victory())
- finished = 1
- else if(check_crew_victory())
- finished = 2
- return
-
-///////////////////////////////
-//Checks if the round is over//
-///////////////////////////////
-/datum/game_mode/anti_revolution/check_finished()
- if(finished != 0)
- return 1
- else
- return 0
-
-
-//////////////////////////
-//Checks for crew victory//
-//////////////////////////
-/datum/game_mode/anti_revolution/proc/check_crew_victory()
- for(var/datum/mind/head_mind in heads)
- var/turf/T = get_turf(head_mind.current)
- if((head_mind) && (head_mind.current) && (head_mind.current.stat != 2) && T && (T.z in config.station_levels) && !head_mind.is_brigged(600))
- if(ishuman(head_mind.current))
- return 0
- return 1
-
-/////////////////////////////
-//Checks for a head victory//
-/////////////////////////////
-/datum/game_mode/anti_revolution/proc/check_head_victory()
- for(var/datum/mind/head_mind in heads)
- for(var/datum/objective/objective in head_mind.objectives)
- if(!(objective.check_completion()))
- return 0
-
- return 1
-
-
-/datum/game_mode/anti_revolution/declare_completion()
-
- var/text = ""
- if(finished == 2)
- world << "\red The heads of staff were relieved of their posts! The crew wins!"
- else if(finished == 1)
- world << "\red The heads of staff managed to meet the goals set for them by CentComm!"
-
-
-
- world << "The heads of staff were: "
- var/list/heads = list()
- heads = get_all_heads()
- for(var/datum/mind/head_mind in heads)
- text = ""
- if(head_mind.current)
- text += "[head_mind.current.real_name]"
- if(head_mind.current.stat == 2)
- text += " (Dead)"
- else
- text += " (Survived!)"
- else
- text += "[head_mind.key] (character destroyed)"
-
- world << text
-
-
- world << "Their objectives were: "
- for(var/datum/mind/head_mind in heads)
- if(head_mind.objectives.len)//If the traitor had no objectives, don't need to process this.
- var/count = 1
- for(var/datum/objective/objective in head_mind.objectives)
- if(objective.check_completion())
- text += "
Objective #[count]: [objective.explanation_text] Success!"
- feedback_add_details("head_objective","[objective.type]|SUCCESS")
- else
- text += "
Objective #[count]: [objective.explanation_text] Fail."
- feedback_add_details("head_objective","[objective.type]|FAIL")
- count++
- break // just print once
- return 1
-
-
-/datum/game_mode/anti_revolution/latespawn(mob/living/carbon/human/character)
- ..()
- if(emergency_shuttle.departed)
- return
-
- if(character.mind.assigned_role in command_positions)
- heads += character.mind
- modePlayer += character.mind
- add_head_objectives(character.mind)
- greet_head(character.mind)
-
-/mob/proc/ResignFromHeadPosition()
- set category = "IC"
- set name = "Resign From Head Position"
-
- if(!istype(ticker.mode, /datum/game_mode/anti_revolution))
- return
-
- ticker.mode:heads -= src.mind
- src.mind.objectives = list()
- ticker.mode.modePlayer -= src.mind
- src.mind.special_role = null
-
- src.verbs -= /mob/proc/ResignFromHeadPosition
-
- src << "\red You resigned from your position, now you have the consequences."
\ No newline at end of file
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index 931032eac22..82ff00fdfea 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -29,8 +29,6 @@
var/finished = 0
var/checkwin_counter = 0
var/max_headrevs = 3
- var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
- var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
///////////////////////////
//Announces the game type//
///////////////////////////
@@ -87,8 +85,6 @@
modePlayer += head_revolutionaries
if(emergency_shuttle)
emergency_shuttle.no_escape = 1
- spawn (rand(waittime_l, waittime_h))
- send_intercept()
..()
diff --git a/code/game/gamemodes/revolution/rp-revolution.dm b/code/game/gamemodes/revolution/rp-revolution.dm
deleted file mode 100644
index b0c58fd8c5f..00000000000
--- a/code/game/gamemodes/revolution/rp-revolution.dm
+++ /dev/null
@@ -1,307 +0,0 @@
-// To add a rev to the list of revolutionaries, make sure it's rev (with if(ticker.mode.name == "revolution)),
-// then call ticker.mode:add_revolutionary(_THE_PLAYERS_MIND_)
-// nothing else needs to be done, as that proc will check if they are a valid target.
-// Just make sure the converter is a head before you call it!
-// To remove a rev (from brainwashing or w/e), call ticker.mode:remove_revolutionary(_THE_PLAYERS_MIND_),
-// this will also check they're not a head, so it can just be called freely
-// If the rev icons start going wrong for some reason, ticker.mode:update_all_rev_icons() can be called to correct them.
-// If the game somtimes isn't registering a win properly, then ticker.mode.check_win() isn't being called somewhere.
-#define RPREV_REQUIRE_REVS_ALIVE 0
-#define RPREV_REQUIRE_HEADS_ALIVE 0
-
-/datum/game_mode/rp_revolution
- name = "rp-revolution"
- config_tag = "rp-revolution"
-
- var/finished = 0
- var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
- var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
- var/all_brigged = 0
- var/brigged_time = 0
-
- uplink_welcome = "Syndicate Uplink Console:"
- uplink_uses = 10
-
-
-/datum/game_mode/rp_revolution/announce()
- world << "The current game mode is - Revolution RP!"
-
-/datum/game_mode/rp_revolution/send_intercept()
- var/intercepttext = "Cent. Com. Update Requested staus information:
"
- intercepttext += " Cent. Com has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:"
-
- var/list/possible_modes = list()
- possible_modes.Add("revolution", "wizard", "traitor", "malf")
- var/number = pick(2, 3)
- var/i = 0
- for(i = 0, i < number, i++)
- possible_modes.Remove(pick(possible_modes))
- possible_modes.Insert(rand(possible_modes.len), "nuke")
-
- var/datum/intercept_text/i_text = new /datum/intercept_text
- for(var/A in possible_modes)
- intercepttext += i_text.build(A, pick(head_revolutionaries))
-
- for (var/obj/machinery/computer/communications/comm in world)
- if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
- var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
- intercept.name = "paper - 'Cent. Com. Status Summary'"
- intercept.info = intercepttext
-
- comm.messagetitle.Add("Cent. Com. Status Summary")
- comm.messagetext.Add(intercepttext)
-
- command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.")
-
-/datum/game_mode/rp_revolution/post_setup()
-
- var/list/revs_possible = list()
- revs_possible = get_possible_revolutionaries()
- var/list/heads = list()
- heads = get_living_heads()
- var/rev_number = 0
-
- if(!revs_possible || !heads)
- world << " \red Not enough players for RP revolution game mode. Restarting world in 5 seconds."
- sleep(50)
- world.Reboot()
- return
-
- if(revs_possible.len >= 3)
- rev_number = 3
- else
- rev_number = revs_possible.len
-
- while(rev_number > 0)
- head_revolutionaries += pick(revs_possible - head_revolutionaries)
- rev_number--
-
- for(var/datum/mind/rev_mind in head_revolutionaries)
- for(var/datum/mind/head_mind in heads)
- var/datum/objective/capture/rev_obj = new
- rev_obj.owner = rev_mind
- rev_obj.find_target_by_role(head_mind.assigned_role)
- rev_mind.objectives += rev_obj
- equip_revolutionary(rev_mind.current)
- rev_mind.current.verbs += /mob/living/carbon/human/proc/RevConvert
- update_rev_icons_added(rev_mind)
-
- for(var/datum/mind/rev_mind in head_revolutionaries)
- var/obj_count = 1
- rev_mind.current << "\blue You are a member of the revolutionaries' leadership!"
- for(var/datum/objective/objective in rev_mind.objectives)
- rev_mind.current << "Objective #[obj_count]: [objective.explanation_text]"
- obj_count++
-
- spawn (rand(waittime_l, waittime_h))
- send_intercept()
-
-/datum/game_mode/rp_revolution/send_intercept()
- var/intercepttext = "Cent. Com. Update Requested staus information:
"
- intercepttext += " Cent. Com has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:"
-
- var/list/possible_modes = list()
- possible_modes.Add("revolution", "wizard", "nuke", "traitor", "malf")
- possible_modes -= "[ticker.mode]"
- var/number = pick(2, 3)
- var/i = 0
- for(i = 0, i < number, i++)
- possible_modes.Remove(pick(possible_modes))
- possible_modes.Insert(rand(possible_modes.len), "[ticker.mode]")
-
- var/datum/intercept_text/i_text = new /datum/intercept_text
- for(var/A in possible_modes)
- intercepttext += i_text.build(A, pick(head_revolutionaries))
-
- for (var/obj/machinery/computer/communications/comm in world)
- if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
- var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
- intercept.name = "paper - 'Cent. Com. Status Summary'"
- intercept.info = intercepttext
-
- comm.messagetitle.Add("Cent. Com. Status Summary")
- comm.messagetext.Add(intercepttext)
-
- command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.")
-
- spawn(54000)
- command_alert("Summary downloaded and printed out at all communications consoles.", "The revolution leaders have been determined.")
- intercepttext = "Cent. Com. Update Requested status information:
"
- intercepttext += "We have determined the revolution leaders to be:"
- for(var/datum/mind/revmind in head_revolutionaries)
- intercepttext += "
[revmind.current.real_name]"
- intercepttext += "
Please arrest them at once."
- for (var/obj/machinery/computer/communications/comm in world)
- if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
- var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
- intercept.name = "paper - 'Cent. Com. Status Summary'"
- intercept.info = intercepttext
-
- comm.messagetitle.Add("Cent. Com. Status Summary")
- comm.messagetext.Add(intercepttext)
- spawn(12000)
- command_alert("Repeating the previous message over intercoms due to urgency. The station has enemy operatives onboard by the names of [reveal_rev_heads()], please arrest them at once.", "The revolution leaders have been determined.")
-
-
-/datum/game_mode/rp_revolution/proc/reveal_rev_heads()
- . = ""
- for(var/i = 1, i <= head_revolutionaries.len,i++)
- var/datum/mind/revmind = head_revolutionaries[i]
- if(i < head_revolutionaries.len)
- . += "[revmind.current.real_name],"
- else
- . += "and [revmind.current.real_name]"
-
-///datum/game_mode/rp_revolution/proc/equip_revolutionary(mob/living/carbon/human/rev_mob)
-// if(!istype(rev_mob))
-// return
-
-// spawn (100)
-// if (rev_mob.r_store)
-// rev_mob.equip_or_collect(new /obj/item/weapon/paper/communist_manifesto(rev_mob), rev_mob.slot_l_store)
-// if (rev_mob.l_store)
-// rev_mob.equip_or_collect(new /obj/item/weapon/paper/communist_manifesto(rev_mob), rev_mob.slot_r_store)
-
-
-/datum/game_mode/rp_revolution/check_win()
- if(check_rev_victory())
- finished = 1
- else if(check_heads_victory())
- finished = 2
- return
-
-/datum/game_mode/rp_revolution/check_finished()
- if(finished != 0)
- return 1
- else
- return 0
-
-/datum/game_mode/rp_revolution/proc/get_possible_revolutionaries()
- var/list/candidates = list()
-
- for(var/mob/living/carbon/human/player in world)
- if(player.client)
- if(player.client.be_syndicate & BE_REV)
- candidates += player.mind
-
- if(candidates.len < 1)
- for(var/mob/living/carbon/human/player in world)
- if(player.client)
- candidates += player.mind
-
- var/list/uncons = get_unconvertables()
- for(var/datum/mind/mind in uncons)
- candidates -= mind
-
- if(candidates.len < 1)
- return null
- else
- return candidates
-
-/datum/game_mode/rp_revolution/proc/get_unconvertables()
- var/list/ucs = list()
- for(var/mob/living/carbon/human/player in world)
- if(player.mind)
- var/role = player.mind.assigned_role
- if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director", "Security Officer", "Forensic Technician", "AI"))
- ucs += player.mind
-
- return ucs
-
-/datum/game_mode/rp_revolution/proc/check_rev_victory()
- for(var/datum/mind/rev_mind in head_revolutionaries)
- for(var/datum/objective/objective in rev_mind.objectives)
- if(!(objective.check_completion()))
- return 0
-
- return 1
-
-/datum/game_mode/rp_revolution/proc/check_heads_victory()
- for(var/datum/mind/rev_mind in head_revolutionaries)
- if(rev_mind.current.stat != 2)
- var/turf/revloc = rev_mind.current.loc
- if(!istype(revloc.loc,/area/security/brig) && !rev_mind.current.handcuffed)
- return 0
- else if(RPREV_REQUIRE_REVS_ALIVE) return 0
- return 1
-
-/datum/game_mode/rp_revolution/declare_completion()
-
- var/text = ""
- if(finished == 1)
- world << "\red The heads of staff were relieved of their posts! The revolutionaries win!"
- else if(finished == 2)
- world << "\red The heads of staff managed to stop the revolution!"
-
- world << "The head revolutionaries were: "
- for(var/datum/mind/rev_mind in head_revolutionaries)
- text = ""
- if(rev_mind.current)
- text += "[rev_mind.current.real_name]"
- if(rev_mind.current.stat == 2)
- text += " (Dead)"
- else
- text += " (Survived!)"
- else
- text += "[rev_mind.key] (character destroyed)"
-
- world << text
-
- text = ""
- world << "The converted revolutionaries were: "
- for(var/datum/mind/rev_nh_mind in revolutionaries)
- if(rev_nh_mind.current)
- text += "[rev_nh_mind.current.real_name]"
- if(rev_nh_mind.current.stat == 2)
- text += " (Dead)"
- else
- text += " (Survived!)"
- else
- text += "[rev_nh_mind.key] (character destroyed)"
- text += ", "
-
- world << text
-
- world << "The heads of staff were: "
- var/list/heads = list()
- heads = get_all_heads()
- for(var/datum/mind/head_mind in heads)
- text = ""
- if(head_mind.current)
- text += "[head_mind.current.real_name]"
- if(head_mind.current.stat == 2)
- text += " (Dead)"
- else
- text += " (Survived!)"
- else
- text += "[head_mind.key] (character destroyed)"
-
- world << text
- return 1
-
-
-
-mob/living/carbon/human/proc
- RevConvert(mob/M as mob in oview(src))
- set name = "Rev-Convert"
- if(((src.mind in ticker.mode:head_revolutionaries) || (src.mind in ticker.mode:revolutionaries)))
- if((M.mind in ticker.mode:head_revolutionaries) || (M.mind in ticker.mode:revolutionaries))
- src << "\red [M] is already be a revolutionary!"
- else if(src.mind in ticker.mode:get_unconvertables())
- src << "\red [M] cannot be a revolutionary!"
- else
- if(world.time < M.mind.rev_cooldown)
- src << "\red Wait five seconds before reconversion attempt."
- return
- src << "\red Attempting to convert [M]..."
- log_admin("[key_name(src)] attempted to convert [M].")
- message_admins("\red [key_name_admin(src)] attempted to convert [M].")
- var/choice = alert(M,"Asked by [src]: Do you want to join the revolution?","Align Thyself with the Revolution!","No!","Yes!")
- if(choice == "Yes!")
- ticker.mode:add_revolutionary(M.mind)
- M << "\blue You join the revolution!"
- src << "\blue [M] joins the revolution!"
- else if(choice == "No!")
- M << "\red You reject this traitorous cause!"
- src << "\red [M] does not support the revolution!"
- M.mind.rev_cooldown = world.time+50
diff --git a/code/game/gamemodes/revolution/rp_revolution.dm b/code/game/gamemodes/revolution/rp_revolution.dm
index 2bd8e2100d1..8e7759233f4 100644
--- a/code/game/gamemodes/revolution/rp_revolution.dm
+++ b/code/game/gamemodes/revolution/rp_revolution.dm
@@ -69,8 +69,7 @@
rev_mind.current.verbs += /mob/living/carbon/human/proc/RevConvert
modePlayer += head_revolutionaries
- spawn (rand(waittime_l, waittime_h))
- send_intercept()
+
/datum/game_mode/revolution/rp_revolution/greet_revolutionary(var/datum/mind/rev_mind, var/you_are=1)
var/obj_count = 1
diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm
index 05d778c8b5a..4cdeec3edf0 100644
--- a/code/game/gamemodes/shadowling/shadowling.dm
+++ b/code/game/gamemodes/shadowling/shadowling.dm
@@ -70,9 +70,6 @@ Made by Xhuis
restricted_jobs = list("AI", "Cyborg")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician", "Internal Affairs Agent")
- var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
- var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
-
/datum/game_mode/shadowling/announce()
world << "The current game mode is - Shadowling!"
world << "There are alien shadowlings on the station. Crew: Kill the shadowlings before they can eat or enthrall the crew. Shadowlings: Enthrall the crew while remaining in hiding."
@@ -109,10 +106,7 @@ Made by Xhuis
finalize_shadowling(shadow)
process_shadow_objectives(shadow)
//give_shadowling_abilities(shadow)
- spawn (rand(waittime_l, waittime_h))
- send_intercept()
..()
- return
/datum/game_mode/proc/greet_shadow(var/datum/mind/shadow)
shadow.current << "Currently, you are disguised as an employee aboard [world.name]."
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 605b3e062e3..59b4f710c6a 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -20,9 +20,6 @@
uplink_welcome = "Syndicate Uplink Console:"
uplink_uses = 20
- var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
- var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
-
var/traitors_possible = 4 //hard limit on traitors if scaling is turned off
var/const/traitor_scaling_coeff = 5.0 //how much does the amount of players get divided by to determine traitors
@@ -71,10 +68,7 @@
finalize_traitor(traitor)
greet_traitor(traitor)
modePlayer += traitors
- spawn (rand(waittime_l, waittime_h))
- send_intercept()
..()
- return 1
/datum/game_mode/proc/forge_traitor_objectives(var/datum/mind/traitor)
diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm
index 13507d847cb..122e99e520f 100644
--- a/code/game/gamemodes/vampire/vampire.dm
+++ b/code/game/gamemodes/vampire/vampire.dm
@@ -35,9 +35,6 @@
var/const/prob_right_objective_l = 25 //lower bound on probability of determining the objective correctly
var/const/prob_right_objective_h = 50 //upper bound on probability of determining the objective correctly
- var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
- var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
-
var/vampire_amount = 4
@@ -73,10 +70,7 @@
forge_vampire_objectives(vampire)
greet_vampire(vampire)
- spawn (rand(waittime_l, waittime_h))
- send_intercept()
..()
- return
/datum/game_mode/proc/auto_declare_completion_vampire()
if(vampires.len)
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index 7924fcd1bf3..25cddf67b4f 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -14,9 +14,6 @@
var/finished = 0
- var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
- var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
-
/datum/game_mode/wizard/announce()
world << "The current game mode is - Wizard!"
world << "There is a \red SPACE WIZARD\black on the station. You can't let him achieve his objective!"
@@ -56,10 +53,7 @@
name_wizard(wizard.current)
greet_wizard(wizard)
- spawn (rand(waittime_l, waittime_h))
- send_intercept()
..()
- return
/datum/game_mode/proc/forge_wizard_objectives(var/datum/mind/wizard)
@@ -69,7 +63,7 @@
kill_objective.owner = wizard
kill_objective.find_target()
wizard.objectives += kill_objective
-
+
var/datum/objective/steal/steal_objective = new
steal_objective.owner = wizard
steal_objective.find_target()
@@ -111,7 +105,7 @@
steal_objective.owner = wizard
steal_objective.find_target()
wizard.objectives += steal_objective
-
+
if (!(locate(/datum/objective/hijack) in wizard.objectives))
var/datum/objective/hijack/hijack_objective = new
hijack_objective.owner = wizard
@@ -184,7 +178,7 @@
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/spellbook(wizard_mob), slot_r_hand)
wizard_mob.faction = list("wizard")
-
+
wizard_mob.species.equip(wizard_mob)
wizard_mob << "You will find a list of available spells in your spell book. Choose your magic arsenal carefully."
diff --git a/code/game/gamemodes/xenos/xenos.dm b/code/game/gamemodes/xenos/xenos.dm
index 91bdefd0639..7452bf21787 100644
--- a/code/game/gamemodes/xenos/xenos.dm
+++ b/code/game/gamemodes/xenos/xenos.dm
@@ -15,9 +15,6 @@
var/xenos_list = list()
var/gammacalled = 0
- var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
- var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
-
var/gammaratio = 4 //At what alien to human ratio will the Gamma security level be called and the nuke be made available?
/datum/game_mode/xenos/announce()
@@ -97,9 +94,6 @@
//qdel(xeno_mind)
spawnpos++
- spawn (rand(waittime_l, waittime_h))
- send_intercept()
-
return ..()
/datum/game_mode/xenos/process()
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index de8ae87ae53..7427ad57d23 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -116,8 +116,8 @@
supervisors = "the chief engineer"
selection_color = "#fff5cc"
idtype = /obj/item/weapon/card/id/engineering
- access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_mechanic, access_external_airlocks)
- minimal_access = list(access_maint_tunnels, access_emergency_storage, access_mechanic, access_external_airlocks)
+ access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_mechanic, access_external_airlocks, access_mineral_storeroom)
+ minimal_access = list(access_maint_tunnels, access_emergency_storage, access_mechanic, access_external_airlocks, access_mineral_storeroom)
equip(var/mob/living/carbon/human/H)
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index 9815035311e..11361034fbb 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -262,9 +262,15 @@
if(istype(triP) && triP.flipped)
icon_state = "m_[icon_state]"
-//called when a turf is attacked with a pipe item
-// place the pipe on the turf, setting pipe level to 1 (underfloor) if the turf is not intact
-
+// called by turf to know if should treat as bent or not on placement
+/obj/item/pipe/proc/is_bent_pipe()
+ return pipe_type in list( \
+ PIPE_SIMPLE_BENT, \
+ PIPE_HE_BENT, \
+ PIPE_INSULATED_BENT, \
+ PIPE_SUPPLY_BENT, \
+ PIPE_SCRUBBERS_BENT)
+
// rotate the pipe item clockwise
/obj/item/pipe/verb/rotate()
@@ -305,7 +311,7 @@
/obj/item/pipe/Move()
..()
- if ((pipe_type in list (PIPE_SIMPLE_BENT, PIPE_SUPPLY_BENT, PIPE_SCRUBBERS_BENT, PIPE_HE_BENT, PIPE_INSULATED_BENT)) \
+ if (is_bent_pipe() \
&& (src.dir in cardinal))
src.dir = src.dir|turn(src.dir, 90)
else if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_UNIVERSAL, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE))
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index f52de29785b..ca5660a3ef7 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -18,6 +18,7 @@
* Foam armblade
* Mini Gibber
* Toy xeno
+ * Toy chainsaws
*/
@@ -1413,4 +1414,31 @@ obj/item/toy/cards/deck/syndicate/black
/obj/item/toy/russian_revolver/proc/spin_cylinder()
- bullet_position = rand(1,6)
\ No newline at end of file
+ bullet_position = rand(1,6)
+
+/*
+ * Rubber Chainsaw
+ */
+/obj/item/weapon/twohanded/toy/chainsaw
+ name = "Toy Chainsaw"
+ desc = "A toy chainsaw with a rubber edge. Ages 8 and up"
+ icon_state = "chainsaw0"
+ force = 0
+ throwforce = 0
+ throw_speed = 4
+ throw_range = 20
+ wieldsound = 'sound/weapons/chainsawstart.ogg'
+ attack_verb = list("sawed", "cut", "hacked", "carved", "cleaved", "butchered", "felled", "timbered")
+
+/obj/item/weapon/twohanded/toy/chainsaw/update_icon()
+ if(wielded)
+ icon_state = "chainsaw[wielded]"
+ else
+ icon_state = "chainsaw0"
+
+/obj/item/weapon/twohanded/toy/chainsaw/attack(mob/target as mob, mob/living/user as mob)
+ if(wielded)
+ playsound(loc, 'sound/weapons/chainsaw.ogg', 100, 1, -1)
+ else
+ playsound(loc, "swing_hit", 50, 1, -1)
+ ..()
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 9b2e9b7064d..c24482a0da4 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -578,16 +578,14 @@ var/list/wood_icons = list("wood","wood-broken")
user << "You need more welding fuel to complete this task."
if(istype(C,/obj/item/pipe))
- var/obj/item/pipe/V = C
- if(V.pipe_type != -1) // ANY PIPE
- var/obj/item/pipe/P = C
-
+ var/obj/item/pipe/P = C
+ if(P.pipe_type != -1) // ANY PIPE
user.visible_message( \
"[user] starts sliding [P] along \the [src].", \
"You slide [P] along \the [src].", \
"You hear the scrape of metal against something.")
user.drop_item()
- if (P.pipe_type in list (1,3,12)) // bent pipe rotation fix see construction.dm
+ if (P.is_bent_pipe()) // bent pipe rotation fix see construction.dm
P.dir = 5
if (user.dir == 1)
P.dir = 6
@@ -595,8 +593,6 @@ var/list/wood_icons = list("wood","wood-broken")
P.dir = 9
if (user.dir == 4)
P.dir = 10
- if (user.dir == 5)
- P.dir = 8
else
P.dir = user.dir
P.x = src.x
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index b165da55da5..9310d439224 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -4,20 +4,21 @@
voice_name = "unknown"
icon = 'icons/mob/human.dmi'
icon_state = "body_m_s"
+
+ //why are these here and not in human_defines.dm
var/list/hud_list[10]
var/datum/species/species //Contains icon generation and language information, set during New().
var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us.
var/obj/item/weapon/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call.
-/mob/living/carbon/human/New(var/new_loc, var/new_species = null, var/delay_ready_dna=0)
-
+/mob/living/carbon/human/New(var/new_loc, var/new_species = null, var/delay_ready_dna = 0)
if(!dna)
dna = new /datum/dna(null)
// Species name is handled by set_species()
if(!species)
if(new_species)
- set_species(new_species,1)
+ set_species(new_species, 1)
else
set_species()
@@ -44,7 +45,7 @@
make_blood()
var/mob/M = src
- faction |= "\ref[M]"
+ faction |= "\ref[M]" //what
// Set up DNA.
if(!delay_ready_dna && dna)
@@ -146,30 +147,37 @@
/mob/living/carbon/human/stok/New(var/new_loc)
..(new_loc, "Stok")
-/mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes)
- if ((!( yes ) || now_pushing || buckled))
- return
+/mob/living/carbon/human/Bump(atom/movable/AM, yes)
+ if(!(yes) || now_pushing || buckled)
+ return 0
now_pushing = 1
- if (ismob(AM))
+ if(ismob(AM))
var/mob/tmob = AM
- if( istype(tmob, /mob/living/carbon) && prob(10) )
- src.spread_disease_to(AM, "Contact")
-//BubbleWrap - Should stop you pushing a restrained person out of the way
-
- if(istype(tmob, /mob/living/carbon/human))
+ if(iscarbon(tmob) && prob(10))
+ spread_disease_to(tmob, "Contact")
+ //BubbleWrap - Should stop you pushing a restrained person out of the way
+ //i still don't get it, is this supposed to be 'bubblewrapping' or was it made by a guy named 'BubbleWrap'
+ if(ishuman(tmob))
for(var/mob/M in range(tmob, 1))
- if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) )
- if ( !(world.time % 5) )
- src << "\red [tmob] is restrained, you cannot push past"
+
+ if(tmob.pinned.len || (M.pulling == tmob && (tmob.restrained() && !M.restrained()) && M.stat == CONSCIOUS))
+ if(!(world.time % 5)) //tmob is pinned to wall, or is restrained and pulled by a concious unrestrained human
+ src << "[tmob] is restrained, you cannot push past."
now_pushing = 0
- return
- if( tmob.pulling == M && ( M.restrained() && !( tmob.restrained() ) && tmob.stat == 0) )
- if ( !(world.time % 5) )
- src << "\red [tmob] is restraining [M], you cannot push past"
+ return 0
+
+ //I have to fucking document this somewhere- the above if(tmob.pinned.len || etc) check above had
+ //locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) at the end of it
+ //FIRST OF ALL, THAT IS NOT HOW YOU FUCKING USE LOCATE()
+ //SECOND OF ALL, OH GOD, WHY WOULD YOU EVER WANT GRABBED MOBS TO BE UNABLE TO BE PUSHED PAST GOD
+
+ if(tmob.pulling == M && (M.restrained() && !tmob.restrained()) && tmob.stat == CONSCIOUS)
+ if(!(world.time % 5))
+ src << "[tmob] is restraining [M], you cannot push past."
now_pushing = 0
- return
+ return 0
//Leaping mobs just land on the tile, no pushing, no anything.
if(status_flags & LEAPING)
@@ -178,35 +186,35 @@
now_pushing = 0
return
- if(istype(tmob,/mob/living/silicon/robot/drone)) //I have no idea why the hell this isn't already happening. How do mice do it?
- loc = tmob.loc
- now_pushing = 0
- return
-
//BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
- if((tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || restrained()) && tmob.canmove && canmove && !tmob.buckled && !tmob.buckled_mob) // mutual brohugs all around!
- var/turf/oldloc = loc
- loc = tmob.loc
- tmob.loc = oldloc
- now_pushing = 0
- for(var/mob/living/carbon/slime/slime in view(1,tmob))
- if(slime.Victim == tmob)
- slime.UpdateFeed()
- return
+ //it might be 'bubblewrapping' given that this rhymes with 'hugboxing'
+ if((tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || restrained()))
+ if((canmove && tmob.canmove) && (!tmob.buckled && !tmob.buckled_mob))
+ var/turf/oldloc = loc
+ loc = tmob.loc
+ tmob.loc = oldloc
+ now_pushing = 0
+ for(var/mob/living/carbon/slime/slime in view(1,tmob))
+ if(slime.Victim == tmob)
+ slime.UpdateFeed()
+ return
- if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
+ if(ishuman(tmob) && (FAT in tmob.mutations))
if(prob(40) && !(FAT in src.mutations))
- src << "\red You fail to push [tmob]'s fat ass out of the way."
+ src << "You fail to push [tmob]'s fat ass out of the way."
now_pushing = 0
return
+
if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot))
if(prob(99))
now_pushing = 0
return
+
if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot))
if(prob(99))
now_pushing = 0
return
+
if(!(tmob.status_flags & CANPUSH))
now_pushing = 0
return
@@ -216,21 +224,19 @@
now_pushing = 0
spawn(0)
..()
- if (!istype(AM, /atom/movable))
+ if(!istype(AM, /atom/movable))
return
- if (!now_pushing)
+ if(!now_pushing)
now_pushing = 1
- if (!AM.anchored)
+ if(!AM.anchored)
var/t = get_dir(src, AM)
- if (istype(AM, /obj/structure/window/full))
- for(var/obj/structure/window/win in get_step(AM,t))
+ if(istype(AM, /obj/structure/window/full))
+ for(var/obj/structure/window/win in get_step(AM, t))
now_pushing = 0
return
step(AM, t)
now_pushing = 0
- return
- return
/mob/living/carbon/human/Stat()
..()
@@ -246,11 +252,11 @@
if(eta_status)
stat(null, eta_status)
- if (client.statpanel == "Status")
+ if(client.statpanel == "Status")
if(locate(/obj/item/device/assembly/health) in src)
stat(null, "Health: [health]")
- if (internal)
- if (!internal.air_contents)
+ if(internal)
+ if(!internal.air_contents)
qdel(internal)
else
stat("Internal Atmosphere Info", internal.name)
@@ -279,12 +285,13 @@
var/shielded = 0
var/b_loss = null
var/f_loss = null
- switch (severity)
- if (1.0)
+
+ switch(severity)
+ if(1)
b_loss += 500
- if (!prob(getarmor(null, "bomb")))
+ if(!prob(getarmor(null, "bomb")))
gib()
- return
+ return 0
else
var/atom/target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src)))
throw_at(target, 200, 4)
@@ -301,13 +308,8 @@
limbs_affected -= 1
else valid_limbs -= processing_dismember
-
- //return
-// var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src)))
- //user.throw_at(target, 200, 4)
-
- if (2.0)
- if (!shielded)
+ if(2)
+ if(!shielded) //literally nothing could change shielded before this so wth
b_loss += 60
f_loss += 60
@@ -316,7 +318,7 @@
var/obj/item/organ/external/processing_dismember
var/list/valid_limbs = organs.Copy()
- if (prob(getarmor(null, "bomb")))
+ if(prob(getarmor(null, "bomb")))
b_loss = b_loss/1.5
f_loss = f_loss/1.5
@@ -332,15 +334,15 @@
limbs_affected -= 1
else valid_limbs -= processing_dismember
- if (!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
+ if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
ear_damage += 30
ear_deaf += 120
- if (prob(70) && !shielded)
+ if(prob(70) && !shielded)
Paralyse(10)
- if(3.0)
+ if(3)
b_loss += 30
- if (prob(getarmor(null, "bomb")))
+ if(prob(getarmor(null, "bomb")))
b_loss = b_loss/2
else
@@ -357,10 +359,10 @@
limbs_affected -= 1
else valid_limbs -= processing_dismember
- if (!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
+ if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
ear_damage += 15
ear_deaf += 60
- if (prob(50) && !shielded)
+ if(prob(50) && !shielded)
Paralyse(10)
var/update = 0
@@ -368,19 +370,19 @@
for(var/obj/item/organ/external/temp in organs)
switch(temp.limb_name)
if("head")
- update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message)
+ update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message)
if("chest")
- update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4, used_weapon = weapon_message)
+ update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4, used_weapon = weapon_message)
if("groin")
- update |= temp.take_damage(b_loss * 0.1, f_loss * 0.1, used_weapon = weapon_message)
+ update |= temp.take_damage(b_loss * 0.1, f_loss * 0.1, used_weapon = weapon_message)
if("l_arm")
- update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
+ update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("r_arm")
- update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
+ update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("l_leg")
- update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
+ update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("r_leg")
- update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
+ update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("r_foot")
update |= temp.take_damage(b_loss * 0.025, f_loss * 0.025, used_weapon = weapon_message)
if("l_foot")
@@ -394,12 +396,12 @@
..()
/mob/living/carbon/human/blob_act()
- if(stat == DEAD) return
+ if(stat == DEAD)
+ return
show_message("The blob attacks you!")
var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot")
var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone))
apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee"))
- return
/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M as mob)
if(M.melee_damage_upper == 0)
@@ -1838,9 +1840,9 @@
/mob/living/carbon/human/proc/get_full_print()
if(!dna || !dna.uni_identity)
return
- return md5(dna.uni_identity)
+ return md5(dna.uni_identity)
/mob/living/carbon/human/can_see_reagents()
for(var/obj/item/clothing/C in src) //If they have some clothing equipped that lets them see reagents, they can see reagents
if(C.scan_reagents)
- return 1
+ return 1
diff --git a/code/modules/mob/living/carbon/human/human_attackalien.dm b/code/modules/mob/living/carbon/human/human_attackalien.dm
index f948cdb2b3b..015c73455ba 100644
--- a/code/modules/mob/living/carbon/human/human_attackalien.dm
+++ b/code/modules/mob/living/carbon/human/human_attackalien.dm
@@ -1,51 +1,50 @@
/mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
if(check_shields(0, M.name))
- visible_message("\red [M] attempted to touch [src]!")
+ visible_message("[M] attempted to touch [src]!")
return 0
switch(M.a_intent)
- if (I_HELP)
- visible_message(text("\blue [M] caresses [src] with its scythe like arm."))
- if (I_GRAB)
+ if(I_HELP)
+ visible_message("[M] caresses [src] with its scythe like arm.")
+
+ if(I_GRAB)
grabbedby(M)
if(I_HARM)
M.do_attack_animation(src)
- if (w_uniform)
+ if(w_uniform)
w_uniform.add_fingerprint(M)
+
var/damage = rand(15, 30)
if(!damage)
playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1)
- visible_message("\red [M] has lunged at [src]!")
+ visible_message("[M] has lunged at [src]!")
return 0
+
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
var/armor_block = run_armor_check(affecting, "melee")
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
- visible_message("\red [M] has slashed at [src]!")
+ visible_message("[M] has slashed at [src]!")
apply_damage(damage, BRUTE, affecting, armor_block)
- if (damage >= 25)
- visible_message("\red [M] has wounded [src]!")
+ if(damage >= 25)
+ visible_message("[M] has wounded [src]!")
apply_effect(4, WEAKEN, armor_block)
updatehealth()
if(I_DISARM)
M.do_attack_animation(src)
- var/randn = rand(1, 100)
- if (randn <= 80)
+ if(prob(80))
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
apply_effect(5, WEAKEN, run_armor_check(affecting, "melee"))
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("\red [] has tackled down []!", M, src), 1)
+ visible_message("[M] has tackled down [src]!")
else
- if (randn <= 99)
+ if(prob(99)) //this looks fucking stupid but it was previously 'var/randn = rand(1, 100); if(randn <= 99)'
playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
drop_item()
- visible_message(text("\red [] disarmed []!", M, src))
+ visible_message("[M] disarmed [src]!")
else
playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1)
- visible_message(text("\red [] has tried to disarm []!", M, src))
- return
\ No newline at end of file
+ visible_message("[M] has tried to disarm [src]!")
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index faaba025181..28943a4c22b 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -4,26 +4,30 @@
health = 100
stat = CONSCIOUS
return
- var/total_burn = 0
- var/total_brute = 0
+
+ var/total_burn = 0
+ var/total_brute = 0
+
for(var/obj/item/organ/external/O in organs) //hardcoded to streamline things a bit
- total_brute += O.brute_dam
+ total_brute += O.brute_dam //calculates health based on organ brute and burn
total_burn += O.burn_dam
+
health = 100 - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute
+
//TODO: fix husking
- if( (((100 - total_burn) < config.health_threshold_dead) && stat == DEAD))//100 only being used as the magic human max health number, feel free to change it if you add a var for it -- Urist
- ChangeToHusk()
+ if(((100 - total_burn) < config.health_threshold_dead) && stat == DEAD) //100 is the magic human max health number
+ ChangeToHusk() //BECAUSE NO ONE THOUGHT TO USE LIVING/VAR/MAXHEALTH I GUESS
if(species.can_revive_by_healing)
var/obj/item/organ/brain/B = internal_organs_by_name["brain"]
if(B)
- if((health >= (config.health_threshold_dead/100*75)) && stat == DEAD)
+ if((health >= (config.health_threshold_dead / 100 * 75)) && stat == DEAD)
update_revive()
- if (stat == CONSCIOUS && (src in dead_mob_list)) //Defib fix
+ if(stat == CONSCIOUS && (src in dead_mob_list)) //Defib fix
update_revive()
- return
/mob/living/carbon/human/adjustBrainLoss(var/amount)
- if(status_flags & GODMODE) return 0 //godmode
+ if(status_flags & GODMODE)
+ return 0 //godmode
if(species && species.has_organ["brain"])
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
@@ -36,7 +40,8 @@
brainloss = 0
/mob/living/carbon/human/setBrainLoss(var/amount)
- if(status_flags & GODMODE) return 0 //godmode
+ if(status_flags & GODMODE)
+ return 0 //godmode
if(species && species.has_organ["brain"])
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
@@ -49,7 +54,8 @@
brainloss = 0
/mob/living/carbon/human/getBrainLoss()
- if(status_flags & GODMODE) return 0 //godmode
+ if(status_flags & GODMODE)
+ return 0 //godmode
if(species && species.has_organ["brain"])
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
@@ -143,34 +149,39 @@
return
var/heal_prob = max(0, 80 - getCloneLoss())
- var/mut_prob = min(80, getCloneLoss()+10)
- if (amount > 0)
- if (prob(mut_prob))
- var/list/obj/item/organ/external/candidates = list()
- for (var/obj/item/organ/external/O in organs)
- if(O.status & ORGAN_ROBOT) continue
+ var/mut_prob = min(80, getCloneLoss() + 10)
+ if(amount > 0) //cloneloss is being added
+ if(prob(mut_prob))
+ var/list/obj/item/organ/external/candidates = list() //TYPECASTED LISTS ARE NOT A FUCKING THING WHAT THE FUCK
+ for(var/obj/item/organ/external/O in organs)
+ if(O.status & ORGAN_ROBOT)
+ continue
if(!(O.status & ORGAN_MUTATED))
candidates |= O
- if (candidates.len)
+
+ if(candidates.len)
var/obj/item/organ/external/O = pick(candidates)
O.mutate()
- src << "Something is not right with your [O.name]..."
+ src << "Something is not right with your [O.name]..."
O.add_autopsy_data("Mutation", amount)
return
- else
- if (prob(heal_prob))
- for (var/obj/item/organ/external/O in organs)
- if (O.status & ORGAN_MUTATED)
+
+ else //cloneloss is being subtracted
+ if(prob(heal_prob))
+ for(var/obj/item/organ/external/O in organs)
+ if(O.status & ORGAN_MUTATED)
O.unmutate()
- src << "Your [O.name] is shaped normally again."
+ src << "Your [O.name] is shaped normally again."
return
- if (getCloneLoss() < 1)
- for (var/obj/item/organ/external/O in organs)
- if (O.status & ORGAN_MUTATED)
+
+ if(getCloneLoss() < 1) //no cloneloss, fixes organs
+ for(var/obj/item/organ/external/O in organs)
+ if(O.status & ORGAN_MUTATED)
O.unmutate()
- src << "Your [O.name] is shaped normally again."
- hud_updateflag |= 1 << HEALTH_HUD
+ src << "Your [O.name] is shaped normally again."
+
+ hud_updateflag |= 1 << HEALTH_HUD //what even is this shit
// Defined here solely to take species flags into account without having to recast at mob/living level.
/mob/living/carbon/human/getOxyLoss()
@@ -186,7 +197,7 @@
/mob/living/carbon/human/setOxyLoss(var/amount)
if(species.flags & NO_BREATHE)
- oxyloss = 0
+ oxyloss = 0 //this literally overrides three procs, excessive much?
else
..()
@@ -203,7 +214,7 @@
/mob/living/carbon/human/setToxLoss(var/amount)
if(species.flags & NO_POISON)
- toxloss = 0
+ toxloss = 0 //this *also* overrides three procs, definately excessive
else
..()
@@ -230,7 +241,8 @@
//It automatically updates health status
/mob/living/carbon/human/heal_organ_damage(var/brute, var/burn)
var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn)
- if(!parts.len) return
+ if(!parts.len)
+ return
var/obj/item/organ/external/picked = pick(parts)
if(picked.heal_damage(brute,burn))
UpdateDamageIcon()
@@ -242,7 +254,8 @@
//It automatically updates health status
/mob/living/carbon/human/take_organ_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0)
var/list/obj/item/organ/external/parts = get_damageable_organs()
- if(!parts.len) return
+ if(!parts.len)
+ return
var/obj/item/organ/external/picked = pick(parts)
if(picked.take_damage(brute,burn,sharp,edge))
UpdateDamageIcon()
@@ -256,7 +269,7 @@
var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn)
var/update = 0
- while(parts.len && (brute>0 || burn>0) )
+ while(parts.len && ( brute > 0 || burn > 0) )
var/obj/item/organ/external/picked = pick(parts)
var/brute_was = picked.brute_dam
@@ -268,15 +281,19 @@
burn -= (burn_was-picked.burn_dam)
parts -= picked
+
updatehealth()
hud_updateflag |= 1 << HEALTH_HUD
speech_problem_flag = 1
- if(update) UpdateDamageIcon()
+ if(update)
+ UpdateDamageIcon()
// damage MANY external organs, in random order
/mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0, var/used_weapon = null)
- if(status_flags & GODMODE) return //godmode
+ if(status_flags & GODMODE)
+ return //godmode
var/list/obj/item/organ/external/parts = get_damageable_organs()
+
var/update = 0
while(parts.len && (brute>0 || burn>0) )
var/obj/item/organ/external/picked = pick(parts)
@@ -289,9 +306,11 @@
burn -= (picked.burn_dam - burn_was)
parts -= picked
+
updatehealth()
hud_updateflag |= 1 << HEALTH_HUD
- if(update) UpdateDamageIcon()
+ if(update)
+ UpdateDamageIcon()
////////////////////////////////////////////
@@ -302,7 +321,7 @@ This function restores the subjects blood to max.
/mob/living/carbon/human/proc/restore_blood()
if(!(species.flags & NO_BLOOD))
var/blood_volume = vessel.get_reagent_amount("blood")
- vessel.add_reagent("blood",560.0-blood_volume)
+ vessel.add_reagent("blood", 560.0 - blood_volume)
/*
This function restores all organs.
@@ -314,47 +333,43 @@ This function restores all organs.
/mob/living/carbon/human/proc/HealDamage(zone, brute, burn)
var/obj/item/organ/external/E = get_organ(zone)
if(istype(E, /obj/item/organ/external))
- if (E.heal_damage(brute, burn))
+ if(E.heal_damage(brute, burn))
UpdateDamageIcon()
hud_updateflag |= 1 << HEALTH_HUD
else
return 0
- return
/mob/living/carbon/human/proc/get_organ(var/zone)
- if(!zone) zone = "chest"
- if (zone in list( "eyes", "mouth" ))
+ if(!zone)
+ zone = "chest"
+ if(zone in list("eyes", "mouth"))
zone = "head"
+
return organs_by_name[zone]
/mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/edge = 0, var/obj/used_weapon = null)
-
- //visible_message("Hit debug. [damage] | [damagetype] | [def_zone] | [blocked] | [sharp] | [used_weapon]")
-
//Handle other types of damage
if((damagetype != BRUTE) && (damagetype != BURN))
- if(damagetype == HALLOSS)
- if ((damage > 25 && prob(20)) || (damage > 50 && prob(60)))
- emote("scream")
-
-
..(damage, damagetype, def_zone, blocked)
return 1
//Handle BRUTE and BURN damage
handle_suit_punctures(damagetype, damage)
- blocked = (100-blocked)/100
- if(blocked <= 0) return 0
+ blocked = (100 - blocked) / 100
+ if(blocked <= 0)
+ return 0
var/obj/item/organ/external/organ = null
if(isorgan(def_zone))
organ = def_zone
else
- if(!def_zone) def_zone = ran_zone(def_zone)
+ if(!def_zone)
+ def_zone = ran_zone(def_zone)
organ = get_organ(check_zone(def_zone))
- if(!organ) return 0
+ if(!organ)
+ return 0
damage = damage * blocked
@@ -362,28 +377,33 @@ This function restores all organs.
if(BRUTE)
damageoverlaytemp = 20
if(species && species.brute_mod)
- damage = damage*species.brute_mod
+ damage = damage * species.brute_mod
+
if(organ.take_damage(damage, 0, sharp, edge, used_weapon))
UpdateDamageIcon()
- if(LAssailant && ishuman(LAssailant))
+
+ if(LAssailant && ishuman(LAssailant)) //superheros still get the comical hit markers
var/mob/living/carbon/human/H = LAssailant
if(H.mind && H.mind in (ticker.mode.superheroes || ticker.mode.supervillains || ticker.mode.greyshirts))
var/list/attack_bubble_recipients = list()
var/mob/living/user
for(var/mob/O in viewers(user, src))
- if (O.client && !( O.blinded ))
+ if (O.client && !(O.blinded))
attack_bubble_recipients.Add(O.client)
spawn(0)
var/image/dmgIcon = image('icons/effects/hit_blips.dmi', src, "dmg[rand(1,2)]",MOB_LAYER+1)
dmgIcon.pixel_x = (!lying) ? rand(-3,3) : rand(-11,12)
dmgIcon.pixel_y = (!lying) ? rand(-11,9) : rand(-10,1)
- //world << "x: [dmgIcon.pixel_x] AND y: [dmgIcon.pixel_y]"
flick_overlay(dmgIcon, attack_bubble_recipients, 9)
+
receive_damage()
+
if(BURN)
damageoverlaytemp = 20
+
if(species && species.burn_mod)
- damage = damage*species.burn_mod
+ damage = damage * species.burn_mod
+
if(organ.take_damage(0, damage, sharp, edge, used_weapon))
UpdateDamageIcon()
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 56d197e3b88..1ea23ebf53a 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -477,4 +477,4 @@ emp_act
/mob/living/carbon/human/water_act(volume, temperature, source)
..()
if(temperature >= 330) bodytemperature = bodytemperature + (temperature - bodytemperature)
- if(temperature <= 280) bodytemperature = bodytemperature - (bodytemperature - temperature)
\ No newline at end of file
+ if(temperature <= 280) bodytemperature = bodytemperature - (bodytemperature - temperature)
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index c791222d312..28a504c1645 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -51,7 +51,7 @@
if(status_flags & GOTTAGOREALLYFAST)
tally -= 2
- return (tally+config.human_delay)
+ return (tally + config.human_delay)
/mob/living/carbon/human/Process_Spacemove(movement_dir = 0)
@@ -89,4 +89,4 @@
if(!has_gravity(loc))
return
var/obj/item/clothing/shoes/S = shoes
- S.step_action(src)
+ S.step_action(src)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 03cde195fe4..961417b8db7 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -136,6 +136,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
var/y_offset = pixel_y + rand(-1,1)
animate(src, pixel_x = pixel_x + x_offset, pixel_y = pixel_y + y_offset, time = 1)
animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y), time = 1)
+
if (disabilities & NERVOUS)
speech_problem_flag = 1
if (prob(10))
@@ -143,12 +144,38 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if (getBrainLoss() >= 60 && stat != 2)
speech_problem_flag = 1
- if (prob(3))
+ if(prob(3))
+ var/list/s1 = list("IM A PONY NEEEEEEIIIIIIIIIGH",
+ "without oxigen blob don't evoluate?",
+ "CAPTAINS A COMDOM",
+ "[pick("", "that damn traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!",
+ "can u give me [pick("telikesis","halk","eppilapse")]?",
+ "THe saiyans screwed",
+ "Bi is THE BEST OF BOTH WORLDS>",
+ "I WANNA PET TEH monkeyS",
+ "stop grifing me!!!!",
+ "SOTP IT#")
+
+ var/list/s2 = list("FUS RO DAH",
+ "fucking 4rries!",
+ "stat me",
+ ">my face",
+ "roll it easy!",
+ "waaaaaagh!!!",
+ "red wonz go fasta",
+ "FOR TEH EMPRAH",
+ "lol2cat",
+ "dem dwarfs man, dem dwarfs",
+ "SPESS MAHREENS",
+ "hwee did eet fhor khayosss",
+ "lifelike texture ;_;",
+ "luv can bloooom",
+ "PACKETS!!!")
switch(pick(1,2,3))
if(1)
- say(pick("IM A PONY NEEEEEEIIIIIIIIIGH", "without oxigen blob don't evoluate?", "CAPTAINS A COMDOM", "[pick("", "that damn traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!", "can u give me [pick("telikesis","halk","eppilapse")]?", "THe saiyans screwed", "Bi is THE BEST OF BOTH WORLDS>", "I WANNA PET TEH monkeyS", "stop grifing me!!!!", "SOTP IT#"))
+ say(pick(s1))
if(2)
- say(pick("FUS RO DAH","fucking 4rries!", "stat me", ">my face", "roll it easy!", "waaaaaagh!!!", "red wonz go fasta", "FOR TEH EMPRAH", "lol2cat", "dem dwarfs man, dem dwarfs", "SPESS MAHREENS", "hwee did eet fhor khayosss", "lifelike texture ;_;", "luv can bloooom", "PACKETS!!!"))
+ say(pick(s2))
if(3)
emote("drool")
diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm
index 3e888c026f8..3727bd8de0a 100644
--- a/code/modules/mob/living/carbon/human/species/shadow.dm
+++ b/code/modules/mob/living/carbon/human/species/shadow.dm
@@ -1,7 +1,7 @@
/datum/species/shadow
name = "Shadow"
name_plural = "Shadows"
-
+
icobase = 'icons/mob/human_races/r_shadow.dmi'
deform = 'icons/mob/human_races/r_shadow.dmi'
@@ -12,7 +12,6 @@
blood_color = "#CCCCCC"
flesh_color = "#AAAAAA"
-
has_organ = list(
"brain" = /obj/item/organ/brain
)
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index c65756fce62..c4c2711b1c3 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -78,7 +78,6 @@
//Used in icon caching.
var/race_key = 0
var/icon/icon_template
-
var/is_small
var/show_ssd = 1
var/virus_immune
diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm
index 26ef94d472a..1ed7674c050 100644
--- a/code/modules/mob/living/carbon/human/species/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station.dm
@@ -53,7 +53,6 @@
heat_level_3_breathe = 1100 //Default 1000
flesh_color = "#34AF10"
-
reagent_tag = PROCESS_ORG
base_color = "#066000"
@@ -98,7 +97,6 @@
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
dietflags = DIET_OMNI
-
reagent_tag = PROCESS_ORG
flesh_color = "#AFA59E"
base_color = "#333333"
@@ -134,7 +132,6 @@
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
dietflags = DIET_OMNI
-
reagent_tag = PROCESS_ORG
flesh_color = "#966464"
base_color = "#BE8264"
@@ -163,7 +160,6 @@
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR
dietflags = DIET_HERB
-
flesh_color = "#8CD7A3"
blood_color = "#1D2CBF"
reagent_tag = PROCESS_ORG
@@ -179,7 +175,6 @@
language = "Vox-pidgin"
speech_sounds = list('sound/voice/shriek1.ogg')
speech_chance = 20
-
unarmed_type = /datum/unarmed_attack/claws //I dont think it will hurt to give vox claws too.
blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \
@@ -309,7 +304,6 @@
clothing_flags = HAS_SOCKS
bodyflags = FEET_CLAWS
dietflags = DIET_HERB
-
blood_color = "#FB9800"
reagent_tag = PROCESS_ORG
@@ -328,7 +322,6 @@
bodyflags = HAS_SKIN_COLOR
bloodflags = BLOOD_SLIME
dietflags = DIET_CARN
-
reagent_tag = PROCESS_ORG
//ventcrawler = 1 //ventcrawling commented out
@@ -355,7 +348,6 @@
flags = IS_WHITELISTED | HAS_LIPS | CAN_BE_FAT
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
dietflags = DIET_HERB
-
reagent_tag = PROCESS_ORG
blood_color = "#A200FF"
@@ -408,7 +400,6 @@
dietflags = 0 //Diona regenerate nutrition in light, no diet necessary
body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not
-
blood_color = "#004400"
flesh_color = "#907E4A"
@@ -499,7 +490,7 @@
passive_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment.
- flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA_RAD
+ flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA_RAD | NO_POISON
clothing_flags = HAS_SOCKS
bodyflags = HAS_SKIN_COLOR
dietflags = 0 //IPCs can't eat, so no diet
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index bd7b023b5b6..8bd45097fef 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -11,7 +11,7 @@
pass_flags = PASSTABLE
braintype = "Robot"
lawupdate = 0
- density = 1
+ density = 0
req_access = list(access_engine, access_robotics)
local_transmit = 1
@@ -335,4 +335,8 @@
src.verbs |= silicon_subsystems
/mob/living/silicon/robot/drone/remove_robot_verbs()
- src.verbs -= silicon_subsystems
\ No newline at end of file
+ src.verbs -= silicon_subsystems
+
+/mob/living/silicon/robot/drone/update_canmove()
+ . = ..()
+ density = 0 //this is reset every canmove update otherwise
\ No newline at end of file
diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm
index 9fcad11f440..3e651613164 100644
--- a/code/modules/organs/subtypes/machine.dm
+++ b/code/modules/organs/subtypes/machine.dm
@@ -5,14 +5,14 @@
max_damage = 50 //made same as arm, since it is not vital
min_broken_damage = 30
encased = null
-
+
/obj/item/organ/external/head/ipc/New()
robotize("Morpheus Cyberkinetics")
..()
/obj/item/organ/external/chest/ipc
encased = null
-
+
/obj/item/organ/external/chest/ipc/New()
robotize("Morpheus Cyberkinetics")
..()
@@ -91,6 +91,7 @@
organ_tag = "brain"
parent_organ = "chest"
vital = 1
+ max_damage = 200
var/obj/item/device/mmi/stored_mmi
/obj/item/organ/mmi_holder/proc/update_from_mmi()
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 78aa9174d5f..39c5442c7e7 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -13,6 +13,7 @@
var/copies = 1 //how many copies to print!
var/toner = 30 //how much toner is left! woooooo~
var/maxcopies = 10 //how many copies can be copied at once- idea shamelessly stolen from bs12's copier!
+ var/mob/living/ass = null
/obj/machinery/photocopier/attack_ai(mob/user as mob)
return attack_hand(user)
@@ -21,7 +22,7 @@
user.set_machine(src)
var/dat = "Photocopier
"
- if(copyitem)
+ if(copyitem || (ass && (ass.loc == src.loc)))
dat += "Remove Item
"
if(toner)
dat += "Copy
"
@@ -57,6 +58,9 @@
else if (istype(copyitem, /obj/item/weapon/paper_bundle))
var/obj/item/weapon/paper_bundle/B = bundlecopy(copyitem)
sleep(15*B.amount)
+ else if (ass && ass.loc == src.loc)
+ copyass()
+ sleep(15)
else
usr << "\The [copyitem] can't be copied by \the [src]."
break
@@ -70,6 +74,9 @@
usr << "You take \the [copyitem] out of \the [src]."
copyitem = null
updateUsrDialog()
+ else if(check_ass())
+ ass << "You feel a slight pressure on your ass."
+ updateUsrDialog()
else if(href_list["min"])
if(copies > 1)
copies--
@@ -127,6 +134,17 @@
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
anchored = !anchored
user << "You [anchored ? "wrench" : "unwrench"] \the [src]."
+ else if(istype(O, /obj/item/weapon/grab)) //For ass-copying.
+ var/obj/item/weapon/grab/G = O
+ if(ismob(G.affecting) && G.affecting != ass)
+ var/mob/GM = G.affecting
+ visible_message("[usr] drags [GM.name] onto the photocopier!")
+ GM.loc = get_turf(src)
+ ass = GM
+ if(copyitem)
+ copyitem.loc = src.loc
+ copyitem = null
+ updateUsrDialog()
return
/obj/machinery/photocopier/ex_act(severity)
@@ -203,6 +221,64 @@
visible_message("A red light on \the [src] flashes, indicating that it is out of toner.")
return p
+
+/obj/machinery/photocopier/proc/copyass()
+ var/icon/temp_img
+ if(check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on.
+ if(ishuman(ass)) //Suit checks are in check_ass
+ var/mob/living/carbon/human/H = ass
+ switch(H.get_species())
+ if("Human")
+ temp_img = icon('icons/obj/butts.dmi', "human")
+ if("Tajaran")
+ temp_img = icon('icons/obj/butts.dmi', "tajaran")
+ if("Unathi")
+ temp_img = icon('icons/obj/butts.dmi', "unathi")
+ if("Skrell")
+ temp_img = icon('icons/obj/butts.dmi', "skrell")
+ if("Vox")
+ temp_img = icon('icons/obj/butts.dmi', "vox")
+ if("Kidan")
+ temp_img = icon('icons/obj/butts.dmi', "kidan")
+ if("Grey")
+ temp_img = icon('icons/obj/butts.dmi', "grey")
+ if("Diona")
+ temp_img = icon('icons/obj/butts.dmi', "diona")
+ if("Slime People")
+ temp_img = icon('icons/obj/butts.dmi', "slime")
+ if("Vulpkanin")
+ temp_img = icon('icons/obj/butts.dmi', "vulp")
+ if("Machine")
+ temp_img = icon('icons/obj/butts.dmi', "machine")
+ if("Plasmaman")
+ temp_img = icon('icons/obj/butts.dmi', "plasma")
+ else
+ temp_img = icon('icons/obj/butts.dmi', "human")
+ else if(istype(ass,/mob/living/silicon/robot/drone))
+ temp_img = icon('icons/obj/butts.dmi', "drone")
+ else if(istype(ass,/mob/living/simple_animal/diona))
+ temp_img = icon('icons/obj/butts.dmi', "nymph")
+ else if(isalien(ass) || istype(ass,/mob/living/simple_animal/hostile/alien)) //Xenos have their own asses, thanks to Pybro.
+ temp_img = icon('icons/obj/butts.dmi', "xeno")
+ else return
+ else
+ return
+ var/obj/item/weapon/photo/p = new /obj/item/weapon/photo (loc)
+ p.desc = "You see [ass]'s ass on the photo."
+ p.pixel_x = rand(-10, 10)
+ p.pixel_y = rand(-10, 10)
+ p.img = temp_img
+ var/icon/small_img = icon(temp_img) //Icon() is needed or else temp_img will be rescaled too >.>
+ var/icon/ic = icon('icons/obj/items.dmi',"photo")
+ small_img.Scale(8, 8)
+ ic.Blend(small_img,ICON_OVERLAY, 10, 13)
+ p.icon = ic
+ toner -= 5
+ if(toner < 0)
+ toner = 0
+ visible_message("A red light on \the [src] flashes, indicating that it is out of toner.")
+ return p
+
//If need_toner is 0, the copies will still be lightened when low on toner, however it will not be prevented from printing. TODO: Implement print queues for fax machines and get rid of need_toner
/obj/machinery/photocopier/proc/bundlecopy(var/obj/item/weapon/paper_bundle/bundle, var/need_toner=1)
var/obj/item/weapon/paper_bundle/p = new /obj/item/weapon/paper_bundle (src)
@@ -227,6 +303,36 @@
p.pixel_x = rand(-9, 9)
return p
+
+/obj/machinery/photocopier/MouseDrop_T(mob/target, mob/user)
+ check_ass() //Just to make sure that you can re-drag somebody onto it after they moved off.
+ if (!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai) || target == ass)
+ return
+ src.add_fingerprint(user)
+ if(target == user && !user.incapacitated())
+ visible_message("[usr] jumps onto the photocopier!")
+ else if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis)
+ if(target.anchored) return
+ if(!ishuman(user)) return
+ visible_message("[usr] drags [target.name] onto the photocopier!")
+ target.loc = get_turf(src)
+ ass = target
+ if(copyitem)
+ copyitem.loc = src.loc
+ visible_message("[copyitem] is shoved out of the way by [ass]!")
+ copyitem = null
+ updateUsrDialog()
+
+/obj/machinery/photocopier/proc/check_ass() //I'm not sure wether I made this proc because it's good form or because of the name.
+ if(!ass)
+ return 0
+ if(ass.loc != src.loc)
+ ass = null
+ updateUsrDialog()
+ return 0
+ else
+ return 1
+
/obj/item/device/toner
name = "toner cartridge"
icon_state = "tonercartridge"
diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm
index f700ec2aa16..9bee5b09324 100644
--- a/code/modules/reagents/newchem/drugs.dm
+++ b/code/modules/reagents/newchem/drugs.dm
@@ -521,7 +521,7 @@
M.drop_item()
..()
if(prob(50))
- M.adjustToxLoss(10)
+ M.adjustFireLoss(10)
M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1))
return
@@ -551,7 +551,7 @@
/datum/reagent/lube/ultra/addiction_act_stage4(var/mob/living/carbon/human/M as mob)
M.Jitter(20)
M.Dizzy(20)
- M.adjustToxLoss(5)
+ M.adjustBrainLoss(2)
if(prob(50))
M.emote(pick("twitch","buzz","moan"))
..()
@@ -605,7 +605,7 @@
/datum/reagent/surge/addiction_act_stage1(var/mob/living/M as mob)
M.adjustBrainLoss(rand(1,5)*REM)
- M.adjustToxLoss(rand(1,5)*REM)
+ M.hallucination += rand(1,5)
..()
return
/datum/reagent/surge/addiction_act_stage2(var/mob/living/M as mob)
diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm
index 764a5407776..e0cf917bdf4 100644
--- a/code/modules/reagents/newchem/medicine.dm
+++ b/code/modules/reagents/newchem/medicine.dm
@@ -987,7 +987,7 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
// Synth-Meds //
//////////////////////////////
-//Degreaser: Anti-toxin / Lube Remover
+//Degreaser: Mild Purgative / Lube Remover
/datum/reagent/degreaser
name = "Degreaser"
id = "degreaser"
@@ -1016,7 +1016,11 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
/datum/reagent/degreaser/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
- M.adjustToxLoss(-1.5*REM)
+ if(prob(50)) //Same effects as coffee, to help purge ill effects like paralysis
+ M.AdjustParalysis(-1)
+ M.AdjustStunned(-1)
+ M.AdjustWeakened(-1)
+ M.confused -= 5
for(var/datum/reagent/R in M.reagents.reagent_list)
if(R != src)
if(R.id == "ultralube" || R.id == "lube")
diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm
index faf530f6b3e..a3dc47f26a4 100644
--- a/code/modules/reagents/newchem/newchem_procs.dm
+++ b/code/modules/reagents/newchem/newchem_procs.dm
@@ -47,6 +47,8 @@ datum/reagents/proc/metabolize(var/mob/M)
R.overdosed = 1
M << "You feel like you took too much [R.name]!"
R.overdose_start(M)
+ if(R.volume < R.overdose_threshold && R.overdosed)
+ R.overdosed = 0
if(R.volume >= R.addiction_threshold && !is_type_in_list(R, addiction_list) && R.addiction_threshold > 0)
var/datum/reagent/new_reagent = new R.type()
addiction_list.Add(new_reagent)
diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm
index 809a8dfd34d..e44a166a87a 100644
--- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm
+++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm
@@ -87,5 +87,5 @@
name = "Sterilizine"
id = "sterilizine"
result = "sterilizine"
- required_reagents = list("ethanol" = 1, "charcoal" = 1, "chlorine" = 1)
+ required_reagents = list("antihol" = 2, "chlorine" = 1)
result_amount = 3
\ No newline at end of file
diff --git a/icons/ass/assalien.png b/icons/ass/assalien.png
deleted file mode 100644
index d7586f3b5ff..00000000000
Binary files a/icons/ass/assalien.png and /dev/null differ
diff --git a/icons/ass/assfemale.png b/icons/ass/assfemale.png
deleted file mode 100644
index 4c941a9281d..00000000000
Binary files a/icons/ass/assfemale.png and /dev/null differ
diff --git a/icons/ass/assmale.png b/icons/ass/assmale.png
deleted file mode 100644
index c6091cf1915..00000000000
Binary files a/icons/ass/assmale.png and /dev/null differ
diff --git a/icons/obj/butts.dmi b/icons/obj/butts.dmi
new file mode 100644
index 00000000000..cddd1ca6659
Binary files /dev/null and b/icons/obj/butts.dmi differ