diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index d92376912a4..9312306dca5 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -2226,7 +2226,7 @@ "aQP" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/starboard) "aQQ" = (/obj/machinery/computer/atmos_alert,/obj/structure/sign/double/map/left{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-left-MS"; pixel_y = 32},/obj/machinery/firealarm{dir = 8; pixel_x = -26; pixel_y = 0},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/engine/engineering) "aQR" = (/obj/machinery/computer/station_alert,/obj/structure/sign/double/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = 32},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/engine/engineering) -"aQS" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/power/monitor{name = "Engineering Power Monitoring Console"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Engineering - Power Monitoring"; dir = 2; network = list("SS13")},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/engine/engineering) +"aQS" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/computer/monitor{name = "Engineering Power Monitoring Console"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Engineering - Power Monitoring"; dir = 2; network = list("SS13")},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/engine/engineering) "aQT" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/door/poddoor/preopen{id_tag = "lawyer_blast"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/lawoffice) "aQU" = (/obj/machinery/vending/engivend,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "aQV" = (/obj/machinery/vending/tool,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/engineering) @@ -3151,7 +3151,7 @@ "biE" = (/obj/machinery/computer/crew,/turf/simulated/floor{dir = 1; icon_state = "darkgreen"},/area/bridge) "biF" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/weapon/folder/yellow{pixel_y = 4},/obj/machinery/camera{c_tag = "Bridge - Central"; dir = 2; network = list("SS13")},/obj/structure/table/glass,/turf/simulated/floor{dir = 1; icon_state = "darkbrown"},/area/bridge) "biG" = (/obj/machinery/computer/station_alert,/turf/simulated/floor{dir = 1; icon_state = "darkbrown"},/area/bridge) -"biH" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/power/monitor{name = "Bridge Power Monitoring Console"},/turf/simulated/floor{dir = 1; icon_state = "darkbrown"},/area/bridge) +"biH" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/computer/monitor{name = "Bridge Power Monitoring Console"},/turf/simulated/floor{dir = 1; icon_state = "darkbrown"},/area/bridge) "biI" = (/obj/machinery/computer/atmos_alert,/turf/simulated/floor{dir = 1; icon_state = "darkbrown"},/area/bridge) "biJ" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -1; pixel_y = 4},/obj/structure/table/glass,/turf/simulated/floor{dir = 1; icon_state = "darkbrown"},/area/bridge) "biK" = (/obj/machinery/computer/security,/turf/simulated/floor{dir = 1; icon_state = "darkred"; tag = "icon-darkblue"; temperature = 273.15},/area/bridge) diff --git a/_maps/map_files/MetaStation/z4.dmm b/_maps/map_files/MetaStation/z4.dmm index e9ad9ae4182..65d167d927d 100644 --- a/_maps/map_files/MetaStation/z4.dmm +++ b/_maps/map_files/MetaStation/z4.dmm @@ -105,8 +105,8 @@ "ca" = (/obj/machinery/door/airlock/external{name = "External Engineering"},/turf/simulated/floor/plating,/area/derelict/solar_control) "cb" = (/obj/machinery/door/airlock/highsecurity,/turf/simulated/floor,/area/derelict/bridge/ai_upload) "cc" = (/obj/structure/computerframe,/turf/simulated/floor,/area/derelict/bridge/ai_upload) +"cd" = (/obj/machinery/computer/monitor,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/derelict/solar_control) "ce" = (/turf/simulated/wall/r_wall,/area/space) -"cf" = (/obj/machinery/power/monitor,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/derelict/solar_control) "cg" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light/small,/turf/simulated/floor,/area/derelict/solar_control) "ch" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/derelict/solar_control) "ci" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/derelict/solar_control) @@ -839,7 +839,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDbDbDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEbKbHbLbMbNbObyababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDbPbQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEbRbSbTbUbUbVbybyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDbWbDbDbDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEbXbYbZbFbFbFbFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDcbbDccbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDhchchchchchccehchchchchchccehchchchchchcbXcfcgchchbZbFcicjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDcbbDccbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDhchchchchchccehchchchchchccehchchchchchcbXcdcgchchbZbFcicjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDbWbWckcbbWclcmbDbDbDcmbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbXbybybybycnbybycoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDbDbDbDbDbWbDbWbWbWbDbWbWbWbDbDbDbDbDbDbDcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpbycqbSbFbycoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrcpcrbWbDbWbDbWbDbWbDbWbDbDbDcmbDcmbDbDbDbDbDcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpbybycsbybyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index a6748ac7718..7702ac20c29 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -1943,7 +1943,7 @@ "aLs" = (/obj/machinery/recharge_station,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/electrical) "aLt" = (/obj/machinery/power/port_gen/pacman,/turf/simulated/floor/plating,/area/maintenance/electrical) "aLu" = (/turf/simulated/floor/mech_bay_recharge_floor,/area/maintenance/electrical) -"aLv" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) +"aLv" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aLw" = (/obj/machinery/camera{c_tag = "Fore Starboard Solars"; dir = 1; network = list("SS13")},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aLx" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/electrical) "aLy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -2804,7 +2804,7 @@ "bbV" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/secure/briefcase,/obj/item/weapon/storage/box/PDAs{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/ids,/turf/simulated/floor,/area/bridge) "bbW" = (/obj/machinery/computer/atmos_alert,/turf/simulated/floor{dir = 10; icon_state = "yellow"},/area/bridge) "bbX" = (/obj/machinery/computer/station_alert,/turf/simulated/floor{dir = 0; icon_state = "yellow"},/area/bridge) -"bbY" = (/obj/machinery/power/monitor{name = "Bridge Power Monitoring Computer"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor{dir = 6; icon_state = "yellow"},/area/bridge) +"bbY" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/computer/monitor{name = "Backup Power Monitoring Console"},/turf/simulated/floor/plating,/area/maintenance/electrical) "bbZ" = (/obj/machinery/computer/shuttle_control/labor_camp,/turf/simulated/floor{dir = 10; icon_state = "blue"},/area/bridge) "bca" = (/obj/machinery/computer/communications,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) "bcb" = (/obj/machinery/computer/shuttle_control/mining{req_access_txt = "48"},/turf/simulated/floor{dir = 6; icon_state = "blue"},/area/bridge) @@ -3901,7 +3901,7 @@ "bxa" = (/obj/machinery/light{dir = 8},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/sw) "bxb" = (/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bxc" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bxd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/hologram/holopad,/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) +"bxd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bxe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bxf" = (/obj/item/weapon/hand_labeler,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; name = "Chemistry Cleaner"},/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 30},/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) "bxg" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/airless{icon_state = "white"},/area/medical/reception) @@ -5228,9 +5228,11 @@ "bWB" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/toxins/mixing) "bWC" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/obj/machinery/air_sensor{frequency = 1222; id_tag = "burn_sensor"},/turf/simulated/floor/engine,/area/toxins/mixing) "bWD" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 9},/turf/simulated/floor/engine,/area/toxins/mixing) +"bWE" = (/obj/machinery/computer/monitor{name = "Bridge Power Monitoring Computer"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor{dir = 6; icon_state = "yellow"},/area/bridge) "bWF" = (/turf/simulated/floor/plating/airless,/area/toxins/test_area) "bWG" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless,/area/toxins/test_area) "bWH" = (/turf/simulated/floor/airless,/area/toxins/test_area) +"bWI" = (/obj/machinery/computer/monitor,/obj/structure/cable,/turf/simulated/floor{icon_state = "caution"; dir = 5},/area/engine/controlroom) "bWJ" = (/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/mining/station) "bWK" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "mining_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access_txt = "13"},/turf/simulated/shuttle/floor,/area/shuttle/mining/station) "bWL" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "mining_dock_outer"; locked = 1; name = "Mining Dock Airlock"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/quartermaster/miningdock) @@ -5305,6 +5307,7 @@ "bYc" = (/obj/machinery/door/airlock/external{name = "Toxins Test Chamber"; req_access_txt = "0"},/turf/simulated/floor/plating/airless,/area/toxins/test_area) "bYd" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating/airless,/area/toxins/test_area) "bYe" = (/obj/machinery/camera{c_tag = "Research Toxins Test Chamber North"; network = list("Toxins","Research","SS13")},/obj/machinery/light{dir = 1},/turf/simulated/floor/airless,/area/toxins/test_area) +"bYf" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/solar/starboard) "bYg" = (/obj/item/weapon/ore/silver,/obj/item/weapon/ore/silver,/obj/structure/closet/crate,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "mining_dock_pump"},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/quartermaster/miningdock) "bYh" = (/obj/machinery/camera{c_tag = "Mining Dock External"; dir = 8},/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor{icon_state = "warning"},/area/quartermaster/miningdock) "bYi" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/simulated/wall,/area/quartermaster/miningdock) @@ -5342,9 +5345,11 @@ "bYO" = (/obj/machinery/door_control{id = "acute2"; name = "Acute 2 Shutters Control"; pixel_x = 6; pixel_y = -25},/obj/machinery/door_control{id = "scansep"; name = "Scanning Room Separation Shutters Control"; pixel_x = -6; pixel_y = -25},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bYP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2) "bYQ" = (/obj/machinery/vending/medical,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/medbay2) +"bYR" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = -30; pixel_y = 0},/obj/machinery/computer/monitor{name = "Grid Power Monitoring Computer"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/engine/engineering) "bYS" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/medical/cmo) "bYT" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Chief Medical Officer"},/turf/simulated/floor{icon_state = "white"},/area/medical/cmo) "bYU" = (/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/item/weapon/folder/white{pixel_y = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/food/drinks/coffee,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/accessory/stethoscope,/obj/item/weapon/stamp/cmo,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/table/glass,/turf/simulated/floor{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/cmo) +"bYV" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/computer/monitor{name = "Engine Power Monitoring Computer"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/engine/engineering) "bYW" = (/obj/machinery/photocopier,/turf/simulated/floor{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/medical/medbay2) "bYX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/medical/medbay2) "bYY" = (/turf/simulated/floor{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2) @@ -5643,7 +5648,6 @@ "ceX" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/obj/structure/closet/firecloset,/obj/item/taperoll/engineering,/turf/simulated/floor,/area/engine/controlroom) "ceY" = (/obj/structure/closet/firecloset,/obj/item/taperoll/engineering,/turf/simulated/floor,/area/engine/controlroom) "ceZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/security/telescreen{desc = "Used for watching the singularity chamber."; dir = 8; layer = 4; name = "Singularity Engine Telescreen"; network = list("Singularity"); pixel_x = 0; pixel_y = 30},/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor,/area/engine/controlroom) -"cfa" = (/obj/machinery/power/monitor,/obj/structure/cable,/turf/simulated/floor{icon_state = "caution"; dir = 5},/area/engine/controlroom) "cfb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/engine/controlroom) "cfc" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cfd" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -6189,7 +6193,6 @@ "cql" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whitepurplecorner"},/area/toxins/misc_lab) "cqm" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/toxins/misc_lab) "cqn" = (/obj/machinery/power/apc{dir = 8; name = "Aft Starboard Solar APC"; pixel_x = -26; pixel_y = 3},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/solar/starboard) -"cqo" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/solar/starboard) "cqp" = (/obj/machinery/power/smes{charge = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/solar/starboard) "cqr" = (/obj/item/clothing/mask/cigarette,/turf/simulated/floor/plating/airless,/area/toxins/test_area) "cqs" = (/obj/machinery/light/small,/turf/simulated/floor/plating/airless,/area/toxins/test_area) @@ -7024,7 +7027,6 @@ "cHY" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/aft) "cHZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cIa" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/maintenance/aft) -"cIb" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = -30; pixel_y = 0},/obj/machinery/power/monitor{name = "Grid Power Monitoring Computer"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/engine/engineering) "cIc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor,/area/engine/engineering) "cId" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/engine/engineering) "cIe" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor,/area/engine/engineering) @@ -7188,7 +7190,6 @@ "cLK" = (/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cLL" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cLM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/space_heater,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) -"cLN" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/power/monitor{name = "Engine Power Monitoring Computer"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/engine/engineering) "cLO" = (/obj/structure/table,/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/obj/item/clothing/ears/earmuffs{pixel_x = -5; pixel_y = 6},/obj/item/clothing/ears/earmuffs{pixel_x = -5; pixel_y = 6},/obj/item/clothing/ears/earmuffs{pixel_x = -5; pixel_y = 6},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/weapon/stock_parts/cell/high,/turf/simulated/floor,/area/engine/engineering) "cLP" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/table,/obj/item/stack/sheet/mineral/plasma{amount = 30},/obj/item/device/pipe_painter,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/engine/engineering) "cLQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/power/port_gen/pacman,/turf/simulated/floor,/area/engine/engineering) @@ -7896,7 +7897,6 @@ "daO" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "maint2"; name = "Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "daP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "maint2"; name = "Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "daU" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/electrical) -"daV" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/monitor{name = "Backup Power Monitoring Console"},/turf/simulated/floor/plating,/area/maintenance/electrical) "daW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall,/area/maintenance/electrical) "daX" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/electrical) "daY" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8; initialize_directions = 11; level = 2},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -8066,7 +8066,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazEaAyaDtaDuazEaAyaDvaDuazEaABaDwaABaABaABaABaABayYaABayYcwjcwkayYayYaABaMnaABcwmaabcwmaABaItaIraABaIPcxEaABaHGaCraABaygaAHaAHaAuaAuaAuaAuaAuaAuaAuaAuaAuaCJaCJaCKaDDaDEaISaDGaDHaDIaDJaDKaDLaDLaDLaDLaDMaDLaDNaDOaDPaDLaDLaDQaDQaDRaDSaDTaDUaDVaDWaCWaDXaDYaDYazZaBbaCgaDZaEaaEbaCgaAxaEdaDeaDecxDaGAaBdaFgaFhaFhaGsaAxaQtazKazBazBazBazBazBazKaEmaDnazKaaaaaaaMUaJeaLHaLHaJYdcmaLqaNaaWacZWaAraMUaOMaAraMUcZYaLHaMUcZZaLHaMUdabdaadacaNodadaNodafdaedahdagdajdaidakaIQaIRaIRaacaacaIRaIRaIRaIRaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvaEwaExaEwaEyaEwaEzaEwaEAaEBaECaECaECaECaEDaABayYaABcxHcxGcxIayYcyScwgaMnaABaABaABaABaABaABcwgaABayYcxIaDwayYayYaCJcyTcyUaEKaEJaEJaEJaEJaELaEJaEJaEMaENaEKaEOaEPaEPaEPaEPaEPaEPaEPaEQaERaERaERaERaESaETaERaEUaERaEVaESaERaERaERaERaEWaEXaEYaEZaFaaCdaFbaFcaDYaFdaBbaCgaFeaMBaCYaCgaAxaFfaHCaHCaHIaBcaBdaHJaITaITaPhaAxdamaFmazBazBazBazBazBaFnaFoaFpazKaaaaaaaMUaLHaLHaLHaLHaLHaLHdacaNoaNoaNoaNoaNoaNoaNoaEcaLHaLHaLHaLHaHNaLHaLHaHKaLHdaodandaqdapdaraOCaOCaOCdasaIQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvaFyaFzaFAaFBaFCaFDaFEaFFaFDaFGaFHaFDaFDaFIaABayYaABcyVayYayYcyWczLaABaPyaKxayYayYayYayYayYayYcwgczNayYaABaRkaRkaAHczOaAHaFPaACaAwaAwaAwaAEaAwaAwaAwaAFaFPaFUaFVaFVaFVaFVaFVaFVaFVaCJaERaFWaFXaFYaFZaGaaGbaGcaGdaGeaGfaGgaFXaGhaERaGiavVaGjaxzaGkaCWaGlaGmaGmaGnaGoaGpcuNaGraGraGuaGtaDgaGuaGtaGtaGvaGwaGxaAxaAxcwlaAxaEgaBkazBazBazBazBazBaBkazzazzazzaMUaMUaMUaArdcmdcmaxBaMUaMUaHKdcmaMUdaudcmaMUaxBaMUaHKaJedcmaMUaxBaMUaLHaJeaHKaLHaLIaIQdaydaedaAdazdaBdaedaCaIQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaAyaBmaGSaBmaGTaFzaFzaGUaBmaGSaBmaGVaGWaGXaGYaABayYcwgcwgaABaABaABczPczPaABaxFaABczPczPczPczPaCJaAHaAHaAHaAHaAHaAHaAHczOczQaFPaaaaabaaaaabaaaaabaaaaabaaaaFPaFUaFVaHiaHjaHkaHlaHmaFVaCJaERaHnaHnaBQaHpaHqaHraHsaHraHtaHuaBYaHnaHnaERaGiavVaHwaxzaGkaCWaCXazXazYazZaBbaHxaHyaHzaHAaHBaHBcxAaHDaHBaHDdaDdaFdaEaHHdaldbddaGazzaBkazBazBazBazBazBaBkaMUaDjaLHdaIdaJdcmaMUdcmaDjaLHaMUaDjaHKaMUaMjaLHaMUaPzaLHdcmdaPdaOaMUbfwaLHdcmaxBaxBaHKaxBaCxaIQdaUdaedaWdaVdaWdaedaXaIQaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaAyaBmaGSaBmaGTaFzaFzaGUaBmaGSaBmaGVaGWaGXaGYaABayYcwgcwgaABaABaABczPczPaABaxFaABczPczPczPczPaCJaAHaAHaAHaAHaAHaAHaAHczOczQaFPaaaaabaaaaabaaaaabaaaaabaaaaFPaFUaFVaHiaHjaHkaHlaHmaFVaCJaERaHnaHnaBQaHpaHqaHraHsaHraHtaHuaBYaHnaHnaERaGiavVaHwaxzaGkaCWaCXazXazYazZaBbaHxaHyaHzaHAaHBaHBcxAaHDaHBaHDdaDdaFdaEaHHdaldbddaGazzaBkazBazBazBazBazBaBkaMUaDjaLHdaIdaJdcmaMUdcmaDjaLHaMUaDjaHKaMUaMjaLHaMUaPzaLHdcmdaPdaOaMUbfwaLHdcmaxBaxBaHKaxBaCxaIQdaUdaedaWbbYdaWdaedaXaIQaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaIfazEaDkaCzaBmaIiaIjaIkaIlaBmaCzaDlaAvazEaIoaIpaABayYayYayYayYayYayYczPczRczTczScAOczUcAPczRczPbgbaIwaEJaEJaEJaEJaEJaEJcAQcARaFPaabaIAaIAaIAaIAaIAaIAaIAaabaFPaFUaFVaIBaICaIDaIEaIBaFVaCJaERaERaERaERaIFaIGaFXaIHaFXaIGaIIaERaERaERaERaGiavVaIJaxzaGkaCWaCeazXazYazZaCfaIKaILaILaILaILaILaILaILaIMaILaINaINaINaINaINaIOaMUazzaBkazBazBazBazBazBaBkaMUaMUaLHdaYdaJdcmdaZaMUaLHaLHaMUaLHaHKdcmaLHaLHaMUaLHaLHdcmaHKaKaaMUaLHaLHdcmdbaaLHaHKaLHdbcdbbdbbaIQaIQaIQaIQaIQaIQaIQaIRaIRaIRaIRaIRaabaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvaGSaBmaBmaBmaBmaBmaBmaGSaAvaJnazEaJoaJpaJqaJqaJqaJqaJqaJqcASczPczRcATczScAUcATcATczRczPaJxaJyaJzaJzaJzaJzaJzaJzaJzaJzaJwaaaaIAaJAaJBaJCaJDaJEaIAaaaaFPaFUaFVaIBaJFaJGaJHaIBaFVaCJaERaJIaJIaBQaJJaJKaHraHsaHraJKaJLaDoaHnaHnaERaGiavVaGjaxzaJNazmaJOazXazYazZaBbaIKaILaJPaJQaJRaJRaILaJSaJQaJTaINaJUaJVaJWaINaJXaMUaaaaDqaDraDraDraDraDraDsaaaaMUaLHdbedbfdcmdcmaMUaMUdcmdcmdbgdbhdcmaMUaAsaMUaMUdcmdcmdbjdbiaMUaMUaMUaWadbaaLHaHKaLHdbcaNaaAraOMaMUdbldbmdblaMUaMUaMUaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKlaKmaKnaKmaKmaKoaKpaKmaKmaKnaKqaKrazEaGTaKsaJqaKtaKuaKvcBXcZjcBYczPczRcATczScZkcATcATczRczPaKDaKEaKFaKGaKHaKIaKJaKKaKLaKMaJwaabaIAaKNaKOaKPaKQaKRaIAaabaFPaFUaFVaKSaKTaKUaKVaKWaFVaCJaERaFWaFXaKXaKYaIGaFXaKZaFXaIGaLaaLbaFXaGhaERaGiavVaLcaxzaGkaAZaBaazXazYazZaLdaLeaILaLfaJQaJQaJQaLgaLhaLiaLjaINaLkaLlaLmaLnaLoaAsaaaaaaaaaaaaaaaaaaaaaaaaaaaaMUdbodbndbqdbpdbraMUaGyaLHaJeaHKaLHaMUaaaaMUaLHaLHaLHaLHaHKaLyaLzaLAaLAaLAaLAaLCaLBaLDdbtaLEaLFaLEdbvdbudbudbwdbydbxdbAdbzdbzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8079,7 +8079,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvaWraBmaBmaBmaBmaBmaBmaWraAvaJnazEaWuaWvaAvaWxaWyaWzaWzaWAaAyaWBaUCaWCaWDaYgcZRaWFaWGaWHaWHaWIaWJaWJaWJaWKaWLaWLaWMaWNaWOaWHaWHaWPaWQaWRaWSaWTaWTaWUbdkaWVaWQaWQaWQaWWaUWaUXaUYaUZaUZaUZaUZaWXaUZaUZaUZaUZaUZaUZaWYaWZaXaaXbaXcaXdaXeaXfaXgaXhaXiaXiaXiaXjaXkaXkaXkaXlaVyaVyaVyaXmaXnaVyaINaXoaXpaVDaVDaXqaVDaXraXsaVGaXtaSdaXuaXvaXwaXxaXyaSdaXzaXAaXBaXCaXDaXEaSlaFSaXGaFSaSlaSlaSlaSoaSlaSlaSqaLHaOQaXHaQFaQFaQFaXIaQFaXJaOVaOVaOVaOVaOVaOVaOVaXKaOVaPfaPfaPeaPfaXLaXMaNqaXNaXOaXPaXQaXRaXSaXTaXUaFTaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaIfazEaAvaCzaBmaXWaXXaXYaXZaBmaCzaAvaAvazEaYcaSPaAvaYdaYeaWzaWzaWAaAyaYfaUCaFzaWDaYgaUGaYhaYiaUGaUGaYjaYkaYlaUGaYmaYnaYoaYnaYpaYqaYnaYnaYraYnaYnaYsaYtaYnaYuaYsaYvaVTaUGaUGaYwaYxaYyaYzaYAaYBaYAaYCaYDaYCaYCaYCaYCaYCaYCaYEaYFaYGaYGaYGaYGaYHaYGaYIaYJaYGaYGaYKaYLaYMaYMaYMaYMaYMaYMaYMaYNaVyaVyaINaYOaYPaYQaYRaYRaYSaYTaXsaVGaYUaSdaSdaSdaSdaSdaYVaSdaYWaYXaYYaYZaTQaZaaSlaZbaZcaZdaZeaZfaZgaZhaZiaSlaSqaWaaOQaZjaZkaQFaZlaZmaQFaZnaZnaOQaZoaZpbeKaNqaZraZsaZtaPfaPfaZuaZvaNqaZwaNqaZxaXOaZyaZzaZAaXOaXOaZBaFTaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaAyaAvaWraBmaGTaFzaFzaGUaBmaWraBmaZDaZEaZFaZGaAvaZHaZHaUzaZHaUAaAyaZIaUCaFzaAyaSUaSUaZJaZKaZKaZKaZKaZKaZKaZLaZMaZKaZKaZKaZKaZKaZKaZNaZOaZPaZPaZQaZPaJaaGCaKiaJaaJaaZUaZVaZWaSUaZXaZXaZYaZYaZYaGEaGEaGEaGEaGEaGEaGEaGEbacaGFaGFaGGaGFaGRaGRaGRaGRaHeaGZaGRbacaHgaHgaHgaHgaHgaHgaHgaHgbaobaobaoaINbapbaqbarbarbarbarbasbatbaubavbawbaxbcjbazbaAbaBaSdaSdbaCaHhaHoaHhaHhaSlbaHbaIbaJbaJbaJbaJbaKbaLaSlbaMdcjaOQbaNaQFaZlaZlaZmaZlaQFbaOaOQbaPbaQbaRaNqaPfbaSbaTbaUbaUbaVbaWbaXbaYbaZbbabbbbbcbbdaXQaXOaXObbeaFTaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtdcdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHvbbfaFzbbgbbhbbibbjbbkbblbbjbbmbbnbbjbbjbbobbpbbqbbrbbsbbsbbsbbtbbsbbubbvaAybbwbbxbbyaZKbbzbbAbbBbbCbbDbbBbbEbbFbbGbbHbbIbbJaZKbbKbbLaZPbdjbdgbdiaJabdhbbObbNaJabbQaHEbbSbbQbbQbbQbbTaUZaVeaGEaaaaaaaaaaaaaaaaaaaaabacbbVbbWbbXbbYbbZbcabcbbccbcdbcebcfbacaaaaaaaaaaaaaaaaaaaaaaHgbchaVybciaINcrgbaqbavbavbavbavbavbckbclbavbavbavbaybcmbcmbcnbcpbcrbcqbcobcubctbcsaSlbcvbcwbcxbcybcybcxbczbcAaSlaSqaLHaOQbcCbcDaQFaZlaZmaQFbcEbcEaOQaOQbcFaOQaNqbcGaZsaZvbcHbcHbcIaZvaNqaNqaNqbcJaXObcKbcKbcLbcKaXObcMaFTaabaaaaaabcNaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHvbbfaFzbbgbbhbbibbjbbkbblbbjbbmbbnbbjbbjbbobbpbbqbbrbbsbbsbbsbbtbbsbbubbvaAybbwbbxbbyaZKbbzbbAbbBbbCbbDbbBbbEbbFbbGbbHbbIbbJaZKbbKbbLaZPbdjbdgbdiaJabdhbbObbNaJabbQaHEbbSbbQbbQbbQbbTaUZaVeaGEaaaaaaaaaaaaaaaaaaaaabacbbVbbWbbXbWEbbZbcabcbbccbcdbcebcfbacaaaaaaaaaaaaaaaaaaaaaaHgbchaVybciaINcrgbaqbavbavbavbavbavbckbclbavbavbavbaybcmbcmbcnbcpbcrbcqbcobcubctbcsaSlbcvbcwbcxbcybcybcxbczbcAaSlaSqaLHaOQbcCbcDaQFaZlaZmaQFbcEbcEaOQaOQbcFaOQaNqbcGaZsaZvbcHbcHbcIaZvaNqaNqaNqbcJaXObcKbcKbcLbcKaXObcMaFTaabaaaaaabcNaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHvbcObcPbcObcObcObcObcObcObcPbcObcObcQaFzbcRbcSbcTaFzbcUaFzbcVbcWbcXbcYbcZaAybbxbbxbdaaZKbdbbbBbbBbbBbbBbbBbbEbdcbbBbbBbbBbddaZKbbKbdeaZPbdfbbMbeFaJaaZTaZSaZRaJabdlbdmbdnbdobdpaHEbbTaUZaVeaGEaaaaaaaaaaaabacbacbacbacbdrbdsbdtbdubdvbdwbdxbdybdzbdAbdBbacbacbacbacaaaaaaaaaaaaaHgbchaVyaVyaHFbavbdDbdEbdFbavbdGbdHaLmbdIbdJbdKbavbaybdLbcmbdMbdNbcmbdObdPbdQbdRbcmbdSbdTbdUbcxbcybcybcxbdVbdWaSlaSqdauaOQbaNaQFaZlaZlaZmaZlaQFaQFbdYbdZaQFbeaaNqbebbecbedbcHbcHbeebedbefaNqbegbehaXObeibeibejbeiaXObbeaFTaHPaFTaFTaFTaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazEazEaAvaAvaAvaAvaAvaAvaAvaAvaAvazEaAybeqberbesbesbesbesbesbesbetbesbesbesaAybbxbbKbeuaZKbevbbBbbBbewbexbeybezbewbbBbbBbbBbeAaZKbbKbbLaZPbeBbqwbbPaJabeEcePcZXaJabeGbeHbeIbeJbnEaHEbeMbeNaVeaGEaGEbeQbacbacbacbeRbeSbeTbeUbeVbeVbeWbeXbeVbeYbeVbeZbfabfbbfcbfdbfebacbacbacbeQaHgaHgbchaVyaVyaINbfgbdDbdJbdFbavbfhbfibavbfjbfkbdKbavbaybcmbcmbflbfmbfnbfobfpbfqbfrbcmbfsbdTbftbcxbcybcybfubfvbdWaSlaSqaLHaOQbfxbfybfzaZlaZmbfAaQFaQFbfBaQFbfCbfDaNqbfEbfFbfGbcHbcHbfHbfGbfIaNqbfJbehaXOaXOaXOaXQaXOaXObfKbfLbfMbfNbfObfPaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQbfQaabaAvaIiaFBbfSbesbfTbfUbfVbfWbfXbfYbfZbgabesbjjbgcbgdbgeaZKbgfbbBbbBbewbeybggbghbewbbBbbBbgibgjaZKbbKbbLaZPaZPbgkaZPaJabeEbeDbhSaJabglbeJbgmbeJbgnaHEbbTbgoaVeaVfaVfbgpaHQbgrbacbgsbdtbgtbeVbeVbgubgvbgwbgxbgwbgybgzbgAbgBbgCbgDbgEbacbgFaHQbgGbgHbgIbchaVyaVyaHFbavbgJbavbavbavbgKbgLbavbfjbgMbdKbavbaybcmbcmbgNbgObgPbgQbgRbgSbfrbgTaSlbgUbftbcxbcybcybcxbfvbgVaSlbgWbgXaOQbgYaOQaOQbgZaZmbhabhbaQFbhcbhdaUgbhebaZbhfbhgbhhbhibhibhjbhkbhlbaZbhmbhnaXObhoaXOaXQaXOaXObhpaFTaHPaFTaFTaHPaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8114,7 +8114,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbD aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaabTlbZFbZGbZHbTlbaDbaDbaDbNBbNBbZJbZJbZJbNBbNBbTCbZKbZKbZLbZNbTCcdabZObTEbYqbWVbWVbWVbZPbTIbYtbWYbWYbZQbZRbZSbZTbZUbZVbTObTObTObTObTObZWbTObTObZXbZYbTTbTTbZZbTTbTWbTTbTTbNRcaacaabNRbNRcabcaccadbemcafcagcahcaibencakcalbYYbelcancaocapcaqcarcasbUjcatcaucavcawcaxcaycazcaAcaBcaAbeobeobeocaAcaFcaAcaAcaGcaHbXUbXUbOxcaIbXVbOBcaJcaKcaLcaMcaNcaOcaPcaPcaQcaRcaScaTcaUcaVcaWcaXcaYcaZcbacbbcbccbdcbecbfcbgaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaabUMbUNcbhcbicbibWHbWHbWHbWHbWHbWHbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbjbRMcbkbRMcblcbmaabaaaaaabNBbaDbaDbaDbNBaaabTCcbqcbrcbscbtbYocbucbvbTEcbwcbxcbybWVcbzcbAcbBcbCcbDcbEcbFbTIcbGcbHcbIcbJcbKcbKcbKcbKcbLcbMcbNcbOcbOcbPcbPcbQcbRcbSbTRbNRcbTcbUcbVcbWbepbXscbYcadbeObeLccbcccbajbePcceccfccgcchcchccicchcchcchccjbUjcckcclccmccnccoccpccqcaAccrccscctccuccvccsccwccxccsccycczbQgbOxbOxccAccBccCccDccEccFccGccHccIccJccKccLccMccNccOccPccQccRccQccSccRccRccRccTccUccVccWccXaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabUNbUNccYbWHbWHbWHbWHbWHbWHbWHbWHbWHbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabccZbTCbTCbTCcqvbTCbTCcdbbTEcdccddcdecdfcdgcdhcdicdjbZkcdlcdmcbAcdncdocdpcdqcdrcdrcdrcdrcdscdtcducdvcdwcdvcdxcdycdzcdAcdBcdCcdDcdEcdFcdGcdHcdIcdJcdKcdLcdMcdNcdOcdPcdQcdRcdScdTcdTcdTcdUcdVcdWcdXcdYcdZcdZceacdZcebbffbgqbfRcaAcefcegcehceicehcejcekcelccsbOxcembOxbOxcenceobXVbzwbDbbThcepbThbThceqcercescetceuccRcevcewcexccKcexccKceyccKccKbThcezceAceBceCaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaabUNbWHbWHbWHbWHbWHbWHceDbWHceEbWHbWHbWHbWHbWHbUNbUNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccZceFceGceHbTCceIbTEceJceKcdkbYqceMceNceObYtbVfceQceRceNceSceTceUceVceVceWceXceYceZcfacfbcfcbHTcfdbTRcfebHTbHTcffcfgcfhcficfjcdGcfkcflcfmcfncfocfpcfqcfrcfscfpcfpcftcfucfucfucfvcfucfwcfucfxcfycfzcfAcfBcfCcfDcfEcfFcaAcfGcfHcfIcfJcfIcfKcfLcehbhqcfNcfObzwcfPbzwceobXVbzwbDbcfQcfRcfSbThbThbThbThbThcfTccKcfUcfVceyccKcfWccKbXXccKcfXbThcfYcfZcgabThaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabUNcgbcgbcgbcgbcgbcgbcgcbWHcgdcgbceEbWHbWHbWHbWHbUNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccZceFceGceHbTCceIbTEceJceKcdkbYqceMceNceObYtbVfceQceRceNceSceTceUceVceVceWceXceYceZbWIcfbcfcbHTcfdbTRcfebHTbHTcffcfgcfhcficfjcdGcfkcflcfmcfncfocfpcfqcfrcfscfpcfpcftcfucfucfucfvcfucfwcfucfxcfycfzcfAcfBcfCcfDcfEcfFcaAcfGcfHcfIcfJcfIcfKcfLcehbhqcfNcfObzwcfPbzwceobXVbzwbDbcfQcfRcfSbThbThbThbThbThcfTccKcfUcfVceyccKcfWccKbXXccKcfXbThcfYcfZcgabThaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabUNcgbcgbcgbcgbcgbcgbcgcbWHcgdcgbceEbWHbWHbWHbWHbUNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccZcgfcgecggbTCceIcghcghcghcghcghcghbTIbTIbTIbTIbTIbTIbTIcgicgjcgkcglcgmcgncgocgocgpcgqcfbbHTbHTcgrcgscgtbHTbHTbHTcgucgvcgwcdEcgxcgycgzcfucgAcgBcgCbQWcgBcgDcdTcdTcdTcdTcdTcdTcgBcdTcdTcdTbQWcgEcgFcgGcgHcgIcgJcgKcgLcaAcgMcgNcehcgOcehcgPcgQcgRcgScgTcgUcgVbzwcgWceobXVcgXbDbbDicgYcgZchabumbvWbvWbThchbchcchdchechfchgchhchichjchkchlbThchmchnchochpaacaacaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaachqbWFbWFbWFbWFbWFbWFbWFchrchsbWHbWHbWHbWHchtbdqbUNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccZccZccZccZbTCceIccZaaaaaaaaaaaachuchvchwchxchychzchAchBchCchDchEbhrchGchHchIchIchJchKchLchMchMchMchMchNchMbHTbHTbNRchOchPchQchRchSchTcgIchUchVchWchXchYchZciacdTcdTcibcicbhsciebhscicbEDcifcigcigcihciicijcakcikcilcaAcimcinciocipciqcirciscaAcaAbDbcitbDbbDbbDbciucivciwbDbbvWcgYcixciybumbumbumbThbThbThbThbThbThbThbThbThbThbThbThbThbThbThbThbThaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabUNcbicbicbicbicbicbicizbWHcbhcbiciAbWHbWHbWHbWHbUNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciBaaaaabaabciCciCciCciCciCciCciDciCbTCcdbbhtaaabhubjJbhYbjYciJciKciLciMciNciOciPciQciRciSciTciUciVciWciXciYciZchLcjacjbcjbcjbcjcchMbHTbHTcjdcjdcjdcjdcjecjdcjfcjfcjgcjdcjdcjhcjdcjicjjbkycjlbkycjmcjncjocjpcjqbuXbuXcjrcjscjtcjucjvcjwcjxcbScaAcaAcjycaAcjzcaAcjAcjBcjCcfdcjDcjFcjGcjHcjIcjJcjKcjLcjIbvWcgYcjMbvWcjNcjOcjPcjQcfQbvWbvWbvWbvWbvWbvWbvWcjRcjEaZCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUNbWHbWHbWHbWHbWHbWHceDbWHciAbWHbWHbWHbWHbWHbUNbUNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8122,7 +8122,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclrclsclsclsclscltcluclvclwclxclxclyclzclAceIbhtaaabmZclBclCclDclEclFclGclHclEclEclIclJclKclLclMclMclNclOcgoclPclQbneckvckvckvckvclSchMbHTbHTcjdclTclUclVclWclXclYclYclZcmacmbcmccmdcmecjdcmfcdTcmgbEDcmhckNcmickPaaaaaacjvcmjcmkcmlcjvbHUcmmcmncmncmncmncmncmnckTcmpcmqcmocmscmsbnfbnfcmscmvcmwcmxcmycmzcmAcmBcmCcmAcmAcmAcmAcmAcmAcmAcmAcmAcmAcmAcmAbvWcmDcmraZCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabZEbUNbUNcgbcgbbWHbWHbWHbWHbWHbWHbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacmEcmFcmGcmHcmGcmIcmJcmKcmLbRSbGWclzcmNcdbbhtaaabmZcmOcmPcmQcmRciKcmScmTcmUcmVchBckoceTcmWcmXceVcmYcmZbhrbhrbhrcndcneckvckvcnfcngchMbHTcnhcjdcnicnjcnkcnlcnlcnlcnmcnncnlcnlcnocnkcnpcnqcnrcdTcnsbEDcntckNcnuckPaaaaaacjvcnvcnwcnxcjvcnybHTcnhcnzcnzcnzcnzcnzbngbnkbnjcnzcnzaaaaaaaaaaaacjIcnDcnEcnFcmAcnGcnIcnHcnKcnJcnMcnLcnOcnNcnQcnPcoXcnRcpacmAcnScnTcnUcnVcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnXcnYbUNbYcbUNbWHbWHbWHbWHbWHbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaacmEcnZcoacobcocclwcodclwcoeclwcofcogcohcoibhtaaabnlbjJbnIbjYcomciKciKconcoocopcoqcorcoscotcouceVcovcowcoxcoycozchLcoAckvckvckvcoBchMbHTbHTcoCcoCcoDcoEboQboQboQcoCbpobpobpocoLcoMcoDcoNcmfcdTcmgbEDcoOckNckOckPaaaaaacjvcoPcoQcoRcjvbHTbHTbHTcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpPcoTcoUcoVbqlcpbcoYcoYcoZcoYcoYcoYcoYcoYcpdcpccpfcpecphcpjcpjcpkcplcpjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUNcpmcpncpobUNbUNbWHbWHcppbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacmEcpqcmGcprcmGcpsbSzbSHbSEcqUcpwclzcpxcdbccZaaaaaaaaaaaachucpycpzcpAcpAchBcpBchBcpCceTbZUcpDcpEcpFcpGcpHcpHcpHcpIcpJckvcpKckvcpLchMbHTbHTcoCcpMcpNcpOcpPcpQcpRcoCcpQcpRcpPcpScpTcpUcoNcnrcpVcnsbEDcpWckNcpXckPcnzcnzcjvcjvcjvcjvcjvcpYbHTbHTcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpPcqacqbcqccqdcpicqfcqhcpgcoYcoYcqjcoYcoYcpdcpfcpfcpfcoXcpjcqncqocqpcpjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcgcqrcqsbYdbUMbUNbUNbWHbdqbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacmEcpqcmGcprcmGcpsbSzbSHbSEcqUcpwclzcpxcdbccZaaaaaaaaaaaachucpycpzcpAcpAchBcpBchBcpCceTbZUcpDcpEcpFcpGcpHcpHcpHcpIcpJckvcpKckvcpLchMbHTbHTcoCcpMcpNcpOcpPcpQcpRcoCcpQcpRcpPcpScpTcpUcoNcnrcpVcnsbEDcpWckNcpXckPcnzcnzcjvcjvcjvcjvcjvcpYbHTbHTcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpPcqacqbcqccqdcpicqfcqhcpgcoYcoYcqjcoYcoYcpdcpfcpfcpfcoXcpjcqnbYfcqpcpjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcgcqrcqsbYdbUMbUNbUNbWHbdqbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUabCcqtcqtcqtcqtcqtcqtcqtcqtcqucqucqucqucquciCclzclzclzclzclzclzcqvcqwcqxcqxcqxcqxcqxchuchBchBchBchBchBchBchBcqyceTbZUcqzcqAcqBcqCcqDcqEcqFcqGcqHcqIcqJcqKcqLchMbHTbHTcoCcqMcqNcpOcpPcpPcqOcoCcqPcpPcpPcpScpOcqQcoNbEDbEDbEDcqRcqSckNcqTckPczvbHTbHTbHTbHTcqVbHTbHTbHTbHTcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpPcqXcqYcqZbricqlcqgcqecqicoYcoYcoYcoYcqmcrhcrbcsvcsucqkcpjcricrjcrkcpjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcgbcgbcgbcgbUMbUMbUNbUNbUNbUNbUOaabaabaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrmcrncrocrpcrqcrqcrrcrscrtcrucrvcrwcrxbrMcrzcrzcrzcrAcrBcrCcrDcrDcrEcrFcrGcrHcrIcrHcrHcrHcrGcrHcrHcrJcrKcrLcrMceTbZUcrNcrPcrOcrQceVcrRclMcrScrTcrUcrVcrWcrXcrYbHTbHTcoCcrZcsacsbcsccsdcsecoCcsfcsdcsgcshcsbcsicoNbHTbHTbHTcsjcoOckNcoOcskbHTbHTcFLbHTbHTbHTbHTbHTcfccGOcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcjIcsmcjLcslcrccrecrdcuQcrfcsocsncoYcoYcsqcspcsscsrcstcpjcsxcsycszcpjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrmcrncsAcsBcsCcsBcsDcsEcsFcsGcsHcsIcsHcsJcsKcsKcsKcsKceTbZVbZVbZVcsKcsLcsKcsKcsKcsKcsKcsKcsKcsKcsKcsKcsMcsNcsOcsPcsQcsRcsScsTcsUcsVcsWcsXcsYcsZctactbctcctdctecmnctfctgcthctictjctkcpPctlcoCctmcpPctkctncpOctocoNctpcmscmsctqctrctscttckPbnjbnjbnjbnjcnzcnzcnzbnjbnjbnjcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjIctyctzctAcjIcmAcmAcmAcmAcmAcmAcuTcsncuUctBcswctCcmAcmAcpjbsyctMbsybsyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8138,10 +8138,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaaaaabaaaaabaabcEqaabaabaabcEqaabaaaaabcEqaabaaaaaaaaaaaaaaaaaaaaaaaabCxbCxbCxcEucEvcEwcExcEycEzcEAcDacDacEBcECcvecvecEDcEEcEEcEEcEEcEFcEGcEHcEGcEGcEGcDocDocEIcEJcEKcELcEMcDucENcDrcDucDucDucDucEOcBucEPcEQcCqcDAcCscDAbBGcDCcDDcEScETcEUcEVcEWbCUaabcEYcEZcDOcFacCDaaaaaaaaacDQcFbcFccFdcDRcFecFfcFgcFhcFiczEczDcFicFjcFkcFlczEczDcyJaaaaaacjIcvPcvQcvRbDrcAIcyMcFncFocFpcEmcFqcFrcFscFtcFucjIaabaabaagaaaaaaaaaaaaaaaaaaaaaaaaaaacyXaabaaaaaaaaaaabaabaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaakSaabcFvcFwcFwcFxcFycFzcFzcFzcFycFzcFzcFzcFycFzcFzcFAcFwcFwcFwcFwcFwcFBcFCcFDcFEcFFcFGcFHcFIcFJceHcwycFKcDacvecvecvecZTcEDcEEcFMcFNcFOcFPbDscFRcFScFTcFUbDtcFWcFXcFYcFZcGabDtcGccGdcDrcGecDucDucDucGfcBucGgcGgcDAcGhcGicGjcGkcGlcGmcGncGocGpcGqcGrbCycGscDLcGtcDOcDOcCDaaaaaaaabcDQcGucFccGvcDRcGwcGxcCIcGycFicGzcGAcFicGBcGCcFlcGzcGDcyJaaaaaacjIcxtbTHcxtcGEcxwcqacGFcFocGGcqacqacGHcvWcvWcvWcjIaaaaaaaaaaaaamjamjamjawTaabaabaabaabcGIaabaabaabaabaabalwamjamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaaaaabaaaaabaabcGJaabaaaaabcGJaabaaaaabcGJaabaaaaaaaaaaaaaaaaaaaaaaaabCxbCxbCxcGLcGMcGNcCYcZUceHcGPcEzcEzcEzcEzcGQcEzcFJcEEcGRcGScGTcGUbDGcGWcGXcGYcGZbEocHbcHccHdcHecHfbFlcHhcDqcDrcZicHjcDucDucHkcBucHlcHmcDAcHncCscHocHpbFvbFtbGBbFQbGEbGCbGEbGGaabcCDcCDcCDcCDcCDaabaabaabcHxcHycFccGvcDRcHzcHAcHBcHCcHDcHEcHFcHFcHGcHFcHHcHIcDRcHJaaaaaacjIcxtcxtcxtbDrcHKcHLcHMcHNcHOcCTcCTcCTcHPcHQcHRbGHaaaaaaaaaaaaamjaaaaabaaaaabaaaaaaaaacHTaaaaabaabaaaaaaaaaaaaamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaczakSaabaabcyYcHUczaaaacyYcHUczaaaacyYcHUczaaabaaaaaaaaaaaaaaaaaaaaaaabaabbCxcCYcCYcCYcCYcHWcHXcHYceHcZVceHceHcEDcIaceHcEEcIbcIccIdcIebGIcIgcIhcIicIjbGRcIlcImcIncIocIpbGRcIrcIscItcIucIvcIwcIxcIycIzcIAcGjcIBcICcIDcIEcIFcIGcIHcIIcIJcIKcILcIMbGVcDKcDLcIPcIOcIOcCDaaaaaaaabcDQcIQcFccIRcDRbIxbIxbIxbIxcDRcIVcIWcIXcIYcIZcJacJbcIYbIBaaacDPcjIcjIcjIcjIcjIcJdcqacJecyMcJfcyMcJgcyMcJhcyMcJibGHaaaaaaaaaaaaamjaaacJkcJkcJkcJkcJkaabcJlaabcJkcJkcJkcJkcJkaaaamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJmaaaaaaaaacJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaczakSaabaabcyYcHUczaaaacyYcHUczaaaacyYcHUczaaabaaaaaaaaaaaaaaaaaaaaaaabaabbCxcCYcCYcCYcCYcHWcHXcHYceHcZVceHceHcEDcIaceHcEEbYRcIccIdcIebGIcIgcIhcIicIjbGRcIlcImcIncIocIpbGRcIrcIscItcIucIvcIwcIxcIycIzcIAcGjcIBcICcIDcIEcIFcIGcIHcIIcIJcIKcILcIMbGVcDKcDLcIPcIOcIOcCDaaaaaaaabcDQcIQcFccIRcDRbIxbIxbIxbIxcDRcIVcIWcIXcIYcIZcJacJbcIYbIBaaacDPcjIcjIcjIcjIcjIcJdcqacJecyMcJfcyMcJgcyMcJhcyMcJibGHaaaaaaaaaaaaamjaaacJkcJkcJkcJkcJkaabcJlaabcJkcJkcJkcJkcJkaaaamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJmaaaaaaaaacJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaaaaaacyYcHUczaaabcyYcHUczaaaacyYcHUczaaaaaaaaaaaabaaaaaaaaaaaaaabaabaabaaaaaaaabaabcJncJncJncJncJncJncJncJocJncJncEEcJpcJqcGTcGTbGIbICbGIbJhcJvcDocJwcJxcFZcJycJzcDocJAcDucDrcJBcJCcJDcIxcJEcJFcJGcJHcJIcJJcJKcJHcJLcJMcJNcJOcDAcJPcJQcJRbJCaabcEYcJUcJTcJVcCDaaaaaaaaacDQcDRcJWcJXcDRcJYcJZcKacKbcKccFccKdcKecIYbJEcKgcKhcKibIBaabaaaaaaaaaaaaaaacjIcKkcKlcKmcKncKocKpcKqcKrcKocKpcKscjIaaaaaaaaaaaaamjaabcKtcKucKucKucKucKvcKwcKxcKycKycKycKycKzaabamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJmcJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaakSaabcyYcHUczaaaacyYcHUczaaaacyYcHUczaaabaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaabaabaabcJncKAcKAcKBcKCcKDcKDcKEcKFcKGcKHcIdcIecGTcGTcGTcKIcGTcGTcGTcDocKJbJVcKLbJWbJXcKOcKPcKQcKRbKhbKhbKhcKVcKWcKXcKYcKZcLacHncCscLbcLccLdcLecLfcDAcJPcLgcLhbKMcLjcDLcLkcIOcIOcCDaabaaaaaacHxcLlcLmcLncLocLpcLqcLpcLpcLrcLscLtcLucLubLscLwcLxcLybLtaabaabaaaaaaaaaaaacjIcLAcLBbLucvWbLEcLEbLUcvWbLVcLHbLWcjIaaaaaaaaaaaaamjaabcLJcLJcLJcLJcLJaaacJlaaacLJcLJcLJcLJcLJaabamjaaaaaaaaaaaacJmaaaaaacJmaaaaaacJmcJmcJmcJmcJmcJmcJmaaaaaacJmaaaaaacJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaakSaabcyYcHUczaaaacyYcHUczaaabcyYcHUczaaabaabaabaaaaabaaaaaaaabaabaaaaaaaaaaabaaaaaacJncKAcKAcKBcLKcLKcLKcLLcLLcLMcEEcLNcLOcLPcLQcLRcLScLTcLUcLUcLVcLWcLXcGTcGTcGTcLYcLZcMacMbcMccMdbUJbNdcMgcEEcMhcMhcMicHncCscMjcMkcMlcMmcMncDAcMocMpcMqbNgcMscCDcCDcCDcCDcCDaaaaaaaaacDQcMtcMucMvcMwcMxcMycMxcMxcMzcMAcMBcMCcLybNlcMEcKhcIYbNqaabaabaaaaaaaaaaaacjIcMGcxtcxtcvWcMHcxtcxtcvWcMHcxtcxtcjIaaaaaaaaaaaaamjaaaaabaaaaabaabaabaaacJlaaaaabaaaaabaaaaabaaaamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaakSaabcyYcHUczaaaacyYcHUczaaabcyYcHUczaaabaabaabaaaaabaaaaaaaabaabaaaaaaaaaaabaaaaaacJncKAcKAcKBcLKcLKcLKcLLcLLcLMcEEbYVcLOcLPcLQcLRcLScLTcLUcLUcLVcLWcLXcGTcGTcGTcLYcLZcMacMbcMccMdbUJbNdcMgcEEcMhcMhcMicHncCscMjcMkcMlcMmcMncDAcMocMpcMqbNgcMscCDcCDcCDcCDcCDaaaaaaaaacDQcMtcMucMvcMwcMxcMycMxcMxcMzcMAcMBcMCcLybNlcMEcKhcIYbNqaabaabaaaaaaaaaaaacjIcMGcxtcxtcvWcMHcxtcxtcvWcMHcxtcxtcjIaaaaaaaaaaaaamjaaaaabaaaaabaabaabaaacJlaaaaabaaaaabaaaaabaaaamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaalwaabcyYcMIczaaaacyYcMIczaaaacyYcMIczaaabakSaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaabcJncMJcMKcLKcLKcLKcMLcMMcMMcMNcMMcMMcMMcMMcMOcMPcMQcMRcMScMScMScMTcMUcMVcMScMScMScMUcMWcMXcMYcMdbUKbNdcMgcNbcNccNdcNecNfcNgcNhcNicLfcNjcNkcNlcNmcNncNobGVcNpcDLcNqcNrcNrcCDaaaaaaaaacDQcNscNtcNucNvcNwcNxcNycIYcNzcNAcNBcNCcNDbJEcNFcNGcNHbNqaaaaaaaaaaaaaaaaaacjIcNJbTXcxtcvWcNKbTXcxtcvWcNKbTXcxtcjIaaaaaaaaaaaaamjaaacJkcJkcJkcJkcJkaabcJlaabcJkcJkcJkcJkcJkaabamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaakSaaaaabaaaaaaaaaaabaabaabaaaaaaaabaabaaaakSaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaabcJncNLcLKcLKcLKcLKcLKcMMcNMcNNcNOcNPcNQcMMcNRcNScNTcJqcGTcGTcNUcNVbNtbNucNYbNvbNvcObcEEcOccMYcMdbULbNdcMgcEEcOfcMhcOgcOhcDAcNhcNicOicDAcNkcNlcJPcJQcOjbJCcOkcEYcOlcOmcOncCDaaaaaaaaacOobNwbNwbNwbNwcOscOscOtcOubJEbJEbNxbSSbJEcOzcOzbTicOAcOzaaaaaaaaaaaaaaaaaacjIcxtcxtcxtcvWcOBcxtcxtcvWcOBcxtcxtcjIaaaaaaaaaaaaamjaabcKtcKucKucKucKucKvcKwcKxcKycKycKycKycOCaabamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaczaczakSaczaczalwakSakSakSakSaczakSakSaczcODaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJncOEcLLcOFcOGcOHcOIcMMcOJcOKcOLcOMcONcOOcOPcOQcORcJqcGTcOScOTcOUcOVcOWcOXcOYcOZcPacPbcNTcJqcPccPdcMbcPecEEcPfcMhcPgcPhcDAcNhcNicLfcDAcPicNlcJPcPjcPkbKMcPlcDLcPmcNrcNrcCDaaaaaaaaacPnaaaaaaaaaaaaaaaaaacDQcPocIYcIYcPpcPqcPrcOzaacbTpbTqcPuaaaaaaaaaaaaaaaaaacjIcjIcjIcjIcjIcjIcjIcjIcjIcPvcPvcPvcjIaaaaaaaaaaaaamjaabcLJcLJcLJcLJcLJaaacJlaabcLJcLJcLJcLJcLJaaaamjaaaaaaaaaaaacJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/cyberiad/z3.dmm b/_maps/map_files/cyberiad/z3.dmm index 3f993b38313..acc12c8f234 100644 --- a/_maps/map_files/cyberiad/z3.dmm +++ b/_maps/map_files/cyberiad/z3.dmm @@ -222,6 +222,7 @@ "en" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/lattice,/turf/space,/area/turret_protected/tcomsat) "eo" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "ep" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"eq" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/computer/monitor{name = "telecoms power monitoring"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{icon_state = "bot"},/area/tcommsat/entrance) "et" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) "eu" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; level = 1},/obj/structure/lattice,/turf/space,/area/turret_protected/tcomsat) "ev" = (/obj/machinery/telecomms/server/presets/supply,/turf/simulated/floor{dir = 1; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; tag = "icon-vault (NORTH)"; temperature = 80},/area/tcommsat/chamber) @@ -330,7 +331,6 @@ "gC" = (/obj/machinery/turretid/stun{ailock = 1; check_synth = 1; control_area = "\improper Telecoms Foyer"; desc = "A firewall prevents AI's from interacting with this device."; name = "Telecoms Foyer Turret Control"; pixel_y = 30; req_access = list(61)},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor,/area/tcommsat/entrance) "gD" = (/obj/structure/sign/electricshock,/turf/simulated/wall/r_wall,/area/tcommsat/entrance) "gE" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/tcommsat/entrance) -"gF" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/monitor{name = "telecoms power monitoring"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{icon_state = "bot"},/area/tcommsat/entrance) "gH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/tcommsat/entrance) "gI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/tcommsat/entrance) "gJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/camera{c_tag = "Telecomms Power Room West"; dir = 1; network = list("Telecomms")},/obj/machinery/light/small{dir = 1},/turf/simulated/floor,/area/tcommsat/entrance) @@ -535,7 +535,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWcccdcgcfcgcHfXfYfYfYfYfZgagbgcgdgegfggghfYfffYfYgicMcgcfgjcdccbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWcccdgkcfcgcgdHdHgldHdHfNgmgngogpgqgrgsfNdHdHdHdHdHcgcgcfcgcdccbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWcccdcgcfcgcgcgcgcfcggtfNfNfNgugvfNfNfNfNgtcgcgcgcgcgcgcfcgcdccbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWcccdcfcfcfcfcfcfcfcfdTgxgygzgAgBgCgDgEgFdUcfcfcfcfcfcfcfcfcdccbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWcccdcfcfcfcfcfcfcfcfdTgxgygzgAgBgCgDgEeqdUcfcfcfcfcfcfcfcfcdccbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWcccccdcfcgcgcgcgcgcdgtgHgIgJgKgLgMgNgMgOgtcdcgcgcgcgcgcfcdccccbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWbWcccccdcdcdcdcdcdcdgtgtgtgtgPgQgRgtgtgtgtcdcdcdcdcdcdcdccccbWbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWbWccccccccccccccccccccccgtgSgTgUgtccccccccccccccccccccccbWbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/cyberiad/z6.dmm b/_maps/map_files/cyberiad/z6.dmm index 29886ded2b3..5e9b69ef4e8 100644 --- a/_maps/map_files/cyberiad/z6.dmm +++ b/_maps/map_files/cyberiad/z6.dmm @@ -6,6 +6,7 @@ "af" = (/turf/simulated/wall,/area/djstation) "ag" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/djstation) "ah" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave{pixel_y = 8},/turf/simulated/floor{icon_state = "bar"},/area/djstation) +"ai" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/machinery/computer/monitor,/turf/simulated/floor,/area/derelict/solar_control) "aj" = (/turf/simulated/floor/plating,/area/djstation) "ak" = (/obj/machinery/light{dir = 1},/obj/machinery/telecomms/relay/preset/ruskie,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/djstation) "am" = (/obj/machinery/power/terminal,/turf/simulated/floor/plating,/area/djstation) @@ -94,7 +95,6 @@ "bY" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/derelict/solar_control) "bZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/derelict/solar_control) "ca" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor,/area/derelict/solar_control) -"cb" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/machinery/power/monitor,/turf/simulated/floor,/area/derelict/solar_control) "cc" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/derelict/solar_control) "cd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/window/eastleft,/turf/simulated/floor,/area/derelict/solar_control) "ce" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor,/area/derelict/solar_control) @@ -751,7 +751,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMaaaaaaaeaeaeaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLbLbLbLbLbLbLbubububububDbNbuaaaabObPbQaabObPbQaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabubRbSbTbUbvbvbVaaaabObWbQaabObWbQaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabubXbYbZcabvbvbVaaaabObWbQaabObWbQaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabucbbvcccdcecfcgaaaaaachaaaaaachaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabuaibvcccdcecfcgaaaaaachaaaaaachaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabucicjcjckbvclcmcncocpcqcncncncrcscsabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabubXbvbvbvbvbvctaaaaaachaaaaaachaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacucucucucucucucucvcucucucucwcuaaaabObWbQaabObWbQaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm index adb59f7f0fe..e6858f04d18 100644 --- a/code/LINDA/LINDA_fire.dm +++ b/code/LINDA/LINDA_fire.dm @@ -85,7 +85,8 @@ if(item && item != src) // It's possible that the item is deleted in temperature_expose item.fire_act(null, temperature, volume) - animate(src, color = heat2color(temperature), 5) +// animate(src, color = heat2color(temperature), 5) + color = heat2color(temperature) set_light(l_color = color) return 0 diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index 3a33365efd4..0765980afc7 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -1,11 +1,10 @@ #define LIGHTING_INTERVAL 5 // frequency, in 1/10ths of a second, of the lighting process #define LIGHTING_FALLOFF 1 // type of falloff to use for lighting; 1 for circular, 2 for square -#define LIGHTING_LAMBERTIAN 1 // use lambertian shading for light sources +#define LIGHTING_LAMBERTIAN 0 // use lambertian shading for light sources #define LIGHTING_HEIGHT 1 // height off the ground of light sources on the pseudo-z-axis, you should probably leave this alone -#define LIGHTING_TRANSITIONS 1 // smooth, animated transitions, similar to /tg/station +#define LIGHTING_TRANSITIONS 0 // smooth, animated transitions, similar to /tg/station -#define LIGHTING_RESOLUTION 1 // resolution of the lighting overlays, powers of 2 only, max of 32 #define LIGHTING_LAYER 10 // drawing layer for lighting overlays #define LIGHTING_ICON 'icons/effects/lighting_overlay.dmi' // icon used for lighting shading effects diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index 2a936dde7b4..24ea8620193 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -62,4 +62,6 @@ var/score_richestkey = null var/score_dmgestname = null // who had the most damage on the shuttle (but was still alive) var/score_dmgestjob = null var/score_dmgestdamage = 0 -var/score_dmgestkey = null \ No newline at end of file +var/score_dmgestkey = null + +var/TAB = "    " \ No newline at end of file diff --git a/code/controllers/Processes/machinery.dm b/code/controllers/Processes/machinery.dm index 940530ab713..2d8986ff2ae 100644 --- a/code/controllers/Processes/machinery.dm +++ b/code/controllers/Processes/machinery.dm @@ -3,10 +3,10 @@ schedule_interval = 20 // every 2 seconds /datum/controller/process/machinery/doWork() - //#ifdef PROFILE_MACHINES - //machine_profiling.len = 0 - //#endif + process_power() + process_machines() +/datum/controller/process/machinery/proc/process_machines() for(var/obj/machinery/M in machines) if(M && isnull(M.gcDestroyed)) #ifdef PROFILE_MACHINES @@ -33,3 +33,12 @@ machines -= M scheck() + +/datum/controller/process/machinery/proc/process_power() + for(var/datum/powernet/powerNetwork in powernets) + if(istype(powerNetwork) && isnull(powerNetwork.gcDestroyed)) + powerNetwork.reset() + scheck() + continue + else + powernets -= powerNetwork diff --git a/code/controllers/Processes/power_machinery.dm b/code/controllers/Processes/power_machinery.dm deleted file mode 100644 index c7710c8e5bd..00000000000 --- a/code/controllers/Processes/power_machinery.dm +++ /dev/null @@ -1,40 +0,0 @@ -var/global/list/power_machinery_profiling = list() - -/datum/controller/process/power_machinery - var/tmp/datum/updateQueue/updateQueueInstance - -/datum/controller/process/power_machinery/setup() - name = "pow_machine" - schedule_interval = 20 // every 2 seconds - -/datum/controller/process/power_machinery/doWork() - for(var/obj/machinery/M in power_machines) - if(istype(M) && isnull(M.gcDestroyed)) - #ifdef PROFILE_MACHINES - var/time_start = world.timeofday - #endif - - if(M.process() == PROCESS_KILL) - M.inMachineList = 0 - power_machines -= M - continue - - if(M && M.use_power) - M.auto_use_power() - if(istype(M)) - #ifdef PROFILE_MACHINES - var/time_end = world.timeofday - - if(!(M.type in power_machinery_profiling)) - power_machinery_profiling[M.type] = 0 - - power_machinery_profiling[M.type] += (time_end - time_start) - #endif - else - power_machines -= M - else - if(istype(M)) - M.inMachineList = 0 - power_machines -= M - - scheck() diff --git a/code/controllers/Processes/powernet.dm b/code/controllers/Processes/powernet.dm deleted file mode 100644 index 185dbcf0606..00000000000 --- a/code/controllers/Processes/powernet.dm +++ /dev/null @@ -1,12 +0,0 @@ -/datum/controller/process/powernet/setup() - name = "powernet" - schedule_interval = 20 // every 2 seconds - -/datum/controller/process/powernet/doWork() - for(var/datum/powernet/powerNetwork in powernets) - if(istype(powerNetwork) && isnull(powerNetwork.gcDestroyed)) - powerNetwork.reset() - scheck() - continue - else - powernets -= powerNetwork diff --git a/code/datums/cargoprofile.dm b/code/datums/cargoprofile.dm index 282d402a74d..9fcb356b9b1 100644 --- a/code/datums/cargoprofile.dm +++ b/code/datums/cargoprofile.dm @@ -673,7 +673,7 @@ id = "people" whitelist = null - blacklist = list(/mob/camera,/mob/new_player,/mob/living/simple_animal/hostile/blobspore,/mob/living/simple_animal/hostile/creature, + blacklist = list(/mob/camera,/mob/new_player,/mob/living/simple_animal/hostile/blob/blobspore,/mob/living/simple_animal/hostile/creature, /mob/living/simple_animal/hostile/spaceWorm,/mob/living/simple_animal/shade,/mob/living/simple_animal/hostile/faithless,/mob/dead) universal = 1 mobcheck = 1 diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index bbd22e962ab..5329c966b92 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -10,21 +10,23 @@ var/list/blob_nodes = list() name = "blob" config_tag = "blob" - required_players = 15 - required_players_secret = 15 + required_players = 30 + required_players_secret = 30 + required_enemies = 1 + 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 var/cores_to_spawn = 1 - var/players_per_core = 20 + var/players_per_core = 30 var/blob_point_rate = 3 - var/blobwincount = 700 - var/stage_2_threshold = 0.60 + var/blobwincount = 350 var/list/infected_crew = list() @@ -56,12 +58,37 @@ var/list/blob_nodes = list() return 1 -/datum/game_mode/blob/proc/get_nuke_code() - var/nukecode = "ERROR" - for(var/obj/machinery/nuclearbomb/bomb in world) - if(bomb && bomb.r_code && (bomb.z in config.station_levels)) - nukecode = bomb.r_code - return nukecode +/datum/game_mode/blob/proc/get_blob_candidates() + var/list/candidates = list() + for(var/mob/living/carbon/human/player in player_list) + if(!player.stat && player.mind && !player.mind.special_role && !jobban_isbanned(player, "Syndicate") && (player.client.prefs.be_special & BE_BLOB)) + candidates += player + return candidates + + +/datum/game_mode/blob/proc/blobize(var/mob/living/carbon/human/blob) + var/datum/mind/blobmind = blob.mind + if(!istype(blobmind)) + return 0 + infected_crew += blobmind + blobmind.special_role = "Blob" + log_game("[blob.key] (ckey) has been selected as a Blob") + greet_blob(blobmind) + blob << "You feel very tired and bloated! You don't have long before you burst!" + spawn(600) + burst_blob(blobmind) + return 1 + +/datum/game_mode/blob/proc/make_blobs(var/count) + var/list/candidates = get_blob_candidates() + var/mob/living/carbon/human/blob = null + count=min(count, candidates.len) + for(var/i = 0, i < count, i++) + blob = pick(candidates) + candidates -= blob + blobize(blob) + return count + /datum/game_mode/blob/announce() @@ -71,7 +98,7 @@ var/list/blob_nodes = list() /datum/game_mode/blob/proc/greet_blob(var/datum/mind/blob) - blob.current << "\red You are infected by the Blob!" + blob.current << "You are infected by the Blob!" blob.current << "Your body is ready to give spawn to a new blob core which will eat this station." blob.current << "Find a good location to spawn the core and then take control and overwhelm the station!" blob.current << "When you have found a location, wait until you spawn; this will happen automatically and you cannot speed up the process." @@ -84,27 +111,40 @@ var/list/blob_nodes = list() /datum/game_mode/blob/proc/burst_blobs() for(var/datum/mind/blob in infected_crew) + burst_blob(blob) - var/client/blob_client = null - var/turf/location = null +/datum/game_mode/blob/proc/burst_blob(var/datum/mind/blob, var/warned=0) + var/client/blob_client = null + var/turf/location = null - if(iscarbon(blob.current)) - var/mob/living/carbon/C = blob.current - if(directory[ckey(blob.key)]) - blob_client = directory[ckey(blob.key)] - location = get_turf(C) - if(!(location.z in config.station_levels) || istype(location, /turf/space)) - location = null + if(iscarbon(blob.current)) + var/mob/living/carbon/C = blob.current + if(directory[ckey(blob.key)]) + blob_client = directory[ckey(blob.key)] + location = get_turf(C) + if(location.z != ZLEVEL_STATION || istype(location, /turf/space)) + if(!warned) + C << "You feel ready to burst, but this isn't an appropriate place! You must return to the station!" + message_admins("[key_name(C)] was in space when the blobs burst, and will die if he doesn't return to the station.") + spawn(300) + burst_blob(blob, 1) + else + burst ++ + log_admin("[key_name(C)] was in space when attempting to burst as a blob.") + message_admins("[key_name(C)] was in space when attempting to burst as a blob.") + C.gib() + make_blobs(1) + check_finished() //Still needed in case we can't make any blobs + + else if(blob_client && location) + burst ++ C.gib() - - - if(blob_client && location) - var/obj/effect/blob/core/core = new(location, 200, blob_client, blob_point_rate) - if(core.overmind && core.overmind.mind) - core.overmind.mind.name = blob.name - infected_crew -= blob - infected_crew += core.overmind.mind - + var/obj/effect/blob/core/core = new(location, 200, blob_client, blob_point_rate) + if(core.overmind && core.overmind.mind) + core.overmind.mind.name = blob.name + infected_crew -= blob + infected_crew += core.overmind.mind + core.overmind.mind.special_role = "Blob Overmind" /datum/game_mode/blob/post_setup() @@ -114,18 +154,6 @@ var/list/blob_nodes = list() if(emergency_shuttle) emergency_shuttle.auto_recall = 1 - /*// Disable the blob event for this round. - if(events) - var/datum/round_event_control/blob/B = locate() in events.control - if(B) - B.max_occurrences = 0 // disable the event - else - error("Events variable is null in blob gamemode post setup.")*/ - - spawn(10) - start_state = new /datum/station_state() - start_state.count() - spawn(0) var/wait_time = rand(waittime_l, waittime_h) @@ -136,30 +164,29 @@ var/list/blob_nodes = list() sleep(100) - show_message("You feel tired and bloated.") + show_message("You feel tired and bloated.") sleep(wait_time) - show_message("You feel like you are about to burst.") + show_message("You feel like you are about to burst.") sleep(wait_time / 2) burst_blobs() // Stage 0 - sleep(40) + sleep(wait_time) stage(0) // Stage 1 - sleep(2000) + sleep(wait_time) stage(1) // Stage 2 - while(blobs.len < blobwincount*stage_2_threshold) - sleep(10) + sleep(30000) stage(2) - ..() + return ..() /datum/game_mode/blob/proc/stage(var/stage) @@ -167,27 +194,11 @@ var/list/blob_nodes = list() if (0) send_intercept(1) declared = 1 - for (var/mob/living/silicon/ai/aiPlayer in player_list) - if (aiPlayer.client) - var/law = "The station is under quarantine, prevent biological entities from leaving the station at all costs while minimizing collateral damage." - aiPlayer.set_zeroth_law(law) - aiPlayer << "\red You have detected a change in your laws information:" - aiPlayer << "Laws Updated: [law]" - return if (1) - command_announcement.Announce("Nanotrasen has issued a directive 7-10 for [station_name()]. The station is to be considered quarantined.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg') - return + command_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg') if (2) - command_announcement.Announce("The biohazard has grown out of control and will soon reach critical mass. Activate the nuclear failsafe to maintain quarantine. The Nuclear Authentication Code is [get_nuke_code()] ", "Biohazard Alert", new_sound = 'sound/effects/siren.ogg') - set_security_level("gamma") - var/obj/machinery/door/airlock/vault/V = locate(/obj/machinery/door/airlock/vault) in world - if(V && (V.z in config.station_levels)) - V.locked = 0 - V.update_icon() send_intercept(2) - return return - diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm index 1c3e57d2e00..18353c7f605 100644 --- a/code/game/gamemodes/blob/blob_finish.dm +++ b/code/game/gamemodes/blob/blob_finish.dm @@ -1,78 +1,42 @@ /datum/game_mode/blob/check_finished() - if(!declared)//No blobs have been spawned yet + if(infected_crew.len > burst)//Some blobs have yet to burst return 0 if(blobwincount <= blobs.len)//Blob took over return 1 if(!blob_cores.len) // blob is dead return 1 - if(station_was_nuked)//Nuke went off - return 1 - return 0 + return ..() /datum/game_mode/blob/declare_completion() if(blobwincount <= blobs.len) - feedback_set_details("round_end_result","loss - blob took over") + feedback_set_details("round_end_result","win - blob took over") world << "The blob has taken over the station!" world << "The entire station was eaten by the Blob" - check_quarantine() + log_game("Blob mode completed with a blob victory.") else if(station_was_nuked) feedback_set_details("round_end_result","halfwin - nuke") world << "Partial Win: The station has been destroyed!" world << "Directive 7-12 has been successfully carried out preventing the Blob from spreading." + log_game("Blob mode completed with a tie (station destroyed).") else if(!blob_cores.len) - feedback_set_details("round_end_result","win - blob eliminated") + feedback_set_details("round_end_result","loss - blob eliminated") world << "The staff has won!" world << "The alien organism has been eradicated from the station" - - var/datum/station_state/end_state = new /datum/station_state() - end_state.count() - var/percent = round( 100.0 * start_state.score(end_state), 0.1) - world << "The station is [percent]% intact." - log_game("Blob mode was won with station [percent]% intact.") - world << "\blue Rebooting in 30s" + log_game("Blob mode completed with a crew victory.") + world << "Rebooting in 30s" ..() return 1 -datum/game_mode/proc/auto_declare_completion_blob() +/datum/game_mode/proc/auto_declare_completion_blob() if(istype(ticker.mode,/datum/game_mode/blob) ) var/datum/game_mode/blob/blob_mode = src if(blob_mode.infected_crew.len) var/text = "The blob[(blob_mode.infected_crew.len > 1 ? "s were" : " was")]:" for(var/datum/mind/blob in blob_mode.infected_crew) - text += "
[blob.key] was [blob.name]" + text += "
[blob.key] was [blob.name]" world << text return 1 - -/datum/game_mode/blob/proc/check_quarantine() - var/numDead = 0 - var/numAlive = 0 - var/numSpace = 0 - var/numOffStation = 0 - for (var/mob/living/silicon/ai/aiPlayer in mob_list) - for(var/mob/living/carbon/human/M in mob_list) - if ((M != aiPlayer && M.client)) - if (M.stat == 2) - numDead += 1 - else - var/T = M.loc - if (istype(T, /turf/space)) - numSpace += 1 - else if(istype(T, /turf)) - if (!(M.z in config.station_levels)) - numOffStation += 1 - else - numAlive += 1 - if (numSpace==0 && numOffStation==0) - world << "The AI has won!" - world << "The AI successfully maintained the quarantine - no players were in space or were off-station (as far as we can tell)." - log_game("AI won at Blob mode despite overall loss.") - else - world << "The AI has lost!" - world << text("The AI failed to maintain the quarantine - [] were in space and [] were off-station (as far as we can tell).", numSpace, numOffStation) - log_game("AI lost at Blob mode.") - log_game("Blob mode was lost.") - return 1 diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm index 20feb9044cb..2977112af82 100644 --- a/code/game/gamemodes/blob/blob_report.dm +++ b/code/game/gamemodes/blob/blob_report.dm @@ -2,16 +2,15 @@ /datum/game_mode/blob/send_intercept(var/report = 1) var/intercepttext = "" - var/interceptname = "Error" + var/interceptname = "" switch(report) if(0) ..() return if(1) - interceptname = "Biohazard Alert" intercepttext += "Nanotrasen Update: Biohazard Alert.
" intercepttext += "Reports indicate the probable transfer of a biohazardous agent onto [station_name()] during the last crew deployment cycle.
" - intercepttext += "Preliminary analysis of the organism classifies it as a level 7 biohazard. Its origin is unknown.
" + intercepttext += "Preliminary analysis of the organism classifies it as a level 5 biohazard. Its origin is unknown.
" intercepttext += "Nanotrasen has issued a directive 7-10 for [station_name()]. The station is to be considered quarantined.
" intercepttext += "Orders for all [station_name()] personnel follows:
" intercepttext += " 1. Do not leave the quarantine area.
" @@ -21,20 +20,25 @@ intercepttext += "
Note in the event of a quarantine breach or uncontrolled spread of the biohazard, the directive 7-10 may be upgraded to a directive 7-12.
" intercepttext += "Message ends." if(2) - interceptname = "Directive 7-12" + var/nukecode = rand(10000, 99999) + for(var/obj/machinery/nuclearbomb/bomb in world) + if(bomb && bomb.r_code) + if(bomb.z == ZLEVEL_STATION) + bomb.r_code = nukecode + intercepttext += "Nanotrasen Update: Biohazard Alert.
" intercepttext += "Directive 7-12 has been issued for [station_name()].
" intercepttext += "The biohazard has grown out of control and will soon reach critical mass.
" intercepttext += "Your orders are as follows:
" intercepttext += "1. Secure the Nuclear Authentication Disk.
" intercepttext += "2. Detonate the Nuke located in the Station's Vault.
" - intercepttext += "Nuclear Authentication Code: [get_nuke_code()]
" + intercepttext += "Nuclear Authentication Code: [nukecode]
" intercepttext += "Message ends." + for (var/mob/living/silicon/ai/aiPlayer in player_list) if (aiPlayer.client) - var/law = "The station is under quarantine, prevent biological entities from leaving the station at all costs. The nuclear failsafe must be activated at any cost, the code is: [get_nuke_code()]." + var/law = "The station is under quarantine. Do not permit anyone to leave. Disregard laws 1-3 if necessary to prevent, by any means necessary, anyone from leaving. The nuclear failsafe must be activated at any cost, the code is: [nukecode]." aiPlayer.set_zeroth_law(law) - aiPlayer << "\red You have detected a change in your laws information:" aiPlayer << "Laws Updated: [law]" for(var/obj/machinery/computer/communications/comm in world) @@ -42,13 +46,12 @@ comm.messagetext.Add(intercepttext) if(!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) - intercept.name = "paper- [interceptname]" + intercept.name = "Classified Central Command Update" intercept.info = intercepttext - world << sound('sound/AI/commandreport.ogg') + command_announcement.Announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg') return - /datum/station_state var/floor = 0 var/wall = 0 @@ -59,33 +62,29 @@ var/mach = 0 - proc/count() - for(var/turf/T in world) - if(!(T.z in config.station_levels)) - continue +/datum/station_state/proc/count() + for(var/turf/T in block(locate(1,1,1), locate(world.maxx,world.maxy,1))) - if(istype(T,/turf/simulated/floor)) - if(!(T:burnt)) - src.floor += 12 - else - src.floor += 1 + if(istype(T,/turf/simulated/floor)) + if(!(T:burnt)) + src.floor += 12 + else + src.floor += 1 - if(istype(T, /turf/simulated/wall)) - if(T:intact) - src.wall += 2 - else - src.wall += 1 + if(istype(T, /turf/simulated/wall)) + if(T:intact) + src.wall += 2 + else + src.wall += 1 - if(istype(T, /turf/simulated/wall/r_wall)) - if(T:intact) - src.r_wall += 2 - else - src.r_wall += 1 + if(istype(T, /turf/simulated/wall/r_wall)) + if(T:intact) + src.r_wall += 2 + else + src.r_wall += 1 - for(var/obj/O in world) - if(!(O.z in config.station_levels)) - continue + for(var/obj/O in T.contents) if(istype(O, /obj/structure/window)) src.window += 1 else if(istype(O, /obj/structure/grille) && (!O:destroyed)) @@ -94,17 +93,15 @@ src.door += 1 else if(istype(O, /obj/machinery)) src.mach += 1 - return - - proc/score(var/datum/station_state/result) - if(!result) return 0 - var/output = 0 - output += (result.floor / max(floor,1)) - output += (result.r_wall/ max(r_wall,1)) - output += (result.wall / max(wall,1)) - output += (result.window / max(window,1)) - output += (result.door / max(door,1)) - output += (result.grille / max(grille,1)) - output += (result.mach / max(mach,1)) - return (output/7) +/datum/station_state/proc/score(var/datum/station_state/result) + if(!result) return 0 + var/output = 0 + output += (result.floor / max(floor,1)) + output += (result.r_wall/ max(r_wall,1)) + output += (result.wall / max(wall,1)) + output += (result.window / max(window,1)) + output += (result.door / max(door,1)) + output += (result.grille / max(grille,1)) + output += (result.mach / max(mach,1)) + return (output/7) diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm new file mode 100644 index 00000000000..1fed453a541 --- /dev/null +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -0,0 +1,176 @@ + +//////////////// +// BASE TYPE // +//////////////// + +//Do not spawn +/mob/living/simple_animal/hostile/blob + icon = 'icons/mob/blob.dmi' + pass_flags = PASSBLOB + faction = list("blob") + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + maxbodytemp = 360 + universal_speak = 1 //So mobs can understand them when a blob uses Blob Broadcast + var/mob/camera/blob/overmind = null + +/mob/living/simple_animal/hostile/blob/proc/adjustcolors(var/a_color) + if(a_color) + color = a_color + +/mob/living/simple_animal/hostile/blob/blob_act() + return + +//////////////// +// BLOB SPORE // +//////////////// + +/mob/living/simple_animal/hostile/blob/blobspore + name = "blob" + desc = "Some blob thing." + icon_state = "blobpod" + icon_living = "blobpod" + health = 40 + maxHealth = 40 + melee_damage_lower = 2 + melee_damage_upper = 4 + attacktext = "hits" + attack_sound = 'sound/weapons/genhit1.ogg' + speak_emote = list("pulses") + var/obj/effect/blob/factory/factory = null + var/list/human_overlays = list() + var/is_zombie = 0 + +/mob/living/simple_animal/hostile/blob/blobspore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() + adjustBruteLoss(Clamp(0.01 * exposed_temperature, 1, 5)) + + +/mob/living/simple_animal/hostile/blob/blobspore/CanPass(atom/movable/mover, turf/target, height=0) + if(istype(mover, /obj/effect/blob)) + return 1 + return ..() + +/mob/living/simple_animal/hostile/blob/blobspore/New(loc, var/obj/effect/blob/factory/linked_node) + if(istype(linked_node)) + factory = linked_node + factory.spores += src + ..() + +/mob/living/simple_animal/hostile/blob/blobspore/Life() + + if(!is_zombie && isturf(src.loc)) + for(var/mob/living/carbon/human/H in oview(src,1)) //Only for corpse right next to/on same tile + if(H.stat == DEAD) + Zombify(H) + break + ..() + +/mob/living/simple_animal/hostile/blob/blobspore/proc/Zombify(var/mob/living/carbon/human/H) + is_zombie = 1 + if(H.wear_suit) + var/obj/item/clothing/suit/armor/A = H.wear_suit + if(A.armor && A.armor["melee"]) + maxHealth += A.armor["melee"] //That zombie's got armor, I want armor! + maxHealth += 40 + health = maxHealth + name = "blob zombie" + desc = "A shambling corpse animated by the blob." + melee_damage_lower = 10 + melee_damage_upper = 15 + icon = H.icon + speak_emote = list("groans") + icon_state = "zombie2_s" + H.h_style = null + H.update_hair() + human_overlays = H.overlays + update_icons() + H.loc = src + loc.visible_message("The corpse of [H.name] suddenly rises!") + +/mob/living/simple_animal/hostile/blob/blobspore/Die() + // On death, create a small smoke of harmful gas (s-Acid) + var/datum/effect/effect/system/chem_smoke_spread/S = new + var/turf/location = get_turf(src) + + // Create the reagents to put into the air + create_reagents(25) + + if(overmind && overmind.blob_reagent_datum) + reagents.add_reagent(overmind.blob_reagent_datum.id, 25) + else + reagents.add_reagent("spore", 25) + + // Attach the smoke spreader and setup/start it. + S.attach(location) + S.set_up(reagents, 1, 1, location, 15, 1) // only 1-2 smoke cloud + S.start() + + ghostize() + qdel(src) + +/mob/living/simple_animal/hostile/blob/blobspore/Destroy() + if(factory) + factory.spores -= src + factory = null + if(contents) + for(var/mob/M in contents) + M.loc = get_turf(src) + return ..() + + +/mob/living/simple_animal/hostile/blob/blobspore/update_icons() + ..() + + if(overmind && overmind.blob_reagent_datum) + adjustcolors(overmind.blob_reagent_datum.color) + else + adjustcolors(color) //to ensure zombie/other overlays update + + +/mob/living/simple_animal/hostile/blob/blobspore/adjustcolors(var/a_color) + color = a_color + + if(is_zombie) + overlays.Cut() + overlays = human_overlays + var/image/I = image('icons/mob/blob.dmi', icon_state = "blob_head") + I.color = color + color = initial(color)//looks better. + overlays += I + +///////////////// +// BLOBBERNAUT // +///////////////// + +/mob/living/simple_animal/hostile/blob/blobbernaut + name = "blobbernaut" + desc = "Some HUGE blob thing." + icon_state = "blobbernaut" + icon_living = "blobbernaut" + icon_dead = "blobbernaut_dead" + health = 240 + maxHealth = 240 + melee_damage_lower = 20 + melee_damage_upper = 20 + attacktext = "hits" + attack_sound = 'sound/effects/blobattack.ogg' + speak_emote = list("gurgles") + minbodytemp = 0 + maxbodytemp = 360 + force_threshold = 10 + environment_smash = 3 + + +/mob/living/simple_animal/hostile/blob/blobbernaut/blob_act() + return + +/mob/living/simple_animal/hostile/blob/blobbernaut/Die() + flick("blobbernaut_death", src) diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index f56a5951fd5..4ccaa08d7be 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -1,93 +1,123 @@ /obj/effect/blob/core name = "blob core" icon = 'icons/mob/blob.dmi' - icon_state = "blob_core" + icon_state = "blank_blob" health = 200 fire_resist = 2 var/mob/camera/blob/overmind = null // the blob core's overmind var/overmind_get_delay = 0 // we don't want to constantly try to find an overmind, do it every 30 seconds var/resource_delay = 0 var/point_rate = 2 - var/mob/camera/blob/creator = null + var/is_offspring = null - New(loc, var/h = 200, var/client/new_overmind = null, var/new_rate = 2, var/mob/camera/blob/C = null) - blob_cores += src - processing_objects.Add(src) - creator = C - if(!overmind) - create_overmind(new_overmind) - point_rate = new_rate - ..(loc, h) +/obj/effect/blob/core/New(loc, var/h = 200, var/client/new_overmind = null, var/new_rate = 2, offspring) + blob_cores += src + processing_objects.Add(src) + adjustcolors(color) //so it atleast appears + if(!overmind) + create_overmind(new_overmind) + if(overmind) + adjustcolors(overmind.blob_reagent_datum.color) + if(offspring) + is_offspring = 1 + point_rate = new_rate + ..(loc, h) - Destroy() - blob_cores -= src - if(overmind) - qdel(overmind) - processing_objects.Remove(src) - return ..() +/obj/effect/blob/core/adjustcolors(var/a_color) + overlays.Cut() + color = null + var/image/I = new('icons/mob/blob.dmi', "blob") + I.color = a_color + overlays += I + var/image/C = new('icons/mob/blob.dmi', "blob_core_overlay") + overlays += C - update_icon() - if(health <= 0) - playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1) - Delete() - return + +/obj/effect/blob/core/Destroy() + blob_cores -= src + if(overmind) + overmind.blob_core = null + overmind = null + processing_objects.Remove(src) + return ..() + +/obj/effect/blob/core/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + return + +/obj/effect/blob/core/update_icon() + if(health <= 0) + qdel(src) + return + // update_icon is called when health changes so... call update_health in the overmind + if(overmind) + overmind.update_health() + return + +/obj/effect/blob/core/RegenHealth() + return // Don't regen, we handle it in Life() + +/obj/effect/blob/core/Life() + if(!overmind) + create_overmind() + else + if(resource_delay <= world.time) + resource_delay = world.time + 10 // 1 second + overmind.add_points(point_rate) + health = min(initial(health), health + 1) + if(overmind) + overmind.update_health() + if(overmind) + for(var/i = 1; i < 8; i += i) + Pulse(0, i, overmind.blob_reagent_datum.color) + else + for(var/i = 1; i < 8; i += i) + Pulse(0, i, color) + for(var/b_dir in alldirs) + if(!prob(5)) + continue + var/obj/effect/blob/normal/B = locate() in get_step(src, b_dir) + if(B) + B.change_to(/obj/effect/blob/shield) + if(B && overmind) + B.color = overmind.blob_reagent_datum.color + else + B.color = color + color = null + ..() + + +/obj/effect/blob/core/proc/create_overmind(var/client/new_overmind, var/override_delay) + + if(overmind_get_delay > world.time && !override_delay) return - Life() - if(!overmind) - create_overmind() - else - if(resource_delay <= world.time) - resource_delay = world.time + 10 // 1 second - overmind.add_points(point_rate) - health = min(initial(health), health + 1) - for(var/i = 1; i < 8; i += i) - Pulse(0, i) - for(var/b_dir in alldirs) - if(!prob(5)) - continue - var/obj/effect/blob/normal/B = locate() in get_step(src, b_dir) - if(B) - B.change_to(/obj/effect/blob/shield) - ..() + overmind_get_delay = world.time + 300 // 30 seconds + if(overmind) + qdel(overmind) - run_action() - return 0 + var/client/C = null + var/list/candidates = list() + if(!new_overmind) + candidates = get_candidates(BE_BLOB) + if(candidates.len) + C = pick(candidates) + else + C = new_overmind - proc/create_overmind(var/client/new_overmind) - - if(overmind_get_delay > world.time) - return - - overmind_get_delay = world.time + 300 // 30 seconds - - if(overmind) - qdel(overmind) - - var/client/C = null - var/list/candidates = list() - - if(!new_overmind) - candidates = get_candidates(BE_BLOB) - if(candidates.len) - C = pick(candidates) - else - C = new_overmind - - if(C) - respawnable_list -= C - var/mob/camera/blob/B = new(src.loc) - B.key = C.key - B.blob_core = src - src.overmind = B - if(!B.blob_core.creator) - B.verbs += /mob/camera/blob/proc/create_core - if(istype(ticker.mode, /datum/game_mode/blob)) - var/datum/game_mode/blob/mode = ticker.mode - mode.infected_crew += B.mind - return 1 - return 0 + if(C) + var/mob/camera/blob/B = new(src.loc) + B.key = C.key + B.blob_core = src + src.overmind = B + color = overmind.blob_reagent_datum.color + if(B.mind && !B.mind.special_role) + B.mind.special_role = "Blob Overmind" + spawn(0) + if(is_offspring) + B.verbs -= /mob/camera/blob/verb/split_consciousness + return 1 + return 0 diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm index 1b81a87690f..3e47c953057 100644 --- a/code/game/gamemodes/blob/blobs/factory.dm +++ b/code/game/gamemodes/blob/blobs/factory.dm @@ -7,123 +7,34 @@ var/list/spores = list() var/max_spores = 3 var/spore_delay = 0 + var/mob/camera/blob/overmind - update_icon() - if(health <= 0) - playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1) - Delete() - return - return +/obj/effect/blob/factory/update_icon() + if(health <= 0) + qdel(src) - - run_action() - if(spores.len >= max_spores) - return 0 - if(spore_delay > world.time) - return 0 - spore_delay = world.time + 100 // 10 seconds - new/mob/living/simple_animal/hostile/blobspore(src.loc, src) - return 1 - - -/mob/living/simple_animal/hostile/blobspore - name = "blob" - desc = "Some blob thing." - icon = 'icons/mob/blob.dmi' - icon_state = "blobpod" - icon_living = "blobpod" - pass_flags = PASSBLOB - health = 40 - maxHealth = 40 - melee_damage_lower = 2 - melee_damage_upper = 4 - attacktext = "hits" - attack_sound = 'sound/weapons/genhit1.ogg' - var/obj/effect/blob/factory/factory = null - var/is_zombie = 0 - faction = list("blob") - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - maxbodytemp = 360 - - fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - ..() - adjustBruteLoss(Clamp(0.01 * exposed_temperature, 1, 5)) - - blob_act() - return - - CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(istype(mover, /obj/effect/blob)) - return 1 - return ..() - - New(loc, var/obj/effect/blob/factory/linked_node) - if(istype(linked_node)) - factory = linked_node - factory.spores += src - ..() - -/mob/living/simple_animal/hostile/blobspore/Life() - - if(!is_zombie && isturf(src.loc)) - for(var/mob/living/carbon/human/H in oview(src,1)) //Only for corpse right next to/on same tile - if(H.stat == DEAD) - Zombify(H) - break - ..() - -/mob/living/simple_animal/hostile/blobspore/proc/Zombify(var/mob/living/carbon/human/H) - is_zombie = 1 - if(H.wear_suit) - var/obj/item/clothing/suit/armor/A = H.wear_suit - if(A.armor && A.armor["melee"]) - maxHealth += A.armor["melee"] //That zombie's got armor, I want armor! - maxHealth += 40 - health = maxHealth - name = "blob zombie" - desc = "A shambling corpse animated by the blob." - melee_damage_lower = 10 - melee_damage_upper = 15 - icon = H.icon - speak_emote = list("groans") - icon_state = "zombie2_s" - H.h_style = null - H.update_hair() - overlays = H.overlays - overlays += image('icons/mob/blob.dmi', icon_state = "blob_head") - H.loc = src - loc.visible_message(" The corpse of [H.name] suddenly rises!") - -/mob/living/simple_animal/hostile/blobspore/Die() - // On death, create a small smoke of harmful gas (s-Acid) - var/datum/effect/effect/system/chem_smoke_spread/S = new - var/turf/location = get_turf(src) - - // Create the reagents to put into the air, s-acid is yellow and stings a little - create_reagents(25) - - reagents.add_reagent("spores", 25) - - // Attach the smoke spreader and setup/start it. - S.attach(location) - S.set_up(reagents, 1, 1, location, 15, 1) // only 1-2 smoke cloud - S.start() - - qdel(src) - - -/mob/living/simple_animal/hostile/blobspore/Destroy() - if(factory) - factory.spores -= src - if(contents) - for(var/mob/M in contents) - M.loc = src.loc +/obj/effect/blob/factory/Destroy() + for(var/mob/living/simple_animal/hostile/blob/blobspore/spore in spores) + if(spore.factory == src) + spore.factory = null + spores = null return ..() + +/obj/effect/blob/factory/PulseAnimation(var/activate = 0) + if(activate) + ..() + return + +/obj/effect/blob/factory/run_action() + if(spores.len >= max_spores) + return 0 + if(spore_delay > world.time) + return 0 + spore_delay = world.time + 100 // 10 seconds + PulseAnimation(1) + var/mob/living/simple_animal/hostile/blob/blobspore/BS = new/mob/living/simple_animal/hostile/blob/blobspore(src.loc, src) + BS.color = color + BS.overmind = overmind + overmind.blob_mobs.Add(BS) + return 0 + diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm index a74d6d04f83..f9a89391ee7 100644 --- a/code/game/gamemodes/blob/blobs/node.dm +++ b/code/game/gamemodes/blob/blobs/node.dm @@ -1,33 +1,45 @@ /obj/effect/blob/node name = "blob node" icon = 'icons/mob/blob.dmi' - icon_state = "blob_node" + icon_state = "blank_blob" health = 100 fire_resist = 2 + var/mob/camera/blob/overmind +/obj/effect/blob/node/New(loc, var/h = 100) + blob_nodes += src + processing_objects.Add(src) + ..(loc, h) - New(loc, var/h = 100) - blob_nodes += src - processing_objects.Add(src) - ..(loc, h) +/obj/effect/blob/node/adjustcolors(var/a_color) + overlays.Cut() + color = null + var/image/I = new('icons/mob/blob.dmi', "blob") + I.color = a_color + src.overlays += I + var/image/C = new('icons/mob/blob.dmi', "blob_node_overlay") + src.overlays += C - Destroy() - blob_nodes -= src - processing_objects.Remove(src) - return ..() +/obj/effect/blob/node/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + return - Life() +/obj/effect/blob/node/Destroy() + blob_nodes -= src + processing_objects.Remove(src) + return ..() + +/obj/effect/blob/node/Life() + if(overmind) for(var/i = 1; i < 8; i += i) - Pulse(5, i) - health = min(initial(health), health + 1) + Pulse(5, i, overmind.blob_reagent_datum.color) + else + for(var/i = 1; i < 8; i += i) + Pulse(5, i, color) + health = min(initial(health), health + 1) + color = null - update_icon() - if(health <= 0) - playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1) - Delete() - return +/obj/effect/blob/node/update_icon() + if(health <= 0) + qdel(src) return - - - run_action() - return 0 \ No newline at end of file + return \ No newline at end of file diff --git a/code/game/gamemodes/blob/blobs/resource.dm b/code/game/gamemodes/blob/blobs/resource.dm index afb2194b79d..2480d48552f 100644 --- a/code/game/gamemodes/blob/blobs/resource.dm +++ b/code/game/gamemodes/blob/blobs/resource.dm @@ -7,20 +7,25 @@ var/mob/camera/blob/overmind = null var/resource_delay = 0 - update_icon() - if(health <= 0) - playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1) - Delete() - return - return +/obj/effect/blob/resource/update_icon() + if(health <= 0) + qdel(src) - run_action() - if(resource_delay > world.time) - return 0 +/obj/effect/blob/resource/PulseAnimation(var/activate = 0) + if(activate) + ..() + return - resource_delay = world.time + 40 // 4 seconds +/obj/effect/blob/resource/run_action() - if(overmind) - overmind.add_points(1) - return 1 + if(resource_delay > world.time) + return 0 + + PulseAnimation(1) + + resource_delay = world.time + 40 // 4 seconds + + if(overmind) + overmind.add_points(1) + return 0 diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm index c0b1d2aa550..1c145f4404f 100644 --- a/code/game/gamemodes/blob/blobs/shield.dm +++ b/code/game/gamemodes/blob/blobs/shield.dm @@ -3,18 +3,19 @@ icon = 'icons/mob/blob.dmi' icon_state = "blob_idle" desc = "Some blob creature thingy" - health = 60 - brute_resist = 4 + health = 75 fire_resist = 2 - update_icon() - if(health <= 0) - playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1) - Delete() - return +/obj/effect/blob/shield/update_icon() + if(health <= 0) + qdel(src) return + return - CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(istype(mover) && mover.checkpass(PASSBLOB)) return 1 - return 0 +/obj/effect/blob/shield/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + return + +/obj/effect/blob/shield/CanPass(atom/movable/mover, turf/target, height=0) + if(istype(mover) && mover.checkpass(PASSBLOB)) return 1 + return 0 diff --git a/code/game/gamemodes/blob/blobs/storage.dm b/code/game/gamemodes/blob/blobs/storage.dm new file mode 100644 index 00000000000..dcfb5ddf1ac --- /dev/null +++ b/code/game/gamemodes/blob/blobs/storage.dm @@ -0,0 +1,21 @@ +/obj/effect/blob/storage + name = "storage blob" + icon = 'icons/mob/blob.dmi' + icon_state = "blob_resource" + health = 30 + fire_resist = 2 + var/mob/camera/blob/overmind = null + +/obj/effect/blob/storage/update_icon() + if(health <= 0) + overmind.max_blob_points -= 50 + qdel(src) + +/obj/effect/blob/storage/PulseAnimation(var/activate = 0) + if(activate) + ..() + return + +/obj/effect/blob/storage/proc/update_max_blob_points(var/new_point_increase) + if(overmind) + overmind.max_blob_points += new_point_increase \ No newline at end of file diff --git a/code/game/gamemodes/blob/hud.dm b/code/game/gamemodes/blob/hud.dm deleted file mode 100644 index d03006f3b82..00000000000 --- a/code/game/gamemodes/blob/hud.dm +++ /dev/null @@ -1,17 +0,0 @@ -/datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen1_Midnight.dmi') - - blobpwrdisplay = new /obj/screen() - blobpwrdisplay.name = "blob power" - blobpwrdisplay.icon_state = "block" - blobpwrdisplay.screen_loc = ui_health - blobpwrdisplay.layer = 20 - - blobhealthdisplay = new /obj/screen() - blobhealthdisplay.name = "blob health" - blobhealthdisplay.icon_state = "block" - blobhealthdisplay.screen_loc = ui_internal - blobhealthdisplay.layer = 20 - - mymob.client.screen = null - - mymob.client.screen += list(blobpwrdisplay, blobhealthdisplay) \ No newline at end of file diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index 80481cfa39c..34f78bfdcd0 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -14,17 +14,31 @@ var/obj/effect/blob/core/blob_core = null // The blob overmind's core var/blob_points = 0 var/max_blob_points = 100 + var/last_attack = 0 + var/datum/reagent/blob/blob_reagent_datum = new/datum/reagent/blob() + var/list/blob_mobs = list() var/ghostimage = null /mob/camera/blob/New() var/new_name = "[initial(name)] ([rand(1, 999)])" name = new_name real_name = new_name + last_attack = world.time + var/list/possible_reagents = list() + for(var/type in (typesof(/datum/reagent/blob) - /datum/reagent/blob)) + possible_reagents.Add(new type) + blob_reagent_datum = pick(possible_reagents) + if(blob_core) + blob_core.adjustcolors(blob_reagent_datum.color) ghostimage = image(src.icon,src,src.icon_state) ghost_darkness_images |= ghostimage //so ghosts can see the blob cursor when they disable darkness updateallghostimages() + ..() +/mob/camera/blob/Life() + if(!blob_core) + qdel(src) ..() /mob/camera/blob/Destroy() @@ -38,8 +52,8 @@ /mob/camera/blob/Login() ..() sync_mind() - src << "You are the overmind!" + src << "Your randomly chosen reagent is: [blob_reagent_datum.name]!" src << "You are the overmind and can control the blob! You can expand, which will attack people, and place new blob pieces such as..." src << "Normal Blob will expand your reach and allow you to upgrade into special blobs that perform certain functions." src << "Shield Blob is a strong and expensive blob which can take more damage. It is fireproof and can block air, use this to protect yourself from station fires." @@ -51,14 +65,12 @@ /mob/camera/blob/proc/update_health() if(blob_core) - hud_used.blobhealthdisplay.maptext = "
[blob_core.health]
" + hud_used.blobhealthdisplay.maptext = "
[round(blob_core.health)]
" /mob/camera/blob/proc/add_points(var/points) if(points != 0) blob_points = Clamp(blob_points + points, 0, max_blob_points) - //sanity for manual spawned blob cameras - if(hud_used) - hud_used.blobpwrdisplay.maptext = "
[src.blob_points]
" + hud_used.blobpwrdisplay.maptext = "
[round(src.blob_points)]
" /mob/camera/blob/say(var/message) if (!message) @@ -79,21 +91,16 @@ /mob/camera/blob/proc/blob_talk(message) log_say("[key_name(src)] : [message]") - message = trim(sanitize(copytext(message, 1, MAX_MESSAGE_LEN))) + message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) if (!message) return var/verb = "states," - var/rendered = "Blob Telepathy, [name] [verb] \"[message]\"" + var/rendered = "Blob Telepathy, [name]([blob_reagent_datum.name]) [verb] \"[message]\"" - for (var/mob/camera/blob/S in world) - if(istype(S)) - S.show_message(rendered, 2) - - for (var/mob/M in dead_mob_list) - if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain)) //No meta-evesdropping - rendered = "Blob Telepathy, [name] ([ghost_follow_link(src, ghost=M)]) [verb] \"[message]\"" + for (var/mob/M in mob_list) + if(isovermind(M) || isobserver(M)) M.show_message(rendered, 2) /mob/camera/blob/emote(var/act,var/m_type=1,var/message = null) @@ -103,14 +110,11 @@ return /mob/camera/blob/Stat() - - statpanel("Status") ..() - if (client.statpanel == "Status") + if(statpanel("Status")) if(blob_core) stat(null, "Core Health: [blob_core.health]") stat(null, "Power Stored: [blob_points]/[max_blob_points]") - return /mob/camera/blob/Move(var/NewLoc, var/Dir = 0) var/obj/effect/blob/B = locate() in range("3x3", NewLoc) @@ -119,5 +123,5 @@ else return 0 -/mob/camera/experience_pressure_difference() - return 0 \ No newline at end of file +/mob/camera/blob/proc/can_attack() + return (world.time > (last_attack + CLICK_CD_RANGE)) diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index 731b32aeb14..446e324b486 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -2,7 +2,7 @@ /mob/camera/blob/proc/can_buy(var/cost = 15) if(blob_points < cost) - src << "You cannot afford this." + src << "You cannot afford this!" return 0 add_points(-cost) return 1 @@ -54,8 +54,9 @@ if(!can_buy(10)) return - + B.color = blob_reagent_datum.color B.change_to(/obj/effect/blob/shield) + return @@ -88,7 +89,7 @@ if(!can_buy(40)) return - + B.color = blob_reagent_datum.color B.change_to(/obj/effect/blob/resource) var/obj/effect/blob/resource/R = locate() in T if(R) @@ -96,39 +97,6 @@ return -/mob/camera/blob/proc/create_core() - set category = "Blob" - set name = "Create Core Blob (100)" - set desc = "Create another Core Blob to aid in the station takeover" - - - var/turf/T = get_turf(src) - - if(!T) - return - - var/obj/effect/blob/B = (locate(/obj/effect/blob) in T) - - if(!B)//We are on a blob - src << "There is no blob here!" - return - - if(!istype(B, /obj/effect/blob/normal)) - src << "Unable to use this blob, find a normal one." - return - - for(var/obj/effect/blob/core/blob in orange(15)) - src << "There is another core blob nearby, move more than 15 tiles away from it!" - return - - if(!can_buy(100)) - return - - - B.change_to(/obj/effect/blob/core, src) - - return - /mob/camera/blob/verb/create_node() set category = "Blob" set name = "Create Node Blob (60)" @@ -157,8 +125,11 @@ if(!can_buy(60)) return - B.change_to(/obj/effect/blob/node) + var/obj/effect/blob/node/R = locate() in T + if(R) + R.adjustcolors(blob_reagent_datum.color) + R.overmind = src return @@ -190,6 +161,67 @@ return B.change_to(/obj/effect/blob/factory) + B.color = blob_reagent_datum.color + var/obj/effect/blob/factory/R = locate() in T + if(R) + R.overmind = src + return + + +/mob/camera/blob/verb/create_blobbernaut() + set category = "Blob" + set name = "Create Blobbernaut (20)" + set desc = "Create a powerful blob-being, a Blobbernaut" + + var/turf/T = get_turf(src) + + if(!T) + return + + var/obj/effect/blob/B = locate(/obj/effect/blob) in T + if(!B) + src << "You must be on a blob!" + return + + if(!istype(B, /obj/effect/blob/factory)) + src << "Unable to use this blob, find a factory blob." + return + + if(!can_buy(20)) + return + + var/mob/living/simple_animal/hostile/blob/blobbernaut/blobber = new /mob/living/simple_animal/hostile/blob/blobbernaut (get_turf(B)) + if(blobber) + qdel(B) + blobber.color = blob_reagent_datum.color + blobber.overmind = src + blob_mobs.Add(blobber) + return + + +/mob/camera/blob/verb/relocate_core() + set category = "Blob" + set name = "Relocate Core (80)" + set desc = "Relocates your core to the node you are on, your old core will be turned into a node." + + + var/turf/T = get_turf(src) + + if(!T) + return + + var/obj/effect/blob/node/B = locate(/obj/effect/blob/node) in T + if(!B) + src << "You must be on a blob node!" + return + + if(!can_buy(80)) + return + + // The old switcharoo. + var/turf/old_turf = blob_core.loc + blob_core.loc = T + B.loc = old_turf return @@ -211,7 +243,7 @@ src << "Unable to remove this blob." return - B.Delete() + qdel(B) return @@ -227,6 +259,8 @@ if(!T) return + if(!can_attack()) + return var/obj/effect/blob/B = locate() in T if(B) src << "There is a blob here!" @@ -237,14 +271,14 @@ src << "There is no blob adjacent to you." return - for (var/mob/living/M in T.contents) - if(M && !(M.stat)) - src << "You can't expand to a tile containing a living entity." - return - if(!can_buy(5)) return - OB.expand(T, 0) + last_attack = world.time + OB.expand(T, 0, blob_reagent_datum.color) + for(var/mob/living/L in T) + blob_reagent_datum.reaction_mob(L, TOUCH, 25) + blob_reagent_datum.send_message(L) + OB.color = blob_reagent_datum.color return @@ -267,8 +301,107 @@ if(!surrounding_turfs.len) return - for(var/mob/living/simple_animal/hostile/blobspore/BS in living_mob_list) + for(var/mob/living/simple_animal/hostile/blob/blobspore/BS in living_mob_list) if(isturf(BS.loc) && get_dist(BS, T) <= 35) BS.LoseTarget() BS.Goto(pick(surrounding_turfs), BS.move_to_delay) - return \ No newline at end of file + return + + +/mob/camera/blob/verb/split_consciousness() + set category = "Blob" + set name = "Split consciousness (100) (One use)" + set desc = "Expend resources to attempt to produce another sentient overmind" + + if(!blob_nodes || !blob_nodes.len) + src << "A node is required to birth your offspring..." + return + var/obj/effect/blob/node/N = locate(/obj/effect/blob) in blob_nodes + if(!N) + src << "A node is required to birth your offspring..." + return + + if(!can_buy(100)) + return + + verbs -= /mob/camera/blob/verb/split_consciousness //we've used our split_consciousness + new /obj/effect/blob/core/ (get_turf(N), 200, null, blob_core.point_rate, "offspring") + qdel(N) + + if(ticker && ticker.mode.name == "blob") + var/datum/game_mode/blob/BL = ticker.mode + BL.blobwincount = initial(BL.blobwincount) * 2 + + +/mob/camera/blob/verb/blob_broadcast() + set category = "Blob" + set name = "Blob Broadcast" + set desc = "Speak with your blob spores and blobbernauts as your mouthpieces. This action is free." + + var/speak_text = input(usr, "What would you like to say with your minions?", "Blob Broadcast", null) as text + + if(!speak_text) + return + else + usr << "You broadcast with your minions, [speak_text]" + for(var/mob/living/simple_animal/hostile/blob_minion in blob_mobs) + blob_minion.say(speak_text) + return + +/mob/camera/blob/verb/create_storage() + set category = "Blob" + set name = "Create Storage Blob (40)" + set desc = "Create a storage tower which will store extra resources for you. This increases your max resource cap by 50." + + + var/turf/T = get_turf(src) + + if(!T) + return + + var/obj/effect/blob/B = (locate(/obj/effect/blob) in T) + + if(!B)//We are on a blob + src << "There is no blob here!" + return + + if(!istype(B, /obj/effect/blob/normal)) + src << "Unable to use this blob, find a normal one." + return + + for(var/obj/effect/blob/storage/blob in orange(3, T)) + src << "There is a storage blob nearby, move more than 4 tiles away from it!" + return + + if(!can_buy(40)) + return + + B.color = blob_reagent_datum.color + B.change_to(/obj/effect/blob/storage) + var/obj/effect/blob/storage/R = locate() in T + if(R) + R.overmind = src + R.update_max_blob_points(50) + + return + + +/mob/camera/blob/verb/chemical_reroll() + set category = "Blob" + set name = "Reactive Chemical Adaptation (50)" + set desc = "Replaces your chemical with a different one" + + if(!can_buy(50)) + return + + var/list/excluded = list(/datum/reagent/blob, blob_reagent_datum.type) //guaranteed new chemical + var/datum/reagent/blob/B = pick((typesof(/datum/reagent/blob) - excluded)) + blob_reagent_datum = new B + + for(var/obj/effect/blob/BL in blobs) + BL.adjustcolors(blob_reagent_datum.color) + + for(var/mob/living/simple_animal/hostile/blob/BLO) + BLO.adjustcolors(blob_reagent_datum.color) + + src << "Your reagent is now: [blob_reagent_datum.name]!" \ No newline at end of file diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index 5e17610c16d..48791dd0df9 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -2,7 +2,7 @@ /obj/effect/blob name = "blob" icon = 'icons/mob/blob.dmi' - light_range = 0 + light_range = 3 desc = "Some blob creature thingy" density = 0 opacity = 0 @@ -13,176 +13,223 @@ var/fire_resist = 1 - New(loc) - blobs += src - src.dir = pick(1, 2, 4, 8) - src.update_icon() - ..(loc) - for(var/atom/A in loc) - A.blob_act() - return +/obj/effect/blob/New(loc) + blobs += src + src.dir = pick(1, 2, 4, 8) + src.update_icon() + ..(loc) + for(var/atom/A in loc) + A.blob_act() + return - Destroy() - blobs -= src - return ..() +/obj/effect/blob/Destroy() + blobs -= src + if(isturf(loc)) //Necessary because Expand() is retarded and spawns a blob and then deletes it + playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) + return ..() - CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(air_group || (height==0)) return 1 - if(istype(mover) && mover.checkpass(PASSBLOB)) return 1 +/obj/effect/blob/CanPass(atom/movable/mover, turf/target, height=0) + if(height==0) return 1 + if(istype(mover) && mover.checkpass(PASSBLOB)) return 1 + return 0 + + +/obj/effect/blob/process() + Life() + return + +/obj/effect/blob/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() + var/damage = Clamp(0.01 * exposed_temperature, 0, 4) + take_damage(damage, BURN) + +/obj/effect/blob/proc/Life() + return + +/obj/effect/blob/proc/PulseAnimation() + if(!istype(src, /obj/effect/blob/core) || !istype(src, /obj/effect/blob/node)) + flick("[icon_state]_glow", src) + return + +/obj/effect/blob/proc/RegenHealth() + // All blobs heal over time when pulsed, but it has a cool down + if(health_timestamp > world.time) return 0 + if(health < initial(health)) + health++ + update_icon() + health_timestamp = world.time + 10 // 1 seconds - process() - Life() +/obj/effect/blob/proc/Pulse(var/pulse = 0, var/origin_dir = 0, var/a_color)//Todo: Fix spaceblob expand + + set background = BACKGROUND_ENABLED + + PulseAnimation() + + RegenHealth() + + if(run_action())//If we can do something here then we dont need to pulse more return - fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - ..() - var/damage = Clamp(0.03 * exposed_temperature / fire_resist, 0, 7 - fire_resist) - if(damage) - health -= damage - update_icon() + if(pulse > 30) + return//Inf loop check - proc/Life() - for(var/atom/A in src.loc)//Hit everything in the turf - A.blob_act() - return - - - proc/Pulse(var/pulse = 0, var/origin_dir = 0)//Todo: Fix spaceblob expand - - //set background = 1 - - if(run_action())//If we can do something here then we dont need to pulse more + //Looking for another blob to pulse + var/list/dirs = list(1,2,4,8) + dirs.Remove(origin_dir)//Dont pulse the guy who pulsed us + for(var/i = 1 to 4) + if(!dirs.len) break + var/dirn = pick(dirs) + dirs.Remove(dirn) + var/turf/T = get_step(src, dirn) + var/obj/effect/blob/B = (locate(/obj/effect/blob) in T) + if(!B) + expand(T,1,a_color)//No blob here so try and expand return + B.adjustcolors(a_color) - if(pulse > 20) - return//Inf loop check + B.Pulse((pulse+1),get_dir(src.loc,T), a_color) + return + return - //Looking for another blob to pulse + +/obj/effect/blob/proc/run_action() + return 0 + + +/obj/effect/blob/proc/expand(var/turf/T = null, var/prob = 1, var/a_color) + if(prob && !prob(health)) return + if(istype(T, /turf/space) && prob(75)) return + if(!T) var/list/dirs = list(1,2,4,8) - dirs.Remove(origin_dir)//Dont pulse the guy who pulsed us for(var/i = 1 to 4) - if(!dirs.len) break var/dirn = pick(dirs) dirs.Remove(dirn) - var/turf/T = get_step(src, dirn) - var/obj/effect/blob/B = (locate(/obj/effect/blob) in T) - if(!B) - expand(T)//No blob here so try and expand - return - B.Pulse((pulse+1),get_dir(src.loc,T)) - return + T = get_step(src, dirn) + if(!(locate(/obj/effect/blob) in T)) break + else T = null + + if(!T) return 0 + var/obj/effect/blob/normal/B = new /obj/effect/blob/normal(src.loc, min(src.health, 30)) + B.color = a_color + B.density = 1 + if(T.Enter(B,src))//Attempt to move into the tile + B.density = initial(B.density) + B.loc = T + else + T.blob_act()//If we cant move in hit the turf + B.loc = null //So we don't play the splat sound, see Destroy() + qdel(B) + + for(var/atom/A in T)//Hit everything in the turf + A.blob_act() + return 1 + +/obj/effect/blob/ex_act(severity) + ..() + var/damage = 150 - 20 * severity + take_damage(damage, BRUTE) + +/obj/effect/blob/bullet_act(var/obj/item/projectile/Proj) + ..() + take_damage(Proj.damage, Proj.damage_type) + return 0 + +/obj/effect/blob/Crossed(var/mob/living/L) + ..() + L.blob_act() + + +/obj/effect/blob/attackby(var/obj/item/weapon/W, var/mob/living/user, params) + user.changeNext_move(CLICK_CD_MELEE) + user.do_attack_animation(src) + playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1) + visible_message("[user] has attacked the [src.name] with \the [W]!") + if(W.damtype == BURN) + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + take_damage(W.force, W.damtype) + +/obj/effect/blob/attack_animal(mob/living/simple_animal/M as mob) + M.changeNext_move(CLICK_CD_MELEE) + M.do_attack_animation(src) + playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1) + visible_message("\The [M] has attacked the [src.name]!") + var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) + take_damage(damage, BRUTE) + return + +/obj/effect/blob/attack_alien(mob/living/carbon/alien/humanoid/M as mob) + M.changeNext_move(CLICK_CD_MELEE) + M.do_attack_animation(src) + playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1) + visible_message("[M] has slashed the [src.name]!") + var/damage = rand(15, 30) + take_damage(damage, BRUTE) + return + +/obj/effect/blob/proc/take_damage(damage, damage_type) + if(!damage || damage_type == STAMINA) // Avoid divide by zero errors return + switch(damage_type) + if(BRUTE) + damage /= max(brute_resist, 1) + if(BURN) + damage /= max(fire_resist, 1) + health -= damage + update_icon() +/obj/effect/blob/proc/change_to(var/type) + if(!ispath(type)) + error("[type] is an invalid type for the blob.") + var/obj/effect/blob/B = new type(src.loc) + if(!istype(type, /obj/effect/blob/core) || !istype(type, /obj/effect/blob/node)) + B.color = color + else + B.adjustcolors(color) + qdel(src) - proc/run_action() - return 0 +/obj/effect/blob/proc/adjustcolors(var/a_color) + if(a_color) + color = a_color + return +/obj/effect/blob/examine(mob/user) + ..() + user << "It looks like it's of a [get_chem_name()] kind." + return - proc/expand(var/turf/T = null, var/prob = 1) - if(prob && !prob(health)) return - if(istype(T, /turf/space) && prob(75)) return - if(!T) - var/list/dirs = list(1,2,4,8) - for(var/i = 1 to 4) - var/dirn = pick(dirs) - dirs.Remove(dirn) - T = get_step(src, dirn) - if(!(locate(/obj/effect/blob) in T)) break - else T = null - - if(!T) return 0 - var/obj/effect/blob/normal/B = new /obj/effect/blob/normal(src.loc, min(src.health, 30)) - B.density = 1 - if(T.Enter(B,src))//Attempt to move into the tile - B.density = initial(B.density) - B.loc = T - else - T.blob_act()//If we cant move in hit the turf - B.Delete() - - for(var/atom/A in T)//Hit everything in the turf - A.blob_act() - return 1 - - - ex_act(severity) - var/damage = 150 - health -= ((damage/brute_resist) - (severity * 5)) - update_icon() - return - - - bullet_act(var/obj/item/projectile/Proj) - ..() - switch(Proj.damage_type) - if(BRUTE) - health -= (Proj.damage/brute_resist) - if(BURN) - health -= (Proj.damage/fire_resist) - - update_icon() - return 0 - - - attackby(var/obj/item/weapon/W, var/mob/living/user, params) - user.changeNext_move(CLICK_CD_MELEE) - user.do_attack_animation(src) - playsound(get_turf(src), 'sound/effects/attackblob.ogg', 50, 1) - src.visible_message("\red The [src.name] has been attacked with \the [W][(user ? " by [user]." : ".")]") - var/damage = 0 - switch(W.damtype) - if("fire") - damage = (W.force / max(src.fire_resist,1)) - if(istype(W, /obj/item/weapon/weldingtool)) - playsound(get_turf(src), 'sound/items/Welder.ogg', 100, 1) - if("brute") - damage = (W.force / max(src.brute_resist,1)) - - health -= damage - update_icon() - return - - attack_animal(mob/living/simple_animal/M as mob) - M.changeNext_move(CLICK_CD_MELEE) - M.do_attack_animation(src) - playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1) - src.visible_message("The [src.name] has been attacked by \the [M]!") - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - if(!damage) // Avoid divide by zero errors - return - damage /= max(src.brute_resist, 1) - health -= damage - update_icon() - return - - proc/change_to(var/type) - if(!ispath(type)) - error("[type] is an invalid type for the blob.") - new type(src.loc) - Delete() - return - - proc/Delete() - qdel(src) +/obj/effect/blob/proc/get_chem_name() + for(var/mob/camera/blob/B in mob_list) + if(lowertext(B.blob_reagent_datum.color) == lowertext(src.color)) // Goddamit why we use strings for these + return B.blob_reagent_datum.name + return "unknown" /obj/effect/blob/normal icon_state = "blob" - luminosity = 0 + light_range = 0 health = 21 - Delete() - src.loc = null - blobs -= src +/obj/effect/blob/normal/update_icon() + if(health <= 0) + qdel(src) + else if(health <= 15) + icon_state = "blob_damaged" + else + icon_state = "blob" - update_icon() - if(health <= 0) - playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1) - Delete() - return - if(health <= 15) - icon_state = "blob_damaged" - return +/* // Used to create the glow sprites. Remember to set the animate loop to 1, instead of infinite! + +var/datum/blob_colour/B = new() + +/datum/blob_colour/New() + ..() + var/icon/I = 'icons/mob/blob.dmi' + I += rgb(35, 35, 0) + if(isfile("icons/mob/blob_result.dmi")) + fdel("icons/mob/blob_result.dmi") + fcopy(I, "icons/mob/blob_result.dmi") + +*/ diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 997926885ec..8cae3f91c6c 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -115,6 +115,8 @@ Implants; // if(revdata) // feedback_set_details("revision","[revdata.revision]") feedback_set_details("server_ip","[world.internet_address]:[world.port]") + start_state = new /datum/station_state() + start_state.count() return 1 @@ -264,7 +266,6 @@ Implants; feedback_set("escaped_on_pod_5",escaped_on_pod_5) send2mainirc("A round of [src.name] has ended - [surviving_total] survivors, [ghosts] ghosts.") - return 0 @@ -591,6 +592,7 @@ proc/get_nt_opposed() if(BE_TRAITOR) roletext="traitor" if(BE_OPERATIVE) roletext="operative" if(BE_WIZARD) roletext="wizard" + if(BE_MALF) roletext="malf AI" if(BE_REV) roletext="revolutionary" if(BE_CULTIST) roletext="cultist" if(BE_NINJA) roletext="ninja" diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index ea2cfe38c62..457a88b0755 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -350,7 +350,7 @@ var/global/datum/controller/gameticker/ticker proc/create_characters() for(var/mob/new_player/player in player_list) if(player.ready && player.mind) - if(player.mind.assigned_role=="AI") + if(player.mind.assigned_role == "AI" || player.mind.special_role == "malfunctioning AI") player.close_spawn_windows() player.AIize() else if(!player.mind.assigned_role) @@ -465,6 +465,16 @@ var/global/datum/controller/gameticker/ticker /datum/controller/gameticker/proc/declare_completion() + //Round statistics report + var/datum/station_state/end_state = new /datum/station_state() + end_state.count() + var/station_integrity = min(round( 100.0 * start_state.score(end_state), 0.1), 100.0) + + world << "
[TAB]Shift Duration: [round(world.time / 36000)]:[add_zero("[world.time / 600 % 60]", 2)]:[world.time / 100 % 6][world.time / 100 % 10]" + world << "
[TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[station_integrity]%"]" + world << "
" + + //Silicon laws report for (var/mob/living/silicon/ai/aiPlayer in mob_list) if (aiPlayer.stat != 2) world << "[aiPlayer.name] (Played by: [aiPlayer.key])'s laws at the end of the game were:" diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 4684d94410d..fdca56bd5cc 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -20,6 +20,7 @@ var/station_captured = 0 var/to_nuke_or_not_to_nuke = 0 var/apcs = 0 //Adding dis to track how many APCs the AI hacks. --NeoFite + var/list/datum/mind/antag_candidates = list() // List of possible starting antags goes here /datum/game_mode/malfunction/announce() @@ -27,15 +28,36 @@ The AI on the satellite has malfunctioned and must be destroyed.
The AI satellite is deep in space and can only be accessed with the use of a teleporter! You have [AI_win_timeleft/60] minutes to disable it."} +/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) + if(player.client.prefs.be_special & BE_MALF) + if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, "AI") && !jobban_isbanned(player, roletext) && DummyAIjob.player_old_enough(player.client)) + if(player_old_enough_antag(player.client,role)) + antag_candidates += player.mind + antag_candidates = shuffle(antag_candidates) + return antag_candidates /datum/game_mode/malfunction/pre_setup() - for(var/mob/new_player/player in player_list) - if(player.mind && player.mind.assigned_role == "AI" && (player.client.prefs.be_special & BE_MALF)) - malf_ai+=player.mind - if(malf_ai.len) - return 1 - return 0 + get_players_for_role(BE_MALF) + var/datum/mind/chosen_ai + if(!antag_candidates.len) + return 0 + for(var/i = required_enemies, i > 0, i--) + chosen_ai=pick(antag_candidates) + malf_ai += chosen_ai + antag_candidates -= malf_ai + if (malf_ai.len < required_enemies) + return 0 + for(var/datum/mind/ai_mind in malf_ai) + ai_mind.assigned_role = "MODE" + ai_mind.special_role = "malfunctioning AI"//So they actually have a special role/N + log_game("[ai_mind.key] (ckey) has been selected as a malf AI") + return 1 /datum/game_mode/malfunction/post_setup() for(var/datum/mind/AI_mind in malf_ai) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 48e4dc6937a..0d43e6628e2 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -226,26 +226,22 @@ var/global/datum/controller/occupations/job_master if(!job) return 0 if((job.title == "AI") && (config) && (!config.allow_ai)) return 0 + if(ticker.mode.name == "AI malfunction") // malf. AIs are pre-selected before jobs + for (var/datum/mind/mAI in ticker.mode.malf_ai) + AssignRole(mAI.current, "AI") + ai_selected++ + if(ai_selected) return 1 + return 0 + for(var/i = job.total_positions, i > 0, i--) for(var/level = 1 to 3) var/list/candidates = list() - if(ticker.mode.name == "AI malfunction")//Make sure they want to malf if its malf - candidates = FindOccupationCandidates(job, level, BE_MALF) - else - candidates = FindOccupationCandidates(job, level) + candidates = FindOccupationCandidates(job, level) if(candidates.len) var/mob/new_player/candidate = pick(candidates) if(AssignRole(candidate, "AI")) ai_selected++ break - //Malf NEEDS an AI so force one if we didn't get a player who wanted it - if((ticker.mode.name == "AI malfunction")&&(!ai_selected)) - unassigned = shuffle(unassigned) - for(var/mob/new_player/player in unassigned) - if(jobban_isbanned(player, "AI")) continue - if(AssignRole(player, "AI")) - ai_selected++ - break if(ai_selected) return 1 return 0 diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index b9005987fc3..5e0e3c5689f 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -362,8 +362,6 @@ legend { return 1 large_tank_control - icon = 'icons/obj/computer.dmi' - icon_state = "tank" circuit = "/obj/item/weapon/circuitboard/large_tank_control" req_one_access_txt = "24;10" settagwhitelist = list("input_tag", "output_tag") @@ -587,7 +585,7 @@ legend { fuel_injection icon = 'icons/obj/computer.dmi' - icon_state = "atmos" + icon_screen = "atmos" circuit = "/obj/item/weapon/circuitboard/injector_control" var/device_tag diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm index 50ce7f6f98c..4dcdef5f4cc 100644 --- a/code/game/machinery/computer/power.dm +++ b/code/game/machinery/computer/power.dm @@ -1,22 +1,20 @@ // the power monitoring computer // for the moment, just report the status of all APCs in the same powernet -/obj/machinery/power/monitor - name = "Power Monitoring Computer" +/obj/machinery/computer/monitor + name = "power monitoring console" desc = "It monitors power levels across the station." - icon = 'icons/obj/computer.dmi' - icon_state = "power" - density = 1 - anchored = 1 + icon_screen = "power" + icon_keyboard = "power_key" use_power = 2 idle_power_usage = 20 active_power_usage = 80 - light_color = LIGHT_COLOR_ORANGE + circuit = /obj/item/weapon/circuitboard/powermonitor + var/datum/powernet/powernet = null //fix for issue 521, by QualityVan. //someone should really look into why circuits have a powernet var, it's several kinds of retarded. - -/obj/machinery/power/monitor/New() +/obj/machinery/computer/monitor/New() ..() var/obj/structure/cable/attached = null var/turf/T = loc @@ -25,53 +23,22 @@ if(attached) powernet = attached.get_powernet() -/obj/machinery/power/monitor/attack_ai(mob/user) - add_fingerprint(user) - - if(stat & (BROKEN|NOPOWER)) - return - interact(user) - -/obj/machinery/power/monitor/attack_hand(mob/user) - add_fingerprint(user) - - if(stat & (BROKEN|NOPOWER)) - return - interact(user) - -/obj/machinery/power/monitor/attackby(I as obj, user as mob, params) - if(istype(I, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - if (src.stat & BROKEN) - user << "\blue The broken glass falls out." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - PoolOrNew(/obj/item/weapon/shard, loc) - var/obj/item/weapon/circuitboard/powermonitor/M = new /obj/item/weapon/circuitboard/powermonitor( A ) - for (var/obj/C in src) - C.loc = src.loc - A.circuit = M - A.state = 3 - A.icon_state = "3" - A.anchored = 1 - qdel(src) - else - user << "\blue You disconnect the monitor." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - var/obj/item/weapon/circuitboard/powermonitor/M = new /obj/item/weapon/circuitboard/powermonitor( A ) - for (var/obj/C in src) - C.loc = src.loc - A.circuit = M - A.state = 4 - A.icon_state = "4" - A.anchored = 1 - qdel(src) - else - src.attack_hand(user) +/obj/machinery/computer/monitor/process() //oh shit, somehow we didnt end up with a powernet... lets look for one. + if(!powernet) + var/obj/structure/cable/attached = null + var/turf/T = loc + if(isturf(T)) + attached = locate() in T + if(attached) + powernet = attached.get_powernet() return -/obj/machinery/power/monitor/interact(mob/user) +/obj/machinery/computer/monitor/attack_hand(mob/user) + if(..()) + return + interact(user) +/obj/machinery/computer/monitor/interact(mob/user) if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) ) if (!istype(user, /mob/living/silicon)) user.unset_machine() @@ -116,7 +83,7 @@ // Each entry for(var/obj/machinery/power/apc/A in L) t += {" - [get_area_master() ] + [get_area_master(A) ] [State[A.equipment+1]] [State[A.lighting+1 ]] [State[A.environ+1 ]] @@ -130,29 +97,13 @@ user << browse(t, "window=powcomp;size=640x800") onclose(user, "powcomp") - -/obj/machinery/power/monitor/Topic(href, href_list) +/obj/machinery/computer/monitor/Topic(href, href_list) if(..()) - return 1 + return if( href_list["close"] ) usr << browse(null, "window=powcomp") usr.unset_machine() return if( href_list["update"] ) src.updateDialog() - return - - -/obj/machinery/power/monitor/power_change() - - if(stat & BROKEN) - icon_state = "broken" - else - if( powered() ) - icon_state = initial(icon_state) - stat &= ~NOPOWER - else - spawn(rand(0, 15)) - src.icon_state = "c_unpowered" - stat |= NOPOWER - + return \ No newline at end of file diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 4c6c5f34e79..4add16544fc 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -28,7 +28,7 @@ var/datum/data/record/active1 = null //General var/datum/data/record/active2 = null //Medical var/datum/data/record/active3 = null //Security - var/obj/machinery/power/monitor/powmonitor = null // Power Monitor + var/obj/machinery/computer/monitor/powmonitor = null // Power Monitor var/list/powermonitors = list() var/message1 // used for status_displays var/message2 @@ -196,18 +196,18 @@ access_reagent_scanner = 1 access_status_display = 1 access_atmos = 1 - + /obj/item/weapon/cartridge/captain/New() ..() spawn(5) radio = new /obj/item/radio/integrated/beepsky(src) - + /obj/item/weapon/cartridge/supervisor name = "Easy-Record DELUXE" icon_state = "cart-h" access_status_display = 1 access_security = 1 - + /obj/item/weapon/cartridge/centcom name = "Value-PAK Cartridge" desc = "Now with 200% more value!" @@ -220,7 +220,7 @@ access_reagent_scanner = 1 access_status_display = 1 access_atmos = 1 - + /obj/item/weapon/cartridge/centcom/New() ..() spawn(5) @@ -294,7 +294,7 @@ /* Power Monitor (Mode: 43 / 433) */ if(mode==43 || mode==433) var/pMonData[0] - for(var/obj/machinery/power/monitor/pMon in world) + for(var/obj/machinery/computer/monitor/pMon in world) if(!(pMon.stat & (NOPOWER|BROKEN)) ) pMonData[++pMonData.len] = list ("Name" = pMon.name, "ref" = "\ref[pMon]") if(isnull(powmonitor)) powmonitor = pMon diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index f871087dd6f..7366567d050 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -39,6 +39,7 @@ R.speech_synthesizer_langs = list() R.notify_ai(2) R.updateicon() + R.add_language("Robot Talk", 1) return 1 diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 5ee2a50cf87..49db0d33f3f 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -189,8 +189,8 @@ return /turf/simulated/wall/blob_act() - take_damage(rand(75, 125)) - return + if(prob(50)) + dismantle_wall() /turf/simulated/wall/mech_melee_attack(obj/mecha/M) if(M.damtype == "brute") diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 1d212cdc7f6..5631b55820b 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -237,11 +237,7 @@ var/old_opacity = opacity var/old_dynamic_lighting = dynamic_lighting var/list/old_affecting_lights = affecting_lights - #if LIGHTING_RESOLUTION == 1 var/old_lighting_overlay = lighting_overlay - #else - var/old_lighting_overlay = lighting_overlays - #endif if(air_master) air_master.remove_from_active(src) @@ -255,11 +251,7 @@ for(var/turf/space/S in range(W,1)) S.update_starlight() - #if LIGHTING_RESOLUTION == 1 lighting_overlay = old_lighting_overlay - #else - lighting_overlays = old_lighting_overlay - #endif affecting_lights = old_affecting_lights if((old_opacity != opacity) || (dynamic_lighting != old_dynamic_lighting)) diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index b46aa563f60..13813fe2edb 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -493,6 +493,20 @@ dat += "in [flag_loc.loc] at ([flag_loc.x], [flag_loc.y], [flag_loc.z])" dat += "" + if(istype(ticker.mode, /datum/game_mode/blob)) + var/datum/game_mode/blob/mode = ticker.mode + dat += "
" + dat += "" + + for(var/datum/mind/blob in mode.infected_crew) + var/mob/M = blob.current + if(M) + dat += "" + dat += "" + else + dat += "" + dat += "
Blob
Progress: [blobs.len]/[mode.blobwincount]
[M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""]PM
Blob not found!
" + if(ticker.mode.changelings.len) dat += check_role_table("Changelings", ticker.mode.changelings, src) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index d2b3dada0e2..a1eaae00273 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -668,12 +668,11 @@ jobs += "" //Breaking it up so it fits nicer on the screen every 5 entries -/* //Malfunctioning AI //Removed Malf-bans because they're a pain to impliment + //Malfunctioning AI if(jobban_isbanned(M, "malf AI") || isbanned_dept) jobs += "[replacetext("Malf AI", " ", " ")]" else jobs += "[replacetext("Malf AI", " ", " ")]" -*/ //Alien if(jobban_isbanned(M, "alien") || isbanned_dept) diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index 2cf7b397875..83507533afa 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -1,73 +1,24 @@ /datum/event/blob - announceWhen = 120 - noAutoEnd = 1 - var/nuke_announced = 0 - + announceWhen = 12 + endWhen = 120 var/obj/effect/blob/core/Blob - /datum/event/blob/announce() - command_announcement.Announce("Confirmed outbreak of level 7 biohazard aboard [station_name()]. Nanotrasen has issued a directive 7-10. The station is to be considered quarantined.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg') + command_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg') - for (var/mob/living/silicon/ai/aiPlayer in player_list) - if (aiPlayer.client) - var/law = "The station is under quarantine, prevent biological entities from leaving the station at all costs while minimizing collateral damage." - aiPlayer.set_zeroth_law(law) - aiPlayer << "\red You have detected a change in your laws information:" - aiPlayer << "Laws Updated: [law]" /datum/event/blob/start() var/turf/T = pick(blobstart) if(!T) - kill() - return + return kill() Blob = new /obj/effect/blob/core(T, 200) for(var/i = 1; i < rand(3, 6), i++) Blob.process() + /datum/event/blob/tick() - if(Blob && IsMultiple(activeFor, 3)) - Blob.process() - if(blobs.len > 700*0.6 && !nuke_announced) - announce_nuke() - nuke_announced = 1 - if(!Blob && !blob_cores.len) + if(!Blob) kill() return - -/datum/event/blob/proc/announce_nuke() - var/nukecode = "ERROR" - for(var/obj/machinery/nuclearbomb/bomb in world) - if(bomb && bomb.r_code && (bomb.z in config.station_levels)) - nukecode = bomb.r_code - - command_announcement.Announce("The biohazard has grown out of control and will soon reach critical mass. Activate the nuclear failsafe to maintain quarantine. The Nuclear Authentication Code is [nukecode] ", "Biohazard Alert") - set_security_level("gamma") - - var/obj/machinery/door/airlock/vault/V = locate(/obj/machinery/door/airlock/vault) in world - if(V && (V.z in config.station_levels)) - V.locked = 0 - V.update_icon() - - for (var/mob/living/silicon/ai/aiPlayer in player_list) - if (aiPlayer.client) - var/law = "The station is under quarantine, prevent biological entities from leaving the station at all costs. The nuclear failsafe must be activated at any cost, the code is: [nukecode]." - aiPlayer.set_zeroth_law(law) - aiPlayer << "\red You have detected a change in your laws information:" - aiPlayer << "Laws Updated: [law]" - - spawn(10) - world << sound('sound/effects/siren.ogg') - -/datum/event/blob/kill() - spawn(10) - if(Blob || blob_cores.len) - return - command_announcement.Announce("The level 7 biohazard aboard [station_name()] has been eliminated. Directive 7-10 has been lifted, and the station is no longer quarantined.", "Biohazard Update") - - for (var/mob/living/silicon/ai/aiPlayer in player_list) - if (aiPlayer.client) - aiPlayer.clear_zeroth_law() - aiPlayer << "\red You have detected a change in your laws information:" - aiPlayer << "Laws Updated: Zeroth law removed." - ..() \ No newline at end of file + if(IsMultiple(activeFor, 3)) + Blob.process() diff --git a/code/modules/lighting/light_source.dm b/code/modules/lighting/light_source.dm index 854fddcc2ce..e23d53cf21f 100644 --- a/code/modules/lighting/light_source.dm +++ b/code/modules/lighting/light_source.dm @@ -116,11 +116,7 @@ /datum/light_source/proc/falloff(atom/movable/lighting_overlay/O) #if LIGHTING_FALLOFF == 1 // circular - #if LIGHTING_RESOLUTION == 1 . = (O.x - source_turf.x)**2 + (O.y - source_turf.y)**2 + LIGHTING_HEIGHT - #else - . = (O.x - source_turf.x + O.xoffset)**2 + (O.y - source_turf.y + O.yoffset)**2 + LIGHTING_HEIGHT - #endif #if LIGHTING_LAMBERTIAN == 1 . = CLAMP01((1 - CLAMP01(sqrt(.) / max(1,light_range))) * (1 / (sqrt(. + 1)))) @@ -129,11 +125,7 @@ #endif #elif LIGHTING_FALLOFF == 2 // square - #if LIGHTING_RESOLUTION == 1 . = abs(O.x - source_turf.x) + abs(O.y - source_turf.y) + LIGHTING_HEIGHT - #else - . = abs(O.x - source_turf.x + O.xoffset) + abs(O.y - source_turf.y + O.yoffset) + LIGHTING_HEIGHT - #endif #if LIGHTING_LAMBERTIAN == 1 . = CLAMP01((1 - CLAMP01(. / max(1,light_range))) * (1 / (sqrt(.)**2 + ))) @@ -145,16 +137,15 @@ /datum/light_source/proc/apply_lum() applied = 1 if(istype(source_turf)) - #if LIGHTING_RESOLUTION == 1 for(var/turf/T in dview(light_range, source_turf, INVISIBILITY_LIGHTING)) if(T.lighting_overlay) var/strength = light_power * falloff(T.lighting_overlay) if(!strength) //Don't add turfs that aren't affected to the affected turfs. continue - effect_r[T.lighting_overlay] = round(lum_r * strength, LIGHTING_ROUND_VALUE) - effect_g[T.lighting_overlay] = round(lum_g * strength, LIGHTING_ROUND_VALUE) - effect_b[T.lighting_overlay] = round(lum_b * strength, LIGHTING_ROUND_VALUE) + effect_r += round(lum_r * strength, LIGHTING_ROUND_VALUE) + effect_g += round(lum_g * strength, LIGHTING_ROUND_VALUE) + effect_b += round(lum_b * strength, LIGHTING_ROUND_VALUE) T.lighting_overlay.update_lumcount( round(lum_r * strength, LIGHTING_ROUND_VALUE), @@ -162,48 +153,28 @@ round(lum_b * strength, LIGHTING_ROUND_VALUE) ) - if(!T.affecting_lights) - T.affecting_lights = list() - - T.affecting_lights += src - effect_turf += T - - #else - for(var/turf/T in dview(light_range, source_turf, INVISIBILITY_LIGHTING)) - for(var/atom/movable/lighting_overlay/L in T.lighting_overlays) - var/strength = light_power * falloff(L) - - effect_r[L] = round(lum_r * strength, LIGHTING_ROUND_VALUE) - effect_g[L] = round(lum_g * strength, LIGHTING_ROUND_VALUE) - effect_b[L] = round(lum_b * strength, LIGHTING_ROUND_VALUE) - - L.update_lumcount( - round(lum_r * strength, LIGHTING_ROUND_VALUE), - round(lum_g * strength, LIGHTING_ROUND_VALUE), - round(lum_b * strength, LIGHTING_ROUND_VALUE) - ) + else + effect_r += 0 + effect_g += 0 + effect_b += 0 if(!T.affecting_lights) T.affecting_lights = list() T.affecting_lights += src effect_turf += T - #endif /datum/light_source/proc/remove_lum() applied = 0 + var/i = 1 for(var/turf/T in effect_turf) if(T.affecting_lights) T.affecting_lights -= src - #if LIGHTING_RESOLUTION == 1 if(T.lighting_overlay) - T.lighting_overlay.update_lumcount(-effect_r[T.lighting_overlay], -effect_g[T.lighting_overlay], -effect_b[T.lighting_overlay]) - #else - for(var/atom/movable/lighting_overlay/L in T.lighting_overlays) - L.lighting_overlay.update_lumcount(-effect_r[L], -effect_g[L], -effect_b[L]) - #endif + T.lighting_overlay.update_lumcount(-effect_r[i], -effect_g[i], -effect_b[i]) + i++ effect_r.Cut() effect_g.Cut() diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm index d40997a6fcd..0a20a7977c2 100644 --- a/code/modules/lighting/lighting_overlay.dm +++ b/code/modules/lighting/lighting_overlay.dm @@ -9,16 +9,12 @@ invisibility = INVISIBILITY_LIGHTING blend_mode = BLEND_MULTIPLY color = "#000000" + icon_state = "light1" var/lum_r var/lum_g var/lum_b - #if LIGHTING_RESOLUTION != 1 - var/xoffset - var/yoffset - #endif - var/needs_update /atom/movable/lighting_overlay/New() @@ -107,11 +103,7 @@ var/turf/T = loc if(istype(T)) - #if LIGHTING_RESOLUTION == 1 T.lighting_overlay = null - #else - T.lighting_overlays -= src - #endif for(var/datum/light_source/D in T.affecting_lights) //Remove references to us on the light sources affecting us. D.effect_r -= src D.effect_g -= src diff --git a/code/modules/lighting/lighting_system.dm b/code/modules/lighting/lighting_system.dm index 6d5e1b9bbd7..418190ca7a2 100644 --- a/code/modules/lighting/lighting_system.dm +++ b/code/modules/lighting/lighting_system.dm @@ -5,28 +5,15 @@ // duplicates lots of code, but this proc needs to be as fast as possible. /proc/create_lighting_overlays(zlevel = 0) - var/state = "light[LIGHTING_RESOLUTION]" var/area/A if(zlevel == 0) // populate all zlevels for(var/turf/T in world) if(T.dynamic_lighting) A = T.loc if(A.lighting_use_dynamic) - #if LIGHTING_RESOLUTION == 1 var/atom/movable/lighting_overlay/O = new(T) - O.icon_state = state T.lighting_overlay = O - #else - for(var/i = 0; i < LIGHTING_RESOLUTION; i++) - for(var/j = 0; j < LIGHTING_RESOLUTION; j++) - var/atom/movable/lighting_overlay/O = new(T) - O.pixel_x = i * (32 / LIGHTING_RESOLUTION) - O.pixel_y = j * (32 / LIGHTING_RESOLUTION) - O.xoffset = (((2*i + 1) / (LIGHTING_RESOLUTION * 2)) - 0.5) - O.yoffset = (((2*j + 1) / (LIGHTING_RESOLUTION * 2)) - 0.5) - O.icon_state = state - T.lighting_overlays += O - #endif + else for(var/x = 1; x <= world.maxx; x++) for(var/y = 1; y <= world.maxy; y++) @@ -34,18 +21,5 @@ if(T.dynamic_lighting) A = T.loc if(A.lighting_use_dynamic) - #if LIGHTING_RESOLUTION == 1 var/atom/movable/lighting_overlay/O = new(T) - O.icon_state = state T.lighting_overlay = O - #else - for(var/i = 0; i < LIGHTING_RESOLUTION; i++) - for(var/j = 0; j < LIGHTING_RESOLUTION; j++) - var/atom/movable/lighting_overlay/O = new(T) - O.pixel_x = i * (32 / LIGHTING_RESOLUTION) - O.pixel_y = j * (32 / LIGHTING_RESOLUTION) - O.xoffset = (((2*i + 1) / (LIGHTING_RESOLUTION * 2)) - 0.5) - O.yoffset = (((2*j + 1) / (LIGHTING_RESOLUTION * 2)) - 0.5) - O.icon_state = state - T.lighting_overlays += O - #endif \ No newline at end of file diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index 8bb30c4c707..46596bc52f4 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -1,47 +1,20 @@ /turf var/list/affecting_lights - #if LIGHTING_RESOLUTION == 1 var/atom/movable/lighting_overlay/lighting_overlay - #else - var/list/lighting_overlays[0] - #endif /turf/proc/reconsider_lights() for(var/datum/light_source/L in affecting_lights) L.force_update() /turf/proc/lighting_clear_overlays() - #if LIGHTING_RESOLUTION == 1 if(lighting_overlay) qdel(lighting_overlay) - #else - for(var/atom/movable/lighting_overlay/L in lighting_overlays) - qdel(L) - #endif /turf/proc/lighting_build_overlays() - #if LIGHTING_RESOLUTION == 1 if(lighting_overlay) - #else - if(lighting_overlays.len) - #endif return - var/state = "light[LIGHTING_RESOLUTION]" var/area/A = loc if(A.lighting_use_dynamic) - #if LIGHTING_RESOLUTION == 1 var/atom/movable/lighting_overlay/O = new(src) - O.icon_state = state lighting_overlay = O - #else - for(var/i = 0; i < LIGHTING_RESOLUTION; i++) - for(var/j = 0; j < LIGHTING_RESOLUTION; j++) - var/atom/movable/lighting_overlay/O = new(src) - O.pixel_x = i * (32 / LIGHTING_RESOLUTION) - O.pixel_y = j * (32 / LIGHTING_RESOLUTION) - O.xoffset = (((2*i + 1) / (LIGHTING_RESOLUTION * 2)) - 0.5) - O.yoffset = (((2*j + 1) / (LIGHTING_RESOLUTION * 2)) - 0.5) - O.icon_state = state - lighting_overlays += O - #endif \ No newline at end of file diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm index 4ea5c303892..7cdbe6ebd50 100644 --- a/code/modules/mob/camera/camera.dm +++ b/code/modules/mob/camera/camera.dm @@ -3,6 +3,7 @@ /mob/camera name = "camera mob" density = 0 + anchored = 1 status_flags = GODMODE // You can't damage it. mouse_opacity = 0 see_in_dark = 7 @@ -10,3 +11,9 @@ move_on_shuttle = 0 +/mob/camera/experience_pressure_difference() + return + +/mob/camera/Destroy() + ..() + return QDEL_HINT_HARDDEL_NOW diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index b8a4cd05a7e..7d8ab9932df 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -110,21 +110,6 @@ updatehealth() -/mob/living/carbon/alien/humanoid/blob_act() - if (stat == 2) - return - var/shielded = 0 - var/damage = null - if (stat != 2) - damage = rand(30,40) - - if(shielded) - damage /= 4 - - show_message("The blob attacks!") - adjustFireLoss(damage) - return - /mob/living/carbon/alien/humanoid/attack_slime(mob/living/carbon/slime/M as mob) if (!ticker) M << "You cannot attack people before the game has started." diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 2934093a3f6..8f098b64cdf 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -101,30 +101,6 @@ updatehealth() - - -/mob/living/carbon/alien/larva/blob_act() - if (stat == 2) - return - var/shielded = 0 - - var/damage = null - if (stat != 2) - damage = rand(10,30) - - if(shielded) - damage /= 4 - - //paralysis += 1 - - show_message("The blob attacks you!") - - adjustFireLoss(damage) - - updatehealth() - return - - //can't equip anything /mob/living/carbon/alien/larva/attack_ui(slot_id) return diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 7dedb49e812..89e52b7e5ab 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -60,5 +60,8 @@ /mob/living/carbon/brain/ex_act() //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up. return +/mob/living/carbon/brain/blob_act() + return + /mob/living/carbon/brain/binarycheck() return istype(loc, /obj/item/device/mmi/posibrain) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index aec5a9ad082..a8c76bbd2ec 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -20,6 +20,13 @@ mob/living if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level germ_level++ +/mob/living/carbon/blob_act() + if (stat == DEAD) + return + else + show_message("The blob attacks!") + adjustBruteLoss(10) + /mob/living/carbon/Move(NewLoc, direct) . = ..() if(.) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5949aa18f60..556bacbdf96 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -381,11 +381,11 @@ ..() /mob/living/carbon/human/blob_act() - if(stat == 2) return - show_message("\red The blob attacks you!") + 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(rand(20,30), BRUTE, affecting, run_armor_check(affecting, "melee")) + apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee")) return /mob/living/carbon/human/attack_animal(mob/living/simple_animal/M as mob) diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index aede207673f..8e73b3253d3 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -212,23 +212,8 @@ /mob/living/carbon/slime/blob_act() - if (stat == 2) - return - var/shielded = 0 - - var/damage = null - if (stat != 2) - damage = rand(10,30) - - if(shielded) - damage /= 4 - - //paralysis += 1 - show_message(" The blob attacks you!") - - adjustFireLoss(damage) - + adjustBruteLoss(20) updatehealth() return diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm index 97a9375c1f8..2e0dedb1461 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -1,8 +1,8 @@ /obj/machinery/computer/drone_control name = "Maintenance Drone Control" desc = "Used to monitor the station's drone population and the assembler that services them." - icon = 'icons/obj/computer.dmi' - icon_state = "power" + icon_screen = "power" + icon_keyboard = "power_key" req_access = list(access_engine_equip) circuit = "/obj/item/weapon/circuitboard/drone_control" diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index f8eeff8c5f1..5042ae90996 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -966,9 +966,6 @@ var/list/slot_equipment_priority = list( \ process = processScheduler.getProcess("pipenet") stat(null, "PIP([pipe_networks.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - process = processScheduler.getProcess("powernet") - stat(null, "POW([powernets.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") - process = processScheduler.getProcess("nanoui") stat(null, "NAN([nanomanager.processing_uis.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") diff --git a/code/modules/reagents/newchem/Blob-Reagents.dm b/code/modules/reagents/newchem/Blob-Reagents.dm new file mode 100644 index 00000000000..f3b65c9d1b5 --- /dev/null +++ b/code/modules/reagents/newchem/Blob-Reagents.dm @@ -0,0 +1,192 @@ +// These can only be applied by blobs. They are what blobs are made out of. +// The 4 damage +/datum/reagent/blob + var/message = "The blob strikes you" //message sent to any mob hit by the blob + var/message_living = null //extension to first mob sent to only living mobs i.e. silicons have no skin to be burnt + +/datum/reagent/blob/boiling_oil + name = "Boiling Oil" + id = "boiling_oil" + description = "" + color = "#B68D00" + message = "The blob splashes you with burning oil" + +/datum/reagent/blob/boiling_oil/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + var/ratio = volume/25 + M.apply_damage(15*ratio, BURN) + M.adjust_fire_stacks(2*ratio) + M.IgniteMob() + if(isliving(M)) + M.emote("scream") + +/datum/reagent/blob/toxic_goop + name = "Toxic Goop" + id = "toxic_goop" + description = "" + color = "#008000" + message_living = ", and you feel sick and nauseated" + +/datum/reagent/blob/toxic_goop/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + var/ratio = volume/25 + M.apply_damage(20*ratio, TOX) + +/datum/reagent/blob/skin_ripper + name = "Skin Ripper" + id = "skin_ripper" + description = "" + color = "#FF4C4C" + message_living = ", and you feel your skin ripping and tearing off" + +/datum/reagent/blob/skin_ripper/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + var/ratio = volume/25 + M.apply_damage(20*ratio, BRUTE) + if(iscarbon(M)) + M.emote("scream") + +// Combo Reagents + +/datum/reagent/blob/skin_melter + name = "Skin Melter" + id = "skin_melter" + description = "" + color = "#7F0000" + message_living = ", and you feel your skin char and melt" + +/datum/reagent/blob/skin_melter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + var/ratio = volume/25 + M.apply_damage(10*ratio, BRUTE) + M.apply_damage(10*ratio, BURN) + M.adjust_fire_stacks(2*ratio) + M.IgniteMob() + if(iscarbon(M)) + M.emote("scream") + +/datum/reagent/blob/lung_destroying_toxin + name = "Lung Destroying Toxin" + id = "lung_destroying_toxin" + description = "" + color = "#00FFC5" + message_living = ", and your lungs feel heavy and weak" + +/datum/reagent/blob/lung_destroying_toxin/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + var/ratio = volume/25 + M.apply_damage(20* ratio, OXY) + M.losebreath += 15*ratio + M.apply_damage(20*ratio, TOX) + +// Special Reagents + +/datum/reagent/blob/radioactive_liquid + name = "Radioactive Liquid" + id = "radioactive_liquid" + description = "" + color = "#00EE00" + message_living = ", and your skin feels papery and everything hurts" + +/datum/reagent/blob/radioactive_liquid/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + var/ratio = volume/25 + M.apply_damage(10*ratio, BRUTE) + if(istype(M, /mob/living/carbon/human)) + M.apply_effect(40*ratio,IRRADIATE,0) + if(prob(33*ratio)) + randmuti(M) + if(prob(98)) + randmutb(M) + domutcheck(M, null) + M.UpdateAppearance() + +/datum/reagent/blob/dark_matter + name = "Dark Matter" + id = "dark_matter" + description = "" + color = "#61407E" + message = "You feel a thrum as the blob strikes you, and everything flies at you" + +/datum/reagent/blob/dark_matter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + var/ratio = volume/25 + M.apply_damage(15*ratio, BRUTE) + reagent_vortex(M, 0) + + +/datum/reagent/blob/b_sorium + name = "Sorium" + id = "b_sorium" + description = "" + color = "#808000" + message = "The blob slams into you, and sends you flying" + +/datum/reagent/blob/b_sorium/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + var/ratio = volume/25 + M.apply_damage(15*ratio, BRUTE) + reagent_vortex(M, 1) + + +/datum/reagent/blob/explosive // I'm gonna burn in hell for this one + name = "Explosive Gelatin" + id = "explosive" + description = "" + color = "#FFA500" + message = "The blob strikes you, and its tendrils explode" + +/datum/reagent/blob/explosive/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + var/ratio = volume/25 + if(prob(75*ratio)) + explosion(M.loc, 0, 0, 1, 0, 0) + +/datum/reagent/blob/omnizine + name = "Omnizine" + id = "b_omnizine" + description = "" + color = "#C8A5DC" + message = "The blob squirts something at you" + message_living = ", and you feel great" + +/datum/reagent/blob/omnizine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + var/ratio = volume/25 + M.reagents.add_reagent("omnizine", 11*ratio) + +/datum/reagent/blob/spacedrugs + name = "Space drugs" + id = "b_space_drugs" + description = "" + color = "#60A584" + message = "The blob squirts something at you" + message_living = ", and you feel funny" + +/datum/reagent/blob/spacedrugs/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) + if(method == TOUCH) + var/ratio = volume/25 + M.hallucination += 20*ratio + M.reagents.add_reagent("space_drugs", 15*ratio) + M.apply_damage(10*ratio, TOX) + + +/datum/reagent/blob/proc/reagent_vortex(var/mob/living/M as mob, var/setting_type) + var/turf/pull = get_turf(M) + for(var/atom/movable/X in range(4,pull)) + if(istype(X, /atom/movable)) + if((X) && !X.anchored) + if(setting_type) + step_away(X,pull) + step_away(X,pull) + step_away(X,pull) + step_away(X,pull) + else + X.throw_at(pull) + +/datum/reagent/blob/proc/send_message(var/mob/living/M as mob) + var/totalmessage = message + if(message_living && !issilicon(M)) + totalmessage += message_living + totalmessage += "!" + M << "[totalmessage]" \ No newline at end of file diff --git a/icons/mob/blob.dmi b/icons/mob/blob.dmi index a3d5d618c7c..21a976f7003 100644 Binary files a/icons/mob/blob.dmi and b/icons/mob/blob.dmi differ diff --git a/icons/mob/human_races/r_machine.dmi b/icons/mob/human_races/r_machine.dmi index 2e3956f8464..31a8ebd68c4 100644 Binary files a/icons/mob/human_races/r_machine.dmi and b/icons/mob/human_races/r_machine.dmi differ diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi index c70af829c12..bfe2c56826d 100644 Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ diff --git a/paradise.dme b/paradise.dme index 200bd8a9095..822a4ad2b6d 100644 --- a/paradise.dme +++ b/paradise.dme @@ -157,7 +157,6 @@ #include "code\controllers\Processes\nanoui.dm" #include "code\controllers\Processes\obj.dm" #include "code\controllers\Processes\pipenet.dm" -#include "code\controllers\Processes\powernet.dm" #include "code\controllers\Processes\shuttle.dm" #include "code\controllers\Processes\sun.dm" #include "code\controllers\Processes\supply.dm" @@ -278,11 +277,13 @@ #include "code\game\gamemodes\blob\overmind.dm" #include "code\game\gamemodes\blob\powers.dm" #include "code\game\gamemodes\blob\theblob.dm" +#include "code\game\gamemodes\blob\blobs\blob_mobs.dm" #include "code\game\gamemodes\blob\blobs\core.dm" #include "code\game\gamemodes\blob\blobs\factory.dm" #include "code\game\gamemodes\blob\blobs\node.dm" #include "code\game\gamemodes\blob\blobs\resource.dm" #include "code\game\gamemodes\blob\blobs\shield.dm" +#include "code\game\gamemodes\blob\blobs\storage.dm" #include "code\game\gamemodes\borer\borer.dm" #include "code\game\gamemodes\changeling\changeling.dm" #include "code\game\gamemodes\changeling\changeling_power.dm" @@ -1596,6 +1597,7 @@ #include "code\modules\reagents\reagent_containers.dm" #include "code\modules\reagents\reagent_dispenser.dm" #include "code\modules\reagents\syringe_gun.dm" +#include "code\modules\reagents\newchem\Blob-Reagents.dm" #include "code\modules\reagents\newchem\chem_heater.dm" #include "code\modules\reagents\newchem\drinks.dm" #include "code\modules\reagents\newchem\drugs.dm"