diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 15316a97224..e9974435ba9 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -5221,7 +5221,7 @@ "bWu" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/examroom,/turf/simulated/floor/plating,/area/medical/sleeper) "bWv" = (/turf/simulated/wall/r_wall,/area/crew_quarters/fitness{name = "\improper Arcade"}) "bWw" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper) -"bWx" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper) +"bWx" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/sleeper) "bWy" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/cryo) "bWz" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2) "bWA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2) @@ -5282,8 +5282,8 @@ "bXD" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/sleeper) "bXE" = (/obj/item/roller,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/sleeper) "bXF" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/machinery/sleeper{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/sleeper) -"bXG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/sleeper) -"bXH" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/sleeper) +"bXG" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/sleeper) +"bXH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper) "bXI" = (/obj/machinery/vending/medical,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/sleeper) "bXJ" = (/obj/structure/table,/obj/item/reagent_containers/syringe/antiviral,/obj/item/reagent_containers/syringe/charcoal,/obj/item/reagent_containers/syringe/insulin,/obj/item/reagent_containers/glass/bottle/morphine,/obj/item/reagent_containers/glass/bottle/epinephrine,/obj/item/reagent_containers/syringe,/obj/item/stack/medical/bruise_pack/advanced{pixel_x = 6; pixel_y = 6},/obj/item/stack/medical/ointment/advanced{pixel_x = 6; pixel_y = 8},/obj/item/reagent_containers/food/pill/patch/styptic{pixel_y = 6},/obj/item/reagent_containers/food/pill/patch/styptic{pixel_x = 2; pixel_y = 8},/obj/item/reagent_containers/food/pill/patch/silver_sulf{pixel_x = -8; pixel_y = 6},/obj/item/reagent_containers/food/pill/patch/silver_sulf{pixel_x = -8; pixel_y = 8},/obj/item/storage/pill_bottle/painkillers{pixel_x = -6; pixel_y = -3},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/sleeper) "bXK" = (/obj/item/twohanded/required/kirbyplants,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/cryo) @@ -5361,13 +5361,13 @@ "bZe" = (/obj/machinery/camera{c_tag = "Gravity Generator Foyer"; dir = 1; network = list("SS13")},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/closet/radiation,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light,/turf/simulated/floor/plasteel,/area/engine/gravitygenerator) "bZf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; name = "Genetics"; sortType = 23},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/genetics_cloning) "bZg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) -"bZh" = (/obj/structure/table,/obj/item/roller,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/soap/nanotrasen,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/sleeper) -"bZi" = (/obj/structure/closet/crate/freezer,/obj/item/reagent_containers/blood/empty,/obj/item/reagent_containers/blood/empty,/obj/item/reagent_containers/blood/AMinus,/obj/item/reagent_containers/blood/APlus,/obj/item/reagent_containers/blood/BMinus,/obj/item/reagent_containers/blood/BPlus,/obj/item/reagent_containers/blood/OMinus,/obj/item/reagent_containers/blood/OPlus,/obj/item/reagent_containers/blood/random,/obj/item/reagent_containers/blood/random,/obj/item/reagent_containers/blood/random,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/sleeper) -"bZj" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/sleeper) -"bZk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hologram/holopad,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/sleeper) -"bZl" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/sleeper) +"bZh" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/sleeper) +"bZi" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/sleeper) +"bZj" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 0},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/sleeper) +"bZk" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper) +"bZl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hologram/holopad,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper) "bZm" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/sleeper) -"bZn" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/sleeper) +"bZn" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper) "bZo" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/cryo) "bZp" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/cryo) "bZq" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/cryo) @@ -5433,14 +5433,14 @@ "cay" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/table,/turf/simulated/floor/plasteel,/area/engine/break_room) "caz" = (/obj/structure/sign/poster/random{pixel_x = -32; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/sleeper) "caA" = (/turf/simulated/wall,/area/medical/sleeper) -"caB" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 4; icon_state = "left"; name = "Blood Transfusion Ward"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper) +"caB" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper) "caC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper) -"caD" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/sleeper) +"caD" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper) "caE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper) -"caF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/sleeper) -"caG" = (/obj/effect/landmark/start{name = "Medical Doctor"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/sleeper) +"caF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper) +"caG" = (/obj/effect/landmark/start{name = "Medical Doctor"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper) "caH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/sleeper) -"caI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/sleeper) +"caI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper) "caJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/cryo) "caK" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/cryo) "caL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/cryo) @@ -5480,7 +5480,7 @@ "cbt" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 4; location = "Medbay"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor/plating,/area/medical/sleeper) "cbu" = (/obj/structure/lamarr,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor) "cbv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cbw" = (/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/sleeper) +"cbw" = (/obj/structure/table,/obj/item/roller,/obj/item/soap/nanotrasen,/turf/simulated/floor/plasteel{dir = 10; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/sleeper) "cbx" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration) "cby" = (/obj/machinery/computer/shuttle/admin,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration) "cbz" = (/obj/machinery/door/airlock/centcom{id_tag = "adminshuttle"; name = "Bridge"; opacity = 1; req_access_txt = "106"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration) @@ -5510,7 +5510,7 @@ "cbX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (EAST)"; icon_state = "pipe-j1"; dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/south) "cbY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/south) "cbZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south) -"cca" = (/obj/structure/closet/crate/freezer,/obj/item/reagent_containers/blood/empty,/obj/item/reagent_containers/blood/empty,/obj/item/reagent_containers/blood/AMinus,/obj/item/reagent_containers/blood/APlus,/obj/item/reagent_containers/blood/BMinus,/obj/item/reagent_containers/blood/BPlus,/obj/item/reagent_containers/blood/OMinus,/obj/item/reagent_containers/blood/OPlus,/obj/item/reagent_containers/blood/random,/obj/item/reagent_containers/blood/random,/obj/item/reagent_containers/blood/random,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/sleeper) +"cca" = (/obj/structure/closet/crate/freezer,/obj/item/reagent_containers/blood/empty,/obj/item/reagent_containers/blood/empty,/obj/item/reagent_containers/blood/AMinus,/obj/item/reagent_containers/blood/APlus,/obj/item/reagent_containers/blood/BMinus,/obj/item/reagent_containers/blood/BPlus,/obj/item/reagent_containers/blood/OMinus,/obj/item/reagent_containers/blood/OPlus,/obj/item/reagent_containers/blood/random,/obj/item/reagent_containers/blood/random,/obj/item/reagent_containers/blood/random,/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/sleeper) "ccb" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south) "ccc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/item/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south) "ccd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel,/area/hallway/primary/central/south) @@ -5520,15 +5520,15 @@ "cch" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south) "cci" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south) "ccj" = (/obj/machinery/camera{c_tag = "Central Primary Hallway South"; dir = 2; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central/south) -"cck" = (/obj/machinery/iv_drip,/obj/machinery/ai_status_display{pixel_y = -32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/sleeper) +"cck" = (/obj/structure/closet/crate/freezer,/obj/item/reagent_containers/blood/empty,/obj/item/reagent_containers/blood/empty,/obj/item/reagent_containers/blood/AMinus,/obj/item/reagent_containers/blood/APlus,/obj/item/reagent_containers/blood/BMinus,/obj/item/reagent_containers/blood/BPlus,/obj/item/reagent_containers/blood/OMinus,/obj/item/reagent_containers/blood/OPlus,/obj/item/reagent_containers/blood/random,/obj/item/reagent_containers/blood/random,/obj/item/reagent_containers/blood/random,/obj/machinery/iv_drip,/obj/machinery/ai_status_display{pixel_y = -32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/sleeper) "ccl" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/south) "ccm" = (/obj/machinery/door/airlock/public/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) "ccn" = (/obj/machinery/atm{pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) "cco" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) "ccp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) -"ccq" = (/obj/machinery/camera{c_tag = "Medbay Treatment Center"; dir = 1; network = list("SS13"); pixel_x = 0},/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/sleeper) +"ccq" = (/obj/machinery/camera{c_tag = "Medbay Treatment Center"; dir = 1; network = list("SS13"); pixel_x = 0},/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/obj/item/roller,/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/sleeper) "ccr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) -"ccs" = (/obj/machinery/sleeper{dir = 4},/obj/item/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/medical/sleeper) +"ccs" = (/obj/machinery/sleeper{dir = 4},/obj/item/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/sleeper) "cct" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/sleeper) "ccu" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/sleeper) "ccv" = (/obj/machinery/light{dir = 4},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/body_scanconsole,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/sleeper) @@ -5978,8 +5978,8 @@ "ckX" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/surgery1) "ckY" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/plasteel{dir = 10; icon_state = "darkblue"},/area/medical/ward) "ckZ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/ward) -"cla" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkblue"},/area/medical/ward) -"clb" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel{dir = 6; icon_state = "darkblue"},/area/medical/ward) +"cla" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/ward) +"clb" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plasteel{dir = 6; icon_state = "darkblue"},/area/medical/ward) "clc" = (/obj/machinery/bodyscanner,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/surgery2) "cld" = (/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/surgery2) "cle" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/light_switch{pixel_x = 23; pixel_y = -5},/obj/machinery/holosign_switch{id = "surgery2"; pixel_x = 23; pixel_y = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/surgery2) @@ -6042,7 +6042,7 @@ "cmj" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the singularity chamber."; dir = 8; layer = 4; name = "Singularity Engine Telescreen"; network = list("Singularity"); pixel_x = 0; pixel_y = 30},/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel,/area/engine/controlroom) "cmk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cml" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre Storage"; req_access_txt = "45"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/medical/surgery1) -"cmm" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/medical/glass{id_tag = ""; name = "Medbay Virology Lobby"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology/lab{name = "\improper Virology Lobby"}) +"cmm" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/medical/glass{id_tag = null; name = "Virology Lobby Hallway"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/virology/lab{name = "\improper Virology Lobby"}) "cmn" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/medical/virology/lab{name = "\improper Virology Lobby"}) "cmo" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/medical/virology/lab{name = "\improper Virology Lobby"}) "cmp" = (/obj/machinery/vending/medical,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (NORTHEAST)"; icon_state = "whitegreen"; dir = 5},/area/medical/virology/lab{name = "\improper Virology Lobby"}) @@ -6104,8 +6104,8 @@ "cnt" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/apmaint) "cnu" = (/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/carpet,/area/ntrep) "cnv" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/wood,/area/blueshield) -"cnw" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology/lab{name = "\improper Virology Lobby"}) -"cnx" = (/turf/simulated/floor/plasteel{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/medical/virology/lab{name = "\improper Virology Lobby"}) +"cnw" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical/glass{id_tag = null; name = "Virology Lobby Hallway"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/ward) +"cnx" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology/lab{name = "\improper Virology Lobby"}) "cny" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "cnz" = (/obj/structure/sign/biohazard{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"; tag = "icon-whitegreen (WEST)"},/area/medical/virology/lab{name = "\improper Virology Lobby"}) "cnA" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) @@ -6505,7 +6505,7 @@ "cve" = (/obj/item/assembly/timer,/obj/item/assembly/timer{pixel_x = 6},/obj/item/assembly/timer{pixel_x = -5; pixel_y = 6},/obj/structure/table,/obj/item/assembly/timer{pixel_x = -3; pixel_y = -4},/obj/item/assembly/timer{pixel_x = 8; pixel_y = 8},/obj/item/assembly/timer,/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/light,/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "cvf" = (/obj/machinery/atmospherics/trinary/mixer{density = 0; dir = 8; req_access = null},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "cvg" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/item/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) -"cvh" = (/obj/item/radio/beacon,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel/airless,/area/toxins/test_area) +"cvh" = (/obj/item/radio/beacon,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel/airless/indestructible,/area/toxins/test_area) "cvi" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "cvj" = (/obj/machinery/mass_driver{dir = 4; id_tag = "toxinsdriver"},/turf/simulated/floor/plating,/area/toxins/launch{name = "Toxins Launch Room"}) "cvk" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/apmaint) @@ -7170,6 +7170,7 @@ "cHT" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/engine/break_room) "cHU" = (/obj/structure/sign/securearea,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/wall,/area/engine/break_room) "cHV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/atmos/control) +"cHW" = (/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology/lab{name = "\improper Virology Lobby"}) "cHY" = (/obj/machinery/computer/general_air_control{frequency = 1441; name = "Tank Monitor"; sensors = list("n2_sensor" = "Nitrogen", "o2_sensor" = "Oxygen", "co2_sensor" = "Carbon Dioxide", "tox_sensor" = "Toxins", "n2o_sensor" = "Nitrous Oxide", "waste_sensor" = "Gas Mix Tank")},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel,/area/atmos/control) "cHZ" = (/obj/machinery/kitchen_machine/grill,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cIa" = (/obj/machinery/cooker/deepfryer,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -8972,10 +8973,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIbVebVfbVgbVhbVibRGbVkbRAbVlbRAbRAbRAbRAbRAbTlbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebVmbOcbOcbOcbVnbOebPTbKBbKBbVobKzbPPbKzbKzbKzbKzbKzbJfbKAbTsbVpbxbbVrbBnbVqbVsbBnbVwbzEbBnbBnbVtbDXbOwbTybTzbRVbRWbMGbVubVvbVybVxbVzbMHbVBbVAbVDbVCbHsbVEbVFbHsbHtbHtbVGbSibVIbVHbVKbVJbVLbVLbVNbVMbVObFObSMbSLbSObSNbSPcrAcrAcrAcrAcrAbSRbSQbSUbSSbSVbXAbSXbRtbXAbThbXAbJRcuobJSbTZbTYbUabUabUcbUbbWgbUdbUfbUdbWibWibWjbWjbWjbWjbIabIabIabIabIabWlbWnbLIbIabNVbNZbNXbWqbWqbPibOabLRctvbPkbPjcacbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWObWGbRAbRAbWHbWHbWHbRGbRAbRAbRGbWIbWJbWKbRAbWMbWNbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbWPbTrbTqbTrbPUbWQbWRbKzbKzbKzbWQbKzbJfbKAbTsbWSbxbbWWbBnbzFbQdbBnbzJbLJbBnbBnbWUbDXbOwbTybWVbRVbWXbMGbXbbWYbWZbXabXdbMHbXcbXebXgbXfbXibXhbXjbFCaaaaaaaaabSibXpbXkbXlbXlbXmbXnbXobSibXrbXqbUhbUgbUjbUibUrbUkbUnbUmbUmbUmbUpbUobUmbUmbUqbUmbUmbUsbUnbUmbUmbUGbNubNtbUwbUvbUBbUybZfbUDbXNbUIbUIbUIbUJbWgbLRbUPbWqbWqbXYbXXbWqbXZbYbbYabYdbYcbWqbPlbYgbYfbYibYhbYlbYjbYjbYjbYjbYjcacbGjbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYubWGbRAbRAbRAbRAbRAbYtbRAbRAbRGbPIbPIbPIbPIbPIbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbYxbYwbYybYwbYAbYzbYBbYBbYBbYBbYBbYCbYEbYDbTsbYFbxbbYGbYIbYHbYNbYJbYKbYLbYLbYLbYMbYMbYObTybYRbYQbRWbMGbYTbYSbYVbVvbYWbMHbYUbYXbZdbTJbZebQmbYYbFCaaaaaaaaabSibYZbZabZbbZcbXmbXnbXobSibZgbZJbURbUQbUTbUScyTcyTbUVbUUbUXbUWcyTbUYbUZbUZbVabUZbUZbUSbUVbUZbVcbVbbVdcyTbVPbVjbVRbVQbVTbVSbVVbVUbVXbVWbVZbVYbWcbWbbWcbWcbWebUNbZMbUNbZNbUNbZPbZObZObPCbPDbZRbZUbZTbZXbZVbGkbZWaYpbYjcacbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIcafcagcahcaibRAbRGbRAbRAbRGbRAcancakcaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbOebPTbKBbKBbxbbxbbKBbKBbKBbKBbKBbxbbxbbKBbKBbKBbxbcamcamcamcascambYMcaocapcaqcatbYMbOwbTycawbMEbMEbMGbMGbMGbMGbMGbMNbMHbTJbTIcaubTJcavcaxbFCbFCbFCbFCbFCbSibSjbSibSibSibSibSibSibSibNvbFObWfbSLbWkbWhbWobWmbWscaAbWubWtbWxbWwbWtbWubWabWybWabWybWabWybWabWzbWAcrAbTZbWBbWDbWCbWFbWEbXNbXsbXubXtbXvcbdcbdcbecbdcbfcbicbfcbfcbfcbhcblcbjcbjcbkcbmcbocbnbZUcbpcbrcbqbGlcbscbubYjcacbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPIbPIbPIbPIbPIbPIbRGbTobRAcbzbRAcbxcbycbAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbDcbBbOccbCbOccbEcbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbGaabaaaaaaaaaaaacamcbIcbHcbKcbJbYMcbNcbLcbMcbRbYMbOwbTycbOcbPcbQbXwcbVcbTcbUcbWcbYcbXbXxcbZcccccbccfccdcceccgccjcchccibXybXzcclccmbEnccnbFOccoccpccrbFObXBbQVbXCcaAcaAbXDbXDcaAbXFbXEbXHbXGbXJbXIbWabXKbXMbXLbXMbXObWabXPbWAbXRbWdbXSbXUbXTbXSbXSbWibXVbXWbXQbYkcbdccTccSccVccUccXccWcdbcbfccYccZcdacbjcbjcdccbocddcdfbPEcdhcdgbGmcdicdkbYjcdndfcbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIcdlcdmcdpcdlcdobRGbRAbRAbRGbRAcdrcdqcdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdvcdtcducducducdtcdwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacamcdycdxcdAcdzbYLcdBcdDcdCcdEbYMbOwbNwcdFbTybTybYmbYncdIcdJcclcdObYobYpcdMcdNcdNcdQcdPcdRcdNcdNcdTcdNcdNcdScclccmbEncdVcdUcdXbYqcdZcdYbFOchfbYrcaAbZhbYsbYsbZibZjbXHbZlbZkbZnbZmbZpbZobZrbZqbZtbZsbZvbZubWAcuvchrbZwbZybZxbZAbZzbZBccQbXWbXQbZBcbdcezceyceBceAceDceCceGcbfceEccZceFceFcbjceHceJceIceLceKceNceMbGnceOceSbYjcaccLhbGpbGobGsaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWObWGceRceRceRceRceRceTbRAbRAbRGbPIbPIbPIbPIbPIbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceVceUceUceUceWaaaaaaaaaaaaaaaaaaaaaceXceZceYceZcfaaaaaaaaaacamcamcamcffcfbcdAcfcbYLcfdcbMcfecfgbYMbOwbNxbTicficflcfkbZDbZCbZFbZEbZHbZGbZIcfscftcftcfxcfvcfvcfvcfvcfvcfvcfvcJfcfycfzcfBbZLbZKbZYbZScabcaacadchfcajcaAcazcalcaCcaBcaEcaDcaGcaFcaIcaHcaKcaJcaMcaLcaOcaNbZvcaPcaQcuvbZzcaRcaTcaScaVcaUcaXcaWcaZcaYcaXcbdcgccgbcgecgdcghcgfcggcbfcgiccZceFceFcbjcgjcgmcgkcglcgncgpcgocgrcgqcgvbYjcaccgscgtcgscgucgycgucgucguaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIcafcagcahcaibRAbRGbRAbRAbRGbRAcancakcaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOebOcbOcbOcbOcbOcbOebPTbKBbKBbxbbxbbKBbKBbKBbKBbKBbxbbxbbKBbKBbKBbxbcamcamcamcascambYMcaocapcaqcatbYMbOwbTycawbMEbMEbMGbMGbMGbMGbMGbMNbMHbTJbTIcaubTJcavcaxbFCbFCbFCbFCbFCbSibSjbSibSibSibSibSibSibSibNvbFObWfbSLbWkbWhbWobWmbWscaAbWubWtbWxbWwbXGbWubWabWybWabWybWabWybWabWzbWAcrAbTZbWBbWDbWCbWFbWEbXNbXsbXubXtbXvcbdcbdcbecbdcbfcbicbfcbfcbfcbhcblcbjcbjcbkcbmcbocbnbZUcbpcbrcbqbGlcbscbubYjcacbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPIbPIbPIbPIbPIbPIbRGbTobRAcbzbRAcbxcbycbAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbDcbBbOccbCbOccbEcbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbGaabaaaaaaaaaaaacamcbIcbHcbKcbJbYMcbNcbLcbMcbRbYMbOwbTycbOcbPcbQbXwcbVcbTcbUcbWcbYcbXbXxcbZcccccbccfccdcceccgccjcchccibXybXzcclccmbEnccnbFOccoccpccrbFObXBbQVbXCcaAcaAbXDbXDcaAbXFbXEbZhbXHbZibXIbWabXKbXMbXLbXMbXObWabXPbWAbXRbWdbXSbXUbXTbXSbXSbWibXVbXWbXQbYkcbdccTccSccVccUccXccWcdbcbfccYccZcdacbjcbjcdccbocddcdfbPEcdhcdgbGmcdicdkbYjcdndfcbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPLbPIcdlcdmcdpcdlcdobRGbRAbRAbRGbRAcdrcdqcdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdvcdtcducducducdtcdwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacamcdycdxcdAcdzbYLcdBcdDcdCcdEbYMbOwbNwcdFbTybTybYmbYncdIcdJcclcdObYobYpcdMcdNcdNcdQcdPcdRcdNcdNcdTcdNcdNcdScclccmbEncdVcdUcdXbYqcdZcdYbFOchfbYrcaAbZjbYsbYsbXJbZhbZkbZnbZlcaBbZmbZpbZobZrbZqbZtbZsbZvbZubWAcuvchrbZwbZybZxbZAbZzbZBccQbXWbXQbZBcbdcezceyceBceAceDceCceGcbfceEccZceFceFcbjceHceJceIceLceKceNceMbGnceOceSbYjcaccLhbGpbGobGsaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWObWGceRceRceRceRceRceTbRAbRAbRGbPIbPIbPIbPIbPIbPIbPRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceVceUceUceUceWaaaaaaaaaaaaaaaaaaaaaceXceZceYceZcfaaaaaaaaaacamcamcamcffcfbcdAcfcbYLcfdcbMcfecfgbYMbOwbNxbTicficflcfkbZDbZCbZFbZEbZHbZGbZIcfscftcftcfxcfvcfvcfvcfvcfvcfvcfvcJfcfycfzcfBbZLbZKbZYbZScabcaacadchfcajcaAcazcalcaCcaEcaEcaDcaGcaFcaIcaHcaKcaJcaMcaLcaOcaNbZvcaPcaQcuvbZzcaRcaTcaScaVcaUcaXcaWcaZcaYcaXcbdcgccgbcgecgdcghcgfcggcbfcgiccZceFceFcbjcgjcgmcgkcglcgncgpcgocgrcgqcgvbYjcaccgscgtcgscgucgycgucgucguaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYubWGceRceRceRcgwcgxbRGbRAbRAbRGbRAbRAbRAcgzbRAcgAbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgFcgBcgCcgDcgFbYPbYPbYPcamcgHcgGcgJcgIcgLcgKcgNcgMcgOcgOcgPbYMbTkcgQcgTcgScgScgUcbacgVcgScgWcgWcgYcbbcgZcgWcgWchacclcclchechcchcchcchccbcchcchcchfcbgchfchfchfchfchfchfchfcbvcbtcbScbwcckccaccsccqccucctccwccvbWaccxcczccyccBccAccDccCccEcuvccGccFccIccHccJchrbWibWgbWgbWgbWicbdcbdchMchQchOchPchOchRcbfchUchSchTchTcbjchVchXbTwbYjbYjbYjbYjbYjbYjbYjbYjcaccgscifchYchZciaciacibcguaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcicciccicciccidcidcieciecieciecijaabaabaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIcigceRceRcihciibRGbRAbRAcikbRAbRAbRAciobRAcilbRGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceYcimcincimceYbYPcipciqcamcitcfbcircisciyciubYMcivciwcixcizbYMcgQcgQciCcgSciAciBccKciDciHcgWccLciGccMciIciKcgWciMciLciNchcccOccNccRccPcdjcdecdKcdHcdLchfceacdWceccebchfcedcbvcaAcaAcaAcaAcaAcaAcaAcefceecegcaAcDfcDfcDfcDfcDfcDfcDfcDfceicehccGcejcelcekcencemcepceocerceqclpcjFcjHcjGcjIcjGcjGcjLcjJcjKcjPcjMcjNcjOcbjcjQbUtcbnbPtbGGcjTcjScjUcjUcjScjUcjYcgscjVcjWchZciackecjXcguaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccjZckacjZcidciecieckbckcckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIckdceRceRckfbRGbRAbRAbRGckgbRAbRAckjckhbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgFckicimcimckkcklcfbcfbckmckncfbcfbcisckqckobYMbYMbYMbYMbYMbYMckpcgQciCcgSclRcesceucetckucgWckvcevcexcewcePcgWcfmceQcfnchccfpcfockHckGcfqckIchcchfdgCchfcebcebcfrcebchfcsLcbvchfcfwbUucfCcfAcfEcfDcfGcfFcfIcfHcfKcfJcfMcfLcDfcfNcfPcfOcfRcfQcfTcfScfVcfUcfXcfWcepcfYcgacfZclpclncjGcjGclmclocjGcltclpcbjclqccZclrclrcbjcbmclscbnbPtcgsclvcgscgscgscgscgscgscgscluclwcguclxclzclycguafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOclBcjZcjZclAciecieckbckbclHckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8983,8 +8984,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIbPIbPIbPIbPIbPIbPIbPIbPIbPIbYvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabafOcgQcngcngcgQcngcngcgQaaaaaacgFcnhcnicnjcgFbYPbYPbYPcamcnmcnlcnocnocnocamcamcgQcnncnpcnrcnqcgQcnscntcgSclRcktcktcktcnvcgWckvckwckwcnuchHcgWcpicHDcnAchcchcchcchcchcchIchcchccnCdgCcsLcsLcsLchfcABchJcsLcbvchfchLchKciEchNcfEciFcfGcfFcfIcfHciOciJciQciPcDfciRciScDfciUciTchrciVciXciWchrchrcepciYcjaciZclpcjbcodcoicoicoicodcogcodcodcohcojclrclrcbjcokclscbncomcolcooconcorcopcoqcoqcotcoscovcoucoxcowcozcoycoCcoAcoBcoDcoEcoFcoHcoGcoIaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaacidciecoMcoJcoJckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacgQcoKcoLcgQcoKcoLcgQaaaaaacoOceZcoNceZcoQaaaaabaaacamcamcamcamcamcamcamcoPcgQcoScoRcoUcoTclPcoVcoWcgScoYcoXcpfcktcjccgWcjdckwcjfcjecjgcgWcjicjhcjkcjjcpqcpqcpqcpqcjlcpmcppcpocjncjmcjmcjocjqcjpcjscjrcjtchfcjwcjucjycjxcjAcjzcjCcjBcjCcjDckrcjEckxcksckzckyckAcDfckBcuvckCcjvckDcmDckFckEciYckJckLcgacpRcpTcpRcpUcpWcpVcpRcpXcpYcodcqacpZcdacbjcbjcqccqbcqfcqdcqecqicqgcqhcqlcqjcqkcqncqmcqpcqocqtcqqcqrcqqcqscqrcqrcqucqwcqvcqycqxcqCaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacieciecqDckbckbckbckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOaaaafOcgQcqzcoLcgQcqzcoLcgQaaaaaaaabaabaabaabaabaabaabaabaabcgQcoLcqAcqBcgQcqEcqGcgQcqHcgQcgQcqFcgQcgQcqPcgScqRcqIcqJcqKcqLcgWckMcqOcqScqQcqTcgWckOckNckPcJZcsDcsDcsDcsDcsDcrdcqZcrackQchfcucckRcsLckSckTcsLcsKchfckVckUckXckWcCWckYclackZclbcDfcldclcclfclecDfcDfcDfcDfclhclgckCchCcljclicllclkciYcmdcgacmfcpRcrNcrQcrLcrMcrLcrTcrOcrPcodcbjcrUcbjcbjcrRcrSclsbLRbPtcgscrVcgscgscrWcrYcrXcsacrZcsdcsbcsfcsecsgcsecsgcshcsgcsicgEcsncvdcsqcsraabaabaabaabaabaabaabaabaaaaaaaaaaaaaaacieckbckbckbckbckbckbcssckbcstckbckbckbckbckbciecieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcsjafOaabaMraMrafOcgQcgQcqFcgQcgQcqFcgQcgQcgQcngcngcngcgQcgQcgQcgQcgQcgQcgQcoLcskcslcgQcsmcgQcgQcsucgQcsocspcoLcgQcsvcgScsycsxcszclRcmgcgWcswckvcsEcsCcmhcgWcsIcsHcmicsDcsDcsGcsOcsNcmjcsQcsJcsKcsLcsUchfcmkcsLckSckTchfchfchfcCWcCWcmlcCWcCWcxhcxhcmmcxhcDfcDfcDfcDfcDfcDfcmncmpcmocmrcmqcmtcmscmvcmucmxcmwciYcgacgaaqEcpRcttctxctwctyctwctActzcrLctuctvctBbLRctCbLRcrSclsbLRbIictFctHctGcgscgscgscgscgsctIcqkctKctDcsccqkctEcqkclucqkctLcgEctOctQctPcgEaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaciectJctJctJctJctJctJctSckbctTctJcstckbckbckbckbcieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafOafOcngcoLcoLcoLcoLctMctNcoLcoLcoSctUctUctVctUctUctUctUctUctUctUctUctUctUctUctUcoRcgQcskcqzctWcgQcsvctRctRctRctRctRctRcgWcgWcgWcgWcgWcgWcgWcuactXcmBcmzcmEcmCcmFcmFcmGcuicsJcmHcsLcubcuccmIcsLckScmJchicsLcsLcsKcCWcmLcmKcmNcCWcnxcnwcnBcnzcnEcnDcnGcnFcnIcnHcnKcnJcnMcnLckCcnNcnPcnOcnRcnQciYbQXcgacgacpRcuGcnTcnScnUcrLcuKcuJcuOcuLcuScuRcuVbLRcuXcrSclscuMbIibPAcuNcuYcuPcuQbGGbGGcgscvccvecuTcuUcvfcuWcvgcvicuZcvacvbcgEcvjdoKdoFcvraaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaacvscjZcjZcjZcjZcjZcjZcjZcvhcvtckbckbckbckbcvvckccieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcsjafOaabaMraMrafOcgQcgQcqFcgQcgQcqFcgQcgQcgQcngcngcngcgQcgQcgQcgQcgQcgQcgQcoLcskcslcgQcsmcgQcgQcsucgQcsocspcoLcgQcsvcgScsycsxcszclRcmgcgWcswckvcsEcsCcmhcgWcsIcsHcmicsDcsDcsGcsOcsNcmjcsQcsJcsKcsLcsUchfcmkcsLckSckTchfchfchfcCWcCWcmlcCWcCWcxhcnwcmmcxhcDfcDfcDfcDfcDfcDfcmncmpcmocmrcmqcmtcmscmvcmucmxcmwciYcgacgaaqEcpRcttctxctwctyctwctActzcrLctuctvctBbLRctCbLRcrSclsbLRbIictFctHctGcgscgscgscgscgsctIcqkctKctDcsccqkctEcqkclucqkctLcgEctOctQctPcgEaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaciectJctJctJctJctJctJctSckbctTctJcstckbckbckbckbcieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafOafOcngcoLcoLcoLcoLctMctNcoLcoLcoSctUctUctVctUctUctUctUctUctUctUctUctUctUctUctUcoRcgQcskcqzctWcgQcsvctRctRctRctRctRctRcgWcgWcgWcgWcgWcgWcgWcuactXcmBcmzcmEcmCcmFcmFcmGcuicsJcmHcsLcubcuccmIcsLckScmJchicsLcsLcsKcCWcmLcmKcmNcCWcHWcnxcnBcnzcnEcnDcnGcnFcnIcnHcnKcnJcnMcnLckCcnNcnPcnOcnRcnQciYbQXcgacgacpRcuGcnTcnScnUcrLcuKcuJcuOcuLcuScuRcuVbLRcuXcrSclscuMbIibPAcuNcuYcuPcuQbGGbGGcgscvccvecuTcuUcvfcuWcvgcvicuZcvacvbcgEcvjdoKdoFcvraaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaacvscjZcjZcjZcjZcjZcjZcjZcvhcvtckbckbckbckbcvvckccieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafOaabaabafOcngcvkcvlcvmcoLcoLcvncoLcoLcsucgQcgQcgQcgQcgQcgQcqFcgQcgQcgQcgQcvocvocvocvocvocvocvocvocvocgQcsvcvpaaaaaaaaaaaacvqcvwcvzcvycvucvAcvDcvxcvJcvGcvKcvBcvCcvLcvEcvEcvFcvMcvHcvIcvIcvIcvIcvNcvIckScmJchfcnVcKOdercCWcnXcnWcnZcnYcobcoacoccoccofcoecpacoZcpccpbcpecpdcphcpgciYciYciYciYciYciYciYciYcpkcpjcpRcwjcplcwqcptcpncpvcpucpRcpRbIicwpbIibIibIicwvcwJcwwbIibGGcuNcwKcwucuQcuQcuQcgscgscgscgscgscgscgscgscgscgscgscgscgEcgEcgEcgEcgEaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaciecoJcoJcoJcoJcoJcoJcwLckbcoMcoJcwMckbckbckbckbcieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcgQcwxcwxcwxcwxcwxcwxcwycwxcsucwzcgQcoLcwAcwBcwCcoLcwCcwDcwEcwBcvocwFcwFcvocwGcvocwHcwIcvocoLcqPcngaaacwPcwUcwQcwVcwNcwOcwWcwXcwRcwScwTcwZcwYcxbcxacxdcxccxfcxecxjcxgcvHcxkcxmcxmcxmcxocvIckScmJchfdgmcQkcQkcQkcQkcpwcpxcQkcpycpycpycpycQkcpzcpBcpAcQkcQncQncpCcpDcuocukbQXbQXcpEbQXbQXbQXbQXbQXcpFcpRcpRcpRcpRcpGcpRcpRcpRcxIcpHcpIcxKcxUcxMcxNcxOcxWcxQcxNbGGcuNcylbGGbGGcxScxZcyactFbGGbGGbGGbGGbGGbGGbGGcxVcymbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacieckbckbckbckbckbckbcssckbcwMckbckbckbckbckbciecieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxXcxYcxYcxYcxYcxYcxYcyocyncybcyccydcyecyfcwycsucygcgQcoLcoLcwBcoLcoLcoLcwDcqBcwBcvocwFcyicwIcwIcyjcwIcykcvocypcqPcngaaacyrcytcyscyvcyqcwOcywcyAcyycyucvxcyCcsHcyEcvBcyxctYcyFctYcyzcyGcyBcyHcyDcyDcyDcyIcvIckScmJchfcQkcQkcpKcpJcQkcQkcQkcQkcpMcpLcpOcpNcQkcQkcpPcQkcQkcTBdgmbQVcpScuvcqMcqMcqMcqMcqMcqMcqNbQXcqWcqUcqXcqXcqXcqYcrccrbcrbcrfcrbcrbcrbcrgczmczmcricrhcrjczwczzczyczBczAczCczCczDczCczCczCczCczGczIczCczCczCczOczLbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacieciecqDckbckbckbckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/datums/cargoprofile.dm b/code/datums/cargoprofile.dm deleted file mode 100644 index 2f8e27d834e..00000000000 --- a/code/datums/cargoprofile.dm +++ /dev/null @@ -1,788 +0,0 @@ -/datum/cargoprofile - var/name = "All Items" - var/id = "all" // unique ID for the UI - var/enabled = 1 - var/eject_speed = 1 // will change when emagged - var/const/BIG_OBJECT_WORK = 10 - var/const/MOB_WORK = 10 - var/obj/machinery/programmable/master = null - var/universal = 0 // set when both unary and binary machines work - var/mobcheck = 0 - - var/list/whitelist = list(/obj/item,/obj/structure/closet,/obj/structure/bigDelivery,/obj/machinery/portable_atmospherics) - var/list/blacklist = null - var/dedicated_path = null // When constructing a new machine with this as default program, create a machine of the specified type instead. - - - //contains: called to determine if an object/mob will be sorted by this profile - //return 1 for any sortable item - proc/contains(var/atom/A) - if(!istype(A,/obj)) - if(!mobcheck || !istype(A,/mob)) - return 0 - else - var/obj/O = A - if(O.anchored) - return 0 - //If you are using both white and blacklists, blacklists are absoulte, no matter what is whitelisted. - //I understand this has some limitations. You cannot whitelist all items, blacklist weapons, - // and then whitelist a specific weapon. Them's the breaks, kid. - if(blacklist) - for(var/T in blacklist) - if(istype(A,T)) - return 0 - if(whitelist) - for(var/T in whitelist) - if(istype(A,T)) - return 1 - return 0 - return 1 - - - //inlet_reaction: called when a filtered item is chosen by this profile. - //W: Item chosen - //S: input turf location - //remaining: counts down how much more work the unloader wants to do this turn. - //return the amount of work done. - proc/inlet_reaction(var/atom/W,var/turf/S,var/remaining) - if(!W || !S || !master) - return 0 - - if(istype(W,/obj/item)) - var/obj/item/I = W - if(I.w_class > remaining) - return 0 - I.loc = master - master.types[W.type] = src - return I.w_class - - - if(istype(W,/obj/structure) || istype(W,/obj/machinery)) // closets, big deliveries, portable atmospherics, unconnected stuff - if(remaining < BIG_OBJECT_WORK) - return 0 - var/obj/O = W - O.loc = master - master.types[O.type] = src - return BIG_OBJECT_WORK - - //Not item, structure, machinery, or mob - return 0 - - //outlet_reaction: called when a stored object is ejected - //W: the item in question - //D: the destination turf - proc/outlet_reaction(var/atom/W,var/turf/D) - if(!W || !D || !master) - return - - if(master.emagged) - // emagging is not an industry-approved practice. - // some malfunctions may occur. - eject_speed = rand(0,4) - D = get_step(D,master.outdir) - while(prob(20)) - if(master.outdir == NORTH || master.outdir == SOUTH) - D = get_step(D,pick(EAST,WEST,master.outdir)) - else - D = get_step(D,pick(NORTH,SOUTH,master.outdir)) - - if(istype(W,/obj)) - var/obj/O = W - O.loc = master.loc - O.dir = master.outdir - O.throw_at(D,eject_speed,eject_speed) - return - -//---------------------------------------------------------------------------- -// Profiles -//---------------------------------------------------------------------------- - -/datum/cargoprofile/boxes - name = "Move Small Containers" - id = "boxes" - blacklist = null - whitelist = list(/obj/item/storage, /obj/item/storage/bag/money, /obj/item/evidencebag, - /obj/item/storage/bag/tray, /obj/item/pizzabox, /obj/item/clipboard, - /obj/item/smallDelivery, /obj/structure/bigDelivery) - -/datum/cargoprofile/cargo - name = "Move Large Containers" - id = "cargo" - blacklist = null - whitelist = list(/obj/structure/closet,/obj/structure/ore_box) - - // Make an honest attempt to move other things out of the way - outlet_reaction(var/atom/W,var/turf/D) - for(var/obj/O in D) - if(O.density && !O.anchored) - step_away(O,src) // move forward first - if(O.loc == D) - step_away(O,D) // move anywhere - ..(W,D) - -/datum/cargoprofile/cargo/empty - name = "Move Empty Large Containers" - id = "cargo-empty" - contains(var/atom/A) - return (..(A) && (A.contents.len == 0)) -/datum/cargoprofile/cargo/full - name = "Move Full Large Containers" - id = "cargo-full" - contains(var/atom/A) - return (..(A) && (A.contents.len > 0)) - -/datum/cargoprofile/supplies - name = "Building Supplies" - id = "supplies" - blacklist = null - whitelist = list(/obj/item/stack/cable_coil,/obj/item/stack/rods, - /obj/item/stack/sheet/metal,/obj/item/stack/sheet/plasteel, - /obj/item/stack/sheet/glass,/obj/item/stack/sheet/rglass, - /obj/item/stack/tile,/obj/item/light) - //todo: maybe stack things while we're here? - -/datum/cargoprofile/exotics - name = "Exotic materials" - id = "exotics" - blacklist = null - whitelist = list(/obj/item/coin, /obj/item/stack/spacecash, /obj/item/seeds, - /obj/item/stack/sheet/mineral,/obj/item/stack/sheet/wood,/obj/item/stack/sheet/leather) - -/datum/cargoprofile/organics - name = "Organics, chemicals, and Paraphernalia" - id = "organics" - blacklist = null - whitelist = list(/obj/item/tank,/obj/item/reagent_containers, - /obj/item/stack/medical,/obj/item/storage/pill_bottle,/obj/item/gun/syringe, - /obj/item/grenade/plastic/c4,/obj/item/grenade,/obj/item/ammo_box, - /obj/item/gun/grenadelauncher,/obj/item/flamethrower, /obj/item/lighter, - /obj/item/match,/obj/item/weldingtool) - -/datum/cargoprofile/food - name = "Food" - id = "food" - blacklist = null // something should probably go here - whitelist = list(/obj/item/reagent_containers/food) - -/datum/cargoprofile/chemical - name = "Chemicals and Paraphernalia" - id = "chemical" - blacklist = list(/obj/item/reagent_containers/food) - whitelist = list(/obj/item/reagent_containers,/obj/item/stack/medical,/obj/item/storage/pill_bottle, - /obj/item/gun/syringe,/obj/item/grenade/chem_grenade,/obj/item/dnainjector, - /obj/item/storage/belt/medical,/obj/item/storage/firstaid,/obj/item/implanter) - -/datum/cargoprofile/pressure - name = "air tanks" - id = "pressure" - blacklist = null - whitelist = list(/obj/item/tank,/obj/machinery/portable_atmospherics, - /obj/item/flamethrower) - //Am I missing any? -/datum/cargoprofile/pressure/empty - name = "empty air tanks" - id = "pressure-low" - var/lowpressure = ONE_ATMOSPHERE - - contains(var/atom/A) - if(..()) - var/pressure = ONE_ATMOSPHERE * 10 // In case of fallthrough, fail test - if(istype(A,/obj/item/tank)) - var/obj/item/tank/T = A - pressure = T.air_contents.return_pressure() - if(istype(A,/obj/item/flamethrower)) - var/obj/item/flamethrower/T = A - if(!T.ptank) - return 0 - pressure = T.ptank.air_contents.return_pressure() - if(istype(A,/obj/machinery/portable_atmospherics)) - var/obj/machinery/portable_atmospherics/P = A - pressure = P.air_contents.return_pressure() - - if(pressure < lowpressure) - return 1 - - return 0// Not container or failed low pressure check - -/datum/cargoprofile/pressure/full - name = "full air tanks" - id = "pressure-high" - var/highpressure = ONE_ATMOSPHERE * 15 // stolen from canister.dm; Is this right? - - contains(var/atom/A) - if(..()) - var/pressure = 0 // In case of fallthrough, fail test - if(istype(A,/obj/item/tank)) - var/obj/item/tank/T = A - pressure = T.air_contents.return_pressure() - if(istype(A,/obj/item/flamethrower)) - var/obj/item/flamethrower/T = A - if(!T.ptank) - return 0 - pressure = T.ptank.air_contents.return_pressure() - if(istype(A,/obj/machinery/portable_atmospherics)) - var/obj/machinery/portable_atmospherics/P = A - pressure = P.air_contents.return_pressure() - - if(pressure > highpressure) - return 1 - - return 0// Not container or failed high pressure check - -/datum/cargoprofile/clothing - name = "Crew Kit" - id = "clothing" - blacklist = list(/obj/item/tank/plasma,/obj/item/tank/anesthetic, // the rest are air tanks - /obj/item/clothing/mask/facehugger) // NOT CLOTHING AT ALLLLL - whitelist = list(/obj/item/clothing,/obj/item/storage/belt,/obj/item/storage/backpack, - /obj/item/radio/headset,/obj/item/pda,/obj/item/card/id,/obj/item/tank, - /obj/item/restraints/handcuffs, /obj/item/restraints/legcuffs) - -/datum/cargoprofile/trash - name = "Trash" - id = "trash" - //Note that this filters out blueprints because they are a paper item. Do NOT throw out the station blueprints unless you be trollin'. - blacklist = null - whitelist = list(/obj/item/trash,/obj/item/toy,/obj/item/reagent_containers/food/snacks/ectoplasm,/obj/item/grown/bananapeel,/obj/item/broken_bottle,/obj/item/bikehorn, - /obj/item/cigbutt,/obj/item/poster/random_contraband,/obj/item/grown/corncob,/obj/item/paper,/obj/item/shard, - /obj/item/sord,/obj/item/photo,/obj/item/folder, - /obj/item/areaeditor/blueprints,/obj/item/poster/random_contraband,/obj/item/kitchen,/obj/item/book,/obj/item/clothing/mask/facehugger) - -/datum/cargoprofile/weapons - name = "Weapons & Illegals" - id = "weapons" - blacklist = null - //This one is hard since 'weapon contains a lot of things better categorized as devices - whitelist = list(/obj/item/banhammer,/obj/item/sord,/obj/item/claymore,/obj/item/holo/esword, - /obj/item/flamethrower,/obj/item/grenade,/obj/item/gun,/obj/item/hatchet,/obj/item/katana, - /obj/item/kitchen/knife,/obj/item/melee,/obj/item/nullrod,/obj/item/pickaxe,/obj/item/twohanded, - /obj/item/grenade/plastic/c4,/obj/item/scalpel,/obj/item/shield,/obj/item/grown/nettle/death) - -/datum/cargoprofile/tools - name = "Devices & Tools" - id = "tools" - blacklist = null - whitelist = list(/obj/item,/obj/item/card,/obj/item/cartridge,/obj/item/cautery,/obj/item/stock_parts/cell,/obj/item/circuitboard, - /obj/item/aiModule,/obj/item/airalarm_electronics,/obj/item/airlock_electronics,/obj/item/circular_saw, - /obj/item/crowbar,/obj/item/disk,/obj/item/firealarm_electronics,/obj/item/hand_tele, - /obj/item/hand_labeler,/obj/item/hemostat,/obj/item/mop,/obj/item/locator,/obj/item/cultivator, - /obj/item/stack/packageWrap,/obj/item/pen,/obj/item/pickaxe,/obj/item/pinpointer, - /obj/item/rcd,/obj/item/rcd_ammo,/obj/item/retractor,/obj/item/rsf,/obj/item/scalpel, - /obj/item/screwdriver,/obj/item/shovel,/obj/item/soap,/obj/item/stamp,/obj/item/storage/bag/tray,/obj/item/weldingtool, - /obj/item/wirecutters,/obj/item/wrench,/obj/item/extinguisher) - -/datum/cargoprofile/finished - name = "Completed Robots" - id = "finished" - blacklist = null - whitelist = list(/obj/mecha,/mob/living/simple_animal/bot,/mob/living/silicon/robot) - mobcheck = 1 - //todo: detect and allow finished cyborg endoskeletons with no brain - contains(var/atom/A) - if(..()) - return 1 - if(istype(A,/mob)) - if(blacklist) - for(var/T in blacklist) - if(istype(A,T)) - return 0 - if(whitelist) - for(var/T in whitelist) - if(istype(A,T)) - return 1 - return 0 - return 1 - return 0 - -/datum/cargoprofile/stripping - name = "Auto-Frisker" - id = "frisk" - blacklist = null - whitelist = list(/mob/living/carbon/human) - mobcheck = 1 - - - -//---------------------------------------------------------------------------- -// Overrides (Special Functions) -//---------------------------------------------------------------------------- - -/datum/cargoprofile/cargo/unload - name = "Unload Cargo Boxes" - id = "cargounload" - enabled = 0 - dedicated_path = /obj/machinery/programmable/unloader - - //override the detection to only accept crates with something in it. - //if it doesn't, this object may be handled by another handler. - contains(var/atom/A) - if(..(A)) - if(istype(A,/obj/structure/closet)) - var/obj/structure/closet/C = A - if(!C.can_open() && !C.opened && !master.emagged) // must be able to access the contents - return 0 - if(A.contents.len) - return 1 - return 0 - - //instead of moving the box, strip it of its contents - inlet_reaction(var/obj/W,var/turf/S, var/remaining) - //W should only be crate or ore box, although this will work on anything with contents... - var/I = 0 - if(istype(W,/obj/structure/closet)) - var/obj/structure/closet/C = W - if(!C.can_open() && !C.opened) // must be able to access the contents - if(master.emagged && remaining >= BIG_OBJECT_WORK) - if(prob(10)) - C.welded = 0 - if("broken" in C.vars) - C:broken = 1 - C.open() - C.update_icon() - master.visible_message("[master] breaks open [C]!") - else - master.visible_message("[master] is trying to force [C] open!") - - master.sleep += 1 // mechanical strain - return BIG_OBJECT_WORK - master.visible_message("[master] is trying to open [C], but can't!") - master.sleep = 5 - return 0 - - for(var/obj/item/O in W.contents) - if(I > remaining) - return - if(O.w_class > (remaining - I)) - continue - O.loc = master - master.types[O.type] = src - if(O.w_class > 0) - I += O.w_class - else - I++ - if(!W.contents.len && istype(W,/obj/structure/closet)) - var/obj/structure/closet/C = W - C.open() - return I - - -//Inlet stacker: used when the output is a volatile space (conveyor or another unit's input). -//Does not output a stack until it is full. -/datum/cargoprofile/in_stacker - name = "Hold and Stack" - id = "instacker" - universal = 1 - - blacklist = null - whitelist = list(/obj/item/stack,/obj/item/stack/cable_coil) - - dedicated_path = /obj/machinery/programmable/stacker - - inlet_reaction(var/atom/W,var/turf/S,var/remaining) - if(istype(W,/obj/item/stack)) - var/obj/item/stack/I = W - if(!I.amount) // todo: am I making a bad assumption here? - qdel(I) - return - for(var/obj/item/stack/O in master.contents) - if(O.type == I.type && O.amount < O.max_amount) - if(I.amount + O.amount <= O.max_amount) - O.amount += I.amount - qdel(I) - return O.w_class - var/leftover = I.amount + O.amount - O.max_amount - O.amount = O.max_amount - I.amount = leftover - continue - //end for - I.loc = master - master.types[I.type] = src - return I.w_class - if(istype(W,/obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/I = W - if(!I.amount) // todo: am I making a bad assumption here? - qdel(I) - return - for(var/obj/item/stack/cable_coil/O in master.contents) - if(O.type == I.type && O.amount < MAXCOIL) - if(I.amount + O.amount <= MAXCOIL) - O.amount += I.amount - qdel(I) - return O.w_class - var/leftover = I.amount + O.amount - MAXCOIL - O.amount = MAXCOIL - I.amount = leftover - continue - //end for - I.loc = master - master.types[I.type] = src - return I.w_class - - //If the stack isn't finished yet, don't eject it - //unless this profile has been disabled. - outlet_reaction(var/atom/W,var/turf/D) - if(istype(W,/obj/item/stack)) - var/obj/item/stack/I = W - if(src.enabled && (I.amount < I.max_amount)) - return // Still needs to be stacked - ..(W,D) - if(istype(W,/obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/I = W - if(src.enabled && (I.amount < MAXCOIL)) - return // Still needs to be stacked - ..(W,D) - -//Outlet stacker: used when the output square can be trusted. -//Outputs immediately, adding to stacks in the outlet. -/datum/cargoprofile/unary/stacker - name = "Stack Items" - id = "ustacker" - blacklist = null - whitelist = list(/obj/item/stack,/obj/item/stack/cable_coil) - - dedicated_path = /obj/machinery/programmable/unary/stacker - - inlet_reaction(var/atom/W,var/turf/S,var/remaining) - - //Only pick it up if you are going to stack it - - if(istype(W,/obj/item/stack)) - var/obj/item/stack/I = W - if(I.amount >= I.max_amount) - return 0 - for(var/obj/item/stack/other in S.contents) - if(other.type == I.type && other != I && other.amount < other.max_amount) - return ..(W,S,remaining) - return 0 - - if(istype(W,/obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/I = W - if(I.amount >= MAXCOIL) - return 0 - for(var/obj/item/stack/cable_coil/other in S.contents) - if(other != I && other.amount < MAXCOIL) - return ..(W,S,remaining) - return 0 - - outlet_reaction(var/atom/W,var/turf/D) - if(istype(W,/obj/item/stack)) - var/obj/item/stack/I = W - for(var/obj/item/stack/O in D.contents) - if(O.type == I.type && O.amount < O.max_amount) - if(I.amount + O.amount <= O.max_amount) - O.amount += I.amount - qdel(I) - return - var/leftover = I.amount + O.amount - O.max_amount - O.amount = O.max_amount - I.amount = leftover - continue - //end for - I.loc = D - return - if(istype(W,/obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/I = W - for(var/obj/item/stack/cable_coil/O in D.contents) - if(O.type == I.type && O.amount < MAXCOIL) - if(I.amount + O.amount <= MAXCOIL) // Why did they make it a #define. - O.amount += I.amount - O.update_icon() - qdel(I) - return - var/leftover = I.amount + O.amount - MAXCOIL // That wasn't a question - O.amount = MAXCOIL // It was a complaint - I.amount = leftover - continue - //end for - I.loc = D - return - - - -//---------------------------------------------------------------------------- -// Dubious Overrides (For emag use) -//---------------------------------------------------------------------------- - - -//Clogs up the unloader. And, there may be devious uses for it... -/datum/cargoprofile/slow - name = "Slow unloader" - id = "slow" - whitelist = list(/obj/item,/obj/structure/closet,/obj/structure/bigDelivery,/obj/machinery/portable_atmospherics) - blacklist = list() - - inlet_reaction(var/atom/W,var/turf/S,var/remaining) - if(..()) - return remaining - -/datum/cargoprofile/unary/shredder - name = "Paper Shredder" - id = "shredder" - blacklist = null - whitelist = list(/obj/item/paper,/obj/item/book,/obj/item/clipboard,/obj/item/folder,/obj/item/photo) - universal = 1 - - dedicated_path = /obj/machinery/programmable/unary/shredder - - - - proc/cliptags(var/Text) - //Removes all html tags - var/index - var/index2 - index = findtextEx(Text,"<") - while(index) - index2 = findtextEx(Text,">",index) - if(!index2) - return copytext(Text,1,index) - Text = "[copytext(Text,1,index)][copytext(Text,index2+1,0)]" - index = findtextEx(Text,"<") - //should have trimmed that text there pretty good - return Text - - - //Recurses through the text, removing large chunks - proc/garbletext(var/Text) - var/l = length(Text) - if(l <= 3) - if(prob(20)) - return pick("#","|","/","*",".","."," ","."," "," ") - return Text - if(prob(50)) - return "[garbletext(copytext(Text,1,l/2))][garbletext(copytext(Text,l/2,0))]" - if(prob(50)) - return "[pick("#","|","/","*",".","."," ","."," "," ")][garbletext(copytext(Text,1,l/2))]" - return "[garbletext(copytext(Text,l/2,0))][pick("#","|","/","*",".","."," ","."," "," ")]" - - proc/garble_keeptags(var/Text) - var/list/L = splittext(Text,">") - var/result = "" - for(var/string in L) - var/index = findtextEx(string,"<") - if(index!=1) - result += "[garbletext(copytext(string,1,index))][copytext(string,index)]>" - else - result += "[string]>" - return copytext(result,1,lentext(result)) - - - - - outlet_reaction(var/atom/W,var/turf/D) - if(istype(W,/obj/item/paper/crumpled)) - qdel(W) - return - if(istype(W,/obj/item/clipboard) || istype(W,/obj/item/folder)) - // destroy folder, various effects on contents - for(var/obj/item/I in W.contents) - if(prob(25))//JUNK IT - qdel(I) - else if(prob(50)) //We've been over this. I can't just take it apart with a crowbar. - var/obj/item/paper/crumpled/P = new(master.loc) - if(I.name) - P.name = garbletext(I.name) - if(prob(66)) - P.fingerprints = I.fingerprints - P.fingerprintshidden = I.fingerprintshidden - if(istype(I,/obj/item/paper)) - var/obj/item/paper/O = I - P.info = garble_keeptags(O.info) - qdel(I) - ..(P,D) - else - ..(I,D) // Eject - qdel(W) //destroy container - return - if(prob(50)) //JUNK IT NOW! - var/obj/item/paper/crumpled/P = new(master.loc) - P.name = W.name - var/obj/item/I = W - if(prob(66)) - P.fingerprints = I.fingerprints - P.fingerprintshidden = I.fingerprintshidden - if(istype(I,/obj/item/paper)) - var/obj/item/paper/O = I - if(O.info) - P.info = garble_keeptags(O.info) - if(istype(I,/obj/item/book)) - var/obj/item/book/B = I - if(B.dat) - P.info = garble_keeptags(B.dat) - if(B.carved && B.store) - ..(B.store,D) - qdel(W) - ..(P,D) - else //I want it junked - qdel(W) - return - -/datum/cargoprofile/unary/gibber - name = "human shredding" - id = "flesh" - whitelist = list(/mob/living/carbon,/mob/living/simple_animal) - blacklist = null - mobcheck = 1 - contains(var/atom/A) - if(!istype(A,/mob)) - return - if(blacklist) - for(var/T in blacklist) - if(istype(A,T)) - return 0 - if(whitelist) - for(var/T in whitelist) - if(istype(A,T)) - return 1 - return 0 - return 1 - inlet_reaction(var/atom/W,var/turf/S,var/remaining) - var/mob/living/M = W - if(istype(M) && (remaining > MOB_WORK)) - //this is necessarily damaging - var/damage = rand(1,5) - to_chat(M, "The unloading machine grabs you with a hard metallic claw!") - M.reset_perspective(master) - M.loc = master - master.types[M.type] = src - M.apply_damage(damage) // todo: ugly - M.visible_message("[M.name] gets pulled into the machine!") - return MOB_WORK - outlet_reaction(var/atom/W,var/turf/D) - var/mob/living/M = W - var/bruteloss = M.bruteloss - if(istype(M,/mob/living/carbon/human)) - var/mob/living/carbon/human/C = M - for(var/obj/item/organ/external/L in C.bodyparts) - bruteloss += L.brute_dam - if(bruteloss < 100) // requires tenderization - M.apply_damage(rand(5,15),BRUTE) - to_chat(M, "The machine is tearing you apart!") - master.visible_message("[master] makes a squishy grinding noise.") - return - M.loc = master.loc - M.gib() - return - - -/datum/cargoprofile/people - name = "Manhandling" - id = "people" - - whitelist = null - blacklist = list(/mob/camera,/mob/new_player,/mob/living/simple_animal/hostile/blob/blobspore,/mob/living/simple_animal/hostile/creature, - /mob/living/simple_animal/hostile/spaceWorm,/mob/living/simple_animal/shade,/mob/living/simple_animal/hostile/faithless,/mob/dead) - universal = 1 - mobcheck = 1 - - - contains(var/atom/A) - if(!istype(A,/mob)) - return - if(blacklist) - for(var/T in blacklist) - if(istype(A,T)) - return 0 - if(whitelist) - for(var/T in whitelist) - if(istype(A,T)) - return 1 - return 0 - return 1 - - inlet_reaction(var/atom/W,var/turf/S,var/remaining) - var/mob/living/M = W - if(remaining > MOB_WORK) - //this is necessarily damaging - var/damage = rand(1,5) - to_chat(M, "The unloading machine grabs you with a hard metallic claw!") - M.forceMove(master) - master.types[M.type] = src - M.apply_damage(damage) // todo: ugly - M.visible_message("[M.name] gets pulled into the machine!") - return MOB_WORK - - outlet_reaction(var/atom/W,var/turf/D) - var/mob/living/M = W - M.forceMove(master.loc) - M.dir = master.outdir - - D = get_step(D,master.outdir) // throw attempt - eject_speed = rand(0,4) - - M.visible_message("[M.name] is ejected from the unloader.") - M.throw_at(D,eject_speed,eject_speed) - return - -/datum/cargoprofile/unary/trainer - name = "Boxing Trainer" - id = "trainer" - blacklist = list() - whitelist = list(/mob/living/carbon/human) - mobcheck = 1 - - var/const/PUNCH_WORK = 6 - - dedicated_path = /obj/machinery/programmable/unary/trainer - - contains(var/atom/A) - if(!istype(A,/mob)) - return 0 - if(blacklist) - for(var/T in blacklist) - if(istype(A,T)) - return 0 - if(whitelist) - for(var/T in whitelist) - if(istype(A,T)) - return 1 - return 0 - return 1 - - proc/punch(var/mob/living/carbon/human/M,var/maxpunches) - //stolen from holographic boxing gloves code - //This should probably be done BY the mob, however, the attack code will be expecting a source mob. - - var/damage - if(prob(75)) - damage = rand(0, 6) // pap - else - damage = rand(0, 12) // thwack - - if(!damage) - playsound(master.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - master.visible_message("\The [src] punched at [M], but whiffed!") - - if(maxpunches > 1 && prob(50)) // Follow through on a miss, 50% chance - return punch(M,maxpunches - 1) + 1 - return 1 - var/obj/item/organ/external/affecting = M.get_organ(ran_zone("chest",50)) - var/armor_block = M.run_armor_check(affecting, "melee") - - playsound(master.loc, "punch", 25, 1, -1) - master.visible_message("\The [src] has punched [M]!") - if(!master.emagged) - M.apply_damage(damage, STAMINA, affecting, armor_block) // Clean fight - else - M.apply_damage(damage, BRUTE, affecting, armor_block) // Foul! Foooul! - - if(damage >= 9) - master.visible_message("\The [src] has weakened [M]!") - M.apply_effect(4, WEAKEN, armor_block) - if(!master.emagged) - master.sleep = 1 - return maxpunches // The machine is not so sophisticated as to not gloat - else - if(prob(25)) // Follow through on a hit, 25% chance. Pause after. - return punch(M,maxpunches-1) + 1 - return 1 - - inlet_reaction(var/atom/W,var/turf/S,var/remaining) - //stolen from boxing gloves code - var/mob/living/carbon/human/M = W - if((M.lying || (M.health - M.staminaloss < 25))&& !master.emagged) - to_chat(M, "\The [src] gives you a break.") - master.sleep+=5 - return 0 // Be polite - var/punches = punch(M,remaining / PUNCH_WORK) - if(punches>1)master.sleep++ - return punches * PUNCH_WORK diff --git a/code/datums/mind.dm b/code/datums/mind.dm index be35cf8cca8..edf9792a3d4 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1211,37 +1211,6 @@ message_admins("[key_name_admin(usr)] has announced [key_name_admin(current)]'s objectives") edit_memory() -/* -/datum/mind/proc/clear_memory(var/silent = 1) - var/datum/game_mode/current_mode = ticker.mode - - // remove traitor uplinks - var/list/L = current.get_contents() - for(var/t in L) - if(istype(t, /obj/item/pda)) - if(t:uplink) qdel(t:uplink) - t:uplink = null - else if(istype(t, /obj/item/radio)) - if(t:traitorradio) qdel(t:traitorradio) - t:traitorradio = null - t:traitor_frequency = 0.0 - else if(istype(t, /obj/item/SWF_uplink) || istype(t, /obj/item/syndicate_uplink)) - if(t:origradio) - var/obj/item/radio/R = t:origradio - R.loc = current.loc - R.traitorradio = null - R.traitor_frequency = 0.0 - qdel(t) - - // remove wizards spells - //If there are more special powers that need removal, they can be procced into here./N - current.spellremove(current) - - // clear memory - memory = "" - special_role = null - -*/ /datum/mind/proc/find_syndicate_uplink() var/list/L = current.get_contents() diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index 74cc6235bb6..9e4bba0515c 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -613,15 +613,16 @@ uniform = /obj/item/clothing/under/solgov/rep back = /obj/item/storage/backpack/satchel + glasses = /obj/item/clothing/glasses/hud/security/night gloves = /obj/item/clothing/gloves/color/white shoes = /obj/item/clothing/shoes/centcom - l_ear = /obj/item/radio/headset + l_ear = /obj/item/radio/headset/ert id = /obj/item/card/id/silver r_pocket = /obj/item/lighter/zippo/blue l_pocket = /obj/item/storage/fancy/cigarettes/cigpack_robustgold pda = /obj/item/pda backpack_contents = list( - /obj/item/storage/box/survival = 1, + /obj/item/storage/box/responseteam = 1, /obj/item/implanter/dust = 1, /obj/item/implanter/death_alarm = 1, ) @@ -633,25 +634,33 @@ var/obj/item/card/id/I = H.wear_id if(istype(I)) - apply_to_card(I, H, get_centcom_access("VIP Guest"), "Solar Federation Representative") + apply_to_card(I, H, get_all_accesses(), name, "lifetimeid") /datum/outfit/admin/solgov name = "Solar Federation Marine" uniform = /obj/item/clothing/under/solgov + suit = /obj/item/clothing/suit/armor/bulletproof back = /obj/item/storage/backpack/security + belt = /obj/item/storage/belt/military/assault head = /obj/item/clothing/head/soft/solgov + glasses = /obj/item/clothing/glasses/hud/security/night gloves = /obj/item/clothing/gloves/combat shoes = /obj/item/clothing/shoes/combat + l_ear = /obj/item/radio/headset/ert id = /obj/item/card/id l_hand = /obj/item/gun/projectile/automatic/ar + r_pocket = /obj/item/flashlight/seclite + pda = /obj/item/pda backpack_contents = list( - /obj/item/storage/box/survival = 1, - /obj/item/kitchen/knife/combat = 1, + /obj/item/storage/box/responseteam = 1, /obj/item/ammo_box/magazine/m556 = 3, - /obj/item/clothing/shoes/magboots = 1 + /obj/item/clothing/shoes/magboots = 1, + /obj/item/gun/projectile/automatic/pistol/m1911 = 1, + /obj/item/ammo_box/magazine/m45 = 2 ) + var/is_tsf_lieutenant = FALSE /datum/outfit/admin/solgov/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -659,9 +668,14 @@ if(visualsOnly) return + if(is_tsf_lieutenant) + H.real_name = "Lieutenant [pick(last_names)]" + else + H.real_name = "[pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant", "Sergeant Major")] [pick(last_names)]" + H.name = H.real_name var/obj/item/card/id/I = H.wear_id if(istype(I)) - apply_to_card(I, H, get_centcom_access("VIP Guest"), name) + apply_to_card(I, H, get_all_accesses(), name, "lifetimeid") /datum/outfit/admin/solgov/lieutenant name = "Solar Federation Lieutenant" @@ -670,14 +684,16 @@ head = /obj/item/clothing/head/soft/solgov/command back = /obj/item/storage/backpack/satchel l_hand = null - belt = /obj/item/gun/projectile/automatic/pistol/deagle + l_pocket = /obj/item/pinpointer/advpinpointer backpack_contents = list( - /obj/item/storage/box/survival = 1, - /obj/item/kitchen/knife/combat = 1, + /obj/item/storage/box/responseteam = 1, /obj/item/melee/classic_baton/telescopic = 1, - /obj/item/ammo_box/magazine/m50 = 2, - /obj/item/clothing/shoes/magboots/advance = 1 + /obj/item/clothing/shoes/magboots/advance = 1, + /obj/item/gun/projectile/automatic/pistol/deagle = 1, + /obj/item/ammo_box/magazine/m50 = 2 ) + is_tsf_lieutenant = TRUE + /datum/outfit/admin/chrono name = "Chrono Legionnaire" diff --git a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm index 328981b2ab5..2d3bed1e0cf 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm @@ -5,19 +5,19 @@ /datum/surgery/organ_extraction/can_start(mob/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery) if(!ishuman(user)) - return 0 + return FALSE if(ishuman(target)) var/mob/living/carbon/human/H = target var/obj/item/organ/external/affected = H.get_organ(target_zone) if(!affected) - return 0 + return FALSE if(affected.status & ORGAN_ROBOT) - return 0 + return FALSE var/mob/living/carbon/human/H = user // You must either: Be of the abductor species, or contain an abductor implant if((H.get_species() == "Abductor" || (locate(/obj/item/implant/abductor) in H))) - return 1 - return 0 + return TRUE + return FALSE /datum/surgery_step/internal/extract_organ @@ -39,15 +39,19 @@ var/mob/living/carbon/human/AB = target if(NO_INTORGANS in AB.species.species_traits) user.visible_message("[user] prepares [target]'s [target_zone] for further dissection!", "You prepare [target]'s [target_zone] for further dissection.") - return 1 + return TRUE if(IC) user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!", "You pull [IC] out of [target]'s [target_zone].") user.put_in_hands(IC) IC.remove(target, special = 1) - return 1 + return TRUE else to_chat(user, "You don't find anything in [target]'s [target_zone]!") - return 1 + return TRUE + +/datum/surgery_step/internal/extract_organ/fail_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user]'s hand slips, failing to extract anything!", "Your hand slips, failing to extract anything!") + return FALSE /datum/surgery_step/internal/gland_insert name = "insert gland" @@ -63,7 +67,11 @@ user.drop_item() var/obj/item/organ/internal/heart/gland/gland = tool gland.insert(target, 2) - return 1 + return TRUE + +/datum/surgery_step/internal/gland_insert/fail_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user]'s hand slips, failing to insert the gland!", "Your hand slips, failing to insert the gland!") + return FALSE //IPC Gland Surgery// @@ -91,4 +99,4 @@ /datum/surgery_step/internal/extract_organ/synth name = "remove cell" - organ_types = list(/obj/item/organ/internal/cell) \ No newline at end of file + organ_types = list(/obj/item/organ/internal/cell) diff --git a/code/game/machinery/programmable_unloader.dm b/code/game/machinery/programmable_unloader.dm deleted file mode 100644 index 310d1798a09..00000000000 --- a/code/game/machinery/programmable_unloader.dm +++ /dev/null @@ -1,734 +0,0 @@ - -// TODO: Check access -// TODO: Renameable circuit boards -// TODO: Disks? Disassembly? - -/obj/machinery/programmable - name = "Programmable Unloader" - icon = 'icons/obj/machines/mining_machines.dmi' - icon_state = "unloader" - density = 1 - anchored = 1.0 - - var/debug = 0 // When set, this WILL spam people around the machine. - // Identifies profile used and on which item. - - var/on = 1 - var/indir = 8 - var/outdir = 4 - var/turf/input = null - var/turf/output = null - var/typename = "Unloader" - var/ident = "#1" - - var/const/workmax = 20 - var/datum/cargoprofile/default = new() - var/list/profiles = list(new/datum/cargoprofile/cargo(),new/datum/cargoprofile/boxes(),new/datum/cargoprofile/supplies(), - new/datum/cargoprofile/exotics(),new/datum/cargoprofile/tools(),new/datum/cargoprofile/weapons(), - new/datum/cargoprofile/pressure(),new/datum/cargoprofile/chemical(), - new/datum/cargoprofile/food(),new/datum/cargoprofile/clothing(),new/datum/cargoprofile/trash()) - var/list/overrides = list(new/datum/cargoprofile/cargo/unload(),new/datum/cargoprofile/in_stacker()) - var/list/emag_overrides = list(new/datum/cargoprofile/people(),new/datum/cargoprofile/unary/shredder(),new/datum/cargoprofile/unary/trainer()) - var/list/types = list() - - anchored = 1 - var/unwrenched = 0 - use_power = 1 - var/sleep = 0 // When set, the machine will skip the next however-many updates (to avoid spam) - var/open = 0 - var/circuit_removed = 0 - - - -/obj/machinery/programmable/New() - ..() - if(default) - default.master = src - if(!default.enabled) - default.enabled = 1 - for(var/datum/cargoprofile/p in emag_overrides + overrides + profiles) - p.master = src - input = get_step(src.loc,indir) - output = get_step(src.loc,outdir) - var/count = 0 - for(var/obj/machinery/programmable/other in world) - if(other.typename == typename) - count++ - ident = "#[count]" - name = "[typename] [ident]" - -/obj/machinery/programmable/RefreshParts() - //This is called when the machine was constructed. - //Unfortunately, it puts machine parts in our contents list, which we're using. - //Fortunately, we aren't likely to ever need the components list, circuitboard excepted. - - for(var/obj/O in contents) - if(istype(O,/obj/item/circuitboard/programmable))//retrieve settings here - - var/obj/item/circuitboard/programmable/C = O - - default = C.default - emagged = C.emagged - profiles = C.profiles - overrides = C.overrides - emag_overrides = C.emag_overrides - - //unary and binary methods (one vs two locales) don't mix - - if(istype(src,/obj/machinery/programmable/unary)) - for(var/datum/cargoprofile/P in profiles) - if(!istype(P,/datum/cargoprofile/unary) && !P.universal) - profiles -= P - for(var/datum/cargoprofile/P in overrides) - if(!istype(P,/datum/cargoprofile/unary) && !P.universal) - overrides -= P - for(var/datum/cargoprofile/P in emag_overrides) - if(!istype(P,/datum/cargoprofile/unary) && !P.universal) - emag_overrides -= P - else - for(var/datum/cargoprofile/P in profiles) - if(istype(P,/datum/cargoprofile/unary) && !P.universal) - profiles -= P - for(var/datum/cargoprofile/P in overrides) - if(istype(P,/datum/cargoprofile/unary) && !P.universal) - overrides -= P - for(var/datum/cargoprofile/P in emag_overrides) - if(istype(P,/datum/cargoprofile/unary) && !P.universal) - emag_overrides -= P - if(default) - default.master = src - for(var/datum/cargoprofile/p in emag_overrides + overrides + profiles) - p.master = src - - qdel(C) - else - qdel(O) - -/obj/machinery/programmable/attack_hand(mob/user as mob) - if(stat) // moved, or something else - return - usr.set_machine(src) - interact(user) - -/obj/machinery/programmable/proc/printlist(var/list/L) - var/dat - for(var/datum/cargoprofile/p in L) - dat += "[p.name]: [p.enabled?"YES":"NO"]
" - return dat - -/obj/machinery/programmable/proc/buildMenu() - var/dat - dat += "PROGRAMMABLE UNLOADER
" - dat += "POWER: [on ? "ON" : "OFF"]
" - dat += "INLET: [capitalize(dir2text(indir))] " - dat += "OUTLET: [capitalize(dir2text(outdir))]" - dat += " (SWAP)

" - if(default) - dat += "MAIN PROGRAM: " - dat += "[default.name]: [default.enabled ? "YES" : "NO"]
" - if(profiles.len) - if(!default || !default.enabled) - dat += printlist(profiles) - dat += "
" - if(overrides.len) - dat += "
OVERRIDES:
" - dat += printlist(overrides) - dat += "" - return dat - -/obj/machinery/programmable/interact(mob/user as mob) - var/dat = buildMenu() - user << browse("Unloader[dat]", "window=progreload") - onclose(user, "progreload") - return - -/obj/machinery/programmable/Topic(href, href_list) - if(..()) - return 1 - usr.set_machine(src) - add_fingerprint(usr) - switch(href_list["operation"]) - if("start") - on = (on ? 0 : 1) - if(on) use_power = 1 - else use_power = 0 - updateUsrDialog() - return - if("inlet") - indir *= 2 // N S E W - if(indir > 8) - indir = 1 // W N - if(indir == src.outdir) - indir *= 2 - if(indir > 8) - indir = 1 - input = get_step(src,indir) // todo: check for glasswalls / no path to target? - updateUsrDialog() - return - if("outlet") - outdir *= 2 - if(outdir > 8) - outdir = 1 - if(outdir == indir) - outdir *= 2 - if(outdir > 8) - outdir = 1 - output = get_step(src,outdir) // todo: check for walls / glasswalls / invalid output locations - updateUsrDialog() - return - if("swapdir") - var/temp = outdir - outdir = indir - indir = temp - input = get_step(src,indir) - output = get_step(src,outdir) - updateUsrDialog() - return - if("default") - default.enabled = (default.enabled ? 0 : 1) - updateUsrDialog() - return - var/which = href_list["operation"] - for(var/datum/cargoprofile/p in overrides + profiles) - if(which == p.id) - p.enabled = (p.enabled? 0 : 1) - updateUsrDialog() - return - -/obj/machinery/programmable/attackby(obj/item/I as obj, mob/user as mob, params) - if(istype(I,/obj/item/wrench)) // code borrowed from pipe dispenser - if(unwrenched==0) - playsound(src.loc, I.usesound, 50, 1) - to_chat(user, "You begin to unfasten \the [src] from the floor...") - if(do_after(user, 40 * I.toolspeed, target = src)) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "You have unfastened \the [src]. Now it can be pulled somewhere else.", \ - "You hear ratchet.") - src.anchored = 0 - src.stat |= MAINT - src.unwrenched = 1 - if(usr.machine==src) - usr << browse(null, "window=pipedispenser") - else /* unwrenched */ - playsound(src.loc, I.usesound, 50, 1) - to_chat(user, "You begin to fasten \the [src] to the floor...") - if(do_after(user, 20 * I.toolspeed, target = src)) - user.visible_message( \ - "[user] fastens \the [src].", \ - "You fastened \the [src] into place.", \ - "You hear ratchet.") - src.anchored = 1 - src.input = get_step(src.loc,src.indir) - src.output = get_step(src.loc,src.outdir) - if(!open && !circuit_removed) - src.stat &= ~MAINT - src.unwrenched = 0 - power_change() - if(istype(I,/obj/item/screwdriver)) - if(open) - open = 0 - if(!unwrenched && !circuit_removed) - src.stat &= ~MAINT - to_chat(user, "You close \the [src]'s maintenance panel.") - else - open = 1 - src.stat |= MAINT - to_chat(user, "You open \the [src]'s maintenance panel.") - if(istype(I,/obj/item/crowbar)) - if(open) - to_chat(user, "You begin to pry out the [src]'s circuits.") - if(do_after(user, 40 * I.toolspeed, target = src)) - to_chat(user, "You remove the circuitboard.") - playsound(loc, I.usesound, 50, 1) - circuit_removed = 1 - use_power = 0 - on = 0 - - var/obj/item/circuitboard/programmable/P = new(src.loc) - P.emagged = src.emagged - P.default = src.default - src.default = null - P.profiles = src.profiles - src.profiles = null - P.overrides = src.overrides - src.overrides = null - P.emag_overrides = src.emag_overrides - src.emag_overrides = null - default_deconstruction_crowbar(I, 1) - return - else - ..(I,user) - - if(istype(I,/obj/item/circuitboard/programmable)) - if(!open) - to_chat(user, "You have to open the machine first!") - return - if(!circuit_removed) - to_chat(user, "There is already a circuitboard present!") - return - circuit_removed = 0 - I.loc = src - RefreshParts() - -/obj/machinery/programmable/emag_act(user as mob) - if(emagged) - return - to_chat(user, "You swipe the unloader with your card. After a moment's grinding, it beeps in a sinister fashion.") - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) - emagged = 1 - overrides += emag_overrides - - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(2, 1, src) - s.start() - return - -/obj/machinery/programmable/process() - if(!output || !input) - return - - if(!on || stat || sleep) - if(sleep > 0) // prevent input or output errors from happening every tick - sleep-- - use_power = 0 - - //Do not let things get stuck inside. That's broken behavior. - for(var/obj/O in contents) - O.loc = loc - for(var/mob/M in contents) - M.loc = loc - M.reset_perspective(null) - to_chat(M, "The machine turns off, and you fall out.") - - return - - //Normal output reaction - if(contents.len) - for(var/atom/movable/A in contents) - var/datum/cargoprofile/p = types[A.type] - if(p) - p.outlet_reaction(A,output) - else - A.loc = output // may have been dropped by a mob, etc - - if(types.len > 50) - types = list() // good luck mr. garbage collector - - - var/work = 0 - for(var/mob/M in input.contents) - for(var/datum/cargoprofile/p in overrides + default) - if(p.enabled && p.mobcheck && p.contains(M)) - var/done = p.inlet_reaction(M,input,workmax - work) - if(done) - work += done - if(src.debug) - visible_message("[p.name]:[M.name] ([done])") - break - - if(sleep) - return // something stopped the machine - - for(var/obj/A in input.contents)// I fully expect this to cause unreasonable lag - if(!A) - break - if(work > workmax) - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) // Beep if the machine is full - testing only probably - break - - var/done = 0 // work done - testing only - var/aname // target item name - testing only - - for(var/datum/cargoprofile/p in overrides) - if(p.enabled && p.contains(A)) - aname = A.name // in case of deletion - done = p.inlet_reaction(A,input,workmax - work) - if(done) - work += done - if(src.debug) - visible_message("[p.name]:[aname] ([done])") - - else - break - if(sleep) - break // Something stopped the machine - if(!A || A.loc != input || done) - continue // next item - - if(default && default.enabled) - if(default.contains(A)) - aname = A.name - done = default.inlet_reaction(A,input,workmax - work) - if(done) - work += done - if(src.debug) - visible_message("[default.name]: [aname] ([done])") - continue - for(var/datum/cargoprofile/p in profiles) - if(p.enabled && p.contains(A)) - aname = A.name - done = p.inlet_reaction(A,input,workmax - work) - if(done) - work += done - if(src.debug) - visible_message("[p.name]:[aname] ([done])") - else - break - if(work) - use_power = 2 - else - use_power = 1 -//---------------------------------------------------------------------------- -// Specialty machines -//---------------------------------------------------------------------------- - -//Uses the inlet stacking profile. Ejects only full stacks. -/obj/machinery/programmable/stacker - name = "Stacking & Spooling Machine" - default = new/datum/cargoprofile/in_stacker() - profiles = list() - overrides = list() - emag_overrides = list() - typename = "Stacking and Spooling Machine" - - -/obj/machinery/programmable/unloader - name = "Cargo Unloader" - default = new/datum/cargoprofile/cargo/unload() - profiles = list() - overrides = list() - emag_overrides = list() - typename = "Cargo Unloader" - -/obj/machinery/programmable/delivery - name = "Finished robot delivery" - default = new/datum/cargoprofile/finished() - profiles = list() - overrides = list() - emag_overrides = list() - typename = "Robot Delivery" - -/obj/machinery/programmable/crate_handler - name = "Crate Handler" - default = null - profiles = list(new/datum/cargoprofile/cargo/unload(),new/datum/cargoprofile/cargo(),new/datum/cargoprofile/cargo/empty(),new/datum/cargoprofile/cargo/full()) - overrides = list() - emag_overrides = list() - typename = "Crate Handler" - -//---------------------------------------------------------------------------- -// Unary machine: Input and output in the same location -// Be careful with this, it could easily be running the same -// computations every round needlessly -//---------------------------------------------------------------------------- -/obj/machinery/programmable/unary - name = "Programmable Processor" - default = null - profiles = list() - overrides = list(new/datum/cargoprofile/unary/stacker(),new/datum/cargoprofile/unary/trainer()) - emag_overrides = list(new/datum/cargoprofile/unary/shredder()) - indir = 1 - outdir = 1 - typename = "Processor" - - New() - ..() - outdir = indir - output = input - buildMenu() - var/dat - dat += "PROGRAMMABLE PROCESSOR
" - dat += "POWER: [on ? "ON" : "OFF"]
" - dat += "INLET: [capitalize(dir2text(indir))]
" - if(default) - dat += "MAIN PROGRAM: " - dat += "[default.name]: [default.enabled ? "YES" : "NO"]
" - if(profiles.len) - if(!default || !default.enabled) - dat += printlist(profiles) - dat += "
" - if(overrides.len) - dat += "
OVERRIDES:
" - dat += printlist(overrides) - dat += "" - return dat - Topic(href, href_list) - switch(href_list["operation"]) - if("inlet") - indir *= 2 // N S E W - if(indir > 8) - indir = 1 // W N - outdir = indir - input = get_step(src,indir) // todo: check for glasswalls / no path to target? - output = input - updateUsrDialog() - return - return ..() - -/obj/machinery/programmable/unary/stacker - name = "Stacking Machine" - default = new/datum/cargoprofile/unary/stacker() - profiles = list() - overrides = list() - emag_overrides = list() - typename = "Stacking Machine" - -/obj/machinery/programmable/unary/shredder - name = "Paper Shredder" - default = new/datum/cargoprofile/unary/shredder() - profiles = list() - overrides = list() - emag_overrides = list(new/datum/cargoprofile/unary/gibber()) - typename = "Paper Shredder" - -/obj/machinery/programmable/unary/trainer - name = "\improper Boxing Trainer" - default = new/datum/cargoprofile/unary/trainer() - profiles = list() - overrides = list() - emag_overrides = list() - typename = "Boxing Trainer" - - attack_hand(mob/user as mob) //How did I type this with boxing gloves on? - if(!istype(user,/mob/living/carbon/human)) - return ..() - - var/mob/living/carbon/human/H = user - if(H.gloves && istype(H.gloves, /obj/item/clothing/gloves/boxing)) - var/newsleep = 0 - if(H.loc != input) - to_chat(H, "The boxing machine refuses to acknowledge you unless you face it head on!") - return - var/damage = 0 - if(H.a_intent != INTENT_HARM) - damage += rand(0,5) - else - damage += rand(0,10) - if(!damage) - playsound(H.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message("[H] tries to punch \the [src], but whiffs") - return - - playsound(loc, "punch", 25, 1, -1) - if(HULK in H.mutations) damage += 5 - - if(damage < 5) - visible_message("[H] gives \the [src] a weak punch.") - if(prob(10)) - visible_message("\The [src] feints at [H], as though mocking \him.") - else if(damage < 10) - visible_message("[H] hits \the [src] with a solid [pick("punch","jab","smack")].") - else if(damage < 15) - visible_message("[pick("Whoa!","Nice!","Gasp!")] [H] hits [src] with a powerful [pick("punch","jab","uppercut","left hook", "right hook")].") - else if(damage < 20) - visible_message("[pick("WHOA!","ACK!","Jeez!")] [H] hits [src] so hard, the whole machine rocks band and forth for a moment.") - else - visible_message("Holy moly! [H] hits \the [src] so hard it stops working.") - stat |= BROKEN - return - while(damage >= 5) - if(prob(50)) - newsleep++ - damage -= 5 - if(newsleep) - if(emagged) - visible_message("\The [src]'s lights glow a bloodthirsty red. It refuses to stop!") - sleep = 0 - else - sleep += newsleep - visible_message("\The [src]'s lights dim for a moment and it beeps, signifying a valid hit.") - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) - return - - else - return ..() - -//---------------------------------------------------------------------------- -// For construction -//---------------------------------------------------------------------------- -/obj/item/circuitboard/programmable - name = "Circuit board (Programmable Unloader)" - build_path = "/obj/machinery/programmable" - board_type = "machine" - origin_tech = "engineering=1;programming=2" - frame_desc = "Requires 2 Manipulators, 1 Scanning Module, 1 Cable." - req_components = list( - /obj/item/stock_parts/scanning_module = 1, - /obj/item/stock_parts/manipulator = 2, - /obj/item/stack/cable_coil = 1) - - //Customization of the machine - var/datum/cargoprofile/default = new/datum/cargoprofile() - var/list/profiles = list() - var/list/overrides = list() - var/list/emag_overrides = list() - - var/emagged = 0 - var/hacking = 0 - - proc/resetlists() - profiles = list(new/datum/cargoprofile/cargo(),new/datum/cargoprofile/boxes(),new/datum/cargoprofile/supplies(), - new/datum/cargoprofile/exotics(),new/datum/cargoprofile/tools(),new/datum/cargoprofile/weapons(),new/datum/cargoprofile/finished(), - new/datum/cargoprofile/pressure(),new/datum/cargoprofile/pressure/full(),new/datum/cargoprofile/pressure/empty(), - new/datum/cargoprofile/chemical(),new/datum/cargoprofile/organics(),new/datum/cargoprofile/food(), - new/datum/cargoprofile/clothing(),new/datum/cargoprofile/trash()) - overrides = list(new/datum/cargoprofile/cargo/unload(),new/datum/cargoprofile/in_stacker(), - new/datum/cargoprofile/unary/stacker(),new/datum/cargoprofile/unary/trainer()) - emag_overrides = list(new/datum/cargoprofile/people(),new/datum/cargoprofile/unary/shredder()) - - New() - ..() - resetlists() - - attackby(obj/item/I as obj, mob/user as mob, params) - if(istype(I,/obj/item/multitool)) - hacking = (hacking?0:1) - if(hacking) - to_chat(user, "You unlock the data port on the board. You can now use a PDA to alter its data.") - else - to_chat(user, "You relock the data port.") - if(istype(I,/obj/item/pda)) - if(!hacking) - to_chat(user, "It looks like you can't access the board's data port. You'll have to open it with a multitool.") - else - user.set_machine(src) - interact(user) - if(istype(I,/obj/item/card/emag) && !emagged) - if(!hacking) - to_chat(user, "There seems to be a data port on the card, but it's locked. A multitool could open it.") - else - emagged = 1 - overrides += emag_overrides - to_chat(user, "You swipe the card in the card's data port. The lights flicker, then flash once.") - - proc/format(var/datum/cargoprofile/P,var/level) - // PROFILE=0 OVERRIDE=1 MAIN=2 - if(P == null) - return "NONE
" - var/dat = "[P.name]" - if(level == 0 || (level == 1 && !default)) - dat += " PROMOTE" - if(level > 0) - dat += " DEMOTE" - dat += " REMOVE" - dat += "
" - return dat - - interact(mob/user as mob) - var/dat - dat = "MAIN FUNCTION
" - dat += format(default,2) - dat += "- CAUTION -
\[DELETE NON-MAIN ALGORITHMS\]
" - dat += "\[MASTER RESET\]
" - - dat += "OVERRIDES:
" - for(var/datum/cargoprofile/P in overrides) - dat += format(P,1) - dat += "
" - dat += "- CAUTION -
\[DELETE ALL OVERRIDES\]
" - - dat += "
TERTIARY PROFILES:
" - for(var/datum/cargoprofile/P in profiles) - dat += format(P,0) - dat += "
" - dat += "- CAUTION -
\[DELETE TERTIARY PROFILES\]" - - user << browse("Circuit Reprogramming[dat]", "window=progcircuit") - onclose(user, "progcircuit") - - Topic(href, href_list) - if(..()) - return - usr.set_machine(src) - var/id = href_list["id"] - var/level = text2num(href_list["level"]) - switch(href_list["operation"]) - if("promote") - if(level == 0) - for(var/datum/cargoprofile/T in profiles) - if(T.id == id) - overrides += T - profiles -= T - //updateUsrDialog() - interact(usr) - return - - if(level == 1) - if(default) return - for(var/datum/cargoprofile/T in overrides) - if(T.id == id) - default = T - overrides -= T - - if(default.dedicated_path) - build_path = "[default.dedicated_path]" - else - if(istype(default,/datum/cargoprofile/unary)) - build_path = "/obj/machinery/programmable/unary" - else - build_path = "/obj/machinery/programmable" - - //updateUsrDialog() - interact(usr) - return - - if("demote") - if(level == 2) - overrides += default - default = null - //updateUsrDialog() - interact(usr) - return - if(level == 1) - for(var/datum/cargoprofile/T in overrides) - if(T.id == id) - profiles += T - overrides -= T - //updateUsrDialog() - interact(usr) - return - if("delete") - if(level == 2) - default = null - //updateUsrDialog() - interact(usr) - return - if(level == 1) - for(var/datum/cargoprofile/T in overrides) - if(T.id == id) - overrides -= T - //updateUsrDialog() - interact(usr) - return - if(level == 0) - for(var/datum/cargoprofile/T in profiles) - if(T.id == id) - profiles -= T - //updateUsrDialog() - interact(usr) - return - if("deleteall") - for(var/datum/cargoprofile/T in profiles) - profiles -= T - for(var/datum/cargoprofile/T in overrides) - overrides -= T - //updateUsrDialog() - interact(usr) - return - if("deleteoverrides") - for(var/datum/cargoprofile/T in overrides) - overrides -= T - interact(usr) - return - if("deleteprofiles") - for(var/datum/cargoprofile/T in profiles) - profiles -= T - interact(usr) - return - if("reset") - resetlists() - interact(usr) - return - - //End switch diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 882852a3632..93f230a07e8 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -421,6 +421,7 @@ hide_from(usr) for(var/obj/item/I in contents) remove_from_storage(I, T) + CHECK_TICK /obj/item/storage/New() can_hold = typecacheof(can_hold) diff --git a/code/game/objects/items/weapons/syndie_uplink.dm b/code/game/objects/items/weapons/syndie_uplink.dm deleted file mode 100644 index a09ab0b69a2..00000000000 --- a/code/game/objects/items/weapons/syndie_uplink.dm +++ /dev/null @@ -1,38 +0,0 @@ -/*/obj/item/syndicate_uplink - name = "station bounced radio" - desc = "Remain silent about this..." - icon = 'icons/obj/radio.dmi' - icon_state = "radio" - var/temp = null - var/uses = 10.0 - var/selfdestruct = 0.0 - var/traitor_frequency = 0.0 - var/mob/currentUser = null - var/obj/item/radio/origradio = null - flags = CONDUCT | ONBELT - w_class = WEIGHT_CLASS_SMALL - item_state = "radio" - throw_speed = 4 - throw_range = 20 - materials = list(MAT_METAL=100) - origin_tech = "magnets=2;syndicate=3"*/ - -/obj/item/SWF_uplink - name = "station-bounced radio" - desc = "used to comunicate it appears." - icon = 'icons/obj/radio.dmi' - icon_state = "radio" - var/temp = null - var/uses = 4.0 - var/selfdestruct = 0.0 - var/traitor_frequency = 0.0 - var/obj/item/radio/origradio = null - flags = CONDUCT - slot_flags = SLOT_BELT - item_state = "radio" - throwforce = 5 - w_class = WEIGHT_CLASS_SMALL - throw_speed = 4 - throw_range = 20 - materials = list(MAT_METAL=100) - origin_tech = "magnets=1" diff --git a/code/game/objects/items/weapons/wires.dm b/code/game/objects/items/weapons/wires.dm deleted file mode 100644 index 44097096ae0..00000000000 --- a/code/game/objects/items/weapons/wires.dm +++ /dev/null @@ -1,36 +0,0 @@ -// WIRES - -/obj/item/wire - desc = "This is just a simple piece of regular insulated wire." - name = "wire" - icon = 'icons/obj/power.dmi' - icon_state = "item_wire" - var/amount = 1.0 - var/laying = 0.0 - var/old_lay = null - materials = list(MAT_METAL=40) - attack_verb = list("whipped", "lashed", "disciplined", "tickled") - - suicide_act(mob/user) - to_chat(viewers(user), "[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide.") - return (OXYLOSS) - - -/obj/item/wire/proc/update() - if(src.amount > 1) - src.icon_state = "spool_wire" - src.desc = text("This is just spool of regular insulated wire. It consists of about [] unit\s of wire.", src.amount) - else - src.icon_state = "item_wire" - src.desc = "This is just a simple piece of regular insulated wire." - return - -/obj/item/wire/attack_self(mob/user as mob) - if(src.laying) - src.laying = 0 - to_chat(user, "You're done laying wire!") - else - to_chat(user, "You are not using this to lay wire...") - return - - diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm new file mode 100644 index 00000000000..0de1a09a74c --- /dev/null +++ b/code/game/objects/structures/guillotine.dm @@ -0,0 +1,235 @@ +#define GUILLOTINE_BLADE_MAX_SHARP 10 // This is maxiumum sharpness that will decapitate without failure +#define GUILLOTINE_DECAP_MIN_SHARP 7 // Minimum amount of sharpness for decapitation. Any less and it will just deal brute damage +#define GUILLOTINE_ANIMATION_LENGTH 9 // How many deciseconds the animation is +#define GUILLOTINE_BLADE_RAISED 1 +#define GUILLOTINE_BLADE_MOVING 2 +#define GUILLOTINE_BLADE_DROPPED 3 +#define GUILLOTINE_BLADE_SHARPENING 4 +#define GUILLOTINE_HEAD_OFFSET 16 // How much we need to move the player to center their head +#define GUILLOTINE_LAYER_DIFF 1.2 // How much to increase/decrease a head when it's buckled/unbuckled +#define GUILLOTINE_ACTIVATE_DELAY 30 // Delay for executing someone +#define GUILLOTINE_WRENCH_DELAY 10 +#define GUILLOTINE_ACTION_INUSE 5 +#define GUILLOTINE_ACTION_WRENCH 6 + +/obj/structure/guillotine + name = "guillotine" + desc = "A large structure used to remove the heads of traitors and treasonists." + icon = 'icons/obj/guillotine.dmi' + icon_state = "guillotine_raised" + can_buckle = TRUE + anchored = TRUE + density = FALSE + buckle_lying = FALSE + layer = ABOVE_MOB_LAYER + var/blade_status = GUILLOTINE_BLADE_RAISED + var/blade_sharpness = GUILLOTINE_BLADE_MAX_SHARP // How sharp the blade is + var/kill_count = 0 + var/force_clap = FALSE //You WILL clap if I want you to + var/current_action = 0 // What's currently happening to the guillotine + +/obj/structure/guillotine/examine(mob/user) + ..() + + var/msg = "" + + msg += "It is [anchored ? "wrenched to the floor." : "unsecured. A wrench should fix that."]
" + + if(blade_status == GUILLOTINE_BLADE_RAISED) + msg += "The blade is raised, ready to fall, and" + + if(blade_sharpness >= GUILLOTINE_DECAP_MIN_SHARP) + msg += " looks sharp enough to decapitate without any resistance." + else + msg += " doesn't look particularly sharp. Perhaps a whetstone can be used to sharpen it." + else + msg += "The blade is hidden inside the stocks." + + if(has_buckled_mobs()) + msg += "
" + msg += "Someone appears to be strapped in. You can help them out, or you can harm them by activating the guillotine." + + to_chat(user, msg) + + return msg + +/obj/structure/guillotine/attack_hand(mob/user) + add_fingerprint(user) + + // Currently being used by something + if(current_action) + return + + switch(blade_status) + if(GUILLOTINE_BLADE_MOVING) + return + if(GUILLOTINE_BLADE_DROPPED) + blade_status = GUILLOTINE_BLADE_MOVING + icon_state = "guillotine_raise" + addtimer(CALLBACK(src, .proc/raise_blade), GUILLOTINE_ANIMATION_LENGTH) + return + if(GUILLOTINE_BLADE_RAISED) + if(has_buckled_mobs()) + if(user.a_intent == INTENT_HARM) + user.visible_message("[user] begins to pull the lever!", + "You begin to the pull the lever.") + current_action = GUILLOTINE_ACTION_INUSE + + if(do_after(user, GUILLOTINE_ACTIVATE_DELAY, target = src) && blade_status == GUILLOTINE_BLADE_RAISED) + current_action = 0 + blade_status = GUILLOTINE_BLADE_MOVING + icon_state = "guillotine_drop" + playsound(src, 'sound/items/unsheath.ogg', 100, 1) + addtimer(CALLBACK(src, .proc/drop_blade, user), GUILLOTINE_ANIMATION_LENGTH - 2) // Minus two so we play the sound and decap faster + else + current_action = 0 + else + unbuckle_mob() + else + blade_status = GUILLOTINE_BLADE_MOVING + icon_state = "guillotine_drop" + playsound(src, 'sound/items/unsheath.ogg', 100, 1) + addtimer(CALLBACK(src, .proc/drop_blade), GUILLOTINE_ANIMATION_LENGTH) + +/obj/structure/guillotine/proc/raise_blade() + blade_status = GUILLOTINE_BLADE_RAISED + icon_state = "guillotine_raised" + +/obj/structure/guillotine/proc/drop_blade(mob/user) + if(has_buckled_mobs() && blade_sharpness) + var/mob/living/carbon/human/H = buckled_mob + + if(!H) + blade_status = GUILLOTINE_BLADE_DROPPED + icon_state = "guillotine" + return + + var/obj/item/organ/external/head/head = H.get_organ("head") + + if(QDELETED(head)) + blade_status = GUILLOTINE_BLADE_DROPPED + icon_state = "guillotine" + return + + playsound(src, 'sound/weapons/bladeslice.ogg', 100, 1) + if(blade_sharpness >= GUILLOTINE_DECAP_MIN_SHARP || head.brute_dam >= 100) + head.droplimb() + add_attack_logs(user, H, "beheaded with [src]") + H.regenerate_icons() + unbuckle_mob() + kill_count += 1 + + var/blood_overlay = "bloody" + + if(kill_count == 2) + blood_overlay = "bloodier" + else if(kill_count > 2) + blood_overlay = "bloodiest" + + blood_overlay = "guillotine_" + blood_overlay + "_overlay" + overlays.Cut() + overlays += mutable_appearance(icon, blood_overlay) + + if(force_clap) + // The crowd is pleased + // The delay is to make large crowds have a longer lasting applause + var/delay_offset = 0 + for(var/mob/living/carbon/human/HM in viewers(src, 7)) + addtimer(CALLBACK(HM, /mob/.proc/emote, "clap"), delay_offset * 0.3) + delay_offset++ + else + H.apply_damage(15 * blade_sharpness, BRUTE, head) + add_attack_logs(user, H, "non-fatally dropped the blade on with [src]") + H.emote("scream") + + if(blade_sharpness > 1) + blade_sharpness -= 1 + + blade_status = GUILLOTINE_BLADE_DROPPED + icon_state = "guillotine" + +/obj/structure/guillotine/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/whetstone)) + add_fingerprint(user) + if(blade_status == GUILLOTINE_BLADE_SHARPENING) + return + + if(blade_status == GUILLOTINE_BLADE_RAISED) + if(blade_sharpness < GUILLOTINE_BLADE_MAX_SHARP) + blade_status = GUILLOTINE_BLADE_SHARPENING + if(do_after(user, 7, target = src)) + blade_status = GUILLOTINE_BLADE_RAISED + user.visible_message("[user] sharpens the large blade of the guillotine.", + "You sharpen the large blade of the guillotine.") + blade_sharpness += 1 + playsound(src, 'sound/items/Screwdriver.ogg', 100, 1) + return + else + blade_status = GUILLOTINE_BLADE_RAISED + return + else + to_chat(user, "The blade is sharp enough!") + return + else + to_chat(user, "You need to raise the blade in order to sharpen it!") + return + if(iswrench(W)) + if(current_action) + return + + current_action = GUILLOTINE_ACTION_WRENCH + + if(do_after(user, GUILLOTINE_WRENCH_DELAY, target = src)) + current_action = 0 + if(has_buckled_mobs()) + to_chat(user, "Can't unfasten, someone's strapped in!") + return + + if(current_action) + return + to_chat(user, "You [anchored ? "un" : ""]secure [src].") + anchored = !anchored + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) + dir = SOUTH + return TRUE + else + current_action = 0 + else + return ..() + +/obj/structure/guillotine/buckle_mob(mob/living/M, force = 0) + if(!anchored) + to_chat(usr, "The [src] needs to be wrenched to the floor!") + return FALSE + + if(!ishuman(M)) + to_chat(usr, "It doesn't look like they can fit into this properly!") + return FALSE // Can't decapitate non-humans + + if(blade_status != GUILLOTINE_BLADE_RAISED) + to_chat(usr, "You need to raise the blade before buckling someone in!") + return FALSE + + if(..()) + M.pixel_y -= GUILLOTINE_HEAD_OFFSET // Offset their body so it looks like they're in the guillotine + M.layer += GUILLOTINE_LAYER_DIFF + +/obj/structure/guillotine/unbuckle_mob(force = 0) + if(buckled_mob) + buckled_mob.pixel_y += GUILLOTINE_HEAD_OFFSET // Move their body back + buckled_mob.layer -= GUILLOTINE_LAYER_DIFF + . = ..() + +#undef GUILLOTINE_BLADE_MAX_SHARP +#undef GUILLOTINE_DECAP_MIN_SHARP +#undef GUILLOTINE_ANIMATION_LENGTH +#undef GUILLOTINE_BLADE_RAISED +#undef GUILLOTINE_BLADE_MOVING +#undef GUILLOTINE_BLADE_DROPPED +#undef GUILLOTINE_BLADE_SHARPENING +#undef GUILLOTINE_HEAD_OFFSET +#undef GUILLOTINE_LAYER_DIFF +#undef GUILLOTINE_ACTIVATE_DELAY +#undef GUILLOTINE_WRENCH_DELAY +#undef GUILLOTINE_ACTION_INUSE +#undef GUILLOTINE_ACTION_WRENCH \ No newline at end of file diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm index cbb5647f283..cba841ce823 100644 --- a/code/game/turfs/simulated/floor/plasteel_floor.dm +++ b/code/game/turfs/simulated/floor/plasteel_floor.dm @@ -18,8 +18,13 @@ /turf/simulated/floor/plasteel/airless/New() ..() - name = "floor" - + name = "floor" + +/turf/simulated/floor/plasteel/airless/indestructible // For bomb testing range + +/turf/simulated/floor/plasteel/airless/indestructible/ex_act(severity) + return + /turf/simulated/floor/plasteel/goonplaque icon_state = "plaque" name = "Commemorative Plaque" diff --git a/code/game/world.dm b/code/game/world.dm index 4ebeadedc6f..dc4b830704e 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -324,6 +324,10 @@ var/world_topic_spam_protect_time = world.timeofday processScheduler.stop() shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss. + for(var/client/C in clients) + if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite + C << link("byond://[config.server]") + if(config && config.shutdown_on_reboot) sleep(0) if(shutdown_shell_command) @@ -331,9 +335,6 @@ var/world_topic_spam_protect_time = world.timeofday del(world) return else - for(var/client/C in clients) - if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite - C << link("byond://[config.server]") ..(0) diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 84226bd1f3b..f1739750a0a 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -354,3 +354,13 @@ reqs = list(/obj/item/grown/log = 5) result = /obj/structure/bonfire category = CAT_PRIMAL + +/datum/crafting_recipe/guillotine + name = "Guillotine" + result = /obj/structure/guillotine + time = 150 // Building a functioning guillotine takes time + reqs = list(/obj/item/stack/sheet/plasteel = 3, + /obj/item/stack/sheet/wood = 20, + /obj/item/stack/cable_coil = 10) + tools = list(/obj/item/screwdriver, /obj/item/wrench, /obj/item/weldingtool) + category = CAT_MISC \ No newline at end of file diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 014f87ac310..83bcf61ec5d 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -122,6 +122,8 @@ log transactions if(issilicon(user)) to_chat(user, "Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per Nanotrasen regulation #1005.") return + if(!linked_db) + reconnect_database() ui_interact(user) /obj/machinery/atm/attack_ghost(mob/user) @@ -199,12 +201,9 @@ log transactions authenticated_account.security_level = new_sec_level if("attempt_auth") if(linked_db) - // check if they have low security enabled - scan_user(usr) - - if(!ticks_left_locked_down && held_card) + if(!ticks_left_locked_down) var/tried_account_num = text2num(href_list["account_num"]) - if(!tried_account_num) + if(!tried_account_num && held_card) tried_account_num = held_card.associated_account_number var/tried_pin = text2num(href_list["account_pin"]) @@ -323,30 +322,3 @@ log transactions //create the most effective combination of notes to make up the requested amount /obj/machinery/atm/proc/withdraw_arbitrary_sum(arbitrary_sum) new /obj/item/stack/spacecash(get_step(get_turf(src), turn(dir, 180)), arbitrary_sum) - -//stolen wholesale and then edited a bit from newscasters, which are awesome and by Agouri -/obj/machinery/atm/proc/scan_user(mob/living/carbon/human/H) - if(!authenticated_account && linked_db) - if(H.wear_id) - var/obj/item/card/id/I - if(istype(H.wear_id, /obj/item/card/id) ) - I = H.wear_id - else if(istype(H.wear_id, /obj/item/pda) ) - var/obj/item/pda/P = H.wear_id - I = P.id - if(I) - authenticated_account = attempt_account_access(I.associated_account_number) - if(authenticated_account) - to_chat(H, "[bicon(src)]Access granted. Welcome user '[authenticated_account.owner_name].'") - - //create a transaction log entry - var/datum/transaction/T = new() - T.target_name = authenticated_account.owner_name - T.purpose = "Remote terminal access" - T.source_terminal = machine_id - T.date = current_date_string - T.time = station_time_timestamp() - authenticated_account.transaction_log.Add(T) - - view_screen = NO_SCREEN - SSnanoui.update_uis(src) diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 1b8c0b5b989..0176049b59a 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -1250,7 +1250,13 @@ /obj/item/reagent_containers/food/snacks/monkeycube/proc/Expand() if(!QDELETED(src)) visible_message("[src] expands!") - new/mob/living/carbon/human(get_turf(src), monkey_type) + if(fingerprintslast) + log_game("Cube ([monkey_type]) inflated, last touched by: " + fingerprintslast) + else + log_game("Cube ([monkey_type]) inflated, last touched by: NO_DATA") + var/mob/living/carbon/human/creature = new /mob/living/carbon/human(get_turf(src), monkey_type) + if(fingerprintshidden.len) + creature.fingerprintshidden = fingerprintshidden.Copy() qdel(src) /obj/item/reagent_containers/food/snacks/monkeycube/farwacube diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index a844e7ff551..33334d49382 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -6,26 +6,26 @@ icon_state = "orebox0" name = "ore box" desc = "A heavy wooden box, which can be filled with a lot of ores." - density = 1 - pressure_resistance = 5*ONE_ATMOSPHERE + density = TRUE + pressure_resistance = 5 * ONE_ATMOSPHERE -/obj/structure/ore_box/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/structure/ore_box/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/t_scanner/adv_mining_scanner)) attack_hand(user) return if(istype(W, /obj/item/ore)) if(!user.drop_item()) return - W.loc = src + W.forceMove(src) if(istype(W, /obj/item/storage)) var/obj/item/storage/S = W S.hide_from(usr) for(var/obj/item/ore/O in S.contents) S.remove_from_storage(O, src) //This will move the item to this item's contents + CHECK_TICK to_chat(user, "You empty the satchel into the box.") - return -/obj/structure/ore_box/attack_hand(mob/user as mob) +/obj/structure/ore_box/attack_hand(mob/user) var/amt_gold = 0 var/amt_silver = 0 var/amt_diamond = 0 @@ -90,20 +90,19 @@ var/datum/browser/popup = new(user, "orebox", name, 400, 400) popup.set_content(dat) popup.open(0) - return /obj/structure/ore_box/Topic(href, href_list) if(..()) return usr.set_machine(src) - src.add_fingerprint(usr) + add_fingerprint(usr) if(href_list["removeall"]) for(var/obj/item/ore/O in contents) contents -= O - O.loc = src.loc + O.forceMove(loc) + CHECK_TICK to_chat(usr, "You empty the box.") - src.updateUsrDialog() - return + updateUsrDialog() obj/structure/ore_box/ex_act(severity, target) if(prob(100 / severity) && severity < 3) @@ -115,11 +114,11 @@ obj/structure/ore_box/ex_act(severity, target) set category = "Object" set src in view(1) - if(!istype(usr, /mob/living/carbon/human)) //Only living, intelligent creatures with hands can empty ore boxes. + if(!ishuman(usr)) //Only living, intelligent creatures with hands can empty ore boxes. to_chat(usr, "You are physically incapable of emptying the ore box.") return - if( usr.stat || usr.restrained() ) + if(usr.incapacitated()) return if(!Adjacent(usr)) //You can only empty the box if you can physically reach it @@ -134,7 +133,6 @@ obj/structure/ore_box/ex_act(severity, target) for(var/obj/item/ore/O in contents) contents -= O - O.loc = src.loc - to_chat(usr, "You empty the ore box.") - - return + O.forceMove(loc) + CHECK_TICK + to_chat(usr, "You empty the ore box.") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 97ff899abe6..e9ae44bf433 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -102,6 +102,8 @@ on_CD = handle_emote_CD() if("sneeze", "sneezes") on_CD = handle_emote_CD() + if("clap", "claps") + on_CD = handle_emote_CD() //Everything else, including typos of the above emotes else on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown @@ -302,11 +304,30 @@ message = "[src] makes a peculiar noise." m_type = 2 if("clap", "claps") - if(!restrained()) - message = "[src] claps." + if(miming) + message = "[src] claps silently." + m_type = 1 + else m_type = 2 - if(miming) - m_type = 1 + var/obj/item/organ/external/L = get_organ("l_hand") + var/obj/item/organ/external/R = get_organ("r_hand") + + var/left_hand_good = FALSE + var/right_hand_good = FALSE + + if(L && (!(L.status & ORGAN_SPLINTED)) && (!(L.status & ORGAN_BROKEN))) + left_hand_good = TRUE + if(R && (!(R.status & ORGAN_SPLINTED)) && (!(R.status & ORGAN_BROKEN))) + right_hand_good = TRUE + + if(left_hand_good && right_hand_good) + message = "[src] claps." + var/clap = pick('sound/misc/clap1.ogg', 'sound/misc/clap2.ogg', 'sound/misc/clap3.ogg', 'sound/misc/clap4.ogg') + playsound(loc, clap, 50, 1, -1) + + else + to_chat(usr, "You need your hands working in order to clap.") + if("flap", "flaps") if(!restrained()) message = "[src] flaps \his wings." diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 63f533d91ec..130fda822fd 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -29,7 +29,7 @@ /obj/item/ammo_casing/update_icon() ..() icon_state = "[initial(icon_state)][BB ? "-live" : ""]" - desc = "[initial(desc)][BB ? "" : " This one is spent"]" + desc = "[initial(desc)][BB ? "" : " This one is spent."]" /obj/item/ammo_casing/proc/newshot(params) //For energy weapons, shotgun shells and wands (!). if(!BB) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 74a9b740c62..c7acc705150 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -214,19 +214,18 @@ datum/chemical_reaction/flash_powder var/datum/effect_system/smoke_spread/chem/S = new S.attach(location) playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) - spawn(0) - if(S) - S.set_up(holder, 10, 0, location) - if(created_volume < 5) - S.start(1) - if(created_volume >=5 && created_volume < 10) - S.start(2) - if(created_volume >= 10 && created_volume < 15) - S.start(3) - if(created_volume >=15) - S.start(4) - if(holder && holder.my_atom) - holder.clear_reagents() + if(S) + S.set_up(holder, 10, 0, location) + if(created_volume < 5) + S.start(1) + if(created_volume >=5 && created_volume < 10) + S.start(2) + if(created_volume >= 10 && created_volume < 15) + S.start(3) + if(created_volume >=15) + S.start(4) + if(holder && holder.my_atom) + holder.clear_reagents() /datum/chemical_reaction/smoke/smoke_powder name = "smoke_powder_smoke" diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index fb5ff5cabd5..57886d2972c 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -452,16 +452,6 @@ build_path = /obj/item/circuitboard/arcade/orion_trail category = list("Misc. Machinery") -/datum/design/programmable - name = "Machine Board (Programmable Unloader)" - desc = "The circuit board for a Programmable Unloader." - id = "selunload" - req_tech = list("engineering" = 1, "programming" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000) - build_path = /obj/item/circuitboard/programmable - category = list("Misc. Machinery") - /datum/design/pod name = "Machine Board (Mass Driver and Pod Doors Control)" desc = "Allows for the construction of circuit boards used to build a Mass Driver and Pod Doors Control." diff --git a/html/changelog.html b/html/changelog.html index 9d4218f4286..062a05bd975 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,3 +55,7680 @@ -->
+ +

04 May 2018

+

RyanSmake updated:

+ + +

02 May 2018

+

CrazyLemon and Fox McCloud updated:

+ + +

01 May 2018

+

Alffd updated:

+ +

Fox McCloud updated:

+ + +

30 April 2018

+

Fox McCloud updated:

+ +

FreeStylaLT updated:

+ + +

28 April 2018

+

MINIMAN10000 updated:

+ + +

26 April 2018

+

Fox McCloud updated:

+ +

Tayyyyyyy updated:

+ +

uraniummeltdown updated:

+ + +

25 April 2018

+

Fox McCloud updated:

+ +

Tayyyyyyy updated:

+ +

Xhuis updated:

+ + +

24 April 2018

+

Kluys updated:

+ + +

17 April 2018

+

Citinited updated:

+ +

MINIMAN10000 updated:

+ + +

14 April 2018

+

Anticept updated:

+ +

MarsM0nd updated:

+ + +

11 April 2018

+

KasparoVy updated:

+ + +

08 April 2018

+

Kyep updated:

+ + +

07 April 2018

+

Alffd updated:

+ +

Birdtalon updated:

+ +

Citinited updated:

+ +

Crazylemon64 updated:

+ +

Dyhr updated:

+ +

Kyep updated:

+ +

MarsM0nd updated:

+ +

Spacemanspark updated:

+ +

uraniummeltdown updated:

+ + +

06 April 2018

+

Fox McCloud updated:

+ + +

05 April 2018

+

uraniummeltdown updated:

+ + +

03 April 2018

+

& Deathride58 & Tigercat2000 updated:

+ + +

02 April 2018

+

Desolate updated:

+ +

EldritchSigma updated:

+ +

Fethas updated:

+ +

IK3I updated:

+ +

Kyep updated:

+ +

Shazbot updated:

+ +

Tayyyyyyy updated:

+ + +

01 April 2018

+

Tayyyyyyy, LP Spartan updated:

+ + +

30 March 2018

+

matt81093 updated:

+ + +

28 March 2018

+

Birdtalon updated:

+ +

Fox McCloud updated:

+ +

MarsM0nd updated:

+ + +

25 March 2018

+

Alffd updated:

+ + +

24 March 2018

+

matt81093 updated:

+ +

uraniummeltdown updated:

+ + +

22 March 2018

+

uraniummeltdown updated:

+ + +

21 March 2018

+

MarsM0nd updated:

+ + +

20 March 2018

+

MarsM0nd updated:

+ + +

19 March 2018

+

Birdtalon updated:

+ +

Birdtalon, LPSpartan, Shazbot updated:

+ +

Fethas updated:

+ +

Fox McCloud updated:

+ +

IK3I updated:

+ +

Shazbot updated:

+ + +

16 March 2018

+

MarsM0nd updated:

+ + +

13 March 2018

+

Citinited updated:

+ +

Piccione updated:

+ + +

12 March 2018

+

Fethas updated:

+ + +

08 March 2018

+

shazbot updated:

+ + +

06 March 2018

+

Regen updated:

+ + +

04 March 2018

+

Funce updated:

+ + +

03 March 2018

+

Birdtalon updated:

+ +

Citinited updated:

+ +

DarkPyrolord updated:

+ +

FalseIncarnate updated:

+ +

Fethas updated:

+ +

KasparoVy updated:

+ +

Serket updated:

+ +

Tayyyyyyy updated:

+ + +

26 February 2018

+

Birdtalon updated:

+ + +

21 February 2018

+

uraniummeltdown updated:

+ + +

20 February 2018

+

Alffd updated:

+ +

Anasari updated:

+ +

Birdtalon updated:

+ +

Citinited updated:

+ +

Fox McCloud updated:

+ +

HugoLuman updated:

+ +

MarcellusPye updated:

+ +

Shazbot updated:

+ +

Tayyyyyyy, bryanayalalugo updated:

+ + +

05 February 2018

+

IK3I updated:

+ +

MarsM0nd updated:

+ +

Tayyyyyyy updated:

+ +

uraniummeltdown updated:

+ + +

02 February 2018

+

Fethas updated:

+ + +

01 February 2018

+

Squirgenheimer updated:

+ +

Tayyyyyyy updated:

+ +

uraniummeltdown updated:

+ + +

29 January 2018

+

Fox McCloud updated:

+ +

MarcellusPye updated:

+ + +

27 January 2018

+

IK3I updated:

+ +

uraniummeltdown updated:

+ + +

26 January 2018

+

tigercat2000 updated:

+ +

uraniummeltdown updated:

+ + +

24 January 2018

+

IK3I updated:

+ +

Kyep updated:

+ +

Tayyyyyyy updated:

+ + +

21 January 2018

+

KasparoVy updated:

+ +

Tayyyyyyy updated:

+ + +

20 January 2018

+

uraniummeltdown updated:

+ + +

19 January 2018

+

Citinited updated:

+ +

uraniummeltdown updated:

+ + +

13 January 2018

+

Citinited updated:

+ +

Kyep updated:

+ + +

11 January 2018

+

Bxil updated:

+ +

Citinited updated:

+ +

Jountax updated:

+ +

Kyep updated:

+ +

Tayyyyyyy, FPK updated:

+ +

uraniummeltdown updated:

+ + +

07 January 2018

+

Kyep updated:

+ + +

05 January 2018

+

Kyep updated:

+ +

uraniummeltdown updated:

+ + +

04 January 2018

+

Anasari updated:

+ + +

31 December 2017

+

Alffd updated:

+ +

Fox McCloud updated:

+ +

FreeStylaLT updated:

+ +

KasparoVy updated:

+ +

Kyep updated:

+ +

Tayyyyyyy updated:

+ +

Vivalas updated:

+ + +

27 December 2017

+

Tayyyyyyy updated:

+ + +

23 December 2017

+

Fethas updated:

+ +

Fox McCloud updated:

+ +

Purpose2 updated:

+ +

Santa's Lawyer updated:

+ + +

21 December 2017

+

FalseIncarnate updated:

+ +

Purpose2 updated:

+ + +

19 December 2017

+

Santa Claus updated:

+ + +

15 December 2017

+

uraniummeltdown updated:

+ + +

05 December 2017

+

Kyep updated:

+ + +

04 December 2017

+

Tayyyyyyy updated:

+ +

Terillia updated:

+ + +

02 December 2017

+

uraniummeltdown updated:

+ + +

01 December 2017

+

Fox McCloud updated:

+ + +

30 November 2017

+

ExitGame updated:

+ +

Fox McCloud updated:

+ + +

28 November 2017

+

Kyep updated:

+ + +

27 November 2017

+

uraniummeltdown updated:

+ + +

26 November 2017

+

FalseIncarnate updated:

+ +

Fethas updated:

+ +

Fox McCloud updated:

+ +

Jountax updated:

+ +

Kyep updated:

+ +

MarsM0nd updated:

+ +

Ty-Omaha updated:

+ +

uraniummeltdown updated:

+ + +

22 November 2017

+

Fox McCloud updated:

+ + +

19 November 2017

+

Fox McCloud updated:

+ + +

18 November 2017

+

MarsM0nd updated:

+ + +

13 November 2017

+

Alffd updated:

+ +

VexingRaven updated:

+ + +

12 November 2017

+

Kyep updated:

+ + +

11 November 2017

+

FalseIncarnate updated:

+ + +

10 November 2017

+

Allfd updated:

+ +

Anasari updated:

+ + +

05 November 2017

+

Fethas updated:

+ +

KasparoVy updated:

+ + +

04 November 2017

+

FalseIncarnate updated:

+ +

FreeStylaLT updated:

+ + +

01 November 2017

+

FreeStylaLT updated:

+ +

Kyep updated:

+ +

MarsM0nd updated:

+ + +

30 October 2017

+

NewSta updated:

+ + +

29 October 2017

+

Alffd updated:

+ + +

28 October 2017

+

Anasari updated:

+ +

Kyep updated:

+ +

Landerlow updated:

+ +

Squirgenheimer updated:

+ + +

27 October 2017

+

Birdtalon updated:

+ +

FalseIncarnate updated:

+ + +

26 October 2017

+

Anasari updated:

+ +

FreeStylaLT updated:

+ +

Kyep updated:

+ +

TDSSS updated:

+ + +

25 October 2017

+

Anasari updated:

+ +

Kyep updated:

+ + +

22 October 2017

+

Crazylemon64 updated:

+ +

Fethas updated:

+ +

McCloud and Alffd updated:

+ + +

15 October 2017

+

Citinited updated:

+ +

Fethas updated:

+ +

Imsxz updated:

+ +

Kyep updated:

+ +

TullyBurnalot updated:

+ +

Vivalas updated:

+ + +

14 October 2017

+

Anasari updated:

+ +

Fethas updated:

+ +

Kyep updated:

+ +

MarsM0nd updated:

+ + +

11 October 2017

+

Anasari updated:

+ +

Birdtalon updated:

+ +

Kyep updated:

+ +

TullyBurnalot updated:

+ +

scrubmcnoob updated:

+ +

uraniummeltdown updated:

+ + +

10 October 2017

+

Birdtalon updated:

+ + +

07 October 2017

+

Birdtalon updated:

+ +

imsxz updated:

+ +

scrubmcnoob updated:

+ +

uraniummeltdown updated:

+ + +

06 October 2017

+

Birdtalon updated:

+ + +

05 October 2017

+

Birdtalon updated:

+ + +

02 October 2017

+

Imsxz updated:

+ + +

30 September 2017

+

Jovaniph updated:

+ +

Landerlow updated:

+ + +

29 September 2017

+

Citinited updated:

+ +

imsxz updated:

+ + +

28 September 2017

+

MarsM0nd updated:

+ +

uraniummeltdown updated:

+ + +

05 September 2017

+

Kyep updated:

+ + +

04 September 2017

+

Kyep updated:

+ + +

03 September 2017

+

Birdtalon updated:

+ +

Citinited updated:

+ + +

02 September 2017

+

Landerlow updated:

+ + +

01 September 2017

+

Birdtalon updated:

+ + +

28 August 2017

+

Birdtalon updated:

+ +

Birdtalon & Hylocereus updated:

+ +

Fethas updated:

+ +

Fox McCloud updated:

+ +

Fox Mccloud updated:

+ +

Jovaniph updated:

+ +

Landerlow updated:

+ +

matt81093 updated:

+ + +

24 August 2017

+

Birdtalon updated:

+ +

Fox McCloud updated:

+ + +

16 August 2017

+

Citinited updated:

+ +

Fethas updated:

+ +

Fox McCloud updated:

+ +

Kyep updated:

+ + +

15 August 2017

+

Birdtalon updated:

+ + +

14 August 2017

+

AndrewMontagne updated:

+ +

Birdtalon updated:

+ +

Citinited updated:

+ +

Fethas updated:

+ +

taukausanake updated:

+ + +

10 August 2017

+

KasparoVy updated:

+ + +

09 August 2017

+

Purpose2 updated:

+ + +

06 August 2017

+

Birdtalon updated:

+ +

Fox McCloud updated:

+ +

Kyep updated:

+ +

Purpose2 updated:

+ + +

05 August 2017

+

Purpose2 updated:

+ + +

03 August 2017

+

Fox McCloud updated:

+ + +

02 August 2017

+

Fox McCloud updated:

+ + +

31 July 2017

+

Birdtalon updated:

+ + +

30 July 2017

+

FreeStylaLT updated:

+ +

Kyep updated:

+ + +

29 July 2017

+

Fox McCloud updated:

+ +

FreeStylaLT updated:

+ +

Purpose2 updated:

+ + +

27 July 2017

+

Birdtalon updated:

+ + +

26 July 2017

+

Citinited updated:

+ + +

25 July 2017

+

Birdtalon updated:

+ +

FlattestGuitar updated:

+ +

Fox McCloud updated:

+ +

FreeStylaLT updated:

+ +

Kluys, Kyep & DarkLordpyro updated:

+ +

Kyep updated:

+ +

imsxz updated:

+ +

owenowen212 updated:

+ + +

24 July 2017

+

FlattestGuitar updated:

+ +

Kyep updated:

+ + +

23 July 2017

+

Fox McCloud updated:

+ + +

22 July 2017

+

Crazylemon64 updated:

+ +

Fox McCloud updated:

+ +

Kyep updated:

+ + +

21 July 2017

+

Purpose2 updated:

+ + +

20 July 2017

+

Purpose2 updated:

+ + +

19 July 2017

+

Fox McCloud updated:

+ + +

18 July 2017

+

Fox McCloud updated:

+ +

Purpose2 updated:

+ + +

16 July 2017

+

Ataman updated:

+ +

Crazylemon64 updated:

+ +

KasparoVy updated:

+ + +

15 July 2017

+

Fox McCloud updated:

+ +

Kyep updated:

+ +

imsxz updated:

+ + +

13 July 2017

+

Fox McCloud updated:

+ +

Shazbot-coding, Driker-Sprites updated:

+ + +

12 July 2017

+

Fox McCloud updated:

+ + +

11 July 2017

+

Fethas and tigercat updated:

+ + +

10 July 2017

+

AffectedArc07 updated:

+ +

Birdtalon updated:

+ +

Citinited updated:

+ +

Fox McCloud updated:

+ + +

08 July 2017

+

Citinited updated:

+ +

Fox McCloud updated:

+ +

Kyep updated:

+ + +

05 July 2017

+

Purpose2 updated:

+ + +

04 July 2017

+

Birdtalon updated:

+ +

Citinited updated:

+ +

Citinited & LightFire53 updated:

+ +

Fethas updated:

+ +

Fox McCloud updated:

+ +

Ionward updated:

+ +

Kyep updated:

+ +

Vivalas updated:

+ + +

03 July 2017

+

Fethas updated:

+ +

fludd12 updated:

+ + +

01 July 2017

+

Fox McCloud updated:

+ + +

30 June 2017

+

fludd12 updated:

+ + +

29 June 2017

+

Fox McCloud updated:

+ +

Kluys updated:

+ + +

28 June 2017

+

Fox McCloud updated:

+ +

Purpose2 and Re-Opened by Fethas updated:

+ + +

27 June 2017

+

Alexshreds updated:

+ +

Citinited updated:

+ +

Code Fethas and Sprites Phantasmicdream updated:

+ +

FlattestGuitar updated:

+ +

Fox McCloud updated:

+ +

Kyep updated:

+ +

ProperPants updated:

+ +

Purpose2 updated:

+ +

tigercat2000 updated:

+ + +

26 June 2017

+

Crazylemon64 updated:

+ +

Kyep updated:

+ +

Purpose2 updated:

+ + +

25 June 2017

+

Kyep updated:

+ + +

24 June 2017

+

Allfd updated:

+ +

Kyep updated:

+ +

Purpose2 updated:

+ +

SamHPurp updated:

+ + +

23 June 2017

+

Kyep updated:

+ +

Vivalas updated:

+ + +

22 June 2017

+

Crazylemon64 updated:

+ +

Purpose2 updated:

+ + +

21 June 2017

+

tigercat2000 updated:

+ + +

20 June 2017

+

Purpose2 updated:

+ + +

19 June 2017

+

Fox McCloud updated:

+ + +

18 June 2017

+

Citinited updated:

+ + +

16 June 2017

+

Alffd updated:

+ +

Fethas updated:

+ +

Fox McCloud updated:

+ +

FreeStylaLT updated:

+ +

Kyep updated:

+ +

Purpose2 updated:

+ +

TullyBurnalot updated:

+ +

alexkar598 updated:

+ + +

13 June 2017

+

KasparoVy updated:

+ +

Vivalas updated:

+ + +

10 June 2017

+

Alffd updated:

+ +

Citinited updated:

+ +

FalseIncarnate updated:

+ + +

09 June 2017

+

Alexshreds updated:

+ +

FlattyPatty updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

Kyep updated:

+ +

alexkar598 updated:

+ +

tigercat2000 updated:

+ + +

08 June 2017

+

Alexshreds updated:

+ + +

07 June 2017

+

Fethas updated:

+ +

tigercat2000 updated:

+ + +

06 June 2017

+

DarkPyrolord updated:

+ +

Fox McCloud updated:

+ +

Kyep updated:

+ +

imsxz updated:

+ + +

04 June 2017

+

Crazylemon64 updated:

+ +

FreeStylaLT updated:

+ + +

03 June 2017

+

FlattestGuitar updated:

+ + +

01 June 2017

+

Alexshreds updated:

+ +

FreeStylaLT updated:

+ +

Kyep updated:

+ +

Purpose2 updated:

+ +

tigercat2000 updated:

+ + +

31 May 2017

+

FalseIncarnate updated:

+ +

Xantholne updated:

+ + +

30 May 2017

+

Fruerlund updated:

+ + +

29 May 2017

+

Jovaniph updated:

+ +

Purpose2 updated:

+ +

Tayyyyyyy, FlattestGuitar updated:

+ + +

28 May 2017

+

Fox McCloud updated:

+ + +

27 May 2017

+

Crazylemon64 updated:

+ + +

26 May 2017

+

FlattyPatty updated:

+ + +

25 May 2017

+

FalseIncarnate updated:

+ +

Fethas updated:

+ +

Kyep updated:

+ +

Purpose2 updated:

+ +

Tayyyyyyy, PhantasmicDream updated:

+ + +

24 May 2017

+

Kyep updated:

+ + +

23 May 2017

+

Fethas updated:

+ +

Purpose2 updated:

+ + +

22 May 2017

+

DarkPyrolord updated:

+ +

Kyep updated:

+ + +

21 May 2017

+

KasparoVy updated:

+ + +

20 May 2017

+

FlattestGuitar updated:

+ +

KasparoVy updated:

+ +

Kyep updated:

+ +

Kyep: updated:

+ +

Xantholne updated:

+ + +

19 May 2017

+

IK3I updated:

+ +

MarsM0nd updated:

+ +

Purpose2 updated:

+ + +

18 May 2017

+

FreeStylaLT updated:

+ +

Purpose2 updated:

+ +

TullyBurnalot updated:

+ + +

17 May 2017

+

Fethas updated:

+ +

FlattestGuitar updated:

+ +

Fox McCloud updated:

+ +

Purpose2 updated:

+ +

Travelling Merchant updated:

+ + +

16 May 2017

+

FlattestGuitar updated:

+ +

FreeStylaLT updated:

+ +

Kyep updated:

+ +

uraniummeltdown updated:

+ + +

15 May 2017

+

TullyBurnalot updated:

+ + +

13 May 2017

+

Fethas updated:

+ +

KasparoVy updated:

+ + +

12 May 2017

+

Fethas updated:

+ +

Xantholne updated:

+ + +

11 May 2017

+

Fethas updated:

+ +

Fox McCloud updated:

+ + +

09 May 2017

+

Fethas updated:

+ + +

08 May 2017

+

Purpose2 updated:

+ +

uraniummeltdown updated:

+ + +

07 May 2017

+

GunDOSMk1 updated:

+ +

Purpose2 updated:

+ +

Twinmold updated:

+ + +

06 May 2017

+

Allfd updated:

+ +

Fethas updated:

+ +

LightFire69 updated:

+ +

uraniummeltdown updated:

+ + +

05 May 2017

+

Fethas updated:

+ + +

01 May 2017

+

Fethas updated:

+ + +

30 April 2017

+

scrubmcnoob updated:

+ + +

29 April 2017

+

FalseIncarnate updated:

+ +

Phantasmic Dream Art, Fethas PR updated:

+ +

uraniummeltdown updated:

+ + +

28 April 2017

+

Alffd updated:

+ + +

27 April 2017

+

Kyep updated:

+ + +

26 April 2017

+

FalseIncarnate updated:

+ +

pinatacolada updated:

+ + +

25 April 2017

+

Flattest updated:

+ +

uraniummeltdown updated:

+ + +

24 April 2017

+

Flattest updated:

+ + +

23 April 2017

+

Citinited updated:

+ +

Crazylemon64 updated:

+ +

IK3I updated:

+ +

Tayyyyyyy updated:

+ + +

21 April 2017

+

Anticept updated:

+ +

Fox McCloud updated:

+ +

Lady-Luck updated:

+ +

Spacemanspark updated:

+ +

Twinmold93 updated:

+ +

alexkar598 updated:

+ +

monster860 updated:

+ + +

19 April 2017

+

IK3I updated:

+ +

Xantholne updated:

+ + +

17 April 2017

+

KasparoVy updated:

+ +

Krausus updated:

+ + +

16 April 2017

+

FalseIncarnate updated:

+ +

KasparoVy updated:

+ +

Kyep updated:

+ +

Twinmold93 updated:

+ +

Xantholne updated:

+ +

ZomgPonies updated:

+ +

uraniummeltdown updated:

+ + +

11 April 2017

+

FalseIncarnate updated:

+ + +

09 April 2017

+

Fox McCloud updated:

+ +

Purpose2 updated:

+ + +

06 April 2017

+

Fox McCloud updated:

+ +

davipatury updated:

+ + +

05 April 2017

+

KasparoVy updated:

+ +

Purpose2 updated:

+ +

Twinmold93 updated:

+ + +

04 April 2017

+

FalseIncarnate updated:

+ + +

03 April 2017

+

Kyep updated:

+ + +

02 April 2017

+

KasparoVy updated:

+ +

Kyep updated:

+ + +

31 March 2017

+

Krausus updated:

+ +

Kyep updated:

+ + +

30 March 2017

+

Crazylemon64 updated:

+ +

FlattestGuitar updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

Kyep updated:

+ +

uraniummeltdown updated:

+ + +

29 March 2017

+

Purpose2 updated:

+ + +

28 March 2017

+

KasparoVy updated:

+ +

uraniummeltdown updated:

+ + +

27 March 2017

+

Crazylemon64 updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

Kyep updated:

+ +

Purpose2 updated:

+ + +

26 March 2017

+

FalseIncarnate updated:

+ +

KasparoVy updated:

+ +

Kyep updated:

+ +

Purpose2 updated:

+ +

Ty-Omaha updated:

+ +

uraniummeltdown updated:

+ + +

25 March 2017

+

Crazylemon64 updated:

+ +

Kyep updated:

+ + +

24 March 2017

+

KasparoVy updated:

+ +

uraniummeltdown updated:

+ + +

23 March 2017

+

FalseIncarnate updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

Kyep updated:

+ +

MarsM0nd updated:

+ +

Norgad updated:

+ +

uraniummeltdown updated:

+ + +

22 March 2017

+

Crazylemon64 updated:

+ +

FlattestGuitar updated:

+ +

KasparoVy updated:

+ +

Krausus updated:

+ + +

21 March 2017

+

Crazylemon64 updated:

+ +

KasparoVy updated:

+ +

uraniummeltdown updated:

+ + +

20 March 2017

+

Jovaniph updated:

+ +

KasparoVy updated:

+ +

Purpose2 updated:

+ +

Tayyyyyyy updated:

+ + +

19 March 2017

+

Jovaniph updated:

+ +

Krausus updated:

+ +

Kyep updated:

+ +

uraniummeltdown updated:

+ + +

18 March 2017

+

Fox McCloud updated:

+ +

Jovaniph updated:

+ +

uraniummeltdown updated:

+ + +

16 March 2017

+

FlattestGeetar updated:

+ +

Jovaniph updated:

+ +

Markolie updated:

+ + +

15 March 2017

+

uraniummeltdown updated:

+ + +

14 March 2017

+

uraniummeltdown updated:

+ + +

13 March 2017

+

Kyep updated:

+ +

uraniummeltdown updated:

+ + +

12 March 2017

+

Crazylemon64 updated:

+ +

Jovaniph updated:

+ +

Kyep updated:

+ +

Markolie updated:

+ +

Twinmold93 updated:

+ + +

11 March 2017

+

Developed by XDTM, ported by davipatury updated:

+ +

Flatty Patty updated:

+ +

FlattyPatty updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

Markolie updated:

+ +

davipatury updated:

+ +

uraniummeltdown updated:

+ + +

10 March 2017

+

Jovaniph updated:

+ +

Markolie updated:

+ + +

09 March 2017

+

Crazylemon64 updated:

+ +

LordJike updated:

+ +

Markolie updated:

+ + +

08 March 2017

+

Alffd updated:

+ +

FlaaaaaattestGuitar updated:

+ +

Fox McCloud updated:

+ +

Kyep updated:

+ +

uraniummeltdown updated:

+ + +

07 March 2017

+

Crazylemon64 updated:

+ +

Kyep updated:

+ +

MarsM0nd updated:

+ + +

05 March 2017

+

Kyep updated:

+ +

MarsM0nd updated:

+ + +

04 March 2017

+

Markolie updated:

+ +

davipatury updated:

+ + +

03 March 2017

+

FlauntestGuitar updated:

+ +

uraniummeltdown updated:

+ + +

01 March 2017

+

Crazylemon64 updated:

+ +

Fethas updated:

+ +

KasparoVy updated:

+ +

Kyep updated:

+ +

Purpose2 updated:

+ + +

28 February 2017

+

KasparoVy updated:

+ + +

27 February 2017

+

uraniummeltdown updated:

+ + +

26 February 2017

+

Crazylemon64 updated:

+ +

KasparoVy updated:

+ +

Kyep updated:

+ +

davipatury updated:

+ + +

25 February 2017

+

Crazylemon64 updated:

+ +

FlattestGuitar updated:

+ +

KasparoVy updated:

+ +

davipatury updated:

+ + +

24 February 2017

+

FalseIncarnate updated:

+ +

Kyep updated:

+ +

Markolie updated:

+ +

Purpose2 updated:

+ +

Twinmold93 updated:

+ +

davipatury updated:

+ + +

23 February 2017

+

Krausus updated:

+ +

Markolie updated:

+ + +

22 February 2017

+

KasparoVy updated:

+ + +

21 February 2017

+

Crazylemon64 updated:

+ +

KasparoVy updated:

+ +

Kyep updated:

+ +

Markolie updated:

+ +

davipatury updated:

+ +

uraniummeltdown updated:

+ + +

20 February 2017

+

Markolie updated:

+ +

davipatury updated:

+ +

tigercat2000 updated:

+ + +

19 February 2017

+

Markolie updated:

+ + +

18 February 2017

+

Alffd updated:

+ +

Crazylemon64 updated:

+ +

Krausus updated:

+ +

Kyep updated:

+ +

Markolie updated:

+ +

uraniummeltdown updated:

+ + +

17 February 2017

+

Crazylemon64 updated:

+ +

Ported by Markolie, developed by AnturK updated:

+ + +

16 February 2017

+

Crazylemon64 updated:

+ +

KasparoVy updated:

+ +

davipatury updated:

+ +

uraniummeltdown updated:

+ + +

15 February 2017

+

Alexshreds updated:

+ +

Ausops updated:

+ +

Crazylemon64 updated:

+ +

FlimFlamm updated:

+ +

KasparoVy updated:

+ +

Markolie updated:

+ +

Twinmold93 updated:

+ +

uraniummeltdown updated:

+ + +

14 February 2017

+

Developed by Cyberboss, ported by Markolie updated:

+ +

DrunkDwarf updated:

+ +

Fethas updated:

+ +

Fox McCloud updated:

+ +

Markolie updated:

+ + +

13 February 2017

+

Crazylemon64 updated:

+ +

Fethas updated:

+ +

Fluff12 updated:

+ +

Fox McCloud updated:

+ +

Kyep updated:

+ +

Markolie updated:

+ +

uraniummeltdown updated:

+ + +

12 February 2017

+

Fox McCloud updated:

+ +

Kyep updated:

+ +

uraniummeltdown updated:

+ + +

11 February 2017

+

Markolie updated:

+ + +

10 February 2017

+

Fox McCloud updated:

+ +

KasparoVy, Krausus updated:

+ +

Markolie updated:

+ +

tigercat2000 updated:

+ +

uraniummeltdown updated:

+ + +

08 February 2017

+

Fox McCloud updated:

+ + +

07 February 2017

+

Fox MCCloud updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

Kyep updated:

+ +

uraniummeltdown updated:

+ + +

06 February 2017

+

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

Kyep updated:

+ +

uraniummeltdown updated:

+ + +

05 February 2017

+

Fethas updated:

+ +

Fox McCloud and Core0verload updated:

+ +

Ported by Markolie, developed by KorPhaeron and others from /tg/. The Hierophant was developed by ChangelingRain. updated:

+ +

uraniummeltdown updated:

+ + +

03 February 2017

+

DrunkDwarf updated:

+ + +

02 February 2017

+

Alexshreds updated:

+ +

Kyep updated:

+ +

uraniummeltdown updated:

+ + +

31 January 2017

+

Ar3nn updated:

+ +

FalseIncarnate updated:

+ +

Fethas updated:

+ +

FlattestGuitar updated:

+ +

uraniummeltdown updated:

+ + +

30 January 2017

+

Alexshreds updated:

+ + +

29 January 2017

+

uraniummeltdown updated:

+ + +

27 January 2017

+

Alffd updated:

+ +

Fox McCloud updated:

+ +

uraniummeltdown updated:

+ + +

26 January 2017

+

FalseIncarnate updated:

+ +

Fethas updated:

+ +

FreeStylaLT updated:

+ + +

25 January 2017

+

FlattestGuitar updated:

+ +

scrubmcnoob updated:

+ + +

23 January 2017

+

FalseIncarnate updated:

+ +

Stratus updated:

+ + +

18 January 2017

+

AndriiYukhymchak updated:

+ +

Fethas updated:

+ +

KasparoVy updated:

+ +

Markolie updated:

+ + +

17 January 2017

+

Crazylemon64 updated:

+ +

Krausus updated:

+ + +

16 January 2017

+

Alexshreds updated:

+ +

Krausus updated:

+ + +

15 January 2017

+

Funce updated:

+ +

TullyBurnalot updated:

+ + +

14 January 2017

+

Crazylemon64 updated:

+ +

Krausus updated:

+ + +

13 January 2017

+

DarkPyrolord updated:

+ +

TullyBurnalot updated:

+ +

uraniummeltdown updated:

+ + +

12 January 2017

+

TullyBurnalot updated:

+ + +

11 January 2017

+

Crazylemon64 updated:

+ +

Lady Luck updated:

+ +

Markolie updated:

+ +

uraniummeltdown updated:

+ + +

10 January 2017

+

Crazylemon updated:

+ +

Crazylemon64 updated:

+ +

Fox McCloud updated:

+ +

TullyBurnalot updated:

+ +

pinatacolada updated:

+ +

uraniummeltdown updated:

+ + +

09 January 2017

+

Crazylemon64 updated:

+ +

Kyep updated:

+ + +

07 January 2017

+

Markolie updated:

+ + +

06 January 2017

+

Crazylemon64 updated:

+ +

Fethas updated:

+ +

KasparoVy updated:

+ +

Krausus updated:

+ +

Kyep updated:

+ + +

03 January 2017

+

KasparoVy updated:

+ +

Kyep updated:

+ + +

02 January 2017

+

KasparoVy updated:

+ +

Krausus updated:

+ +

Kyep updated:

+ + +

01 January 2017

+

Kyep updated:

+ + +

31 December 2016

+

Crazylemon64 updated:

+ + +

30 December 2016

+

Crazylemon updated:

+ +

FalseIncarnate updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ + +

29 December 2016

+

Fethas updated:

+ +

Markolie updated:

+ + +

25 December 2016

+

FalseIncarnate updated:

+ +

KasparoVy updated:

+ + +

23 December 2016

+

Crazylemon64 updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

Markolie updated:

+ + +

20 December 2016

+

TullyBurnalot updated:

+ + +

14 December 2016

+

Fox McCloud updated:

+ + +

13 December 2016

+

TullyBurnalot updated:

+ + +

12 December 2016

+

Kyep updated:

+ +

TullyBurnalot updated:

+ + +

09 December 2016

+

KasparoVy updated:

+ + +

08 December 2016

+

Kyep updated:

+ + +

07 December 2016

+

Markolie updated:

+ +

TullyBurnalot updated:

+ + +

06 December 2016

+

Markolie updated:

+ + +

05 December 2016

+

KasparoVy updated:

+ + +

04 December 2016

+

KasparoVy updated:

+ + +

03 December 2016

+

Kyep updated:

+ + +

01 December 2016

+

Crazylemon64 updated:

+ +

KasparoVy updated:

+ +

Twinmold93 updated:

+ + +

29 November 2016

+

KasparoVy updated:

+ + +

28 November 2016

+

Allfd updated:

+ +

Crazylemon64 updated:

+ +

KasparoVy updated:

+ + +

26 November 2016

+

Fox McCloud updated:

+ + +

23 November 2016

+

Fethas updated:

+ +

FlattestNerd updated:

+ +

Fox McCloud updated:

+ + +

22 November 2016

+

KasparoVy updated:

+ +

Twinmold93 updated:

+ + +

20 November 2016

+

KasparoVy updated:

+ + +

15 November 2016

+

KasparoVy updated:

+ + +

13 November 2016

+

Fox McCloud updated:

+ + +

07 November 2016

+

Crazylemon updated:

+ +

Crazylemon64 updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

Twinmold93 updated:

+ + +

23 October 2016

+

KasparoVy updated:

+ + +

15 October 2016

+

Crazylemon64 updated:

+ +

FlattestGuitar updated:

+ +

Fox McCloud updated:

+ +

GeneralChaos81 updated:

+ +

KasparoVy updated:

+ +

Krausus updated:

+ + +

16 September 2016

+

Aurorablade updated:

+ +

Coldflame updated:

+ +

Crazylemon64 updated:

+ +

DaveTheHeadcrab updated:

+ +

FlattestGuitar updated:

+ +

FreeStylaLT updated:

+ +

IcyV updated:

+ +

Improvedname updated:

+ +

KasparoVy updated:

+ +

Krausus updated:

+ +

Kyep updated:

+ +

LittleBigKid2000 updated:

+ +

TheDZD updated:

+ +

Ty-Omaha updated:

+ + +

01 September 2016

+

Crazylemon updated:

+ +

monster860 updated:

+ + +

29 August 2016

+

Crazylemon updated:

+ +

DaveTheHeadcrab updated:

+ +

Fox McCloud updated:

+ +

Fox McCloud and KorPhaeron updated:

+ +

FreeStylaLT updated:

+ +

Krausus updated:

+ +

Kyep updated:

+ +

TheDZD updated:

+ +

TullyBurnalot updated:

+ + +

19 August 2016

+

Crazylemon updated:

+ +

FalseIncarnate updated:

+ +

Fox McCloud updated:

+ +

IcyV updated:

+ +

Krausus updated:

+ +

TheDZD updated:

+ + +

18 August 2016

+

Alexshreds updated:

+ +

Ar3nn updated:

+ +

Chakishreds updated:

+ +

Chopchop1614 updated:

+ +

Crazylemon updated:

+ +

Crazylemon64 updated:

+ +

DaveTheHeadcrab updated:

+ +

FalseIncarnate updated:

+ +

Fethas updated:

+ +

FlattestGuitar updated:

+ +

Fox McCloud updated:

+ +

FreeStylaLT updated:

+ +

General Chaos updated:

+ +

IcyV updated:

+ +

KorPhaeron and Fox McCloud updated:

+ +

Krausus updated:

+ +

Kyep updated:

+ +

LittleBigKid2000 updated:

+ +

Norgad updated:

+ +

TullyBurnalot updated:

+ +

Ty-Omaha updated:

+ +

taukausanake updated:

+ +

tristan1333 updated:

+ + +

08 August 2016

+

Ar3nn updated:

+ +

Chakirski updated:

+ +

Crazylemon64 updated:

+ +

FlattestGuitar updated:

+ +

Fox McCloud updated:

+ +

FreeStylaLT updated:

+ +

KasparoVy updated:

+ +

Krausus updated:

+ +

LittleBigKid2000 updated:

+ +

Pinatacolada updated:

+ +

Ty-Omaha updated:

+ +

Yurivw updated:

+ +

chopchop1614 updated:

+ + +

03 August 2016

+

Fox McCloud updated:

+ +

Krausus updated:

+ +

chopchop1614 updated:

+ + +

01 August 2016

+

Crazylemon64 updated:

+ +

Fethas updated:

+ +

Fox McCloud updated:

+ +

IcyV updated:

+ +

Krausus updated:

+ +

Kyep updated:

+ +

TheBeoni updated:

+ +

TheDZD updated:

+ +

TullyBurnalot updated:

+ +

Twinmold updated:

+ +

tigercat2000 updated:

+ + +

28 July 2016

+

A Giant-Ass Mountain of Salt updated:

+ +

Crazylemon64 updated:

+ +

FlattestGuitar updated:

+ +

Fox McCloud updated:

+ +

Fox-McCloud updated:

+ +

FreeStylaLT updated:

+ +

Krausus updated:

+ +

Kyep updated:

+ +

Spacemanspark updated:

+ +

TheDZD updated:

+ +

TullyBurnalot updated:

+ +

Twinmold updated:

+ +

Ty-Omaha updated:

+ +

monster860, clusterfack, and DeityLink updated:

+ +

tigercat2000 updated:

+ + +

21 July 2016

+

Alffd updated:

+ +

FalseIncarnate updated:

+ +

Fox McCloud updated:

+ +

FreeStylaLT updated:

+ +

Kyep updated:

+ +

TullyBBurnalot updated:

+ +

monster860 updated:

+ + +

20 July 2016

+

Allfd updated:

+ +

Ar3nn updated:

+ +

Chakirski updated:

+ +

CrAzYPiLoT updated:

+ +

Crazylemon64 updated:

+ +

DaveTheHeadcrab updated:

+ +

FalseIncarnate updated:

+ +

Fox McCloud updated:

+ +

FreeStylaLT updated:

+ +

KasparoVy updated:

+ +

Krausus updated:

+ +

Kyep updated:

+ +

LittleBigKid2000 and TullyBBurnalot updated:

+ +

Tauka Usanake updated:

+ +

TullyBBurnalot updated:

+ +

TullyBurnalot updated:

+ +

Twinmold updated:

+ +

monster860 updated:

+ +

tigercat2000 updated:

+ + +

13 July 2016

+

Ar3nn updated:

+ +

Chakirski updated:

+ +

DaveTheHeadcrab updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

Krausus updated:

+ +

Kyep updated:

+ +

TheDZD updated:

+ +

TullyBurnalot updated:

+ +

Twinmold updated:

+ +

monster860 updated:

+ + +

09 July 2016

+

Chakirski updated:

+ +

FalseIncarnate updated:

+ +

Fox McCloud updated:

+ +

FreeStylaLT updated:

+ +

Krausus updated:

+ +

TheDZD updated:

+ +

TullyBurnalot updated:

+ +

Twinmold updated:

+ + +

07 July 2016

+

Ar3nn updated:

+ +

FalseIncarnate updated:

+ +

Fox McCloud updated:

+ +

FreeStylaLT updated:

+ +

KasparoVy updated:

+ +

Krausus updated:

+ +

Kyep updated:

+ +

TheDZD updated:

+ +

TullyBurnalot updated:

+ + +

02 July 2016

+

Fethas updated:

+ +

Fox McCloud updated:

+ +

FreeStylaLT updated:

+ +

KasparoVy updated:

+ +

Krausus updated:

+ +

Kyep updated:

+ +

Tastyfish updated:

+ +

TheDZD updated:

+ +

VampyrBytes updated:

+ +

monster860 updated:

+ +

tigercat2000 updated:

+ + +

28 June 2016

+

CrAzYPiLoT updated:

+ +

DaveTheHeadcrab updated:

+ +

FalseIncarnate updated:

+ +

Fethas updated:

+ +

FlattestGuitar updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

Krausus updated:

+ +

Kyep updated:

+ +

LittleBigKid2000 updated:

+ +

Norgad updated:

+ +

Tastyfish updated:

+ +

TheDZD updated:

+ +

Twinmold updated:

+ +

VampyrBytes updated:

+ +

monster860 updated:

+ +

tigercat2000 updated:

+ +

tkdrg updated:

+ + +

19 June 2016

+

DaveTheHeadcrab updated:

+ +

Fox McCloud updated:

+ +

FreeStylaLT updated:

+ +

KasparoVy updated:

+ +

LittleBigKid2000 updated:

+ +

TheDZD updated:

+ +

Twinmold updated:

+ +

monster860 updated:

+ +

tkdrg, Delimusca, Aranclanos, TheDZD updated:

+ + +

12 June 2016

+

CrAzYPiLoT updated:

+ +

Crazylemon64 updated:

+ +

DaveTheHeadcrab updated:

+ +

Fox McCloud updated:

+ +

FreeStylaLT updated:

+ +

Glorken updated:

+ +

KasparoVy updated:

+ +

Krausus updated:

+ +

Many -tg-station Coders, TheDZD updated:

+ +

Spacemanspark updated:

+ +

Tauka Usanake updated:

+ +

Twinmold updated:

+ +

monster860 updated:

+ +

pinatacolada updated:

+ + +

02 June 2016

+

CrAzYPiLoT updated:

+ +

Crazylemon64 updated:

+ +

DaveTheHeadcrab updated:

+ +

Fox McCloud updated:

+ +

IK3I updated:

+ +

Tastyfish updated:

+ +

monster860 updated:

+ + +

31 May 2016

+

CrAzYPiLoT updated:

+ +

Fox McCloud updated:

+ +

QuinnAggeler updated:

+ +

Tastyfish updated:

+ +

monster860 updated:

+ + +

25 May 2016

+

CrAzYPiLoT updated:

+ +

Fox McCloud updated:

+ +

IK3I updated:

+ + +

24 May 2016

+

CrAzYPiLoT updated:

+ +

Crazylemon64 updated:

+ +

FalseIncarnate updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

QuinnAggeler updated:

+ +

Tastyfish updated:

+ +

monster860 updated:

+ + +

20 May 2016

+

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

QuinnAggeler updated:

+ +

monster860 updated:

+ + +

17 May 2016

+

AugRob updated:

+ +

Fox MCCloud updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

monster860 updated:

+ + +

10 May 2016

+

Crazylemon64 updated:

+ +

FalseIncarnate updated:

+ +

FlattestGuitar updated:

+ +

Fox McCloud updated:

+ +

IK3I updated:

+ +

NTSAM updated:

+ +

QuinnAggeler updated:

+ +

tigercat2000 updated:

+ + +

04 May 2016

+

CrAzYPiLoT updated:

+ +

Crazylemon64 updated:

+ +

Fethas updated:

+ +

FlattestGuitar updated:

+ +

Fox McCloud updated:

+ +

IK3I updated:

+ +

KasparoVy updated:

+ +

LittleBigKid2000 updated:

+ +

Norgad updated:

+ +

QuinnAggeler updated:

+ +

pinatacolada updated:

+ + +

25 April 2016

+

CrAzYPiLoT updated:

+ +

FlattestGuitar updated:

+ +

Fox McCloud updated:

+ +

Meisaka updated:

+ +

tigercat2000 updated:

+ + +

20 April 2016

+

Crazylemon64 updated:

+ +

FalseIncarnate updated:

+ +

FlattestGuitar updated:

+ +

Fox McCloud updated:

+ +

MarsM0nd updated:

+ +

Tastyfish updated:

+ +

monster860 updated:

+ +

tigercat2000 updated:

+ + +

14 April 2016

+

Aurorablade updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

Meisaka updated:

+ +

Tastyfish updated:

+ +

TheDZD updated:

+ +

monster860 updated:

+ + +

12 April 2016

+

FalseIncarnate updated:

+ +

Fethas updated:

+ +

Fox McCloud updated:

+ +

Tastyfish updated:

+ + +

07 April 2016

+

Crazylemon64 updated:

+ +

FalseIncarnate updated:

+ +

Fethas updated:

+ +

Fox McCloud updated:

+ +

Tastyfish updated:

+ +

tigercat2000 updated:

+ + +

02 April 2016

+

Crazylemon64 updated:

+ +

FalseIncarnate updated:

+ +

Fethas updated:

+ +

FlattestGuitar updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

ProperPants updated:

+ +

Tastyfish updated:

+ +

TheDZD updated:

+ +

tigercat2000 updated:

+ + +

26 March 2016

+

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

TheDZD updated:

+ + +

25 March 2016

+

Crazylemon64 updated:

+ +

FlattestGuitar updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ + +

22 March 2016

+

Crazylemon64 updated:

+ +

Fethas updated:

+ +

FlattestGuitar updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

Regens updated:

+ +

Tastyfish updated:

+ +

TheDZD updated:

+ +

TravellingMerchant updated:

+ +

tigercat2000 updated:

+ + +

16 March 2016

+

Crazylemon64 updated:

+ +

DaveTheHeadcrab updated:

+ +

FalseIncarnate updated:

+ +

Fethas updated:

+ +

FlattestGuitar updated:

+ +

Fox McCloud updated:

+ +

Tastyfish updated:

+ +

monster860 updated:

+ +

taukausanake updated:

+ + +

08 March 2016

+

Crazylemon64 updated:

+ +

Fethas updated:

+ +

Fox McCloud updated:

+ +

Spacemanspark updated:

+ +

Tastyfish updated:

+ +

TheDZD updated:

+ +

monster860 updated:

+ + +

07 March 2016

+

Crazylemon64 updated:

+ +

FalseIncarnate updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

Tastyfish updated:

+ +

VampyrBytes updated:

+ + +

26 February 2016

+

FalseIncarnate updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

Spacemanspark updated:

+ +

Tastyfish updated:

+ + +

24 February 2016

+

Crazylemon64 updated:

+ +

FalseIncarnate updated:

+ +

FlattestGuitar updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

PPI updated:

+ +

Regen1 updated:

+ +

Spacemanspark updated:

+ +

Tastyfish updated:

+ +

pinatacolada updated:

+ +

ppi updated:

+ + +

13 February 2016

+

Crazylemon64 updated:

+ +

DaveTheHeadcrab updated:

+ +

FalseIncarnate updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

TheDZD updated:

+ + +

10 February 2016

+

Crazylemon64 updated:

+ +

Fox McCloud updated:

+ +

Glorken updated:

+ +

KasparoVy updated:

+ +

PPI updated:

+ +

Regen updated:

+ +

Spacemanspark updated:

+ +

Tastyfish updated:

+ +

TheDZD updated:

+ + +

31 January 2016

+

Crazylemon64 updated:

+ +

FalseIncarnate updated:

+ +

Fox McCloud updated:

+ +

Tastyfish updated:

+ +

pinatacolada updated:

+ + +

29 January 2016

+

Crazylemon updated:

+ +

Crazylemon64 updated:

+ +

FalseIncarnate updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

Tastyfish updated:

+ +

TheDZD updated:

+ + +

24 January 2016

+

KasparoVy updated:

+ +

Tastyfish updated:

+ + +

23 January 2016

+

Fox McCloud updated:

+ +

Tastyfish updated:

+ +

Tigerbat2000 updated:

+ + +

20 January 2016

+

DarkPyrolord updated:

+ +

FalseIncarnate updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

Tastyfish updated:

+ +

TheDZD updated:

+ + +

18 January 2016

+

Crazylemon updated:

+ +

Dave The Headcrab updated:

+ +

Deanthelis updated:

+ +

Fethas updated:

+ +

Fox McCloud updated:

+ +

Jey updated:

+ +

KasparoVy updated:

+ +

Kyep updated:

+ +

NTSAM updated:

+ +

PPI updated:

+ +

Tastyfish updated:

+ +

Tigercat2000 updated:

+ + +

13 January 2016

+

Fox McCloud updated:

+ +

Kyep updated:

+ +

Tastyfish updated:

+ + +

11 January 2016

+

CrAzYPiLoT updated:

+ +

Crazylemon updated:

+ +

Dave The Headcrab updated:

+ +

Fox McCloud updated:

+ + +

08 January 2016

+

Crazylemon updated:

+ +

Dave The Headcrab updated:

+ +

FalseIncarnate updated:

+ +

Fethas updated:

+ +

Fox McCloud updated:

+ +

KasparoVy updated:

+ +

Tastyfish updated:

+ +

Tigercat2000 updated:

+ + +

06 January 2016

+

Certhic updated:

+ +

Crazylemon64 updated:

+ +

Tastyfish updated:

+ + +

03 January 2016

+

TheDZD updated:

+ +
+ +GoonStation 13 Development Team +
+ Coders: Stuntwaffle, Showtime, Pantaloons, Nannek, Keelin, Exadv1, hobnob, Justicefries, 0staf, sniperchance, AngriestIBM, BrianOBlivion
+ Spriters: Supernorn, Haruhi, Stuntwaffle, Pantaloons, Rho, SynthOrange, I Said No
+
+
+

Creative Commons License
Except where otherwise noted, Goon Station 13 is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 License.
Rights are currently extended to SomethingAwful Goons only.

+

Some icons by Yusuke Kamiyamane. All rights reserved. Licensed under a Creative Commons Attribution 3.0 License.

+ + + diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 51b62a2d299..cb60736309b 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -6355,3 +6355,28 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2018-04-28: MINIMAN10000: - rscadd: Developer express start +2018-04-30: + Fox McCloud: + - rscadd: 'Adds Guillotines: make them with plasteel, wood, and cable coil. Execute + your comdom head of staff TODAY' + - rscadd: Clapping now actually plays a clapping sound + - rscadd: Adds Blast cannon + FreeStylaLT: + - tweak: Medbay treatment center now has a wider entrance + - tweak: Virology hallway is now publically accessible from Surgery waiting room, + entrance is now double-doors. +2018-05-01: + Alffd: + - bugfix: Tell clients to rejoin after shutdown, before killing the server. + Fox McCloud: + - rscdel: Removed programmable unloader circuit + - bugfix: Bomb testing range can now be utilized multiple times without worry of + the bomb bouncing off and returning back to you +2018-05-02: + CrazyLemon and Fox McCloud: + - bugfix: Fixes reagent smoke +2018-05-04: + RyanSmake: + - bugfix: You will now log in to the proper account you input to the ATM instead + of the one associated with you. + - bugfix: Now ATMs will reconnect after a power outage. diff --git a/html/changelogs/AutoChangeLog-pr-8933.yml b/html/changelogs/AutoChangeLog-pr-8933.yml deleted file mode 100644 index 49ecc55e737..00000000000 --- a/html/changelogs/AutoChangeLog-pr-8933.yml +++ /dev/null @@ -1,3 +0,0 @@ -author: Fox McCloud -changes: [] -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-8936.yml b/html/changelogs/AutoChangeLog-pr-8936.yml deleted file mode 100644 index c4907653f89..00000000000 --- a/html/changelogs/AutoChangeLog-pr-8936.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - rscadd: "Adds Blast cannon" diff --git a/html/changelogs/AutoChangeLog-pr-8941.yml b/html/changelogs/AutoChangeLog-pr-8941.yml deleted file mode 100644 index da88bb3f516..00000000000 --- a/html/changelogs/AutoChangeLog-pr-8941.yml +++ /dev/null @@ -1,3 +0,0 @@ -author: Anasari -changes: [] -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-8957.yml b/html/changelogs/AutoChangeLog-pr-8957.yml deleted file mode 100644 index 49ecc55e737..00000000000 --- a/html/changelogs/AutoChangeLog-pr-8957.yml +++ /dev/null @@ -1,3 +0,0 @@ -author: Fox McCloud -changes: [] -delete-after: true diff --git a/icons/obj/guillotine.dmi b/icons/obj/guillotine.dmi new file mode 100644 index 00000000000..e985dbaa825 Binary files /dev/null and b/icons/obj/guillotine.dmi differ diff --git a/paradise.dme b/paradise.dme index 9b2f16a089a..9e3ca19d3b9 100644 --- a/paradise.dme +++ b/paradise.dme @@ -218,7 +218,6 @@ #include "code\datums\beam.dm" #include "code\datums\browser.dm" #include "code\datums\callback.dm" -#include "code\datums\cargoprofile.dm" #include "code\datums\computerfiles.dm" #include "code\datums\datacore.dm" #include "code\datums\datum.dm" @@ -582,7 +581,6 @@ #include "code\game\machinery\poolcontroller.dm" #include "code\game\machinery\portable_tag_turret.dm" #include "code\game\machinery\portable_turret.dm" -#include "code\game\machinery\programmable_unloader.dm" #include "code\game\machinery\quantum_pad.dm" #include "code\game\machinery\recharger.dm" #include "code\game\machinery\rechargestation.dm" @@ -882,7 +880,6 @@ #include "code\game\objects\items\weapons\stock_parts.dm" #include "code\game\objects\items\weapons\stunbaton.dm" #include "code\game\objects\items\weapons\swords_axes_etc.dm" -#include "code\game\objects\items\weapons\syndie_uplink.dm" #include "code\game\objects\items\weapons\tape.dm" #include "code\game\objects\items\weapons\teleportation.dm" #include "code\game\objects\items\weapons\teleprod.dm" @@ -891,7 +888,6 @@ #include "code\game\objects\items\weapons\vending_items.dm" #include "code\game\objects\items\weapons\weaponry.dm" #include "code\game\objects\items\weapons\whetstone.dm" -#include "code\game\objects\items\weapons\wires.dm" #include "code\game\objects\items\weapons\grenades\atmosgrenade.dm" #include "code\game\objects\items\weapons\grenades\bananade.dm" #include "code\game\objects\items\weapons\grenades\chem_grenade.dm" @@ -966,6 +962,7 @@ #include "code\game\objects\structures\fullwindow.dm" #include "code\game\objects\structures\girders.dm" #include "code\game\objects\structures\grille.dm" +#include "code\game\objects\structures\guillotine.dm" #include "code\game\objects\structures\holosign.dm" #include "code\game\objects\structures\inflatable.dm" #include "code\game\objects\structures\janicart.dm" diff --git a/sound/items/unsheath.ogg b/sound/items/unsheath.ogg new file mode 100644 index 00000000000..388ff1fc189 Binary files /dev/null and b/sound/items/unsheath.ogg differ diff --git a/sound/misc/clap1.ogg b/sound/misc/clap1.ogg new file mode 100644 index 00000000000..a9a6cc71f83 Binary files /dev/null and b/sound/misc/clap1.ogg differ diff --git a/sound/misc/clap2.ogg b/sound/misc/clap2.ogg new file mode 100644 index 00000000000..72e26d4a241 Binary files /dev/null and b/sound/misc/clap2.ogg differ diff --git a/sound/misc/clap3.ogg b/sound/misc/clap3.ogg new file mode 100644 index 00000000000..7a72ab9bf3c Binary files /dev/null and b/sound/misc/clap3.ogg differ diff --git a/sound/misc/clap4.ogg b/sound/misc/clap4.ogg new file mode 100644 index 00000000000..cdc533ca771 Binary files /dev/null and b/sound/misc/clap4.ogg differ