diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 7d30ae7a4b5..e8a45ce24a0 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -2254,8 +2254,8 @@ "aRr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aRs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall,/area/maintenance/fsmaint2) "aRt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"aRu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"aRv" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aRu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aRv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aRw" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aRx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/lattice,/turf/space,/area/space) "aRy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -2348,13 +2348,13 @@ "aTh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aTi" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aTj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j1s"; sortType = 21; tag = "icon-pipe-j1s (EAST)"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"aTk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"aTl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"aTm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j2s"; sortType = 17},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"aTn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/maintenance/fsmaint2) -"aTo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/maintenance/fsmaint2) -"aTp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/wall,/area/maintenance/fsmaint2) -"aTq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/maintenance/fsmaint2) +"aTk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aTl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j2s"; sortType = 17},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aTm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aTn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/hydroponics) +"aTo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/hydroponics) +"aTp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/wall,/area/hydroponics) +"aTq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/hydroponics) "aTr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aTs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/library) "aTt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/wall,/area/library) @@ -2528,10 +2528,10 @@ "aWF" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/closet/crate/hydroponics/prespawned,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aWG" = (/obj/structure/table,/obj/item/weapon/watertank,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aWH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) -"aWI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"aWI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/hydroponics) "aWJ" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/structure/closet/secure_closet/hydroponics,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aWK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) -"aWL" = (/obj/machinery/alarm{pixel_y = 24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/camera{c_tag = "Hydroponics Storage"; network = list("SS13")},/obj/structure/table,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 8; pixel_y = 8},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 0; pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"aWL" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/wall,/area/hydroponics) "aWM" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aWN" = (/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aWO" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -2628,10 +2628,10 @@ "aYB" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Hydroponics Pasture"; req_access_txt = "35"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aYC" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aYD" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) -"aYE" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = -31},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) -"aYF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) -"aYG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) -"aYH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"aYE" = (/obj/machinery/alarm{pixel_y = 24},/obj/machinery/camera{c_tag = "Hydroponics Storage"; network = list("SS13")},/obj/structure/table,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 8; pixel_y = 8},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 0; pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"aYF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/closet/secure_closet/hydroponics,/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"aYG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"aYH" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = -31},/obj/machinery/light,/obj/machinery/atmospherics/binary/valve{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aYI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/wood,/area/library) "aYJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/library) "aYK" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/library) @@ -2787,7 +2787,7 @@ "bbE" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/grass,/area/hydroponics) "bbF" = (/obj/machinery/botany/editor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "bbG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) -"bbH" = (/obj/machinery/seed_extractor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) +"bbH" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "bbI" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "bbJ" = (/obj/machinery/vending/hydroseeds,/obj/machinery/camera{c_tag = "Hydroponics North"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "bbK" = (/obj/machinery/biogenerator,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) @@ -3187,7 +3187,7 @@ "bjo" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) "bjp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bjq" = (/obj/machinery/processor,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) -"bjr" = (/obj/machinery/portable_atmospherics/hydroponics{closed_system = 1; name = "isolation tray"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) +"bjr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "bjs" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "bjt" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "bju" = (/turf/simulated/wall,/area/hallway/primary/starboard/east) @@ -7180,6 +7180,7 @@ "cId" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cIe" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/photocopier/faxmachine{department = "Chief Engineer's Office"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cIf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/folder/yellow,/obj/item/weapon/stamp/ce,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) +"cIg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "cIh" = (/obj/structure/closet/secure_closet/engineering_welding,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cIi" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cIj" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) @@ -7732,6 +7733,7 @@ "cSK" = (/obj/machinery/light/spot,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate) "cSL" = (/obj/machinery/light/small{dir = 8},/obj/machinery/power/emitter,/turf/simulated/floor/plating,/area/storage/secure) "cSM" = (/obj/machinery/power/emitter,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/storage/secure) +"cSN" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "cSO" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) "cSP" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/engine/engineering) "cSQ" = (/obj/machinery/field/generator{anchored = 1; state = 2},/turf/simulated/floor/plating/airless,/area/space) @@ -8023,6 +8025,7 @@ "cYq" = (/turf/simulated/floor/plating{icon_state = "platingdmg3"},/area/maintenance/asmaint2) "cYr" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/wall/r_wall,/area/maintenance/turbine) "cYs" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 5; tag = "icon-intact-y (NORTHWEST)"},/turf/simulated/wall/r_wall,/area/maintenance/turbine) +"cYt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "cYu" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology) "cYv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plating,/area/maintenance/turbine) "cYw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine) @@ -8071,6 +8074,8 @@ "cZn" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/item/latexballon,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cZo" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cZp" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"cZq" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/hydroponics) +"cZr" = (/obj/machinery/seed_extractor,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "cZs" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine) "cZt" = (/obj/machinery/atmospherics/binary/valve,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine) "cZu" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine) @@ -8222,6 +8227,7 @@ "dck" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/medical/patients_rooms) "dcl" = (/obj/structure/sign/securearea{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/asmaint) "dcm" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms) +"dcn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/hydroponics) "dco" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plasteel,/area/engine/engineering) "dcp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel,/area/engine/engineering) "dcq" = (/obj/effect/decal/warning_stripes/south,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/patients_rooms) @@ -8709,6 +8715,10 @@ "dlE" = (/obj/structure/table,/obj/structure/bedsheetbin{pixel_x = -1; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/crew_quarters/locker) "dlF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "dlG" = (/obj/machinery/camera{c_tag = "Aft Starboard Solar Access"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"dlH" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/hydroponics) +"dlI" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/hydroponics) +"dlJ" = (/obj/machinery/portable_atmospherics/hydroponics{closed_system = 1; name = "isolation tray"},/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) +"dlK" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plasteel,/area/hydroponics) (1,1,1) = {" bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -8820,18 +8830,18 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaKAaKzaKzaKzaKzaKzaKzaKAaInaMlaCuaMmaMnaMoaMoaMoaMoaMoaMoaMpaKHaLHaMqaLJaMraMqaMqaLHaKHaMsaMtaMuaMuaMuaMuaMuaMuaMuaMuaMvbikaLRaMwaMxaMyaMzaMAaLRbikaJGaJLaJMaMBaMCaMDaMEaLSaJMaGvaIKaMFaMFaKPaMGaMHaKSaKTaKSaMHaMIaMJaKOaKOaIKaJZaxqaKaazIaMKaBRaMLaCZaDaaDbaEgaMbaMcaMMaMNaMOaMOaMcaMPaMQaMRaMeaMSaMTaMUaMeaMVayGbikaMWaMXaMXaMXaMXaMXaMYbikayGayHaMZaNaayJayJayGayGayJayJaNbaNcayJayGazxayGayGayJayJaNdaNeayGayGayGaHYaMiayHaDxayHaMjazwayKaFSayGaNfaNgaNfayGayGayGaabaabaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaNhaNiaNjaNiaNiaNkaNlaNiaNiaNjaNmaNnaCuaKBaNoaMoaNpaNqaNraNsaNtaNuaKHaLHaMqaLJaNvaMqaMqaLHaKHaNwaNxaNyaNzaNAaNBaNCaNDaNEaNFaMvaabaLRaNGaNHaNIaNJaNKaLRaabaJGaJLaJMaNLaNMaNNaNOaNPaJMaGvaIKaJNaJOaNQaNRaLXaJOaNSaJOaLXaNTaNUaJOaJYaIKaJZaxqaNVazIaKbaEeaEfaCZaDaaDbaNWaNXaMcaNYaMQaMQaMQaNZaOaaObaOcaMeaOdaOeaOfaOgaOhazxbikbikbikbikbikbikbikbikbikayGaOiaOjaOkaOlaOmayGaEtayHaHVaDxayHayGbikayGayHayHayHayHaDxaOnaOoaOpaOpaOpaOpaOqaOraOsaOtaOuaOvaOuaOwaOxaOxaOyaOzaOAaOBaOCaOCbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaNhaNmaNiaODaOEaOFaOGaOHaOIaOJaOKaOLaOMaONaOOaKzaKBaOPaMoaOQaORaOSaOTaOSaOUaKHaOVaMqaOWaOXaOYaOXaOZaPaaPbaPcaPdaPdaPdaPdaPdaPdaPeaPfaMvbikaLRaPgaNHaPhaNJaPiaLRbikaJGaJLaJMaPjaPkaPlaPmaPnaJMaGvaIKaPoaPoaKPaPpaMHaKSaPqaKSaMHaPraKWaPsaPsaIKaPtazUaPuazIaKbaEeaPvaPvaPvaPvaPwaPxaPyaPzaPAaPBaPBaPBaPCaPBaPDaPEaPFaPGaPHaPEaPIaPJazxayGayGayGayGayGayGayGayGayGayGayGayGaBMayGayGayGayGayHaDxaOiazvaabazvayHaPLaPMaPNaPOaPPaPQaPRaPRaPRaPRaPSaPTaPUaPVaPWaPXaPWaPYaPWaPWaPZaQaaQbaQbaQcaQdaQeaQeaQeaQeaQeaQeaQeaQeaQeabLadbbikbikbikbikbikbikbikaaabdBaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaONaQgaQhaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaQmaMoaQnaQoaQpaQqaQraQsaKHaQtaMqaQuaQvaQwaQxaQyaKHaQzaPdaPdaPdaPdaPdaPdaPdaPeaQAaMvaabaLRaQBaQCaQDaQEaQFaLRaabaJGaJLaJMaQGaQHaQIaQJaQKaJMaGvaIKaIKaIKaIKaQLaLXaJOaLYaJOaLXaQMaIKaIKaIKaIKaQNaQOaQPazIaMKaQQaQRaQRaQRaQSaQTaQUaQVaQWaQXaQVaQYaQZaRaaQVaRbaRcaRdaReaRfaMeaRgaRhaRiaRjaRjaRhaRkaRlaRlaRlaRlaRlaRmaRnaRlaRoaRpaRqaRraRsaRtaRuaRvaRwaRxaRwaRyaRzayHayGaRAaRBaRCaRDaREaRFaRGaRHaRIaRJaRIaRKaRLaRMaRNaROaRPaRQaRRaRSaRTaRUaQdaRVaRWaRXaRYaRZaSaaSbaScaSdaprbikbikbikbikbikbikbikaaabfmbifbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSfaOFaOFaNjaOMaQjaOFaQjaSgaQjaOFaQjaOMaQkaQlaKzaKBaShaMoaMoaSiaSjaSkaSjaMoaKHaKHaKHaKHaSlaSmaSnaSoaKHaSpaSqaSraPdaPdaSsaPdaStaSuaSvaMvbikaLRaLRaSwaSxaSwaLRaLRbikaJGaJLaJMaSyaSzaSAaQJaSBaJMaGvaIKaJNaJOaSCaNRaLXaJOaLYaJOaLXaNTaSDaIKaIKaIKaSEaSFaSGaSHaSIaSJamKamKaSKaSLaSMaSNaMcaSOaMQaMcaSPaMcaSQaMcaSRaSSaSTaSUaSVaSWaSXaSYaSZaTaaTbaTcaTdaTbaTbaTeaTbaSYaTfaSYaOvaTgaSYaThaTiaTjaTkaTlaTmaTnaToaTpaTqaTraOuaTsaTtaTuaTvaTwaTxaTyaTzaRHaTAaTBaRIaTCaTDaTEaTFaROaTGaRQaRRaRSaTHaTIaQdaTJaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikaaabfmbigbijbihbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaONaTMaTNaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaTOaTPaTQaTRaTSaTSaJraTTaTUaTVaTWaTXaTYaTZaMqcoCaKHaUbaUcaUdaUeaUfaUgaUhaUiaUjaUkaMvbikaabbikaUlaUmaUlbikaabbikaCuaJLaJMaUnaUoaUpaUqaUraJMaGvaIKaUsaUtaKPaUuaUvaKSaUwaKSaUxaUyaUzaIKaUAaUBaUCaUDaUEaUFaUGaUHbikbikaSKaUIaUJaUKaMcaULaUMaMQaMQaUNaMQaMQaMQaUOaMeaUPaMeaUQaURaMeaUSaMeaUTaUUaUVaUWaUXaUYaUTaUZaVaaVbaVcaVbaVbaVbaVbaVdaVbaVbaVeaVbaVfaVgaVbaVhayHaRDaViaTvaVjaVkaVlaVmaVnaVoaVpaVqaRIaVraVsaVtaVuaVvaTGaRQaRRaRSaRTaVwaQdaVxaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikbdBblqbjMbmKbjMbqQbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVyaVzaNiaODaOMaOFaVAaVBaOFaOFaVCaVAaOMaONaVDaKzaKBaVEaVFaVGaVHaVGaVGaVGaVGaVGaVIaJraKHaVJaVKaVJaKHaKHaVLaVMaVLaMuaMuaMuaMuaVLaVNaVOaMvaVPaVQaVQaVRaVSaVRaVQaVQaVTaVUaVVaJMaVWaJMaVXaVYaVZaJMaWaaIKaIKaIKaIKaWbaWcaWdaWeaWdaWcaWbaIKaIKaWfaUDaUDaUDaUDaWgaWhaWiaWjaWkaSKaWlaUJaWmaMcaMcaMcaMcaMcaMcaMcaMeaMeaUOaWnaWoaWpaWqaWraWsaWuaWtaUTaWvaWwaWxaWyaWzaUTaWAaWBaWCaWDaWCaWEaWFaWGaWHaWIaWJaWKaWLaWMaWNaVbaWOaRtaWPaWQaWRaVjaWSaVlaVmaWTaRIaWUaWVaWWaWXaWYaTFaTFaRIaRIaRQaRRaRSaTHaWZaQdaXaaXbaXcaXdaXeaXfaScaScaXgaprbikbikbikbikbikaaabfmbqRbmKbmKbmKbqSbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVyaNiaNjaNiaNiaNkaNlaNiaNiaNjaVzaXhaCuaXiaVEaInaXjaXjaXkaXjaXlaDEaXmaXnaJraXoaXpaXqaXqaXraXsaXqaXtaXqaXqaXqaXuaXqaXqaXvaXwaXxaXyaXzaXAaXyaXBaXyaXyaXyaXyaXCaXDaXEaXqaXqaXFaXGaXHaXIaXJaXKaXLaXMaXRaXPaXPaXPaXPaXPaXPaXPaXQaXWaXXaXSaXTaXUaXVaXYaZHaXZaUDaUDaYaaYbaYcaYbaYcaYdaYeaYfaYgaYhaYiaMeaYkaYjaYmaYlaYnaYnaYoaYpaYqaYraUTaYsaYtaYuaYuaYvaUTaYwaYxaYyaYzaYAaYAaYBaYCaYDaWNaYEaYFaYGaYHaWNaVbaVhaKsaRDaYIaYJaYJaYKaYLaYJaYMaRIaYNaYOaRIaYPaYQaTFaYRaRIaYSaYTaYUaRSaQbaQbaQdaYVaQeaYWaYXaQeaQeaQeaQeaQeabLadbbikbikbikbikbqUbqTbqVbmKbmKbrUbthbmKbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaYYaKzaKzaKzaKzaKzaKzaYYaInaMlaCuaYZaZaaInaZbaZcaZdaZdaZeaDEaZfaXnaZgaZhaXpaZiaZjaZkaZlaZlaZmaZnaZnaZnaZoaZpaZpaZqaZraZsaZlaZlaZtaZpaZvaZwaZxaZxaZyaZzaZAaZuaZuaZuaZBaXGaXHaXIaXJaXJaXJaXJaZCaXJaXJaXJaXJaXJaXJaZDaZEaZNaZFaZGaZJaZIaZLaZKaZMaZNaZNaZNaZOaZPaZPaZPaZQaYiaYiaYiaZRaZSaYiaMebbsaZUaYnaYnaZVaYnaZWaZXaYqaZYaUTaZZbaababbacbadaUTbaebafbagbahbaibajaVbbakbalbakaVbaVbaVbaVeaVbaVbaVhayHaRDbamaTvaTvaTvbanaTvbaoaRIaRIaRIaRIaRIaRIaRIbapaRIaRSaRSaRRaRSbaqbaraQbbasbatbaubavbawbaxbaybazbaAbikbikbikbikaaabtibtjbtibtibtibtkbtibtlbtibtjbtiaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaLyaCuaInaGdaKzbaBbaCbaDbaEaKzaGdaInaInaCubaFaVEaInbaGbaHaZdaZdaZeaDEbaIaXnaJraZhaXpaXqbaJbaKbaLbaLbaMbaNbaObaLbaPbaLbaQbaLbaRbaSbaLbaLbaWbaLbaLbaUbaVbaLbaWbaXbaYbaZaXqaXqbbabbbbbcbbdbbebbfbbebbgbbhbbgbbgbbgbbgbbgbbgbbibbjbbkbbkbbkbbkbblbbkbbmbbnbbkbbkbbobbpbbqbbqbbqbbqbbqbbqbbqbbraYiaYiaMebcTbbtbbubbvbbvbbwbbxaZXaYqbbyaUTaUTaUTaUTaUTbbzaUTbbAbbBbbCbbDaWCbbEaVbbbFbbGbbHbbIbbJbbKbbLbbMaVbaVhaHYaRDbbNbbOaTvbbPbbQaTvbbRbbRaRDbbSbbTbbUaQbbbVbbWbbXaRSaRSbbYbbZaQbbcaaQbbcbbatbccbcdbcebatbatbcfbaAbikbikbikbikbqUbtmbwlbutbwmbtmbmKbutbwmbtmbwlbutbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaDEaInaYYaKzaKBaJraJraKCaKzaYYaKzbcgbchbcibcjaInbckbckaXkbckaXlaDEbclaXnaJraDEbcmbcmbcnbcobcobcobcobcobcobcpbcqbcobcobcobcobcobcobcrbcsbctbctbcubctbcvbcwbcxbcvbcvbcybczbcAbcmbcBbcBbcCbcCbcCbcDbcDbcDbcDbcDbcDbcDbcDbcEbcFbcFbcGbcFbcHbcHbcHbcHbcIbcJbcHbcEbcKbcKbcKbcKbcKbcKbcKbcKbcLbcLbcLaMebcMbcNbcObcObcObcObcPbcQbcRbmwbcUaZTbcVbcWbcXbcYaUTaUTbcZbdabdbbdabdaaVbbdcbddbdebdebdebdebdfbdgaVbbdhbdiaRDbdjaTvbbPbbPbbQbbPaTvbdkaRDbdlbdmbdnaQbaRSbdobdpbdqbdqbdrbdsbdtbdubdvbdwbdxbdybdzbavbatbatbdAbaAbikbikbikbikbqUbwnbmKbutbBQbtmbmKbutbBQbtmbmKbFmbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbdCbdDaJrbdEbdFbdGbdHbdIbdJbdHbdKbdLbdHbdHbdMbdNbdObdPbdQbdQbdQbdRbdQbdSbdTaDEbdUbdVbdWbcobdXbdYbdZbeabebbecbedbeebefbegbehbeibcobejbekbctbelbembenbcvbeobepbeqbcvberbesbetberberberbeuaXJaXObcDbikbikbikbikbikbikbikbcEbevbewbexbeybezbeAbeBbeCbeDbeEbeFbcEbikbikbikbikbikbikbikbcKbeGaYibeHaMebeIbcNbmwbmwbmwbmwbmwbeJbeKbmwbmwbmwbnMbeMbeMbeNbeObePbeQbeRbeSbeTbeUaVbbeVbeWbeXbeYbeYbeXbeZbfaaVbaVhayHaRDbfbbfcaTvbbPbbQaTvbfdbfdaRDaRDbfeaRDaQbbffbbWbbZbfgbfgbfhbbZaQbaQbaQbbfibatbfjbfjbfkbfjbatbflbaAaabbikbikaabbdBbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbdCbfnbfobfnbfnbfnbfnbfnbfnbfobfnbfnbfpaJrbfqbfrbfsaJrbftaJrbfubfvbfwbfxbfyaDEbdVbdVbfzbcobfAbecbecbecbecbecbedbfBbecbecbecbfCbcobejbfDbctbfEbfFbfGbcvbfHbfIbfJbcvbfKbfLbfMbfNbfObesbeuaXJaXObcDbikbikbikbikbcEbcEbcEbcEbfPbfQbfRbfSbfTbfUbfVbfWbfXbfYbfZbcEbcEbcEbcEbikbikbikbikbcKbeGaYibgabgbbgcbgdbgebgfbgcbggbghbgibgjbgkbglbmwbeLbgmbeMbgnbgobeMbgpbgqbgrbgsbeMbgtbgubgvbeXbeYbeYbeXbgwbgxaVbaVhaKsaRDbdjaTvbbPbbPbbQbbPaTvaTvbgybgzaTvbgAaQbbgBbgCbgDbfgbfgbgEbgDbgFaQbbgGbgHbatbgIbgIbgJbgIbatbdAbaAbgKbaAbaAbaAbqUbtmbmKbutbGVbtmbmKbutbGVbtmbmKbutbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaCuaCuaInaInaInaInaInaInaInaInaInaCuaDEbgLbgMbgNbgNbgNbgNbgNbgNbgObgNbgNbgNaDEbdVbejbgPbcobgQbecbecbgRbgSbgTbgUbgRbecbecbecbgVbcobejbekbctbgWbgXbgYbcvbgZbhabhbbcvbhcbhdbhebhfbhgbesbhhbhiaXObcDbcDbhjbcEbcEbcEbhkbhlbhmbhnbhobhobhpbhqbhobhrbhobhsbhtbhubhvbhwbhxbcEbcEbcEbhjbcKbcKbeGaYiaYiaMebhybhzbgkbhAbmwbhBbhCbmwbhDbhEbglbmwbnMbeMbeMbhFbcSbhHbhIbhJbhKbhLbeMbhMbgubhNbeXbeYbeYbhObhPbhQaVbaVhayHaRDbhRbhSbhTbbPbbQbhUaTvaTvbhVaTvbhWbhXaQbbhYbhZbiabfgbfgbibbiabicaQbbidbgHbatbatbatbavbatbatbKnbIzbPfbNjbiibPfddJbmKbmKbmKbmKbmKbmKbmKbmKbmKbmKbutbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikblsbltbltblubltbltbltblvbltbltbmPaabaInaLAaJtbilbgNbimbinbiobipbiqbirbisbitbgNbiubivbiwbixbcobiybecbecbgRbgTbizbiAbgRbecbecbiBbiCbcobejbekbctbctbiDbctbcvbiEbiFbiGbcvbiHbhfbiIbhfbiJbesbeubiKaXOaXPaXPbiLbiMbiNbcEbiObfRbiPbhobhobiQbiRbiSakybiSbiUbiVbiWbiXbiYbiZbjabcEbjbbiMbjcbjdbjebeGaYiaYibjfbmwbjgbmwbmwbmwbjhbjibmwbhDbjjbglbmwbeLbeMbeMbjkbjlbjmbjnbjobjpbhLbjqaVbbjrbhNbeXbeYbeYbeXbhPbjsaVbbjtbjuaRDbjvaRDaRDbjwbbQbjxbjyaTvbjzbjAaWSbjBbdvbjCbjDbjEbjFbjFbjGbjHbjIbdvbjJbjKbatbjLbatbavbatbatddAbaAbaAbaAbaAbgKbqUddBbmKbutbwmbtmbmKbutbwmbtmbmKddCbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaONaQgaQhaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaQmaMoaQnaQoaQpaQqaQraQsaKHaQtaMqaQuaQvaQwaQxaQyaKHaQzaPdaPdaPdaPdaPdaPdaPdaPeaQAaMvaabaLRaQBaQCaQDaQEaQFaLRaabaJGaJLaJMaQGaQHaQIaQJaQKaJMaGvaIKaIKaIKaIKaQLaLXaJOaLYaJOaLXaQMaIKaIKaIKaIKaQNaQOaQPazIaMKaQQaQRaQRaQRaQSaQTaQUaQVaQWaQXaQVaQYaQZaRaaQVaRbaRcaRdaReaRfaMeaRgaRhaRiaRjaRjaRhaRkaRlaRlaRlaRlaRlaRmaRnaRlaRoaRpaRqaRraRsaRvaRuaTkaRwaRxaRwaRyaRzayHayGaRAaRBaRCaRDaREaRFaRGaRHaRIaRJaRIaRKaRLaRMaRNaROaRPaRQaRRaRSaRTaRUaQdaRVaRWaRXaRYaRZaSaaSbaScaSdaprbikbikbikbikbikbikbikaaabfmbifbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSfaOFaOFaNjaOMaQjaOFaQjaSgaQjaOFaQjaOMaQkaQlaKzaKBaShaMoaMoaSiaSjaSkaSjaMoaKHaKHaKHaKHaSlaSmaSnaSoaKHaSpaSqaSraPdaPdaSsaPdaStaSuaSvaMvbikaLRaLRaSwaSxaSwaLRaLRbikaJGaJLaJMaSyaSzaSAaQJaSBaJMaGvaIKaJNaJOaSCaNRaLXaJOaLYaJOaLXaNTaSDaIKaIKaIKaSEaSFaSGaSHaSIaSJamKamKaSKaSLaSMaSNaMcaSOaMQaMcaSPaMcaSQaMcaSRaSSaSTaSUaSVaSWaSXaSYaSZaTaaTbaTcaTdaTbaTbaTeaTbaSYaTfaSYaOvaTgaSYaThaTiaTjaTmaTlaToaTnaTqaTpaWIaTraOuaTsaTtaTuaTvaTwaTxaTyaTzaRHaTAaTBaRIaTCaTDaTEaTFaROaTGaRQaRRaRSaTHaTIaQdaTJaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikaaabfmbigbijbihbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaONaTMaTNaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaTOaTPaTQaTRaTSaTSaJraTTaTUaTVaTWaTXaTYaTZaMqcoCaKHaUbaUcaUdaUeaUfaUgaUhaUiaUjaUkaMvbikaabbikaUlaUmaUlbikaabbikaCuaJLaJMaUnaUoaUpaUqaUraJMaGvaIKaUsaUtaKPaUuaUvaKSaUwaKSaUxaUyaUzaIKaUAaUBaUCaUDaUEaUFaUGaUHbikbikaSKaUIaUJaUKaMcaULaUMaMQaMQaUNaMQaMQaMQaUOaMeaUPaMeaUQaURaMeaUSaMeaUTaUUaUVaUWaUXaUYaUTaUZaVaaVbaVcaVbaVbaVbaVbaVdaWLaVbaVeaYEaVfaVgaVbaVhayHaRDaViaTvaVjaVkaVlaVmaVnaVoaVpaVqaRIaVraVsaVtaVuaVvaTGaRQaRRaRSaRTaVwaQdaVxaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikbdBblqbjMbmKbjMbqQbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVyaVzaNiaODaOMaOFaVAaVBaOFaOFaVCaVAaOMaONaVDaKzaKBaVEaVFaVGaVHaVGaVGaVGaVGaVGaVIaJraKHaVJaVKaVJaKHaKHaVLaVMaVLaMuaMuaMuaMuaVLaVNaVOaMvaVPaVQaVQaVRaVSaVRaVQaVQaVTaVUaVVaJMaVWaJMaVXaVYaVZaJMaWaaIKaIKaIKaIKaWbaWcaWdaWeaWdaWcaWbaIKaIKaWfaUDaUDaUDaUDaWgaWhaWiaWjaWkaSKaWlaUJaWmaMcaMcaMcaMcaMcaMcaMcaMeaMeaUOaWnaWoaWpaWqaWraWsaWuaWtaUTaWvaWwaWxaWyaWzaUTaWAaWBaWCaWDaWCaWEaWFaWGaWHaYFaWJaWKaYGaWMaWNaVbaWOaRtaWPaWQaWRaVjaWSaVlaVmaWTaRIaWUaWVaWWaWXaWYaTFaTFaRIaRIaRQaRRaRSaTHaWZaQdaXaaXbaXcaXdaXeaXfaScaScaXgaprbikbikbikbikbikaaabfmbqRbmKbmKbmKbqSbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVyaNiaNjaNiaNiaNkaNlaNiaNiaNjaVzaXhaCuaXiaVEaInaXjaXjaXkaXjaXlaDEaXmaXnaJraXoaXpaXqaXqaXraXsaXqaXtaXqaXqaXqaXuaXqaXqaXvaXwaXxaXyaXzaXAaXyaXBaXyaXyaXyaXyaXCaXDaXEaXqaXqaXFaXGaXHaXIaXJaXKaXLaXMaXRaXPaXPaXPaXPaXPaXPaXPaXQaXWaXXaXSaXTaXUaXVaXYaZHaXZaUDaUDaYaaYbaYcaYbaYcaYdaYeaYfaYgaYhaYiaMeaYkaYjaYmaYlaYnaYnaYoaYpaYqaYraUTaYsaYtaYuaYuaYvaUTaYwaYxaYyaYzaYAaYAaYBaYCaYDbbHaYHcIgbjrcYtcSNaVbaVhaKsaRDaYIaYJaYJaYKaYLaYJaYMaRIaYNaYOaRIaYPaYQaTFaYRaRIaYSaYTaYUaRSaQbaQbaQdaYVaQeaYWaYXaQeaQeaQeaQeaQeabLadbbikbikbikbikbqUbqTbqVbmKbmKbrUbthbmKbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaYYaKzaKzaKzaKzaKzaKzaYYaInaMlaCuaYZaZaaInaZbaZcaZdaZdaZeaDEaZfaXnaZgaZhaXpaZiaZjaZkaZlaZlaZmaZnaZnaZnaZoaZpaZpaZqaZraZsaZlaZlaZtaZpaZvaZwaZxaZxaZyaZzaZAaZuaZuaZuaZBaXGaXHaXIaXJaXJaXJaXJaZCaXJaXJaXJaXJaXJaXJaZDaZEaZNaZFaZGaZJaZIaZLaZKaZMaZNaZNaZNaZOaZPaZPaZPaZQaYiaYiaYiaZRaZSaYiaMebbsaZUaYnaYnaZVaYnaZWaZXaYqaZYaUTaZZbaababbacbadaUTbaebafbagbahbaibajaVbbakbalcZqaVbaVbaVbaVeaVbaVbaVhayHaRDbamaTvaTvaTvbanaTvbaoaRIaRIaRIaRIaRIaRIaRIbapaRIaRSaRSaRRaRSbaqbaraQbbasbatbaubavbawbaxbaybazbaAbikbikbikbikaaabtibtjbtibtibtibtkbtibtlbtibtjbtiaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaLyaCuaInaGdaKzbaBbaCbaDbaEaKzaGdaInaInaCubaFaVEaInbaGbaHaZdaZdaZeaDEbaIaXnaJraZhaXpaXqbaJbaKbaLbaLbaMbaNbaObaLbaPbaLbaQbaLbaRbaSbaLbaLbaWbaLbaLbaUbaVbaLbaWbaXbaYbaZaXqaXqbbabbbbbcbbdbbebbfbbebbgbbhbbgbbgbbgbbgbbgbbgbbibbjbbkbbkbbkbbkbblbbkbbmbbnbbkbbkbbobbpbbqbbqbbqbbqbbqbbqbbqbbraYiaYiaMebcTbbtbbubbvbbvbbwbbxaZXaYqbbyaUTaUTaUTaUTaUTbbzaUTbbAbbBbbCbbDaWCbbEaVbbbFbbGcZrbbIbbJbbKbbLbbMaVbaVhaHYaRDbbNbbOaTvbbPbbQaTvbbRbbRaRDbbSbbTbbUaQbbbVbbWbbXaRSaRSbbYbbZaQbbcaaQbbcbbatbccbcdbcebatbatbcfbaAbikbikbikbikbqUbtmbwlbutbwmbtmbmKbutbwmbtmbwlbutbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaDEaInaYYaKzaKBaJraJraKCaKzaYYaKzbcgbchbcibcjaInbckbckaXkbckaXlaDEbclaXnaJraDEbcmbcmbcnbcobcobcobcobcobcobcpbcqbcobcobcobcobcobcobcrbcsbctbctbcubctbcvbcwbcxbcvbcvbcybczbcAbcmbcBbcBbcCbcCbcCbcDbcDbcDbcDbcDbcDbcDbcDbcEbcFbcFbcGbcFbcHbcHbcHbcHbcIbcJbcHbcEbcKbcKbcKbcKbcKbcKbcKbcKbcLbcLbcLaMebcMbcNbcObcObcObcObcPbcQbcRbmwbcUaZTbcVbcWbcXbcYaUTaUTbcZbdabdbbdabdaaVbbdcbdddcnbdebdebdebdfbdgaVbbdhbdiaRDbdjaTvbbPbbPbbQbbPaTvbdkaRDbdlbdmbdnaQbaRSbdobdpbdqbdqbdrbdsbdtbdubdvbdwbdxbdybdzbavbatbatbdAbaAbikbikbikbikbqUbwnbmKbutbBQbtmbmKbutbBQbtmbmKbFmbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbdCbdDaJrbdEbdFbdGbdHbdIbdJbdHbdKbdLbdHbdHbdMbdNbdObdPbdQbdQbdQbdRbdQbdSbdTaDEbdUbdVbdWbcobdXbdYbdZbeabebbecbedbeebefbegbehbeibcobejbekbctbelbembenbcvbeobepbeqbcvberbesbetberberberbeuaXJaXObcDbikbikbikbikbikbikbikbcEbevbewbexbeybezbeAbeBbeCbeDbeEbeFbcEbikbikbikbikbikbikbikbcKbeGaYibeHaMebeIbcNbmwbmwbmwbmwbmwbeJbeKbmwbmwbmwbnMbeMbeMbeNbeObePbeQbeRbeSbeTbeUaVbbeVbeWdlHbeYbeYbeXbeZbfaaVbaVhayHaRDbfbbfcaTvbbPbbQaTvbfdbfdaRDaRDbfeaRDaQbbffbbWbbZbfgbfgbfhbbZaQbaQbaQbbfibatbfjbfjbfkbfjbatbflbaAaabbikbikaabbdBbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbdCbfnbfobfnbfnbfnbfnbfnbfnbfobfnbfnbfpaJrbfqbfrbfsaJrbftaJrbfubfvbfwbfxbfyaDEbdVbdVbfzbcobfAbecbecbecbecbecbedbfBbecbecbecbfCbcobejbfDbctbfEbfFbfGbcvbfHbfIbfJbcvbfKbfLbfMbfNbfObesbeuaXJaXObcDbikbikbikbikbcEbcEbcEbcEbfPbfQbfRbfSbfTbfUbfVbfWbfXbfYbfZbcEbcEbcEbcEbikbikbikbikbcKbeGaYibgabgbbgcbgdbgebgfbgcbggbghbgibgjbgkbglbmwbeLbgmbeMbgnbgobeMbgpbgqbgrbgsbeMbgtbgubgvdlHbeYbeYbeXbgwbgxaVbaVhaKsaRDbdjaTvbbPbbPbbQbbPaTvaTvbgybgzaTvbgAaQbbgBbgCbgDbfgbfgbgEbgDbgFaQbbgGbgHbatbgIbgIbgJbgIbatbdAbaAbgKbaAbaAbaAbqUbtmbmKbutbGVbtmbmKbutbGVbtmbmKbutbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaCuaCuaInaInaInaInaInaInaInaInaInaCuaDEbgLbgMbgNbgNbgNbgNbgNbgNbgObgNbgNbgNaDEbdVbejbgPbcobgQbecbecbgRbgSbgTbgUbgRbecbecbecbgVbcobejbekbctbgWbgXbgYbcvbgZbhabhbbcvbhcbhdbhebhfbhgbesbhhbhiaXObcDbcDbhjbcEbcEbcEbhkbhlbhmbhnbhobhobhpbhqbhobhrbhobhsbhtbhubhvbhwbhxbcEbcEbcEbhjbcKbcKbeGaYiaYiaMebhybhzbgkbhAbmwbhBbhCbmwbhDbhEbglbmwbnMbeMbeMbhFbcSbhHbhIbhJbhKbhLbeMbhMbgubhNdlHbeYbeYbhObhPbhQaVbaVhayHaRDbhRbhSbhTbbPbbQbhUaTvaTvbhVaTvbhWbhXaQbbhYbhZbiabfgbfgbibbiabicaQbbidbgHbatbatbatbavbatbatbKnbIzbPfbNjbiibPfddJbmKbmKbmKbmKbmKbmKbmKbmKbmKbmKbutbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikblsbltbltblubltbltbltblvbltbltbmPaabaInaLAaJtbilbgNbimbinbiobipbiqbirbisbitbgNbiubivbiwbixbcobiybecbecbgRbgTbizbiAbgRbecbecbiBbiCbcobejbekbctbctbiDbctbcvbiEbiFbiGbcvbiHbhfbiIbhfbiJbesbeubiKaXOaXPaXPbiLbiMbiNbcEbiObfRbiPbhobhobiQbiRbiSakybiSbiUbiVbiWbiXbiYbiZbjabcEbjbbiMbjcbjdbjebeGaYiaYibjfbmwbjgbmwbmwbmwbjhbjibmwbhDbjjbglbmwbeLbeMbeMbjkbjlbjmbjnbjobjpbhLbjqaVbdlJdlIdlKbeYbeYbeXbhPbjsaVbbjtbjuaRDbjvaRDaRDbjwbbQbjxbjyaTvbjzbjAaWSbjBbdvbjCbjDbjEbjFbjFbjGbjHbjIbdvbjJbjKbatbjLbatbavbatbatddAbaAbaAbaAbaAbgKbqUddBbmKbutbwmbtmbmKbutbwmbtmbmKddCbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikblsbohbptbojbpwbpwbqWbpwbpwbpwbqWblubjNaInaKzaKBbfqbgNbimbjObjPbimbjQbjRbjSbjTbgNbjUaFmbjWbcsbcobjXbjYbjZbkabkbbkcbkdbkebkebkebkfbkgbcobejbivbkhbkibkjbkkbcvbcvbcvbcvbcvbklbkmbknbkobkpbesbeubiKaXJaXJaXJbkqbkrbksbktbkubkvbhobkwbkxbkybkzbkAbkBbkCbkDbkEbkFbkGbkubkHbkIbkJbkKbkMbkLbkObkObkPaYibkQaMebmwbkRbkSbglbmwbkTbkUbmwbkVbkWbglbmwbnMbeMbeMbeMbeNbeMbkXbeMbjpbhLbkYaVbbkZbhNbeXbeYbeYbeXbhPblaaVbblbblcbldbleblfblgblhblibljbljbljbljbljbljblkbllblmbfgbfgbfgbfgbfgbfgblnbloblpbgHbatbatbatbavbatbatddDbgKblrblrblrbaAbwmbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbwmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbqYbqXbqXbqXbqXbqXbqXbqXbqXbqXbqXbqZbraaGdbraaJrbfqbgNblwbimblxblxblxblybimblzbgNblAblBbjWblCblCblCblCblDblCblEbecblFblGblHblHblIblJbcoblKblLblMblNblOblPblQblRblSblRblTblTblTblTblTblUberbeublVblWblXblYblZbmabmbbmcbmdbkBbmebmfbmgbmgbmgbmgbmhbmgbmibmjbmkbmlbmebmmbmnbcEbmobmpbmqbkNbmsbmtaYiaYibjfbmwbnCbmwbmwbmwaRebmwbmwbmvbmvbmwbmwbmxbeMbeMbmybmzbeMbeMbeMbmAbmBbmCaVbbgxbhNbeXbeXbeXbeXbhPbmDaVbbmEbmFbmFbmGbmFbmHbbPbbPbbPbbPbmIbbPbbPbbPbmJblobfgbfgbfgbfgbfgbfgbfgblnbloblpbgHbatbfjbfjbfkbfjbatddEbaAbmLbmMbmNbaAbBQbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbBQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbrcbrbbrebrdbrfbrfbrgbrfbrfbrfbrgbluaInaInaKzbrVbcjbmQbimbmRblxblxblxblybmRbimbgNbmSbmTbjWblCbmUbmVbmWbmXblCbmYbmZbnabcobnbbncbndbnebcobejbnfbngbngbnhbngbngbngbngbnibnjbnjbnjbnkbnjbnlbnmbnnbnobnpbnqbnqbnqbnqbnqbnqbnrbnsbnrbmgbmgbntbnubnvbnwbnxbnybntbnzbmgbnAbnBbnAbnAbnAbnAbnAbnAbnAbmtaYiaYiaMebnEbnDcakbnGbmwbnFbmwbnIbnHbnJbmwbpjaUTbnKbnLaUTaUTczObnNddybnNaUTaUTaVbbnObnPbnQbnQbnQbnQbnPbnRaVbbnSbmFbmFbmGbnTaRDbnUbnVbnWbnXbnYbnZboabobbocaQbbodaRSboebfgbfgboeaRSbofaQbbogbgHbatbgIbgIbgJbgIbatddDbgKblrblrblrbaAbGVbtmbmKbutbGVbtmbmKbutbGVbtmbmKbutbGVbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm index a65cd372149..6fb22a1e750 100644 --- a/_maps/map_files/cyberiad/z5.dmm +++ b/_maps/map_files/cyberiad/z5.dmm @@ -726,9 +726,12 @@ "nX" = (/obj/structure/transit_tube{tag = "icon-N-S"; icon_state = "N-S"},/turf/simulated/wall,/area/mine/explored) "nY" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/research_outpost/tempstorage) "nZ" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/research_outpost/gearstore) +"oa" = (/turf/simulated/wall/r_wall,/area/mine/podbay) "ob" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/research_outpost/gearstore) +"oc" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/mine/podbay) "od" = (/obj/machinery/conveyor{dir = 2; id = "anominerals"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/research_outpost/tempstorage) "oe" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/explored) +"of" = (/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/mine/explored) "og" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible{dir = 6; level = 1},/turf/simulated/floor/plating,/area/research_outpost/iso1) "oh" = (/obj/structure/plasticflaps/mining,/obj/machinery/conveyor{dir = 1; id = "iso1"},/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/research_outpost/iso1) "oi" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible{dir = 10},/turf/simulated/floor/plating,/area/research_outpost/iso1) @@ -750,6 +753,12 @@ "oy" = (/obj/machinery/door/window/westleft,/obj/structure/sign/securearea{desc = "A warning sign which reads 'VACUUM'"; icon_state = "space"; layer = 4; name = "VACUUM"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/explored) "oz" = (/obj/structure/transit_tube{tag = "icon-N-S"; icon_state = "N-S"},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel/airless,/area/mine/explored) "oA" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/turf/space,/area/mine/explored) +"oB" = (/obj/structure/grille,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/mine/explored) +"oC" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/engine,/area/mine/podbay) +"oD" = (/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "minepodbay"; name = "Pod Door Control"; pixel_x = 0; pixel_y = 24; req_access_txt = "0"; req_one_access_txt = "48;70"},/turf/simulated/floor/engine,/area/mine/podbay) +"oE" = (/obj/machinery/camera{c_tag = "Mining Outpost Starboard Connector"; network = list("Mining Outpost")},/turf/simulated/floor/engine,/area/mine/podbay) +"oF" = (/obj/structure/spacepoddoor,/turf/simulated/floor/engine,/area/mine/podbay) +"oG" = (/obj/machinery/firealarm{pixel_y = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/engine,/area/mine/podbay) "oH" = (/obj/machinery/disposal/deliveryChute{dir = 1},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/research_outpost/tempstorage) "oI" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/plating,/area/research_outpost/maint) "oJ" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/plating,/area/research_outpost/maint) @@ -776,6 +785,8 @@ "pe" = (/obj/structure/transit_tube/station{dir = 8; icon_state = "closed"; tag = "icon-closed (EAST)"},/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel/airless,/area/mine/explored) "pf" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/turf/space,/area/space) "pg" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/gearstore) +"ph" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/engine/vacuum,/area/mine/podbay) +"pi" = (/turf/simulated/floor/engine,/area/mine/podbay) "pj" = (/obj/structure/transit_tube{tag = "icon-D-SE"; icon_state = "D-SE"},/turf/simulated/wall/r_wall,/area/research_outpost/maintstore2) "pk" = (/obj/structure/transit_tube{tag = "icon-W-NE"; icon_state = "W-NE"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "pl" = (/obj/item/weapon/rack_parts,/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/abandoned) @@ -791,6 +802,9 @@ "pv" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/research_outpost/gearstore) "pw" = (/turf/simulated/floor/mech_bay_recharge_floor/airless,/area/research_outpost/gearstore) "px" = (/obj/machinery/computer/mech_bay_power_console,/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/research_outpost/gearstore) +"py" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/turf/simulated/floor/engine,/area/mine/podbay) +"pz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/engine,/area/mine/podbay) +"pA" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/engine,/area/mine/podbay) "pB" = (/obj/machinery/door/window/westleft,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/explored) "pC" = (/obj/structure/transit_tube/station{dir = 8; icon_state = "closed"; tag = "icon-opening (EAST)"},/obj/structure/transit_tube_pod,/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor/plasteel/airless,/area/mine/explored) "pD" = (/turf/simulated/wall/r_wall,/area/mine/explored) @@ -808,12 +822,18 @@ "pP" = (/obj/machinery/door/window/westleft{dir = 2},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/explored) "pQ" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/research_outpost/gearstore) "pR" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/research_outpost/gearstore) +"pS" = (/obj/machinery/power/apc{dir = 8; name = "Mining Station Podbay APC"; pixel_x = -27; pixel_y = 2},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/engine,/area/mine/podbay) +"pT" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/engine,/area/mine/podbay) +"pU" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/engine,/area/mine/podbay) +"pV" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/three_tile_ver{id_tag = "minepodbay"; req_one_access_txt = "48;70"},/turf/simulated/floor/engine,/area/mine/podbay) "pW" = (/obj/structure/transit_tube{tag = "icon-D-SW"; icon_state = "D-SW"},/turf/simulated/wall/r_wall,/area/mine/explored) "pX" = (/obj/effect/glowshroom,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "pY" = (/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"},/area/mine/abandoned) "pZ" = (/obj/item/clothing/suit/space/syndicate/black/red,/obj/item/clothing/head/helmet/space/syndicate/black/red,/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"},/area/mine/abandoned) "qa" = (/obj/machinery/door/airlock/external{name = "Mining Bridge"; req_access_txt = "65"},/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/research_outpost/gearstore) "qb" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel/airless,/area/mine/explored) +"qc" = (/obj/effect/decal/warning_stripes/north,/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel,/area/mine/podbay) +"qd" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/mine/podbay) "qe" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'VACUUM'"; icon_state = "space"; layer = 4; name = "VACUUM"; pixel_x = 0; pixel_y = -32},/obj/machinery/door/window/westleft,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"; tag = ""},/area/mine/explored) "qf" = (/obj/structure/transit_tube{tag = "icon-D-NE"; icon_state = "D-NE"},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel/airless,/area/mine/explored) "qg" = (/obj/structure/transit_tube{tag = "icon-E-NW"; icon_state = "E-NW"},/turf/simulated/wall/r_wall,/area/mine/explored) @@ -826,7 +846,9 @@ "qn" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/mine/explored) "qo" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/turf/space,/area/mine/explored) "qp" = (/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning (SOUTHWEST)"; icon_state = "asteroidwarning"; dir = 10},/area/mine/explored) +"qq" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 22; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/mine/podbay) "qr" = (/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning (SOUTHEAST)"; icon_state = "asteroidwarning"; dir = 6},/area/mine/explored) +"qs" = (/obj/effect/decal/warning_stripes/north,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/mine/podbay) "qt" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning (NORTH)"; icon_state = "asteroidwarning"; dir = 1},/area/mine/explored) "qu" = (/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning (NORTHEAST)"; icon_state = "asteroidwarning"; dir = 5},/area/mine/explored) "qv" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'VACUUM'"; icon_state = "space"; layer = 4; name = "VACUUM"; pixel_x = -32; pixel_y = -32},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) @@ -1109,7 +1131,7 @@ "vM" = (/obj/structure/ore_box,/turf/simulated/floor/plasteel,/area/mine/living_quarters) "vN" = (/obj/machinery/recharge_station,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters) "vO" = (/obj/structure/closet/secure_closet/miner,/turf/simulated/floor/plasteel,/area/mine/living_quarters) -"vP" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/mine/eva) +"vP" = (/turf/simulated/wall/r_wall,/area/mine/eva) "vQ" = (/turf/simulated/wall,/area/mine/eva) "vR" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/mine/eva) "vS" = (/obj/structure/table,/obj/item/weapon/shovel,/turf/simulated/floor/plasteel,/area/mine/west_outpost) @@ -1169,7 +1191,7 @@ "wU" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/mining{name = "Mining Station Storage"; req_access_txt = "48"},/turf/simulated/floor/plasteel,/area/mine/living_quarters) "wV" = (/obj/machinery/alarm{pixel_y = 24},/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/camera{c_tag = "Mining Outpost Starboard Connector"; network = list("Mining Outpost")},/turf/simulated/floor/plasteel,/area/mine/lobby) "wW" = (/turf/simulated/floor/plasteel,/area/mine/lobby) -"wX" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/plasteel,/area/mine/lobby) +"wX" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/mine/eva) "wY" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plating,/area/mine/eva) "wZ" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/obj/item/device/gps/mining{gpstag = "MINE2"},/obj/item/device/gps/mining{gpstag = "MINE1"},/obj/item/device/gps/mining,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -3},/turf/simulated/floor/plasteel,/area/mine/eva) "xa" = (/turf/simulated/floor/plasteel,/area/mine/eva) @@ -1194,7 +1216,7 @@ "xt" = (/obj/structure/sink{pixel_y = 30},/obj/machinery/light/small,/obj/structure/mirror{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/mine/living_quarters) "xu" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock{name = "Toilet"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/mine/living_quarters) "xv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/mine/living_quarters) -"xw" = (/obj/machinery/power/apc{dir = 1; name = "Mining Station Port Wing APC"; pixel_x = 1; pixel_y = 25},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel,/area/mine/living_quarters) +"xw" = (/obj/machinery/computer/podtracker,/turf/simulated/floor/plasteel,/area/mine/podbay) "xx" = (/obj/machinery/camera{c_tag = "Mining Outpost Crew Area Hallway"; network = list("Mining Outpost")},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plasteel,/area/mine/living_quarters) "xy" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/mine/living_quarters) "xz" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/mine/living_quarters) @@ -1203,7 +1225,7 @@ "xC" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area/mine/living_quarters) "xD" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area/mine/lobby) "xE" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/mine/lobby) -"xF" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/mine/lobby) +"xF" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/mine/podbay) "xG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/lobby) "xH" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_mining{name = "Mining Station EVA"; req_access_txt = "54"},/turf/simulated/floor/plasteel,/area/mine/eva) "xI" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/mine/eva) @@ -1282,7 +1304,7 @@ "zd" = (/obj/structure/table/reinforced,/obj/machinery/cell_charger,/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor/plasteel,/area/mine/production{name = "Mining Station Mech Bay"}) "ze" = (/obj/structure/table/reinforced,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel,/area/mine/production{name = "Mining Station Mech Bay"}) "zf" = (/obj/structure/table/reinforced,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/obj/item/weapon/crowbar,/obj/machinery/power/apc{dir = 1; name = "Mining Station Mech Bay APC"; pixel_x = 1; pixel_y = 25},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plasteel,/area/mine/production{name = "Mining Station Mech Bay"}) -"zg" = (/obj/machinery/mech_bay_recharge_port,/turf/simulated/floor/plating,/area/mine/production) +"zg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/mine/podbay) "zh" = (/turf/simulated/floor/mech_bay_recharge_floor,/area/mine/production{name = "Mining Station Mech Bay"}) "zi" = (/obj/machinery/computer/mech_bay_power_console,/turf/simulated/floor/plasteel,/area/mine/production{name = "Mining Station Mech Bay"}) "zj" = (/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 5},/area/mine/explored) @@ -1319,7 +1341,7 @@ "zO" = (/obj/machinery/camera{c_tag = "Mining Outpost Port Exterior Airlock"; dir = 4; network = list("Mining Outpost")},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/mine/living_quarters) "zP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/mine/living_quarters) "zQ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/mine/living_quarters) -"zR" = (/obj/machinery/door/airlock/external{id_tag = "mining_away"; name = "Mining Dock Airlock"; req_access_txt = "48"},/turf/simulated/floor/plasteel,/area/mine/production) +"zR" = (/turf/simulated/wall/r_wall,/area/mine/lobby) "zS" = (/obj/machinery/power/apc{dir = 8; name = "Mining Station Starboard Wing APC"; pixel_x = -27; pixel_y = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel,/area/mine/lobby) "zT" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/mine/lobby) "zU" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/mine/lobby) @@ -1353,6 +1375,9 @@ "Aw" = (/obj/machinery/power/apc{dir = 1; name = "Mining Station External APC"; pixel_x = 1; pixel_y = 25},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning"; icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) "Ax" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning"; icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) "Ay" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning"; icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) +"Az" = (/obj/machinery/door/firedoor{dir = 2},/obj/machinery/door/airlock/glass_mining{name = "Mining Station Pod Bay"; req_access_txt = "54"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/lobby) +"AA" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/mine/lobby) +"AB" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/mine/lobby) "AC" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/mine/lobby) "AD" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/camera{c_tag = "Mining Shuttle Airlock"; dir = 8; network = list("Mining Outpost")},/turf/simulated/floor/plasteel,/area/mine/lobby) "AE" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) @@ -1363,6 +1388,7 @@ "AJ" = (/obj/machinery/alarm{pixel_y = 25},/obj/structure/closet/crate/bin{name = "Garbage bin"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) "AK" = (/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) "AL" = (/obj/machinery/door/firedoor,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/mine/living_quarters{name = "Mining Station Break Room"}) +"AM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/mine/lobby) "AN" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/mine/lobby) "AO" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/mine/lobby) "AP" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Mining Break Room"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/lobby) @@ -1372,6 +1398,7 @@ "AT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) "AU" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) "AV" = (/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) +"AW" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel,/area/mine/living_quarters) "AX" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/mine/lobby) "AY" = (/obj/machinery/door/firedoor,/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/mine/lobby) "AZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) @@ -1417,6 +1444,9 @@ "BN" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/mine/production) "BO" = (/obj/machinery/telepad_cargo,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/mine/production) "BP" = (/obj/docking_port/stationary{dir = 2; dwidth = 2; height = 18; id = "skipjack_z5"; name = "south of asteroid"; width = 19},/turf/space,/area/space) +"BQ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/mine/lobby) +"BR" = (/obj/machinery/mech_bay_recharge_port,/turf/simulated/floor/plating,/area/mine/production{name = "Mining Station Mech Bay"}) +"BS" = (/obj/machinery/door/airlock/external{id_tag = "mining_away"; name = "Mining Dock Airlock"; req_access_txt = "48"},/turf/simulated/floor/plasteel,/area/mine/lobby) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1586,40 +1616,40 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbjacacacacaaaaaaaaaaaaaaaaacacaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaaaeaepOpOukukukukukukukuluhujaaaaaaaaaaaaacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjumumumumumumumbjacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafoVoVoVafafaeaeaeaeqCnWnlafafafoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbjacacaaaaaaaaaaaaaaaaaaaaaeaeaeaeufunununununununuoupujaaaaaaaaaaaaacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjumuqurusutuuumbjacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaafafafoVoVoVoVafafafaeaeaeqCaeafafafafoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbjacacacacaaaaaaaaaaaaaaaaafaeaeaepOpOqoqoqoqoqoqouvuhuwuaaaaaaaaaaaafacacbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjumuxuyuzuAuBumbjbjacacacaaaaaaaaaaaaaaaaaaaaaaaaaaafafafoVoVoVoVafafafaeaeaeqCaeafafafafoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaacacacaaaaaaaaaaaaafafafaeaeaeaeaaaaaaaaaaaauguhujaaaaaaaeaeaeafacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjoeuCuDbjuEumumumuFumumumbjbjacacacaaaaaaaaaaaaaaaaaaaaaaaaafafafafoVoVoVoVafafafaeaeaeqCaeafafafafoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaaaaaaaaaaaaaaaaaaaaacacafafaeaeaeaaaaaaaaaaaaaauguhujaaaeaeaeaeaeafafacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjuGuDuHbjuEuIuJuEuKuEafafacacacacacaaaaaaaaaaaaaaaaaaaaaaafafafafoVoVoVoVoVafafafafaeaeqCaeaeafafafafafoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafafaeaeaaaaaaaaaaaaaauLuhujaeaeaeaeaeaeaeafacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjoenlacuEuMuNuOuPuEaeafafacacacacaaaaaaaaaaaaaaaaaaaaafafafafoVoVoVoVoVoVafafafafaeaeqCaeaeaeaeafafafafafoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaapOufpOaeaeaeaeaeaeaeafafacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjuQbjacuEuEuEuEuRuEaeaeafafnlafafaaaaaaaaaaaaaaaaaaaaaaafafafoVoVoVafafafafafafafafaeqCaeaeaeaeaeaeafafafafafoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaaaaaaacacbjacacaaaaaaaaaaaaaaaaaaaeaepOoepOaeaeaeaeaeaeaeaeafacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjuSbjbjuEuIuTuEuUuVaeaeaeaeuWaeafafaaaaaaaaaaaaaaaaaaaaafafafafafafafnlnlnlnlnlnlafaeqCaeaeaeaeaeaeaeafafafafafoVoVoVoVoVoVoVoVoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaaaaaaaaaaaaaaaaaaaaacacbjbjacaaaaaaaaaaaaaaaaaaaeaeaeaeoeoeoeoeuXuXuXaeaeaeafacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjuSbjbjuEuMuNuYuKuVaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaafafafafafafnluZvavbvbvcaeaeqCaeaeaeaeaeaeaeaeaeafafafafoVoVoVoVoVoVoVoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaccsacacacacaaaaaaaaaaaaaaacacacbjbjacaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaevdvevfaeaeaeafacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjacacacafafafafafafafacacacacacacacacbjbjbjbjbjbjbjbjbjbjuEvguEuEuEuEuEuEuKuVaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaafafafafafnlvhvivivivjaerTqtquaeaeaeaeaeaeaeaeaeafafafafafoVoVoVoVoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaaaaaaaaaaaaaaacacacbjbjacaaaaaaaaaeaevkvkvkvkvkvkvlvlvlvkvmvkvkvkaeaeaeafacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacafafaeaeaeaeaeafafafafafacacacacacacacbjbjbjbjuEuEuEuEvnvovpuEuIvquEvruEuEuEuVuVuVuEaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaafafafafnlvsvtvtvtvuaeqpqyqraeaeaeaeaeaeaeaeaeafafafafafoVoVoVoVoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaaaaaaaaaaaaaaacacacacacaaaaafaeaeaevkvvvwvxvyvzvAvBvCvDvEvFvGvyquaeaeafafafafacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacafafaeaeaeaeaeaeaeaeaeaeafafafafafacacacacbjbjbjuEvHvIvJvKvIvIuEuMuNvLuKuEvMvNvOvOvOuVaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaafafafaeaeaeaeaeaeaeaevPvQvRvRvQvQaeaeaeaeaeaeafafafafoVoVoVoVoVoVoVoVoVoVafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaacacacaaaaacafaeaeaevkvSvTvUvyvTvVvTvTvWvXvYvGvZwaaeaeaeaeaeafafafacacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjacacafafnlaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafacacacacacacuEwbvIwcwdwewfuEuEuEuEuKuEvMwgwgwgwhuVaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaevPwiwjwjwkvQaewlaeaeaenWnlafafafoVoVoVoVoVoVoVoVoVoVafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaaaaaaacafaeaeaevkwmvTvTwnvTvVwovTvTvywpwqvyqraeaeaeaeaeaeaeafafafafacacacacacacbjbjbjbjbjbjbjbjbjacacafafaeuWaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafafafacacacuEwrwswtvIwuwvwwwhwxwywzuEwAwgwBwCwDuVaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaewEwEwFwFvPwGwHwIwJvQvQvQvQaeaeaeaeafafafafoVoVoVoVoVoVoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacafafaeaevkwKvTwLvEwMwNwOvTvkvkvkvkvkvmrTquaeaeaeaeaeaeaeaeafafafacacacacacbjbjbjbjbjbjbjacacacafaeaeaeaeaeaeaeaeaeaeaerTquaeaeaeaeaeaeaeaeaeafafacacwPuEuEuEwQuEuEwRwSwTwRwSuEuEuEuEuEwUuEuEuVuVaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaewFwFwVwWwXwYwZxaxaxbxcxdxexcquaeaeaenmafafafoVoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaevkxfxgxhvyxixjxkxlxmxnxoxpxqxrtTtUrsrsrsrsrsqLaeaeaeaeafafafacacacacacbjbjbjacacacacafafaeaetRrsrsrsrsrsrsrsrstTtUrsrsrsrsqLaeaeaeaeaeafacacacacacwQxsxtxuwgwDxvwhwDwwxwxxxywhwDwgxzxAuVuVuVxBxCxCxCxCxCxCxCxDxDxDxDxDxDxDwFwFwFxEwWxFxGxHxIxaxaxJxKxLxMxNxOaeaeaenmafafafoVoVoVoVoVoVafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaacacacaaaaaaaaaaaaafafafaeaeaeaeaaaaaaaaaaaauguhujaaaaaaaeaeaeafacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjoeuCuDbjuEumumumuFumumumbjbjacacacaaaaaaaaaaaaaaaaaaaaaaaaafafafafoVoVnlnlnlnlnlnlaeaeqCaeafafafafoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaaaaaaaaaaaaaaaaaaaaacacafafaeaeaeaaaaaaaaaaaaaauguhujaaaeaeaeaeaeafafacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjuGuDuHbjuEuIuJuEuKuEafafacacacacacaaaaaaaaaaaaaaaaaaaaaaafafafafoVoVoVnluZvavbvbvcaeaeqCaeaeafafafafafoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafafaeaeaaaaaaaaaaaaaauLuhujaeaeaeaeaeaeaeafacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjoenlacuEuMuNuOuPuEaeafafacacacacaaaaaaaaaaaaaaaaaaaaafafafafoVoVoVoVnlvhvivivivjaeaeqCaeaeaeaeaeafafafafoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaapOufpOaeaeaeaeaeaeaeafafacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjuQbjacuEuEuEuEuRuEaeaeafafnlafafaaaaaaaaaaaaaaaaaaaaaaafafafoVoVoVafnlvsvtvtvtvuaeaeqCaeaeaeaeaeaeafafafafafoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaaaaaaacacbjacacaaaaaaaaaaaaaaaaaaaeaepOoepOaeaeaeaeaeaeaeaeafacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjuSbjbjuEuIuTuEuUuVaeaeaeaeuWaeafafaaaaaaaaaaaaaaaaaaaaafafafafafafafaeaeaeaeoaoaoaoaocoaoBofaeaeaeaeafafafafafoVoVoVoVoVoVoVoVoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaaaaaaaaaaaaaaaaaaaaacacbjbjacaaaaaaaaaaaaaaaaaaaeaeaeaeoeoeoeoeuXuXuXaeaeaeafacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjuSbjbjuEuMuNuYuKuVaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaafafafafafafaeaeaeaeoaoCoEoDoGoFphaeaeaeaeaeaeaeafafafafoVoVoVoVoVoVoVoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaccsacacacacaaaaaaaaaaaaaaacacacbjbjacaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaevdvevfaeaeaeafacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjacacacafafafafafafafacacacacacacacacbjbjbjbjbjbjbjbjbjbjuEvguEuEuEuEuEuEuKuVaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaafafafafafaeaeaeaeoapipzpypAoFphaeaeaeaeaeaeaeaeafafafafafoVoVoVoVoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaaaaaaaaaaaaaaacacacbjbjacaaaaaaaaaeaevkvkvkvkvkvkvlvlvlvkvmvkvkvkaeaeaeafacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacafafaeaeaeaeaeafafafafafacacacacacacacbjbjbjbjuEuEuEuEvnvovpuEuIvquEvruEuEuEuVuVuVuEaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaafafafafaeaeaeaeoapSpUpTpApVphaeaeaeaeaeaeaeaeafafafafafoVoVoVoVoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaaaaaaaaaaaaaaacacacacacaaaaafaeaeaevkvvvwvxvyvzvAvBvCvDvEvFvGvyquaeaeafafafafacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacafafaeaeaeaeaeaeaeaeaeaeafafafafafacacacacbjbjbjuEvHvIvJvKvIvIuEuMuNvLuKuEvMvNvOvOvOuVaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaafafafaeaeaeaeqdqcqsqqwXvPvRvRvQvQaeaeaeaeaeaeafafafafoVoVoVoVoVoVoVoVoVoVafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaacacacaaaaacafaeaeaevkvSvTvUvyvTvVvTvTvWvXvYvGvZwaaeaeaeaeaeafafafacacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjacacafafnlaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafacacacacacacuEwbvIwcwdwewfuEuEuEuEuKuEvMwgwgwgwhuVaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeqdxwzgxFwXwiwjwjwkvQaewlaeaeaenWnlafafafoVoVoVoVoVoVoVoVoVoVafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaaaaaaacafaeaeaevkwmvTvTwnvTvVwovTvTvywpwqvyqraeaeaeaeaeaeaeafafafafacacacacacacbjbjbjbjbjbjbjbjbjacacafafaeuWaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafafafacacacuEwrwswtvIwuwvwwwhwxwywzuEwAwgwBwCwDuVaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaezRzRAAAzwXwGwHwIwJvQvQvQvQaeaeaeaeafafafafoVoVoVoVoVoVoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacafafaeaevkwKvTwLvEwMwNwOvTvkvkvkvkvkvmrTquaeaeaeaeaeaeaeaeafafafacacacacacbjbjbjbjbjbjbjacacacafaeaeaeaeaeaeaeaeaeaeaerTquaeaeaeaeaeaeaeaeaeafafacacwPuEuEuEwQuEuEwRwSwTwRwSuEuEuEuEuEwUuEuEuVuVaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaewFwFwVAMABwYwZxaxaxbxcxdxexcquaeaeaenmafafafoVoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaevkxfxgxhvyxixjxkxlxmxnxoxpxqxrtTtUrsrsrsrsrsqLaeaeaeaeafafafacacacacacbjbjbjacacacacafafaeaetRrsrsrsrsrsrsrsrstTtUrsrsrsrsqLaeaeaeaeaeafacacacacacwQxsxtxuwgwDxvwhwDwwAWxxxywhwDwgxzxAuVuVuVxBxCxCxCxCxCxCxCxDxDxDxDxDxDxDwFwFwFxEwWBQxGxHxIxaxaxJxKxLxMxNxOaeaeaenmafafafoVoVoVoVoVoVafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaevkvkvkvkvkxPxQxRvkvkxSvkvkvkvkqpqraeaeaeaeaeqCaeaeaeaeafaeafafacacacacacacacacacacafafaeaeaeqCaeaeaeaeaeaeaeaeqpqraeaeaeaeqCaeaeaeaeaeafafnlafafacuEuEuEuEwgwDxTxUxVwyxWxXxXxYxYxZxXyaybxXybycycycycycycycycydydydydydydydyeyfyeygyfyhyiyjykylymynxcyoypxcqraeaeaeaeafafafafoVoVoVoVoVafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaeaevkyqyrysytvkyuyvoeaeaeaeaeaeqEaeaeaeqKrsrsqLaeaeaeaeafacacacacacacacacacacafaeaetRrstSaeaeaeaeafaeaeqEaeaeaeaeaeaeqCaeaeaeaeaeaeaeuWaeafafafafafuEwgywyxyyyyyxyzyAyByyyyyCyxyDyEyEyEyFyFyFyFyFyFyFyFyGyGyGyGyGyGyHyIyIyIyJyKyLyMyNyOyPyOyOyOyOyOyOyQaeaeaeaenmafafafoVoVoVoVafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaevkyRySyTyUvkaeaeaeaeaeaeafafnlafaeaeaeaeaeqCaeaeaeaeaeafacacacacacafafafafafaetRtSaeaeaeafafafafafafnlaeaeaeaeaeaeqCaeaeaeaeaeaeaeaeaeaeaeafafuEuEwRyVwRuEuEyWyXyYuEuEuEyZwRuEuVaeaeaeaaaaaaaaagaaaaaaagaaaaaaaaaaagaawFwFwWzazbzczdzezfzgzhziyOvbzjaeaeaeaeaeafafafoVoVoVoVafafafoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaevkyRySyTyUvkaeaeaeaeaeaeafafnlafaeaeaeaeaeqCaeaeaeaeaeafacacacacacafafafafafaetRtSaeaeaeafafafafafafnlaeaeaeaeaeaeqCaeaeaeaeaeaeaeaeaeaeaeafafuEuEwRyVwRuEuEyWyXyYuEuEuEyZwRuEuVaeaeaeaaaaaaaaagaaaaaaagaaaaaaaaaaagaawFwFwWzazbzczdzezfBRzhziyOvbzjaeaeaeaeaeafafafoVoVoVoVafafafoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafaeaeaevkvkvkvkvkvkaeaeafafafafafacacafafaeaeaeaeqCaeaeaeaeaeaeafafafafafafaeaeaeaeaeqCaeaeafafafacacacacacafaeaeaeaeaeaeqCaeaeaerTquaeaeaeaeaeaeaeafuEzkzlzmznuEzozpzqzrzsuEztzuzvuEaeaeaeaeaeaeaaaaagaaaaaaagagagagagagagagagwEzwzxzyzzzAzAzBzCzCzDzEzFvjaeaeaeaeaeafafafoVoVoVafafoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeaeaeafacacacacacacacafafaeaeaeqKrsrsrsqLaeaeaeaeaeaeaeaeaeaeaeaeaeqCaeafafacacacacacacacafafaeaeaeaeaeqKrsrsrstTtUrsrsrsqLaeaeaeaeuEzGzHzIzJuEzKzLzLzMzNuEzOzPzQuEaeaeaeaeaeaeagagagagagagagaaaaaaaaaaagaaaawEzSzTzUzVzWzXzYzCzCzDzEzFvjaeaeaeaeafafafafoVoVafafafoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeaeaeafacacacacacacacafafaeaeaeqKrsrsrsqLaeaeaeaeaeaeaeaeaeaeaeaeaeqCaeafafacacacacacacacafafaeaeaeaeaeqKrsrsrstTtUrsrsrsqLaeaeaeaeuEzGzHzIzJuEzKzLzLzMzNuEzOzPzQuEaeaeaeaeaeaeagagagagagagagaaaaaaaaaaagaaaawEzSzTzUzVzWzXzWzCzCzDzEzFvjaeaeaeaeafafafafoVoVafafafoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeafafafacacacacacacacacafafafaeaeaeaeaeqKqLaeaerTquaeaetRrsrsrsrsrstSaeafacacacacbjbjbjacacafafafaeaeaeaeaeaeaeqpqraeaeaeqCaeaeaeaewPuEuEuEuEuEzZAaAbAczNuEuEAdwRwPaeaeaeaeaeaeaaaaagaaaaaaagaaaaaaaaaaagaawFwFAeAfAgyOAhAiAjAkzhziyOvtvuaeaeaeaeafafafoVoVoVafafafafoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafafafaeaeaeaeafafafacacacacacacacacacacacacafafafaeqEaeaeqKrsrstTtUrsrstSaeaeaeaeaeaeaeafacacacbjbjbjbjbjacacacafafafafaeaeaeaeaeaeaeaeaeqKrsrsqLaeaeaeaeaeaewPuEuEuEuEuEwPzFAlAmAnaeaeaeaeaeaaaaaaagaaaaaaagaaaaaaaaaaAowFApAqArAsAtwEAuAvAuAuAuAuAuAutNaeaeaeafafafafoVoVafafafafoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacafafafafafafacacacacacacacacacacacacacacacacafafnlafaeaeaeaeqpqraeaeaeaeqEaeafafafafafacacbjbjbjbjbjbjbjacacacacacafafafafafafafafaeaeaeaeaeqCaeaeaeaeaeaeaeaeqpAwAxAxAxAxAyqraeaeaeaeaeaeagagagagagagagagaaaaaaaahMhgwWzRwWwWAsADwEAEAFAGAHAIAJAKALaeaeaeaeafafafafoVoVafafafoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacafafafafafafacacacacacacacacacacacacacacacacafafnlafaeaeaeaeqpqraeaeaeaeqEaeafafafafafacacbjbjbjbjbjbjbjacacacacacafafafafafafafafaeaeaeaeaeqCaeaeaeaeaeaeaeaeqpAwAxAxAxAxAyqraeaeaeaeaeaeagagagagagagagagaaaaaaaahMhgwWBSwWwWAsADwEAEAFAGAHAIAJAKALaeaeaeaeafafafafoVoVafafafoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacbjbjbjbjbjbjacacacacacacafafaeaeaeaeaeaeaeaeaenlafafacacacacacbjbjbjbjbjbjbjbjacacacacacacacacacacacacafafaeaeaeaeqCaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaagaaaaaaaaaawFwFwFACwWANAOAPAQARASATAUAVAVALaeaeaerCnlafafafoVafafafafoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacbjbjbjbjbjbjbjbjbjbjbjacacacacacacafafafaeaeaeafafafafafacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacafaeaeaeaeqKrsrsrsrsrsrsrsrsrsrsrsrsrsrsrsrsrsqLaeaeaeaeaeaeaaaaaaaaaaagaaaaaaaaaaagaawFwFwWAsAXAYAZBaAVAVBbBbBcAuaeaeaeaeafafafafafafafafoVoVoVafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacbjacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacafafafafafacacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacafafafaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeqCaerTquaeaeaenlnlaaaaaaagaaaaaaaaaaagaaaawEBdAszUBeAVAVAVBfBgBgBhALaeaeaeaeafafafafafoVafafoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacafafafaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeqKrstTtUrsrsrsBiBjBkBkBkBkBkBkBkBkBkBkBkBkBlBmBnBowEBpBqBrAVBsBsAVALaeaeafafafafafoVoVoVafoVoVoVafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacafafafaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeqKrstTtUrsrsrsBiBjBkBkBkBkBkBkBkBkBkBkBkBkBlBmBnBowEBpBqBrAVBsBsAVALaeaeaeafafafafoVoVoVafoVoVoVafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacafafafaeaeaeaeaeaeaeafafaeaeaeaeaeaeaeaeaeqpqraeaeaenlnlagaaaaaaaaaaaaaaaaaaaaaaBtBtBuBvBtAuAuAuALALALALAuaeaeafafafafoVoVoVoVoVoVoVafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacafafafafafafafafafafnltNaeaeaeaeaeaeaeaeaeaeaeaeaeaeagaaaaaaaaaaaaaaaaaaaaaaBtBwBxByBzBABBBtaeaeaeaeaeaeaeafafafafoVoVoVoVoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacacafaeaeaeaeaeaeaeaeaeaeaeaeaeqEaeaeaaaaaaaaaaaaaaaaaaaaaaBtBCBDBEBFzYBGBtaeaeaeaeaeaeafafafafoVoVoVoVoVoVoVafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacacafaeaeaeaeaeaeaeaeaeaeaeaeaeqEaeaeaaaaaaaaaaaaaaaaaaaaaaBtBCBDBEBFzYBGBtaeaeaeaeaeaeaeafafafoVoVoVoVoVoVoVafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacafaeaeaeaeaeaeaeaeaeaeaeaeafnlafafaaaaaaaaaaaaaaaaaaaaaaBtBHBIBJBKzYBLBtaeaeaeaenWnlafafafoVoVoVoVoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacafafaeaeaeaeaeaeaeaeaeafacacafafafaaaaaaaaaaaaaaaaaaaaaaBtBMBNBNBNBNBOBtaeaeaeaeaeafafafoVoVoVoVoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacafafafafafafafafafafafacacacafafafaaaaaaaaaaaaaaaaaaaaBtBtBtBtBtBtBtBtaeaeaeaeafafafoVoVoVoVoVoVoVafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaeaeaeaeaeueaeaeaeafafafafafafoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacbjbjbjbjbjacacaaaaaaaaaaaaaaaaaaaaaeaeaeafnlafafafafafafafafoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaaaaaaaaaeaeafafafafafafafafafafoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeafafafafoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacbjbjbjbjbjacacaaaaaaaaaaaaaaaaaaaaaeaeaeaeueaeaeaeaeafafafafoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaaaaaaaaaeaeafafnlafafafafafafafoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaaaaaaaaaaaeaeafafafafafafoVoVoVoVoVoVoVafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaaaaaaaaaaaaaeaeafafafafoVoVoVoVoVoVoVafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaaaaaaaaaaaaaaaeaeafafafoVoVoVoVoVafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm index 5442c621e1b..11500e125e4 100644 --- a/code/__DEFINES/mob.dm +++ b/code/__DEFINES/mob.dm @@ -1,17 +1,3 @@ -// Vampire power defines -#define VAMP_REJUV 1 -#define VAMP_GLARE 2 -#define VAMP_HYPNO 3 -#define VAMP_SHAPE 4 -#define VAMP_VISION 5 -#define VAMP_DISEASE 6 -#define VAMP_CLOAK 7 -#define VAMP_BATS 8 -#define VAMP_SCREAM 9 -#define VAMP_JAUNT 10 -#define VAMP_SLAVE 11 -#define VAMP_BLINK 12 -#define VAMP_FULL 13 ///////////////////ORGAN DEFINES/////////////////// // Organ defines. diff --git a/code/controllers/Processes/shuttles/supply.dm b/code/controllers/Processes/shuttles/supply.dm index 0954436247d..ce990a7226b 100644 --- a/code/controllers/Processes/shuttles/supply.dm +++ b/code/controllers/Processes/shuttles/supply.dm @@ -177,6 +177,10 @@ if(cost) shuttle_master.techLevels[tech.id] = tech.level shuttle_master.points += cost + for(var/mob/M in player_list) + if(M.mind) + for(var/datum/job_objective/further_research/objective in M.mind.job_objectives) + objective.unit_completed(cost) msg += "+[cost]: [tech.name] - new data.
" // Sell max reliablity designs diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 56d8fac2d57..cfe913bd94e 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -886,9 +886,10 @@ if(src in ticker.mode.vampires) ticker.mode.vampires -= src special_role = null - current.remove_vampire_powers() + if(vampire) + vampire.remove_vampire_powers() + qdel(vampire) ticker.mode.update_vampire_icons_removed(src) - if(vampire) qdel(vampire) current << "You grow weak and lose your powers! You are no longer a vampire and are stuck in your current form!" log_admin("[key_name(usr)] has de-vampired [key_name(current)]") message_admins("[key_name_admin(usr)] has de-vampired [key_name_admin(current)]") diff --git a/code/datums/spell.dm b/code/datums/spell.dm index f129f085bdc..31da89fd424 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -88,10 +88,9 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin user << "Not when you're incapacitated." return 0 - if(ishuman(user)) - if(user.is_muzzled()) - user << "Mmmf mrrfff!" - return 0 + if(ishuman(user) && (invocation_type == "whisper" || invocation_type == "shout") && user.is_muzzled()) + user << "Mmmf mrrfff!" + return 0 var/obj/effect/proc_holder/spell/noclothes/spell = locate() in (user.spell_list | (user.mind ? user.mind.spell_list : list())) if(clothes_req && !(spell && istype(spell)))//clothes check if(!istype(user, /mob/living/carbon/human)) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 2e25e2fd816..2b8ff255420 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -924,6 +924,56 @@ var/list/uplink_items = list() cost = 2 gamemodes = list(/datum/game_mode/nuclear) +// Cybernetics +/datum/uplink_item/cyber_implants + category = "Cybernetic Implants" + surplus = 0 + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/cyber_implants/spawn_item(turf/loc, obj/item/device/uplink/U) + if(item) + if(findtext(item, /obj/item/organ/internal/cyberimp)) + return new /obj/item/weapon/storage/box/cyber_implants(loc, item) + else + return ..() + +/datum/uplink_item/cyber_implants/thermals + name = "Thermal Vision Implant" + desc = "These cybernetic eyes will give you thermal vision. Comes with an automated implanting tool." + reference = "CIT" + item = /obj/item/organ/internal/cyberimp/eyes/thermals + cost = 8 + +/datum/uplink_item/cyber_implants/xray + name = "X-Ray Vision Implant" + desc = "These cybernetic eyes will give you X-ray vision. Comes with an automated implanting tool." + reference = "CIX" + item = /obj/item/organ/internal/cyberimp/eyes/xray + cost = 10 + +/datum/uplink_item/cyber_implants/antistun + name = "CNS Rebooter Implant" + desc = "This implant will help you get back up on your feet faster after being stunned. \ + Comes with an automated implanting tool." + reference = "CIAS" + item = /obj/item/organ/internal/cyberimp/brain/anti_stun + cost = 12 + +/datum/uplink_item/cyber_implants/reviver + name = "Reviver Implant" + desc = "This implant will attempt to revive you if you lose consciousness. Comes with an automated implanting tool." + reference = "CIR" + item = /obj/item/organ/internal/cyberimp/chest/reviver + cost = 8 + +/datum/uplink_item/cyber_implants/bundle + name = "Cybernetic Implants Bundle" + desc = "A random selection of cybernetic implants. Guaranteed 5 high quality implants. \ + Comes with an automated implanting tool." + reference = "CIB" + item = /obj/item/weapon/storage/box/cyber_implants/bundle + cost = 40 + // POINTLESS BADASSERY /datum/uplink_item/badass diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 45fb9284638..e5687ba2050 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -114,17 +114,18 @@ msg="We see that you completed [newunits] new unit[newunits>1?"s":""] for Task #[count]! " pay=objective.completion_payment * newunits objective.units_compensated += newunits + objective.is_completed() // So we don't get many messages regarding completion else if(!objective.completed) if(objective.is_completed()) pay=objective.completion_payment msg="Task #[count] completed! " if(pay>0) if(M.mind.initial_account) - M.mind.initial_account.money += objective.completion_payment + M.mind.initial_account.money += pay var/datum/transaction/T = new() T.target_name = "[command_name()] Payroll" T.purpose = "Payment" - T.amount = objective.completion_payment + T.amount = pay T.date = current_date_string T.time = worldtime2text() T.source_terminal = "\[CLASSIFIED\] Terminal #[rand(111,333)]" diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 7d304204613..264a280e3e0 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -37,7 +37,6 @@ var/vampire_amount = 4 - /datum/game_mode/vampire/announce() world << "The current game mode is - Vampires!" world << "There are Vampires from Space Transylvania on the station, keep your blood close and neck safe!" @@ -171,7 +170,8 @@ return /datum/game_mode/proc/grant_vampire_powers(mob/living/carbon/vampire_mob) - if(!istype(vampire_mob)) return + if(!istype(vampire_mob)) + return vampire_mob.make_vampire() /datum/game_mode/proc/greet_vampire(var/datum/mind/vampire, var/you_are=1) @@ -200,188 +200,131 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha var/mob/living/owner = null var/gender = FEMALE var/iscloaking = 0 // handles the vampire cloak toggle - var/list/powers = list() // list of available powers and passives, see defines in setup.dm + var/list/powers = list() // list of available powers and passives var/mob/living/carbon/human/draining // who the vampire is draining of blood var/nullified = 0 //Nullrod makes them useless for a short while. - var/upgradedRegen = 0 + var/list/upgrade_tiers = list( + /obj/effect/proc_holder/spell/vampire/self/rejuvenate = 0, + /obj/effect/proc_holder/spell/vampire/targetted/hypnotise = 0, + /obj/effect/proc_holder/spell/vampire/mob_aoe/glare = 0, + /datum/vampire_passive/vision = 100, + /obj/effect/proc_holder/spell/vampire/self/shapeshift = 100, + /obj/effect/proc_holder/spell/vampire/self/cloak = 150, + /obj/effect/proc_holder/spell/vampire/targetted/disease = 150, + /obj/effect/proc_holder/spell/vampire/bats = 200, + /obj/effect/proc_holder/spell/vampire/self/screech = 200, + /datum/vampire_passive/regen = 200, + /obj/effect/proc_holder/spell/vampire/shadowstep = 250, + /obj/effect/proc_holder/spell/vampire/self/jaunt = 300, + /obj/effect/proc_holder/spell/vampire/targetted/enthrall = 300, + /datum/vampire_passive/full = 500) + /datum/vampire/New(gend = FEMALE) gender = gend +/datum/vampire/proc/force_add_ability(path) + var/spell = new path(owner) + if(istype(spell, /obj/effect/proc_holder/spell)) + owner.mind.AddSpell(spell) + powers += spell + +/datum/vampire/proc/get_ability(path) + for(var/P in powers) + var/datum/power = P + if(power.type == path) + return power + return null + +/datum/vampire/proc/add_ability(path) + if(!get_ability(path)) + force_add_ability(path) + +/datum/vampire/proc/remove_ability(path) + var/A = get_ability(path) + if(A) + powers -= A + owner.mind.spell_list.Remove(A) + qdel(A) + /mob/proc/make_vampire() - if(!mind) return + if(!mind) + return + var/datum/vampire/vamp if(!mind.vampire) - mind.vampire = new /datum/vampire(gender) - mind.vampire.owner = src - verbs += /client/vampire/proc/vampire_rejuvinate - verbs += /client/vampire/proc/vampire_hypnotise - verbs += /client/vampire/proc/vampire_glare - //testing purposes REMOVE BEFORE PUSH TO MASTER - /*for(var/handler in typesof(/client/proc)) - if(findtext("[handler]","vampire_")) - verbs += handler*/ - for(var/i = 1; i <= 3; i++) // CHANGE TO 3 RATHER THAN 12 AFTER TESTING IS DONE - if(!(i in mind.vampire.powers)) - mind.vampire.powers.Add(i) + vamp = new /datum/vampire(gender) + vamp.owner = src + mind.vampire = vamp + else + vamp = mind.vampire + vamp.powers.Cut() + vamp.check_vampire_upgrade(0) - for(var/n in mind.vampire.powers) - switch(n) - if(VAMP_SHAPE) - verbs += /client/vampire/proc/vampire_shapeshift - if(VAMP_VISION) - continue - if(VAMP_DISEASE) - verbs += /client/vampire/proc/vampire_disease - if(VAMP_CLOAK) - verbs += /client/vampire/proc/vampire_cloak - if(VAMP_BATS) - verbs += /client/vampire/proc/vampire_bats - if(VAMP_SCREAM) - verbs += /client/vampire/proc/vampire_screech - if(VAMP_JAUNT) - verbs += /client/vampire/proc/vampire_jaunt - if(VAMP_BLINK) - verbs += /client/vampire/proc/vampire_shadowstep - if(VAMP_SLAVE) - verbs += /client/vampire/proc/vampire_enthrall - if(VAMP_FULL) - continue -/mob/proc/remove_vampire_powers() - for(var/handler in typesof(/client/vampire/proc)) - if(findtext("[handler]","vampire_")) - verbs -= handler +/datum/vampire/proc/remove_vampire_powers() + for(var/P in powers) + remove_ability(P) + owner.alpha = 255 -/mob/proc/handle_bloodsucking(mob/living/carbon/human/H) - src.mind.vampire.draining = H +/datum/vampire/proc/handle_bloodsucking(mob/living/carbon/human/H) + draining = H var/blood = 0 - var/bloodtotal = 0 //used to see if we increased our blood total - var/bloodusable = 0 //used to see if we increased our blood usable - src.attack_log += text("\[[time_stamp()]\] Bit [src.name] ([src.ckey]) in the neck and draining their blood") - H.attack_log += text("\[[time_stamp()]\] Has been bit in the neck by [src.name] ([src.ckey])") - log_attack("[src.name] ([src.ckey]) bit [H.name] ([H.ckey]) in the neck") - src.visible_message("\red [src.name] bites [H.name]'s neck!", "\red You bite [H.name]'s neck and begin to drain their blood.", "\blue You hear a soft puncture and a wet sucking noise") - if(!iscarbon(src)) + var/old_bloodtotal = 0 //used to see if we increased our blood total + var/old_bloodusable = 0 //used to see if we increased our blood usable + owner.attack_log += text("\[[time_stamp()]\] Bit [H] ([H.ckey]) in the neck and draining their blood") + H.attack_log += text("\[[time_stamp()]\] Has been bit in the neck by [owner] ([owner.ckey])") + log_attack("[owner] ([owner.ckey]) bit [H] ([H.ckey]) in the neck") + owner.visible_message("[owner] bites [H]'s neck!", "You bite [H]'s neck and begin to drain their blood.", "You hear a soft puncture and a wet sucking noise.") + if(!iscarbon(owner)) H.LAssailant = null else - H.LAssailant = src - while(do_mob(src, H, 50)) - if(!mind.vampire || !(mind in ticker.mode.vampires)) - src << "\red Your fangs have disappeared!" - return 0 - bloodtotal = src.mind.vampire.bloodtotal - bloodusable = src.mind.vampire.bloodusable + H.LAssailant = owner + while(do_mob(owner, H, 50)) + if(!(owner.mind in ticker.mode.vampires)) + owner << "Your fangs have disappeared!" + return + old_bloodtotal = bloodtotal + old_bloodusable = bloodusable if(!H.vessel.get_reagent_amount("blood")) - src << "\red They've got no blood left to give." + src << "They've got no blood left to give." break - if(H.stat < 2) //alive + if(H.stat < DEAD) blood = min(20, H.vessel.get_reagent_amount("blood")) // if they have less than 20 blood, give them the remnant else they get 20 blood - src.mind.vampire.bloodtotal += blood/2 //divide by 2 to counted the double suction since removing cloneloss -Melandor0 - src.mind.vampire.bloodusable += blood/2 - //H.adjust CloneLoss(10) No cloneloss -Melandor0 + bloodtotal += blood / 2 //divide by 2 to counted the double suction since removing cloneloss -Melandor0 + bloodusable += blood / 2 else blood = min(5, H.vessel.get_reagent_amount("blood")) // The dead only give 5 bloods - src.mind.vampire.bloodtotal += blood - if(bloodtotal != src.mind.vampire.bloodtotal) - src << "\blue You have accumulated [src.mind.vampire.bloodtotal] [src.mind.vampire.bloodtotal > 1 ? "units" : "unit"] of blood[src.mind.vampire.bloodusable != bloodusable ?", and have [src.mind.vampire.bloodusable] left to use" : "."]" - check_vampire_upgrade(mind) - H.vessel.remove_reagent("blood",25) - if(ishuman(src)) - var/mob/living/carbon/human/V = src - V.nutrition = min(450,V.nutrition+(blood/2)) + bloodtotal += blood + if(old_bloodtotal != bloodtotal) + owner << "You have accumulated [bloodtotal] [bloodtotal > 1 ? "units" : "unit"] of blood[bloodusable != old_bloodusable ? ", and have [bloodusable] left to use" : ""]." + check_vampire_upgrade() + H.vessel.remove_reagent("blood", 25) + if(ishuman(owner)) + var/mob/living/carbon/human/V = owner + V.nutrition = min(450, V.nutrition + (blood / 2)) - src.mind.vampire.draining = null - src << "\blue You stop draining [H.name] of blood." - return 1 + draining = null + owner << "You stop draining [H.name] of blood." -/mob/proc/check_vampire_upgrade(datum/mind/v) - if(!v) return - if(!v.vampire) return - var/datum/vampire/vamp = v.vampire - var/list/old_powers = vamp.powers.Copy() +/datum/vampire/proc/check_vampire_upgrade(announce = 1) + var/list/old_powers = powers.Copy() - // This used to be a switch statement. - // Don't use switch statements for shit like this, since blood can be any random-ass value. - // if(100) requires the blood to be at EXACTLY 100 units to trigger. - // if(blud >= 100) activates when blood is at or over 100 units. - // TODO: Make this modular. + for(var/ptype in upgrade_tiers) + var/level = upgrade_tiers[ptype] + if(bloodtotal >= level) + add_ability(ptype) - // TIER 1 - if(vamp.bloodtotal >= 100) - if(!(VAMP_VISION in vamp.powers)) - vamp.powers.Add(VAMP_VISION) - if(!(VAMP_SHAPE in vamp.powers)) - vamp.powers.Add(VAMP_SHAPE) + if(announce) + announce_new_power(old_powers) - // TIER 2 - if(vamp.bloodtotal >= 150) - if(!(VAMP_CLOAK in vamp.powers)) - vamp.powers.Add(VAMP_CLOAK) - if(!(VAMP_DISEASE in vamp.powers)) - vamp.powers.Add(VAMP_DISEASE) - - // TIER 3 - if(vamp.bloodtotal >= 200) - if(!(VAMP_BATS in vamp.powers)) - vamp.powers.Add(VAMP_BATS) - if(!(VAMP_SCREAM in vamp.powers)) - vamp.powers.Add(VAMP_SCREAM) - if(!(vamp.upgradedRegen)) // to prevent spamming - src << "Your rejuvination abilities have improved and will now heal you over time when used." - vamp.upgradedRegen = 1 - - // TIER 3.5 (/vg/) - if(vamp.bloodtotal >= 250) - if(!(VAMP_BLINK in vamp.powers)) - vamp.powers.Add(VAMP_BLINK) - - // TIER 4 - if(vamp.bloodtotal >= 300) - if(!(VAMP_JAUNT in vamp.powers)) - vamp.powers.Add(VAMP_JAUNT) - if(!(VAMP_SLAVE in vamp.powers)) - vamp.powers.Add(VAMP_SLAVE) - - // TIER 5 - if(vamp.bloodtotal >= 500) - if(!(VAMP_FULL in vamp.powers)) - vamp.powers.Add(VAMP_FULL) - - announce_new_power(old_powers, vamp.powers) - -/mob/proc/announce_new_power(list/old_powers, list/new_powers) - for(var/n in new_powers) - if(!(n in old_powers)) - switch(n) - if(VAMP_SHAPE) - src << "\blue You have gained the shapeshifting ability, at the cost of stored blood you can change your form permanently." - verbs += /client/vampire/proc/vampire_shapeshift - if(VAMP_VISION) - src << "\blue Your vampiric vision has improved." - //no verb - if(VAMP_DISEASE) - src << "\blue You have gained the Diseased Touch ability which causes those you touch to die shortly after unless treated medically." - verbs += /client/vampire/proc/vampire_disease - if(VAMP_CLOAK) - src << "\blue You have gained the Cloak of Darkness ability which when toggled makes you near invisible in the shroud of darkness." - verbs += /client/vampire/proc/vampire_cloak - if(VAMP_BATS) - src << "\blue You have gained the Summon Bats ability." - verbs += /client/vampire/proc/vampire_bats // work in progress - if(VAMP_SCREAM) - src << "\blue You have gained the Chriopteran Screech ability which stuns anything with ears in a large radius and shatters glass in the process." - verbs += /client/vampire/proc/vampire_screech - if(VAMP_JAUNT) - src << "\blue You have gained the Mist Form ability which allows you to take on the form of mist for a short period and pass over any obstacle in your path." - verbs += /client/vampire/proc/vampire_jaunt - if(VAMP_SLAVE) - src << "\blue You have gained the Enthrall ability which at a heavy blood cost allows you to enslave a human that is not loyal to any other for a random period of time." - verbs += /client/vampire/proc/vampire_enthrall - if(VAMP_BLINK) - src << "\blue You have gained the ability to shadowstep, which makes you disappear into nearby shadows at the cost of blood." - verbs += /client/vampire/proc/vampire_shadowstep - if(VAMP_FULL) - src << "\blue You have reached your full potential and are no longer weak to the effects of anything holy and your vision has been improved greatly." - //no verb +/datum/vampire/proc/announce_new_power(list/old_powers) + for(var/p in powers) + if(!(p in old_powers)) + if(istype(p, /obj/effect/proc_holder/spell/vampire)) + var/obj/effect/proc_holder/spell/vampire/power = p + owner << "[power.gain_desc]" + else if(istype(p, /datum/vampire_passive)) + var/datum/vampire_passive/power = p + owner << "[power.gain_desc]" //prepare for copypaste /datum/game_mode/proc/update_vampire_icons_added(datum/mind/vampire_mind) @@ -411,55 +354,79 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha //world << "Removed [vampire_mind.current.name] from vampire shit" vampire_mind.current << "\red The fog clouding your mind clears. You remember nothing from the moment you were enthralled until now." -/mob/living/carbon/human/proc/check_sun() - - var/ax = x - var/ay = y +/datum/vampire/proc/check_sun() + var/ax = owner.x + var/ay = owner.y for(var/i = 1 to 20) ax += sun.dx ay += sun.dy - var/turf/T = locate( round(ax,0.5),round(ay,0.5),z) + var/turf/T = locate(round(ax, 0.5), round(ay, 0.5), owner.z) - if(T.x == 1 || T.x==world.maxx || T.y==1 || T.y==world.maxy) + if(T.x == 1 || T.x == world.maxx || T.y == 1 || T.y == world.maxy) break if(T.density) return vamp_burn() -/mob/living/carbon/human/proc/handle_vampire() - if(hud_used) - if(!hud_used.vampire_blood_display) - hud_used.vampire_hud() - hud_used.vampire_blood_display.maptext = "
[mind.vampire.bloodusable]
" +/datum/vampire/proc/handle_vampire() + if(owner.hud_used) + var/datum/hud/hud = owner.hud_used + if(!hud.vampire_blood_display) + hud.vampire_hud() + hud.vampire_blood_display.maptext = "
[bloodusable]
" handle_vampire_cloak() - if(istype(loc, /turf/space)) + if(istype(owner.loc, /turf/space)) check_sun() - if(istype(loc.loc, /area/chapel) && !(VAMP_FULL in src.mind.vampire.powers)) + if(istype(owner.loc.loc, /area/chapel) && !get_ability(/datum/vampire_passive/full)) vamp_burn() - mind.vampire.nullified = max(0, mind.vampire.nullified - 1) + nullified = max(0, nullified - 1) -mob/living/carbon/human/proc/vamp_burn() - if(prob(35)) - switch(health) - if(80 to 100) - src << "\red Your skin flakes away..." - if(60 to 80) - src << "Your skin sizzles!" - if((-INFINITY) to 60) - if(!on_fire) - src << "\red Your skin catches fire!" - else - src << "\red You continue to burn!" - fire_stacks += 5 - IgniteMob() - emote("scream") +/datum/vampire/proc/handle_vampire_cloak() + if(!ishuman(owner)) + owner.alpha = 255 + return + var/turf/simulated/T = get_turf(owner) + var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T + var/light_available + if(L) + light_available = L.get_clamped_lum(0.5) * 10 else - switch(health) + light_available = 10 + + if(!istype(T)) + return 0 + + if(!iscloaking) + owner.alpha = 255 + return 0 + if(light_available <= 2) + owner.alpha = round((255 * 0.15)) + return 1 + else + owner.alpha = round((255 * 0.80)) + +/datum/vampire/proc/vamp_burn() + if(prob(35)) + switch(owner.health) + if(80 to 100) + owner << "Your skin flakes away..." + if(60 to 80) + owner << "Your skin sizzles!" if((-INFINITY) to 60) - fire_stacks++ - IgniteMob() - adjustFireLoss(3) - return + if(!owner.on_fire) + owner << "Your skin catches fire!" + else + owner << "You continue to burn!" + owner.fire_stacks += 5 + owner.IgniteMob() + owner.emote("scream") + else + switch(owner.health) + if((-INFINITY) to 60) + owner.fire_stacks++ + owner.IgniteMob() + owner.adjustFireLoss(3) + return \ No newline at end of file diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 5794b144d51..d8dc1211b7b 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -1,296 +1,307 @@ //This should hold all the vampire related powers +/obj/effect/proc_holder/spell/vampire + panel = "Vampire" + school = "vampire" + clothes_req = 0 + range = 1 + charge_max = 1800 + action_background_icon_state = "bg_vampire" + var/required_blood = 0 + var/gain_desc = null -/mob/proc/vampire_power(required_blood=0, max_stat=0) +/obj/effect/proc_holder/spell/vampire/New() + ..() + if(!gain_desc) + gain_desc = "You have gained \the [src] ability." - if(!src.mind) return 0 - if(!ishuman(src)) - src << "You are in too weak of a form to do this!" +/obj/effect/proc_holder/spell/vampire/cast_check(skipcharge = 0, mob/living/user = usr) + if(!user.mind) + return 0 + if(!ishuman(user)) + user << "You are in too weak of a form to do this!" return 0 - var/datum/vampire/vampire = src.mind.vampire + var/datum/vampire/vampire = user.mind.vampire if(!vampire) - log_to_dd("[src] has vampire verbs but isn't a vampire.") return 0 - var/fullpower = (VAMP_FULL in vampire.powers) + var/fullpower = vampire.get_ability(/datum/vampire_passive/full) - if(src.stat > max_stat) - src << "You are incapacitated." + if(user.stat >= DEAD) + user << "Not when you're dead!" return 0 - if(vampire.nullified) - if(!fullpower) - src << "Something is blocking your powers!" - return 0 + if(vampire.nullified && !fullpower) + user << "Something is blocking your powers!" + return 0 if(vampire.bloodusable < required_blood) - src << "You require at least [required_blood] units of usable blood to do that!" + user << "You require at least [required_blood] units of usable blood to do that!" return 0 //chapel check - if(istype(loc.loc, /area/chapel)) - if(!fullpower) - src << "Your powers are useless on this holy ground." - return 0 - return 1 + if(istype(loc.loc, /area/chapel) && !fullpower) + user << "Your powers are useless on this holy ground." + return 0 + return ..() -/mob/proc/vampire_affected(datum/mind/M) +/obj/effect/proc_holder/spell/vampire/can_cast(mob/user = usr) + if(!user.mind) + return 0 + if(!ishuman(user)) + return 0 + + var/datum/vampire/vampire = user.mind.vampire + + if(!vampire) + return 0 + + var/fullpower = vampire.get_ability(/datum/vampire_passive/full) + + if(user.stat >= DEAD) + return 0 + + if(vampire.nullified && !fullpower) + return 0 + if(vampire.bloodusable < required_blood) + return 0 + if(istype(loc.loc, /area/chapel) && !fullpower) + return 0 + return ..() + +/obj/effect/proc_holder/spell/vampire/proc/affects(mob/target, mob/user = usr) //Other vampires aren't affected - if(mind && mind.vampire) return 0 + if(target.mind && target.mind.vampire) + return 0 //Vampires who have reached their full potential can affect nearly everything - if(M && M.vampire && (VAMP_FULL in M.vampire.powers)) + if(user.mind.vampire.get_ability(/datum/vampire_passive/full)) return 1 //Chaplains are resistant to vampire powers - if(mind && mind.assigned_role == "Chaplain") + if(target.mind && target.mind.assigned_role == "Chaplain") return 0 return 1 -/mob/proc/vampire_can_reach(mob/M as mob, active_range = 1) - if(M.loc == src.loc) return 1 //target and source are in the same thing - if(!isturf(src.loc) || !isturf(M.loc)) return 0 //One is inside, the other is outside something. - if(Adjacent(M))//if(AStar(src.loc, M.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, active_range)) //If a path exists, good! - return 1 - return 0 +/obj/effect/proc_holder/spell/vampire/proc/can_reach(mob/M as mob) + if(M.loc == usr.loc) + return 1 //target and source are in the same thing + return M in oview_or_orange(range, usr, selection_type) -/mob/proc/vampire_active(required_blood=0, max_stat=0, active_range=1) - var/pass = vampire_power(required_blood, max_stat) - if(!pass) return - var/datum/vampire/vampire = mind.vampire - if(!vampire) return - var/list/victims = list() - for(var/mob/living/carbon/C in view(active_range)) - victims += C - var/mob/living/carbon/T = input(src, "Victim?") as null|anything in victims +/obj/effect/proc_holder/spell/vampire/before_cast(list/targets) + // sanity check before we cast + if(!usr.mind || !usr.mind.vampire) + targets.Cut() + return - if(!T) return - if(!(T in view(active_range))) return - if(!vampire_can_reach(T, active_range)) return - if(!vampire_power(required_blood, max_stat)) return - return T + if(!required_blood) + return -/client/vampire/proc/vampire_rejuvinate() - set category = "Abilities" - set name = "Rejuvinate " - set desc= "Flush your system with spare blood to remove any incapacitating effects" - var/datum/mind/M = usr.mind - if(!M) return - if(M.current.vampire_power(0, 1)) - M.current.SetWeakened(0) - M.current.SetStunned(0) - M.current.SetParalysis(0) - M.current.adjustStaminaLoss(-75) - //M.vampire.bloodusable -= 10 - M.current << "\blue You flush your system with clean blood and remove any incapacitating effects." - spawn(1) - if(M.vampire.bloodtotal >= 200) - for(var/i = 0; i < 5; i++) - M.current.adjustBruteLoss(-2) - M.current.adjustOxyLoss(-5) - M.current.adjustToxLoss(-2) - M.current.adjustFireLoss(-2) - sleep(35) - M.current.verbs -= /client/vampire/proc/vampire_rejuvinate - spawn(200) - M.current.verbs += /client/vampire/proc/vampire_rejuvinate + // enforce blood + var/datum/vampire/vampire = usr.mind.vampire -/client/vampire/proc/vampire_hypnotise() - set category = "Abilities" - set name = "Hypnotise (20)" - set desc= "A piercing stare that incapacitates your victim for a good length of time." - var/datum/mind/M = usr.mind - if(!M) return + if(required_blood <= vampire.bloodusable) + vampire.bloodusable -= required_blood + else + // stop!! + targets.Cut() - var/mob/living/carbon/C = M.current.vampire_active(20, 0, 1) + if(targets.len) + usr << "You have [vampire.bloodusable] left to use." - if(!C) return - M.current.visible_message("[M]'s eyes flash briefly as he stares into [C.name]'s eyes") - M.current.remove_vampire_blood(20) - M.current.verbs -= /client/vampire/proc/vampire_hypnotise - spawn(1800) - M.current.verbs += /client/vampire/proc/vampire_hypnotise - if(do_mob(M.current, C, 50)) - if(C.mind && C.mind.vampire) - M.current << "\red Your piercing gaze fails to knock out [C.name]." - C << "\blue [M.current]'s feeble gaze is ineffective." - return +/obj/effect/proc_holder/spell/vampire/targetted/choose_targets(mob/user = usr) + var/list/possible_targets[0] + for(var/mob/living/carbon/C in oview_or_orange(range, user, selection_type)) + possible_targets += C + var/mob/living/carbon/T = input(user, "Choose your victim.", name) as null|mob in possible_targets + + if(!T || !can_reach(T)) + revert_cast(user) + return + + perform(list(T)) + +/obj/effect/proc_holder/spell/vampire/self/choose_targets(mob/user = usr) + perform(list(user)) + +/obj/effect/proc_holder/spell/vampire/mob_aoe/choose_targets(mob/user = usr) + var/list/targets[0] + for(var/mob/living/carbon/C in oview_or_orange(range, user, selection_type)) + targets += C + + if(!targets.len) + revert_cast(user) + return + + perform(targets) + +/datum/vampire_passive + var/gain_desc + +/datum/vampire_passive/New() + ..() + if(!gain_desc) + gain_desc = "You have gained \the [src] ability." + +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +/obj/effect/proc_holder/spell/vampire/self/rejuvenate + name = "Rejuvenate" + desc= "Flush your system with spare blood to remove any incapacitating effects." + action_icon_state = "vampire_rejuvinate" + charge_max = 200 + stat_allowed = 1 + +/obj/effect/proc_holder/spell/vampire/self/rejuvenate/cast() + var/mob/living/U = usr + + usr.SetWeakened(0) + usr.SetStunned(0) + usr.SetParalysis(0) + U.adjustStaminaLoss(-75) + usr << "You flush your system with clean blood and remove any incapacitating effects." + spawn(1) + if(usr.mind.vampire.get_ability(/datum/vampire_passive/regen)) + for(var/i = 1 to 5) + U.adjustBruteLoss(-2) + U.adjustOxyLoss(-5) + U.adjustToxLoss(-2) + U.adjustFireLoss(-2) + sleep(35) + +/obj/effect/proc_holder/spell/vampire/targetted/hypnotise + name = "Hypnotise (20)" + desc= "A piercing stare that incapacitates your victim for a good length of time." + action_icon_state = "vampire_hypnotise" + required_blood = 20 + +/obj/effect/proc_holder/spell/vampire/targetted/hypnotise/cast(list/targets) + for(var/mob/living/target in targets) + usr.visible_message("[usr]'s eyes flash briefly as he stares into [target]'s eyes") + if(do_mob(usr, target, 50)) + if(!affects(target)) + usr << "Your piercing gaze fails to knock out [target]." + target << "\blue [usr]'s feeble gaze is ineffective." + else + usr << "Your piercing gaze knocks out [target]." + target << "You find yourself unable to move and barely able to speak." + target.Weaken(10) + target.Stun(10) + target.stuttering = 10 else - M.current << "\red Your piercing gaze knocks out [C.name]." - C << "\red You find yourself unable to move and barely able to speak" - C.Weaken(10) - C.Stun(10) - C.stuttering = 10 - else - M.current << "\red You broke your gaze." + revert_cast(usr) + usr << "You broke your gaze." + +/obj/effect/proc_holder/spell/vampire/targetted/disease + name = "Diseased Touch (100)" + desc = "Touches your victim with infected blood giving them the Shutdown Syndrome which quickly shutsdown their major organs resulting in a quick painful death." + gain_desc = "You have gained the Diseased Touch ability which causes those you touch to die shortly after unless treated medically." + action_icon_state = "vampire_disease" + required_blood = 100 + +/obj/effect/proc_holder/spell/vampire/targetted/disease/cast(list/targets) + for(var/mob/living/carbon/target in targets) + usr << "You stealthily infect [target] with your diseased touch." + target.help_shake_act(usr) + if(!affects(target)) + usr << "They seem to be unaffected." + continue + var/datum/disease2/disease/shutdown = new /datum/disease2/disease + var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder + var/datum/disease2/effect/organs/vampire/O = new /datum/disease2/effect/organs/vampire + holder.effect += O + holder.chance = 10 + shutdown.infectionchance = 100 + shutdown.antigen |= text2num(pick(ANTIGENS)) + shutdown.antigen |= text2num(pick(ANTIGENS)) + shutdown.spreadtype = "None" + shutdown.uniqueID = rand(0,10000) + shutdown.effects += holder + shutdown.speed = 1 + shutdown.stage = 2 + shutdown.clicks = 185 + infect_virus2(target, shutdown, 0) + +/obj/effect/proc_holder/spell/vampire/mob_aoe/glare + name = "Glare" + desc = "A scary glare that incapacitates people for a short while around you." + action_icon_state = "vampire_glare" + charge_max = 300 + stat_allowed = 1 + +/obj/effect/proc_holder/spell/vampire/mob_aoe/glare/cast(list/targets) + usr.visible_message("[usr]'s eyes emit a blinding flash!") + if(istype(usr:glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) + usr << "You're blindfolded!" return + for(var/mob/living/target in targets) + if(!affects(target)) + continue + target.Stun(5) + target.Weaken(5) + target.stuttering = 20 + target << "You are blinded by [usr]'s glare." -/client/vampire/proc/vampire_disease() - set category = "Abilities" - set name = "Diseased Touch (100)" - set desc = "Touches your victim with infected blood giving them the Shutdown Syndrome which quickly shutsdown their major organs resulting in a quick painful death." - var/datum/mind/M = usr.mind - if(!M) return +/obj/effect/proc_holder/spell/vampire/self/shapeshift + name = "Shapeshift (50)" + desc = "Changes your name and appearance at the cost of 50 blood and has a cooldown of 3 minutes." + gain_desc = "You have gained the shapeshifting ability, at the cost of stored blood you can change your form permanently." + action_icon_state = "genetic_poly" + required_blood = 50 - var/mob/living/carbon/C = M.current.vampire_active(100, 0, 1) - if(!C) return - if(!M.current.vampire_can_reach(C, 1)) - M.current << "\red You cannot touch [C.name] from where you are standing!" - return - M.current << "\red You stealthily infect [C.name] with your diseased touch." - /*var/t_him = "it" - if (src.gender == MALE) - t_him = "him" - else if (src.gender == FEMALE) - t_him = "her" - M.current.visible_message("\blue [M] shakes [src] trying to wake [t_him] up!" ) - playsound(get_turf(src), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)*/ - C.help_shake_act(M.current) // i use da colon - if(!C.vampire_affected(M)) - M.current << "\red They seem to be unaffected." - return - var/datum/disease2/disease/shutdown = new /datum/disease2/disease - var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder - var/datum/disease2/effect/organs/vampire/O = new /datum/disease2/effect/organs/vampire - holder.effect += O - holder.chance = 10 - shutdown.infectionchance = 100 - shutdown.antigen |= text2num(pick(ANTIGENS)) - shutdown.antigen |= text2num(pick(ANTIGENS)) - shutdown.spreadtype = "None" - shutdown.uniqueID = rand(0,10000) - shutdown.effects += holder - shutdown.speed = 1 - shutdown.stage = 2 - shutdown.clicks = 185 - infect_virus2(C,shutdown,0) - M.current.remove_vampire_blood(100) - M.current.verbs -= /client/vampire/proc/vampire_disease - spawn(1800) M.current.verbs += /client/vampire/proc/vampire_disease +/obj/effect/proc_holder/spell/vampire/self/shapeshift/cast() + usr.visible_message("[usr] transforms!") + usr.client.prefs.real_name = usr.generate_name() + usr.client.prefs.random_character() + usr.client.prefs.copy_to(usr) + usr.regenerate_icons() -/client/vampire/proc/vampire_glare() - set category = "Abilities" - set name = "Glare" - set desc= "A scary glare that incapacitates people for a short while around you." - var/datum/mind/M = usr.mind - if(!M) return - if(M.current.vampire_power(0, 1)) - M.current.visible_message("\red [M.current]'s eyes emit a blinding flash!") - //M.vampire.bloodusable -= 10 - M.current.verbs -= /client/vampire/proc/vampire_glare - spawn(300) - M.current.verbs += /client/vampire/proc/vampire_glare - if(istype(M.current:glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) - M.current << "You're blindfolded!" - return - for(var/mob/living/carbon/C in view(1)) - if(!C.vampire_affected(M)) continue - if(!M.current.vampire_can_reach(C, 1)) continue - C.Stun(5) - C.Weaken(5) - C.stuttering = 20 - C << "\red You are blinded by [M.current]'s glare" +/obj/effect/proc_holder/spell/vampire/self/screech + name = "Chiroptean Screech (30)" + desc = "An extremely loud shriek that stuns nearby humans and breaks windows as well." + gain_desc = "You have gained the Chriopteran Screech ability which stuns anything with ears in a large radius and shatters glass in the process." + action_icon_state = "vampire_screech" + required_blood = 30 -/client/vampire/proc/vampire_shapeshift() - set category = "Abilities" - set name = "Shapeshift (50)" - set desc = "Changes your name and appearance at the cost of 50 blood and has a cooldown of 3 minutes." - var/datum/mind/M = usr.mind - if(!M) return - if(M.current.vampire_power(50, 0)) - M.current.visible_message("[M.current.name] transforms!") - M.current.client.prefs.real_name = M.current.generate_name() //random_name(M.current.gender) - M.current.client.prefs.random_character() - M.current.client.prefs.copy_to(M.current) - M.current.regenerate_icons() - M.current.remove_vampire_blood(50) - M.current.verbs -= /client/vampire/proc/vampire_shapeshift - spawn(1800) M.current.verbs += /client/vampire/proc/vampire_shapeshift +/obj/effect/proc_holder/spell/vampire/self/screech/cast() + usr.visible_message("[usr] lets out an ear piercing shriek!", "You let out a loud shriek.", "You hear a loud painful shriek!") + for(var/mob/living/carbon/C in hearers(4)) + if(C == usr) + continue + if(ishuman(C) && (C:l_ear || C:r_ear) && istype((C:l_ear || C:r_ear), /obj/item/clothing/ears/earmuffs)) + continue + if(!affects(C)) + continue + C << "You hear a ear piercing shriek and your senses dull!" + C.Weaken(4) + C.ear_deaf = 20 + C.stuttering = 20 + C.Stun(4) + C.Jitter(150) + for(var/obj/structure/window/W in view(4)) + W.destroy() + playsound(usr.loc, 'sound/effects/creepyshriek.ogg', 100, 1) -/client/vampire/proc/vampire_screech() - set category = "Abilities" - set name = "Chiroptean Screech (30)" - set desc = "An extremely loud shriek that stuns nearby humans and breaks windows as well." - var/datum/mind/M = usr.mind - if(!M) return - if(M.current.vampire_power(30, 0)) - M.current.visible_message("\red [M.current.name] lets out an ear piercing shriek!", "\red You let out a loud shriek.", "\red You hear a loud painful shriek!") - for(var/mob/living/carbon/C in hearers(4, M.current)) - if(C == M.current) continue - if(ishuman(C) && (C:l_ear || C:r_ear) && istype((C:l_ear || C:r_ear), /obj/item/clothing/ears/earmuffs)) continue - if(!C.vampire_affected(M)) continue - C << "You hear a ear piercing shriek and your senses dull!" - C.Weaken(4) - C.ear_deaf = 20 - C.stuttering = 20 - C.Stun(4) - C.Jitter(150) - for(var/obj/structure/window/W in view(4)) - W.destroy() - playsound(M.current.loc, 'sound/effects/creepyshriek.ogg', 100, 1) - M.current.remove_vampire_blood(30) - M.current.verbs -= /client/vampire/proc/vampire_screech - spawn(1800) M.current.verbs += /client/vampire/proc/vampire_screech +/obj/effect/proc_holder/spell/vampire/targetted/enthrall + name = "Enthrall (300)" + desc = "You use a large portion of your power to sway those loyal to none to be loyal to you only." + gain_desc = "You have gained the Enthrall ability which at a heavy blood cost allows you to enslave a human that is not loyal to any other for a random period of time." + action_icon_state = "vampire_enthrall" + required_blood = 300 -/client/vampire/proc/vampire_enthrall() - set category = "Abilities" - set name = "Enthrall (300)" - set desc = "You use a large portion of your power to sway those loyal to none to be loyal to you only." - var/datum/mind/M = usr.mind - if(!M) return - var/mob/living/carbon/C = M.current.vampire_active(300, 0, 1) - if(!C) return - M.current.visible_message("\red [M.current.name] bites [C.name]'s neck!", "\red You bite [C.name]'s neck and begin the flow of power.") - C << "You feel the tendrils of evil invade your mind." - if(!ishuman(C)) - M.current << "\red You can only enthrall humans" - return +/obj/effect/proc_holder/spell/vampire/targetted/enthrall/cast(list/targets) + for(var/mob/living/target in targets) + usr.visible_message("[usr] bites [target]'s neck!", "You bite [target]'s neck and begin the flow of power.") + target << "You feel the tendrils of evil invade your mind." + if(!ishuman(target)) + usr << "You can only enthrall humans." + break + if(do_mob(usr, target, 50)) + if(can_enthrall(usr, target)) + handle_enthrall(usr, target) + else + revert_cast(usr) + usr << "You or your target either moved or you dont have enough usable blood." - if(do_mob(M.current, C, 50)) - if(M.current.can_enthrall(C) && M.current.vampire_power(300, 0)) // recheck - M.current.handle_enthrall(C) - M.current.remove_vampire_blood(300) - M.current.verbs -= /client/vampire/proc/vampire_enthrall - spawn(1800) M.current.verbs += /client/vampire/proc/vampire_enthrall - else - M.current << "\red You or your target either moved or you dont have enough usable blood." - return - - - -/client/vampire/proc/vampire_cloak() - set category = "Abilities" - set name = "Cloak of Darkness (toggle)" - set desc = "Toggles whether you are currently cloaking yourself in darkness." - var/datum/mind/M = usr.mind - if(!M) return - if(M.current.vampire_power(0, 0)) - M.vampire.iscloaking = !M.vampire.iscloaking - M.current << "\blue You will now be [M.vampire.iscloaking ? "hidden" : "seen"] in darkness." - -/mob/proc/handle_vampire_cloak() - if(!mind || !mind.vampire || !ishuman(src)) - alpha = 255 - return - var/turf/simulated/T = get_turf(src) - var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T - var/light_available - if(L) - light_available = L.get_clamped_lum(0.5)*10 - else - light_available = 10 - - if(!istype(T)) - return 0 - - if(!mind.vampire.iscloaking) - alpha = 255 - return 0 - if(light_available <= 2) - alpha = round((255 * 0.15)) - return 1 - else - alpha = round((255 * 0.80)) - -/mob/proc/can_enthrall(mob/living/carbon/C) +/obj/effect/proc_holder/spell/vampire/targetted/enthrall/proc/can_enthrall(mob/living/user, mob/living/carbon/C) var/enthrall_safe = 0 for(var/obj/item/weapon/implant/loyalty/L in C) if(L && L.implanted) @@ -301,197 +312,226 @@ enthrall_safe = 1 break if(!C) - log_to_dd("something bad happened on enthralling a mob src is [src] [src.key] \ref[src]") + log_to_dd("something bad happened on enthralling a mob, attacker is [user] [user.key] \ref[user]") return 0 if(!C.mind) - src << "\red [C.name]'s mind is not there for you to enthrall." + user << "" return 0 if(enthrall_safe || ( C.mind in ticker.mode.vampires )||( C.mind.vampire )||( C.mind in ticker.mode.vampire_enthralled )) - C.visible_message("\red [C] seems to resist the takeover!", "\blue You feel a familiar sensation in your skull that quickly dissipates.") + C.visible_message("[C] seems to resist the takeover!", "You feel a familiar sensation in your skull that quickly dissipates.") return 0 - if(!C.vampire_affected(mind)) - C.visible_message("\red [C] seems to resist the takeover!", "\blue Your faith of [ticker.Bible_deity_name] has kept your mind clear of all evil") + if(!affects(C)) + C.visible_message("[C] seems to resist the takeover!", "Your faith of [ticker.Bible_deity_name] has kept your mind clear of all evil.") if(!ishuman(C)) - src << "\red You can only enthrall humans!" + user << "You can only enthrall humans!" return 0 return 1 -/mob/proc/handle_enthrall(mob/living/carbon/human/H as mob) +/obj/effect/proc_holder/spell/vampire/targetted/enthrall/proc/handle_enthrall(mob/living/user, mob/living/carbon/human/H as mob) if(!istype(H)) - src << "\red SOMETHING WENT WRONG, YELL AT POMF OR NEXIS" return 0 - var/ref = "\ref[src.mind]" + var/ref = "\ref[user.mind]" if(!(ref in ticker.mode.vampire_thralls)) ticker.mode.vampire_thralls[ref] = list(H.mind) else ticker.mode.vampire_thralls[ref] += H.mind ticker.mode.update_vampire_icons_added(H.mind) - ticker.mode.update_vampire_icons_added(src.mind) - var/datum/mindslaves/slaved = src.mind.som + ticker.mode.update_vampire_icons_added(user.mind) + var/datum/mindslaves/slaved = user.mind.som H.mind.som = slaved slaved.serv += H - slaved.add_serv_hud(src.mind,"vampire")//handles master servent icons - slaved.add_serv_hud(H.mind,"vampthrall") + slaved.add_serv_hud(user.mind, "vampire")//handles master servent icons + slaved.add_serv_hud(H.mind, "vampthrall") ticker.mode.vampire_enthralled.Add(H.mind) - ticker.mode.vampire_enthralled[H.mind] = src.mind + ticker.mode.vampire_enthralled[H.mind] = user.mind H.mind.special_role = "VampThrall" - H << "\red You have been Enthralled by [name]. Follow their every command." - src << "\red You have successfully Enthralled [H.name]. If they refuse to do as you say just adminhelp." - log_admin("[ckey(src.key)] has mind-slaved [ckey(H.key)].") + H << "You have been Enthralled by [user]. Follow their every command." + src << "You have successfully Enthralled [H]. If they refuse to do as you say just adminhelp." + log_admin("[ckey(user.key)] has mind-slaved [ckey(H.key)].") -/client/vampire/proc/vampire_bats() - set category = "Abilities" - set name = "Summon Bats (75)" - set desc = "You summon a pair of space bats who attack nearby targets until they or their target is dead." - var/datum/mind/M = usr.mind - if(!M) return - if(M.current.vampire_power(75, 0)) - var/list/turf/locs = new - var/number = 0 - for(var/direction in alldirs) //looking for bat spawns - if(locs.len == 2) //we found 2 locations and thats all we need - break - var/turf/T = get_step(M.current,direction) //getting a loc in that direction - if(AStar(M.current.loc, T, /turf/proc/AdjacentTurfs, /turf/proc/Distance, 1, simulated_only = 0)) // if a path exists, so no dense objects in the way its valid salid - locs += T - if(locs.len) - for(var/turf/tospawn in locs) - number++ - new /mob/living/simple_animal/hostile/scarybat(tospawn, M.current) - if(number != 2) //if we only found one location, spawn one on top of our tile so we dont get stacked bats - new /mob/living/simple_animal/hostile/scarybat(M.current.loc, M.current) - else // we had no good locations so make two on top of us - new /mob/living/simple_animal/hostile/scarybat(M.current.loc, M.current) - new /mob/living/simple_animal/hostile/scarybat(M.current.loc, M.current) - M.current.remove_vampire_blood(75) - M.current.verbs -= /client/vampire/proc/vampire_bats - spawn(1200) M.current.verbs += /client/vampire/proc/vampire_bats +/obj/effect/proc_holder/spell/vampire/self/cloak + name = "Cloak of Darkness" + desc = "Toggles whether you are currently cloaking yourself in darkness." + gain_desc = "You have gained the Cloak of Darkness ability which when toggled makes you near invisible in the shroud of darkness." + action_icon_state = "vampire_cloak" + charge_max = 10 -/client/vampire/proc/vampire_jaunt() - //AHOY COPY PASTE INCOMING - set category = "Abilities" - set name = "Mist Form (30)" - set desc = "You take on the form of mist for a short period of time." +/obj/effect/proc_holder/spell/vampire/self/cloak/New() + ..() + update_name() + +/obj/effect/proc_holder/spell/vampire/self/cloak/proc/update_name() + var/mob/living/user = loc + if(!ishuman(user) || !user.mind || !user.mind.vampire) + return + name = "[initial(name)] ([user.mind.vampire.iscloaking ? "Deactivate" : "Activate"])" + +/obj/effect/proc_holder/spell/vampire/self/cloak/cast() + var/datum/vampire/V = usr.mind.vampire + V.iscloaking = !V.iscloaking + update_name() + usr << "You will now be [V.iscloaking ? "hidden" : "seen"] in darkness." + +/obj/effect/proc_holder/spell/vampire/bats + name = "Summon Bats (75)" + desc = "You summon a pair of space bats who attack nearby targets until they or their target is dead." + gain_desc = "You have gained the Summon Bats ability." + action_icon_state = "vampire_bats" + charge_max = 1200 + required_blood = 75 + var/num_bats = 2 + +/obj/effect/proc_holder/spell/vampire/bats/choose_targets(mob/user = usr) + var/list/turf/locs = new + for(var/direction in alldirs) //looking for bat spawns + if(locs.len == num_bats) //we found 2 locations and thats all we need + break + var/turf/T = get_step(usr, direction) //getting a loc in that direction + if(AStar(usr.loc, T, /turf/proc/AdjacentTurfs, /turf/proc/Distance, 1, simulated_only = 0)) // if a path exists, so no dense objects in the way its valid salid + locs += T + + // pad with player location + for(var/i = locs.len + 1 to num_bats) + locs += user.loc + + perform(locs) + +/obj/effect/proc_holder/spell/vampire/bats/cast(list/targets) + for(var/T in targets) + new /mob/living/simple_animal/hostile/scarybat(T, usr) + +/obj/effect/proc_holder/spell/vampire/self/jaunt + name = "Mist Form (30)" + desc = "You take on the form of mist for a short period of time." + gain_desc = "You have gained the Mist Form ability which allows you to take on the form of mist for a short period and pass over any obstacle in your path." + action_icon_state = "jaunt" + charge_max = 600 + required_blood = 30 var/jaunt_duration = 50 //in deciseconds - var/datum/mind/M = usr.mind - if(!M) return - if(M.current.vampire_power(30, 0)) - if(M.current.buckled) M.current.buckled.unbuckle_mob() - spawn(0) - var/originalloc = get_turf(M.current.loc) - var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt( originalloc ) - var/atom/movable/overlay/animation = new /atom/movable/overlay( originalloc ) - animation.name = "water" - animation.density = 0 - animation.anchored = 1 - animation.icon = 'icons/mob/mob.dmi' - animation.icon_state = "liquify" - animation.layer = 5 - animation.master = holder - M.current.ExtinguishMob() - if(M.current.buckled) - M.current.buckled.unbuckle_mob() - flick("liquify",animation) - M.current.loc = holder - M.current.client.eye = holder - var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread() - steam.set_up(10, 0, originalloc) - steam.start() - sleep(jaunt_duration) - var/mobloc = get_turf(M.current.loc) - if(get_area(mobloc) == /area/security/armoury/gamma) - M << "A strange energy repels you!" - mobloc = originalloc - animation.loc = mobloc - steam.location = mobloc - steam.start() - M.current.canmove = 0 - sleep(20) - flick("reappear",animation) - sleep(5) - if(!M.current.Move(mobloc)) - for(var/direction in list(1,2,4,8,5,6,9,10)) - var/turf/T = get_step(mobloc, direction) - if(T) - if(M.current.Move(T)) - break - M.current.canmove = 1 - M.current.client.eye = M.current - qdel(animation) - qdel(holder) - M.current.remove_vampire_blood(30) - M.current.verbs -= /client/vampire/proc/vampire_jaunt - spawn(600) M.current.verbs += /client/vampire/proc/vampire_jaunt +/obj/effect/proc_holder/spell/vampire/self/jaunt/cast() + if(usr.buckled) + usr.buckled.unbuckle_mob() + spawn(0) + var/mob/living/U = usr + var/originalloc = get_turf(usr.loc) + var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt(originalloc) + var/atom/movable/overlay/animation = new /atom/movable/overlay(originalloc) + animation.name = "water" + animation.density = 0 + animation.anchored = 1 + animation.icon = 'icons/mob/mob.dmi' + animation.icon_state = "liquify" + animation.layer = 5 + animation.master = holder + U.ExtinguishMob() + if(usr.buckled) + usr.buckled.unbuckle_mob() + flick("liquify", animation) + usr.forceMove(holder) + usr.client.eye = holder + var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread() + steam.set_up(10, 0, originalloc) + steam.start() + sleep(jaunt_duration) + var/mobloc = get_turf(usr.loc) + if(get_area(mobloc) == /area/security/armoury/gamma) + usr << "A strange energy repels you!" + mobloc = originalloc + animation.loc = mobloc + steam.location = mobloc + steam.start() + usr.canmove = 0 + sleep(20) + flick("reappear",animation) + sleep(5) + if(!usr.Move(mobloc)) + for(var/direction in list(1,2,4,8,5,6,9,10)) + var/turf/T = get_step(mobloc, direction) + if(T) + if(usr.Move(T)) + break + usr.canmove = 1 + usr.client.eye = usr + qdel(animation) + qdel(holder) // Blink for vamps // Less smoke spam. -/client/vampire/proc/vampire_shadowstep() - set category = "Abilities" - set name = "Shadowstep (30)" - set desc = "Vanish into the shadows." - var/datum/mind/M = usr.mind - if(!M) return +/obj/effect/proc_holder/spell/vampire/shadowstep + name = "Shadowstep (30)" + desc = "Vanish into the shadows." + gain_desc = "You have gained the ability to shadowstep, which makes you disappear into nearby shadows at the cost of blood." + action_icon_state = "blink" + charge_max = 20 + required_blood = 30 // Teleport radii var/inner_tele_radius = 0 var/outer_tele_radius = 6 - // Maximum lighting_lumcount. var/max_lum = 1 - if(M.current.vampire_power(30, 0)) - if(M.current.buckled) M.current.buckled.unbuckle_mob() - spawn(0) - var/list/turfs = new/list() - for(var/turf/T in range(usr,outer_tele_radius)) - if(T in range(usr,inner_tele_radius)) continue - if(istype(T,/turf/space)) continue - if(T.density) continue - if(T.x>world.maxx-outer_tele_radius || T.xworld.maxy-outer_tele_radius || T.y world.maxx-outer_tele_radius || T.x < outer_tele_radius) + continue //putting them at the edge is dumb + if(T.y > world.maxy-outer_tele_radius || T.y < outer_tele_radius) + continue - var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T - var/lightingcount = L.get_clamped_lum(0.5)*10 + var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T + var/lightingcount = L.get_clamped_lum(0.5) * 10 - // LIGHTING CHECK - if(lightingcount > max_lum) continue - turfs += T + // LIGHTING CHECK + if(lightingcount > max_lum) + continue + turfs += T - if(!turfs.len) - usr << "\red You cannot find darkness to step to." - return - - var/turf/picked = pick(turfs) - - if(!picked || !isturf(picked)) - return - M.current.ExtinguishMob() - if(M.current.buckled) - M.current.buckled.unbuckle_mob() - var/atom/movable/overlay/animation = new /atom/movable/overlay( get_turf(usr) ) - animation.name = usr.name - animation.density = 0 - animation.anchored = 1 - animation.icon = usr.icon - animation.alpha = 127 - animation.layer = 5 - //animation.master = src - usr.loc = picked - spawn(10) - qdel(animation) - M.current.remove_vampire_blood(30) - M.current.verbs -= /client/vampire/proc/vampire_shadowstep - spawn(20) - M.current.verbs += /client/vampire/proc/vampire_shadowstep - -/mob/proc/remove_vampire_blood(amount = 0) - var/bloodold - if(!mind || !mind.vampire) + if(!turfs.len) + revert_cast(user) + user << "\red You cannot find darkness to step to." return - bloodold = mind.vampire.bloodusable - mind.vampire.bloodusable = max(0, (mind.vampire.bloodusable - amount)) - if(bloodold != mind.vampire.bloodusable) - src << "\blue You have [mind.vampire.bloodusable] left to use." \ No newline at end of file + + perform(turfs) + +/obj/effect/proc_holder/spell/vampire/shadowstep/cast(list/targets) + if(usr.buckled) + usr.buckled.unbuckle_mob() + spawn(0) + var/turf/picked = pick(targets) + + if(!picked || !isturf(picked)) + return + var/mob/living/U = usr + U.ExtinguishMob() + if(usr.buckled) + usr.buckled.unbuckle_mob() + var/atom/movable/overlay/animation = new /atom/movable/overlay(get_turf(usr)) + animation.name = usr.name + animation.density = 0 + animation.anchored = 1 + animation.icon = usr.icon + animation.alpha = 127 + animation.layer = 5 + //animation.master = src + usr.forceMove(picked) + spawn(10) + qdel(animation) + +/datum/vampire_passive/regen + gain_desc = "Your rejuvination abilities have improved and will now heal you over time when used." + +/datum/vampire_passive/vision + gain_desc = "Your vampiric vision has improved." + +/datum/vampire_passive/full + gain_desc = "You have reached your full potential and are no longer weak to the effects of anything holy and your vision has been improved greatly." diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index 5247727034a..c52a783b3ba 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -20,7 +20,7 @@ // All science-y guys get bonuses for maxing out their tech. required_objectives=list( - /datum/job_objective/maximize_research + /datum/job_objective/further_research ) equip(var/mob/living/carbon/human/H) @@ -58,7 +58,7 @@ // All science-y guys get bonuses for maxing out their tech. required_objectives=list( - /datum/job_objective/maximize_research + /datum/job_objective/further_research ) equip(var/mob/living/carbon/human/H) @@ -94,7 +94,6 @@ required_objectives=list( /datum/job_objective/make_cyborg, -// /datum/job_objective/make_mommi, /datum/job_objective/make_ripley ) diff --git a/code/game/jobs/job_objectives/science.dm b/code/game/jobs/job_objectives/science.dm index 64cd041838c..ac646b24080 100644 --- a/code/game/jobs/job_objectives/science.dm +++ b/code/game/jobs/job_objectives/science.dm @@ -3,31 +3,20 @@ ///////////////////////////////////////////////////////////////////////////////////////// // MAXIMUM SCIENCE -/datum/job_objective/maximize_research - completion_payment = 1000 +/datum/job_objective/further_research + completion_payment = 5 + per_unit = 1 -/datum/job_objective/maximize_research/get_description() - var/desc = "Maximize all legal research tech levels." +/datum/job_objective/further_research/get_description() + var/desc = "Research tech levels, and have cargo ship them to centcomm." + desc += "([units_completed] completed.)" return desc /datum/job_objective/maximize_research/check_for_completion() - var/obj/machinery/r_n_d/server/server = null - for(var/obj/machinery/r_n_d/server/serber in machines) - if(serber.name == "Core R&D Server") - server = serber - break - if(!server) - return 0 - - for(var/datum/tech/T in server.files.possible_tech) - if(T.max_level==0) // Ignore illegal tech, etc - continue - var/datum/tech/KT = locate(T.type, server.files.known_tech) - if(!KT) - return 0 // Obviously haven't maxed everything if we don't know a tech. - if(KT.level 0) + return 1 + return 0 ///////////////////////////////////////////////////////////////////////////////////////// // Robotics @@ -51,6 +40,6 @@ per_unit = 1 /datum/job_objective/make_ripley/get_description() - var/desc = "Make a Ripley." + var/desc = "Make a Ripley or Firefighter." desc += "([units_completed] created.)" return desc \ No newline at end of file diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index b52a15d77c3..62b090ba1db 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -858,4 +858,24 @@ obj/item/weapon/circuitboard/rdserver /obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/stock_parts/manipulator = 1, /obj/item/weapon/stock_parts/console_screen = 1, - /obj/item/stack/cable_coil = 1) \ No newline at end of file + /obj/item/stack/cable_coil = 1) + +/obj/item/weapon/circuitboard/botany_extractor + name = "circuit board (Lysis-Isolation Centrifuge)" + build_path = /obj/machinery/botany/extractor + board_type = "machine" + origin_tech = "biotech=3;programming=3" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/scanning_module = 1, + /obj/item/weapon/stock_parts/console_screen = 1) + +/obj/item/weapon/circuitboard/botany_editor + name = "circuit board (Bioballistic Delivery System)" + build_path = /obj/machinery/botany/editor + board_type = "machine" + origin_tech = "biotech=3;programming=3" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/stock_parts/console_screen = 1) \ No newline at end of file diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 960bc9c3b50..c929e279d6b 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -30,6 +30,9 @@ var/electrified_until = 0 // World time when the door is no longer electrified. -1 if it is permanently electrified until someone fixes it. var/main_power_lost_until = 0 //World time when main power is restored. var/backup_power_lost_until = -1 //World time when backup power is restored. + var/electrified_timer = null + var/main_power_timer = null + var/backup_power_timer = null var/spawnPowerRestoreRunning = 0 var/welded = null var/locked = 0 @@ -208,30 +211,17 @@ desc = "And they said I was crazy." icon = 'icons/obj/doors/Dooruranium.dmi' mineral = "uranium" - var/last_event = 0 + var/event_step = 20 -/obj/machinery/door/airlock/process() - // Deliberate no call to parent. - if(main_power_lost_until > 0 && world.time >= main_power_lost_until) - regainMainPower() - - if(backup_power_lost_until > 0 && world.time >= backup_power_lost_until) - regainBackupPower() - - else if(electrified_until > 0 && world.time >= electrified_until) - electrify(0) - -/obj/machinery/door/airlock/uranium/process() - if(world.time > last_event+20) - if(prob(50)) - radiate() - last_event = world.time +/obj/machinery/door/airlock/uranium/New() ..() + addtimer(src, "radiate", event_step) /obj/machinery/door/airlock/uranium/proc/radiate() - for(var/mob/living/L in range (3,src)) - L.apply_effect(15,IRRADIATE,0) - return + if(prob(50)) + for(var/mob/living/L in range (3,src)) + L.apply_effect(15,IRRADIATE,0) + addtimer(src, "radiate", event_step) /obj/machinery/door/airlock/plasma name = "plasma airlock" @@ -338,6 +328,15 @@ About the new airlock wires panel: /obj/machinery/door/airlock/Destroy() qdel(wires) wires = null + if(main_power_timer) + deltimer(main_power_timer) + main_power_timer = null + if(backup_power_timer) + deltimer(backup_power_timer) + backup_power_timer = null + if(electrified_timer) + deltimer(electrified_timer) + electrified_timer = null return ..() /obj/machinery/door/airlock/bumpopen(mob/living/user as mob) //Airlocks now zap you when you 'bump' them open when they're electrified. --NeoFite @@ -399,10 +398,13 @@ About the new airlock wires panel: /obj/machinery/door/airlock/proc/loseMainPower() main_power_lost_until = mainPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) + if(main_power_lost_until > 0) + main_power_timer = addtimer(src, "regainMainPower", SecondsToTicks(60), 1) // If backup power is permanently disabled then activate in 10 seconds if possible, otherwise it's already enabled or a timer is already running if(backup_power_lost_until == -1 && !backupPowerCablesCut()) backup_power_lost_until = world.time + SecondsToTicks(10) + backup_power_timer = addtimer(src, "regainBackupPower", SecondsToTicks(10), 1) // Disable electricity if required if(electrified_until && isAllPowerLoss()) @@ -410,12 +412,16 @@ About the new airlock wires panel: /obj/machinery/door/airlock/proc/loseBackupPower() backup_power_lost_until = backupPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) + if(backup_power_lost_until > 0) + backup_power_timer = addtimer(src, "regainBackupPower", SecondsToTicks(60), 1) // Disable electricity if required if(electrified_until && isAllPowerLoss()) electrify(0) /obj/machinery/door/airlock/proc/regainMainPower() + main_power_timer = null + if(!mainPowerCablesCut()) main_power_lost_until = 0 // If backup power is currently active then disable, otherwise let it count down and disable itself later @@ -424,22 +430,28 @@ About the new airlock wires panel: update_icon() /obj/machinery/door/airlock/proc/regainBackupPower() + backup_power_timer = null + if(!backupPowerCablesCut()) // Restore backup power only if main power is offline, otherwise permanently disable backup_power_lost_until = main_power_lost_until == 0 ? -1 : 0 update_icon() /obj/machinery/door/airlock/proc/electrify(var/duration, var/feedback = 0) + if(electrified_timer) + deltimer(electrified_timer) + electrified_timer = null + var/message = "" - if(src.isWireCut(AIRLOCK_WIRE_ELECTRIFY) && arePowerSystemsOn()) + if(isWireCut(AIRLOCK_WIRE_ELECTRIFY) && arePowerSystemsOn()) message = text("The electrification wire is cut - Door permanently electrified.") - src.electrified_until = -1 + electrified_until = -1 else if(duration && !arePowerSystemsOn()) message = text("The door is unpowered - Cannot electrify the door.") - src.electrified_until = 0 + electrified_until = 0 else if(!duration && electrified_until != 0) message = "The door is now un-electrified." - src.electrified_until = 0 + electrified_until = 0 else if(duration) //electrify door for the given duration seconds if(usr) shockedby += text("\[[time_stamp()]\] - [usr](ckey:[usr.ckey])") @@ -447,7 +459,8 @@ About the new airlock wires panel: else shockedby += text("\[[time_stamp()]\] - EMP)") message = "The door is now electrified [duration == -1 ? "permanently" : "for [duration] second\s"]." - src.electrified_until = duration == -1 ? -1 : world.time + SecondsToTicks(duration) + electrified_until = duration == -1 ? -1 : world.time + SecondsToTicks(duration) + electrified_timer = addtimer(src, "electrify", SecondsToTicks(duration), 1, 0) if(feedback && message) usr << message @@ -686,23 +699,23 @@ About the new airlock wires panel: usr << text("The electrification wire is cut - Door permanently electrified.") else if(!activate && electrified_until != 0) usr << "The door is now un-electrified." - src.electrified_until = 0 + electrify(0) else if(activate) //electrify door for 30 seconds shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])") usr.attack_log += text("\[[time_stamp()]\] Electrified the [name] at [x] [y] [z]") usr << "The door is now electrified for thirty seconds." - src.electrified_until = world.time + SecondsToTicks(30) + electrify(30) if("electrify_permanently") if(src.isWireCut(AIRLOCK_WIRE_ELECTRIFY)) usr << text("The electrification wire is cut - Cannot electrify the door.") else if(!activate && electrified_until != 0) usr << "The door is now un-electrified." - src.electrified_until = 0 + electrify(0) else if(activate) shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])") usr.attack_log += text("\[[time_stamp()]\] Electrified the [name] at [x] [y] [z]") usr << "The door is now electrified." - electrified_until = -1 + electrify(-1) if("open") if(src.welded) usr << text("The airlock has been welded shut!") diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 81ea94c6e12..e9e1d03831f 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -9,10 +9,11 @@ obj/machinery/door/airlock var/cur_command = null //the command the door is currently attempting to complete obj/machinery/door/airlock/process() - ..() - if (arePowerSystemsOn()) + if(arePowerSystemsOn() && cur_command) spawn() execute_current_command() + else + return PROCESS_KILL obj/machinery/door/airlock/receive_signal(datum/signal/signal) if (!arePowerSystemsOn()) return //no power @@ -33,8 +34,11 @@ obj/machinery/door/airlock/proc/execute_current_command() return do_command(cur_command) - if (command_completed(cur_command)) + if(command_completed(cur_command)) cur_command = null + else + if(!(src in machines)) + addAtProcessing() obj/machinery/door/airlock/proc/do_command(var/command) switch(command) diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index b150723c704..378ea22c6da 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -65,7 +65,6 @@ // if it's less than 0, open door, reset timer // update the door_timer window and the icon /obj/machinery/door_timer/process() - if(stat & (NOPOWER|BROKEN)) return if(timing) @@ -73,22 +72,20 @@ // (no seriously there's gotta be a better way to do this) var/timeleft = timeleft() if(timeleft > 1e5) - src.releasetime = 0 + releasetime = 0 - if(world.timeofday > src.releasetime) - Radio.autosay("Timer has expired. Releasing prisoner.", src.name, "Security", list(src.z)) + if(world.timeofday > releasetime) + Radio.autosay("Timer has expired. Releasing prisoner.", name, "Security", list(z)) timer_end() // open doors, reset timer, clear status screen timing = 0 + . = PROCESS_KILL src.updateUsrDialog() src.update_icon() - else timer_end() - - return - + return PROCESS_KILL // has the door power situation changed, if so update icon. /obj/machinery/door_timer/power_change() @@ -106,6 +103,8 @@ // Set releasetime releasetime = world.timeofday + timetoset + if(!(src in machines)) + addAtProcessing() for(var/obj/machinery/door/window/brigdoor/door in targets) if(door.density) continue diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index b6fd5a66e1c..113a4f0be9e 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -142,7 +142,7 @@ FIRE ALARM alarm() time = 0 timing = 0 - processing_objects.Remove(src) + processing_objects -= src updateDialog() last_process = world.timeofday @@ -244,9 +244,14 @@ FIRE ALARM else if(href_list["alarm"]) alarm() else if(href_list["time"]) + var/oldTiming = timing timing = text2num(href_list["time"]) last_process = world.timeofday - processing_objects.Add(src) + if(oldTiming != timing) + if(timing) + processing_objects += src + else + processing_objects -= src else if(href_list["tp"]) var/tp = text2num(href_list["tp"]) time += tp diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index 0c2894ff960..dd8060ef827 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -47,37 +47,55 @@ var/datum/announcement/minor/slotmachine_announcement = new(do_log = 0) if(operation == 1) // Play if (working == 1) return - if (!account || account.money < 5) + if (!account || account.money < 10) return - if(!account.charge(5, transaction_purpose = "Bet", dest_name = name)) + if(!account.charge(10, transaction_purpose = "Bet", dest_name = name)) return plays += 1 working = 1 icon_state = "slots-on" - var/roll = rand(1,10000) + var/roll = rand(1,1350) playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) - spawn(30) + spawn(25) if (roll == 1) - visible_message("[src] says, 'JACKPOT! [usr.name] has won two hundred and fifty thousand credits!'") - slotmachine_announcement.Announce("Congratulations to [usr.name] on winning the jackpot of two hundred and fifty thousand credits!", "Jackpot Winner") - result = "JACKPOT! You win two hundred and fifty thousand credits!" + visible_message("[src] says, 'JACKPOT! [usr.name] has won a MILLION CREDITS!'") + slotmachine_announcement.Announce("Congratulations to [usr.name] on winning the Jackpot of ONE MILLION CREDITS!", "Jackpot Winner") + result = "JACKPOT! You win one million credits!" resultlvl = "highlight" - win_money(250000, 'sound/effects/engine_alert2.ogg') - else if (roll > 1 && roll <= 10) - visible_message("[src] says, 'Big Winner! [usr.name] has won five thousand credits!'") - result = "Big Winner! You win five thousand credits!" + win_money(1000000, 'sound/goonstation/misc/airraid_loop.ogg') + else if (roll > 1 && roll <= 5) + visible_message("[src] says, 'Big Winner! [usr.name] has won a hundred thousand credits!'") + slotmachine_announcement.Announce("Congratulations to [usr.name] on winning a hundred thousand credits!", "Big Winner") + result = "Big Winner! You win a hundred thousand credits!" resultlvl = "good" - win_money(5000) - else if (roll > 10 && roll <= 100) - visible_message("[src] says, 'Winner! [usr.name] has won five hundred credits!'") - result = "You win five hundred credits!" + win_money(100000, 'sound/goonstation/misc/klaxon.ogg') + else if (roll > 5 && roll <= 25) + visible_message("[src] says, 'Big Winner! [usr.name] has won ten thousand credits!'") + result = "You win ten thousand credits!" resultlvl = "good" - win_money(500) - else if (roll > 100 && roll <= 1000) - result = "You win 5 credits!" + win_money(10000, 'sound/goonstation/misc/klaxon.ogg') + else if (roll > 25 && roll <= 50) + visible_message("[src] says, 'Winner! [usr.name] has won a thousand credits!'") + result = "You win a thousand credits!" resultlvl = "good" - win_money(5) + win_money(1000, 'sound/goonstation/misc/bell.ogg') + else if (roll > 50 && roll <= 100) + visible_message("[src] says, 'Winner! [usr.name] has won a hundred credits!'") + result = "You win a hundred credits!" + resultlvl = "good" + win_money(100, 'sound/goonstation/misc/bell.ogg') + else if (roll > 100 && roll <= 200) + visible_message("[src] says, 'Winner! [usr.name] has won fifty credits!'") + result = "You win fifty credits!" + resultlvl = "good" + win_money(50) + else if (roll > 200 && roll <= 500) + visible_message("[src] says, 'Winner! [usr.name] has won ten credits!'") + result = "You win ten credits!" + resultlvl = "good" + win_money(10) else + visible_message("[src] says, 'No Luck!'") result = "No luck!" resultlvl = "average" working = 0 @@ -85,7 +103,7 @@ var/datum/announcement/minor/slotmachine_announcement = new(do_log = 0) /obj/machinery/slot_machine/proc/win_money(amt, sound='sound/machines/ping.ogg') if(sound) - playsound(loc, sound, 50) + playsound(loc, sound, 55, 1) if(!account) return diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index 519005f2cc0..08d0541bfb5 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -97,6 +97,7 @@ /datum/construction/reversible/mecha/ripley result = "/obj/mecha/working/ripley" + taskpath = /datum/job_objective/make_ripley steps = list( //1 list("key"=/obj/item/weapon/weldingtool, @@ -585,6 +586,7 @@ /datum/construction/reversible/mecha/firefighter result = "/obj/mecha/working/ripley/firefighter" + taskpath = /datum/job_objective/make_ripley steps = list( //1 list("key"=/obj/item/weapon/weldingtool, diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index f0579af36b4..9202405cb2f 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -55,7 +55,7 @@ if(M.mind) if(M.mind.vampire) if(ishuman(M)) - if(!(VAMP_FULL in M.mind.vampire.powers)) + if(!M.mind.vampire.get_ability(/datum/vampire_passive/full)) M << "The nullrod's power interferes with your own!" M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) ..() diff --git a/code/game/vehicles/spacepods/equipment.dm b/code/game/vehicles/spacepods/equipment.dm index b9868a78c8f..5053012df1a 100644 --- a/code/game/vehicles/spacepods/equipment.dm +++ b/code/game/vehicles/spacepods/equipment.dm @@ -17,13 +17,13 @@ firstloc = get_step(my_atom, NORTH) secondloc = get_step(firstloc,EAST) if(SOUTH) - firstloc = get_step(my_atom, SOUTH) + firstloc = get_turf(my_atom) secondloc = get_step(firstloc,EAST) if(EAST) firstloc = get_step(my_atom, EAST) secondloc = get_step(firstloc,NORTH) if(WEST) - firstloc = get_step(my_atom, WEST) + firstloc = get_turf(my_atom) secondloc = get_step(firstloc,NORTH) olddir = dir var/proj_type = text2path(projectile_type) @@ -48,6 +48,7 @@ var/obj/spacepod/my_atom var/obj/item/device/spacepod_equipment/weaponry/weapon_system // weapons system var/obj/item/device/spacepod_equipment/misc/misc_system // misc system + var/obj/item/device/spacepod_equipment/cargo/cargo_system // cargo system //var/obj/item/device/spacepod_equipment/engine/engine_system // engine system //var/obj/item/device/spacepod_equipment/shield/shield_system // shielding system @@ -59,6 +60,10 @@ /obj/item/device/spacepod_equipment name = "equipment" var/obj/spacepod/my_atom + +/obj/item/device/spacepod_equipment/proc/removed(var/mob/user) // So that you can unload cargo when you remove the module + return + // base item for spacepod weapons /obj/item/device/spacepod_equipment/weaponry @@ -98,6 +103,34 @@ shot_cost = 600 fire_sound = 'sound/weapons/Laser.ogg' +// MINING LASERS +/obj/item/device/spacepod_equipment/weaponry/mining_laser_basic + name = "weak mining laser system" + desc = "A weak mining laser system for space pods, fires bursts of energy that cut through rock" + icon_state = "pod_taser" + projectile_type = "/obj/item/projectile/kinetic" + shot_cost = 300 + fire_delay = 14 + fire_sound = 'sound/weapons/Kenetic_accel.ogg' + +/obj/item/device/spacepod_equipment/weaponry/mining_laser + name = "mining laser system" + desc = "A mining laser system for space pods, fires bursts of energy that cut through rock" + icon_state = "pod_m_laser" + projectile_type = "/obj/item/projectile/kinetic/super" + shot_cost = 250 + fire_delay = 10 + fire_sound = 'sound/weapons/Kenetic_accel.ogg' + +/obj/item/device/spacepod_equipment/weaponry/mining_laser_hyper + name = "enhanced mining laser system" + desc = "An enhanced mining laser system for space pods, fires bursts of energy that cut through rock" + icon_state = "pod_w_laser" + projectile_type = "/obj/item/projectile/kinetic/hyper" + shot_cost = 200 + fire_delay = 8 + fire_sound = 'sound/weapons/Kenetic_accel.ogg' + //base item for spacepod misc equipment (tracker) /obj/item/device/spacepod_equipment/misc name = "pod misc" @@ -121,4 +154,35 @@ enabled = 1 user.show_message("You enable \the [src]'s power.") else - ..() \ No newline at end of file + ..() + +/obj/item/device/spacepod_equipment/cargo + name = "pod cargo" + desc = "You shouldn't be seeing this" + icon = 'icons/goonstation/pods/ship.dmi' + icon_state = "blank" + +/obj/item/device/spacepod_equipment/cargo/proc/passover(var/obj/item/I) + return + +/obj/item/device/spacepod_equipment/cargo/proc/unload() + return + +/obj/item/device/spacepod_equipment/cargo/ore + name = "\improper spacepod ore storage system" + desc = "An ore storage system for spacepods. Scoops up any ore you drive over." + icon_state = "pod_locator" + var/obj/structure/ore_box/box + +/obj/item/device/spacepod_equipment/cargo/ore/passover(var/obj/item/I) + if(box && istype(I,/obj/item/weapon/ore)) + I.forceMove(box) + +/obj/item/device/spacepod_equipment/cargo/ore/unload() + if(box) + box.forceMove(get_turf(my_atom)) + box = null + +/obj/item/device/spacepod_equipment/cargo/ore/removed(var/mob/user) + . = ..() + unload() diff --git a/code/game/vehicles/spacepods/spacepod.dm b/code/game/vehicles/spacepods/spacepod.dm index d6b02e9da26..d5e2c45182c 100644 --- a/code/game/vehicles/spacepods/spacepod.dm +++ b/code/game/vehicles/spacepods/spacepod.dm @@ -74,6 +74,8 @@ spacepods_list += src /obj/spacepod/Destroy() + if (equipment_system.cargo_system) + equipment_system.cargo_system.removed(null) qdel(equipment_system) equipment_system = null qdel(battery) @@ -283,6 +285,17 @@ equipment_system.misc_system = W equipment_system.misc_system.my_atom = src return + if(istype(W, /obj/item/device/spacepod_equipment/cargo)) + if(equipment_system.cargo_system) + user << "The pod already has a cargo system, remove it first." + return + else + user << "You insert \the [W] into the cargo system." + user.drop_item(W) + W.forceMove(src) + equipment_system.cargo_system = W + equipment_system.cargo_system.my_atom = src + return if(istype(W, /obj/item/weapon/weldingtool)) if(!hatch_open) @@ -316,6 +329,8 @@ possible.Add("Weapon System") if(equipment_system.misc_system) possible.Add("Misc. System") + if(equipment_system.cargo_system) + possible.Add("Cargo System") /* Not yet implemented if(equipment_system.engine_system) possible.Add("Engine System") @@ -332,6 +347,7 @@ SPE = equipment_system.weapon_system if(user.put_in_any_hand_if_possible(SPE)) user << "You remove \the [SPE] from the equipment system." + SPE.removed(user) SPE.my_atom = null equipment_system.weapon_system = null else @@ -340,10 +356,20 @@ SPE = equipment_system.misc_system if(user.put_in_any_hand_if_possible(SPE)) user << "You remove \the [SPE] from the equipment system." + SPE.removed(user) SPE.my_atom = null equipment_system.misc_system = null else user << "You need an open hand to do that." + if("Cargo System") + SPE = equipment_system.cargo_system + if(user.put_in_any_hand_if_possible(SPE)) + user << "You remove \the [SPE] from the equipment system." + SPE.removed(user) + SPE.my_atom = null + equipment_system.cargo_system = null + else + user << "You need an open hand to do that." /* if("engine system") SPE = equipment_system.engine_system @@ -481,24 +507,40 @@ playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) return 1 -/obj/spacepod/MouseDrop_T(mob/M, mob/user) - if(!isliving(M)) - return +/obj/spacepod/MouseDrop_T(atom/A, mob/user) + if(istype(A,/mob)) + var/mob/M = A + if(!isliving(M)) + return - occupant_sanity_check() + occupant_sanity_check() - if(M != user && M.stat == DEAD && allow2enter) - if(occupant2 && !occupant) - usr << "You can't put a corpse into the driver's seat!" - return 0 - if(!occupant2) - visible_message("[user.name] starts loading [M.name] into the pod!") - sleep(10) - moved_other_inside(M) + if(M != user && M.stat == DEAD && allow2enter) + if(occupant2 && !occupant) + usr << "You can't put a corpse into the driver's seat!" + return 0 + if(!occupant2) + visible_message("[user.name] starts loading [M.name] into the pod!") + sleep(10) + moved_other_inside(M) - if(M == user) - enter_pod(user) + if(M == user) + enter_pod(user) + if(istype(A, /obj/structure/ore_box)) // For loading ore boxes + var/obj/structure/ore_box/O = A + if(equipment_system.cargo_system && istype(equipment_system.cargo_system,/obj/item/device/spacepod_equipment/cargo/ore)) + var/obj/item/device/spacepod_equipment/cargo/ore/C = equipment_system.cargo_system + if(!C.box) + user << "You begin loading \the [O] into \the [src]'s [equipment_system.cargo_system]" + if(do_after(user, 40, target = src)) + C.box = O + O.forceMove(C) + user << "You load \the [O] into \the [src]'s [equipment_system.cargo_system]!" + else + user << "You fail to load \the [O] into \the [src]'s [equipment_system.cargo_system]" + else + user << "\The [src] already has \an [C.box]" /obj/spacepod/verb/enter_pod(mob/user = usr) set category = "Object" @@ -686,6 +728,17 @@ return equipment_system.weapon_system.fire_weapons() +/obj/spacepod/verb/unload() + if(!CheckIfOccupant2(usr)) + set name = "Unload Cargo" + set desc = "Unloads the cargo" + set category = "Spacepod" + set src = usr.loc + if(!equipment_system.cargo_system) + usr << "\The [src] has no cargo system!" + return + equipment_system.cargo_system.unload() + /obj/spacepod/verb/toggleLights() set name = "Toggle Lights" set category = "Spacepod" @@ -785,6 +838,11 @@ moveship = 0 if(moveship) Move(get_step(src, direction), direction) + if(equipment_system.cargo_system) + for (var/turf/T in locs) + for (var/obj/item/I in T.contents) + equipment_system.cargo_system.passover(I) + else if(!battery) user << "No energy cell detected." diff --git a/code/modules/hydroponics/seed_controller.dm b/code/modules/hydroponics/seed_controller.dm index b7a6b31cb7c..7e373bfd2a6 100644 --- a/code/modules/hydroponics/seed_controller.dm +++ b/code/modules/hydroponics/seed_controller.dm @@ -4,20 +4,20 @@ #define PLANTS_PER_TICK 500 // Cap on number of plant segments processed. #define PLANT_TICK_TIME 75 // Number of ticks between the plant processor cycling. -// Debug for testing seed genes. +// Debug for testing seed genes (less useful now that the obfuscation is gone, but still might be useful for the future. /client/proc/show_plant_genes() set category = "Debug" set name = "Show Plant Genes" - set desc = "Prints the round's plant gene masks." + set desc = "Prints the round's plant gene tags." if(!holder) return - if(!plant_controller || !plant_controller.gene_tag_masks) - usr << "Gene masks not set." + if(!plant_controller || !plant_controller.gene_tag_list) + usr << "Gene tags not set." return - for(var/mask in plant_controller.gene_tag_masks) - usr << "[mask]: [plant_controller.gene_tag_masks[mask]]" + for(var/gene_tag in plant_controller.gene_tag_list) + usr << "[gene_tag]" var/global/datum/controller/plants/plant_controller // Set in New(). @@ -28,7 +28,7 @@ var/global/datum/controller/plants/plant_controller // Set in New(). var/list/product_descs = list() // Stores generated fruit descs. var/list/plant_queue = list() // All queued plants. var/list/seeds = list() // All seed data stored here. - var/list/gene_tag_masks = list() // Gene obfuscation for delicious trial and error goodness. + var/list/gene_tag_list = list() // List of gene tags for xenobotany fun var/list/plant_icon_cache = list() // Stores images of growth, fruits and seeds. var/list/plant_sprites = list() // List of all harvested product sprites. var/list/plant_product_sprites = list() // List of all growth sprites plus number of growth stages. @@ -83,18 +83,11 @@ var/global/datum/controller/plants/plant_controller // Set in New(). S.update_seed() //Might as well mask the gene types while we're at it. - var/list/used_masks = list() var/list/plant_traits = ALL_GENES while(plant_traits && plant_traits.len) var/gene_tag = pick(plant_traits) - var/gene_mask = "[uppertext(num2hex(rand(0,255)))]" - - while(gene_mask in used_masks) - gene_mask = "[uppertext(num2hex(rand(0,255)))]" - - used_masks += gene_mask plant_traits -= gene_tag - gene_tag_masks[gene_tag] = gene_mask + gene_tag_list.Add(gene_tag) // Proc for creating a random seed type. /datum/controller/plants/proc/create_random_seed(var/survive_on_station) diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index 550a1935a02..3f01f903763 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -136,6 +136,26 @@ var/datum/seed/genetics // Currently scanned seed genetic structure. var/degradation = 0 // Increments with each scan, stops allowing gene mods after a certain point. + var/degrade_lower = 20 + var/degrade_upper = 60 + +/obj/machinery/botany/extractor/New() + ..() + + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/botany_extractor(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + component_parts += new /obj/item/weapon/stock_parts/scanning_module(null) + component_parts += new /obj/item/weapon/stock_parts/console_screen(null) + RefreshParts() + +/obj/machinery/botany/extractor/RefreshParts() + var/tier = 1 + for (var/obj/item/weapon/stock_parts/scanning_module/S in component_parts) + tier = S.rating + degrade_lower = 25 - (tier * 5) //Tier 1: 20, Tier 4: 5 + degrade_upper = 70 - (tier * 10) //Tier 1: 60, Tier 4: 30 + /obj/machinery/botany/extractor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) if(!user) @@ -144,8 +164,8 @@ var/list/data = list() var/list/geneMasks[0] - for(var/gene_tag in plant_controller.gene_tag_masks) - geneMasks.Add(list(list("tag" = gene_tag, "mask" = plant_controller.gene_tag_masks[gene_tag]))) + for(var/gene_tag in plant_controller.gene_tag_list) + geneMasks.Add(gene_tag) data["geneMasks"] = geneMasks data["activity"] = active @@ -242,11 +262,11 @@ if(!genetics.roundstart) loaded_disk.genesource += " (variety #[genetics.uid])" - loaded_disk.name += " ([plant_controller.gene_tag_masks[href_list["get_gene"]]], #[genetics.uid])" - loaded_disk.desc += " The label reads \'gene [plant_controller.gene_tag_masks[href_list["get_gene"]]], sampled from [genetics.display_name]\'." + loaded_disk.name += " ([href_list["get_gene"]], #[genetics.uid])" + loaded_disk.desc += " The label reads \'[href_list["get_gene"]] gene, sampled from [genetics.display_name]\'." eject_disk = 1 - degradation += rand(20,60) + degradation += rand(degrade_lower, degrade_upper) if(degradation >= 100) failed_task = 1 genetics = null @@ -267,6 +287,26 @@ icon_state = "traitgun" disk_needs_genes = 1 + var/degrade_lower = 5 + var/degrade_upper = 10 + +/obj/machinery/botany/editor/New() + ..() + + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/botany_editor(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/console_screen(null) + RefreshParts() + +/obj/machinery/botany/editor/RefreshParts() + var/tier = 1 + for (var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + tier = M.rating + degrade_lower = 6 - tier //Tier 1: 5, Tier 4: 1 + degrade_upper = 11 - tier //Tier 1: 10, Tier 4: 6 + /obj/machinery/botany/editor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) if(!user) @@ -288,7 +328,7 @@ for(var/datum/plantgene/P in loaded_disk.genes) if(data["locus"] != "") data["locus"] += ", " - data["locus"] += "[plant_controller.gene_tag_masks[P.genetype]]" + data["locus"] += "[plant_controller.gene_tag_list[P.genetype]]" else data["disk"] = 0 @@ -329,7 +369,7 @@ for(var/datum/plantgene/gene in loaded_disk.genes) seed.seed.apply_gene(gene) - seed.modified += rand(5,10) + seed.modified += rand(degrade_lower, degrade_upper) usr.set_machine(src) src.add_fingerprint(usr) diff --git a/code/modules/mining/mine_areas.dm b/code/modules/mining/mine_areas.dm index ba8a3053ed9..20aaf97647a 100644 --- a/code/modules/mining/mine_areas.dm +++ b/code/modules/mining/mine_areas.dm @@ -64,4 +64,7 @@ name = "North Mining Outpost" /area/mine/west_outpost - name = "West Mining Outpost" \ No newline at end of file + name = "West Mining Outpost" + +/area/mine/podbay + name = "Mining Podbay" \ No newline at end of file diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 1c131a6965f..10ea0c752c7 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -62,6 +62,7 @@ var/obj/item/weapon/holder/H = new holder_type(loc) src.forceMove(H) H.name = name + if(istype(H, /obj/item/weapon/holder/mouse)) H.icon_state = icon_state if(desc) H.desc = desc H.attack_hand(grabber) @@ -73,13 +74,11 @@ //Mob specific holders. /obj/item/weapon/holder/diona - name = "diona nymph" desc = "It's a tiny plant critter." icon_state = "nymph" /obj/item/weapon/holder/drone - name = "maintenance drone" desc = "It's a small maintenance robot." icon_state = "drone" @@ -88,3 +87,8 @@ name = "pAI" desc = "It's a little robot." icon_state = "pai" + +/obj/item/weapon/holder/mouse + name = "mouse" + desc = "It's a small, disease-ridden rodent." + icon_state = "mouse_gray" diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 174b582eec3..aa589713cb9 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -98,7 +98,6 @@ src.brainmob << "You are a positronic brain, brought into existence on [station_name()]." src.brainmob << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI." src.brainmob << "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm." - src.brainmob << "Use say :b to speak to other artificial intelligences." src.brainmob.mind.assigned_role = "Positronic Brain" var/turf/T = get_turf_or_move(src.loc) @@ -200,4 +199,4 @@ /obj/item/device/mmi/posibrain/ipc desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. The speaker switch is set to 'off'." - silenced = 1 \ No newline at end of file + silenced = 1 diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index e8ca0524f01..fa4e557a200 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -135,7 +135,7 @@ M << "Blood from a monkey is useless!" return 0 //we're good to suck the blood, blaah - M.handle_bloodsucking(src) + M.mind.vampire.handle_bloodsucking(src) add_logs(src, M, "vampirebit") msg_admin_attack("[key_name_admin(M)] vampirebit [key_name_admin(src)]") return diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 22c7ed648ae..7ed777ebf77 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -88,7 +88,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc pulse = handle_pulse() if(mind && mind.vampire) - handle_vampire() + mind.vampire.handle_vampire() if(life_tick == 1) regenerate_icons() // Make sure the inventory updates diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 2aa84f9c95e..dddd2522ff2 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -423,14 +423,12 @@ H.see_invisible = SEE_INVISIBLE_LIVING if(H.mind && H.mind.vampire) - if((VAMP_VISION in H.mind.vampire.powers) && (!(VAMP_FULL in H.mind.vampire.powers))) - H.sight |= SEE_MOBS - - else if(VAMP_FULL in H.mind.vampire.powers) + if(H.mind.vampire.get_ability(/datum/vampire_passive/full)) H.sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS H.see_in_dark = 8 H.see_invisible = SEE_INVISIBLE_MINIMUM - + else if(H.mind.vampire.get_ability(/datum/vampire_passive/vision)) + H.sight |= SEE_MOBS if(XRAY in H.mutations) H.sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 18d2727214f..cf0fe7d91c3 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -453,8 +453,8 @@ set name = "Regrow Limbs" set desc = "Regrow one of your missing limbs at the cost of a large amount of hunger" -#define SLIMEPERSON_HUNGERCOST 125 -#define SLIMEPERSON_MINHUNGER 300 +#define SLIMEPERSON_HUNGERCOST 50 +#define SLIMEPERSON_MINHUNGER 250 #define SLIMEPERSON_REGROWTHDELAY 450 // 45 seconds if(stat || paralysis || stunned) @@ -620,12 +620,13 @@ has_organ = list( "nutrient channel" = /obj/item/organ/internal/liver/diona, "neural strata" = /obj/item/organ/internal/heart/diona, - "receptor node" = /obj/item/organ/internal/eyes/diona, + "receptor node" = /obj/item/organ/internal/diona_receptor, "gas bladder" = /obj/item/organ/internal/brain/diona, "polyp segment" = /obj/item/organ/internal/kidneys/diona, "anchoring ligament" = /obj/item/organ/internal/appendix/diona ) + vision_organ = /obj/item/organ/internal/diona_receptor has_limbs = list( "chest" = list("path" = /obj/item/organ/external/diona/chest), "groin" = list("path" = /obj/item/organ/external/diona/groin), diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 2409827d608..a34e8b9fe8b 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -30,6 +30,7 @@ maxbodytemp = 323 //Above 50 Degrees Celcius universal_speak = 0 can_hide = 1 + holder_type = /obj/item/weapon/holder/mouse /mob/living/simple_animal/mouse/handle_automated_speech() ..() @@ -63,7 +64,6 @@ icon_dead = "mouse_[mouse_color]_dead" desc = "It's a small [mouse_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself." - /mob/living/simple_animal/mouse/proc/splat() src.health = 0 src.stat = DEAD @@ -73,6 +73,11 @@ if(client) client.time_died_as_mouse = world.time +/mob/living/simple_animal/mouse/attack_hand(mob/living/carbon/human/M as mob) + if(M.a_intent == I_HELP) + get_scooped(M) + ..() + //make mice fit under tables etc? this was hacky, and not working /* /mob/living/simple_animal/mouse/Move(var/dir) diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm index b7c296443b5..c0b2de12fc3 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_water.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm @@ -264,44 +264,40 @@ M.stuttering = 0 M.confused = 0 return - if(ishuman(M) && M.mind) . - if(((M.mind in ticker.mode.vampires) || M.mind.vampire) && (!(VAMP_FULL in M.mind.vampire.powers)) && prob(80)) - switch(data) - if(1 to 4) - M << "Something sizzles in your veins!" - M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) - if(5 to 12) - M << "You feel an intense burning inside of you!" - M.adjustFireLoss(1) - M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) - if(13 to INFINITY) - M << "You suddenly ignite in a holy fire!" - for(var/mob/O in viewers(M, null)) - O.show_message(text("[] suddenly bursts into flames!", M), 1) - M.fire_stacks = min(5,M.fire_stacks + 3) - M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire - M.adjustFireLoss(3) //Hence the other damages... ain't I a bastard? - M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) + if(ishuman(M) && M.mind && M.mind.vampire && !M.mind.vampire.get_ability(/datum/vampire_passive/full) && prob(80)) + switch(data) + if(1 to 4) + M << "Something sizzles in your veins!" + M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) + if(5 to 12) + M << "You feel an intense burning inside of you!" + M.adjustFireLoss(1) + M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) + if(13 to INFINITY) + M << "You suddenly ignite in a holy fire!" + for(var/mob/O in viewers(M, null)) + O.show_message(text("[] suddenly bursts into flames!", M), 1) + M.fire_stacks = min(5,M.fire_stacks + 3) + M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire + M.adjustFireLoss(3) //Hence the other damages... ain't I a bastard? + M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) ..() - return /datum/reagent/holywater/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) // Vampires have their powers weakened by holy water applied to the skin. - if(ishuman(M)) - if((M.mind in ticker.mode.vampires) && !(VAMP_FULL in M.mind.vampire.powers)) - var/mob/living/carbon/human/H=M - if(method == TOUCH) - if(H.wear_mask) - H << "\red Your mask protects you from the holy water!" - return - else if(H.head) - H << "\red Your helmet protects you from the holy water!" - return - else - M << "Something holy interferes with your powers!" - M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) - return + if(ishuman(M) && M.mind && M.mind.vampire && !M.mind.vampire.get_ability(/datum/vampire_passive/full)) + var/mob/living/carbon/human/H=M + if(method == TOUCH) + if(H.wear_mask) + H << "\red Your mask protects you from the holy water!" + return + else if(H.head) + H << "\red Your helmet protects you from the holy water!" + return + else + M << "Something holy interferes with your powers!" + M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) /datum/reagent/holywater/reaction_turf(var/turf/simulated/T, var/volume) diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 25ec52af226..e2a89b38bec 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -500,4 +500,24 @@ build_type = IMPRINTER materials = list(MAT_GLASS=1000, "sacid"=20) build_path = /obj/item/weapon/circuitboard/prize_counter - category = list("Misc. Machinery") \ No newline at end of file + category = list("Misc. Machinery") + +/datum/design/botany_extractor + name = "Machine Design (Lysis-Isolation Centrifuge)" + desc = "The circuit board for a lysis-isolation centrifuge." + id = "botany_extractor" + req_tech = list("biotech" = 3, "programming" = 3) + build_type = IMPRINTER + materials = list(MAT_GLASS=1000, "sacid"=20) + build_path = /obj/item/weapon/circuitboard/botany_extractor + category = list("Hydroponics Machinery") + +/datum/design/botany_editor + name = "Machine Design (Bioballistic Delivery System)" + desc = "The circuit board for a bioballistic delivery system." + id = "botany_editor" + req_tech = list("biotech" = 3, "programming" = 3) + build_type = IMPRINTER + materials = list(MAT_GLASS=1000, "sacid"=20) + build_path = /obj/item/weapon/circuitboard/botany_editor + category = list("Hydroponics Machinery") \ No newline at end of file diff --git a/code/modules/research/designs/spacepod_designs.dm b/code/modules/research/designs/spacepod_designs.dm index 57f8490be5e..cd965caf540 100644 --- a/code/modules/research/designs/spacepod_designs.dm +++ b/code/modules/research/designs/spacepod_designs.dm @@ -124,6 +124,39 @@ category = list("Pod_Weaponry") materials = list(MAT_METAL=10000,MAT_GLASS=5000,MAT_GOLD=1000,MAT_SILVER=2000) locked = 1 + +/datum/design/pod_mining_laser_basic + construction_time = 200 + name = "Basic Mining Laser" + desc = "Allows for the construction of a weak mining laser" + id = "pod_mining_laser_basic" + req_tech = list("materials" = 3, "powerstorage" = 2, "engineering" = 2, "magnets" = 3, "combat" = 2) + build_type = PODFAB + materials = list(MAT_METAL = 10000, MAT_GLASS = 5000, MAT_SILVER = 2000, MAT_URANIUM = 2000) + build_path = /obj/item/device/spacepod_equipment/weaponry/mining_laser_basic + category = list("Pod_Weaponry") + +/datum/design/pod_mining_laser + construction_time = 200 + name = "Mining Laser" + desc = "Allows for the construction of a mining laser." + id = "pod_mining_laser" + req_tech = list("materials" = 6, "powerstorage" = 6, "engineering" = 5, "magnets" = 6, "combat" = 4) + build_type = PODFAB + materials = list(MAT_METAL = 10000, MAT_GLASS = 5000, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_DIAMOND = 2000) + build_path = /obj/item/device/spacepod_equipment/weaponry/mining_laser + category = list("Pod_Weaponry") + +/datum/design/pod_mining_laser_hyper + construction_time = 200 + name = "Enhanced Mining Laser" + desc = "Allows for the construction of an enhanced mining laser." + id = "pod_mining_laser_hyper" + req_tech = list("materials" = 7, "powerstorage" = 6, "engineering" = 5, "magnets" = 6, "combat" = 4) + build_type = PODFAB + materials = list(MAT_METAL = 10000, MAT_GLASS = 5000, MAT_SILVER = 4000, MAT_GOLD = 4000, MAT_DIAMOND = 4000) + build_path = /obj/item/device/spacepod_equipment/weaponry/mining_laser_hyper + category = list("Pod_Weaponry") ////////////////////////////////////////// //////SPACEPOD MISC. ITEMS//////////////// ////////////////////////////////////////// @@ -137,4 +170,15 @@ build_type = PODFAB materials = list(MAT_METAL=5000) build_path = /obj/item/device/spacepod_equipment/misc/tracker + category = list("Pod_Parts") + +/datum/design/pod_cargo_ore + construction_time = 100 + name = "Spacepod Ore Storage Module" + desc = "Allows for the construction of a Space Pod Ore Storage Module." + id = "podcargo_ore" + req_tech = list("materials" = 3) + build_type = PODFAB + materials = list(MAT_METAL=20000, MAT_GLASS=2000) + build_path = /obj/item/device/spacepod_equipment/cargo/ore category = list("Pod_Parts") \ No newline at end of file diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 7e7eaf75ff9..a135a60df2f 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -188,7 +188,7 @@ desc = "This implant will synthesize and pump into your bloodstream a small amount of nutriment when you are hungry." icon_state = "chest_implant" implant_color = "#006607" - hunger_threshold = 250 + hunger_threshold = 300 poison_amount = 10 origin_tech = "materials=5;programming=3;biotech=5" @@ -328,18 +328,27 @@ holder = new /obj/item/weapon/gun/energy/laser/mounted(src) //BOX O' IMPLANTS + /obj/item/weapon/storage/box/cyber_implants - name = "boxed cybernetic implants" + name = "boxed cybernetic implant" desc = "A sleek, sturdy box." icon_state = "cyber_implants" + +/obj/item/weapon/storage/box/cyber_implants/New(loc, implant) + ..() + new /obj/item/device/autoimplanter(src) + if(ispath(implant)) + new implant(src) + +/obj/item/weapon/storage/box/cyber_implants/bundle + name = "boxed cybernetic implants" var/list/boxed = list(/obj/item/organ/internal/cyberimp/eyes/xray,/obj/item/organ/internal/cyberimp/eyes/thermals, /obj/item/organ/internal/cyberimp/brain/anti_stun, /obj/item/organ/internal/cyberimp/chest/reviver) var/amount = 5 -/obj/item/weapon/storage/box/cyber_implants/New() +/obj/item/weapon/storage/box/cyber_implants/bundle/New() ..() - var/i var/implant - for(i = 0, i < amount, i++) + while(contents.len <= amount + 1) // +1 for the autoimplanter. implant = pick(boxed) new implant(src) \ No newline at end of file diff --git a/code/modules/surgery/organs/autoimplanter.dm b/code/modules/surgery/organs/autoimplanter.dm new file mode 100644 index 00000000000..98d7867c8c8 --- /dev/null +++ b/code/modules/surgery/organs/autoimplanter.dm @@ -0,0 +1,35 @@ +/obj/item/device/autoimplanter + name = "autoimplanter" + desc = "A device that automatically injects a cyber-implant into the user without the hassle of extensive surgery. It has a slot to insert implants and a screwdriver slot for removing accidentally added implants." + icon_state = "autoimplanter" + item_state = "walkietalkie"//left as this so as to intentionally not have inhands + w_class = 2 + var/obj/item/organ/internal/cyberimp/storedorgan + +/obj/item/device/autoimplanter/attack_self(mob/user)//when the object it used... + if(!storedorgan) + user << "[src] currently has no implant stored." + return + storedorgan.insert(user)//insert stored organ into the user + user.visible_message("[user] presses a button on [src], and you hear a short mechanical noise.", "You feel a sharp sting as [src] plunges into your body.") + playsound(get_turf(user), 'sound/weapons/circsawhit.ogg', 50, 1) + storedorgan = null + +/obj/item/device/autoimplanter/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/organ/internal/cyberimp)) + if(storedorgan) + user << "[src] already has an implant stored." + return + if(!user.drop_item()) + return + I.forceMove(src) + storedorgan = I + user << "You insert the [I] into [src]." + else if(istype(I, /obj/item/weapon/screwdriver)) + if(!storedorgan) + user << "There's no implant in [src] for you to remove." + else + storedorgan.forceMove(get_turf(user)) + storedorgan = null + user << "You remove the [storedorgan] from [src]." + playsound(get_turf(user), 'sound/items/Screwdriver.ogg', 50, 1) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 0e35aef343d..48b97ed4c88 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -76,6 +76,8 @@ return ..() /obj/item/organ/internal/proc/prepare_eat() + if(robotic) + return //no eating cybernetic implants! var/obj/item/weapon/reagent_containers/food/snacks/organ/S = new S.name = name S.desc = desc diff --git a/code/modules/surgery/organs/subtypes/diona.dm b/code/modules/surgery/organs/subtypes/diona.dm index 8b9b2447b33..170f93ecddc 100644 --- a/code/modules/surgery/organs/subtypes/diona.dm +++ b/code/modules/surgery/organs/subtypes/diona.dm @@ -185,7 +185,7 @@ parent_organ = "groin" slot = "appendix" -/obj/item/organ/internal/eyes/diona +/obj/item/organ/internal/diona_receptor name = "receptor node" organ_tag = "eyes" icon = 'icons/mob/alien.dmi' diff --git a/code/modules/surgery/organs/subtypes/xenos.dm b/code/modules/surgery/organs/subtypes/xenos.dm index 133634bf489..a24bb94b5ed 100644 --- a/code/modules/surgery/organs/subtypes/xenos.dm +++ b/code/modules/surgery/organs/subtypes/xenos.dm @@ -150,7 +150,7 @@ name = "xeno resin organ"//...there tiger.... parent_organ = "mouth" icon_state = "liver-x" - slot = "hivenode" + slot = "spinner" origin_tech = "biotech=5;materials=4" alien_powers = list(/mob/living/carbon/alien/humanoid/proc/resin) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 3b5c68db550..004cea35e59 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -199,12 +199,12 @@ // Dethrall Shadowling // ////////////////////////////////////////////////////////////////// /datum/surgery/remove_thrall - name = "clense contaminations"//RENAME MEH - steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/open_encased/saw,/datum/surgery_step/open_encased/retract, /datum/surgery_step/internal/dethrall,/datum/surgery_step/glue_bone, /datum/surgery_step/set_bone,/datum/surgery_step/finish_bone,/datum/surgery_step/generic/cauterize) + name = "cleanse contaminations"//RENAME MEH + steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/open_encased/saw,/datum/surgery_step/open_encased/retract, /datum/surgery_step/dethrall,/datum/surgery_step/glue_bone, /datum/surgery_step/set_bone,/datum/surgery_step/finish_bone,/datum/surgery_step/generic/cauterize) possible_locs = list("head") /datum/surgery/remove_thrall/synth - name = "clense contaminations"//RENAME MEH + name = "cleanse contaminations"//RENAME MEH steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/internal/dethrall,/datum/surgery_step/robotics/external/close_hatch) possible_locs = list("chest") diff --git a/config/names/last.txt b/config/names/last.txt index 5b41e53aae8..99bb75aced8 100644 --- a/config/names/last.txt +++ b/config/names/last.txt @@ -502,7 +502,6 @@ Stamos Sagan Hawking Dawkins -Goebbles McShain McDonohugh Power @@ -617,4 +616,4 @@ Mikhaylov Pavlov Semenov Andreev -Alekseev \ No newline at end of file +Alekseev diff --git a/html/changelogs/AutoChangeLog-pr-3815.yml b/html/changelogs/AutoChangeLog-pr-3815.yml new file mode 100644 index 00000000000..d1e17047310 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3815.yml @@ -0,0 +1,4 @@ +author: taukausanake +delete-after: True +changes: + - rscadd: "Mice can now be picked up like diona" diff --git a/html/changelogs/AutoChangeLog-pr-3818.yml b/html/changelogs/AutoChangeLog-pr-3818.yml new file mode 100644 index 00000000000..982559d492d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3818.yml @@ -0,0 +1,6 @@ +author: Crazylemon64 +delete-after: True +changes: + - rscadd: "Science members now get compensated when they ship tech disks to centcomm." + - rscdel: "Science crew are no longer paid when they \"max\" research." + - bugfix: "Roboticists now get credit for making RIPLEYs and Firefighters" diff --git a/html/changelogs/AutoChangeLog-pr-3821.yml b/html/changelogs/AutoChangeLog-pr-3821.yml new file mode 100644 index 00000000000..10c4d49d537 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3821.yml @@ -0,0 +1,5 @@ +author: Crazylemon64 +delete-after: True +changes: + - tweak: "Slime people can now regrow limbs on a more lax nutrition requirement" + - tweak: "Enhances the nutripump+ to let slime people regrow limbs with it active" diff --git a/html/changelogs/AutoChangeLog-pr-3822.yml b/html/changelogs/AutoChangeLog-pr-3822.yml new file mode 100644 index 00000000000..8da4f8c5a22 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3822.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "Updates slot machines to have higher jackpots and more payouts with more interesting sounds" diff --git a/html/changelogs/AutoChangeLog-pr-3823.yml b/html/changelogs/AutoChangeLog-pr-3823.yml new file mode 100644 index 00000000000..e3a1489bb76 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3823.yml @@ -0,0 +1,5 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "Adds X-Ray, Thermal, Anti-tun, and Reviver implants to the nuke ops uplink (augments come with one auto-implanter) +rcsadd: Adds in augment auto-implanter, which inserts and implant without surgery" diff --git a/html/changelogs/AutoChangeLog-pr-3824.yml b/html/changelogs/AutoChangeLog-pr-3824.yml new file mode 100644 index 00000000000..5f786630679 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3824.yml @@ -0,0 +1,7 @@ +author: Tastyfish +delete-after: True +changes: + - tweak: "Vampire abilities are now in their own Vampire tab, as well being action buttons at the top, like spells." + - bugfix: "Cloning a vampire no longer makes them lose their abilities." + - bugfix: "Vampires can no longer hypnotize chaplains." + - bugfix: "Being a full vampire (500+ total blood) actually makes you immune to holy water reliably now." diff --git a/html/changelogs/AutoChangeLog-pr-3830.yml b/html/changelogs/AutoChangeLog-pr-3830.yml new file mode 100644 index 00000000000..c1de0d2a4e3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3830.yml @@ -0,0 +1,4 @@ +author: Fethas +delete-after: True +changes: + - bugfix: "Hopefully fixes issues with diona eyes" diff --git a/html/changelogs/AutoChangeLog-pr-3831.yml b/html/changelogs/AutoChangeLog-pr-3831.yml new file mode 100644 index 00000000000..c3577cfbfe7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3831.yml @@ -0,0 +1,6 @@ +author: FalseIncarnate +delete-after: True +changes: + - tweak: "Xeno-botany is now more user-friendly, and less random letters/numbers." + - rscadd: "Hydroponics now has a connector hooked up to the isolation tray and a new connector in their back room for those strange plants that like spewing plasma or eating nitrogen." + - rscadd: "You can now (finally) build the xeno-botany machines, and science can print off their respective boards." diff --git a/html/changelogs/AutoChangeLog-pr-3832.yml b/html/changelogs/AutoChangeLog-pr-3832.yml new file mode 100644 index 00000000000..4e07ac83591 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3832.yml @@ -0,0 +1,7 @@ +author: monster860 +delete-after: True +changes: + - rscadd: "Mining station now has a podbay." + - rscadd: "Ore scooping module for the spacepod." + - rscadd: "Three mining lasers for spacepod: Basic, normal, and burst." + - bugfix: "Shooting weapons south or west of spacepod will actually hit adjacent targets now, and won't shoot through walls anymore." diff --git a/html/changelogs/AutoChangeLog-pr-3833.yml b/html/changelogs/AutoChangeLog-pr-3833.yml new file mode 100644 index 00000000000..9759e315f4a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3833.yml @@ -0,0 +1,4 @@ +author: Fethas +delete-after: True +changes: + - bugfix: "Though shalt not eat robotic organs..including cybernetic implants.." diff --git a/html/changelogs/AutoChangeLog-pr-3834.yml b/html/changelogs/AutoChangeLog-pr-3834.yml new file mode 100644 index 00000000000..66bf318663c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3834.yml @@ -0,0 +1,4 @@ +author: Fethas +delete-after: True +changes: + - bugfix: "ITS SURGERY_STEP/DETHRALL NOT SURGERY_STEP/INTERNAL/DETHRALL" diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 6cbf4105276..37026b153be 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 3ec5db973f5..225f1b19ed3 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/nano/templates/botany_isolator.tmpl b/nano/templates/botany_isolator.tmpl index 610fdd5116a..a5efbc4a212 100644 --- a/nano/templates/botany_isolator.tmpl +++ b/nano/templates/botany_isolator.tmpl @@ -26,10 +26,10 @@ Used In File(s): \code\modules\hydroponics\seed_machines.dm {{for data.geneMasks}}
- {{:value.mask}} + {{:value}}
- {{:helper.link('Extract', 'arrow-circle-down', {'get_gene' : value.tag}, null)}} + {{:helper.link('Extract', 'arrow-circle-down', {'get_gene' : value}, null)}}
{{empty}} diff --git a/paradise.dme b/paradise.dme index ee6fd270e8b..5aacb4a45d5 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1872,6 +1872,7 @@ #include "code\modules\surgery\tools.dm" #include "code\modules\surgery\organs\augments_eyes.dm" #include "code\modules\surgery\organs\augments_internal.dm" +#include "code\modules\surgery\organs\autoimplanter.dm" #include "code\modules\surgery\organs\blood.dm" #include "code\modules\surgery\organs\body_egg.dm" #include "code\modules\surgery\organs\helpers.dm" diff --git a/sound/goonstation/misc/airraid_loop.ogg b/sound/goonstation/misc/airraid_loop.ogg new file mode 100644 index 00000000000..820eaccf91d Binary files /dev/null and b/sound/goonstation/misc/airraid_loop.ogg differ diff --git a/sound/goonstation/misc/bell.ogg b/sound/goonstation/misc/bell.ogg new file mode 100644 index 00000000000..107003e9252 Binary files /dev/null and b/sound/goonstation/misc/bell.ogg differ diff --git a/sound/goonstation/misc/klaxon.ogg b/sound/goonstation/misc/klaxon.ogg new file mode 100644 index 00000000000..3526061ae97 Binary files /dev/null and b/sound/goonstation/misc/klaxon.ogg differ