diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 0d6ad787976..b50efa38848 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -738,7 +738,7 @@ "aoj" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_y = 28},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main) "aok" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main) "aol" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/light{dir = 1},/turf/simulated/floor/engine,/area/security/podbay) -"aom" = (/obj/machinery/door/poddoor/four_tile_ver{id_tag = "secpodbay"},/obj/structure/spacepoddoor,/turf/simulated/floor/engine,/area/security/podbay) +"aom" = (/obj/machinery/door/poddoor/multi_tile/four_tile_ver{id_tag = "secpodbay"},/obj/structure/spacepoddoor,/turf/simulated/floor/engine,/area/security/podbay) "aon" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/range) "aoo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/range) "aop" = (/obj/structure/rack{pixel_y = 2},/obj/item/weapon/gun/energy/laser/practice{pixel_x = 2; pixel_y = -2},/obj/item/weapon/gun/energy/laser/practice{pixel_x = -3; pixel_y = 3},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera{c_tag = "Firing Range"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/security/range) @@ -1327,7 +1327,7 @@ "azA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/starboard) "azB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/starboard) "azC" = (/obj/structure/flora/kirbyplants,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay) -"azD" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/three_tile_ver{id_tag = "mechpodbay"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop) +"azD" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/multi_tile/three_tile_ver{id_tag = "mechpodbay"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop) "azE" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay) "azF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/maintenance/starboard) "azG" = (/obj/structure/closet/crate/medical,/obj/item/stack/cable_coil,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/maintenance/starboard) @@ -8448,7 +8448,7 @@ "dgy" = (/obj/structure/extinguisher_cabinet,/turf/simulated/wall/r_wall,/area/hallway/secondary/entry{name = "Arrivals"}) "dgz" = (/turf/simulated/floor/engine,/area/hallway/secondary/entry{name = "Arrivals"}) "dgA" = (/obj/machinery/firealarm,/turf/simulated/wall/r_wall,/area/hallway/secondary/entry{name = "Arrivals"}) -"dgB" = (/obj/machinery/door/poddoor/four_tile_hor{id_tag = "escapepodbay"},/obj/structure/spacepoddoor{dir = 4; icon_state = "n_beam"; tag = ""},/turf/simulated/floor/engine,/area/hallway/secondary/entry{name = "Arrivals"}) +"dgB" = (/obj/machinery/door/poddoor/multi_tile/four_tile_hor{id_tag = "escapepodbay"},/obj/structure/spacepoddoor{dir = 4; icon_state = "n_beam"; tag = ""},/turf/simulated/floor/engine,/area/hallway/secondary/entry{name = "Arrivals"}) "dgC" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/maintenance/starboard) "dgD" = (/obj/machinery/camera{c_tag = "Quartermaster's Office"; dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor/engine,/area/hallway/secondary/entry{name = "Arrivals"}) "dgE" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/starboard) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 4fbd6a57865..00e7cc5cac1 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -231,7 +231,7 @@ "aew" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/security/hos) "aex" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "aey" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/warning_stripes/blue/hollow,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/security/podbay) -"aez" = (/obj/structure/spacepoddoor{luminosity = 3},/obj/machinery/door/poddoor/four_tile_ver{id_tag = "secpodbay"; layer = 3.1; req_access_txt = "71"},/turf/simulated/floor/engine,/area/security/podbay) +"aez" = (/obj/structure/spacepoddoor{luminosity = 3},/obj/machinery/door/poddoor/multi_tile/four_tile_ver{id_tag = "secpodbay"; layer = 3.1; req_access_txt = "71"},/turf/simulated/floor/engine,/area/security/podbay) "aeA" = (/turf/simulated/wall/r_wall,/area/security/range) "aeB" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence) "aeC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence) @@ -2447,7 +2447,7 @@ "aVc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/wall,/area/hydroponics) "aVd" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Hydroponics Maintenance"; req_access_txt = "35"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aVe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/hydroponics) -"aVf" = (/obj/machinery/power/apc{dir = 1; name = "Hydroponics APC"; pixel_y = 24},/obj/structure/table,/obj/machinery/reagentgrinder,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"aVf" = (/obj/machinery/alarm{pixel_y = 24},/obj/machinery/camera{c_tag = "Hydroponics Storage"; network = list("SS13")},/obj/structure/closet/crate/hydroponics/prespawned,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aVg" = (/obj/machinery/chem_master,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aVh" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aVi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/library) @@ -2521,19 +2521,19 @@ "aWy" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "aWz" = (/mob/living/simple_animal/hostile/retaliate/goat,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "aWA" = (/obj/machinery/door/window/eastright{tag = "icon-right"; name = "Hydroponics Delivery"; icon_state = "right"; dir = 2; req_access_txt = "35"},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) -"aWB" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/window/reinforced{dir = 8},/obj/machinery/alarm{pixel_y = 22},/obj/machinery/camera{c_tag = "Hydroponics Pasture"; network = list("SS13")},/obj/structure/flora/ausbushes/grassybush,/turf/simulated/floor/grass,/area/hydroponics) +"aWB" = (/obj/structure/table,/obj/item/weapon/book/manual/hydroponics_pod_people,/obj/item/weapon/paper/hydroponics,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aWC" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics) "aWD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/grass,/area/hydroponics) "aWE" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics) -"aWF" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/closet/crate/hydroponics/prespawned,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) -"aWG" = (/obj/structure/table,/obj/item/weapon/watertank,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) -"aWH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"aWF" = (/obj/machinery/power/apc{dir = 1; name = "Hydroponics APC"; pixel_y = 24},/obj/structure/table,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"aWG" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/window/reinforced{dir = 8},/obj/machinery/alarm{pixel_y = 22},/obj/machinery/camera{c_tag = "Hydroponics Pasture"; network = list("SS13")},/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics) +"aWH" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aWI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/hydroponics) "aWJ" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/structure/closet/secure_closet/hydroponics,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aWK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aWL" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/wall,/area/hydroponics) "aWM" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) -"aWN" = (/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"aWN" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/atmospherics/pipe/simple/visible{dir = 10},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aWO" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aWP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall,/area/library) "aWQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light{dir = 8},/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/library) @@ -2552,7 +2552,7 @@ "aXd" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/machinery/atmospherics/unary/vent_pump,/obj/effect/decal/warning_stripes/yellow/hollow,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/escapepodbay) "aXe" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/engine,/area/escapepodbay) "aXf" = (/obj/machinery/light,/turf/simulated/floor/engine,/area/escapepodbay) -"aXg" = (/obj/structure/spacepoddoor{luminosity = 3},/obj/machinery/door/poddoor/four_tile_ver{id_tag = "escapepodbay"; layer = 3.1; req_one_access_txt = "13"},/turf/simulated/floor/engine,/area/escapepodbay) +"aXg" = (/obj/structure/spacepoddoor{luminosity = 3},/obj/machinery/door/poddoor/multi_tile/four_tile_ver{id_tag = "escapepodbay"; layer = 3.1; req_one_access_txt = "13"},/turf/simulated/floor/engine,/area/escapepodbay) "aXh" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/arrival/station) "aXi" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry) "aXj" = (/obj/structure/stool/bed/chair/comfy/beige,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry) @@ -2627,11 +2627,11 @@ "aYA" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "asteroid"; tag = "icon-asteroid (NORTH)"},/turf/simulated/floor/plasteel{tag = "icon-siding2 (NORTH)"; icon_state = "siding2"; dir = 1},/turf/simulated/floor/plasteel{tag = "icon-siding1 (NORTH)"; icon_state = "siding1"; dir = 1},/area/hydroponics) "aYB" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Hydroponics Pasture"; req_access_txt = "35"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aYC" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) -"aYD" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) -"aYE" = (/obj/machinery/alarm{pixel_y = 24},/obj/machinery/camera{c_tag = "Hydroponics Storage"; network = list("SS13")},/obj/structure/table,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 8; pixel_y = 8},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 0; pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"aYD" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"aYE" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 8; pixel_y = 8},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 0; pixel_y = 3},/obj/item/weapon/watertank,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aYF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/closet/secure_closet/hydroponics,/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aYG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) -"aYH" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = -31},/obj/machinery/light,/obj/machinery/atmospherics/binary/valve{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"aYH" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "aYI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/wood,/area/library) "aYJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/library) "aYK" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/library) @@ -2713,7 +2713,7 @@ "bai" = (/mob/living/simple_animal/cow{name = "Betsy"},/turf/simulated/floor/grass,/area/hydroponics) "baj" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/grass,/area/hydroponics) "bak" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hydroponics) -"bal" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Hydroponics"; req_access_txt = "35"},/turf/simulated/floor/plasteel,/area/hydroponics) +"bal" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = -31},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "bam" = (/obj/machinery/bookbinder{pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/wood,/area/library) "ban" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/library) "bao" = (/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/library) @@ -2785,14 +2785,14 @@ "bbC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/flora/ausbushes/fullgrass,/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics) "bbD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/portable_atmospherics/hydroponics/soil,/mob/living/simple_animal/chicken{name = "Commander Clucky"},/turf/simulated/floor/grass,/area/hydroponics) "bbE" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/grass,/area/hydroponics) -"bbF" = (/obj/machinery/botany/editor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) -"bbG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) -"bbH" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"bbF" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11; level = 2},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"bbG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"bbH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "bbI" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) -"bbJ" = (/obj/machinery/vending/hydroseeds,/obj/machinery/camera{c_tag = "Hydroponics North"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) -"bbK" = (/obj/machinery/biogenerator,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) -"bbL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/requests_console{department = "Hydroponics"; departmentType = 2; name = "Hydroponics Requests Console"; pixel_x = 0; pixel_y = 30},/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) -"bbM" = (/obj/machinery/floodlight,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) +"bbJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"bbK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/hydroponics) +"bbL" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/hydroponics) +"bbM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Hydroponics"; req_access_txt = "35"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "bbN" = (/obj/structure/bookcase{name = "bookcase (Religious)"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/wood,/area/library) "bbO" = (/obj/structure/bookcase{name = "bookcase (Religious)"},/turf/simulated/floor/wood,/area/library) "bbP" = (/turf/simulated/floor/carpet,/area/library) @@ -2860,11 +2860,11 @@ "bcZ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Hydroponics Pasture"; req_access_txt = "28"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bda" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/kitchen) "bdb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/kitchen) -"bdc" = (/obj/machinery/light{dir = 8},/obj/machinery/botany/extractor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) +"bdc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/disposalpipe/segment,/obj/machinery/requests_console{department = "Hydroponics"; departmentType = 2; name = "Hydroponics Requests Console"; pixel_x = 0; pixel_y = 30},/obj/machinery/botany/extractor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "bdd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "green"},/area/hydroponics) "bde" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/hydroponics) -"bdf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "green"},/area/hydroponics) -"bdg" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/floodlight,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) +"bdf" = (/obj/machinery/botany/editor,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) +"bdg" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/seed_extractor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "bdh" = (/obj/structure/disposalpipe/segment,/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/fsmaint2) "bdi" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "bdj" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/wood,/area/library) @@ -3187,7 +3187,7 @@ "bjo" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) "bjp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bjq" = (/obj/machinery/processor,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) -"bjr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"bjr" = (/obj/machinery/biogenerator,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "bjs" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "bjt" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "bju" = (/turf/simulated/wall,/area/hallway/primary/starboard/east) @@ -3273,7 +3273,7 @@ "bkW" = (/obj/structure/table/woodentable,/obj/item/weapon/kitchen/utensil/fork,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bkX" = (/obj/effect/landmark/start{name = "Chef"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bkY" = (/obj/structure/table,/obj/machinery/reagentgrinder,/obj/machinery/requests_console{department = "Kitchen"; name = "Kitchen Requests Console"; departmentType = 2; pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) -"bkZ" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) +"bkZ" = (/obj/machinery/camera{c_tag = "Hydroponics North"; network = list("SS13")},/obj/machinery/vending/hydroseeds,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "bla" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "blb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 16},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "blc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) @@ -6473,7 +6473,7 @@ "cuy" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) "cuz" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cuA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_xeno_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/starboardsolar) -"cuB" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/three_tile_ver{id_tag = "mechpodbay"; layer = 3.1; req_access_txt = "70"},/turf/simulated/floor/engine,/area/engine/mechanic_workshop) +"cuB" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/multi_tile/three_tile_ver{id_tag = "mechpodbay"; layer = 3.1; req_access_txt = "70"},/turf/simulated/floor/engine,/area/engine/mechanic_workshop) "cuC" = (/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "mechpodbay"; name = "Pod Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "70"},/turf/simulated/floor/engine,/area/engine/mechanic_workshop) "cuD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/engine,/area/engine/mechanic_workshop) "cuE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/engine,/area/engine/mechanic_workshop) @@ -7180,7 +7180,7 @@ "cId" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cIe" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/photocopier/faxmachine{department = "Chief Engineer's Office"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cIf" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/item/weapon/book/manual/sop_medical,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/medbreak) -"cIg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"cIg" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "cIh" = (/obj/structure/closet/secure_closet/engineering_welding,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cIi" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cIj" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) @@ -7733,7 +7733,7 @@ "cSK" = (/obj/machinery/light/spot,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate) "cSL" = (/obj/machinery/light/small{dir = 8},/obj/machinery/power/emitter,/turf/simulated/floor/plating,/area/storage/secure) "cSM" = (/obj/machinery/power/emitter,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/storage/secure) -"cSN" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"cSN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "cSO" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) "cSP" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/engine/engineering) "cSQ" = (/obj/machinery/field/generator{anchored = 1; state = 2},/turf/simulated/floor/plating/airless,/area/space) @@ -8025,7 +8025,7 @@ "cYq" = (/turf/simulated/floor/plating{icon_state = "platingdmg3"},/area/maintenance/asmaint2) "cYr" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/turf/simulated/wall/r_wall,/area/maintenance/turbine) "cYs" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 5; tag = "icon-intact-y (NORTHWEST)"},/turf/simulated/wall/r_wall,/area/maintenance/turbine) -"cYt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"cYt" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "cYu" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology) "cYv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plating,/area/maintenance/turbine) "cYw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine) @@ -8074,8 +8074,8 @@ "cZn" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/item/latexballon,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cZo" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cZp" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"cZq" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/hydroponics) -"cZr" = (/obj/machinery/seed_extractor,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) +"cZq" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/floodlight,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) +"cZr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "green"},/area/hydroponics) "cZs" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine) "cZt" = (/obj/machinery/atmospherics/binary/valve,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine) "cZu" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/turbine) @@ -8427,7 +8427,7 @@ "dgc" = (/obj/machinery/door/airlock/glass{name = "Pod Bay"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned) "dgd" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/plating,/area/shuttle/abandoned) "dge" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f10"; icon_state = "swall_f10"},/area/shuttle/abandoned) -"dgf" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/two_tile_ver{id_tag = "whiteshippoddoor"; layer = 3.1},/turf/simulated/shuttle/plating,/area/shuttle/abandoned) +"dgf" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/multi_tile/two_tile_ver{id_tag = "whiteshippoddoor"; layer = 3.1},/turf/simulated/shuttle/plating,/area/shuttle/abandoned) "dgg" = (/obj/machinery/door_control{id = "whiteshippoddoor"; name = "Pod Door Control"; pixel_y = -24},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned) "dgh" = (/obj/structure/table,/obj/item/weapon/screwdriver,/obj/machinery/light,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned) "dgi" = (/obj/structure/table,/obj/item/device/radio,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned) @@ -8722,6 +8722,7 @@ "dlL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) "dlM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A) "dlN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C) +"dlO" = (/obj/machinery/light{dir = 8},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "dlP" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 5"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/B) "dlQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow,/obj/machinery/treadmill_monitor{id = "Cell 5"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B) "dlR" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 4"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/A) @@ -8850,17 +8851,17 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaNhaNmaNiaODaOEaOFaOGaOHaOIaOJaOKaOLaOMaONaOOaKzaKBaOPaMoaOQaORaOSaOTaOSaOUaKHaOVaMqaOWaOXaOYaOXaOZaPaaPbaPcaPdaPdaPdaPdaPdaPdaPeaPfaMvbikaLRaPgaNHaPhaNJaPiaLRbikaJGaJLaJMaPjaPkaPlaPmaPnaJMaGvaIKaPoaPoaKPaPpaMHaKSaPqaKSaMHaPraKWaPsaPsaIKaPtazUaPuazIaKbaEeaPvaPvaPvaPvaPwaPxaPyaPzaPAaPBaPBaPBaPCaPBaPDaPEaPFaPGaPHaPEaPIaPJazxayGayGayGayGayGayGayGayGayGayGayGayGaBMayGayGayGayGayHaDxaOiazvaabazvayHaPLaPMaPNaPOaPPaPQaPRaPRaPRaPRaPSaPTaPUaPVaPWaPXaPWaPYaPWaPWaPZaQaaQbaQbaQcaQdaQeaQeaQeaQeaQeaQeaQeaQeaQeabLadbbikbikbikbikbikbikbikaaabdBaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaONaQgaQhaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaQmaMoaQnaQoaQpaQqaQraQsaKHaQtaMqaQuaQvaQwaQxaQyaKHaQzaPdaPdaPdaPdaPdaPdaPdaPeaQAaMvaabaLRaQBaQCaQDaQEaQFaLRaabaJGaJLaJMaQGaQHaQIaQJaQKaJMaGvaIKaIKaIKaIKaQLaLXaJOaLYaJOaLXaQMaIKaIKaIKaIKaQNaQOaQPazIaMKaQQaQRaQRaQRaQSaQTaQUaQVaQWaQXaQVaQYaQZaRaaQVaRbaRcaRdaReaRfaMeaRgaRhaRiaRjaRjaRhaRkaRlaRlaRlaRlaRlaRmaRnaRlaRoaRpaRqaRraRsaRvaRuaTkaRwaRxaRwaRyaRzayHayGaRAaRBaRCaRDaREaRFaRGaRHaRIaRJaRIaRKaRLaRMaRNaROaRPaRQaRRaRSaRTaRUaQdaRVaRWaRXaRYaRZaSaaSbaScaSdaprbikbikbikbikbikbikbikaaabfmbifbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSfaOFaOFaNjaOMaQjaOFaQjaSgaQjaOFaQjaOMaQkaQlaKzaKBaShaMoaMoaSiaSjaSkaSjaMoaKHaKHaKHaKHaSlaSmaSnaSoaKHaSpaSqaSraPdaPdaSsaPdaStaSuaSvaMvbikaLRaLRaSwaSxaSwaLRaLRbikaJGaJLaJMaSyaSzaSAaQJaSBaJMaGvaIKaJNaJOaSCaNRaLXaJOaLYaJOaLXaNTaSDaIKaIKaIKaSEaSFaSGaSHaSIaSJamKamKaSKaSLaSMaSNaMcaSOaMQaMcaSPaMcaSQaMcaSRaSSaSTaSUaSVaTeaSXaSYaSZaTaaTbaTcaTdaTbaTbaUjaTbaSYaTfaSYaOvaTgaSYaThaTiaTjaTmaTlaToaTnaTqaTpaWIaTraOuaTsaTtaTuaTvaTwaTxaTyaTzaRHaTAaTBaRIaTCaTDaTEaTFaROaTGaRQaRRaRSaTHaTIaQdaTJaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikaaabfmbigbijbihbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaONaTMaTNaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaTOaTPaTQaTRaTSaTSaJraTTaTUaTVaTWaTXaTYaTZaMqcoCaKHaUbaUcaUdaUeaUfaUgaUhaUiaUZaUkaMvbikaabbikaUlaUmaUlbikaabbikaCuaJLaJMaUnaUoaUpaUqaUraJMaGvaIKaUsaUtaKPaUuaUvaKSaUwaKSaUxaUyaUzaIKaUAaUBaUCaUDaUEaUFaUGaUHbikbikaSKaUIaUJaUKaMcaULaUMaMQaMQaUNaMQaMQaMQaUOaMeaUPaMeaUQaURaMeaUSaMeaUTaUUaUVaUWaUXaUYaUTbwNaVaaVbaVcaVbaVbaVbaVbaVdaWLaVbaVeaYEaVfaVgaVbaVhayHaRDaViaTvaVjaVkaVlaVmaVnaVoaVpaVqaRIaVraVsaVtaVuaVvaTGaRQaRRaRSaRTaVwaQdaVxaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikbdBblqbjMbmKbjMbqQbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVyaVzaNiaODaOMaOFaVAaVBaOFaOFaVCaVAaOMaONaVDaKzaKBaVEaVFaVGaVHaVGaVGaVGaVGaVGaVIaJraKHaVJaVKaVJaKHaKHaVLaVMaVLaMuaMuaMuaMuaVLaVNaVOaMvaVPaVQaVQaVRaVSaVRaVQaVQaVTaVUaVVaJMaVWaJMaVXaVYaVZaJMaWaaIKaIKaIKaIKaWbaWcaWdaWeaWdaWcaWbaIKaIKaWfaUDaUDaUDaUDaWgaWhaWiaWjaWkaSKaWlaUJaWmaMcaMcaMcaMcaMcaMcaMcaMeaMeaUOaWnaWoaWpaWqaWraWsaWuaWtaUTaWvaWwaWxaWyaWzaUTaWAaWBaWCaWDaWCaWEaWFaWGaWHaYFaWJaWKaYGaWMaWNaVbaWOaRtaWPaWQaWRaVjbtTcvIaVmaWTaRIaWUaWVaWWaWXaWYaTFaTFaRIaRIaRQaRRaRSaTHaWZaQdaXaaXbaXcaXdaXeaXfaScaScaXgaprbikbikbikbikbikaaabfmbqRbmKbmKbmKbqSbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVyaNiaNjaNiaNiaNkaNlaNiaNiaNjaVzaXhaCuaXiaVEaInaXjaXjaXkaXjaXlaDEaXmaXnaJraXoaXpaXqaXqaXraXsaXqaXtaXqaXqaXqaXuaXqaXqaXvaXwaXxaXyaXzaXAaXyaXBaXyaXyaXyaXyaXCaXDaXEaXqaXqaXFaXGaXHaXIaXJaXKaXLaXMaXRaXPaXPaXPaXPaXPaXPaXPaXQaXWaXXaXSaXTaXUaXVaXYaZHaXZaUDaUDaYaaYbaYcaYbaYcaYdaYeaYfaYgaYhaYiaMeaYkbBvaYmaYlaYnaYnaYoaYpaYqaYraUTaYsaYtaYuaYuaYvaUTaYwaYxaYyaYzaYAaYAaYBaYCaYDbbHaYHcIgbjrcYtcSNaVbaVhaKsaRDaYIaYJaYJaYKaYLaYJaYMaRIaYNaYOaRIaYPaYQaTFaYRaRIaYSaYTaYUaRSaQbaQbaQdaYVaQeaYWaYXaQeaQeaQeaQeaQeabLadbbikbikbikbikbqUbqTbqVbmKbmKbrUbthbmKbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaYYaKzaKzaKzaKzaKzaKzaYYaInaMlaCuaYZaZaaInaZbaZcaZdaZdaZeaDEaZfaXnaZgaZhaXpaZiaZjaZkaZlaZlaZmaZnaZnaZnaZoaZpaZpaZqaZraZsaZlaZlaZtaZpaZvaZwaZxaZxaZyaZzaZAaZuaZuaZuaZBaXGaXHaXIaXJaXJaXJaXJaZCaXJaXJaXJaXJaXJaXJaZDaZEaZNaZFaZGaZJaZIaZLaZKaZMaZNaZNaZNaZOaZPaZPaZPaZQaYiaYiaYiaZRaZSaYiaMebbsaZUaYnaYnaZVaYnaZWaZXaYqaZYaUTaZZbaababbacbadaUTbaebafbagbahbaibajaVbbakbalcZqaVbaVbaVbaVeaVbaVbaVhayHaRDbamaTvaTvaTvbanaTvbaoaRIaRIaRIaRIaRIaRIaRIbapaRIaRSaRSaRRaRSbaqbaraQbbasbatbaubavbawbaxbaybazbaAbikbikbikbikaaabtibtjbtibtibtibtkbtibtlbtibtjbtiaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaLyaCuaInaGdaKzbaBbaCbaDbaEaKzaGdaInaInaCubaFaVEaInbaGbaHaZdaZdaZeaDEbaIaXnaJraZhaXpaXqbaJbaKbaLbaLbaMbaNbaObaLbaPbaLbaQbaLbaRbaSbaLbaLbaWbaLbaLbaUbaVbaLbaWbaXbaYbaZaXqaXqbbabbbbbcbbdbbebbfbbebbgbbhbbgbbgbbgbbgbbgbbgbbibbjbbkbbkbbkbbkbblbbkbbmbbnbbkbbkbbobbpbbqbbqbbqbbqbbqbbqbbqbbraYiaYiaMebcTbbtbbubbvbbvbbwbbxaZXaYqbbyaUTaUTaUTaUTaUTbbzaUTbbAbbBbbCbbDaWCbbEaVbbbFbbGcZrbbIbbJbbKbbLbbMaVbaVhaHYaRDbbNbbOaTvbbPbbQaTvbbRbbRaRDbbSbbTbbUaQbbbVbbWbbXaRSaRSbbYbbZaQbbcaaQbbcbbatbccbcdbcebatbatbcfbaAbikbikbikbikbqUbtmbwlbutbwmbtmbmKbutbwmbtmbwlbutbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaDEaInaYYaKzaKBaJraJraKCaKzaYYaKzbcgbchbcibcjaInbckbckaXkbckaXlaDEbclaXnaJraDEbcmbcmbcnbcobcobcobcobcobcobcpbcqbcobcobcobcobcobcobcrbcsbctbctbcubctbcvbcwbcxbcvbcvbcybczbcAbcmbcBbcBbcCbcCbcCbcDbcDbcDbcDbcDbcDbcDbcDbcEbcFbcFbcGbcFbcHbcHbcHbcHbcIbcJbcHbcEbcKbcKbcKbcKbcKbcKbcKbcKbcLbcLbcLaMebcMbcNbcObcObcObcObcPbcQbcRbmwbcUaZTbcVbcWbcXbcYaUTaUTbcZbdabdbbdabdaaVbbdcbdddcnbdebdebdebdfbdgaVbbdhbdiaRDbdjaTvbbPbbPbbQbbPaTvbdkaRDbdlbdmbdnaQbaRSbdobdpbdqbdqbdrbdsbdtbdubdvbdwbdxbdybdzbavbatbatbdAbaAbikbikbikbikbqUbwnbmKbutbBQbtmbmKbutbBQbtmbmKbFmbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaONaTMaTNaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaTOaTPaTQaTRaTSaTSaJraTTaTUaTVaTWaTXaTYaTZaMqcoCaKHaUbaUcaUdaUeaUfaUgaUhaUiaUZaUkaMvbikaabbikaUlaUmaUlbikaabbikaCuaJLaJMaUnaUoaUpaUqaUraJMaGvaIKaUsaUtaKPaUuaUvaKSaUwaKSaUxaUyaUzaIKaUAaUBaUCaUDaUEaUFaUGaUHbikbikaSKaUIaUJaUKaMcaULaUMaMQaMQaUNaMQaMQaMQaUOaMeaUPaMeaUQaURaMeaUSaMeaUTaUUaUVaUWaUXaUYaUTbwNaVaaVbaVcaVbaVbaVbaVbaVdaWLaVbaVeaVfaWFaWBaVbaVhayHaRDaViaTvaVjaVkaVlaVmaVnaVoaVpaVqaRIaVraVsaVtaVuaVvaTGaRQaRRaRSaRTaVwaQdaVxaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikbdBblqbjMbmKbjMbqQbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVyaVzaNiaODaOMaOFaVAaVBaOFaOFaVCaVAaOMaONaVDaKzaKBaVEaVFaVGaVHaVGaVGaVGaVGaVGaVIaJraKHaVJaVKaVJaKHaKHaVLaVMaVLaMuaMuaMuaMuaVLaVNaVOaMvaVPaVQaVQaVRaVSaVRaVQaVQaVTaVUaVVaJMaVWaJMaVXaVYaVZaJMaWaaIKaIKaIKaIKaWbaWcaWdaWeaWdaWcaWbaIKaIKaWfaUDaUDaUDaUDaWgaWhaWiaWjaWkaSKaWlaUJaWmaMcaMcaMcaMcaMcaMcaMcaMeaMeaUOaWnaWoaWpaWqaWraWsaWuaWtaUTaWvaWwaWxaWyaWzaUTaWAaWGaWCaWDaWCaWEaWHaYDaWNaYFaWJaWKaYGaWMaYEaVbaWOaRtaWPaWQaWRaVjbtTcvIaVmaWTaRIaWUaWVaWWaWXaWYaTFaTFaRIaRIaRQaRRaRSaTHaWZaQdaXaaXbaXcaXdaXeaXfaScaScaXgaprbikbikbikbikbikaaabfmbqRbmKbmKbmKbqSbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVyaNiaNjaNiaNiaNkaNlaNiaNiaNjaVzaXhaCuaXiaVEaInaXjaXjaXkaXjaXlaDEaXmaXnaJraXoaXpaXqaXqaXraXsaXqaXtaXqaXqaXqaXuaXqaXqaXvaXwaXxaXyaXzaXAaXyaXBaXyaXyaXyaXyaXCaXDaXEaXqaXqaXFaXGaXHaXIaXJaXKaXLaXMaXRaXPaXPaXPaXPaXPaXPaXPaXQaXWaXXaXSaXTaXUaXVaXYaZHaXZaUDaUDaYaaYbaYcaYbaYcaYdaYeaYfaYgaYhaYiaMeaYkbBvaYmaYlaYnaYnaYoaYpaYqaYraUTaYsaYtaYuaYuaYvaUTaYwaYxaYyaYzaYAaYAaYBaYCaYHbbFbalbbHbbGbbJaVgaVbaVhaKsaRDaYIaYJaYJaYKaYLaYJaYMaRIaYNaYOaRIaYPaYQaTFaYRaRIaYSaYTaYUaRSaQbaQbaQdaYVaQeaYWaYXaQeaQeaQeaQeaQeabLadbbikbikbikbikbqUbqTbqVbmKbmKbrUbthbmKbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaYYaKzaKzaKzaKzaKzaKzaYYaInaMlaCuaYZaZaaInaZbaZcaZdaZdaZeaDEaZfaXnaZgaZhaXpaZiaZjaZkaZlaZlaZmaZnaZnaZnaZoaZpaZpaZqaZraZsaZlaZlaZtaZpaZvaZwaZxaZxaZyaZzaZAaZuaZuaZuaZBaXGaXHaXIaXJaXJaXJaXJaZCaXJaXJaXJaXJaXJaXJaZDaZEaZNaZFaZGaZJaZIaZLaZKaZMaZNaZNaZNaZOaZPaZPaZPaZQaYiaYiaYiaZRaZSaYiaMebbsaZUaYnaYnaZVaYnaZWaZXaYqaZYaUTaZZbaababbacbadaUTbaebafbagbahbaibajaVbaVbbbKbbLaVbaVbbakbbMbakaVbaVhayHaRDbamaTvaTvaTvbanaTvbaoaRIaRIaRIaRIaRIaRIaRIbapaRIaRSaRSaRRaRSbaqbaraQbbasbatbaubavbawbaxbaybazbaAbikbikbikbikaaabtibtjbtibtibtibtkbtibtlbtibtjbtiaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaLyaCuaInaGdaKzbaBbaCbaDbaEaKzaGdaInaInaCubaFaVEaInbaGbaHaZdaZdaZeaDEbaIaXnaJraZhaXpaXqbaJbaKbaLbaLbaMbaNbaObaLbaPbaLbaQbaLbaRbaSbaLbaLbaWbaLbaLbaUbaVbaLbaWbaXbaYbaZaXqaXqbbabbbbbcbbdbbebbfbbebbgbbhbbgbbgbbgbbgbbgbbgbbibbjbbkbbkbbkbbkbblbbkbbmbbnbbkbbkbbobbpbbqbbqbbqbbqbbqbbqbbqbbraYiaYiaMebcTbbtbbubbvbbvbbwbbxaZXaYqbbyaUTaUTaUTaUTaUTbbzaUTbbAbbBbbCbbDaWCbbEaVbbdfbdcbdgbbIbkZbjrcSNcIgaVbaVhaHYaRDbbNbbOaTvbbPbbQaTvbbRbbRaRDbbSbbTbbUaQbbbVbbWbbXaRSaRSbbYbbZaQbbcaaQbbcbbatbccbcdbcebatbatbcfbaAbikbikbikbikbqUbtmbwlbutbwmbtmbmKbutbwmbtmbwlbutbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaDEaInaYYaKzaKBaJraJraKCaKzaYYaKzbcgbchbcibcjaInbckbckaXkbckaXlaDEbclaXnaJraDEbcmbcmbcnbcobcobcobcobcobcobcpbcqbcobcobcobcobcobcobcrbcsbctbctbcubctbcvbcwbcxbcvbcvbcybczbcAbcmbcBbcBbcCbcCbcCbcDbcDbcDbcDbcDbcDbcDbcDbcEbcFbcFbcGbcFbcHbcHbcHbcHbcIbcJbcHbcEbcKbcKbcKbcKbcKbcKbcKbcKbcLbcLbcLaMebcMbcNbcObcObcObcObcPbcQbcRbmwbcUaZTbcVbcWbcXbcYaUTaUTbcZbdabdbbdabdaaVbcYtbdddcnbdebdebdecZrcZqaVbbdhbdiaRDbdjaTvbbPbbPbbQbbPaTvbdkaRDbdlbdmbdnaQbaRSbdobdpbdqbdqbdrbdsbdtbdubdvbdwbdxbdybdzbavbatbatbdAbaAbikbikbikbikbqUbwnbmKbutbBQbtmbmKbutbBQbtmbmKbFmbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbdCbdDaJrbdEbdFbdGbdHbdIbdJbdHbdKbdLbdHbdHbdMbdNbdObdPbdQbdQbdQbdRbdQbdSbdTaDEbdUbdVbdWbcobdXbdYbdZbeabebbecbedbeebefbegbehbeibcobejbekbctbelbembenbcvbeobepbeqbcvberbesbetberberberbeuaXJaXObcDbikbikbikbikbikbikbikbcEbevbewbexbeybezbeAbeBbeCbeDbeEbeFbcEbikbikbikbikbikbikbikbcKbeGaYibeHaMebeIbcNbmwbmwbmwbmwbmwbeJbeKbmwbmwbmwbnMbeMbeMbeNbeObePbeQbeRbeSbeTbeUaVbbeVbeWdlHbeYbeYbeXbeZbfaaVbaVhayHaRDbfbbfcaTvbbPbbQaTvbfdbfdaRDaRDbfeaRDaQbbffbbWbbZbfgbfgbfhbbZaQbaQbaQbbfibatbfjbfjbfkbfjbatbflbaAaabbikbikaabbdBbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbdCbfnbfobfnbfnbfnbfnbfnbfnbfobfnbfnbfpaJrbfqbfrbfsaJrbftaJrbfubfvbfwbfxbfyaDEbdVbdVbfzbcobfAbecbecbecbecbecbedbfBbecbecbecbfCbcobejbfDbctbfEbfFbfGbcvbfHbfIbfJbcvbfKbfLbfMbfNbfObesbeuaXJaXObcDbikbikbikbikbcEbcEbcEbcEbfPbfQbfRbfSbfTbfUbfVbfWbfXbfYbfZbcEbcEbcEbcEbikbikbikbikbcKbeGaYibgabgbbgcbgdbgebgfbgcbggbghbgibgjbgkbglbmwbeLbgmbeMbgnbgobeMbgpbgqbgrbgsbeMbgtbgubgvdlHbeYbeYbeXbgwbgxaVbaVhaKsaRDbdjaTvbbPbbPbbQbbPaTvaTvbgybgzaTvbgAaQbbgBbgCbgDbfgbfgbgEbgDbgFaQbbgGbgHbatbgIbgIbgJbgIbatbdAbaAbgKbaAbaAbaAbqUbtmbmKbutbGVbtmbmKbutbGVbtmbmKbutbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaCuaCuaInaInaInaInaInaInaInaInaInaCuaDEbgLbgMbgNbgNbgNbgNbgNbgNbgObgNbgNbgNaDEbdVbejbgPbcobgQbecbecbgRbgSbgTbgUbgRbecbecbecbgVbcobejbekbctbgWbgXbgYbcvbgZbhabhbbcvbhcbhdbhebhfbhgbesbhhbhiaXObcDbcDbhjbcEbcEbcEbhkbhlbhmbhnbhobhobhpbhqbhobhrbhobhsbhtbhubhvbhwbhxbcEbcEbcEbhjbcKbcKbeGaYiaYiaMebhybhzbgkbhAbmwbhBbhCbmwbhDbhEbglbmwbnMbeMbeMbhFbcSbhHbhIbhJbhKbhLbeMbhMbgubhNdlHbeYbeYbhObhPbhQaVbaVhayHaRDbhRbhSbhTbbPbbQbhUaTvaTvbhVaTvbhWbhXaQbbhYbhZbiabfgbfgbibbiabicaQbbidbgHbatbatbatbavbatbatbKnbIzbPfbNjbiibPfddJbmKbmKbmKbmKbmKbmKbmKbmKbmKbmKbutbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikblsbltbltblubltbltbltblvbltbltbmPaabaInaLAaJtbilbgNbimbinbiobipbiqbirbisbitbgNbiubivbiwbixbcobiybecbecbgRbgTbizbiAbgRbecbecbiBbiCbcobejbekbctbctbiDbctbcvbiEbiFbiGbcvbiHbhfbiIbhfbiJbesbeubiKaXOaXPaXPbiLbiMbiNbcEbiObfRbiPbhobhobiQbiRbiSakybiSbiUbiVbiWbiXbiYbiZbjabcEbjbbiMbjcbjdbjebeGaYiaYibjfbmwbjgbmwbmwbmwbjhbjibmwbhDbjjbglbmwbeLbeMbeMbjkbBDbjmbjnbjobjpbhLbjqaVbdlJdlIdlKbeYbeYbeXbhPbjsaVbbjtbjuaRDbjvaRDaRDbjwbbQbjxbjyaTvbjzbjAaWSbjBbdvbjCbjDbjEbjFbjFbjGbjHbjIbdvbjJbjKbatbjLbatbavbatbatddAbaAbaAbaAbaAbgKbqUddBbmKbutbwmbtmbmKbutbwmbtmbmKddCbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikblsbohbptbojbpwbpwbqWbpwbpwbpwbqWblubjNaInaKzaKBbfqbgNbimbjObjPbimbjQbjRbjSbjTbgNbjUaFmbjWbcsbcobjXbjYbjZbkabkbbkcbkdbkebkebkebkfbkgbcobejbivbkhbkibkjbkkbcvbcvbcvbcvbcvbklbkmbknbkobkpbesbeubiKaXJaXJaXJbkqbkrbksbktbkubkvbhobkwbkxbkybkzbkAbkBbkCbkDbkEbkFbkGbkubkHbkIbkJbkKbkMbkLbkObkObkPaYibkQaMebmwbkRbkSbglbmwbkTbkUbmwbkVbkWbglbmwbnMbeMbeMbeMbeNbeMbkXbeMbjpbhLbkYaVbbkZbhNbeXbeYbeYbeXbhPblaaVbblbblcbldbleblfblgblhblibljbljbljbljbljbljblkbllblmbfgbfgbfgbfgbfgbfgblnbloblpbgHbatbatbatbavbatbatddDbgKblrblrblrbaAbwmbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbwmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikblsbohbptbojbpwbpwbqWbpwbpwbpwbqWblubjNaInaKzaKBbfqbgNbimbjObjPbimbjQbjRbjSbjTbgNbjUaFmbjWbcsbcobjXbjYbjZbkabkbbkcbkdbkebkebkebkfbkgbcobejbivbkhbkibkjbkkbcvbcvbcvbcvbcvbklbkmbknbkobkpbesbeubiKaXJaXJaXJbkqbkrbksbktbkubkvbhobkwbkxbkybkzbkAbkBbkCbkDbkEbkFbkGbkubkHbkIbkJbkKbkMbkLbkObkObkPaYibkQaMebmwbkRbkSbglbmwbkTbkUbmwbkVbkWbglbmwbnMbeMbeMbeMbeNbeMbkXbeMbjpbhLbkYaVbdlObhNbeXbeYbeYbeXbhPblaaVbblbblcbldbleblfblgblhblibljbljbljbljbljbljblkbllblmbfgbfgbfgbfgbfgbfgblnbloblpbgHbatbatbatbavbatbatddDbgKblrblrblrbaAbwmbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbwmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbqYbqXbqXbqXbqXbqXbqXbqXbqXbqXbqXbqZbraaGdbraaJrbfqbgNblwbimblxblxblxblybimblzbgNblAblBbjWblCblCblCblCblDblCblEbecblFblGblHblHblIblJbcoblKblLblMblNblOblPblQblRblSblRblTblTblTblTblTblUberbeublVblWblXblYblZbmabmbbmcbmdbkBbmebmfbmgbmgbmgbmgbmhbmgbmibmjbmkbmlbmebmmbmnbcEbmobmpbmqbkNbmsbmtaYiaYibjfbmwbnCbmwbmwbmwaRebmwbmwbmvbmvbmwbmwbmxbeMbeMbmybmzbeMbeMbeMbmAbmBbmCaVbbgxbhNbeXbeXbeXbeXbhPbmDaVbbmEbmFbmFbmGbmFbmHbbPbbPbbPbbPbmIbbPbbPbbPbmJblobfgbfgbfgbfgbfgbfgbfgblnbloblpbgHbatbfjbfjbfkbfjbatddEbaAbmLbmMbmNbaAbBQbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbBQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbrcbrbbrebrdbrfbrfbrgbrfbrfbrfbrgbluaInaInaKzbrVbcjbmQbimbmRblxblxblxblybmRbimbgNbmSbmTbjWblCbmUbmVbmWbmXblCbmYbmZbnabcobnbbncbndbnebcobejbnfbngbngbnhbngbngbngbngbnibnjbnjbnjbnkbnjbnlbnmbnnbnobnpbnqbnqbnqbnqbnqbnqbnrbnsbnrbmgbmgbntbnubnvbnwbnxbnybntbnzbmgbnAbnBbnAbnAbnAbnAbnAbnAbnAbmtaYiaYiaMebnEbnDcakbnGbmwbnFbmwbnIbnHbnJbmwbpjaUTbnKbnLaUTaUTczObnNddybnNaUTaUTaVbbnObnPbnQbnQbnQbnQbnPbnRaVbbnSbmFbmFbmGbnTaRDbnUbnVbnWbnXbnYbnZboabobbocaQbbodaRSboebfgbfgboeaRSbofaQbbogbgHbatbgIbgIbgJbgIbatddDbgKblrblrblrbaAbGVbtmbmKbutbGVbtmbmKbutbGVbtmbmKbutbGVbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbrcbltbltblubltbltbltblvbltbltbtnaabaInboibdFbokbgNbjObjObjObimbolbombonboobgNbopboqbjWblCborblCbosbotblCboubovbowbcobnbbncbndbiCbcobejbnfbngboxboybozboAboBbngboCboDboEboFbnmbnmbnmbnmboGboHboIbnqboJboKboLboMboNboOboPboQbmgboRbnvboSboTboUboTboSbnvboVbmgboWboXboYboZbpabpbbpcbpdbnAbpebpfbpfbpgaMeaMeaMeaMebphbjfbphbpiaMeaURaMeaMeaUTaUTaUTaUTbplbpkbpkbpkbpkbpmbpJaVbbakbpnbakbpobpobakbpnbakaVbbnSbmFbmFbppbnTaRDaRDaRDaRDaRDbjvaRDaRDaRDaRDaQbbpqaQcaQcaQcaQcaQcaQcaQbaQbbprbpsbatbatbatbavbatbatddAbaAbaAbaAbaAbgKbqUddFbmKbmKbmKbmKbmKbmKbmKbmKbmKddGbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index a473111071f..46e98f30d6c 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -507,6 +507,18 @@ "jM" = (/obj/item/weapon/soap/syndie,/obj/structure/mopbucket,/obj/machinery/light{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) "jN" = (/obj/structure/table/woodentable,/obj/item/pizzabox,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "jO" = (/obj/structure/table/woodentable,/obj/item/toy/nuke,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership) +"jP" = (/turf/unsimulated/wall/abductor{icon_state = "alien21"},/area/abductor_ship) +"jQ" = (/turf/unsimulated/wall/abductor{icon_state = "alien20"},/area/abductor_ship) +"jR" = (/turf/unsimulated/wall/abductor{icon_state = "alien23"},/area/abductor_ship) +"jS" = (/turf/unsimulated/wall/abductor{icon_state = "alien22"},/area/abductor_ship) +"jT" = (/turf/unsimulated/wall/abductor{icon_state = "alien24"},/area/abductor_ship) +"jU" = (/turf/unsimulated/wall/abductor{icon_state = "alien16"},/area/abductor_ship) +"jV" = (/obj/machinery/abductor/experiment{team = 1},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"jW" = (/turf/unsimulated/wall/abductor{icon_state = "alien17"},/area/abductor_ship) +"jX" = (/obj/machinery/abductor/pad{team = 1},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"jY" = (/obj/machinery/abductor/console{team = 1},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"jZ" = (/turf/unsimulated/wall/abductor{icon_state = "alien19"},/area/abductor_ship) +"ka" = (/turf/unsimulated/wall/abductor{icon_state = "alien18"},/area/abductor_ship) "kb" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "kc" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/mugwort,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "kd" = (/obj/structure/table/woodentable,/obj/item/weapon/spacecash,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) @@ -525,12 +537,35 @@ "kq" = (/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "kr" = (/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "ks" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/syndicate_mothership) +"kt" = (/obj/machinery/abductor/experiment{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"ku" = (/obj/machinery/abductor/pad{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"kv" = (/obj/machinery/abductor/console{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"kw" = (/turf/unsimulated/wall/abductor{icon_state = "alien14"},/area/abductor_ship) +"kx" = (/turf/unsimulated/floor/abductor,/area/abductor_ship) +"ky" = (/obj/machinery/computer/camera_advanced/abductor{team = 1},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"kz" = (/turf/unsimulated/wall/abductor{icon_state = "alien15"},/area/abductor_ship) +"kA" = (/obj/structure/closet/abductor,/turf/unsimulated/floor/abductor,/area/abductor_ship) "kB" = (/turf/simulated/floor/bluegrid,/area/tdome/arena_source) "kC" = (/obj/machinery/flasher{id = "flash"; name = "Thunderdome Flash"},/turf/simulated/floor/bluegrid,/area/tdome/arena_source) +"kD" = (/obj/machinery/computer/camera_advanced/abductor{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"kE" = (/turf/unsimulated/wall/abductor{icon_state = "alien12"},/area/abductor_ship) +"kF" = (/obj/effect/landmark/abductor/scientist,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"kG" = (/obj/structure/table/abductor,/obj/item/weapon/retractor/alien,/obj/item/weapon/hemostat/alien,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"kH" = (/obj/effect/landmark/abductor/agent,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"kI" = (/obj/machinery/optable/abductor,/turf/unsimulated/floor/abductor,/area/abductor_ship) "kJ" = (/obj/item/flag/wiz,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "kK" = (/obj/effect/spawner/window/reinforced,/turf/unsimulated/floor{name = "plating"},/area/syndicate_mothership/elite_squad) "kL" = (/obj/effect/landmark{name = "Syndicate-Commando"; tag = "Commando"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership/elite_squad) +"kM" = (/turf/unsimulated/wall/abductor{icon_state = "alien13"},/area/abductor_ship) +"kN" = (/obj/structure/table/abductor,/obj/item/weapon/storage/box/alienhandcuffs,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"kO" = (/obj/effect/landmark/abductor/scientist{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"kP" = (/obj/effect/landmark/abductor/agent{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"kQ" = (/turf/unsimulated/wall/abductor{icon_state = "alien10"},/area/abductor_ship) +"kR" = (/obj/structure/table/abductor,/obj/item/weapon/paper/abductor,/obj/item/weapon/scalpel/alien,/obj/item/weapon/cautery/alien,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"kS" = (/turf/unsimulated/wall/abductor{icon_state = "alien11"},/area/abductor_ship) "kT" = (/obj/machinery/camera{pixel_x = 10; network = list("Thunderdome"); c_tag = "Thunderdome Arena"},/turf/simulated/floor/bluegrid,/area/tdome/arena_source) +"kU" = (/turf/unsimulated/wall/abductor{icon_state = "alien6"},/area/abductor_ship) +"kV" = (/obj/machinery/abductor/gland_dispenser,/turf/unsimulated/floor/abductor,/area/abductor_ship) "kW" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (WEST)"; icon_state = "fakewindows"; dir = 8},/area/wizard_station) "kX" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (WEST)"; icon_state = "fakewindows2"; dir = 8},/area/wizard_station) "kY" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (NORTHEAST)"; icon_state = "fakewindows"; dir = 5},/area/wizard_station) @@ -543,6 +578,12 @@ "lf" = (/obj/machinery/door/airlock/external{name = "Shuttle Airlock"; req_access_txt = "150"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "syndicate_elite"; name = "Side Hull Door"; opacity = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership) "lg" = (/turf/unsimulated/floor{name = "plating"},/area/syndicate_mothership/elite_squad) "lh" = (/obj/machinery/door/airlock/external{req_access_txt = "150"},/turf/unsimulated/floor{name = "plating"},/area/syndicate_mothership/elite_squad) +"li" = (/turf/unsimulated/wall/abductor{icon_state = "alien7"},/area/abductor_ship) +"lj" = (/obj/structure/stool/bed/abductor,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"lk" = (/obj/structure/table/abductor,/obj/item/weapon/surgicaldrill/alien,/obj/item/weapon/circular_saw/alien,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"ll" = (/turf/unsimulated/wall/abductor{icon_state = "alien9"},/area/abductor_ship) +"lm" = (/turf/unsimulated/wall/abductor{icon_state = "alien8"},/area/abductor_ship) +"ln" = (/turf/unsimulated/wall/abductor{icon_state = "alien2"},/area/abductor_ship) "lo" = (/obj/effect/decal/remains/human,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) "lp" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) "lq" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (NORTH)"; icon_state = "fakewindows2"; dir = 1},/area/wizard_station) @@ -553,17 +594,33 @@ "lv" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership) "lw" = (/obj/machinery/door/airlock/external{name = "Shuttle Airlock"; req_access_txt = "150"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "syndicate_elite"; name = "Side Hull Door"; opacity = 0; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership) "lx" = (/obj/machinery/door/airlock/glass_security{name = "Airlock"; req_access_txt = "150"},/obj/machinery/door/poddoor{id_tag = "syndicate_elite_mech_room"; name = "Mech Room Door"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership/elite_squad) +"ly" = (/turf/unsimulated/wall/abductor,/area/abductor_ship) +"lz" = (/turf/unsimulated/wall/abductor{icon_state = "alien4"},/area/abductor_ship) +"lA" = (/turf/unsimulated/wall/abductor{icon_state = "alien3"},/area/abductor_ship) "lB" = (/obj/machinery/door/poddoor{id_tag = "thunderdomehea"; name = "Heavy Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source) "lC" = (/turf/unsimulated/wall,/area/tdome/arena_source) "lD" = (/obj/machinery/igniter,/turf/simulated/floor/plasteel,/area/tdome/arena_source) "lE" = (/obj/machinery/light/spot,/turf/simulated/floor/plasteel,/area/tdome/arena_source) +"lF" = (/turf/unsimulated/wall/abductor{icon_state = "alien5"},/area/abductor_ship) "lG" = (/mob/living/simple_animal/hostile/creature{name = "Experiment 35b"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) "lH" = (/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station) "lI" = (/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station) "lJ" = (/obj/machinery/computer/pod{id_tags = list("syndicate_elite"); name = "Hull Door Control"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership) "lK" = (/obj/machinery/computer/syndicate_elite_shuttle,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership) +"lL" = (/obj/machinery/abductor/experiment{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"lM" = (/obj/machinery/abductor/pad{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"lN" = (/obj/machinery/abductor/console{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"lO" = (/obj/machinery/abductor/experiment{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"lP" = (/obj/machinery/abductor/pad{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"lQ" = (/obj/machinery/abductor/console{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"lR" = (/obj/machinery/computer/camera_advanced/abductor{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"lS" = (/obj/machinery/computer/camera_advanced/abductor{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"lT" = (/obj/effect/landmark/abductor/scientist{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"lU" = (/obj/effect/landmark/abductor/agent{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"lV" = (/obj/effect/landmark/abductor/scientist{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) "lW" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/shield/energy,/obj/machinery/recharger/wallcharger{pixel_x = 3; pixel_y = -30},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source) "lX" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/shield/energy,/obj/machinery/recharger/wallcharger{pixel_x = 3; pixel_y = -30},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source) +"lY" = (/obj/effect/landmark/abductor/agent{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) "ma" = (/obj/effect/decal/cleanable/molten_item,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) "mb" = (/turf/unsimulated/wall/fakeglass,/area/wizard_station) "mc" = (/obj/item/trash/chips,/obj/machinery/light/spot,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) @@ -1511,21 +1568,21 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDKDKDAaNDAGRGPFvFvFvGPGSDADAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfDKDKDKDKDKDKDKDAaNDAGTFvFvGPFvFvGUDADAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDwDwDuaNEMDxDyDyDzEIDKDKDAaNDAGVFvFvFvFvFvGWDAEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtaNaNDtDAGXGYGZDuaNaNaNaNaNDIDKDKDAaNEMDwHaHbHcHbHdDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDwDwDwDwDAHeHfDADwDwDwDwDuaNEfDKDKDAaNaNEMDwHgHhHiDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNHjHjHjHjHkHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDAHlHmHnDAHoFvFvHpDAHqHrHsHpDwGaDKDKDAaNaNaNHtHuHvHwHtaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNHjHxHyHyHyHyHzHjHjHjHjHjHjHjHjHkHjHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHAFvFvFvHBFvFvFvFvHCFvFvFvFvHCDKDKDKDAaNaNEMDwDwHDDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNHjHxHyHyHyHyHzHjHEHFHGHFHHHIHJHJHJHIHHHJHHHJHKHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDAHLdacZDAGVFvFvGWDAHOHPHQGWDwEIDKDKDAaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNHjHRHyHyHyHyHSHjHJHTHTHTHTHTHJHJHJHTHTHTHTHTHUHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDwDwGZHVHWDADwDwDwDwEnaNDIDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNHjHRHXHYHYHyHyHZHJHJHJIaHJHJHJHJHJHJHJIaHJHJHJHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNEMDAGXIbDAEnaNaNaNaNaNEfDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjQjPjSjRjTaNaNaNjQjPjSjRjTaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtaNaNDtDAGXGYGZDuaNaNaNaNaNDIDKDKDAaNEMDwHaHbHcHbHdDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjUjWjVjYjXkajZaNjUjWktkvkukajZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDwDwDwDwDAHeHfDADwDwDwDwDuaNEfDKDKDAaNaNEMDwHgHhHiDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNHjHjHjHjHkHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkwkykxkxkxkAkzaNkwkDkxkxkxkAkzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDAHlHmHnDAHoFvFvHpDAHqHrHsHpDwGaDKDKDAaNaNaNHtHuHvHwHtaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNHjHxHyHyHyHyHzHjHjHjHjHjHjHjHjHkHjHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkEkGkFkIkHkNkMaNkEkGkOkIkPkNkMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHAFvFvFvHBFvFvFvFvHCFvFvFvFvHCDKDKDKDAaNaNEMDwDwHDDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNHjHxHyHyHyHyHzHjHEHFHGHFHHHIHJHJHJHIHHHJHHHJHKHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkQkRkxkxkxkAkSaNkQkRkxkxkxkAkSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDAHLdacZDAGVFvFvGWDAHOHPHQGWDwEIDKDKDAaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNHjHRHyHyHyHyHSHjHJHTHTHTHTHTHJHJHJHTHTHTHTHTHUHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkUlikVlkljlmllaNkUlikVlkljlmllaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDwDwGZHVHWDADwDwDwDwEnaNDIDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNHjHRHXHYHYHyHyHZHJHJHJIaHJHJHJHJHJHJHJIaHJHJHJHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNlylnlAlzlFaNaNaNlylnlAlzlFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNEMDAGXIbDAEnaNaNaNaNaNEfDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNHjHjHjHjHjHjHjHjHJHTHTHTHTHTHJHJHJHTHTHTHTHTHJHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwEnaNDtDxDyDyDzGaDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNHjdHdHdHdHdHHjIdIeIeIeIeIeIeIeIeIeIeIeIeIeIfHjdIdIdIdIdIHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHjHjHjIhIhIhIhIhjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaIhIhIhIhIhHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfDKDKDKDKDKDKFkDAEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHjIiIjIkIkIkIkIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIoIoIoIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDMIqDMDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHjIiIjIkIrIkIrIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIsIoIsIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAItDKDKDKIuDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHjIiIjIkIkIvIkIkIlImjcjcjcjcjcIwIxIwjcjcjcjcjcInIlIoIoIyIoIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHjIiIjIkIrIkIrIkIlImjcjcjcjcjcIwIzIwjcjcjcjcjcInIlIoIsIoIsIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNIADKDKDKIBDNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHjIiIjIkIkIkIkIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIoIoIoIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfICDKDKDKIDEfaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNHjdHdHdHdHdHHjIdIeIeIeIeIeIeIeIeIeIeIeIeIeIfHjdIdIdIdIdIHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjQjPjSjRjTaNaNaNjQjPjSjRjTaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNHjHjHjIhIhIhIhIhjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaIhIhIhIhIhHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjUjWlLlNlMkajZaNjUjWlOlQlPkajZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfDKDKDKDKDKDKFkDAEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNHjIiIjIkIkIkIkIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIoIoIoIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkwlRkxkxkxkAkzaNkwlSkxkxkxkAkzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDMIqDMDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNHjIiIjIkIrIkIrIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIsIoIsIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkEkGlTkIlUkNkMaNkEkGlVkIlYkNkMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAItDKDKDKIuDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNHjIiIjIkIkIvIkIkIlImjcjcjcjcjcIwIxIwjcjcjcjcjcInIlIoIoIyIoIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkQkRkxkxkxkAkSaNkQkRkxkxkxkAkSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNHjIiIjIkIrIkIrIkIlImjcjcjcjcjcIwIzIwjcjcjcjcjcInIlIoIsIoIsIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkUlikVlkljlmllaNkUlikVlkljlmllaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNIADKDKDKIBDNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNHjIiIjIkIkIkIkIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIoIoIoIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNlylnlAlzlFaNaNaNlylnlAlzlFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfICDKDKDKIDEfaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNHjHjHjIEIEIEIEIEjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaIEIEIEIEIEHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwIFIGIHIIIJDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNHjIKIKIKIKIKHjIdIeIeIeIeIeIeIeIeIeIeIeIeIeIfHjILILILILILHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDxDyDzDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNHjHjHjHjHjHjHjIMINININININIOIPIQINININININIMHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm index 861681ce06f..8d593d21011 100644 --- a/_maps/map_files/cyberiad/z5.dmm +++ b/_maps/map_files/cyberiad/z5.dmm @@ -824,7 +824,7 @@ "pS" = (/obj/machinery/power/apc{dir = 8; name = "Mining Station Podbay APC"; pixel_x = -27; pixel_y = 2},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/engine,/area/mine/podbay) "pT" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/engine,/area/mine/podbay) "pU" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/engine,/area/mine/podbay) -"pV" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/three_tile_ver{id_tag = "minepodbay"; req_one_access_txt = "48;70"},/turf/simulated/floor/engine,/area/mine/podbay) +"pV" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/multi_tile/three_tile_ver{id_tag = "minepodbay"; req_one_access_txt = "48;70"},/turf/simulated/floor/engine,/area/mine/podbay) "pW" = (/obj/structure/transit_tube{tag = "icon-D-SW"; icon_state = "D-SW"},/turf/simulated/wall/r_wall,/area/mine/explored) "pX" = (/obj/effect/glowshroom,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) "pY" = (/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"},/area/mine/abandoned) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index c6a78c418e6..b6fcfc104c8 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -188,3 +188,36 @@ // teehee no one will find these here #define MFOAM_ALUMINUM 1 #define MFOAM_IRON 2 + +//Human Overlays Indexes///////// +#define MUTANTRACE_LAYER 1 +#define TAIL_UNDERLIMBS_LAYER 2 +#define LIMBS_LAYER 3 +#define MARKINGS_LAYER 4 +#define UNDERWEAR_LAYER 5 +#define MUTATIONS_LAYER 6 +#define DAMAGE_LAYER 7 +#define UNIFORM_LAYER 8 +#define ID_LAYER 9 +#define SHOES_LAYER 10 +#define GLOVES_LAYER 11 +#define EARS_LAYER 12 +#define SUIT_LAYER 13 +#define GLASSES_LAYER 14 +#define BELT_LAYER 15 //Possible make this an overlay of somethign required to wear a belt? +#define SUIT_STORE_LAYER 16 +#define BACK_LAYER 17 +#define TAIL_LAYER 18 //bs12 specific. this hack is probably gonna come back to haunt me +#define HAIR_LAYER 19 //TODO: make part of head layer? +#define HEAD_ACCESSORY_LAYER 20 +#define FHAIR_LAYER 21 +#define FACEMASK_LAYER 22 +#define HEAD_LAYER 23 +#define COLLAR_LAYER 24 +#define HANDCUFF_LAYER 25 +#define LEGCUFF_LAYER 26 +#define L_HAND_LAYER 27 +#define R_HAND_LAYER 28 +#define TARGETED_LAYER 29 //BS12: Layer for the target overlay from weapon targeting system +#define FIRE_LAYER 30 //If you're on fire +#define TOTAL_LAYERS 30 \ No newline at end of file diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 4136771eef5..fffcbd09f30 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -56,7 +56,7 @@ var/global/list/special_roles = list( // ROLE_MONKEY = /datum/game_mode/monkey, Sooner or later these are going to get ported // ROLE_GANG = /datum/game_mode/gang, ROLE_SHADOWLING = /datum/game_mode/shadowling, -// ROLE_ABDUCTOR = /datum/game_mode/abduction, + ROLE_ABDUCTOR = /datum/game_mode/abduction, // ROLE_HOG_GOD = /datum/game_mode/hand_of_god, // ROLE_HOG_CULTIST = /datum/game_mode/hand_of_god, ROLE_RAIDER = /datum/game_mode/heist, diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm index 6641bf50e7d..0511286268e 100644 --- a/code/_globalvars/lists/misc.dm +++ b/code/_globalvars/lists/misc.dm @@ -23,4 +23,5 @@ var/list/restricted_camera_networks = list( //Those networks can only be accesse "Xeno" ) -var/list/datum/map_template/map_templates = list() \ No newline at end of file +var/list/map_templates = list() +var/list/mineral_turfs = list() \ No newline at end of file diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 9d3f788b6b7..617a0af3d7d 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -29,3 +29,4 @@ var/global/list/deliverybeacontags = list() //list of all tags associated with var/global/list/beacons = list() var/global/list/shuttle_caller_list = list() //list of all communication consoles and AIs, for automatic shuttle calls when there are none. var/global/list/tracked_implants = list() //list of all current implants that are tracked to work out what sort of trek everyone is on. Sadly not on lavaworld not implemented... +var/global/list/abductor_equipment = list() //list of all abductor equipment diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index b11df7a0f63..50527c33329 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -69,6 +69,14 @@ #define ui_borg_radio "EAST-1:28,SOUTH+1:7" #define ui_borg_intents "EAST-2:26,SOUTH:5" +//Upper-middle right (alerts) +#define ui_alert1 "EAST-1:28,CENTER+5:27" +#define ui_alert2 "EAST-1:28,CENTER+4:25" +#define ui_alert3 "EAST-1:28,CENTER+3:23" +#define ui_alert4 "EAST-1:28,CENTER+2:21" +#define ui_alert5 "EAST-1:28,CENTER+1:19" + + //Gun buttons #define ui_gun1 "EAST-2:26,SOUTH+2:7" #define ui_gun2 "EAST-1:28,SOUTH+3:7" diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm new file mode 100644 index 00000000000..ca3f223c80d --- /dev/null +++ b/code/_onclick/hud/alert.dm @@ -0,0 +1,400 @@ +//A system to manage and display alerts on screen without needing you to do it yourself + +//PUBLIC - call these wherever you want + + +/mob/proc/throw_alert(category, type, severity, obj/new_master) + +/* Proc to create or update an alert. Returns the alert if the alert is new or updated, 0 if it was thrown already + category is a text string. Each mob may only have one alert per category; the previous one will be replaced + path is a type path of the actual alert type to throw + severity is an optional number that will be placed at the end of the icon_state for this alert + For example, high pressure's icon_state is "highpressure" and can be serverity 1 or 2 to get "highpressure1" or "highpressure2" + new_master is optional and sets the alert's icon state to "template" in the ui_style icons with the master as an overlay. + Clicks are forwarded to master */ + + if(!category) + return + + var/obj/screen/alert/alert + if(alerts[category]) + alert = alerts[category] + if(new_master && new_master != alert.master) + WARNING("[src] threw alert [category] with new_master [new_master] while already having that alert with master [alert.master]") + clear_alert(category) + return .() + else if(alert.type != type) + clear_alert(category) + return .() + else if(!severity || severity == alert.severity) + if(alert.timeout) + clear_alert(category) + return .() + else //no need to update + return 0 + else + alert = new type + + if(new_master) + var/old_layer = new_master.layer + new_master.layer = FLOAT_LAYER + alert.overlays += new_master + new_master.layer = old_layer + alert.icon_state = "template" // We'll set the icon to the client's ui pref in reorganize_alerts() + alert.master = new_master + else + alert.icon_state = "[initial(alert.icon_state)][severity]" + alert.severity = severity + + alerts[category] = alert + if(client && hud_used) + hud_used.reorganize_alerts() + alert.transform = matrix(32, 6, MATRIX_TRANSLATE) + animate(alert, transform = matrix(), time = 2.5, easing = CUBIC_EASING) + + if(alert.timeout) + spawn(alert.timeout) + if(alert.timeout && alerts[category] == alert && world.time >= alert.timeout) + clear_alert(category) + alert.timeout = world.time + alert.timeout - world.tick_lag + return alert + +// Proc to clear an existing alert. +/mob/proc/clear_alert(category) + var/obj/screen/alert/alert = alerts[category] + if(!alert) + return 0 + + alerts -= category + if(client && hud_used) + hud_used.reorganize_alerts() + client.screen -= alert + qdel(alert) + +/obj/screen/alert + icon = 'icons/mob/screen_alert.dmi' + icon_state = "default" + name = "Alert" + desc = "Something seems to have gone wrong with this alert, so report this bug please" + mouse_opacity = 1 + var/timeout = 0 //If set to a number, this alert will clear itself after that many deciseconds + var/severity = 0 + var/alerttooltipstyle = "" + + +/obj/screen/alert/MouseEntered(location,control,params) + openToolTip(usr, src, params, title = name, content = desc, theme = alerttooltipstyle) + + +/obj/screen/alert/MouseExited() + closeToolTip(usr) + + +//Gas alerts +/obj/screen/alert/oxy + name = "Choking (No O2)" + desc = "You're not getting enough oxygen. Find some good air before you pass out! \ +The box in your backpack has an oxygen tank and breath mask in it." + icon_state = "oxy" + +/obj/screen/alert/too_much_oxy + name = "Choking (O2)" + desc = "There's too much oxygen in the air, and you're breathing it in! Find some good air before you pass out!" + icon_state = "too_much_oxy" + +/obj/screen/alert/nitro + name = "Choking (No N)" + desc = "You're not getting enough nitrogen. Find some good air before you pass out!" + icon_state = "nitro" + +/obj/screen/alert/too_much_nitro + name = "Choking (N)" + desc = "There's too much nitrogen in the air, and you're breathing it in! Find some good air before you pass out!" + icon_state = "too_much_nitro" + +/obj/screen/alert/not_enough_co2 + name = "Choking (No CO2)" + desc = "You're not getting enough carbon dioxide. Find some good air before you pass out!" + icon_state = "not_enough_co2" + +/obj/screen/alert/too_much_co2 + name = "Choking (CO2)" + desc = "There's too much carbon dioxide in the air, and you're breathing it in! Find some good air before you pass out!" + icon_state = "too_much_co2" + +/obj/screen/alert/not_enough_tox + name = "Choking (No Plasma)" + desc = "You're not getting enough plasma. Find some good air before you pass out!" + icon_state = "not_enough_tox" + +/obj/screen/alert/tox_in_air + name = "Choking (Plasma)" + desc = "There's highly flammable, toxic plasma in the air and you're breathing it in. Find some fresh air. \ +The box in your backpack has an oxygen tank and gas mask in it." + icon_state = "tox_in_air" +//End gas alerts + + +/obj/screen/alert/fat + name = "Fat" + desc = "You ate too much food, lardass. Run around the station and lose some weight." + icon_state = "fat" + +/obj/screen/alert/hungry + name = "Hungry" + desc = "Some food would be good right about now." + icon_state = "hungry" + +/obj/screen/alert/starving + name = "Starving" + desc = "You're severely malnourished. The hunger pains make moving around a chore." + icon_state = "starving" + +/obj/screen/alert/hot + name = "Too Hot" + desc = "You're flaming hot! Get somewhere cooler and take off any insulating clothing like a fire suit." + icon_state = "hot" + +/obj/screen/alert/hot/robot + desc = "The air around you is too hot for a humanoid. Be careful to avoid exposing them to this enviroment." + +/obj/screen/alert/cold + name = "Too Cold" + desc = "You're freezing cold! Get somewhere warmer and take off any insulating clothing like a space suit." + icon_state = "cold" + +/obj/screen/alert/cold/robot + desc = "The air around you is too cold for a humanoid. Be careful to avoid exposing them to this enviroment." + +/obj/screen/alert/lowpressure + name = "Low Pressure" + desc = "The air around you is hazardously thin. A space suit would protect you." + icon_state = "lowpressure" + +/obj/screen/alert/highpressure + name = "High Pressure" + desc = "The air around you is hazardously thick. A fire suit would protect you." + icon_state = "highpressure" + +/obj/screen/alert/blind + name = "Blind" + desc = "You can't see! This may be caused by a genetic defect, eye trauma, being unconscious, \ +or something covering your eyes." + icon_state = "blind" + +/obj/screen/alert/high + name = "High" + desc = "Whoa man, you're tripping balls! Careful you don't get addicted... if you aren't already." + icon_state = "high" + +/obj/screen/alert/drunk //Not implemented + name = "Drunk" + desc = "All that alcohol you've been drinking is impairing your speech, motor skills, and mental cognition. Make sure to act like it." + icon_state = "drunk" + +/obj/screen/alert/embeddedobject/Click() + if(isliving(usr)) + var/mob/living/carbon/human/M = usr + return M.help_shake_act(M) + +/obj/screen/alert/asleep + name = "Asleep" + desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are." + icon_state = "asleep" + +/obj/screen/alert/weightless + name = "Weightless" + desc = "Gravity has ceased affecting you, and you're floating around aimlessly. You'll need something large and heavy, like a \ +wall or lattice, to push yourself off if you want to move. A jetpack would enable free range of motion. A pair of \ +magboots would let you walk around normally on the floor. Barring those, you can throw things, use a fire extinguisher, \ +or shoot a gun to move around via Newton's 3rd Law of Motion." + icon_state = "weightless" + +/obj/screen/alert/fire + name = "On Fire" + desc = "You're on fire. Stop, drop and roll to put the fire out or move to a vacuum area." + icon_state = "fire" + +/obj/screen/alert/fire/Click() + if(isliving(usr)) + var/mob/living/L = usr + return L.resist() + + +//ALIENS + +/obj/screen/alert/alien_tox + name = "Plasma" + desc = "There's flammable plasma in the air. If it lights up, you'll be toast." + icon_state = "alien_tox" + alerttooltipstyle = "alien" + +/obj/screen/alert/alien_fire +// This alert is temporarily gonna be thrown for all hot air but one day it will be used for literally being on fire + name = "Too Hot" + desc = "It's too hot! Flee to space or at least away from the flames. Standing on weeds will heal you." + icon_state = "alien_fire" + alerttooltipstyle = "alien" + +/obj/screen/alert/alien_vulnerable + name = "Severed Matriarchy" + desc = "Your queen has been killed, you will suffer movement penalties and loss of hivemind. A new queen cannot be made until you recover." + icon_state = "alien_noqueen" + alerttooltipstyle = "alien" + +//BLOBS + +/obj/screen/alert/nofactory + name = "No Factory" + desc = "You have no factory, and are slowly dying!" + icon_state = "blobbernaut_nofactory" + alerttooltipstyle = "blob" + +//SILICONS + +/obj/screen/alert/nocell + name = "Missing Power Cell" + desc = "Unit has no power cell. No modules available until a power cell is reinstalled. Robotics may provide assistance." + icon_state = "nocell" + +/obj/screen/alert/emptycell + name = "Out of Power" + desc = "Unit's power cell has no charge remaining. No modules available until power cell is recharged. \ +Recharging stations are available in robotics, the dormitory bathrooms, and the AI satellite." + icon_state = "emptycell" + +/obj/screen/alert/lowcell + name = "Low Charge" + desc = "Unit's power cell is running low. Recharging stations are available in robotics, the dormitory bathrooms, and the AI satellite." + icon_state = "lowcell" + +//Need to cover all use cases - emag, illegal upgrade module, malf AI hack, traitor cyborg +/obj/screen/alert/hacked + name = "Hacked" + desc = "Hazardous non-standard equipment detected. Please ensure any usage of this equipment is in line with unit's laws, if any." + icon_state = "hacked" + +/obj/screen/alert/locked + name = "Locked Down" + desc = "Unit has been remotely locked down. Usage of a Robotics Control Console like the one in the Research Director's \ +office by your AI master or any qualified human may resolve this matter. Robotics may provide further assistance if necessary." + icon_state = "locked" + +/obj/screen/alert/newlaw + name = "Law Update" + desc = "Laws have potentially been uploaded to or removed from this unit. Please be aware of any changes \ +so as to remain in compliance with the most up-to-date laws." + icon_state = "newlaw" + timeout = 300 + +//MECHS + +/obj/screen/alert/low_mech_integrity + name = "Mech Damaged" + desc = "Mech integrity is low." + icon_state = "low_mech_integrity" + + +//GHOSTS +//TODO: expand this system to replace the pollCandidates/CheckAntagonist/"choose quickly"/etc Yes/No messages +/obj/screen/alert/notify_cloning + name = "Revival" + desc = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!" + icon_state = "template" + timeout = 300 + +/obj/screen/alert/notify_cloning/Click() + if(!usr || !usr.client) return + var/mob/dead/observer/G = usr + G.reenter_corpse() + +/obj/screen/alert/notify_jump + name = "Body created" + desc = "A body was created. You can enter it." + icon_state = "template" + timeout = 300 + var/atom/jump_target = null + var/attack_not_jump = null + +/obj/screen/alert/notify_jump/Click() + if(!usr || !usr.client) return + if(!jump_target) return + var/mob/dead/observer/G = usr + if(!istype(G)) return + if(attack_not_jump) + jump_target.attack_ghost(G) + else + var/turf/T = get_turf(jump_target) + if(T && isturf(T)) + G.loc = T + +//OBJECT-BASED + +/obj/screen/alert/restrained/buckled + name = "Buckled" + desc = "You've been buckled to something. Click the alert to unbuckle unless you're handcuffed." + +/obj/screen/alert/restrained/handcuffed + name = "Handcuffed" + desc = "You're handcuffed and can't act. If anyone drags you, you won't be able to move. Click the alert to free yourself." + +/obj/screen/alert/restrained/legcuffed + name = "Legcuffed" + desc = "You're legcuffed, which slows you down considerably. Click the alert to free yourself." + +/obj/screen/alert/restrained/Click() + if(isliving(usr)) + var/mob/living/L = usr + return L.resist() +// PRIVATE = only edit, use, or override these if you're editing the system as a whole + +// Re-render all alerts - also called in /datum/hud/show_hud() because it's needed there +/datum/hud/proc/reorganize_alerts() + var/list/alerts = mymob.alerts + var/icon_pref + if(!hud_shown) + for(var/i = 1, i <= alerts.len, i++) + mymob.client.screen -= alerts[alerts[i]] + return 1 + for(var/i = 1, i <= alerts.len, i++) + var/obj/screen/alert/alert = alerts[alerts[i]] + if(alert.icon_state == "template") + if(!icon_pref) + icon_pref = ui_style2icon(mymob.client.prefs.UI_style) + alert.icon = icon_pref + switch(i) + if(1) + . = ui_alert1 + if(2) + . = ui_alert2 + if(3) + . = ui_alert3 + if(4) + . = ui_alert4 + if(5) + . = ui_alert5 // Right now there's 5 slots + else + . = "" + alert.screen_loc = . + mymob.client.screen |= alert + return 1 + +/mob + var/list/alerts = list() // contains /obj/screen/alert only // On /mob so clientless mobs will throw alerts properly + +/obj/screen/alert/Click(location, control, params) + if(!usr || !usr.client) + return + var/paramslist = params2list(params) + if(paramslist["shift"]) // screen objects don't do the normal Click() stuff so we'll cheat + usr << "[name] - [desc]" + return + if(master) + return usr.client.Click(master, location, control, params) + +/obj/screen/alert/Destroy() + ..() + severity = 0 + master = null + screen_loc = "" + return QDEL_HINT_QUEUE \ No newline at end of file diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index fa7017fd2d8..2842facc713 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -125,24 +125,6 @@ mymob.throw_icon.name = "throw" mymob.throw_icon.screen_loc = ui_drop_throw - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = 'icons/mob/screen1_alien.dmi' - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_alien_oxygen - - mymob.toxin = new /obj/screen() - mymob.toxin.icon = 'icons/mob/screen1_alien.dmi' - mymob.toxin.icon_state = "tox0" - mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_alien_toxin - - mymob.fire = new /obj/screen() - mymob.fire.icon = 'icons/mob/screen1_alien.dmi' - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_alien_fire - mymob.healths = new /obj/screen() mymob.healths.icon = 'icons/mob/screen1_alien.dmi' mymob.healths.icon_state = "health0" @@ -173,6 +155,6 @@ mymob.client.screen = list() - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, nightvisionicon, mymob.pullin, alien_plasma_display, mymob.pullin) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach ) + mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.healths, nightvisionicon, mymob.pullin, alien_plasma_display, mymob.pullin) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach ) mymob.client.screen += src.adding + src.other mymob.client.screen += mymob.client.void \ No newline at end of file diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 8232f2073e2..dca63c7d2ae 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -24,26 +24,6 @@ src.adding += using move_intent = using - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = 'icons/mob/screen1_alien.dmi' - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_alien_oxygen - - mymob.toxin = new /obj/screen() - mymob.toxin.icon = 'icons/mob/screen1_alien.dmi' - mymob.toxin.icon_state = "tox0" - mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_alien_toxin - - - mymob.fire = new /obj/screen() - mymob.fire.icon = 'icons/mob/screen1_alien.dmi' - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_alien_fire - - mymob.healths = new /obj/screen() mymob.healths.icon = 'icons/mob/screen1_alien.dmi' mymob.healths.icon_state = "health0" @@ -68,6 +48,6 @@ mymob.client.screen = list() - mymob.client.screen += list( mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, nightvisionicon, mymob.pullin) //, mymob.rest, mymob.sleep, mymob.mach ) + mymob.client.screen += list( mymob.zone_sel, mymob.healths, nightvisionicon, mymob.pullin) //, mymob.rest, mymob.sleep, mymob.mach ) mymob.client.screen += src.adding + src.other mymob.client.screen += mymob.client.void \ No newline at end of file diff --git a/code/_onclick/hud/bot.dm b/code/_onclick/hud/bot.dm index c4488376309..4f205b04567 100644 --- a/code/_onclick/hud/bot.dm +++ b/code/_onclick/hud/bot.dm @@ -30,18 +30,6 @@ mymob.healths.name = "health" mymob.healths.screen_loc = ui_borg_health - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = 'icons/mob/screen1_bot.dmi' - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen - - mymob.fire = new /obj/screen() - mymob.fire.icon = 'icons/mob/screen1_bot.dmi' - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - mymob.pullin = new /obj/screen/pull() mymob.pullin.icon = 'icons/mob/screen1_bot.dmi' mymob.pullin.update_icon(mymob) @@ -49,7 +37,7 @@ mymob.client.screen = list() - mymob.client.screen += list(mymob.oxygen, mymob.fire, mymob.healths, mymob.pullin) + mymob.client.screen += list(mymob.healths, mymob.pullin) mymob.client.screen += adding + other mymob.client.screen += mymob.client.void return \ No newline at end of file diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index fa414ba0dea..3c11b91a9b0 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -127,6 +127,9 @@ datum/hud/New(mob/owner) corgi_hud() reload_fullscreen() + persistant_inventory_update() + mymob.update_action_buttons() + reorganize_alerts() //Triggered when F12 is pressed (Unless someone changed something in the DMF) /mob/verb/button_pressed_F12(var/full = 0 as null) @@ -192,7 +195,7 @@ datum/hud/New(mob/owner) hud_used.hidden_inventory_update() hud_used.persistant_inventory_update() update_action_buttons() - //hud_used.reorganize_alerts() + hud_used.reorganize_alerts() else to_chat(usr, "\red Inventory hiding is currently only supported for human mobs, sorry.") diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 8dabef48583..d75f7c8ad61 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -358,42 +358,12 @@ mymob.throw_icon.alpha = ui_alpha src.hotkeybuttons += mymob.throw_icon - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = ui_style - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen - - mymob.pressure = new /obj/screen() - mymob.pressure.icon = ui_style - mymob.pressure.icon_state = "pressure0" - mymob.pressure.name = "pressure" - mymob.pressure.screen_loc = ui_pressure - - mymob.toxin = new /obj/screen() - mymob.toxin.icon = ui_style - mymob.toxin.icon_state = "tox0" - mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_toxin - mymob.internals = new /obj/screen/internals() mymob.internals.icon = ui_style mymob.internals.icon_state = "internal0" mymob.internals.name = "internal" mymob.internals.screen_loc = ui_internal - mymob.fire = new /obj/screen() - mymob.fire.icon = ui_style - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - - mymob.bodytemp = new /obj/screen() - mymob.bodytemp.icon = ui_style - mymob.bodytemp.icon_state = "temp1" - mymob.bodytemp.name = "body temperature" - mymob.bodytemp.screen_loc = ui_temp - mymob.healths = new /obj/screen() mymob.healths.icon = ui_style mymob.healths.icon_state = "health0" @@ -406,12 +376,6 @@ mymob.healthdoll.name = "health doll" mymob.healthdoll.screen_loc = ui_healthdoll - mymob.nutrition_icon = new /obj/screen() - mymob.nutrition_icon.icon = ui_style - mymob.nutrition_icon.icon_state = "nutrition0" - mymob.nutrition_icon.name = "nutrition" - mymob.nutrition_icon.screen_loc = ui_nutrition - mymob.pullin = new /obj/screen/pull() mymob.pullin.icon = ui_style mymob.pullin.update_icon(mymob) @@ -454,7 +418,7 @@ mymob.client.screen = list() - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.healthdoll, mymob.nutrition_icon, mymob.pullin, mymob.gun_setting_icon, lingchemdisplay, lingstingdisplay) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach ) + mymob.client.screen += list(mymob.throw_icon, mymob.zone_sel, mymob.internals, mymob.healths, mymob.healthdoll, mymob.pullin, mymob.gun_setting_icon, lingchemdisplay, lingstingdisplay) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach ) mymob.client.screen += src.adding + src.hotkeybuttons mymob.client.screen += mymob.client.void inventory_shown = 0 diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm index b7a9a102116..34d26e77d6d 100644 --- a/code/_onclick/hud/monkey.dm +++ b/code/_onclick/hud/monkey.dm @@ -126,42 +126,12 @@ mymob.throw_icon.alpha = ui_alpha src.hotkeybuttons += mymob.throw_icon - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = ui_style - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen - - mymob.pressure = new /obj/screen() - mymob.pressure.icon = ui_style - mymob.pressure.icon_state = "pressure0" - mymob.pressure.name = "pressure" - mymob.pressure.screen_loc = ui_pressure - - mymob.toxin = new /obj/screen() - mymob.toxin.icon = ui_style - mymob.toxin.icon_state = "tox0" - mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_toxin - mymob.internals = new /obj/screen/internals() mymob.internals.icon = ui_style mymob.internals.icon_state = "internal0" mymob.internals.name = "internal" mymob.internals.screen_loc = ui_internal - mymob.fire = new /obj/screen() - mymob.fire.icon = ui_style - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - - mymob.bodytemp = new /obj/screen() - mymob.bodytemp.icon = ui_style - mymob.bodytemp.icon_state = "temp1" - mymob.bodytemp.name = "body temperature" - mymob.bodytemp.screen_loc = ui_temp - mymob.healths = new /obj/screen() mymob.healths.icon = ui_style mymob.healths.icon_state = "health0" @@ -174,12 +144,6 @@ mymob.healthdoll.name = "health doll" mymob.healthdoll.screen_loc = ui_healthdoll - mymob.nutrition_icon = new /obj/screen() - mymob.nutrition_icon.icon = ui_style - mymob.nutrition_icon.icon_state = "nutrition0" - mymob.nutrition_icon.name = "nutrition" - mymob.nutrition_icon.screen_loc = ui_nutrition - mymob.pullin = new /obj/screen/pull() mymob.pullin.icon = ui_style mymob.pullin.update_icon(mymob) @@ -223,7 +187,7 @@ mymob.client.screen = list() - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.healthdoll, mymob.nutrition_icon, mymob.pullin, mymob.gun_setting_icon, lingchemdisplay, lingstingdisplay) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach ) + mymob.client.screen += list(mymob.throw_icon, mymob.zone_sel, mymob.internals, mymob.healths, mymob.healthdoll, mymob.pullin, mymob.gun_setting_icon, lingchemdisplay, lingstingdisplay) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach ) mymob.client.screen += src.adding + src.hotkeybuttons mymob.client.screen += mymob.client.void diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm index e0b1ea11f1a..331c04fc69f 100644 --- a/code/_onclick/hud/other_mobs.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -6,12 +6,6 @@ return /datum/hud/proc/corgi_hud(u) - mymob.fire = new /obj/screen() - mymob.fire.icon = 'icons/mob/screen1_corgi.dmi' - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - mymob.healths = new /obj/screen() mymob.healths.icon = 'icons/mob/screen1_corgi.dmi' mymob.healths.icon_state = "health0" @@ -23,21 +17,8 @@ mymob.pullin.update_icon(mymob) mymob.pullin.screen_loc = ui_construct_pull - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = 'icons/mob/screen1_corgi.dmi' - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen - - mymob.toxin = new /obj/screen() - mymob.toxin.icon = 'icons/mob/screen1_corgi.dmi' - mymob.toxin.icon_state = "tox0" - mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_toxin - mymob.client.screen = list() - - mymob.client.screen += list(mymob.fire, mymob.healths, mymob.pullin, mymob.oxygen, mymob.toxin) + mymob.client.screen += list(mymob.healths, mymob.pullin) /datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen1_Midnight.dmi') diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 8e729546b20..8a0fadf4e26 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -150,13 +150,6 @@ src.adding += using action_intent = using -//Cell - mymob:cells = new /obj/screen() - mymob:cells.icon = 'icons/mob/screen1_robot.dmi' - mymob:cells.icon_state = "charge-empty" - mymob:cells.name = "cell" - mymob:cells.screen_loc = ui_toxin - //Health mymob.healths = new /obj/screen() mymob.healths.icon = 'icons/mob/screen1_robot.dmi' @@ -186,25 +179,6 @@ mymob:lamp_button.name = "Toggle Headlamp" mymob:lamp_button.screen_loc = ui_borg_lamp -//Temp - mymob.bodytemp = new /obj/screen() - mymob.bodytemp.icon_state = "temp0" - mymob.bodytemp.name = "body temperature" - mymob.bodytemp.screen_loc = ui_temp - - - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = 'icons/mob/screen1_robot.dmi' - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen - - mymob.fire = new /obj/screen() - mymob.fire.icon = 'icons/mob/screen1_robot.dmi' - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - mymob.pullin = new /obj/screen/pull() mymob.pullin.icon = 'icons/mob/screen1_robot.dmi' mymob.pullin.update_icon(mymob) @@ -220,7 +194,7 @@ mymob.client.screen = list() - mymob.client.screen += list(mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.gun_setting_icon, mymob:lamp_button) //, mymob.rest, mymob.sleep, mymob.mach ) + mymob.client.screen += list(mymob.zone_sel, mymob.hands, mymob.healths, mymob.pullin, mymob.gun_setting_icon, mymob:lamp_button) //, mymob.rest, mymob.sleep, mymob.mach ) mymob.client.screen += src.adding + src.other mymob.client.screen += mymob.client.void return diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index d71d0205b89..e32637e798c 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -182,9 +182,8 @@ if (istype(location, /turf/simulated)) location.add_blood_floor(M) if("fire") - if (!(RESIST_COLD in M.mutations)) - M.take_organ_damage(0, power) - to_chat(M, "Aargh it burns!") + M.take_organ_damage(0, power) + to_chat(M, "Aargh it burns!") M.updatehealth() add_fingerprint(user) return 1 diff --git a/code/controllers/Processes/npcai.dm b/code/controllers/Processes/npcai.dm index 5039795abab..1bc8cbe008e 100644 --- a/code/controllers/Processes/npcai.dm +++ b/code/controllers/Processes/npcai.dm @@ -40,7 +40,7 @@ var/global/datum/controller/process/npcai/npcai_master simple_animal_list -= M if(ticker.current_state == GAME_STATE_FINISHED && !saved_voice) - var/mob/living/carbon/human/interactive/M = pick(snpc_list) + var/mob/living/carbon/human/interactive/M = safepick(snpc_list) if(M) M.saveVoice() saved_voice = 1 diff --git a/code/datums/cargoprofile.dm b/code/datums/cargoprofile.dm index 98732e50f8b..40a065e5bad 100644 --- a/code/datums/cargoprofile.dm +++ b/code/datums/cargoprofile.dm @@ -266,7 +266,7 @@ blacklist = null whitelist = list(/obj/item/device,/obj/item/weapon/card,/obj/item/weapon/cartridge,/obj/item/weapon/cautery,/obj/item/weapon/stock_parts/cell,/obj/item/weapon/circuitboard, /obj/item/weapon/aiModule,/obj/item/weapon/airalarm_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/circular_saw, - /obj/item/weapon/cloaking_device,/obj/item/weapon/crowbar,/obj/item/weapon/disk,/obj/item/weapon/firealarm_electronics,/obj/item/weapon/hand_tele, + /obj/item/weapon/crowbar,/obj/item/weapon/disk,/obj/item/weapon/firealarm_electronics,/obj/item/weapon/hand_tele, /obj/item/weapon/hand_labeler,/obj/item/weapon/hemostat,/obj/item/weapon/mop,/obj/item/weapon/locator,/obj/item/weapon/minihoe, /obj/item/stack/packageWrap,/obj/item/weapon/pen,/obj/item/weapon/pickaxe,/obj/item/weapon/pinpointer, /obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/retractor,/obj/item/weapon/rsf,/obj/item/weapon/rsp,/obj/item/weapon/scalpel, diff --git a/code/datums/helper_datums/icon_snapshot.dm b/code/datums/helper_datums/icon_snapshot.dm new file mode 100644 index 00000000000..22b402be446 --- /dev/null +++ b/code/datums/helper_datums/icon_snapshot.dm @@ -0,0 +1,15 @@ +/datum/icon_snapshot + var/name + var/icon + var/icon_state + var/list/overlays + +/datum/icon_snapshot/proc/makeImg() + if(!icon || !icon_state) + return + var/obj/temp = new + temp.icon = icon + temp.icon_state = icon_state + temp.overlays = overlays.Copy() + var/icon/tempicon = getFlatIcon(temp) // TODO Actually write something less heavy-handed for this + return tempicon diff --git a/code/datums/mind.dm b/code/datums/mind.dm index b07df07d935..4221db90798 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -58,6 +58,7 @@ var/datum/changeling/changeling //changeling holder var/datum/vampire/vampire //vampire holder var/datum/nations/nation //nation holder + var/datum/abductor/abductor //abductor holder var/antag_hud_icon_state = null //this mind's ANTAG_HUD should have this icon_state var/datum/atom_hud/antag/antag_hud = null //this mind's antag HUD @@ -345,6 +346,26 @@ sections["shadowling"] = text + /** Abductors **/ + + text = "Abductor" + if(ticker.mode.config_tag == "abductor") + text = uppertext(text) + text = "[text]: " + if(src in ticker.mode.abductors) + text += "Abductor|human" + text += "|undress|equip" + else + text += "Abductor|human" + + if(current && current.client && (ROLE_ABDUCTOR in current.client.prefs.be_special)) + text += "|Enabled in Prefs" + else + text += "|Disabled in Prefs" + + + sections["Abductor"] = text + /** SILICON ***/ if (istype(current, /mob/living/silicon)) @@ -898,6 +919,7 @@ if(vampire) vampire.remove_vampire_powers() qdel(vampire) + vampire = null ticker.mode.update_vampire_icons_removed(src) to_chat(current, "You grow weak and lose your powers! You are no longer a vampire and are stuck in your current form!") log_admin("[key_name(usr)] has de-vampired [key_name(current)]") @@ -1068,6 +1090,28 @@ message_admins("[key_name_admin(usr)] has thralled [current].") log_admin("[key_name(usr)] has thralled [current].") + else if(href_list["abductor"]) + switch(href_list["abductor"]) + if("clear") + to_chat(usr, "Not implemented yet. Sorry!") + //ticker.mode.update_abductor_icons_removed(src) + if("abductor") + if(!ishuman(current)) + to_chat(usr, "This only works on humans!") + return + make_Abductor() + log_admin("[key_name(usr)] turned [current] into abductor.") + ticker.mode.update_abductor_icons_added(src) + if("equip") + var/gear = alert("Agent or Scientist Gear","Gear","Agent","Scientist") + if(gear) + var/datum/game_mode/abduction/temp = new + temp.equip_common(current) + if(gear=="Agent") + temp.equip_agent(current) + else + temp.equip_scientist(current) + else if (href_list["silicon"]) switch(href_list["silicon"]) if("unmalf") @@ -1372,6 +1416,57 @@ // fail |= !ticker.mode.equip_traitor(current, 1) fail |= !ticker.mode.equip_revolutionary(current) +/datum/mind/proc/make_Abductor() + var/role = alert("Abductor Role ?","Role","Agent","Scientist") + var/team = input("Abductor Team ?","Team ?") in list(1,2,3,4) + var/teleport = alert("Teleport to ship ?","Teleport","Yes","No") + + if(!role || !team || !teleport) + return + + if(!ishuman(current)) + return + + ticker.mode.abductors |= src + + var/datum/objective/experiment/O = new + O.owner = src + objectives += O + + var/mob/living/carbon/human/H = current + + H.set_species("Abductor") + + switch(role) + if("Agent") + H.mind.abductor.agent = 1 + if("Scientist") + H.mind.abductor.scientist = 1 + H.mind.abductor.team = team + + var/list/obj/effect/landmark/abductor/agent_landmarks = new + var/list/obj/effect/landmark/abductor/scientist_landmarks = new + agent_landmarks.len = 4 + scientist_landmarks.len = 4 + for(var/obj/effect/landmark/abductor/A in landmarks_list) + if(istype(A,/obj/effect/landmark/abductor/agent)) + agent_landmarks[text2num(A.team)] = A + else if(istype(A,/obj/effect/landmark/abductor/scientist)) + scientist_landmarks[text2num(A.team)] = A + + var/obj/effect/landmark/L + if(teleport=="Yes") + switch(role) + if("Agent") + H.mind.abductor.agent = 1 + L = agent_landmarks[team] + H.loc = L.loc + if("Scientist") + H.mind.abductor.scientist = 1 + L = agent_landmarks[team] + H.loc = L.loc + + // check whether this mind's mob has been brigged for the given duration // have to call this periodically for the duration to work properly /datum/mind/proc/is_brigged(duration) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index baa299d535a..f3117a67215 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1210,6 +1210,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/weapon/pen, /obj/item/weapon/pen/blue, /obj/item/weapon/pen/red, + /obj/item/weapon/stamp/denied, + /obj/item/weapon/stamp/granted, /obj/item/weapon/folder/blue, /obj/item/weapon/folder/red, /obj/item/weapon/folder/yellow, diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 238485e5b35..868d0e901a7 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -618,6 +618,14 @@ var/list/ghostteleportlocs = list() name = "\improper Hyperspace" icon_state = "shuttle" +//Abductors +/area/abductor_ship + name = "\improper Abductor Ship" + icon_state = "yellow" + requires_power = 0 + has_gravity = 1 + lighting_use_dynamic = 0 + /area/wizard_station name = "\improper Wizard's Den" icon_state = "yellow" diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 329518a61f0..1751df19442 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -271,10 +271,7 @@ || locate(/obj/machinery/computer/cloning, get_step(src, EAST)) \ || locate(/obj/machinery/computer/cloning, get_step(src, WEST))) - var/mob/dead/observer/ghost = occupant.get_ghost() - if(ghost) - to_chat(ghost, "Your corpse has been placed into a cloning scanner. Return to your body if you want to be cloned! (Verbs -> Ghost -> Re-enter corpse)") - to_chat(ghost, sound('sound/effects/genetics.ogg')) + occupant.notify_ghost_cloning(source = src) return /obj/machinery/dna_scannernew/proc/go_out() @@ -926,7 +923,7 @@ return 1 if (bufferOption == "createInjector") - if (src.injector_ready || waiting_for_user_input) + if(injector_ready && !waiting_for_user_input) var/success = 1 var/obj/item/weapon/dnainjector/I = new /obj/item/weapon/dnainjector @@ -939,14 +936,16 @@ selectedbuf=buf.dna.SE else selectedbuf=buf.dna.UI - var/blk = input(usr,"Select Block","Block") in all_dna_blocks(selectedbuf) + var/blk = input(usr,"Select Block","Block") as null|anything in all_dna_blocks(selectedbuf) success = setInjectorBlock(I,blk,buf) else I.buf = buf - waiting_for_user_input=0 + waiting_for_user_input = 0 if(success) I.forceMove(src.loc) I.name += " ([buf.name])" + if(connected) + I.damage_coeff = connected.damage_coeff src.injector_ready = 0 spawn(300) src.injector_ready = 1 diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index c409449dbe4..cdd57853759 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -776,7 +776,7 @@ var/list/sacrificed = list() if (cultist.handcuffed) cultist.handcuffed.loc = cultist.loc cultist.handcuffed = null - cultist.update_inv_handcuffed() + cultist.update_handcuffed() if (cultist.legcuffed) cultist.legcuffed.loc = cultist.loc cultist.legcuffed = null diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index fc69cd8a79e..4001eba338b 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -448,3 +448,29 @@ proc/get_nt_opposed() else message_admins("[M] ([M.key] has been converted into [role_type] with an active antagonist jobban for said role since no ghost has volunteered to take their place.") to_chat(M, "You have been converted into [role_type] with an active jobban. Any further violations of the rules on your part are likely to result in a permanent ban.") + +/datum/game_mode/proc/printplayer(datum/mind/ply, fleecheck) + var/text = "
[ply.key] was [ply.name] the [ply.assigned_role] and" + if(ply.current) + if(ply.current.stat == DEAD) + text += " died" + else + text += " survived" + if(fleecheck && ply.current.z > ZLEVEL_STATION) + text += " while fleeing the station" + if(ply.current.real_name != ply.name) + text += " as [ply.current.real_name]" + else + text += " had their body destroyed" + return text + +/datum/game_mode/proc/printobjectives(datum/mind/ply) + var/text = "" + var/count = 1 + for(var/datum/objective/objective in ply.objectives) + if(objective.check_completion()) + text += "
Objective #[count]: [objective.explanation_text] Success!" + else + text += "
Objective #[count]: [objective.explanation_text] Fail." + count++ + return text \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm new file mode 100644 index 00000000000..70f5c14a9f0 --- /dev/null +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -0,0 +1,456 @@ +/datum/game_mode + var/abductor_teams = 0 + var/list/datum/mind/abductors = list() + var/list/datum/mind/abductees = list() + +/datum/game_mode/abduction + name = "abduction" + config_tag = "abduction" + recommended_enemies = 2 + required_players = 15 + required_players_secret = 15 + var/max_teams = 4 + abductor_teams = 1 + var/list/datum/mind/scientists = list() + var/list/datum/mind/agents = list() + var/list/datum/objective/team_objectives = list() + var/list/team_names = list() + var/finished = 0 + var/list/datum/mind/possible_abductors = list() + +/datum/game_mode/abduction/announce() + to_chat(world, "The current game mode is - Abduction!") + to_chat(world, "There are alien abductors sent to [world.name] to perform nefarious experiments!") + to_chat(world, "Abductors - kidnap the crew and replace their organs with experimental ones.") + to_chat(world, "Crew - don't get abducted and stop the abductors.") + +/datum/game_mode/abduction/pre_setup() + possible_abductors = get_players_for_role(ROLE_ABDUCTOR) + + if(!possible_abductors.len) + return 0 + + abductor_teams = max(1, min(max_teams,round(num_players()/15))) + var/possible_teams = max(1,round(possible_abductors.len / 2)) + abductor_teams = min(abductor_teams,possible_teams) + + abductors.len = 2*abductor_teams + scientists.len = abductor_teams + agents.len = abductor_teams + team_objectives.len = abductor_teams + team_names.len = abductor_teams + + for(var/i=1,i<=abductor_teams,i++) + if(!make_abductor_team(i)) + return 0 + + return 1 + +/datum/game_mode/abduction/proc/make_abductor_team(team_number,preset_agent=null,preset_scientist=null) + //Team Name + team_names[team_number] = "Mothership [pick(possible_changeling_IDs)]" //TODO Ensure unique and actual alieny names + //Team Objective + var/datum/objective/experiment/team_objective = new + team_objective.team = team_number + team_objectives[team_number] = team_objective + //Team Members + + if(!preset_agent || !preset_scientist) + if(possible_abductors.len <=2) + return 0 + + var/datum/mind/scientist + var/datum/mind/agent + + if(!preset_scientist) + scientist = pick(possible_abductors) + possible_abductors -= scientist + else + scientist = preset_scientist + + if(!preset_agent) + agent = pick(possible_abductors) + possible_abductors -= agent + else + agent = preset_agent + + + scientist.assigned_role = "MODE" + scientist.special_role = "abductor scientist" + log_game("[scientist.key] (ckey) has been selected as an abductor team [team_number] scientist.") + + agent.assigned_role = "MODE" + agent.special_role = "abductor agent" + log_game("[agent.key] (ckey) has been selected as an abductor team [team_number] agent.") + + abductors |= agent + abductors |= scientist + scientists[team_number] = scientist + agents[team_number] = agent + return 1 + +/datum/game_mode/abduction/post_setup() + //Spawn Team + var/list/obj/effect/landmark/abductor/agent_landmarks = new + var/list/obj/effect/landmark/abductor/scientist_landmarks = new + agent_landmarks.len = max_teams + scientist_landmarks.len = max_teams + for(var/obj/effect/landmark/abductor/A in landmarks_list) + if(istype(A,/obj/effect/landmark/abductor/agent)) + agent_landmarks[text2num(A.team)] = A + else if(istype(A,/obj/effect/landmark/abductor/scientist)) + scientist_landmarks[text2num(A.team)] = A + + var/datum/mind/agent + var/obj/effect/landmark/L + var/datum/mind/scientist + var/team_name + var/mob/living/carbon/human/H + for(var/team_number=1,team_number<=abductor_teams,team_number++) + team_name = team_names[team_number] + agent = agents[team_number] + H = agent.current + L = agent_landmarks[team_number] + H.forceMove(get_turf(L)) + H.set_species("Abductor") + H.mind.abductor.agent = 1 + H.mind.abductor.team = team_number + H.real_name = team_name + " Agent" + equip_common(H,team_number) + equip_agent(H,team_number) + greet_agent(agent,team_number) + + scientist = scientists[team_number] + H = scientist.current + L = scientist_landmarks[team_number] + H.forceMove(get_turf(L)) + H.set_species("Abductor") + H.mind.abductor.scientist = 1 + H.mind.abductor.team = team_number + H.real_name = team_name + " Scientist" + equip_common(H,team_number) + equip_scientist(H,team_number) + greet_scientist(scientist,team_number) + return ..() + +//Used for create antag buttons +/datum/game_mode/abduction/proc/post_setup_team(team_number) + var/list/obj/effect/landmark/abductor/agent_landmarks = new + var/list/obj/effect/landmark/abductor/scientist_landmarks = new + agent_landmarks.len = max_teams + scientist_landmarks.len = max_teams + for(var/obj/effect/landmark/abductor/A in landmarks_list) + if(istype(A,/obj/effect/landmark/abductor/agent)) + agent_landmarks[text2num(A.team)] = A + else if(istype(A,/obj/effect/landmark/abductor/scientist)) + scientist_landmarks[text2num(A.team)] = A + + var/datum/mind/agent + var/obj/effect/landmark/L + var/datum/mind/scientist + var/team_name + var/mob/living/carbon/human/H + + team_name = team_names[team_number] + agent = agents[team_number] + H = agent.current + L = agent_landmarks[team_number] + H.forceMove(get_turf(L)) + H.set_species("Abductor") + H.mind.abductor.agent = 1 + H.mind.abductor.team = team_number + H.real_name = team_name + " Agent" + equip_common(H,team_number) + equip_agent(H,team_number) + greet_agent(agent,team_number) + + + scientist = scientists[team_number] + H = scientist.current + L = scientist_landmarks[team_number] + H.forceMove(get_turf(L)) + H.set_species("Abductor") + H.mind.abductor.scientist = 1 + H.mind.abductor.team = team_number + H.real_name = team_name + " Scientist" + equip_common(H,team_number) + equip_scientist(H,team_number) + greet_scientist(scientist,team_number) + + +/datum/abductor //stores abductor's team and whether they're a scientist or agent; since species datums are global, we have to use this, instead. + var/scientist = 0 + var/agent = 0 + var/team = 1 + +/datum/game_mode/abduction/proc/greet_agent(datum/mind/abductor,team_number) + abductor.objectives += team_objectives[team_number] + var/team_name = team_names[team_number] + + to_chat(abductor.current, "You are an agent of [team_name]!") + to_chat(abductor.current, "With the help of your teammate, kidnap and experiment on station crew members!") + to_chat(abductor.current, "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve.") + + var/obj_count = 1 + for(var/datum/objective/objective in abductor.objectives) + to_chat(abductor.current, "Objective #[obj_count]: [objective.explanation_text]") + obj_count++ + return + +/datum/game_mode/abduction/proc/greet_scientist(datum/mind/abductor,team_number) + abductor.objectives += team_objectives[team_number] + var/team_name = team_names[team_number] + + to_chat(abductor.current, "You are a scientist of [team_name]!") + to_chat(abductor.current, "With the help of your teammate, kidnap and experiment on station crew members!") + to_chat(abductor.current, "Use your tool and ship consoles to support the agent and retrieve human specimens.") + + var/obj_count = 1 + for(var/datum/objective/objective in abductor.objectives) + to_chat(abductor.current, "Objective #[obj_count]: [objective.explanation_text]") + obj_count++ + return + +/datum/game_mode/abduction/proc/equip_common(mob/living/carbon/human/agent,team_number) + var/radio_freq = SYND_FREQ + + var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(agent) + R.set_frequency(radio_freq) + agent.equip_to_slot_or_del(R, slot_l_ear) + agent.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(agent), slot_shoes) + agent.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(agent), slot_w_uniform) //they're greys gettit + agent.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(agent), slot_back) + +/datum/game_mode/abduction/proc/get_team_console(team) + var/obj/machinery/abductor/console/console + for(var/obj/machinery/abductor/console/c in abductor_equipment) + if(c.team == team) + console = c + break + return console + +/datum/game_mode/abduction/proc/equip_agent(mob/living/carbon/human/agent,team_number) + if(!team_number) + team_number = agent.mind.abductor.team + + var/obj/machinery/abductor/console/console = get_team_console(team_number) + var/obj/item/clothing/suit/armor/abductor/vest/V = new /obj/item/clothing/suit/armor/abductor/vest(agent) + if(console!=null) + console.vest = V + V.flags |= NODROP + agent.equip_to_slot_or_del(V, slot_wear_suit) + agent.equip_to_slot_or_del(new /obj/item/weapon/abductor_baton(agent), slot_in_backpack) + agent.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/decloner/alien(agent), slot_belt) + agent.equip_to_slot_or_del(new /obj/item/device/abductor/silencer(agent), slot_in_backpack) + agent.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/abductor(agent), slot_head) + agent.update_icons() + + +/datum/game_mode/abduction/proc/equip_scientist(var/mob/living/carbon/human/scientist,var/team_number) + if(!team_number) + team_number = scientist.mind.abductor.team + + var/obj/machinery/abductor/console/console = get_team_console(team_number) + var/obj/item/device/abductor/gizmo/G = new /obj/item/device/abductor/gizmo(scientist) + if(console!=null) + console.gizmo = G + G.console = console + scientist.equip_to_slot_or_del(G, slot_in_backpack) + + var/obj/item/weapon/implant/abductor/beamplant = new /obj/item/weapon/implant/abductor(scientist) + beamplant.implant(scientist) + scientist.update_icons() + + +/datum/game_mode/abduction/check_finished() + if(!finished) + for(var/team_number=1,team_number<=abductor_teams,team_number++) + var/obj/machinery/abductor/console/con = get_team_console(team_number) + var/datum/objective/objective = team_objectives[team_number] + if (con.experiment.points >= objective.target_amount) + shuttle_master.emergency.request(null, 0.5) + finished = 1 + return ..() + return ..() + +/datum/game_mode/abduction/declare_completion() + for(var/team_number=1,team_number<=abductor_teams,team_number++) + var/obj/machinery/abductor/console/console = get_team_console(team_number) + var/datum/objective/objective = team_objectives[team_number] + var/team_name = team_names[team_number] + if(console.experiment.points >= objective.target_amount) + to_chat(world, "[team_name] team fullfilled its mission!") + else + to_chat(world, "[team_name] team failed its mission.") + ..() + return 1 + +/datum/game_mode/proc/auto_declare_completion_abduction() + var/text = "" + if(abductors.len) + text += "
The abductors were:" + for(var/datum/mind/abductor_mind in abductors) + text += printplayer(abductor_mind) + text += printobjectives(abductor_mind) + text += "
" + if(abductees.len) + text += "
The abductees were:" + for(var/datum/mind/abductee_mind in abductees) + text += printplayer(abductee_mind) + text += printobjectives(abductee_mind) + text += "
" + to_chat(world, text) + +//Landmarks +// TODO: Split into seperate landmarks for prettier ships +/obj/effect/landmark/abductor + var/team = 1 + +/obj/effect/landmark/abductor/agent +/obj/effect/landmark/abductor/scientist + + +// OBJECTIVES +/datum/objective/experiment + target_amount = 6 + var/team + +/datum/objective/experiment/New() + explanation_text = "Experiment on [target_amount] humans." + +/datum/objective/experiment/check_completion() + var/ab_team = team + if(owner) + if(!owner.current || !ishuman(owner.current)) + return 0 + var/mob/living/carbon/human/H = owner.current + if(H.get_species() != "Abductor") + return 0 + ab_team = H.mind.abductor.team + for(var/obj/machinery/abductor/experiment/E in abductor_equipment) + if(E.team == ab_team) + if(E.points >= target_amount) + return 1 + else + return 0 + return 0 + +/datum/game_mode/proc/update_abductor_icons_added(datum/mind/alien_mind) + var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_ABDUCTOR] + hud.join_hud(alien_mind.current) + set_antag_hud(alien_mind.current, ((alien_mind in abductors) ? "abductor" : "abductee")) + +/datum/game_mode/proc/update_abductor_icons_removed(datum/mind/alien_mind) + var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_ABDUCTOR] + hud.leave_hud(alien_mind.current) + set_antag_hud(alien_mind.current, null) + +/datum/objective/abductee + completed = 1 + +/datum/objective/abductee/steal + explanation_text = "Steal all" + +/datum/objective/abductee/steal/New() + var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap")) + explanation_text+=" [target]." + +/datum/objective/abductee/capture + explanation_text = "Capture" + +/datum/objective/abductee/capture/New() + var/list/jobs = job_master.occupations.Copy() + for(var/datum/job/J in jobs) + if(J.current_positions < 1) + jobs -= J + if(jobs.len > 0) + var/datum/job/target = pick(jobs) + explanation_text += " a [target.title]." + else + explanation_text += " someone." + +/datum/objective/abductee/shuttle + explanation_text = "You must escape the station! Get the shuttle called!" + +/datum/objective/abductee/noclone + explanation_text = "Don't allow anyone to be cloned." + +/datum/objective/abductee/oxygen + explanation_text = "The oxygen is killing them all and they don't even know it. Make sure no oxygen is on the station." + +/datum/objective/abductee/blazeit + explanation_text = "Your body must be improved. Ingest as many drugs as you can." + +/datum/objective/abductee/yumyum + explanation_text = "You are hungry. Eat as much food as you can find." + +/datum/objective/abductee/insane + explanation_text = "You see you see what they cannot you see the open door you seeE you SEeEe you SEe yOU seEee SHOW THEM ALL" + +/datum/objective/abductee/cannotmove + explanation_text = "Convince the crew that you are a paraplegic." + +/datum/objective/abductee/deadbodies + explanation_text = "Start a collection of corpses. Don't kill people to get these corpses." + +/datum/objective/abductee/floors + explanation_text = "Replace all the floor tiles with carpeting, wooden boards, or grass." + +/datum/objective/abductee/POWERUNLIMITED + explanation_text = "Flood the station's powernet with as much electricity as you can." + +/datum/objective/abductee/pristine + explanation_text = "Ensure the station is in absolutely pristine condition." + +/datum/objective/abductee/window + explanation_text = "Replace all normal windows with reinforced windows." + +/datum/objective/abductee/nations + explanation_text = "Ensure your department prospers over all else." + +/datum/objective/abductee/abductception + explanation_text = "You have been changed forever. Find the ones that did this to you and give them a taste of their own medicine." + +/datum/objective/abductee/ghosts + explanation_text = "Conduct a seance with the spirits of the afterlife." + +/datum/objective/abductee/summon + explanation_text = "Conduct a ritual to summon an elder god." + +/datum/objective/abductee/machine + explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power." + +/datum/objective/abductee/prevent + explanation_text = "You have been enlightened. This knowledge must not escape. Ensure nobody else can become enlightened." + +/datum/objective/abductee/calling + explanation_text = "Call forth a spirit from the other side." + +/datum/objective/abductee/calling/New() + var/mob/dead/D = pick(dead_mob_list) + if(D) + explanation_text = "You know that [D] has perished. Call them from the spirit realm." + +/datum/objective/abductee/social_experiment + explanation_text = "This is a secret social experiment conducted by Nanotrasen. Convince the crew that this is the truth." + +/datum/objective/abductee/vr + explanation_text = "It's all an entirely virtual simulation within an underground vault. Convince the crew to escape the shackles of VR." + +/datum/objective/abductee/pets + explanation_text = "Nanotrasen is abusing the animals! Save as many as you can!" + +/datum/objective/abductee/defect + explanation_text = "Defect from your employer." + +/datum/objective/abductee/promote + explanation_text = "Climb the corporate ladder all the way to the top!" + +/datum/objective/abductee/science + explanation_text = "So much lies undiscovered. Look deeper into the machinations of the universe." + +/datum/objective/abductee/build + explanation_text = "Expand the station." + +/datum/objective/abductee/pragnant + explanation_text = "You are pregnant and soon due. Find a safe place to deliver your baby." diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm new file mode 100644 index 00000000000..5107ff7cab4 --- /dev/null +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -0,0 +1,634 @@ +#define VEST_STEALTH 1 +#define VEST_COMBAT 2 +#define GIZMO_SCAN 1 +#define GIZMO_MARK 2 + +//AGENT VEST +/obj/item/clothing/suit/armor/abductor/vest + name = "agent vest" + desc = "A vest outfitted with advanced stealth technology. It has two modes - combat and stealth." + icon = 'icons/obj/abductor.dmi' + icon_state = "vest_stealth" + item_state = "armor" + blood_overlay_type = "armor" + origin_tech = "materials=5;biotech=4;powerstorage=5;abductor=3" + armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15) + action_button_name = "Activate" + action_button_is_hands_free = 1 + var/mode = VEST_STEALTH + var/stealth_active = 0 + var/combat_cooldown = 10 + var/datum/icon_snapshot/disguise + var/stealth_armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15) + var/combat_armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 50, rad = 50) + +/obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode() + switch(mode) + if(VEST_STEALTH) + mode = VEST_COMBAT + DeactivateStealth() + armor = combat_armor + icon_state = "vest_combat" + if(istype(loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = loc + H.update_inv_wear_suit() + return + if(VEST_COMBAT)// TO STEALTH + mode = VEST_STEALTH + armor = stealth_armor + icon_state = "vest_stealth" + if(istype(loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = loc + H.update_inv_wear_suit() + return + +/obj/item/clothing/suit/armor/abductor/vest/proc/SetDisguise(datum/icon_snapshot/entry) + disguise = entry + +/obj/item/clothing/suit/armor/abductor/vest/proc/ActivateStealth() + if(disguise == null) + return + stealth_active = 1 + if(ishuman(loc)) + var/mob/living/carbon/human/M = src.loc + spawn(0) + anim(M.loc,M,'icons/mob/mob.dmi',,"cloak",,M.dir) + + M.name_override = disguise.name + M.icon = disguise.icon + M.icon_state = disguise.icon_state + M.overlays = disguise.overlays + M.update_inv_r_hand() + M.update_inv_l_hand() + return + +/obj/item/clothing/suit/armor/abductor/vest/proc/DeactivateStealth() + if(!stealth_active) + return + stealth_active = 0 + if(ishuman(loc)) + var/mob/living/carbon/human/M = src.loc + spawn(0) + anim(M.loc,M,'icons/mob/mob.dmi',,"uncloak",,M.dir) + M.name_override = null + M.overlays.Cut() + M.regenerate_icons() + return + +/obj/item/clothing/suit/armor/abductor/vest/IsShield() + DeactivateStealth() + return 0 + +/obj/item/clothing/suit/armor/abductor/vest/IsReflect() + DeactivateStealth() + return 0 + +/obj/item/clothing/suit/armor/abductor/vest/ui_action_click() + switch(mode) + if(VEST_COMBAT) + Adrenaline() + if(VEST_STEALTH) + if(stealth_active) + DeactivateStealth() + else + ActivateStealth() + +/obj/item/clothing/suit/armor/abductor/vest/proc/Adrenaline() + if(ishuman(loc)) + if(combat_cooldown != initial(combat_cooldown)) + to_chat(src.loc, "Combat injection is still recharging.") + return + var/mob/living/carbon/human/M = src.loc + M.adjustStaminaLoss(-75) + M.SetParalysis(0) + M.SetStunned(0) + M.SetWeakened(0) + combat_cooldown = 0 + processing_objects.Add(src) + +/obj/item/clothing/suit/armor/abductor/vest/process() + combat_cooldown++ + if(combat_cooldown==initial(combat_cooldown)) + processing_objects.Remove(src) + +/obj/item/device/abductor/proc/IsAbductor(user) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.get_species() != "Abductor") + return 0 + return 1 + return 0 + +/obj/item/device/abductor/proc/AbductorCheck(user) + if(IsAbductor(user)) + return 1 + to_chat(user, "You can't figure how this works!") + return 0 + +/obj/item/device/abductor/proc/ScientistCheck(user) + var/mob/living/carbon/human/H = user + if(H.mind && H.mind.abductor) + return H.mind.abductor.scientist + +/obj/item/device/abductor/gizmo + name = "science tool" + desc = "A dual-mode tool for retrieving specimens and scanning appearances. Scanning can be done through cameras." + icon = 'icons/obj/abductor.dmi' + icon_state = "gizmo_scan" + item_state = "gizmo" + origin_tech = "materials=5;magnets=5;bluespace=6;abductor=4" + var/mode = GIZMO_SCAN + var/mob/living/marked = null + var/obj/machinery/abductor/console/console + +/obj/item/device/abductor/gizmo/attack_self(mob/user) + if(!AbductorCheck(user)) + return + if(!ScientistCheck(user)) + to_chat(user, "You're not trained to use this!") + return + if(mode == GIZMO_SCAN) + mode = GIZMO_MARK + icon_state = "gizmo_mark" + else + mode = GIZMO_SCAN + icon_state = "gizmo_scan" + to_chat(user, "You switch the device to [mode==GIZMO_SCAN? "SCAN": "MARK"] MODE") + +/obj/item/device/abductor/gizmo/attack(mob/living/M, mob/user) + if(!AbductorCheck(user)) + return + if(!ScientistCheck(user)) + to_chat(user, "You're not trained to use this") + return + switch(mode) + if(GIZMO_SCAN) + scan(M, user) + if(GIZMO_MARK) + mark(M, user) + + +/obj/item/device/abductor/gizmo/afterattack(atom/target, mob/living/user, flag, params) + if(flag) + return + if(!AbductorCheck(user)) + return + if(!ScientistCheck(user)) + to_chat(user, "You're not trained to use this") + return + switch(mode) + if(GIZMO_SCAN) + scan(target, user) + if(GIZMO_MARK) + mark(target, user) + +/obj/item/device/abductor/gizmo/proc/scan(atom/target, mob/living/user) + if(istype(target,/mob/living/carbon/human)) + if(console!=null) + console.AddSnapshot(target) + to_chat(user, "You scan [target] and add them to the database.") + +/obj/item/device/abductor/gizmo/proc/mark(atom/target, mob/living/user) + if(marked == target) + to_chat(user, "This specimen is already marked!") + return + if(istype(target,/mob/living/carbon/human)) + if(IsAbductor(target)) + marked = target + to_chat(user, "You mark [target] for future retrieval.") + else + prepare(target,user) + else + prepare(target,user) + +/obj/item/device/abductor/gizmo/proc/prepare(atom/target, mob/living/user) + if(get_dist(target,user)>1) + to_chat(user, "You need to be next to the specimen to prepare it for transport!") + return + to_chat(user, "You begin preparing [target] for transport...") + if(do_after(user, 100, target = target)) + marked = target + to_chat(user, "You finish preparing [target] for transport.") + + +/obj/item/device/abductor/silencer + name = "abductor silencer" + desc = "A compact device used to shut down communications equipment." + icon = 'icons/obj/abductor.dmi' + icon_state = "silencer" + item_state = "silencer" + origin_tech = "materials=5;magnets=5;abductor=3" + +/obj/item/device/abductor/silencer/attack(mob/living/M, mob/user) + if(!AbductorCheck(user)) + return + radio_off(M, user) + +/obj/item/device/abductor/silencer/afterattack(atom/target, mob/living/user, flag, params) + if(flag) + return + if(!AbductorCheck(user)) + return + radio_off(target, user) + +/obj/item/device/abductor/silencer/proc/radio_off(atom/target, mob/living/user) + if(!(user in (viewers(7,target)))) + return + + var/turf/targloc = get_turf(target) + + var/mob/living/carbon/human/M + for(M in view(2,targloc)) + if(M == user) + continue + to_chat(user, "You silence [M]'s radio devices.") + radio_off_mob(M) + +/obj/item/device/abductor/silencer/proc/radio_off_mob(mob/living/carbon/human/M) + var/list/all_items = M.GetAllContents() + + for(var/obj/I in all_items) + if(istype(I,/obj/item/device/radio/)) + var/obj/item/device/radio/r = I + r.listening = 0 + if(!istype(I,/obj/item/device/radio/headset)) + r.broadcasting = 0 //goddamned headset hacks + + +/obj/item/weapon/implant/abductor + name = "recall implant" + desc = "Returns you to the mothership." + icon = 'icons/obj/abductor.dmi' + icon_state = "implant" + activated = 1 + origin_tech = "materials=2;biotech=3;magnets=4;bluespace=5;abductor=5" + var/obj/machinery/abductor/pad/home + var/cooldown = 30 + +/obj/item/weapon/implant/abductor/activate() + if(cooldown == initial(cooldown)) + home.Retrieve(imp_in,1) + cooldown = 0 + processing_objects.Add(src) + else + to_chat(imp_in, "You must wait [30 - cooldown] seconds to use [src] again!") + return + +/obj/item/weapon/implant/abductor/process() + if(cooldown < initial(cooldown)) + cooldown++ + if(cooldown == initial(cooldown)) + processing_objects.Remove(src) + +/obj/item/weapon/implant/abductor/implant(var/mob/source, var/mob/user) + if(..()) + var/obj/machinery/abductor/console/console + if(ishuman(source)) + var/mob/living/carbon/human/H = source + if(H.get_species() == "Abductor") + console = get_team_console(H.mind.abductor.team) + home = console.pad + + if(!home) + console = get_team_console(pick(1, 2, 3, 4)) + home = console.pad + return 1 + +/obj/item/weapon/implant/abductor/proc/get_team_console(var/team) + var/obj/machinery/abductor/console/console + for(var/obj/machinery/abductor/console/c in abductor_equipment) + if(c.team == team) + console = c + break + return console + +/obj/item/weapon/gun/energy/decloner/alien + name = "alien pistol" + desc = "A complicated gun that fires bursts of high-intensity radiation." + icon_state = "alienpistol" + item_state = "alienpistol" + origin_tech = "combat=5;materials=4;powerstorage=3;abductor=3" + +/obj/item/weapon/gun/energy/decloner/alien/special_check(user) + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + if(H.get_species() != "Abductor") + to_chat(user, "UNAUTHORIZED -- UNAUTHORIZED") + return 0 + return 1 + +/obj/item/weapon/paper/abductor + name = "Dissection Guide" + icon_state = "alienpaper_words" + info = {"Dissection for Dummies
+ +
+ 1.Acquire fresh specimen.
+ 2.Put the specimen on operating table
+ 3.Apply scalpel to the chest, preparing for dissection
+ 4.Apply scalpel to specimen torso
+ 5.Clamp bleeders on the specimen's torso
+ 6.Retract skin from specimen's torso
+ 7.Saw through the specimen's torso
+ 8.Retract skin from specimen's torso again
+ 9.Search through the specimen's torso with your hands to remove their heart
+ 10.Insert replacement gland (Retrieve one from gland storage)
+ 11.Cauterize the patient's torso
+ 12.Consider dressing the specimen back to not disturb the habitat
+ 13.Put the specimen in the experiment machinery
+ 14.Choose one of the machine options and follow displayed instructions
+
+Congratulations! You are now trained for xenobiology research!"} + +/obj/item/weapon/paper/abductor/update_icon() + return + +#define BATON_STUN 0 +#define BATON_SLEEP 1 +#define BATON_CUFF 2 +#define BATON_PROBE 3 +#define BATON_MODES 4 + +/obj/item/weapon/abductor_baton + name = "advanced baton" + desc = "A quad-mode baton used for incapacitation and restraining of specimens." + var/mode = BATON_STUN + icon = 'icons/obj/abductor.dmi' + icon_state = "wonderprodStun" + item_state = "wonderprod" + slot_flags = SLOT_BELT + origin_tech = "materials=6;combat=5;biotech=7;abductor=4" + force = 7 + w_class = 3 + action_button_name = "Toggle Mode" + +/obj/item/weapon/abductor_baton/proc/toggle(mob/living/user=usr) + mode = (mode+1)%BATON_MODES + var/txt + switch(mode) + if(BATON_STUN) + txt = "stunning" + if(BATON_SLEEP) + txt = "sleep inducement" + if(BATON_CUFF) + txt = "restraining" + if(BATON_PROBE) + txt = "probing" + + to_chat(usr, "You switch the baton to [txt] mode.") + update_icon() + +/obj/item/weapon/abductor_baton/update_icon() + switch(mode) + if(BATON_STUN) + icon_state = "wonderprodStun" + item_state = "wonderprodStun" + if(BATON_SLEEP) + icon_state = "wonderprodSleep" + item_state = "wonderprodSleep" + if(BATON_CUFF) + icon_state = "wonderprodCuff" + item_state = "wonderprodCuff" + if(BATON_PROBE) + icon_state = "wonderprodProbe" + item_state = "wonderprodProbe" + +/obj/item/weapon/abductor_baton/proc/IsAbductor(mob/living/user) + if(!ishuman(user)) + return 0 + var/mob/living/carbon/human/H = user + if(H.get_species() != "Abductor") + return 0 + return 1 + +/obj/item/weapon/abductor_baton/attack(mob/target, mob/living/user) + if(!IsAbductor(user)) + return + + if(isrobot(target)) + ..() + return + + if(!isliving(target)) + return + + var/mob/living/L = target + + user.do_attack_animation(L) + + switch (mode) + if(BATON_STUN) + StunAttack(L,user) + if(BATON_SLEEP) + SleepAttack(L,user) + if(BATON_CUFF) + CuffAttack(L,user) + if(BATON_PROBE) + ProbeAttack(L,user) + +/obj/item/weapon/abductor_baton/attack_self(mob/living/user) + toggle(user) + if(istype(user,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + H.update_inv_l_hand() + H.update_inv_r_hand() + +/obj/item/weapon/abductor_baton/proc/StunAttack(mob/living/L,mob/living/user) + user.lastattacked = L + L.lastattacker = user + + L.Stun(7) + L.Weaken(7) + L.apply_effect(STUTTER, 7) + + L.visible_message("[user] has stunned [L] with [src]!", \ + "[user] has stunned you with [src]!") + playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) + + if(ishuman(L)) + var/mob/living/carbon/human/H = L + H.forcesay(hit_appends) + + add_logs(L, user, "stunned") + return + +/obj/item/weapon/abductor_baton/proc/SleepAttack(mob/living/L,mob/living/user) + if(L.stunned) + L.visible_message("[user] has induced sleep in [L] with [src]!", \ + "You suddenly feel very drowsy!") + playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) + L.Sleeping(60) + add_logs(L, user, "put to sleep") + else + L.drowsyness += 1 + to_chat(user, "Sleep inducement works fully only on stunned specimens! ") + L.visible_message("[user] tried to induce sleep in [L] with [src]!", \ + "You suddenly feel drowsy!") + return + +/obj/item/weapon/abductor_baton/proc/CuffAttack(mob/living/L,mob/living/user) + if(!iscarbon(L)) + return + var/mob/living/carbon/C = L + if(!C.handcuffed) + playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2) + C.visible_message("[user] begins restraining [C] with [src]!", \ + "[user] begins shaping an energy field around your hands!") + if(do_mob(user, C, 30)) + if(!C.handcuffed) + C.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/used(C) + C.update_handcuffed() + to_chat(user, "You handcuff [C].") + add_logs(C, user, "handcuffed") + else + to_chat(user, "You fail to handcuff [C].") + return + +/obj/item/weapon/abductor_baton/proc/ProbeAttack(mob/living/L,mob/living/user) + L.visible_message("[user] probes [L] with [src]!", \ + "[user] probes you!") + + var/species = "Unknown species" + var/helptext = "Species unsuitable for experiments." + + if(ishuman(L)) + var/mob/living/carbon/human/H = L + species = "[H.species.name]" + if(L.mind && L.mind.changeling) + species = "Changeling lifeform" + var/obj/item/organ/internal/gland/temp = locate() in H.internal_organs + if(temp) + helptext = "Experimental gland detected!" + else + helptext = "Subject suitable for experiments." + + to_chat(user,"Probing result: [species]") + to_chat(user, "[helptext]") + +/obj/item/weapon/restraints/handcuffs/energy + name = "hard-light energy field" + desc = "A hard-light field restraining the hands." + icon_state = "cuff_white" // Needs sprite + breakouttime = 450 + trashtype = /obj/item/weapon/restraints/handcuffs/energy/used + origin_tech = "materials=2;magnets=5;abductor=2" + +/obj/item/weapon/restraints/handcuffs/energy/used + desc = "energy discharge" + +/obj/item/weapon/restraints/handcuffs/energy/used/dropped(mob/user) + user.visible_message("[user]'s [src] break in a discharge of energy!", \ + "[user]'s [src] break in a discharge of energy!") + var/datum/effect/system/spark_spread/S = new + S.set_up(4,0,user.loc) + S.start() + qdel(src) + +/obj/item/weapon/abductor_baton/examine(mob/user) + ..() + switch(mode) + if(BATON_STUN) + to_chat(user, "The baton is in stun mode.") + if(BATON_SLEEP) + to_chat(user, "The baton is in sleep inducement mode.") + if(BATON_CUFF) + to_chat(user, "The baton is in restraining mode.") + if(BATON_PROBE) + to_chat(user, "The baton is in probing mode.") + + +/obj/item/weapon/scalpel/alien + name = "alien scalpel" + icon = 'icons/obj/abductor.dmi' + origin_tech = "materials=2;biotech=2;abductor=2" + +/obj/item/weapon/hemostat/alien + name = "alien hemostat" + icon = 'icons/obj/abductor.dmi' + origin_tech = "materials=2;biotech=2;abductor=2" + +/obj/item/weapon/retractor/alien + name = "alien retractor" + icon = 'icons/obj/abductor.dmi' + origin_tech = "materials=2;biotech=2;abductor=2" + +/obj/item/weapon/circular_saw/alien + name = "alien saw" + icon = 'icons/obj/abductor.dmi' + origin_tech = "materials=2;biotech=2;abductor=2" + +/obj/item/weapon/surgicaldrill/alien + name = "alien drill" + icon = 'icons/obj/abductor.dmi' + origin_tech = "materials=2;biotech=2;abductor=2" + +/obj/item/weapon/cautery/alien + name = "alien cautery" + icon = 'icons/obj/abductor.dmi' + origin_tech = "materials=2;biotech=2;abductor=2" + +/obj/item/clothing/head/helmet/abductor + name = "agent headgear" + desc = "Abduct with style - spiky style. Prevents digital tracking." + icon_state = "alienhelmet" + item_state = "alienhelmet" + blockTracking = 1 + origin_tech = "materials=6;magnets=5;abductor=3" + flags = BLOCKHAIR + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE + +// Operating Table / Beds / Lockers + +/obj/machinery/optable/abductor + icon = 'icons/obj/abductor.dmi' + icon_state = "bed" + no_icon_updates = 1 //no icon updates for this; it's static. + +/obj/structure/stool/bed/abductor + name = "resting contraption" + desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?" + icon = 'icons/obj/abductor.dmi' + icon_state = "bed" + +/obj/structure/abductor_tableframe + name = "alien table frame" + desc = "A sturdy table frame made from alien alloy." + icon_state = "alien_frame" + density = 1 + +/obj/structure/abductor_tableframe/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/wrench)) + to_chat(user, "You start disassembling [src]...") + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + if(do_after(user, 30, target = src)) + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + new /obj/item/stack/sheet/mineral/abductor(get_turf(src)) + qdel(src) + return + if(istype(I, /obj/item/stack/sheet/mineral/abductor)) + var/obj/item/stack/sheet/P = I + if(P.get_amount() < 1) + to_chat(user, "You need one alien alloy sheet to do this!") + return + to_chat(user, "You start adding [P] to [src]...") + if(do_after(user, 50, target = src)) + P.use(1) + new /obj/structure/table/abductor(src.loc) + qdel(src) + return + +/obj/structure/table/abductor + name = "alien table" + desc = "Advanced flat surface technology at work!" + icon = 'icons/obj/smooth_structures/alien_table.dmi' + icon_state = "alien_table" + canSmoothWith = null + parts = /obj/item/stack/sheet/mineral/abductor + +/obj/structure/closet/abductor + name = "alien locker" + desc = "Contains secrets of the universe." + icon_state = "abductor" + icon_closed = "abductor" + icon_opened = "abductoropen" + material_drop = /obj/item/stack/sheet/mineral/abductor \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm new file mode 100644 index 00000000000..80cdfe8ee78 --- /dev/null +++ b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm @@ -0,0 +1,62 @@ +/datum/surgery/organ_extraction + name = "experimental dissection" + steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/open_encased/saw, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/internal/extract_organ, /datum/surgery_step/internal/gland_insert, /datum/surgery_step/generic/cauterize) + possible_locs = list("chest") + +/datum/surgery/organ_extraction/can_start(mob/user, mob/living/carbon/target) + if(!ishuman(user)) + return 0 + if(target.get_species() == "Machine") //Maybe add in a machine version, later? + return 0 + var/mob/living/carbon/human/H = user + if(H.get_species() == "Abductor") + return 1 + if((locate(/obj/item/weapon/implant/abductor) in H)) + return 1 + return 0 + + +/datum/surgery_step/internal/extract_organ + name = "remove heart" + accept_hand = 1 + time = 32 + var/obj/item/organ/internal/IC = null + var/list/organ_types = list(/obj/item/organ/internal/heart) + +/datum/surgery_step/internal/extract_organ/begin_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + for(var/obj/item/I in target.internal_organs) + if(I.type in organ_types) + IC = I + break + user.visible_message("[user] starts to remove [target]'s organs.", "You start to remove [target]'s organs...") + ..() + +/datum/surgery_step/internal/extract_organ/end_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + var/mob/living/carbon/human/AB = target + if(AB.species.flags & NO_INTORGANS) + user.visible_message("[user] prepares [target]'s [target_zone] for further dissection!", "You prepare [target]'s [target_zone] for further dissection.") + return 1 + 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 + else + to_chat(user, "You don't find anything in [target]'s [target_zone]!") + return 0 + +/datum/surgery_step/internal/gland_insert + name = "insert gland" + allowed_tools = list(/obj/item/organ/internal/gland = 100) + time = 32 + +/datum/surgery_step/internal/gland_insert/begin_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] starts to insert [tool] into [target].", "You start to insert [tool] into [target]...") + ..() + +/datum/surgery_step/internal/gland_insert/end_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] inserts [tool] into [target].", "You insert [tool] into [target].") + user.drop_item() + var/obj/item/organ/internal/gland/gland = tool + gland.insert(target, 2) + return 1 \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm new file mode 100644 index 00000000000..037de3221f8 --- /dev/null +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -0,0 +1,280 @@ +/obj/item/organ/internal/gland + name = "fleshy mass" + desc = "A nausea-inducing hunk of twisting flesh and metal." + icon = 'icons/obj/abductor.dmi' + parent_organ = "chest" + slot = "gland" + icon_state = "gland" + status = ORGAN_ROBOT + origin_tech = "materials=4;biotech=5;abductor=3" + var/cooldown_low = 300 + var/cooldown_high = 300 + var/next_activation = 0 + var/uses // -1 For inifinite + var/human_only = 0 + var/active = 0 + tough = 1 //not easily broken by combat damage + sterile = 1 //not very germy + +/obj/item/organ/internal/gland/proc/ownerCheck() + if(ishuman(owner)) + return 1 + if(!human_only && iscarbon(owner)) + return 1 + return 0 + +/obj/item/organ/internal/gland/proc/Start() + active = 1 + next_activation = world.time + rand(cooldown_low,cooldown_high) + + +/obj/item/organ/internal/gland/remove(var/mob/living/carbon/M, special = 0) + active = 0 + if(initial(uses) == 1) + uses = initial(uses) + ..() + +/obj/item/organ/internal/gland/insert(var/mob/living/carbon/M, special = 0) + ..() + if(special != 2 && uses) // Special 2 means abductor surgery + Start() + +/obj/item/organ/internal/gland/on_life() + if(!active) + return + if(!ownerCheck()) + active = 0 + return + if(next_activation <= world.time) + activate() + uses-- + next_activation = world.time + rand(cooldown_low,cooldown_high) + if(!uses) + active = 0 + +/obj/item/organ/internal/gland/proc/activate() + return + +/obj/item/organ/internal/gland/heals + origin_tech = "materials=4;biotech=6;abductor=3" + cooldown_low = 200 + cooldown_high = 400 + uses = -1 + icon_state = "health" + +/obj/item/organ/internal/gland/heals/activate() + to_chat(owner, "You feel curiously revitalized.") + owner.adjustBruteLoss(-20) + owner.adjustOxyLoss(-20) + owner.adjustFireLoss(-20) + +/obj/item/organ/internal/gland/slime + origin_tech = "materials=4;biotech=6;abductor=3" + cooldown_low = 600 + cooldown_high = 1200 + uses = -1 + icon_state = "slime" + +/obj/item/organ/internal/gland/slime/activate() + to_chat(owner, "You feel nauseous!") + owner.vomit(20) + + var/mob/living/carbon/slime/Slime = new/mob/living/carbon/slime(get_turf(owner)) + Slime.Friends = list(owner) + Slime.Leader = owner + +/obj/item/organ/internal/gland/mindshock + origin_tech = "materials=4;biotech=5;magnets=3;abductor=3" + cooldown_low = 300 + cooldown_high = 300 + uses = -1 + icon_state = "mindshock" + +/obj/item/organ/internal/gland/mindshock/activate() + to_chat(owner, "You get a headache.") + + var/turf/T = get_turf(owner) + for(var/mob/living/carbon/H in orange(4,T)) + if(H == owner) + continue + to_chat(H, "You hear a buzz in your head.") + H.confused += 20 + +/obj/item/organ/internal/gland/pop + origin_tech = "materials=4;biotech=6;abductor=3" + cooldown_low = 900 + cooldown_high = 1800 + uses = 6 + human_only = 1 + icon_state = "species" + +/obj/item/organ/internal/gland/pop/activate() + to_chat(owner, "You feel unlike yourself.") + var/species = pick("Unathi","Skrell","Diona","Tajaran","Vulpkanin","Kidan","Grey","Diona") + owner.set_species(species) + +/obj/item/organ/internal/gland/ventcrawling + origin_tech = "materials=4;biotech=5;bluespace=3;abductor=3" + cooldown_low = 1800 + cooldown_high = 2400 + uses = 1 + icon_state = "vent" + +/obj/item/organ/internal/gland/ventcrawling/activate() + to_chat(owner, "You feel very stretchy.") + owner.ventcrawler = 2 + return + + +/obj/item/organ/internal/gland/viral + origin_tech = "materials=4;biotech=6;abductor=3" + cooldown_low = 1800 + cooldown_high = 2400 + uses = 1 + icon_state = "viral" + +/obj/item/organ/internal/gland/viral/activate() + to_chat(owner, "You feel sick.") + var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/magnitis) + var/datum/disease/D = new virus_type() + D.carrier = 1 + owner.viruses += D + D.affected_mob = owner + D.holder = owner + owner.med_hud_set_status() + + +/obj/item/organ/internal/gland/emp //TODO : Replace with something more interesting + origin_tech = "materials=4;biotech=5;magnets=3;abductor=3" + cooldown_low = 900 + cooldown_high = 1600 + uses = 10 + icon_state = "emp" + +/obj/item/organ/internal/gland/emp/activate() + to_chat(owner, "You feel a spike of pain in your head.") + empulse(get_turf(owner), 2, 5, 1) + +/obj/item/organ/internal/gland/spiderman + origin_tech = "materials=4;biotech=6;abductor=3" + cooldown_low = 450 + cooldown_high = 900 + uses = 10 + icon_state = "spider" + +/obj/item/organ/internal/gland/spiderman/activate() + to_chat(owner, "You feel something crawling in your skin.") + owner.faction |= "spiders" + new /obj/effect/spider/spiderling(owner.loc) + +/obj/item/organ/internal/gland/egg + origin_tech = "materials=4;biotech=6;abductor=3" + cooldown_low = 300 + cooldown_high = 400 + uses = -1 + icon_state = "egg" + +/obj/item/organ/internal/gland/egg/activate() + to_chat(owner, "You lay an egg!") + var/obj/item/weapon/reagent_containers/food/snacks/egg/egg = new(owner.loc) + egg.reagents.add_reagent("sacid",20) + egg.desc += " It smells bad." + +/obj/item/organ/internal/gland/bloody + origin_tech = "materials=4;biotech=6;abductor=3" + cooldown_low = 200 + cooldown_high = 400 + uses = -1 + +/obj/item/organ/internal/gland/bloody/activate() + owner.adjustBruteLoss(15) + + owner.visible_message("[owner]'s skin erupts with blood!",\ + "Blood pours from your skin!") + + for(var/turf/T in oview(3,owner)) //Make this respect walls and such + T.add_blood_floor(owner) + for(var/mob/living/carbon/human/H in oview(3,owner)) //Blood decals for simple animals would be neat. aka Carp with blood on it. + if(H.wear_suit) + H.wear_suit.add_blood(owner) + H.update_inv_wear_suit(0) + else if(H.w_uniform) + H.w_uniform.add_blood(owner) + H.update_inv_w_uniform(0) + +/obj/item/organ/internal/gland/bodysnatch + origin_tech = "materials=4;biotech=7;abductor=3" + cooldown_low = 600 + cooldown_high = 600 + human_only = 1 + uses = 1 + +/obj/item/organ/internal/gland/bodysnatch/activate() + to_chat(owner, "You feel something moving around inside you...") + //spawn cocoon with clone greytide snpc inside + if(ishuman(owner)) + var/obj/effect/cocoon/abductor/C = new (get_turf(owner)) + C.Copy(owner) + C.Start() + owner.gib() + return + +/obj/effect/cocoon/abductor + name = "slimy cocoon" + desc = "Something is moving inside." + icon = 'icons/effects/effects.dmi' + icon_state = "cocoon_large3" + color = rgb(10,120,10) + density = 1 + var/hatch_time = 0 + +/obj/effect/cocoon/abductor/proc/Copy(mob/living/carbon/human/H) + var/mob/living/carbon/human/interactive/greytide/clone = new(src) + var/datum/dna/owner_dna = H.dna + clone.rename_character(clone.name, owner_dna.real_name) + clone.body_accessory = H.body_accessory + clone.dna = owner_dna.Clone() + clone.set_species(H.species.name) + domutcheck(clone) + + //There's no define for this / get all items ? + var/list/slots = list(slot_back,slot_w_uniform,slot_wear_suit,\ + slot_wear_mask,slot_head,slot_shoes,slot_gloves,slot_l_ear,slot_r_ear,\ + slot_glasses,slot_belt,slot_s_store,slot_l_store,slot_r_store,slot_wear_id,slot_wear_pda) + + for(var/slot in slots) + var/obj/item/I = H.get_item_by_slot(slot) + if(I) + clone.equip_to_slot_if_possible(I,slot) + +/obj/effect/cocoon/abductor/proc/Start() + hatch_time = world.time + 600 + processing_objects.Add(src) + +/obj/effect/cocoon/abductor/process() + if(world.time > hatch_time) + processing_objects.Remove(src) + for(var/mob/M in contents) + src.visible_message("[src] hatches!") + M.forceMove(get_turf(src)) + qdel(src) + +/obj/item/organ/internal/gland/plasma + cooldown_low = 2400 + cooldown_high = 3000 + origin_tech = "materials=4;biotech=5;plasmatech=3;abductor=3" + uses = 1 + +/obj/item/organ/internal/gland/plasma/activate() + to_chat(owner, "You feel bloated.") + sleep(150) + if(!owner) return + to_chat(owner, "A massive stomachache overcomes you.") + sleep(50) + if(!owner) return + owner.visible_message("[owner] explodes in a cloud of plasma!") + var/turf/simulated/T = get_turf(owner) + if(istype(T)) + T.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C,300) + owner.gib() + return \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm new file mode 100644 index 00000000000..7d5028f4875 --- /dev/null +++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm @@ -0,0 +1,165 @@ +/obj/machinery/computer/camera_advanced/abductor + name = "Human Observation Console" + var/team = 0 + networks = list("SS13","Abductor") + off_action = new/datum/action/camera_off/abductor //specific datum + var/datum/action/teleport_in/tele_in_action = new + var/datum/action/teleport_out/tele_out_action = new + var/datum/action/teleport_self/tele_self_action = new + var/datum/action/vest_mode_swap/vest_mode_action = new + var/datum/action/vest_disguise_swap/vest_disguise_action = new + var/datum/action/set_droppoint/set_droppoint_action = new + var/obj/machinery/abductor/console/console + + icon = 'icons/obj/abductor.dmi' + icon_state = "camera" + +/obj/machinery/computer/camera_advanced/abductor/CreateEye() + ..() + eyeobj.visible_icon = 1 + eyeobj.icon = 'icons/obj/abductor.dmi' + eyeobj.icon_state = "camera_target" + +/obj/machinery/computer/camera_advanced/abductor/GrantActions(mob/living/carbon/user) + off_action.target = user + off_action.Grant(user) + + jump_action.target = user + jump_action.Grant(user) + //TODO : add null checks + tele_in_action.target = console.pad + tele_in_action.Grant(user) + + tele_out_action.target = console + tele_out_action.Grant(user) + + tele_self_action.target = console.pad + tele_self_action.Grant(user) + + vest_mode_action.target = console + vest_mode_action.Grant(user) + + vest_disguise_action.target = console + vest_disguise_action.Grant(user) + + set_droppoint_action.target = console + set_droppoint_action.Grant(user) + +/obj/machinery/computer/camera_advanced/abductor/proc/IsAbductor(mob/living/carbon/human/H) + return H.get_species() == "Abductor" + +/obj/machinery/computer/camera_advanced/abductor/proc/IsScientist(mob/living/carbon/human/H) + if(H.mind && H.mind.abductor) + return H.mind.abductor.scientist + +/obj/machinery/computer/camera_advanced/abductor/attack_hand(mob/user) + if(!iscarbon(user) || !IsAbductor(user)) + return + return ..() + +/datum/action/camera_off/abductor/Activate() + if(!target || !iscarbon(target)) + return + var/mob/living/carbon/C = target + var/mob/camera/aiEye/remote/remote_eye = C.remote_control + var/obj/machinery/computer/camera_advanced/abductor/origin = remote_eye.origin + C.remote_view = 0 + origin.current_user = null + origin.jump_action.Remove(C) + origin.tele_in_action.Remove(C) + origin.tele_out_action.Remove(C) + origin.tele_self_action.Remove(C) + origin.vest_mode_action.Remove(C) + origin.vest_disguise_action.Remove(C) + origin.set_droppoint_action.Remove(C) + remote_eye.user = null + if(C.client) + C.client.perspective = MOB_PERSPECTIVE + C.client.eye = src + C.client.images -= remote_eye.user_image + for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks) + C.client.images -= chunk.obscured + C.remote_control = null + C.unset_machine() + src.Remove(C) + + +/datum/action/teleport_in + name = "Send To" + button_icon_state = "beam_down" + action_type = AB_INNATE + +/datum/action/teleport_in/Activate() + if(!target || !iscarbon(owner)) + return + var/mob/living/carbon/human/C = owner + var/mob/camera/aiEye/remote/remote_eye = C.remote_control + var/obj/machinery/abductor/pad/P = target + + if(cameranet.checkTurfVis(remote_eye.loc)) + P.PadToLoc(remote_eye.loc) + +/datum/action/teleport_out + name = "Retrieve" + button_icon_state = "beam_up" + action_type = AB_INNATE + +/datum/action/teleport_out/Activate() + if(!target || !iscarbon(owner)) + return + var/obj/machinery/abductor/console/console = target + + console.TeleporterRetrieve() + +/datum/action/teleport_self + name = "Send Self" + button_icon_state = "beam_down" + action_type = AB_INNATE + +/datum/action/teleport_self/Activate() + if(!target || !iscarbon(owner)) + return + var/mob/living/carbon/human/C = owner + var/mob/camera/aiEye/remote/remote_eye = C.remote_control + var/obj/machinery/abductor/pad/P = target + + if(cameranet.checkTurfVis(remote_eye.loc)) + P.MobToLoc(remote_eye.loc,C) + +/datum/action/vest_mode_swap + name = "Switch Vest Mode" + button_icon_state = "vest_mode" + action_type = AB_INNATE + +/datum/action/vest_mode_swap/Activate() + if(!target || !iscarbon(owner)) + return + var/obj/machinery/abductor/console/console = target + console.FlipVest() + + +/datum/action/vest_disguise_swap + name = "Switch Vest Disguise" + button_icon_state = "vest_disguise" + action_type = AB_INNATE + +/datum/action/vest_disguise_swap/Activate() + if(!target || !iscarbon(owner)) + return + var/obj/machinery/abductor/console/console = target + console.SelectDisguise(remote=1) + +/datum/action/set_droppoint + name = "Set Experiment Release Point" + button_icon_state = "set_drop" + action_type = AB_INNATE + +/datum/action/set_droppoint/Activate() + if(!target || !iscarbon(owner)) + return + + var/mob/living/carbon/human/C = owner + var/mob/camera/aiEye/remote/remote_eye = C.remote_control + + var/obj/machinery/abductor/console/console = target + console.SetDroppoint(remote_eye.loc,owner) \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm new file mode 100644 index 00000000000..1f7bc6552cb --- /dev/null +++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm @@ -0,0 +1,223 @@ +//Common + +/obj/machinery/abductor + var/team = 0 + +/obj/machinery/abductor/New() + abductor_equipment.Add(src) + ..() + +/obj/machinery/abductor/Destroy() + abductor_equipment.Remove(src) + return ..() + +/obj/machinery/abductor/proc/IsAbductor(mob/living/carbon/human/H) + return H.get_species() == "Abductor" + +/obj/machinery/abductor/proc/IsAgent(mob/living/carbon/human/H) + if(H.get_species() == "Abductor") + if(H.mind && H.mind.abductor) + return H.mind.abductor.agent + return 0 + +/obj/machinery/abductor/proc/IsScientist(mob/living/carbon/human/H) + if(H.get_species() == "Abductor") + if(H.mind && H.mind.abductor) + return H.mind.abductor.scientist + return 0 + +//Console + +/obj/machinery/abductor/console + name = "Abductor console" + desc = "Ship command center." + icon = 'icons/obj/abductor.dmi' + icon_state = "console" + density = 1 + anchored = 1 + var/obj/item/device/abductor/gizmo/gizmo + var/obj/item/clothing/suit/armor/abductor/vest/vest + var/obj/machinery/abductor/experiment/experiment + var/obj/machinery/abductor/pad/pad + var/obj/machinery/computer/camera_advanced/abductor/camera + var/list/datum/icon_snapshot/disguises = list() + +/obj/machinery/abductor/console/initialize() + ..() + Link_Abduction_Equipment() + +/obj/machinery/abductor/console/attack_hand(mob/user) + if(..()) + return + if(!IsAbductor(user)) + to_chat(user, "You start mashing alien buttons at random!") + if(do_after(user,100, target = src)) + TeleporterSend() + return + user.set_machine(src) + var/dat = "" + dat += "

Abductsoft 3000

" + + if(experiment != null) + var/points = experiment.points + dat += "Collected Samples : [points]
" + dat += "Transfer data in exchange for supplies:
" + dat += "Advanced Baton
" + dat += "Agent Helmet
" + dat += "Radio Silencer
" + dat += "Science Tool
" + else + dat += "NO EXPERIMENT MACHINE DETECTED
" + + if(pad!=null) + dat += "Emergency Teleporter System." + dat += "Consider using primary observation console first." + dat += "Activate Teleporter
" + if(gizmo!=null && gizmo.marked!=null) + dat += "Retrieve Mark
" + else + dat += "Retrieve Mark
" + else + dat += "NO TELEPAD DETECTED
" + + if(vest!=null) + dat += "

Agent Vest Mode


" + var/mode = vest.mode + if(mode == VEST_STEALTH) + dat += "Combat" + dat += "Stealth" + else + dat += "Combat" + dat += "Stealth" + + dat+="
" + dat += "Select Agent Vest Disguise
" + else + dat += "NO AGENT VEST DETECTED" + var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + return + +/obj/machinery/abductor/console/Topic(href, href_list) + if(..()) + return + + usr.set_machine(src) + if(href_list["teleporter_send"]) + TeleporterSend() + else if(href_list["teleporter_retrieve"]) + TeleporterRetrieve() + else if(href_list["flip_vest"]) + FlipVest() + else if(href_list["select_disguise"]) + SelectDisguise() + else if(href_list["dispense"]) + switch(href_list["dispense"]) + if("baton") + Dispense(/obj/item/weapon/abductor_baton,cost=2) + if("helmet") + Dispense(/obj/item/clothing/head/helmet/abductor) + if("silencer") + Dispense(/obj/item/device/abductor/silencer) + if("tool") + Dispense(/obj/item/device/abductor/gizmo) + src.updateUsrDialog() + + +/obj/machinery/abductor/console/proc/TeleporterRetrieve() + if(gizmo!=null && pad!=null && gizmo.marked) + pad.Retrieve(gizmo.marked) + return + +/obj/machinery/abductor/console/proc/TeleporterSend() + if(pad!=null) + pad.Send() + return + +/obj/machinery/abductor/console/proc/FlipVest() + if(vest!=null) + vest.flip_mode() + return + +/obj/machinery/abductor/console/proc/SelectDisguise(remote=0) + var/list/entries = list() + var/tempname + var/datum/icon_snapshot/temp + for(var/i = 1; i <= disguises.len; i++) + temp = disguises[i] + tempname = temp.name + entries["[tempname]"] = disguises[i] + var/entry_name = input( "Choose Disguise", "Disguise") in entries + var/datum/icon_snapshot/chosen = entries[entry_name] + if(chosen && (remote || in_range(usr,src))) + vest.SetDisguise(chosen) + return + +/obj/machinery/abductor/console/proc/SetDroppoint(turf/location,user) + if(!istype(location)) + to_chat(user, "That place is not safe for the specimen.") + return + + if(pad) + pad.teleport_target = location + to_chat(user, "Location marked as test subject release point.") + + +/obj/machinery/abductor/console/proc/Link_Abduction_Equipment() // these must all be explicitly `in machines` or they will not properly link. + + for(var/obj/machinery/abductor/pad/p in machines) + if(p.team == team) + pad = p + break + + for(var/obj/machinery/abductor/experiment/e in machines) + if(e.team == team) + experiment = e + e.console = src + + for(var/obj/machinery/computer/camera_advanced/abductor/c in machines) + if(c.team == team) + camera = c + c.console = src + +/obj/machinery/abductor/console/proc/AddSnapshot(mob/living/carbon/human/target) + var/datum/icon_snapshot/entry = new + entry.name = target.name + entry.icon = target.icon + entry.icon_state = target.icon_state + entry.overlays = target.get_overlays_copy(list(L_HAND_LAYER,R_HAND_LAYER)) + for(var/i=1,i<=disguises.len,i++) + var/datum/icon_snapshot/temp = disguises[i] + if(temp.name == entry.name) + disguises[i] = entry + return + disguises.Add(entry) + return + +/obj/machinery/abductor/console/attackby(obj/O, mob/user, params) + if(istype(O, /obj/item/device/abductor/gizmo)) + var/obj/item/device/abductor/gizmo/G = O + to_chat(user, "You link the tool to the console.") + gizmo = G + G.console = src + else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest)) + var/obj/item/clothing/suit/armor/abductor/vest/V = O + to_chat(user, "You link the vest to the console.") + vest = V + else + ..() + +/obj/machinery/abductor/console/proc/Dispense(item,cost=1) + if(experiment && experiment.points >= cost) + experiment.points-=cost + atom_say("Incoming supply!") + if(pad) + flick("alien-pad", pad) + new item(pad.loc) + else + new item(src.loc) + else + atom_say("Insufficent data!") + return \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm new file mode 100644 index 00000000000..065d2a189fb --- /dev/null +++ b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm @@ -0,0 +1,83 @@ +/obj/machinery/abductor/gland_dispenser + name = "Replacement Organ Storage" + desc = "A tank filled with replacement organs" + icon = 'icons/obj/abductor.dmi' + icon_state = "dispenser" + density = 1 + anchored = 1 + var/list/gland_types + var/list/gland_colors + var/list/amounts + +/obj/machinery/abductor/gland_dispenser/proc/random_color() + //TODO : replace with presets or spectrum + return rgb(rand(0,255),rand(0,255),rand(0,255)) + +/obj/machinery/abductor/gland_dispenser/New() + gland_types = subtypesof(/obj/item/organ/internal/gland) + gland_types = shuffle(gland_types) + gland_colors = new/list(gland_types.len) + amounts = new/list(gland_types.len) + for(var/i=1,i<=gland_types.len,i++) + gland_colors[i] = random_color() + amounts[i] = rand(1,5) + +/obj/machinery/abductor/gland_dispenser/attack_hand(mob/user) + if(..()) + return + if(!IsAbductor(user)) + return + user.set_machine(src) + var/box_css = {" + "} + var/dat = "" + var/item_count = 0 + for(var/i=1,i<=gland_colors.len,i++) + item_count++ + var/g_color = gland_colors[i] + var/amount = amounts[i] + dat += "[amount]" + if(item_count == 3) // Three boxes per line + dat +="

" + item_count = 0 + var/datum/browser/popup = new(user, "glands", "Gland Dispenser", 200, 200) + popup.add_head_content(box_css) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + return + +/obj/machinery/abductor/gland_dispenser/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/organ/internal/gland)) + if(!user.drop_item()) + return + W.forceMove(src) + for(var/i=1,i<=gland_colors.len,i++) + if(gland_types[i] == W.type) + amounts[i]++ + +/obj/machinery/abductor/gland_dispenser/Topic(href, href_list) + if(..()) + return + usr.set_machine(src) + + if(href_list["dispense"]) + Dispense(text2num(href_list["dispense"])) + src.updateUsrDialog() + +/obj/machinery/abductor/gland_dispenser/proc/Dispense(count) + if(amounts[count]>0) + amounts[count]-- + var/T = gland_types[count] + new T(get_turf(src)) \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm new file mode 100644 index 00000000000..44b37ed22e5 --- /dev/null +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -0,0 +1,195 @@ +/obj/machinery/abductor/experiment + name = "experimentation machine" + desc = "A large man-sized tube sporting a complex array of surgical apparatus." + icon = 'icons/obj/abductor.dmi' + icon_state = "experiment-open" + anchored = 1 + density = 1 + var/points = 0 + var/list/history = list() + var/list/abductee_minds = list() + var/flash = " - || - " + var/obj/machinery/abductor/console/console + var/mob/living/carbon/human/occupant + +/obj/machinery/abductor/experiment/Destroy() + eject_abductee() + return ..() + +/obj/machinery/abductor/experiment/MouseDrop_T(mob/living/carbon/human/target, mob/user) + if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target)) + return + if(IsAbductor(target)) + return + if(occupant) + to_chat(user, "\The [src] is already occupied.") + return //occupied + if(target.buckled) + return + for(var/mob/living/carbon/slime/M in range(1, target)) + if(M.Victim == target) + to_chat(user, "[target] has a slime attached to them, deal with that first.") + return + visible_message("[user] puts [target] into the [src].") + + target.forceMove(src) + occupant = target + icon_state = "experiment" + add_fingerprint(user) + +/obj/machinery/abductor/experiment/attack_hand(mob/user) + if(..()) + return + + experimentUI(user) + +/obj/machinery/abductor/experiment/proc/experimentUI(mob/user) + var/dat + dat += "

Experiment

" + if(occupant) + dat += "
" + dat += "" + dat += "Probe
" + dat += "Dissect
" + dat += "Analyze
" + dat += "
" + else + dat += "Experiment " + + if(!occupant) + dat += "

Machine Unoccupied

" + else + dat += "

Subject Status :

" + dat += "[occupant.name] => " + switch(occupant.stat) + if(0) + dat += "Conscious" + if(1) + dat += "Unconscious" + else + dat += "Deceased" + dat += "
" + dat += "[flash]" + dat += "
" + dat += "Scan" + dat += "Eject Occupant" : "unoccupied=1'>Unoccupied"]" + var/datum/browser/popup = new(user, "experiment", "Probing Console", 300, 300) + popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) + popup.set_content(dat) + popup.open() + +/obj/machinery/abductor/experiment/Topic(href, href_list) + if(..() || usr == occupant) + return + usr.set_machine(src) + if(href_list["refresh"]) + updateUsrDialog() + return + if(href_list["eject"]) + eject_abductee() + return + if(occupant && occupant.stat != DEAD) + if(href_list["experiment"]) + flash = Experiment(occupant,href_list["experiment"]) + updateUsrDialog() + add_fingerprint(usr) + +/obj/machinery/abductor/experiment/proc/Experiment(mob/occupant,type) + var/mob/living/carbon/human/H = occupant + var/point_reward = 0 + if(H in history) + return "Specimen already in database." + if(H.stat == DEAD) + atom_say("Specimen deceased - please provide fresh sample.") + return "Specimen deceased." + var/obj/item/organ/internal/gland/GlandTest = locate() in H.internal_organs + if(!GlandTest) + atom_say("Experimental dissection not detected!") + return "No glands detected!" + if(H.mind != null && H.ckey != null) + history += H + abductee_minds += H.mind + atom_say("Processing specimen...") + sleep(5) + switch(text2num(type)) + if(1) + to_chat(H, "You feel violated.") + if(2) + to_chat(H, "You feel yourself being sliced apart and put back together.") + if(3) + to_chat(H, "You feel intensely watched.") + sleep(5) + to_chat(H, "Your mind snaps!") + var/objtype = pick(subtypesof(/datum/objective/abductee/)) + var/datum/objective/abductee/O = new objtype() + ticker.mode.abductees += H.mind + H.mind.objectives += O + var/obj_count = 1 + to_chat(H, "Your current objectives:") + for(var/datum/objective/objective in H.mind.objectives) + to_chat(H, "Objective #[obj_count]: [objective.explanation_text]") + obj_count++ + ticker.mode.update_abductor_icons_added(H.mind) + + for(var/obj/item/organ/internal/gland/G in H.internal_organs) + G.Start() + point_reward++ + if(point_reward > 0) + eject_abductee() + SendBack(H) + playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + points += point_reward + return "Experiment successful! [point_reward] new data-points collected." + else + playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 1) + return "Experiment failed! No replacement organ detected." + else + atom_say("Brain activity nonexistant - disposing sample...") + eject_abductee() + SendBack(H) + return "Specimen braindead - disposed." + return "ERROR" + + +/obj/machinery/abductor/experiment/proc/SendBack(mob/living/carbon/human/H) + H.Sleeping(8) + if(console && console.pad && console.pad.teleport_target) + H.forceMove(console.pad.teleport_target) + H.uncuff() + return + //Area not chosen / It's not safe area - teleport to arrivals + H.forceMove(pick(latejoin)) + H.uncuff() + return + +/obj/machinery/abductor/experiment/attackby(obj/item/weapon/G, mob/user) + if(istype(G, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/grabbed = G + if(!ishuman(grabbed.affecting)) + return + if(IsAbductor(grabbed.affecting)) + return + if(occupant) + to_chat(user, "The [src] is already occupied!") + return + for(var/mob/living/carbon/slime/S in range(1, grabbed.affecting)) + if(S.Victim == grabbed.affecting) + to_chat(user, "[grabbed.affecting] has a slime attached to them, deal with that first.") + return + visible_message("[user] puts [grabbed.affecting] into the [src].") + var/mob/living/carbon/human/H = grabbed.affecting + H.forceMove(src) + occupant = H + icon_state = "experiment" + add_fingerprint(user) + qdel(G) + +/obj/machinery/abductor/experiment/proc/eject_abductee() + if(!occupant) + return + if(occupant.client) + occupant.client.eye = occupant.client.mob + occupant.client.perspective = MOB_PERSPECTIVE + occupant.forceMove(get_turf(src)) + occupant = null + icon_state = "experiment-open" \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/abduction/machinery/pad.dm b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm new file mode 100644 index 00000000000..285b097d06a --- /dev/null +++ b/code/game/gamemodes/miniantags/abduction/machinery/pad.dm @@ -0,0 +1,54 @@ +/obj/machinery/abductor/pad + name = "Alien Telepad" + desc = "Use this to transport to and from human habitat" + icon = 'icons/obj/abductor.dmi' + icon_state = "alien-pad-idle" + anchored = 1 + var/turf/teleport_target + +/obj/machinery/abductor/pad/proc/Warp(mob/living/target) + target.Move(src.loc) + +/obj/machinery/abductor/pad/proc/Send() + if(teleport_target == null) + teleport_target = teleportlocs[pick(teleportlocs)] + flick("alien-pad", src) + for(var/mob/living/target in loc) + target.forceMove(teleport_target) + spawn(0) + anim(target.loc,target,'icons/mob/mob.dmi',,"uncloak",,target.dir) + +/obj/machinery/abductor/pad/proc/Retrieve(mob/living/target) + flick("alien-pad", src) + spawn(0) + anim(target.loc,target,'icons/mob/mob.dmi',,"uncloak",,target.dir) + Warp(target) + +/obj/machinery/abductor/pad/proc/MobToLoc(place,mob/living/target) + new/obj/effect/overlay/temp/teleport_abductor(place) + sleep(80) + flick("alien-pad", src) + target.forceMove(place) + anim(target.loc,target,'icons/mob/mob.dmi',,"uncloak",,target.dir) + +/obj/machinery/abductor/pad/proc/PadToLoc(place) + new/obj/effect/overlay/temp/teleport_abductor(place) + sleep(80) + flick("alien-pad", src) + for(var/mob/living/target in src.loc) + target.forceMove(place) + spawn(0) + anim(target.loc,target,'icons/mob/mob.dmi',,"uncloak",,target.dir) + + +/obj/effect/overlay/temp/teleport_abductor + name = "Huh" + icon = 'icons/obj/abductor.dmi' + icon_state = "teleport" + duration = 80 + +/obj/effect/overlay/temp/teleport_abductor/New() + var/datum/effect/system/spark_spread/S = new + S.set_up(10,0,loc) + S.start() + ..() \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index 11111cdfc69..472dea17cce 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -36,6 +36,27 @@ /mob/living/captive_brain/emote(var/message) return +/mob/living/captive_brain/resist_borer() + var/mob/living/simple_animal/borer/B = loc + + to_chat(src, "You begin doggedly resisting the parasite's control (this will take approximately sixty seconds).") + to_chat(B.host, "You feel the captive mind of [src] begin to resist your control.") + + spawn(rand(350,450) + B.host.brainloss) + + if(!B || !B.controlling) + return + + B.host.adjustBrainLoss(rand(5,10)) + to_chat(src, "With an immense exertion of will, you regain control of your body!") + to_chat(B.host, "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you.") + + B.detatch() + + verbs -= /mob/living/carbon/proc/release_control + verbs -= /mob/living/carbon/proc/punish_host + verbs -= /mob/living/carbon/proc/spawn_larvae + /mob/living/simple_animal/borer name = "cortical borer" real_name = "cortical borer" diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 514ceb4b14e..773e81349a1 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -6,7 +6,7 @@ icon_state = "swarmer_unactivated" /obj/item/unactivated_swarmer/New() - notify_ghosts("An unactivated swarmer has been created in [get_area(src)]! (Click to enter)") + notify_ghosts("An unactivated swarmer has been created in [get_area(src)]!", enter_link = "(Click to enter)", source = src, attack_not_jump = 1) ..() /obj/item/unactivated_swarmer/Topic(href, href_list) diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index b987f2eb6f6..cf99940da0f 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -29,6 +29,8 @@ var/summoned = FALSE var/cooldown = 0 var/damage_transfer = 1 //how much damage from each attack we transfer to the owner + var/light_on = 0 + var/luminosity_on = 3 var/mob/living/summoner var/range = 10 //how far from the user the spirit can be var/playstyle_string = "You are a standard Guardian. You shouldn't exist!" @@ -202,13 +204,13 @@ /mob/living/simple_animal/hostile/guardian/proc/ToggleLight() - if(!luminosity) - set_light(3) + if(!light_on) + set_light(luminosity_on) to_chat(src, "You activate your light.") else set_light(0) to_chat(src, "You deactivate your light.") - + light_on = !light_on //////////////////////////TYPES OF GUARDIANS diff --git a/code/game/gamemodes/vampire/hud.dm b/code/game/gamemodes/vampire/hud.dm index 727ae3bdc25..d02218ca542 100644 --- a/code/game/gamemodes/vampire/hud.dm +++ b/code/game/gamemodes/vampire/hud.dm @@ -6,4 +6,12 @@ vampire_blood_display.screen_loc = "WEST:6,CENTER-1:15" vampire_blood_display.layer = 20 - mymob.client.screen += list(vampire_blood_display) \ No newline at end of file + mymob.client.screen += list(vampire_blood_display) + +/datum/hud/proc/remove_vampire_hud() + if(!vampire_blood_display) + return + + mymob.client.screen -= list(vampire_blood_display) + qdel(vampire_blood_display) + vampire_blood_display = null \ No newline at end of file diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 1abed5ba4dd..44f31b083ba 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -239,12 +239,11 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha if(!get_ability(path)) force_add_ability(path) -/datum/vampire/proc/remove_ability(path) - var/A = get_ability(path) - if(A) - powers -= A - owner.mind.spell_list.Remove(A) - qdel(A) +/datum/vampire/proc/remove_ability(ability) + if(ability && (ability in powers)) + powers -= ability + owner.mind.spell_list.Remove(ability) + qdel(ability) /mob/proc/make_vampire() if(!mind) @@ -263,6 +262,10 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha /datum/vampire/proc/remove_vampire_powers() for(var/P in powers) remove_ability(P) + if(owner.hud_used) + var/datum/hud/hud = owner.hud_used + if(hud.vampire_blood_display) + hud.remove_vampire_hud() owner.alpha = 255 /datum/vampire/proc/handle_bloodsucking(mob/living/carbon/human/H) diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index fbc52904117..6e3c0e01a59 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -13,6 +13,7 @@ var/obj/machinery/computer/operating/computer = null buckle_lying = 90 + var/no_icon_updates = 0 //set this to 1 if you don't want the icons ever changing /obj/machinery/optable/New() ..() @@ -79,10 +80,12 @@ var/mob/living/carbon/human/M = locate(/mob/living/carbon/human, src.loc) if(M.lying) src.victim = M - icon_state = M.pulse ? "table2-active" : "table2-idle" + if(!no_icon_updates) + icon_state = M.pulse ? "table2-active" : "table2-idle" return 1 src.victim = null - icon_state = "table2-idle" + if(!no_icon_updates) + icon_state = "table2-idle" return 0 /obj/machinery/optable/process() @@ -106,9 +109,11 @@ if(ishuman(C)) var/mob/living/carbon/human/H = C src.victim = H - icon_state = H.pulse ? "table2-active" : "table2-idle" + if(!no_icon_updates) + icon_state = H.pulse ? "table2-active" : "table2-idle" else - icon_state = "table2-idle" + if(!no_icon_updates) + icon_state = "table2-idle" /obj/machinery/optable/verb/climb_on() set name = "Climb On Table" diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 44fe97e0915..16242f5a58e 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -20,12 +20,22 @@ jump_action.Grant(user) /obj/machinery/computer/camera_advanced/check_eye(mob/user) - if (get_dist(user, src) > 1 || user.eye_blind) - if(user == current_user) - off_action.Activate() + if((stat & (NOPOWER|BROKEN)) || !Adjacent(user) || user.eye_blind || user.incapacitated()) + user.unset_machine() return 0 return 1 +/obj/machinery/computer/camera_advanced/Destroy() + if(current_user) + current_user.unset_machine() + if(eyeobj) + qdel(eyeobj) + return ..() + +/obj/machinery/computer/camera_advanced/on_unset_machine(mob/M) + if(M == current_user) + off_action.Activate() + /obj/machinery/computer/camera_advanced/attack_hand(mob/user) if(..()) return @@ -34,6 +44,7 @@ var/mob/living/carbon/L = user if(!current_user) + user.set_machine(src) if(!eyeobj) CreateEye() GrantActions(user) diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 89790a8d47a..1b3f13955d0 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -12,18 +12,6 @@ density = 0 opacity = 0 -/obj/machinery/door/poddoor/four_tile_ver/ - name = "Large Pod Door" - icon = 'icons/obj/doors/1x4blast_vert.dmi' - -/obj/machinery/door/poddoor/three_tile_ver/ - name = "Large Pod Door" - icon = 'icons/obj/doors/1x3blast_vert.dmi' - -/obj/machinery/door/poddoor/two_tile_ver/ - name = "Large Pod Door" - icon = 'icons/obj/doors/1x2blast_vert.dmi' - /obj/machinery/door/poddoor/Bumped(atom/AM) if(!density) return ..() @@ -110,478 +98,35 @@ src.operating = 0 return -/ -/obj/machinery/door/poddoor/two_tile_hor/open() - if (src.operating == 1) //doors can still open when emag-disabled - return - if (!ticker) - return 0 - if(!src.operating) //in case of emag - src.operating = 1 - flick("pdoorc0", src) - src.icon_state = "pdoor0" - sleep(10) - src.density = 0 - src.set_opacity(0) +/obj/machinery/door/poddoor/multi_tile // Whoever wrote the old code for multi-tile spesspod doors needs to burn in hell. + name = "Large Pod Door" - f1.density = 0 - f1.set_opacity(0) - f2.density = 0 - f2.set_opacity(0) - - air_update_turf(1) - update_freelook_sight() - - if(operating == 1) //emag again - src.operating = 0 - if(autoclose) - spawn(150) - autoclose() - return 1 - -/obj/machinery/door/poddoor/two_tile_hor/close() - if (src.operating) - return - src.operating = 1 - flick("pdoorc1", src) - src.icon_state = "pdoor1" - src.density = 1 - - f1.density = 1 - f1.set_opacity(1) - f2.density = 1 - f2.set_opacity(1) - - if (src.visible) - src.set_opacity(1) - air_update_turf(1) - update_freelook_sight() - - sleep(10) - src.operating = 0 - return - -/obj/machinery/door/poddoor/three_tile_hor/open() - if (src.operating == 1) //doors can still open when emag-disabled - return - if (!ticker) - return 0 - if(!src.operating) //in case of emag - src.operating = 1 - flick("pdoorc0", src) - src.icon_state = "pdoor0" - sleep(10) - src.density = 0 - src.set_opacity(0) - - f1.density = 0 - f1.set_opacity(0) - f2.density = 0 - f2.set_opacity(0) - f3.density = 0 - f3.set_opacity(0) - - air_update_turf(1) - update_freelook_sight() - - if(operating == 1) //emag again - src.operating = 0 - if(autoclose) - spawn(150) - autoclose() - return 1 - -/obj/machinery/door/poddoor/three_tile_hor/close() - if (src.operating) - return - src.operating = 1 - flick("pdoorc1", src) - src.icon_state = "pdoor1" - src.density = 1 - - f1.density = 1 - f1.set_opacity(1) - f2.density = 1 - f2.set_opacity(1) - f3.density = 1 - f3.set_opacity(1) - - if (src.visible) - src.set_opacity(1) - air_update_turf(1) - update_freelook_sight() - - sleep(10) - src.operating = 0 - return - -/obj/machinery/door/poddoor/four_tile_hor/open() - if (src.operating == 1) //doors can still open when emag-disabled - return - if (!ticker) - return 0 - if(!src.operating) //in case of emag - src.operating = 1 - flick("pdoorc0", src) - src.icon_state = "pdoor0" - sleep(10) - src.density = 0 - src.set_opacity(0) - - f1.density = 0 - f1.set_opacity(0) - f2.density = 0 - f2.set_opacity(0) - f3.density = 0 - f3.set_opacity(0) - f4.density = 0 - f4.set_opacity(0) - - air_update_turf(1) - update_freelook_sight() - - if(operating == 1) //emag again - src.operating = 0 - if(autoclose) - spawn(150) - autoclose() - return 1 - -/obj/machinery/door/poddoor/four_tile_hor/close() - if (src.operating) - return - src.operating = 1 - flick("pdoorc1", src) - src.icon_state = "pdoor1" - src.density = 1 - - f1.density = 1 - f1.set_opacity(1) - f2.density = 1 - f2.set_opacity(1) - f3.density = 1 - f3.set_opacity(1) - f4.density = 1 - f4.set_opacity(1) - - if (src.visible) - src.set_opacity(1) - air_update_turf(1) - update_freelook_sight() - - sleep(10) - src.operating = 0 - return - - - -/obj/machinery/door/poddoor/two_tile_ver/open() - if (src.operating == 1) //doors can still open when emag-disabled - return - if (!ticker) - return 0 - if(!src.operating) //in case of emag - src.operating = 1 - flick("pdoorc0", src) - src.icon_state = "pdoor0" - sleep(10) - src.density = 0 - src.set_opacity(0) - - f1.density = 0 - f1.set_opacity(0) - f2.density = 0 - f2.set_opacity(0) - - air_update_turf(1) - update_freelook_sight() - - if(operating == 1) //emag again - src.operating = 0 - if(autoclose) - spawn(150) - autoclose() - return 1 - -/obj/machinery/door/poddoor/two_tile_ver/close() - if (src.operating) - return - src.operating = 1 - flick("pdoorc1", src) - src.icon_state = "pdoor1" - src.density = 1 - - f1.density = 1 - f1.set_opacity(1) - f2.density = 1 - f2.set_opacity(1) - - if (src.visible) - src.set_opacity(1) - air_update_turf(1) - update_freelook_sight() - - sleep(10) - src.operating = 0 - return - -/obj/machinery/door/poddoor/three_tile_ver/open() - if (src.operating == 1) //doors can still open when emag-disabled - return - if (!ticker) - return 0 - if(!src.operating) //in case of emag - src.operating = 1 - flick("pdoorc0", src) - src.icon_state = "pdoor0" - sleep(10) - src.density = 0 - src.set_opacity(0) - - f1.density = 0 - f1.set_opacity(0) - f2.density = 0 - f2.set_opacity(0) - f3.density = 0 - f3.set_opacity(0) - - air_update_turf(1) - update_freelook_sight() - - if(operating == 1) //emag again - src.operating = 0 - if(autoclose) - spawn(150) - autoclose() - return 1 - -/obj/machinery/door/poddoor/three_tile_ver/close() - if (src.operating) - return - src.operating = 1 - flick("pdoorc1", src) - src.icon_state = "pdoor1" - src.density = 1 - - f1.density = 1 - f1.set_opacity(1) - f2.density = 1 - f2.set_opacity(1) - f3.density = 1 - f3.set_opacity(1) - - if (src.visible) - src.set_opacity(1) - air_update_turf(1) - update_freelook_sight() - - sleep(10) - src.operating = 0 - return - -/obj/machinery/door/poddoor/four_tile_ver/open() - if (src.operating == 1) //doors can still open when emag-disabled - return - if (!ticker) - return 0 - if(!src.operating) //in case of emag - src.operating = 1 - flick("pdoorc0", src) - src.icon_state = "pdoor0" - sleep(10) - src.density = 0 - src.set_opacity(0) - - f1.density = 0 - f1.set_opacity(0) - f2.density = 0 - f2.set_opacity(0) - f3.density = 0 - f3.set_opacity(0) - f4.density = 0 - f4.set_opacity(0) - - air_update_turf(1) - update_freelook_sight() - - if(operating == 1) //emag again - src.operating = 0 - if(autoclose) - spawn(150) - autoclose() - return 1 - -/obj/machinery/door/poddoor/four_tile_ver/close() - if (src.operating) - return - src.operating = 1 - flick("pdoorc1", src) - src.icon_state = "pdoor1" - src.density = 1 - - f1.density = 1 - f1.set_opacity(1) - f2.density = 1 - f2.set_opacity(1) - f3.density = 1 - f3.set_opacity(1) - f4.density = 1 - f4.set_opacity(1) - - if (src.visible) - src.set_opacity(1) - air_update_turf(1) - update_freelook_sight() - - sleep(10) - src.operating = 0 - return - - -/obj/machinery/door/poddoor/two_tile_hor - var/obj/machinery/door/poddoor/filler_object/f1 - var/obj/machinery/door/poddoor/filler_object/f2 - icon = 'icons/obj/doors/1x2blast_hor.dmi' - - New() - ..() - f1 = new/obj/machinery/door/poddoor/filler_object (src.loc) - f2 = new/obj/machinery/door/poddoor/filler_object (get_step(f1,EAST)) - f1.density = density - f2.density = density - f1.set_opacity(opacity) - f2.set_opacity(opacity) - - Destroy() - qdel(f1) - qdel(f2) - return ..() - -/obj/machinery/door/poddoor/two_tile_ver - var/obj/machinery/door/poddoor/filler_object/f1 - var/obj/machinery/door/poddoor/filler_object/f2 - icon = 'icons/obj/doors/1x2blast_vert.dmi' - - New() - ..() - f1 = new/obj/machinery/door/poddoor/filler_object (src.loc) - f2 = new/obj/machinery/door/poddoor/filler_object (get_step(f1,NORTH)) - f1.density = density - f2.density = density - f1.set_opacity(opacity) - f2.set_opacity(opacity) - - Destroy() - qdel(f1) - qdel(f2) - return ..() - -/obj/machinery/door/poddoor/three_tile_hor - var/obj/machinery/door/poddoor/filler_object/f1 - var/obj/machinery/door/poddoor/filler_object/f2 - var/obj/machinery/door/poddoor/filler_object/f3 - icon = 'icons/obj/doors/1x3blast_hor.dmi' - - New() - ..() - f1 = new/obj/machinery/door/poddoor/filler_object (src.loc) - f2 = new/obj/machinery/door/poddoor/filler_object (get_step(f1,EAST)) - f3 = new/obj/machinery/door/poddoor/filler_object (get_step(f2,EAST)) - f1.density = density - f2.density = density - f3.density = density - f1.set_opacity(opacity) - f2.set_opacity(opacity) - f3.set_opacity(opacity) - - Destroy() - qdel(f1) - qdel(f2) - qdel(f3) - return ..() - -/obj/machinery/door/poddoor/three_tile_ver - var/obj/machinery/door/poddoor/filler_object/f1 - var/obj/machinery/door/poddoor/filler_object/f2 - var/obj/machinery/door/poddoor/filler_object/f3 - icon = 'icons/obj/doors/1x3blast_vert.dmi' - - New() - ..() - f1 = new/obj/machinery/door/poddoor/filler_object (src.loc) - f2 = new/obj/machinery/door/poddoor/filler_object (get_step(f1,NORTH)) - f3 = new/obj/machinery/door/poddoor/filler_object (get_step(f2,NORTH)) - f1.density = density - f2.density = density - f3.density = density - f1.set_opacity(opacity) - f2.set_opacity(opacity) - f3.set_opacity(opacity) - - Destroy() - qdel(f1) - qdel(f2) - qdel(f3) - return ..() - -/obj/machinery/door/poddoor/four_tile_hor - var/obj/machinery/door/poddoor/filler_object/f1 - var/obj/machinery/door/poddoor/filler_object/f2 - var/obj/machinery/door/poddoor/filler_object/f3 - var/obj/machinery/door/poddoor/filler_object/f4 - icon = 'icons/obj/doors/1x4blast_hor.dmi' - - New() - ..() - f1 = new/obj/machinery/door/poddoor/filler_object (src.loc) - f2 = new/obj/machinery/door/poddoor/filler_object (get_step(f1,EAST)) - f3 = new/obj/machinery/door/poddoor/filler_object (get_step(f2,EAST)) - f4 = new/obj/machinery/door/poddoor/filler_object (get_step(f3,EAST)) - f1.density = density - f2.density = density - f3.density = density - f4.density = density - f1.set_opacity(opacity) - f2.set_opacity(opacity) - f3.set_opacity(opacity) - f4.set_opacity(opacity) - - Destroy() - qdel(f1) - qdel(f2) - qdel(f3) - qdel(f4) - return ..() - -/obj/machinery/door/poddoor/four_tile_ver - var/obj/machinery/door/poddoor/filler_object/f1 - var/obj/machinery/door/poddoor/filler_object/f2 - var/obj/machinery/door/poddoor/filler_object/f3 - var/obj/machinery/door/poddoor/filler_object/f4 +/obj/machinery/door/poddoor/multi_tile/four_tile_ver/ icon = 'icons/obj/doors/1x4blast_vert.dmi' + width = 4 + dir = NORTH - New() - ..() - f1 = new/obj/machinery/door/poddoor/filler_object (src.loc) - f2 = new/obj/machinery/door/poddoor/filler_object (get_step(f1,NORTH)) - f3 = new/obj/machinery/door/poddoor/filler_object (get_step(f2,NORTH)) - f4 = new/obj/machinery/door/poddoor/filler_object (get_step(f3,NORTH)) - f1.density = density - f2.density = density - f3.density = density - f4.density = density - f1.set_opacity(opacity) - f2.set_opacity(opacity) - f3.set_opacity(opacity) - f4.set_opacity(opacity) +/obj/machinery/door/poddoor/multi_tile/three_tile_ver/ + icon = 'icons/obj/doors/1x3blast_vert.dmi' + width = 3 + dir = NORTH - Destroy() - qdel(f1) - qdel(f2) - qdel(f3) - qdel(f4) - return ..() +/obj/machinery/door/poddoor/multi_tile/two_tile_ver/ + icon = 'icons/obj/doors/1x2blast_vert.dmi' + width = 2 + dir = NORTH -/obj/machinery/door/poddoor/filler_object - name = "" - icon_state = "" \ No newline at end of file +/obj/machinery/door/poddoor/multi_tile/four_tile_hor/ + icon = 'icons/obj/doors/1x4blast_hor.dmi' + width = 4 + dir = EAST + +/obj/machinery/door/poddoor/multi_tile/three_tile_hor/ + icon = 'icons/obj/doors/1x3blast_hor.dmi' + width = 3 + dir = EAST + +/obj/machinery/door/poddoor/multi_tile/two_tile_hor/ + icon = 'icons/obj/doors/1x2blast_hor.dmi' + width = 2 + dir = EAST \ No newline at end of file diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 81799f01115..821d65d183d 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -716,6 +716,7 @@ /obj/item/weapon/reagent_containers/food/drinks/cans/cola = 8, /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater = 15, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 30, + /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass = 30, /obj/item/weapon/reagent_containers/food/drinks/ice = 9) contraband = list(/obj/item/weapon/reagent_containers/food/drinks/tea = 10) vend_delay = 15 diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 7616df4c119..273a4fe4fe6 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -12,7 +12,7 @@ . = ..() if(can_buckle && buckled_mob) return user_unbuckle_mob(user) - + /atom/movable/attack_robot(mob/living/user) . = ..() if(can_buckle && buckled_mob && Adjacent(user)) // attack_robot is called on all ranges, so the Adjacent check is needed @@ -46,6 +46,7 @@ buckled_mob = M M.update_canmove() post_buckle_mob(M) + M.throw_alert("buckled", /obj/screen/alert/restrained/buckled, new_master = src) return 1 /atom/movable/proc/unbuckle_mob() @@ -54,6 +55,7 @@ buckled_mob.buckled = null buckled_mob.anchored = initial(buckled_mob.anchored) buckled_mob.update_canmove() + buckled_mob.clear_alert("buckled") buckled_mob = null post_buckle_mob(.) diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 2b044b588e1..090a7437a5b 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -16,7 +16,8 @@ aSignal = new(src) aSignal.code = rand(1,100) - aSignal.frequency = sanitize_frequency(rand(PUBLIC_LOW_FREQ, PUBLIC_HIGH_FREQ)) + var/new_frequency = sanitize_frequency(rand(PUBLIC_LOW_FREQ, PUBLIC_HIGH_FREQ)) + aSignal.set_frequency(new_frequency) /obj/effect/anomaly/proc/anomalyEffect() if(prob(50)) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 8c4bf753108..417ad82d46b 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -53,6 +53,7 @@ var/strip_delay = DEFAULT_ITEM_STRIP_DELAY var/put_on_delay = DEFAULT_ITEM_PUTON_DELAY + var/breakouttime = 0 /* Species-specific sprites, concept stolen from Paradise//vg/. ex: diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 57e1e035aa8..0710464ecbc 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -20,10 +20,15 @@ /obj/item/device/radio/headset/New() ..() internal_channels.Cut() + +/obj/item/device/radio/headset/initialize() + ..() + if(ks1type) keyslot1 = new ks1type(src) if(ks2type) keyslot2 = new ks2type(src) + recalculateChannels(1) /obj/item/device/radio/headset/Destroy() @@ -383,8 +388,6 @@ for (var/ch_name in channels) - if(!radio_controller) - sleep(30) // Waiting for the radio_controller to be created. if(!radio_controller) src.name = "broken radio headset" return diff --git a/code/game/objects/items/random_items.dm b/code/game/objects/items/random_items.dm index 9fda63a980c..f46e2361192 100644 --- a/code/game/objects/items/random_items.dm +++ b/code/game/objects/items/random_items.dm @@ -152,7 +152,6 @@ New() ..() - sleep(2) new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src) new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src) new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src) @@ -169,7 +168,6 @@ new/obj/item/weapon/storage/pill_bottle/random_meds(src) while(prob(25)) new/obj/item/weapon/storage/pill_bottle/random_meds(src) - return /obj/structure/closet/crate/secure/chemicals name = "chemical supply kit" @@ -178,7 +176,6 @@ New() ..() - sleep(2) for(var/chem in standard_chemicals) var/obj/item/weapon/reagent_containers/glass/bottle/B = new(src) B.reagents.add_reagent(chem,B.volume) @@ -240,7 +237,6 @@ New() ..() - sleep(2) new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink(src) new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink(src) new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink(src) @@ -248,7 +244,6 @@ new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink(src) while(prob(25)) new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_reagent(src) - return // ------------------------------------- @@ -276,8 +271,9 @@ while(prob(15)) new menace(get_step_rand(src.loc)) ..() + return 1 else - ..() + return ..() // @@ -307,7 +303,7 @@ qdel(Cat1) else qdel(Cat2) - ..() + return ..() // -------------------------------------- // Collen's box of wonder and mystery diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 03890ce4372..7de3cfc0aaa 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -193,3 +193,31 @@ var/global/list/datum/stack_recipe/mime_recipes = list ( \ icon_state = "sheet-enruranium" origin_tech = "materials=6" materials = list(MAT_URANIUM=3000) + +/* + * Alien Alloy + */ +/obj/item/stack/sheet/mineral/abductor + name = "alien alloy" + icon = 'icons/obj/abductor.dmi' + icon_state = "sheet-abductor" + singular_name = "alien alloy sheet" + force = 5 + throwforce = 5 + w_class = 3 + throw_speed = 1 + throw_range = 3 + origin_tech = "materials=6;abductor=1" + sheettype = "abductor" + +var/global/list/datum/stack_recipe/abductor_recipes = list ( \ + new/datum/stack_recipe("alien bed", /obj/structure/stool/bed/abductor, 2, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("alien locker", /obj/structure/closet/abductor, 1, time = 15, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("alien table frame", /obj/structure/abductor_tableframe, 1, time = 15, one_per_turf = 1, on_floor = 1), \ + null, \ + new/datum/stack_recipe("alien floor tile", /obj/item/stack/tile/mineral/abductor, 1, 4, 20), \ + ) + +/obj/item/stack/sheet/mineral/abductor/New(var/loc, var/amount=null) + recipes = abductor_recipes + ..() \ No newline at end of file diff --git a/code/game/objects/items/stacks/tiles/tile_mineral.dm b/code/game/objects/items/stacks/tiles/tile_mineral.dm new file mode 100644 index 00000000000..7e6d5459dbf --- /dev/null +++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm @@ -0,0 +1,9 @@ +/obj/item/stack/tile/mineral/abductor + name = "alien floor tile" + singular_name = "alien floor tile" + desc = "A tile made out of alien alloy." + icon = 'icons/obj/abductor.dmi' + icon_state = "tile_abductor" + origin_tech = "materials=6;abductor=1" + turf_type = /turf/simulated/floor/mineral/abductor + mineralType = "abductor" \ No newline at end of file diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 85818ac7767..ce6707bcdcb 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -3,20 +3,20 @@ desc = "This injects the person with DNA." icon = 'icons/obj/items.dmi' icon_state = "dnainjector" - var/block=0 + item_state = "dnainjector" + var/block = 0 var/datum/dna2/record/buf=null - var/s_time = 10.0 - throw_speed = 1 + throw_speed = 3 throw_range = 5 - w_class = 1.0 - var/uses = 1 - var/nofail - var/is_bullet = 0 - var/inuse = 0 + w_class = 1 + origin_tech = "biotech=1" + + var/damage_coeff = 1 + var/used = 0 // USE ONLY IN PREMADE SYRINGES. WILL NOT WORK OTHERWISE. - var/datatype=0 - var/value=0 + var/datatype = 0 + var/value = 0 /obj/item/weapon/dnainjector/New() if(datatype && block) @@ -61,50 +61,47 @@ return buf.dna.SetUIValue(real_block,val) /obj/item/weapon/dnainjector/proc/inject(mob/living/M as mob, mob/user as mob) + if(used) + return if(istype(M,/mob/living)) - M.apply_effect(rand(10,25),IRRADIATE,0,1) + M.apply_effect(rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2)),IRRADIATE,0,1) var/mob/living/carbon/human/H if(istype(M, /mob/living/carbon/human)) H = M - if (!(NOCLONE in M.mutations) && !(H && (H.species.flags & NO_DNA))) // prevents drained people from having their DNA changed - var/prev_ue = M.dna.unique_enzymes - // UI in syringe. - if (buf.types & DNA2_BUF_UI) - if (!block) //isolated block? - M.dna.UI = buf.dna.UI.Copy() - M.dna.UpdateUI() - M.UpdateAppearance() - if (buf.types & DNA2_BUF_UE) //unique enzymes? yes + spawn(0) //Some mutations have sleeps in them, like monkey + if(!(NOCLONE in M.mutations) && !(H && (H.species.flags & NO_DNA))) // prevents drained people from having their DNA changed + var/prev_ue = M.dna.unique_enzymes + // UI in syringe. + if (buf.types & DNA2_BUF_UI) + if (!block) //isolated block? + M.dna.UI = buf.dna.UI.Copy() + M.dna.UpdateUI() + M.UpdateAppearance() + if (buf.types & DNA2_BUF_UE) //unique enzymes? yes - M.real_name = buf.dna.real_name - M.name = buf.dna.real_name - M.dna.real_name = buf.dna.real_name - M.dna.unique_enzymes = buf.dna.unique_enzymes - uses-- - else - M.dna.SetUIValue(block,src.GetValue()) - M.UpdateAppearance() - uses-- - if (buf.types & DNA2_BUF_SE) - if (!block) //isolated block? - M.dna.SE = buf.dna.SE.Copy() - M.dna.UpdateSE() - else - M.dna.SetSEValue(block,src.GetValue()) - domutcheck(M, null, block!=null) - uses-- - M.update_mutations() - if(H) - H.sync_organ_dna(assimilate = 0, old_ue = prev_ue) - - spawn(0)//this prevents the collapse of space-time continuum - if (user) - user.unEquip(src) - qdel(src) - return uses + M.real_name = buf.dna.real_name + M.name = buf.dna.real_name + M.dna.real_name = buf.dna.real_name + M.dna.unique_enzymes = buf.dna.unique_enzymes + else + M.dna.SetUIValue(block,src.GetValue()) + M.UpdateAppearance() + if (buf.types & DNA2_BUF_SE) + if (!block) //isolated block? + M.dna.SE = buf.dna.SE.Copy() + M.dna.UpdateSE() + else + M.dna.SetSEValue(block,src.GetValue()) + domutcheck(M, null, block!=null) + M.update_mutations() + if(H) + H.sync_organ_dna(assimilate = 0, old_ue = prev_ue) /obj/item/weapon/dnainjector/attack(mob/M as mob, mob/user as mob) + if(used) + user << "This injector is used up!" + return if(!M.dna) //You know what would be nice? If the mob you're injecting has DNA, and so doesn't cause runtimes. return 0 @@ -116,9 +113,6 @@ if (!user.IsAdvancedToolUser()) return 0 - if(inuse) - return 0 - M.attack_log += text("\[[time_stamp()]\] Has been injected with [name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [name] to inject [M.name] ([M.ckey])") log_attack("[user.name] ([user.ckey]) used the [name] to inject [M.name] ([M.ckey])") @@ -149,17 +143,20 @@ else log_attack("[key_name(user)] injected [key_name(M)] with the [name]") - user.visible_message("\The [user] starts injecting \the [M] with \the [src]!", "You start injecting \the [M] with \the [src].") - if(do_after(user, 50, target = M)) - inject(M, user)//Now we actually do the heavy lifting - user.visible_message("\The [user] injects \the [M] with \the [src]!", "You inject \the [M] with \the [src].") + if(M != user) + M.visible_message("[user] is trying to inject [M] with [src]!", "[user] is trying to inject [M] with [src]!") + if(!do_mob(user, M)) + return + M.visible_message("[user] injects [M] with the syringe with [src]!", \ + "[user] injects [M] with the syringe with [src]!") - if(user)//If the user still exists. Their mob may not. - if(M)//Runtime fix: If the mob doesn't exist, mob.name doesnt work. - Nodrak - user.show_message("You inject [M.name]") - else - user.show_message("You finish the injection.") + else + user << "You inject yourself with [src]." + inject(M, user) + used = 1 + icon_state = "dnainjector0" + desc += " This one is used up." /obj/item/weapon/dnainjector/hulkmut name = "DNA-Injector (Hulk)" diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index b111501820f..35b865790c7 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -12,7 +12,7 @@ throw_range = 5 materials = list(MAT_METAL=500) origin_tech = "materials=1" - var/breakouttime = 600 //Deciseconds = 60s = 1 minutes + breakouttime = 600 //Deciseconds = 60s = 1 minutes var/cuffsound = 'sound/weapons/handcuffs.ogg' var/trashtype = null //For disposable cuffs @@ -50,7 +50,7 @@ else loc = target target.handcuffed = src - target.update_inv_handcuffed(1) + target.update_handcuffed() return /obj/item/weapon/restraints/handcuffs/cable @@ -85,6 +85,9 @@ /obj/item/weapon/restraints/handcuffs/cable/white color = COLOR_WHITE +/obj/item/weapon/restraints/handcuffs/alien + icon_state = "handcuffAlien" + /obj/item/weapon/restraints/handcuffs/pinkcuffs name = "fluffy pink handcuffs" desc = "Use this to keep prisoners in line. Or you know, your significant other." @@ -121,7 +124,7 @@ if(do_mob(user, C, 30)) if(!C.handcuffed) C.handcuffed = new /obj/item/weapon/restraints/handcuffs/cable/zipties/used(C) - C.update_inv_handcuffed(1) + C.update_handcuffed() to_chat(user, "You handcuff [C].") add_logs(C, user, "ziptie-cuffed") else @@ -133,110 +136,3 @@ /obj/item/weapon/restraints/handcuffs/cable/zipties/used/attack() return - -//Legcuffs -/obj/item/weapon/restraints/legcuffs - name = "leg cuffs" - desc = "Use this to keep prisoners in line." - gender = PLURAL - icon = 'icons/obj/items.dmi' - icon_state = "handcuff" - flags = CONDUCT - throwforce = 0 - w_class = 3.0 - origin_tech = "materials=1" - slowdown = 7 - var/breakouttime = 300 //Deciseconds = 30s = 0.5 minute - -/obj/item/weapon/restraints/legcuffs/beartrap - name = "bear trap" - throw_speed = 1 - throw_range = 1 - icon_state = "beartrap0" - desc = "A trap used to catch bears and other legged creatures." - var/armed = 0 - var/obj/item/weapon/grenade/iedcasing/IED = null - -/obj/item/weapon/restraints/legcuffs/beartrap/Destroy() - if(IED) - qdel(IED) - IED = null - return ..() - -/obj/item/weapon/restraints/legcuffs/beartrap/suicide_act(mob/user) - user.visible_message("[user] is sticking \his head in the [src.name]! It looks like \he's trying to commit suicide.") - playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) - return (BRUTELOSS) - -/obj/item/weapon/restraints/legcuffs/beartrap/attack_self(mob/user as mob) - ..() - if(ishuman(user) && !user.stat && !user.restrained()) - armed = !armed - icon_state = "beartrap[armed]" - to_chat(user, "[src] is now [armed ? "armed" : "disarmed"]") - -/obj/item/weapon/restraints/legcuffs/beartrap/attackby(var/obj/item/I, mob/user as mob) //Let's get explosive. - if(istype(I, /obj/item/weapon/grenade/iedcasing)) - if(IED) - to_chat(user, "This beartrap already has an IED hooked up to it!") - return - IED = I - switch(IED.assembled) - if(0,1) //if it's not fueled/hooked up - to_chat(user, "You haven't prepared this IED yet!") - IED = null - return - if(2,3) - user.drop_item(src) - I.forceMove(src) - message_admins("[key_name_admin(user)] has rigged a beartrap with an IED.") - log_game("[key_name(user)] has rigged a beartrap with an IED.") - to_chat(user, "You sneak the [IED] underneath the pressure plate and connect the trigger wire.") - desc = "A trap used to catch bears and other legged creatures. There is an IED hooked up to it." - else - to_chat(user, "You shouldn't be reading this message! Contact a coder or someone, something broke!") - IED = null - return - if(istype(I, /obj/item/weapon/screwdriver)) - if(IED) - IED.forceMove(get_turf(src)) - IED = null - to_chat(user, "You remove the IED from the [src].") - return - ..() - -/obj/item/weapon/restraints/legcuffs/beartrap/Crossed(AM as mob|obj) - if(armed && isturf(src.loc)) - if( (iscarbon(AM) || isanimal(AM)) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator)) - var/mob/living/L = AM - armed = 0 - icon_state = "beartrap0" - playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) - L.visible_message("[L] triggers \the [src].", \ - "You trigger \the [src]!") - - if(IED && isturf(src.loc)) - IED.active = 1 - IED.overlays -= image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") - IED.icon_state = initial(icon_state) + "_active" - IED.assembled = 3 - message_admins("[key_name_admin(usr)] has triggered an IED-rigged [name].") - log_game("[key_name(usr)] has triggered an IED-rigged [name].") - spawn(IED.det_time) - IED.prime() - - if(ishuman(AM)) - var/mob/living/carbon/H = AM - if(H.lying) - H.apply_damage(20,BRUTE,"chest") - else - H.apply_damage(20,BRUTE,(pick("l_leg", "r_leg"))) - if(!H.legcuffed) //beartrap can't cuff you leg if there's already a beartrap or legcuffs. - H.legcuffed = src - src.loc = H - H.update_inv_legcuffed(0) - feedback_add_details("handcuffs","B") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart. - - else - L.apply_damage(20,BRUTE) - ..() diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index 88c555d8148..fa485cbf93b 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -1,5 +1,5 @@ -/obj/item/weapon/legcuffs - name = "legcuffs" +/obj/item/weapon/restraints/legcuffs + name = "leg cuffs" desc = "Use this to keep prisoners in line." gender = PLURAL icon = 'icons/obj/items.dmi' @@ -8,7 +8,102 @@ throwforce = 0 w_class = 3.0 origin_tech = "materials=1" - var/breakouttime = 300 //Deciseconds = 30s = 0.5 minute + slowdown = 7 + breakouttime = 300 //Deciseconds = 30s = 0.5 minute + +/obj/item/weapon/restraints/legcuffs/beartrap + name = "bear trap" + throw_speed = 1 + throw_range = 1 + icon_state = "beartrap0" + desc = "A trap used to catch bears and other legged creatures." + var/armed = 0 + var/obj/item/weapon/grenade/iedcasing/IED = null + +/obj/item/weapon/restraints/legcuffs/beartrap/Destroy() + if(IED) + qdel(IED) + IED = null + return ..() + +/obj/item/weapon/restraints/legcuffs/beartrap/suicide_act(mob/user) + user.visible_message("[user] is sticking \his head in the [src.name]! It looks like \he's trying to commit suicide.") + playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) + return (BRUTELOSS) + +/obj/item/weapon/restraints/legcuffs/beartrap/attack_self(mob/user as mob) + ..() + if(ishuman(user) && !user.stat && !user.restrained()) + armed = !armed + icon_state = "beartrap[armed]" + to_chat(user, "[src] is now [armed ? "armed" : "disarmed"]") + +/obj/item/weapon/restraints/legcuffs/beartrap/attackby(var/obj/item/I, mob/user as mob) //Let's get explosive. + if(istype(I, /obj/item/weapon/grenade/iedcasing)) + if(IED) + to_chat(user, "This beartrap already has an IED hooked up to it!") + return + IED = I + switch(IED.assembled) + if(0,1) //if it's not fueled/hooked up + to_chat(user, "You haven't prepared this IED yet!") + IED = null + return + if(2,3) + user.drop_item(src) + I.forceMove(src) + message_admins("[key_name_admin(user)] has rigged a beartrap with an IED.") + log_game("[key_name(user)] has rigged a beartrap with an IED.") + to_chat(user, "You sneak the [IED] underneath the pressure plate and connect the trigger wire.") + desc = "A trap used to catch bears and other legged creatures. There is an IED hooked up to it." + else + to_chat(user, "You shouldn't be reading this message! Contact a coder or someone, something broke!") + IED = null + return + if(istype(I, /obj/item/weapon/screwdriver)) + if(IED) + IED.forceMove(get_turf(src)) + IED = null + to_chat(user, "You remove the IED from the [src].") + return + ..() + +/obj/item/weapon/restraints/legcuffs/beartrap/Crossed(AM as mob|obj) + if(armed && isturf(src.loc)) + if( (iscarbon(AM) || isanimal(AM)) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator)) + var/mob/living/L = AM + armed = 0 + icon_state = "beartrap0" + playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) + L.visible_message("[L] triggers \the [src].", \ + "You trigger \the [src]!") + + if(IED && isturf(src.loc)) + IED.active = 1 + IED.overlays -= image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") + IED.icon_state = initial(icon_state) + "_active" + IED.assembled = 3 + message_admins("[key_name_admin(usr)] has triggered an IED-rigged [name].") + log_game("[key_name(usr)] has triggered an IED-rigged [name].") + spawn(IED.det_time) + IED.prime() + + if(ishuman(AM)) + var/mob/living/carbon/H = AM + if(H.lying) + H.apply_damage(20,BRUTE,"chest") + else + H.apply_damage(20,BRUTE,(pick("l_leg", "r_leg"))) + if(!H.legcuffed) //beartrap can't cuff you leg if there's already a beartrap or legcuffs. + H.legcuffed = src + src.loc = H + H.update_inv_legcuffed(0) + feedback_add_details("handcuffs","B") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart. + + else + L.apply_damage(20,BRUTE) + ..() + /obj/item/weapon/legcuffs/bolas name = "bolas" diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 86345b677ca..a161755c285 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -137,37 +137,3 @@ H.update_inv_r_hand() add_fingerprint(user) return - - -/obj/item/weapon/cloaking_device - name = "cloaking device" - desc = "Use this to become invisible to the human eyesocket." - icon = 'icons/obj/device.dmi' - icon_state = "shield0" - var/active = 0.0 - flags = CONDUCT - item_state = "electronic" - throwforce = 10.0 - throw_speed = 2 - throw_range = 10 - w_class = 2.0 - origin_tech = "magnets=3;syndicate=4" - - -/obj/item/weapon/cloaking_device/attack_self(mob/user as mob) - src.active = !( src.active ) - if (src.active) - to_chat(user, "\blue The cloaking device is now active.") - src.icon_state = "shield1" - else - to_chat(user, "\blue The cloaking device is now inactive.") - src.icon_state = "shield0" - src.add_fingerprint(user) - return - -/obj/item/weapon/cloaking_device/emp_act(severity) - active = 0 - icon_state = "shield0" - if(ismob(loc)) - loc:update_icons() - ..() diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index cd565f341a7..b93fc3b06b1 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -512,6 +512,16 @@ new /obj/item/weapon/restraints/handcuffs/cable/zipties(src) new /obj/item/weapon/restraints/handcuffs/cable/zipties(src) +/obj/item/weapon/storage/box/alienhandcuffs + name = "box of spare handcuffs" + desc = "A box full of handcuffs." + icon_state = "alienboxCuffs" + + New() + ..() + for(var/i in 1 to 7) + new /obj/item/weapon/restraints/handcuffs/alien(src) + /obj/item/weapon/storage/box/fakesyndiesuit name = "boxed space suit and helmet" desc = "A sleek, sturdy box used to hold replica spacesuits." diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index a187dc09b65..2a9b64748dd 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -127,7 +127,7 @@ C.handcuffed = null if(C.buckled && C.buckled.buckle_requires_restraints) C.buckled.unbuckle_mob() - C.update_inv_handcuffed() + C.update_handcuffed() return else ..() diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 8f40f7a9848..cf72da26b0b 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -129,7 +129,13 @@ return /mob/proc/unset_machine() - src.machine = null + if(machine) + machine.on_unset_machine(src) + machine = null + +//called when the user unsets the machine. +/atom/movable/proc/on_unset_machine(mob/user) + return /mob/proc/set_machine(var/obj/O) if(src.machine) diff --git a/code/game/objects/structures/barsign.dm b/code/game/objects/structures/barsign.dm index a1b4c51d702..86aa341d39c 100644 --- a/code/game/objects/structures/barsign.dm +++ b/code/game/objects/structures/barsign.dm @@ -108,7 +108,11 @@ to_chat(user, "Nothing interesting happens!") return to_chat(user, "You emag the barsign. Takeover in progress...") - sleep(100) //10 seconds + addtimer(src, "post_emag", 100) + +/obj/structure/sign/barsign/proc/post_emag() + if(broken || emagged) + return set_sign(new /datum/barsign/hiddensigns/syndibarsign) emagged = 1 req_access = list(access_syndicate) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 87457fd791d..a6b19ebbea5 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -11,9 +11,11 @@ var/wall_mounted = 0 //never solid (You can always pass over it) var/health = 100 var/lastbang + var/cutting_tool = /obj/item/weapon/weldingtool var/sound = 'sound/machines/click.ogg' - var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate - //then open it in a populated area to crash clients. + var/cutting_sound = 'sound/items/Welder.ogg' + var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate then open it in a populated area to crash clients. + var/material_drop = /obj/item/stack/sheet/metal /obj/structure/closet/New() ..() @@ -136,7 +138,6 @@ /obj/structure/closet/proc/toggle(mob/user as mob) if(!(src.opened ? src.close() : src.open())) to_chat(user, "It won't budge!") - return // this should probably use dump_contents() /obj/structure/closet/ex_act(severity) @@ -169,7 +170,6 @@ for(var/atom/movable/A as mob|obj in src) A.forceMove(loc) qdel(src) - return /obj/structure/closet/attack_animal(mob/living/simple_animal/user as mob) if(user.environment_smash) @@ -259,16 +259,24 @@ src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet if(istype(W,/obj/item/tk_grab)) return 0 - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - if(!WT.remove_fuel(0,user)) - to_chat(user, "You need more welding fuel to complete this task.") - return - new /obj/item/stack/sheet/metal(src.loc) - for(var/mob/M in viewers(src)) - M.show_message("\The [src] has been cut apart by [user] with \the [WT].", 3, "You hear welding.", 2) - qdel(src) - return + if(istype(W, cutting_tool)) + if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + if(!WT.remove_fuel(0, user)) + return + to_chat(user, "You begin cutting \the [src] apart...") + playsound(loc, cutting_sound, 40, 1) + if(do_after(user, 40, 1, target = src)) + if(!opened || !WT.isOn()) + return + playsound(loc, cutting_sound, 50, 1) + visible_message("[user] slices apart \the [src].", + "You cut \the [src] apart with \the [WT].", + "You hear welding.") + var/turf/T = get_turf(src) + new material_drop(T) + qdel(src) + return if(isrobot(user)) return if(!usr.drop_item()) @@ -291,7 +299,6 @@ M.show_message("[src] has been [welded?"welded shut":"unwelded"] by [user.name].", 3, "You hear welding.", 2) else src.attack_hand(user) - return /obj/structure/closet/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) ..() @@ -315,7 +322,6 @@ if(user != O) user.show_viewers("[user] stuffs [O] into [src]!") src.add_fingerprint(user) - return /obj/structure/closet/attack_ai(mob/user) if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) //Robots can open/close it, but not the AI diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index 824cff35ece..dad7aecb190 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -6,6 +6,8 @@ icon_closed = "cardboard" health = 10 sound = 'sound/effects/rustle2.ogg' + material_drop = /obj/item/stack/sheet/cardboard + cutting_sound = 'sound/items/poster_ripped.ogg' var/move_delay = 0 var/egged = 0 diff --git a/code/game/objects/structures/crates_lockers/closets/crittercrate.dm b/code/game/objects/structures/crates_lockers/closets/crittercrate.dm index d3ab79e7688..6a295ca4307 100644 --- a/code/game/objects/structures/crates_lockers/closets/crittercrate.dm +++ b/code/game/objects/structures/crates_lockers/closets/crittercrate.dm @@ -3,4 +3,5 @@ desc = "A crate which can sustain life for a while." icon_state = "critter" icon_opened = "critteropen" - icon_closed = "critter" \ No newline at end of file + icon_closed = "critter" + material_drop = /obj/item/stack/sheet/wood \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm index f74f603df54..13c4c999ef5 100644 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm @@ -193,7 +193,6 @@ to_chat(user, "\red Cabinet locked.") else to_chat(user, "\blue Cabinet unlocked.") - return update_icon() //Template: fireaxe[has fireaxe][is opened][hits taken][is smashed]. If you want the opening or closing animations, add "opening" or "closing" right after the numbers var/hasaxe = 0 diff --git a/code/game/objects/structures/crates_lockers/closets/fitness.dm b/code/game/objects/structures/crates_lockers/closets/fitness.dm index 9f435427bcc..72ae40e3af6 100644 --- a/code/game/objects/structures/crates_lockers/closets/fitness.dm +++ b/code/game/objects/structures/crates_lockers/closets/fitness.dm @@ -6,7 +6,6 @@ /obj/structure/closet/athletic_mixed/New() ..() - sleep(2) new /obj/item/clothing/under/shorts/grey(src) new /obj/item/clothing/under/shorts/black(src) new /obj/item/clothing/under/shorts/red(src) @@ -25,7 +24,6 @@ /obj/structure/closet/boxinggloves/New() ..() - sleep(2) new /obj/item/clothing/gloves/boxing/blue(src) new /obj/item/clothing/gloves/boxing/green(src) new /obj/item/clothing/gloves/boxing/yellow(src) @@ -38,7 +36,6 @@ /obj/structure/closet/masks/New() ..() - sleep(2) new /obj/item/clothing/mask/luchador(src) new /obj/item/clothing/mask/luchador/rudos(src) new /obj/item/clothing/mask/luchador/tecnicos(src) @@ -52,7 +49,6 @@ /obj/structure/closet/lasertag/red/New() ..() - sleep(2) new /obj/item/weapon/gun/energy/laser/redtag(src) new /obj/item/weapon/gun/energy/laser/redtag(src) new /obj/item/weapon/gun/energy/laser/redtag(src) @@ -69,7 +65,6 @@ /obj/structure/closet/lasertag/blue/New() ..() - sleep(2) new /obj/item/weapon/gun/energy/laser/bluetag(src) new /obj/item/weapon/gun/energy/laser/bluetag(src) new /obj/item/weapon/gun/energy/laser/bluetag(src) diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index 0318203a2ce..bff3228dbc9 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -36,7 +36,6 @@ /obj/structure/closet/gimmick/russian/New() ..() - sleep(2) new /obj/item/clothing/head/ushanka(src) new /obj/item/clothing/head/ushanka(src) new /obj/item/clothing/head/ushanka(src) @@ -58,7 +57,6 @@ /obj/structure/closet/gimmick/tacticool/New() ..() - sleep(2) new /obj/item/clothing/glasses/eyepatch(src) new /obj/item/clothing/glasses/sunglasses(src) new /obj/item/clothing/gloves/combat(src) @@ -83,16 +81,11 @@ icon_opened = "syndicateopen" anchored = 1 -/obj/structure/closet/thunderdome/New() - ..() - sleep(2) - /obj/structure/closet/thunderdome/tdred name = "red-team Thunderdome closet" /obj/structure/closet/thunderdome/tdred/New() ..() - sleep(2) new /obj/item/clothing/suit/armor/tdome/red(src) new /obj/item/clothing/suit/armor/tdome/red(src) new /obj/item/clothing/suit/armor/tdome/red(src) @@ -120,7 +113,6 @@ /obj/structure/closet/thunderdome/tdgreen/New() ..() - sleep(2) new /obj/item/clothing/suit/armor/tdome/green(src) new /obj/item/clothing/suit/armor/tdome/green(src) new /obj/item/clothing/suit/armor/tdome/green(src) diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 908a8dc26c4..2b6660d077f 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -16,7 +16,6 @@ /obj/structure/closet/gmcloset/New() ..() - sleep(2) new /obj/item/clothing/head/that(src) new /obj/item/clothing/head/that(src) new /obj/item/device/radio/headset/headset_service(src) @@ -45,7 +44,6 @@ /obj/structure/closet/chefcloset/New() ..() - sleep(2) new /obj/item/clothing/under/waiter(src) new /obj/item/clothing/under/waiter(src) new /obj/item/device/radio/headset/headset_service(src) @@ -74,7 +72,6 @@ /obj/structure/closet/jcloset/New() ..() - sleep(2) new /obj/item/clothing/under/rank/janitor(src) new /obj/item/device/radio/headset/headset_service(src) new /obj/item/weapon/cartridge/janitor(src) @@ -104,7 +101,6 @@ /obj/structure/closet/lawcloset/New() ..() - sleep(2) new /obj/item/clothing/under/lawyer/female(src) new /obj/item/clothing/under/lawyer/black(src) new /obj/item/clothing/under/lawyer/red(src) diff --git a/code/game/objects/structures/crates_lockers/closets/l3closet.dm b/code/game/objects/structures/crates_lockers/closets/l3closet.dm index 5100e2170f0..4f5bd0e40b3 100644 --- a/code/game/objects/structures/crates_lockers/closets/l3closet.dm +++ b/code/game/objects/structures/crates_lockers/closets/l3closet.dm @@ -7,7 +7,6 @@ /obj/structure/closet/l3closet/New() ..() - sleep(2) new /obj/item/weapon/storage/bag/bio( src ) new /obj/item/clothing/suit/bio_suit/general( src ) new /obj/item/clothing/head/bio_hood/general( src ) @@ -20,7 +19,6 @@ /obj/structure/closet/l3closet/general/New() ..() - sleep(2) contents = list() new /obj/item/clothing/suit/bio_suit/general( src ) new /obj/item/clothing/head/bio_hood/general( src ) @@ -33,7 +31,6 @@ /obj/structure/closet/l3closet/virology/New() ..() - sleep(2) contents = list() new /obj/item/weapon/storage/bag/bio( src ) new /obj/item/clothing/suit/bio_suit/virology( src ) @@ -49,7 +46,6 @@ /obj/structure/closet/l3closet/security/New() ..() - sleep(2) contents = list() new /obj/item/clothing/suit/bio_suit/security( src ) new /obj/item/clothing/head/bio_hood/security( src ) @@ -62,7 +58,6 @@ /obj/structure/closet/l3closet/janitor/New() ..() - sleep(2) contents = list() new /obj/item/clothing/suit/bio_suit/janitor( src ) new /obj/item/clothing/head/bio_hood/janitor( src ) @@ -75,7 +70,6 @@ /obj/structure/closet/l3closet/scientist/New() ..() - sleep(2) contents = list() new /obj/item/weapon/storage/bag/bio( src ) new /obj/item/clothing/suit/bio_suit/scientist( src ) diff --git a/code/game/objects/structures/crates_lockers/closets/malfunction.dm b/code/game/objects/structures/crates_lockers/closets/malfunction.dm index 3bf64ba34d8..ba32e37f38c 100644 --- a/code/game/objects/structures/crates_lockers/closets/malfunction.dm +++ b/code/game/objects/structures/crates_lockers/closets/malfunction.dm @@ -7,7 +7,6 @@ /obj/structure/closet/malf/suits/New() ..() - sleep(2) new /obj/item/weapon/tank/jetpack/void(src) new /obj/item/clothing/mask/breath(src) new /obj/item/clothing/head/helmet/space/nasavoid(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm index 38321723e2a..af6424571ca 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm @@ -11,7 +11,6 @@ New() ..() - sleep(2) new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) @@ -22,7 +21,6 @@ new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) - return /obj/structure/closet/secure_closet/bar/update_icon() if(broken) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index e7d23c4a795..945f4f4d818 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -10,14 +10,12 @@ New() ..() - sleep(2) new /obj/item/clothing/under/rank/cargotech(src) new /obj/item/clothing/shoes/black(src) new /obj/item/device/radio/headset/headset_cargo(src) new /obj/item/clothing/gloves/fingerless(src) new /obj/item/clothing/head/soft(src) // new /obj/item/weapon/cartridge/quartermaster(src) - return /obj/structure/closet/secure_closet/quartermaster name = "quartermaster's locker" @@ -31,7 +29,6 @@ New() ..() - sleep(2) new /obj/item/clothing/under/rank/cargo(src) new /obj/item/clothing/shoes/brown(src) new /obj/item/device/radio/headset/headset_cargo(src) @@ -42,5 +39,4 @@ new /obj/item/weapon/tank/emergency_oxygen(src) new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/glasses/meson(src) - new /obj/item/clothing/head/soft(src) - return \ No newline at end of file + new /obj/item/clothing/head/soft(src) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm b/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm index d8577c53e27..50ad1500192 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm @@ -11,7 +11,6 @@ /obj/structure/closet/secure_closet/chaplain/New() ..() - sleep(2) new /obj/item/clothing/under/rank/chaplain(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/suit/nun(src) @@ -29,5 +28,4 @@ new /obj/item/clothing/gloves/ring/silver(src) new /obj/item/clothing/gloves/ring/silver(src) new /obj/item/clothing/gloves/ring/gold(src) - new /obj/item/clothing/gloves/ring/gold(src) - return \ No newline at end of file + new /obj/item/clothing/gloves/ring/gold(src) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 0ce79c29b17..d7fd20b6d37 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -10,7 +10,6 @@ New() ..() - sleep(2) if(prob(50)) new /obj/item/weapon/storage/backpack/industrial(src) else @@ -32,7 +31,6 @@ new /obj/item/device/flash(src) new /obj/item/taperoll/engineering(src) new /obj/item/clothing/head/beret/eng(src) - return /obj/structure/closet/secure_closet/engineering_electrical name = "electrical supplies locker" @@ -47,7 +45,6 @@ New() ..() - sleep(2) new /obj/item/clothing/gloves/color/yellow(src) new /obj/item/clothing/gloves/color/yellow(src) new /obj/item/weapon/storage/toolbox/electrical(src) @@ -60,7 +57,6 @@ new /obj/item/device/multitool(src) new /obj/item/device/multitool(src) new /obj/item/clothing/head/beret/eng - return @@ -77,14 +73,12 @@ New() ..() - sleep(2) new /obj/item/clothing/head/welding(src) new /obj/item/clothing/head/welding(src) new /obj/item/clothing/head/welding(src) new /obj/item/weapon/weldingtool/largetank(src) new /obj/item/weapon/weldingtool/largetank(src) new /obj/item/weapon/weldingtool/largetank(src) - return @@ -101,7 +95,6 @@ New() ..() - sleep(2) if(prob(50)) new /obj/item/weapon/storage/backpack/industrial(src) else @@ -116,7 +109,6 @@ new /obj/item/weapon/cartridge/engineering(src) new /obj/item/taperoll/engineering(src) new /obj/item/clothing/head/beret/eng(src) - return /obj/structure/closet/secure_closet/atmos_personal name = "technician's locker" @@ -131,7 +123,6 @@ New() ..() - sleep(2) new /obj/item/device/radio/headset/headset_eng(src) new /obj/item/weapon/cartridge/atmos(src) new /obj/item/weapon/storage/toolbox/mechanical(src) @@ -147,6 +138,4 @@ new /obj/item/weapon/tank/emergency_oxygen/engi(src) new /obj/item/weapon/watertank/atmos(src) new /obj/item/clothing/suit/fire/atmos(src) - new /obj/item/clothing/head/hardhat/atmos(src) - - return \ No newline at end of file + new /obj/item/clothing/head/hardhat/atmos(src) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index 9342b704087..896ab5e1dd1 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -21,7 +21,6 @@ var/list/bombs = search_contents_for(/obj/item/device/transfer_valve) if(!isemptylist(bombs)) // You're fucked. ..(severity) - return /obj/structure/closet/secure_closet/freezer/kitchen name = "kitchen cabinet" @@ -29,8 +28,7 @@ New() ..() - sleep(2) - for(var/i = 0, i < 3, i++) + for(var/i in 1 to 3) new /obj/item/weapon/reagent_containers/food/condiment/flour(src) new /obj/item/weapon/reagent_containers/food/condiment/rice(src) new /obj/item/weapon/reagent_containers/food/condiment/sugar(src) @@ -54,10 +52,8 @@ New() ..() - sleep(2) - for(var/i = 0, i < 4, i++) + for(var/i in 1 to 4) new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey(src) - return @@ -73,14 +69,11 @@ New() ..() - sleep(2) - for(var/i = 0, i < 5, i++) + for(var/i in 1 to 5) new /obj/item/weapon/reagent_containers/food/drinks/milk(src) - for(var/i = 0, i < 5, i++) new /obj/item/weapon/reagent_containers/food/drinks/soymilk(src) - for(var/i = 0, i < 2, i++) + for(var/i in 1 to 2) new /obj/item/weapon/storage/fancy/egg_box(src) - return @@ -97,9 +90,7 @@ New() ..() - sleep(2) - dispense_cash(6700,src) - return + dispense_cash(6700, src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm index fb26aff5403..c18fd1a9b74 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm @@ -11,7 +11,6 @@ New() ..() - sleep(2) switch(rand(1,2)) if(1) new /obj/item/clothing/suit/apron(src) @@ -24,5 +23,4 @@ new /obj/item/device/radio/headset/headset_service(src) new /obj/item/clothing/mask/bandana/botany(src) new /obj/item/weapon/minihoe(src) - new /obj/item/weapon/hatchet(src) - return \ No newline at end of file + new /obj/item/weapon/hatchet(src) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 11e1b56b7ed..ad76cfc9409 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -12,7 +12,6 @@ New() ..() - sleep(2) new /obj/item/weapon/storage/box/autoinjectors(src) new /obj/item/weapon/storage/box/syringes(src) new /obj/item/weapon/reagent_containers/dropper(src) @@ -23,7 +22,6 @@ new /obj/item/weapon/reagent_containers/glass/bottle/epinephrine(src) new /obj/item/weapon/reagent_containers/glass/bottle/charcoal(src) new /obj/item/weapon/reagent_containers/glass/bottle/charcoal(src) - return @@ -41,14 +39,12 @@ New() ..() - sleep(2) new /obj/item/weapon/tank/anesthetic(src) new /obj/item/weapon/tank/anesthetic(src) new /obj/item/weapon/tank/anesthetic(src) new /obj/item/clothing/mask/breath/medical(src) new /obj/item/clothing/mask/breath/medical(src) new /obj/item/clothing/mask/breath/medical(src) - return @@ -64,7 +60,6 @@ New() ..() - sleep(2) if(prob(50)) new /obj/item/weapon/storage/backpack/medic(src) else @@ -79,7 +74,6 @@ new /obj/item/weapon/storage/belt/medical(src) new /obj/item/clothing/glasses/hud/health(src) new /obj/item/clothing/shoes/sandal/white(src) - return //Exam Room /obj/structure/closet/secure_closet/exam @@ -96,7 +90,6 @@ New() ..() - sleep(2) new /obj/item/weapon/storage/box/syringes(src) new /obj/item/weapon/reagent_containers/dropper(src) new /obj/item/weapon/storage/belt/medical(src) @@ -111,7 +104,6 @@ new /obj/item/weapon/storage/firstaid/fire(src) new /obj/item/weapon/storage/firstaid/o2(src) new /obj/item/weapon/storage/firstaid/toxin(src) - return // Psychiatrist's pill bottle @@ -138,14 +130,11 @@ New() ..() - sleep(2) new /obj/item/clothing/suit/straight_jacket(src) new /obj/item/weapon/reagent_containers/syringe(src) new /obj/item/weapon/reagent_containers/glass/bottle/ether(src) new /obj/item/weapon/storage/pill_bottle/psychiatrist(src) - return - /obj/structure/closet/secure_closet/CMO name = "chief medical officer's locker" req_access = list(access_cmo) @@ -158,7 +147,6 @@ New() ..() - sleep(2) if(prob(50)) new /obj/item/weapon/storage/backpack/medic(src) else @@ -187,7 +175,6 @@ new /obj/item/device/flash(src) new /obj/item/weapon/reagent_containers/hypospray/CMO(src) new /obj/item/organ/internal/cyberimp/eyes/hud/medical(src) - return @@ -198,12 +185,10 @@ New() ..() - sleep(2) new /obj/item/device/assembly/signaler(src) new /obj/item/device/radio/electropack(src) new /obj/item/device/radio/electropack(src) new /obj/item/device/radio/electropack(src) - return @@ -221,10 +206,8 @@ New() ..() - sleep(2) new /obj/item/weapon/storage/box/pillbottles(src) new /obj/item/weapon/storage/box/pillbottles(src) - return /obj/structure/closet/secure_closet/medical_wall name = "first aid closet" @@ -266,12 +249,10 @@ New() ..() - sleep(2) new /obj/item/clothing/suit/space/eva/paramedic(src) new /obj/item/clothing/head/helmet/space/eva/paramedic(src) new /obj/item/clothing/head/helmet/space/eva/paramedic(src) new /obj/item/device/sensor_device(src) - return /obj/structure/closet/secure_closet/reagents name = "chemical storage closet" @@ -287,11 +268,9 @@ New() ..() - sleep(2) new /obj/item/weapon/reagent_containers/glass/bottle/reagent/phenol(src) new /obj/item/weapon/reagent_containers/glass/bottle/reagent/ammonia(src) new /obj/item/weapon/reagent_containers/glass/bottle/reagent/oil(src) new /obj/item/weapon/reagent_containers/glass/bottle/reagent/acetone(src) new /obj/item/weapon/reagent_containers/glass/bottle/reagent/acid(src) new /obj/item/weapon/reagent_containers/glass/bottle/reagent/diethylamine(src) - return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm index 1de1f8d8440..0433ba0479f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -6,15 +6,13 @@ /obj/structure/closet/secure_closet/personal/New() ..() - spawn(2) - if(prob(50)) - new /obj/item/weapon/storage/backpack/duffel(src) - if(prob(50)) - new /obj/item/weapon/storage/backpack(src) - else - new /obj/item/weapon/storage/backpack/satchel_norm(src) - new /obj/item/device/radio/headset( src ) - return + if(prob(50)) + new /obj/item/weapon/storage/backpack/duffel(src) + if(prob(50)) + new /obj/item/weapon/storage/backpack(src) + else + new /obj/item/weapon/storage/backpack/satchel_norm(src) + new /obj/item/device/radio/headset( src ) /obj/structure/closet/secure_closet/personal/patient @@ -22,11 +20,9 @@ /obj/structure/closet/secure_closet/personal/patient/New() ..() - spawn(4) - contents = list() - new /obj/item/clothing/under/color/white( src ) - new /obj/item/clothing/shoes/white( src ) - return + contents.Cut() + new /obj/item/clothing/under/color/white( src ) + new /obj/item/clothing/shoes/white( src ) @@ -52,11 +48,9 @@ /obj/structure/closet/secure_closet/personal/cabinet/New() ..() - spawn(4) - contents = list() - new /obj/item/weapon/storage/backpack/satchel/withwallet( src ) - new /obj/item/device/radio/headset( src ) - return + contents.Cut() + new /obj/item/weapon/storage/backpack/satchel/withwallet( src ) + new /obj/item/device/radio/headset( src ) /obj/structure/closet/secure_closet/personal/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if (src.opened) @@ -91,4 +85,3 @@ emag_act(user) else to_chat(user, "\red Access Denied") - return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index ad0c0ac8ef1..321b71b6eaa 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -10,7 +10,6 @@ New() ..() - sleep(2) new /obj/item/weapon/storage/backpack/science(src) new /obj/item/weapon/storage/backpack/satchel_tox(src) new /obj/item/clothing/under/rank/scientist(src) @@ -22,7 +21,6 @@ new /obj/item/weapon/tank/air(src) new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/shoes/sandal/white(src) - return @@ -38,7 +36,6 @@ New() ..() - sleep(2) new /obj/item/clothing/suit/bio_suit/scientist(src) new /obj/item/clothing/head/bio_hood/scientist(src) new /obj/item/clothing/under/rank/research_director(src) @@ -52,7 +49,6 @@ new /obj/item/clothing/suit/armor/reactive(src) new /obj/item/device/flash(src) new /obj/item/device/laser_pointer(src) - return /obj/structure/closet/secure_closet/research_reagents name = "research chemical storage closet" @@ -68,7 +64,6 @@ New() ..() - sleep(2) new /obj/item/weapon/reagent_containers/glass/bottle/reagent/morphine(src) new /obj/item/weapon/reagent_containers/glass/bottle/reagent/morphine(src) new /obj/item/weapon/reagent_containers/glass/bottle/reagent/morphine(src) @@ -82,5 +77,4 @@ new /obj/item/weapon/reagent_containers/glass/bottle/reagent/oil(src) new /obj/item/weapon/reagent_containers/glass/bottle/reagent/acetone(src) new /obj/item/weapon/reagent_containers/glass/bottle/reagent/acid(src) - new /obj/item/weapon/reagent_containers/glass/bottle/reagent/diethylamine(src) - return \ No newline at end of file + new /obj/item/weapon/reagent_containers/glass/bottle/reagent/diethylamine(src) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 2aa4ce9db01..05f077e64d1 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -10,7 +10,6 @@ New() ..() - sleep(2) if(prob(50)) new /obj/item/weapon/storage/backpack/captain(src) else @@ -27,7 +26,6 @@ new /obj/item/device/radio/headset/heads/captain/alt(src) new /obj/item/clothing/gloves/color/captain(src) new /obj/item/weapon/gun/energy/gun(src) - return @@ -43,7 +41,6 @@ New() ..() - sleep(2) new /obj/item/clothing/glasses/sunglasses(src) new /obj/item/clothing/head/hopcap(src) new /obj/item/weapon/cartridge/hop(src) @@ -55,7 +52,6 @@ new /obj/item/device/flash(src) new /obj/item/weapon/mining_voucher(src) new /obj/item/clothing/accessory/petcollar(src) - return /obj/structure/closet/secure_closet/hop2 name = "head of personnel's attire" @@ -69,7 +65,6 @@ New() ..() - sleep(2) new /obj/item/clothing/under/rank/head_of_personnel(src) new /obj/item/clothing/under/dress/dress_hop(src) new /obj/item/clothing/under/dress/dress_hr(src) @@ -82,7 +77,6 @@ new /obj/item/clothing/shoes/leather(src) new /obj/item/clothing/shoes/white(src) new /obj/item/clothing/under/rank/head_of_personnel_whimsy(src) - return @@ -98,7 +92,6 @@ New() ..() - sleep(2) if(prob(50)) new /obj/item/weapon/storage/backpack/security(src) else @@ -121,7 +114,6 @@ new /obj/item/weapon/storage/belt/security/sec(src) new /obj/item/taperoll/police(src) new /obj/item/weapon/gun/energy/hos(src) - return @@ -138,7 +130,6 @@ New() ..() - sleep(2) if(prob(50)) new /obj/item/weapon/storage/backpack/security(src) else @@ -161,7 +152,6 @@ new /obj/item/weapon/gun/energy/advtaser(src) new /obj/item/weapon/storage/belt/security/sec(src) new /obj/item/weapon/storage/box/holobadge(src) - return @@ -177,7 +167,6 @@ New() ..() - sleep(2) if(prob(50)) new /obj/item/weapon/storage/backpack/security(src) else @@ -194,7 +183,6 @@ new /obj/item/clothing/head/helmet(src) new /obj/item/weapon/melee/baton/loaded(src) new /obj/item/taperoll/police(src) - return /obj/structure/closet/secure_closet/brigdoc name = "brig physician's locker" @@ -208,7 +196,6 @@ New() ..() - sleep(2) if(prob(50)) new /obj/item/weapon/storage/backpack/medic(src) else @@ -225,7 +212,6 @@ new /obj/item/clothing/shoes/white(src) new /obj/item/device/radio/headset/headset_sec/alt(src) new /obj/item/clothing/shoes/sandal/white(src) - return /obj/structure/closet/secure_closet/blueshield name = "blueshield's locker" @@ -239,7 +225,6 @@ New() ..() - sleep(2) new /obj/item/weapon/storage/briefcase(src) new /obj/item/weapon/storage/firstaid/adv(src) new /obj/item/weapon/storage/belt/security/sec(src) @@ -257,7 +242,6 @@ new /obj/item/clothing/accessory/holster(src) new /obj/item/clothing/accessory/blue(src) new /obj/item/clothing/shoes/jackboots/jacksandals(src) - return /obj/structure/closet/secure_closet/ntrep name = "\improper Nanotrasen Representative's locker" @@ -271,7 +255,6 @@ New() ..() - sleep(2) new /obj/item/weapon/storage/briefcase(src) new /obj/item/device/paicard(src) new /obj/item/device/flash(src) @@ -283,7 +266,6 @@ new /obj/item/clothing/under/lawyer/female(src) new /obj/item/clothing/head/ntrep(src) new /obj/item/clothing/shoes/sandal/fancy(src) - return /obj/structure/closet/secure_closet/security/cargo @@ -292,7 +274,6 @@ ..() new /obj/item/clothing/accessory/armband/cargo(src) new /obj/item/device/encryptionkey/headset_cargo(src) - return /obj/structure/closet/secure_closet/security/engine @@ -300,7 +281,6 @@ ..() new /obj/item/clothing/accessory/armband/engine(src) new /obj/item/device/encryptionkey/headset_eng(src) - return /obj/structure/closet/secure_closet/security/science @@ -308,7 +288,6 @@ ..() new /obj/item/clothing/accessory/armband/science(src) new /obj/item/device/encryptionkey/headset_sci(src) - return /obj/structure/closet/secure_closet/security/med @@ -316,7 +295,6 @@ ..() new /obj/item/clothing/accessory/armband/medgreen(src) new /obj/item/device/encryptionkey/headset_med(src) - return /obj/structure/closet/secure_closet/detective @@ -331,7 +309,6 @@ New() ..() - sleep(2) new /obj/item/clothing/under/det(src) new /obj/item/clothing/suit/storage/det_suit(src) new /obj/item/clothing/suit/storage/forensics/blue(src) @@ -351,7 +328,6 @@ new /obj/item/clothing/accessory/holster/armpit(src) new /obj/item/clothing/glasses/sunglasses/yeah(src) new /obj/item/device/flashlight/seclite(src) - return /obj/structure/closet/secure_closet/detective/update_icon() if(broken) @@ -372,10 +348,8 @@ New() ..() - sleep(2) new /obj/item/weapon/reagent_containers/ld50_syringe/lethal(src) new /obj/item/weapon/reagent_containers/ld50_syringe/lethal(src) - return @@ -386,9 +360,9 @@ var/id = null New() + ..() new /obj/item/clothing/under/color/orange/prison( src ) new /obj/item/clothing/shoes/orange( src ) - return @@ -398,7 +372,6 @@ New() ..() - sleep(2) new /obj/item/clothing/shoes/brown(src) new /obj/item/weapon/paper/Court (src) new /obj/item/weapon/paper/Court (src) @@ -407,7 +380,6 @@ new /obj/item/clothing/suit/judgerobe (src) new /obj/item/clothing/head/powdered_wig (src) new /obj/item/weapon/storage/briefcase(src) - return /obj/structure/closet/secure_closet/wall name = "wall locker" diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index a315e598819..8a701bedd72 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -108,8 +108,6 @@ health -= Proj.damage check_health() - return - /obj/structure/closet/statue/attack_animal(mob/living/simple_animal/user as mob) if(user.environment_smash) for(var/mob/M in src) diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 52c789f9c43..e4aa901436e 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -11,7 +11,6 @@ /obj/structure/closet/syndicate/personal/New() ..() - sleep(2) new /obj/item/clothing/under/syndicate(src) new /obj/item/clothing/shoes/black(src) new /obj/item/ammo_box/magazine/m10mm(src) @@ -24,7 +23,6 @@ /obj/structure/closet/syndicate/suits/New() ..() - sleep(2) new /obj/item/clothing/head/helmet/space/rig/syndi(src) new /obj/item/clothing/mask/gas/syndicate(src) new /obj/item/clothing/suit/space/rig/syndi(src) @@ -35,7 +33,6 @@ /obj/structure/closet/syndicate/nuclear/New() ..() - sleep(2) new /obj/item/ammo_box/magazine/m10mm(src) new /obj/item/ammo_box/magazine/m10mm(src) new /obj/item/ammo_box/magazine/m10mm(src) @@ -55,7 +52,6 @@ new /obj/item/weapon/pinpointer/nukeop(src) new /obj/item/weapon/pinpointer/nukeop(src) new /obj/item/device/pda/syndicate(src) - return /obj/structure/closet/syndicate/resources/ desc = "An old, dusty locker." @@ -67,9 +63,6 @@ var/rare_min = 5 //Minimum HONK of HONK in the stack HONK HONK rare minerals var/rare_max = 20 //Maximum HONK HONK HONK in the HONK for HONK rare HONK - - sleep(2) - var/pickednum = rand(1, 50) //Sad trombone @@ -114,12 +107,11 @@ if(pickednum == 50) new /obj/item/weapon/tank/jetpack/carbondioxide(src) - return - /obj/structure/closet/syndicate/resources/everything desc = "It's an emergency storage closet for repairs." New() + ..() var/list/resources = list( /obj/item/stack/sheet/metal, /obj/item/stack/sheet/glass, @@ -133,11 +125,7 @@ /obj/item/stack/rods ) - sleep(2) - - for(var/i = 0, i<2, i++) + for(var/i in 1 to 2) for(var/res in resources) var/obj/item/stack/R = new res(src) - R.amount = R.max_amount - - return \ No newline at end of file + R.amount = R.max_amount \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index 9fc267f35fe..c99790c4011 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -80,8 +80,7 @@ /obj/structure/closet/firecloset/full/New() ..() - sleep(4) - contents = list() + contents.Cut() new /obj/item/clothing/suit/fire/firefighter(src) new /obj/item/clothing/mask/gas(src) @@ -167,7 +166,6 @@ /obj/structure/closet/bombcloset/New() ..() - sleep(2) new /obj/item/clothing/suit/bomb_suit( src ) new /obj/item/clothing/under/color/black( src ) new /obj/item/clothing/shoes/black( src ) @@ -183,7 +181,6 @@ /obj/structure/closet/bombclosetsecurity/New() ..() - sleep(2) new /obj/item/clothing/suit/bomb_suit/security( src ) new /obj/item/clothing/under/rank/security( src ) new /obj/item/clothing/shoes/brown( src ) @@ -204,7 +201,6 @@ /obj/structure/closet/hydrant/New() ..() - sleep(2) new /obj/item/clothing/suit/fire/firefighter(src) new /obj/item/clothing/mask/gas(src) new /obj/item/device/flashlight(src) diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 8656b60aad5..9b5cb514558 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -9,7 +9,6 @@ /obj/structure/closet/wardrobe/generic/New() ..() - sleep(2) new /obj/item/clothing/under/color/blue(src) new /obj/item/clothing/under/color/blue(src) new /obj/item/clothing/under/color/blue(src) @@ -19,7 +18,6 @@ new /obj/item/clothing/shoes/brown(src) new /obj/item/clothing/shoes/brown(src) new /obj/item/clothing/shoes/brown(src) - return /obj/structure/closet/wardrobe/red @@ -29,7 +27,6 @@ /obj/structure/closet/wardrobe/red/New() ..() - sleep(2) new /obj/item/weapon/storage/backpack/duffel/security(src) new /obj/item/weapon/storage/backpack/duffel/security(src) new /obj/item/clothing/mask/bandana/red(src) @@ -54,8 +51,6 @@ new /obj/item/clothing/head/beret/sec(src) new /obj/item/clothing/head/beret/sec(src) - return - /obj/structure/closet/redcorp name = "corporate security wardrobe" icon_state = "red" @@ -63,7 +58,6 @@ /obj/structure/closet/redcorp/New() ..() - sleep(2) new /obj/item/clothing/under/rank/security/corp(src) new /obj/item/clothing/under/rank/security/corp(src) new /obj/item/clothing/under/rank/security/corp(src) @@ -78,14 +72,12 @@ /obj/structure/closet/wardrobe/pink/New() ..() - sleep(2) new /obj/item/clothing/under/color/pink(src) new /obj/item/clothing/under/color/pink(src) new /obj/item/clothing/under/color/pink(src) new /obj/item/clothing/shoes/brown(src) new /obj/item/clothing/shoes/brown(src) new /obj/item/clothing/shoes/brown(src) - return /obj/structure/closet/wardrobe/black name = "black wardrobe" @@ -94,7 +86,6 @@ /obj/structure/closet/wardrobe/black/New() ..() - sleep(2) new /obj/item/clothing/under/color/black(src) new /obj/item/clothing/under/color/black(src) new /obj/item/clothing/under/color/black(src) @@ -109,7 +100,6 @@ new /obj/item/clothing/head/soft/black(src) new /obj/item/clothing/head/soft/black(src) new /obj/item/clothing/head/soft/black(src) - return /obj/structure/closet/wardrobe/green name = "green wardrobe" @@ -118,14 +108,12 @@ /obj/structure/closet/wardrobe/green/New() ..() - sleep(2) new /obj/item/clothing/under/color/green(src) new /obj/item/clothing/under/color/green(src) new /obj/item/clothing/under/color/green(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) - return /obj/structure/closet/wardrobe/xenos name = "xenos wardrobe" @@ -134,13 +122,11 @@ /obj/structure/closet/wardrobe/xenos/New() ..() - sleep(2) new /obj/item/clothing/suit/unathi/mantle(src) new /obj/item/clothing/suit/unathi/robe(src) new /obj/item/clothing/shoes/sandal(src) new /obj/item/clothing/shoes/sandal(src) new /obj/item/clothing/shoes/sandal(src) - return /obj/structure/closet/wardrobe/orange @@ -151,14 +137,12 @@ /obj/structure/closet/wardrobe/orange/New() ..() - sleep(2) new /obj/item/clothing/under/color/orange/prison(src) new /obj/item/clothing/under/color/orange/prison(src) new /obj/item/clothing/under/color/orange/prison(src) new /obj/item/clothing/shoes/orange(src) new /obj/item/clothing/shoes/orange(src) new /obj/item/clothing/shoes/orange(src) - return /obj/structure/closet/wardrobe/yellow @@ -168,14 +152,12 @@ /obj/structure/closet/wardrobe/yellow/New() ..() - sleep(2) new /obj/item/clothing/under/color/yellow(src) new /obj/item/clothing/under/color/yellow(src) new /obj/item/clothing/under/color/yellow(src) new /obj/item/clothing/shoes/orange(src) new /obj/item/clothing/shoes/orange(src) new /obj/item/clothing/shoes/orange(src) - return /obj/structure/closet/wardrobe/atmospherics_yellow @@ -185,7 +167,6 @@ /obj/structure/closet/wardrobe/atmospherics_yellow/New() ..() - sleep(2) new /obj/item/clothing/under/rank/atmospheric_technician(src) new /obj/item/clothing/under/rank/atmospheric_technician(src) new /obj/item/clothing/under/rank/atmospheric_technician(src) @@ -198,7 +179,6 @@ new /obj/item/clothing/head/beret/atmos(src) new /obj/item/clothing/head/beret/atmos(src) new /obj/item/clothing/head/beret/atmos(src) - return @@ -209,7 +189,6 @@ /obj/structure/closet/wardrobe/engineering_yellow/New() ..() - sleep(2) new /obj/item/clothing/under/rank/engineer(src) new /obj/item/clothing/under/rank/engineer(src) new /obj/item/clothing/under/rank/engineer(src) @@ -222,7 +201,6 @@ new /obj/item/clothing/head/beret/eng(src) new /obj/item/clothing/head/beret/eng(src) new /obj/item/clothing/head/beret/eng(src) - return /obj/structure/closet/wardrobe/white @@ -232,14 +210,12 @@ /obj/structure/closet/wardrobe/white/New() ..() - sleep(2) new /obj/item/clothing/under/color/white(src) new /obj/item/clothing/under/color/white(src) new /obj/item/clothing/under/color/white(src) new /obj/item/clothing/shoes/white(src) new /obj/item/clothing/shoes/white(src) new /obj/item/clothing/shoes/white(src) - return /obj/structure/closet/wardrobe/medical_white name = "medical doctor's wardrobe" @@ -248,7 +224,6 @@ /obj/structure/closet/wardrobe/medical_white/New() ..() - sleep(2) new /obj/item/clothing/under/rank/nursesuit (src) new /obj/item/clothing/head/nursehat (src) new /obj/item/clothing/under/rank/nurse(src) @@ -265,7 +240,6 @@ new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) - return /obj/structure/closet/wardrobe/pjs name = "Pajama wardrobe" @@ -274,7 +248,6 @@ /obj/structure/closet/wardrobe/pjs/New() ..() - sleep(2) new /obj/item/clothing/under/pj/red(src) new /obj/item/clothing/under/pj/red(src) new /obj/item/clothing/under/pj/blue(src) @@ -283,7 +256,6 @@ new /obj/item/clothing/shoes/white(src) new /obj/item/clothing/shoes/slippers(src) new /obj/item/clothing/shoes/slippers(src) - return /obj/structure/closet/wardrobe/toxins_white @@ -293,7 +265,6 @@ /obj/structure/closet/wardrobe/toxins_white/New() ..() - sleep(2) new /obj/item/clothing/under/rank/scientist(src) new /obj/item/clothing/under/rank/scientist(src) new /obj/item/clothing/under/rank/scientist(src) @@ -306,7 +277,6 @@ new /obj/item/clothing/shoes/slippers new /obj/item/clothing/shoes/slippers new /obj/item/clothing/shoes/slippers - return /obj/structure/closet/wardrobe/robotics_black @@ -316,7 +286,6 @@ /obj/structure/closet/wardrobe/robotics_black/New() ..() - sleep(2) new /obj/item/clothing/glasses/hud/diagnostic(src) new /obj/item/clothing/glasses/hud/diagnostic(src) new /obj/item/clothing/under/rank/roboticist(src) @@ -329,7 +298,6 @@ new /obj/item/clothing/gloves/fingerless(src) new /obj/item/clothing/head/soft/black(src) new /obj/item/clothing/head/soft/black(src) - return /obj/structure/closet/wardrobe/chemistry_white @@ -339,7 +307,6 @@ /obj/structure/closet/wardrobe/chemistry_white/New() ..() - sleep(2) new /obj/item/clothing/under/rank/chemist(src) new /obj/item/clothing/under/rank/chemist(src) new /obj/item/clothing/shoes/white(src) @@ -354,7 +321,6 @@ new /obj/item/weapon/storage/bag/chemistry(src) new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/mask/gas(src) - return /obj/structure/closet/wardrobe/genetics_white @@ -364,7 +330,6 @@ /obj/structure/closet/wardrobe/genetics_white/New() ..() - sleep(2) new /obj/item/clothing/under/rank/geneticist(src) new /obj/item/clothing/under/rank/geneticist(src) new /obj/item/clothing/shoes/white(src) @@ -375,7 +340,6 @@ new /obj/item/weapon/storage/backpack/genetics(src) new /obj/item/weapon/storage/backpack/satchel_gen(src) new /obj/item/weapon/storage/backpack/satchel_gen(src) - return /obj/structure/closet/wardrobe/virology_white @@ -385,7 +349,6 @@ /obj/structure/closet/wardrobe/virology_white/New() ..() - sleep(2) new /obj/item/clothing/under/rank/virologist(src) new /obj/item/clothing/under/rank/virologist(src) new /obj/item/clothing/shoes/white(src) @@ -398,7 +361,6 @@ new /obj/item/weapon/storage/backpack/virology(src) new /obj/item/weapon/storage/backpack/satchel_vir(src) new /obj/item/weapon/storage/backpack/satchel_vir(src) - return /obj/structure/closet/wardrobe/medic_white @@ -408,7 +370,6 @@ /obj/structure/closet/wardrobe/medic_white/New() ..() - sleep(2) new /obj/item/clothing/under/rank/medical(src) new /obj/item/clothing/under/rank/medical(src) new /obj/item/clothing/under/rank/medical/blue(src) @@ -420,7 +381,6 @@ new /obj/item/clothing/suit/storage/labcoat(src) new /obj/item/clothing/mask/surgical(src) new /obj/item/clothing/mask/surgical(src) - return /obj/structure/closet/wardrobe/grey @@ -430,7 +390,6 @@ /obj/structure/closet/wardrobe/grey/New() ..() - sleep(2) new /obj/item/clothing/under/color/grey(src) new /obj/item/clothing/under/color/grey(src) new /obj/item/clothing/under/color/grey(src) @@ -446,7 +405,6 @@ new /obj/item/clothing/under/assistantformal(src) if(prob(40)) new /obj/item/clothing/under/assistantformal(src) - return /obj/structure/closet/wardrobe/mixed @@ -456,7 +414,6 @@ /obj/structure/closet/wardrobe/mixed/New() ..() - sleep(2) new /obj/item/clothing/under/color/blue(src) new /obj/item/clothing/under/color/yellow(src) new /obj/item/clothing/under/color/green(src) @@ -471,4 +428,3 @@ new /obj/item/clothing/shoes/orange(src) new /obj/item/clothing/shoes/purple(src) new /obj/item/clothing/shoes/leather(src) - return diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index e91df4762df..c4129596892 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -212,7 +212,6 @@ return src.add_fingerprint(user) src.toggle(user) - return // Called when a crate is delivered by MULE at a location, for notifying purposes /obj/structure/closet/crate/proc/notifyRecipient(var/destination) @@ -317,7 +316,6 @@ src.broken = 1 update_icon() to_chat(user, "You unlock \the [src].") - return /obj/structure/closet/crate/secure/emp_act(severity) for(var/obj/O in src) @@ -513,7 +511,6 @@ if(!M.anchored) M.forceMove(src) break - return /obj/structure/closet/crate/secure/large name = "large crate" @@ -541,7 +538,6 @@ if(!M.anchored) M.forceMove(src) break - return //fluff variant /obj/structure/closet/crate/secure/large/reinforced diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index cbdce196c47..30dec267502 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -274,3 +274,12 @@ mineral = "metal" walltype = "iron" canSmoothWith = list(/obj/structure/falsewall/iron, /turf/simulated/wall/mineral/iron) + +/obj/structure/falsewall/abductor + name = "alien wall" + desc = "A wall with alien alloy plating." + icon = 'icons/turf/walls/abductor_wall.dmi' + icon_state = "abductor" + mineral = "abductor" + walltype = "abductor" + canSmoothWith = list(/obj/structure/falsewall/abductor, /turf/simulated/wall/mineral/abductor) \ No newline at end of file diff --git a/code/game/objects/structures/fullwindow.dm b/code/game/objects/structures/fullwindow.dm index fda64fcb740..ac6e57a4135 100644 --- a/code/game/objects/structures/fullwindow.dm +++ b/code/game/objects/structures/fullwindow.dm @@ -89,12 +89,18 @@ health = 160 reinf = 1 - New() - ..() - color = null +/obj/structure/window/full/shuttle/New() + ..() + color = null - update_icon() //icon_state has to be set manually - return +/obj/structure/window/full/shuttle/update_icon() //icon_state has to be set manually + return + +/obj/structure/window/full/shuttle/shuttleRotate(rotation) + ..() + var/matrix/M = transform + M.Turn(rotation) + transform = M /obj/structure/window/full/shuttle/dark icon = 'icons/turf/shuttle.dmi' diff --git a/code/game/objects/structures/spirit_board.dm b/code/game/objects/structures/spirit_board.dm index cb29dec1926..25fe7f4a134 100644 --- a/code/game/objects/structures/spirit_board.dm +++ b/code/game/objects/structures/spirit_board.dm @@ -10,13 +10,6 @@ var/planchette = "A" var/lastuser = null -/obj/structure/spirit_board/proc/announce_to_ghosts() - for(var/mob/dead/observer/O in player_list) - if(O.client) - var/area/A = get_area(src) - if(A) - to_chat(O, "\blue Someone has begun playing with a [src.name] in [A.name]!. (Teleport)") - /obj/structure/spirit_board/examine(mob/user) ..(user) to_chat(user, "[initial(desc)] The planchette is sitting at \"[planchette]\".") @@ -37,7 +30,7 @@ if(virgin) virgin = 0 - announce_to_ghosts() + notify_ghosts("Someone has begun playing with a [src.name] in [get_area(src)]!", source = src) planchette = input("Choose the letter.", "Seance!") in list("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z") add_logs(M, src, "picked a letter on", addition="which was \"[planchette]\".") diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm index f0d0544bd45..820103eb2d4 100644 --- a/code/game/shuttle_engines.dm +++ b/code/game/shuttle_engines.dm @@ -2,6 +2,12 @@ name = "shuttle" icon = 'icons/turf/shuttle.dmi' +/obj/structure/shuttle/shuttleRotate(rotation) + ..() + var/matrix/M = transform + M.Turn(rotation) + transform = M + /obj/structure/shuttle/window name = "shuttle window" icon = 'icons/obj/podwindows.dmi' diff --git a/code/game/turfs/simulated/floor/mineral.dm b/code/game/turfs/simulated/floor/mineral.dm new file mode 100644 index 00000000000..9ef70522ec4 --- /dev/null +++ b/code/game/turfs/simulated/floor/mineral.dm @@ -0,0 +1,48 @@ +/turf/simulated/floor/mineral + name = "mineral floor" + icon_state = "" + var/list/icons = list() + + + +/turf/simulated/floor/mineral/New() + ..() + broken_states = list("[initial(icon_state)]_dam") + +/turf/simulated/floor/mineral/update_icon() + if(!..()) + return 0 + if(!broken && !burnt) + if( !(icon_state in icons) ) + icon_state = initial(icon_state) + +// ALIEN ALLOY +/turf/simulated/floor/mineral/abductor + name = "alien floor" + icon_state = "alienpod1" + floor_tile = /obj/item/stack/tile/mineral/abductor + icons = list("alienpod1", "alienpod2", "alienpod3", "alienpod4", "alienpod5", "alienpod6", "alienpod7", "alienpod8", "alienpod9") + +/turf/simulated/floor/mineral/New() + ..() + icon_state = "alienpod[rand(1,9)]" + +/turf/simulated/floor/mineral/break_tile() + return //unbreakable + +/turf/simulated/floor/mineral/abductor/burn_tile() + return //unburnable + +/turf/simulated/floor/mineral/abductor/make_plating() + return ChangeTurf(/turf/simulated/floor/plating/abductor2) + + +/turf/simulated/floor/plating/abductor2 + name = "alien plating" + icon_state = "alienplating" + +/turf/simulated/floor/plating/abductor2/break_tile() + return //unbreakable + +/turf/simulated/floor/plating/abductor2/burn_tile() + return //unburnable \ No newline at end of file diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 2a239ea04ee..764ca6055d4 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -292,4 +292,12 @@ /turf/simulated/floor/plasteel/airless/New() ..() - name = "floor" \ No newline at end of file + name = "floor" + +/turf/simulated/floor/plating/abductor + name = "alien floor" + icon_state = "alienpod1" + +/turf/simulated/floor/plating/abductor/New() + ..() + icon_state = "alienpod[rand(1,9)]" diff --git a/code/game/turfs/simulated/shuttle.dm b/code/game/turfs/simulated/shuttle.dm index b8d22325d7a..a169d588dd2 100644 --- a/code/game/turfs/simulated/shuttle.dm +++ b/code/game/turfs/simulated/shuttle.dm @@ -36,7 +36,8 @@ T.transform = transform //why don't shuttle walls habe smoothwall? now i gotta do rotation the dirty way -/turf/simulated/shuttle/wall/shuttleRotate(rotation) +/turf/simulated/shuttle/shuttleRotate(rotation) + ..() var/matrix/M = transform M.Turn(rotation) transform = M diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm index fa12e8b0ec2..8a36ea5af6b 100644 --- a/code/game/turfs/simulated/walls_mineral.dm +++ b/code/game/turfs/simulated/walls_mineral.dm @@ -175,4 +175,14 @@ icon_state = "iron" walltype = "iron" mineral = "rods" - canSmoothWith = list(/turf/simulated/wall/mineral/iron, /obj/structure/falsewall/iron) \ No newline at end of file + canSmoothWith = list(/turf/simulated/wall/mineral/iron, /obj/structure/falsewall/iron) + +/turf/simulated/wall/mineral/abductor + name = "alien wall" + desc = "A wall with alien alloy plating." + icon = 'icons/turf/walls/abductor_wall.dmi' + icon_state = "abductor" + walltype = "abductor" + mineral = "abductor" + explosion_block = 3 + canSmoothWith = list(/turf/simulated/wall/mineral/abductor, /obj/structure/falsewall/abductor) \ No newline at end of file diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm index 70cb8bf9b38..b4e8842a840 100644 --- a/code/game/turfs/unsimulated/floor.dm +++ b/code/game/turfs/unsimulated/floor.dm @@ -27,4 +27,12 @@ /turf/unsimulated/floor/chasm/New() spawn(1) smooth_icon(src) - smooth_icon_neighbors(src) \ No newline at end of file + smooth_icon_neighbors(src) + +/turf/unsimulated/floor/abductor + name = "alien floor" + icon_state = "alienpod1" + +/turf/unsimulated/floor/abductor/New() + ..() + icon_state = "alienpod[rand(1,9)]" \ No newline at end of file diff --git a/code/game/turfs/unsimulated/walls.dm b/code/game/turfs/unsimulated/walls.dm index 7926a864c49..571983f0966 100644 --- a/code/game/turfs/unsimulated/walls.dm +++ b/code/game/turfs/unsimulated/walls.dm @@ -23,4 +23,8 @@ turf/unsimulated/wall/splashscreen layer = FLY_LAYER /turf/unsimulated/wall/other - icon_state = "r_wall" \ No newline at end of file + icon_state = "r_wall" + +/turf/unsimulated/wall/abductor + icon_state = "alien1" + explosion_block = 50 \ No newline at end of file diff --git a/code/game/vehicles/spacepods/spacepod.dm b/code/game/vehicles/spacepods/spacepod.dm index 95ef15b1922..8ed498be025 100644 --- a/code/game/vehicles/spacepods/spacepod.dm +++ b/code/game/vehicles/spacepods/spacepod.dm @@ -713,23 +713,18 @@ set category = "Spacepod" set src = usr.loc - var/list/pod_door_types = list(/obj/machinery/door/poddoor/two_tile_hor/, /obj/machinery/door/poddoor/two_tile_ver/, \ - /obj/machinery/door/poddoor/three_tile_hor, /obj/machinery/door/poddoor/three_tile_ver, \ - /obj/machinery/door/poddoor/four_tile_hor, /obj/machinery/door/poddoor/four_tile_ver) - if(CheckIfOccupant2(usr)) return - for(var/obj/machinery/door/poddoor/P in orange(3,src)) - if(is_type_in_list(P,pod_door_types)) - var/mob/living/carbon/human/L = usr - if(P.check_access(L.get_active_hand()) || P.check_access(L.wear_id)) - if(P.density) - P.open() - return 1 - else - P.close() - return 1 - to_chat(usr, "Access denied.") - return + for(var/obj/machinery/door/poddoor/multi_tile/P in orange(3,src)) + var/mob/living/carbon/human/L = usr + if(P.check_access(L.get_active_hand()) || P.check_access(L.wear_id)) + if(P.density) + P.open() + return 1 + else + P.close() + return 1 + to_chat(usr, "Access denied.") + return to_chat(usr, "You are not close to any pod doors.") return diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 932fcef0807..6e4f58c5ab2 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -749,6 +749,10 @@ var/global/nologevent = 0 if (ticker.mode.config_tag == "changeling") return 2 return 1 + if(M.mind in ticker.mode.abductors) + if (ticker.mode.config_tag == "abduction") + return 2 + return 1 if(isrobot(M)) var/mob/living/silicon/robot/R = M if(R.emagged) diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 30277f3a4ab..2a4a3e9cdeb 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -515,6 +515,12 @@ if(ticker.mode.shadowling_thralls.len) dat += check_role_table("Shadowling Thralls", ticker.mode.shadowling_thralls, src) + if(ticker.mode.abductors.len) + dat += check_role_table("Abductors", ticker.mode.abductors, src) + + if(ticker.mode.abductees.len) + dat += check_role_table("Abductees", ticker.mode.abductees, src) + if(ticker.mode.vampires.len) dat += check_role_table("Vampires", ticker.mode.vampires, src) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 60e196c7982..f93e8c416bf 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -63,6 +63,10 @@ log_admin("[key_name(usr)] has spawned vox raiders.") if(!src.makeVoxRaiders()) to_chat(usr, "\red Unfortunately there weren't enough candidates available.") + if("9") + log_admin("[key_name(usr)] has spawned an abductor team.") + if(!src.makeAbductorTeam()) + to_chat(usr, "\red Unfortunately there weren't enough candidates available.") else if(href_list["dbsearchckey"] || href_list["dbsearchadmin"] || href_list["dbsearchip"] || href_list["dbsearchcid"] || href_list["dbsearchbantype"]) var/adminckey = href_list["dbsearchadmin"] diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index ddc3b4456e6..4793edd37c8 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -682,7 +682,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(M), slot_head) - M.equip_to_slot_or_del(new /obj/item/weapon/cloaking_device(M), slot_r_store) M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/proto(M), slot_r_hand) M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_l_store) @@ -814,7 +813,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/clothing/suit/wcoat(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store) - M.equip_to_slot_or_del(new /obj/item/weapon/cloaking_device(M), slot_r_store) var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = new(M) for(var/obj/item/briefcase_item in sec_briefcase) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 022cd29105a..f2d76051a37 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -21,6 +21,7 @@ client/proc/one_click_antag() Make Wizard (Requires Ghosts)
Make Vampires
Make Vox Raiders (Requires Ghosts)
+ Make Abductor Team (Requires Ghosts)
"} usr << browse(dat, "window=oneclickantag;size=400x400") return @@ -308,8 +309,10 @@ client/proc/one_click_antag() return 1 - - +//Abductors +/datum/admins/proc/makeAbductorTeam() + new /datum/event/abductor + return 1 /datum/admins/proc/makeAliens() alien_infestation(3) @@ -396,7 +399,7 @@ client/proc/one_click_antag() //First we spawn a dude. var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned. - var/datum/preferences/A = new() + var/datum/preferences/A = new(G_found.client) A.copy_to(new_character) new_character.dna.ready_dna(new_character) diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index d6d6352f333..7a5835a3f9d 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -110,7 +110,7 @@ if(href_list["send"]) spawn( 0 ) - signal() + signal() if(usr) attack_self(usr) @@ -169,6 +169,7 @@ desc = "The neutralized core of an anomaly. It'd probably be valuable for research." icon_state = "anomaly core" item_state = "electronic" + receiving = 1 /obj/item/device/assembly/signaler/anomaly/receive_signal(datum/signal/signal) ..() diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index fa6d0015399..30e4793c747 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -81,4 +81,7 @@ control_freak = CONTROL_FREAK_ALL | CONTROL_FREAK_SKIN | CONTROL_FREAK_MACROS - var/datum/click_intercept/click_intercept = null \ No newline at end of file + var/datum/click_intercept/click_intercept = null + + //datum that controls the displaying and hiding of tooltips + var/datum/tooltip/tooltips \ No newline at end of file diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 31db10045f0..57b7487cbe5 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -317,6 +317,10 @@ to_chat(src, "Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you.") + //This is down here because of the browse() calls in tooltip/New() + if(!tooltips) + tooltips = new /datum/tooltip(src) + ////////////// //DISCONNECT// ////////////// diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index ccd7eda05e5..e458ebb7a14 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -25,6 +25,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts ROLE_NINJA = 21, ROLE_MUTINEER = 21, ROLE_MALF = 30, + ROLE_ABDUCTOR = 30, ) /proc/player_old_enough_antag(client/C, role) diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 066c4893f73..c9a8cbe13cb 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -190,112 +190,217 @@ piece.flags &= ~(STOPSPRESSUREDMAGE|AIRTIGHT) update_icon(1) -/obj/item/weapon/rig/proc/toggle_seals(var/mob/living/carbon/human/M, var/mob/living/user, var/instant) - - if(sealing) return - - if(!check_power_cost(M, 1)) //costs tiny amount of power to unseal/seal +/obj/item/weapon/rig/proc/seal(mob/living/user) + if(sealing) return 0 - deploy(M, instant) + if(!wearer || !user) + return - var/seal_target = (flags & NODROP) - var/failed_to_seal + var/sealed = (flags & NODROP) + if(sealed) + to_chat(user, "\The [src] is already sealed!") + return 0 - flags |= NODROP // No removing the suit while unsealing. - sealing = 1 + if(!check_power_cost(user, 1)) //need power to seal the suit + return 0 - if(!seal_target && !suit_is_deployed()) - M.visible_message("[M]'s suit flashes an error light.","Your suit flashes an error light. It can't function properly without being fully deployed.") - failed_to_seal = 1 + var/failed_to_seal = FALSE + + if(!suit_is_deployed()) + to_chat(user, "\The [src] cannot seal, as it is not fully deployed!") + return 0 + + flags |= NODROP + sealing = TRUE + + to_chat(user, "\The [src] begins to tighten it's seals.") + wearer.visible_message("\The [wearer]'s suit emits a quiet hum as it begins to tighten it's seals.", + "With a quiet hum, your suit begins to seal.") + + if(seal_delay && !do_after(user, seal_delay, target = wearer)) + to_chat(user, "You must remain still to seal \the [src]!") + failed_to_seal = TRUE if(!failed_to_seal) + deploy(user) - if(!instant) - M.visible_message("[M]'s suit emits a quiet hum as it begins to adjust its seals.","With a quiet hum, the suit begins running checks and adjusting components.") - if(seal_delay && !do_after(user, seal_delay, target = M)) - if(user) - to_chat(user, "You must remain still while the suit is adjusting the components.") - failed_to_seal = 1 + var/list/pieces_data = list(list(wearer.shoes, boots, "boots", boot_type), + list(wearer.gloves, gloves, "gloves", glove_type), + list(wearer.head, helmet, "helmet", helm_type), + list(wearer.wear_suit, chest, "chest", chest_type)) - if(!M) - failed_to_seal = 1 - else - for(var/list/piece_data in list(list(M.shoes,boots,"boots",boot_type),list(M.gloves,gloves,"gloves",glove_type),list(M.head,helmet,"helmet",helm_type),list(M.wear_suit,chest,"chest",chest_type))) + for(var/list/piece_data in pieces_data) + var/obj/item/user_piece = piece_data[1] + var/obj/item/correct_piece = piece_data[2] + var/msg_type = piece_data[3] + var/piece_type = piece_data[4] - var/obj/item/piece = piece_data[1] - var/obj/item/compare_piece = piece_data[2] - var/msg_type = piece_data[3] - var/piece_type = piece_data[4] + if(!user_piece || !piece_type) + continue - if(!piece || !piece_type) - continue + if(user_piece != correct_piece) + to_chat(user, "\The [user_piece] is blocking \the [src] from deploying.") + failed_to_seal = TRUE - if(!istype(M) || !istype(piece) || !istype(compare_piece) || !msg_type) - if(M) - to_chat(M, "You must remain still while the suit is adjusting the components.") - failed_to_seal = 1 - break + if(seal_delay && !do_after(user, seal_delay, needhand = 0, target = wearer)) + to_chat(user, "You must remain still to seal \the [src]!") + failed_to_seal = TRUE - if(!failed_to_seal && M.back == src && piece == compare_piece) + if(failed_to_seal) + break - if(seal_delay && !instant && !do_after(user, seal_delay, needhand = 0, target = M)) - failed_to_seal = 1 + correct_piece.icon_state = "[initial(icon_state)]_sealed" + switch(msg_type) + if("boots") + to_chat(wearer, "\The [correct_piece] seal around your feet.") + if(user != wearer) + to_chat(user, "\The [correct_piece] has been sealed.") + wearer.update_inv_shoes() + if("gloves") + to_chat(wearer, "\The [correct_piece] tighten around your fingers and wrists.") + if(user != wearer) + to_chat(user, "\The [correct_piece] has been sealed.") + wearer.update_inv_gloves() + if("chest") + to_chat(wearer, "\The [correct_piece] cinches tight again your chest.") + if(user != wearer) + to_chat(user, "\The [correct_piece] has been sealed.") + wearer.update_inv_wear_suit() + if("helmet") + to_chat(wearer, "\The [correct_piece] hisses closed.") + if(user != wearer) + to_chat(user, "\The [correct_piece] has been sealed.") + wearer.update_inv_head() + if(helmet) + helmet.update_light(wearer) - piece.icon_state = "[initial(icon_state)][!seal_target ? "_sealed" : ""]" - switch(msg_type) - if("boots") - to_chat(M, "\The [piece] [!seal_target ? "seal around your feet" : "relax their grip on your legs"].") - M.update_inv_shoes() - if("gloves") - to_chat(M, "\The [piece] [!seal_target ? "tighten around your fingers and wrists" : "become loose around your fingers"].") - M.update_inv_gloves() - if("chest") - to_chat(M, "\The [piece] [!seal_target ? "cinches tight again your chest" : "releases your chest"].") - M.update_inv_wear_suit() - if("helmet") - to_chat(M, "\The [piece] hisses [!seal_target ? "closed" : "open"].") - M.update_inv_head() - if(helmet) - helmet.update_light(wearer) + correct_piece.armor["bio"] = 100 - //sealed pieces become airtight, protecting against diseases - if (!seal_target) - piece.armor["bio"] = 100 - else - piece.armor["bio"] = src.armor["bio"] - - else - failed_to_seal = 1 - - if((M && !(istype(M) && M.back == src) && !istype(M,/mob/living/silicon)) || (!seal_target && !suit_is_deployed())) - failed_to_seal = 1 - - sealing = null + sealing = FALSE if(failed_to_seal) - for(var/obj/item/piece in list(helmet,boots,gloves,chest)) - if(!piece) continue - piece.icon_state = "[initial(icon_state)][!seal_target ? "" : "_sealed"]" - if(seal_target) - flags |= NODROP - else - flags &= ~NODROP + for(var/obj/item/piece in list(helmet, boots, gloves, chest)) + if(!piece) + continue + piece.icon_state = "[initial(icon_state)]" + flags &= ~NODROP if(airtight) update_component_sealed() update_icon(1) return 0 - // Success! - if(seal_target) - flags &= ~NODROP - else - flags |= NODROP - to_chat(M, "Your entire suit [!(flags & NODROP) ? "loosens as the components relax" : "tightens around you as the components lock into place"].") + if(user != wearer) + to_chat(user, "\The [src] has been loosened.") + to_chat(wearer, "Your entire suit tightens around you as the components lock into place.") + if(airtight) + update_component_sealed() + update_icon(1) + +/obj/item/weapon/rig/proc/unseal(mob/living/user) + if(sealing) + return 0 + + if(!wearer || !user) + return + + var/sealed = (flags & NODROP) + if(!sealed) + to_chat(user, "\The [src] is already unsealed!") + return 0 + + sealing = TRUE + + var/failed_to_seal = FALSE + + if(!suit_is_deployed()) + to_chat(user, "\The [src] cannot unseal, as it is not fully deployed!") + failed_to_seal = TRUE + + if(!failed_to_seal) + if(user != wearer) + to_chat(user, "\The [src] begins to loosen it's seals.") + wearer.visible_message("\The [wearer]'s suit emits a quiet hum as it begins to loosen it's seals.", + "With a quiet hum, your suit begins to unseal.") + + if(seal_delay && !do_after(user, seal_delay, target = wearer)) + to_chat(user, "You must remain still to unseal \the [src]!") + failed_to_seal = TRUE + + if(!failed_to_seal) + var/list/pieces_data = list(list(wearer.shoes, boots, "boots", boot_type), + list(wearer.gloves, gloves, "gloves", glove_type), + list(wearer.head, helmet, "helmet", helm_type), + list(wearer.wear_suit, chest, "chest", chest_type)) + + for(var/list/piece_data in pieces_data) + var/obj/item/user_piece = piece_data[1] + var/obj/item/correct_piece = piece_data[2] + var/msg_type = piece_data[3] + var/piece_type = piece_data[4] + + if(!correct_piece || !piece_type) + continue + + if(user_piece != correct_piece) + to_chat(user, "\The [user_piece] is blocking \the [src] from deploying.") + failed_to_seal = TRUE + + if(seal_delay && !do_after(user, seal_delay, needhand = 0, target = wearer)) + to_chat(user, "You must remain still to unseal \the [src]!") + failed_to_seal = TRUE + + if(failed_to_seal) + break + + correct_piece.icon_state = "[initial(icon_state)]" + switch(msg_type) + if("boots") + to_chat(wearer, "\The [correct_piece] relax their grip on your legs.") + if(user != wearer) + to_chat(user, "\The [correct_piece] has been unsealed.") + wearer.update_inv_shoes() + if("gloves") + to_chat(wearer, "\The [correct_piece] become loose around your fingers.") + if(user != wearer) + to_chat(user, "\The [correct_piece] has been unsealed.") + wearer.update_inv_gloves() + if("chest") + to_chat(wearer, "\The [correct_piece] releases your chest.") + if(user != wearer) + to_chat(user, "\The [correct_piece] has been unsealed.") + wearer.update_inv_wear_suit() + if("helmet") + to_chat(wearer, "\The [correct_piece] hisses open.") + if(user != wearer) + to_chat(user, "\The [correct_piece] has been unsealed.") + wearer.update_inv_head() + if(helmet) + helmet.update_light(wearer) + + correct_piece.armor["bio"] = armor["bio"] + + sealing = FALSE + + if(failed_to_seal) + for(var/obj/item/piece in list(helmet, boots, gloves, chest)) + if(!piece) + continue + piece.icon_state = "[initial(icon_state)]_sealed" + if(airtight) + update_component_sealed() + update_icon(1) + return 0 + + if(user != wearer) + to_chat(user, "\The [src] has been unsealed.") + to_chat(wearer, "Your entire suit loosens as the components relax.") + + flags &= ~NODROP + + for(var/obj/item/rig_module/module in installed_modules) + module.deactivate() - if(!(flags & NODROP)) - for(var/obj/item/rig_module/module in installed_modules) - module.deactivate() if(airtight) update_component_sealed() update_icon(1) @@ -310,7 +415,6 @@ piece.flags |= AIRTIGHT /obj/item/weapon/rig/process() - // If we've lost any parts, grab them back. var/mob/living/M for(var/obj/item/piece in list(gloves,boots,helmet,chest)) @@ -367,7 +471,6 @@ cell.use(module.process()*10) /obj/item/weapon/rig/proc/check_power_cost(var/mob/living/user, var/cost, var/use_unconcious, var/obj/item/rig_module/mod, var/user_is_ai) - if(!istype(user)) return 0 @@ -524,7 +627,6 @@ return 1 -//TODO: Fix Topic vulnerabilities for malfunction and AI override. /obj/item/weapon/rig/Topic(href,href_list) if(!check_suit_access(usr)) return 0 @@ -532,11 +634,13 @@ if(href_list["toggle_piece"]) if(ishuman(usr) && (usr.stat || usr.stunned || usr.lying)) return 0 - toggle_piece(href_list["toggle_piece"], wearer, user = usr) + toggle_piece(href_list["toggle_piece"], usr) else if(href_list["toggle_seals"]) - toggle_seals(wearer, usr) + if(flags & NODROP) + unseal(usr) + else + seal(usr) else if(href_list["interact_module"]) - var/module_index = text2num(href_list["interact_module"]) if(module_index > 0 && module_index <= installed_modules.len) @@ -559,7 +663,7 @@ locked = !locked usr.set_machine(src) - src.add_fingerprint(usr) + add_fingerprint(usr) return 0 /obj/item/weapon/rig/proc/notify_ai(var/message) @@ -570,8 +674,11 @@ if(ai && ai.client && !ai.stat) to_chat(ai, "[message]") -/obj/item/weapon/rig/equipped(mob/living/carbon/human/M) +/obj/item/weapon/rig/equipped(mob/living/carbon/human/M, slot) ..() + if(!istype(M) || slot != slot_back) + return //we don't care about picking up/nonhumans + spawn(1) //equipped() is called BEFORE the item is actually set as the slot if(seal_delay > 0 && istype(M) && M.back == src) @@ -588,115 +695,108 @@ wearer.wearing_rig = src update_icon() -/obj/item/weapon/rig/proc/toggle_piece(var/piece, var/mob/living/carbon/human/H, var/deploy_mode, var/force, var/mob/living/user) +/obj/item/weapon/rig/proc/toggle_piece(var/piece, var/mob/living/user, var/deploy_mode, var/force) + if(!istype(wearer) || wearer.back != src) + if(force) //can only force retracting sorry + for(var/obj/item/uneq_piece in list(helmet, gloves, boots, chest)) + if(uneq_piece) + if(isliving(uneq_piece.loc)) + var/mob/living/L = uneq_piece.loc + L.unEquip(uneq_piece, 1) + uneq_piece.flags &= ~NODROP + uneq_piece.forceMove(src) + return 0 - if(!force) //forces the hardsuit to ignore most checks, as the suit being dropped should retract all pieces regardless of power status - if(sealing || !cell || !cell.charge) //or else you have issues with shit getting stuck - return + if(sealing || !cell || !cell.charge) + return 0 - if(!istype(wearer) || !wearer.back == src) - return - - if(usr == wearer && (usr.stat||usr.paralysis||usr.stunned)) // If the usr isn't wearing the suit it's probably an AI. - return + if(user == wearer && user.incapacitated()) // If the user isn't wearing the suit it's probably an AI. + return 0 var/obj/item/check_slot var/equip_to var/obj/item/use_obj - if(!H) - return - switch(piece) if("helmet") equip_to = slot_head use_obj = helmet - check_slot = H.head + check_slot = wearer.head if("gauntlets") equip_to = slot_gloves use_obj = gloves - check_slot = H.gloves + check_slot = wearer.gloves if("boots") equip_to = slot_shoes use_obj = boots - check_slot = H.shoes + check_slot = wearer.shoes if("chest") equip_to = slot_wear_suit use_obj = chest - check_slot = H.wear_suit + check_slot = wearer.wear_suit if(use_obj) - if(check_slot == use_obj && deploy_mode != ONLY_DEPLOY) - - var/mob/living/carbon/human/holder - - if(use_obj) - holder = use_obj.loc - if(istype(holder)) - if(use_obj && check_slot == use_obj) - to_chat(H, "Your [use_obj.name] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly.") - use_obj.flags &= ~NODROP - holder.unEquip(use_obj, 1) - use_obj.forceMove(src) - - else if (deploy_mode != ONLY_RETRACT) - if(check_slot) - if(check_slot != use_obj) - to_chat(H, "You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way.") + if(check_slot == use_obj && deploy_mode != ONLY_DEPLOY) //user is wearing it, retract it if not forced to deploy + if((flags & NODROP) && equip_to != slot_head && !force) //you can only retract the helmet if the suit isn't unsealed + to_chat(user, "You can't retract \the [use_obj] while the suit is sealed!") return + + var/mob/living/to_strip + if(wearer) + to_strip = wearer + else if(isliving(use_obj.loc)) + to_strip = use_obj.loc + + if(to_strip) + to_strip.unEquip(use_obj, 1) + + use_obj.flags &= ~NODROP + use_obj.forceMove(src) + if(wearer) + to_chat(wearer, "Your [use_obj] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly.") + + else if(deploy_mode != ONLY_RETRACT) + if(check_slot && check_slot != use_obj) + to_chat(wearer, "You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way.") + return + use_obj.forceMove(wearer) + use_obj.flags &= ~NODROP + if(!wearer.equip_to_slot_if_possible(use_obj, equip_to, 0, 1)) + use_obj.forceMove(src) else - use_obj.forceMove(H) - use_obj.flags &= ~NODROP - if(!H.equip_to_slot_if_possible(use_obj, equip_to, 0, 1)) - use_obj.forceMove(src) - else - to_chat(H, "Your [use_obj.name] [use_obj.gender == PLURAL ? "deploy" : "deploys"] swiftly.") - use_obj.flags |= NODROP + if(wearer) + to_chat(wearer, "Your [use_obj.name] [use_obj.gender == PLURAL ? "deploy" : "deploys"] swiftly.") + use_obj.flags |= NODROP if(piece == "helmet" && helmet) - helmet.update_light(H) + helmet.update_light(wearer) -/obj/item/weapon/rig/proc/deploy(mob/M,var/sealed, mob/user) +/obj/item/weapon/rig/proc/deploy(mob/user) + if(!wearer || !user) + return 0 - var/mob/living/carbon/human/H = M + if(flags & NODROP) + if(wearer.head && wearer.head != helmet) + to_chat(user, "\The [wearer.head] is blocking \the [src] from deploying!") + return 0 + if(wearer.gloves && wearer.gloves != gloves) + to_chat(user, "\The [wearer.gloves] is preventing \the [src] from deploying!") + return 0 + if(wearer.shoes && wearer.shoes != boots) + to_chat(user, "\The [wearer.shoes] is preventing \the [src] from deploying!") + return 0 + if(wearer.wear_suit && wearer.wear_suit != chest) + to_chat(user, "\The [wearer.wear_suit] is preventing \the [src] from deploying!") + return 0 - if(!H || !istype(H)) return - if(H.back != src) - return - - if(sealed) - if(H.head) - var/obj/item/garbage = H.head - H.unEquip(garbage) - H.head = null - qdel(garbage) - - if(H.gloves) - var/obj/item/garbage = H.gloves - H.unEquip(garbage) - H.gloves = null - qdel(garbage) - - if(H.shoes) - var/obj/item/garbage = H.shoes - H.unEquip(garbage) - H.shoes = null - qdel(garbage) - - if(H.wear_suit) - var/obj/item/garbage = H.wear_suit - H.unEquip(garbage) - H.wear_suit = null - qdel(garbage) - - for(var/piece in list("helmet","gauntlets","chest","boots")) - toggle_piece(piece, wearer, ONLY_DEPLOY, user = user) + for(var/piece in list("helmet", "gauntlets", "chest", "boots")) + toggle_piece(piece, user, ONLY_DEPLOY) /obj/item/weapon/rig/dropped(var/mob/user) ..() for(var/piece in list("helmet","gauntlets","chest","boots")) - toggle_piece(piece, wearer, ONLY_RETRACT, 1, user = user) + toggle_piece(piece, user, ONLY_RETRACT, 1) if(wearer) wearer.wearing_rig = null wearer = null diff --git a/code/modules/clothing/spacesuits/rig/rig_verbs.dm b/code/modules/clothing/spacesuits/rig/rig_verbs.dm index f4769eddf0b..5214ea919f6 100644 --- a/code/modules/clothing/spacesuits/rig/rig_verbs.dm +++ b/code/modules/clothing/spacesuits/rig/rig_verbs.dm @@ -1,6 +1,5 @@ // Interface for humans. /obj/item/weapon/rig/verb/hardsuit_interface() - set name = "Open Hardsuit Interface" set desc = "Open the hardsuit system interface." set category = "Hardsuit" @@ -10,7 +9,6 @@ ui_interact(usr) /obj/item/weapon/rig/verb/toggle_vision() - set name = "Toggle Visor" set desc = "Turns your rig visor off or on." set category = "Hardsuit" @@ -44,7 +42,6 @@ visor.deactivate() /obj/item/weapon/rig/proc/toggle_helmet() - set name = "Toggle Helmet" set desc = "Deploys or retracts your helmet." set category = "Hardsuit" @@ -61,10 +58,9 @@ if(M.incapacitated()) return - toggle_piece("helmet",wearer, user = usr) + toggle_piece("helmet", usr) /obj/item/weapon/rig/proc/toggle_chest() - set name = "Toggle Chestpiece" set desc = "Deploys or retracts your chestpiece." set category = "Hardsuit" @@ -77,10 +73,9 @@ if(M.incapacitated()) return - toggle_piece("chest",wearer, user = usr) + toggle_piece("chest", usr) /obj/item/weapon/rig/proc/toggle_gauntlets() - set name = "Toggle Gauntlets" set desc = "Deploys or retracts your gauntlets." set category = "Hardsuit" @@ -97,10 +92,9 @@ if(M.incapacitated()) return - toggle_piece("gauntlets",wearer, user = usr) + toggle_piece("gauntlets", usr) /obj/item/weapon/rig/proc/toggle_boots() - set name = "Toggle Boots" set desc = "Deploys or retracts your boots." set category = "Hardsuit" @@ -117,10 +111,9 @@ if(M.incapacitated()) return - toggle_piece("boots",wearer, user = usr) + toggle_piece("boots", usr) /obj/item/weapon/rig/verb/deploy_suit() - set name = "Deploy Hardsuit" set desc = "Deploys helmet, gloves and boots." set category = "Hardsuit" @@ -143,7 +136,6 @@ deploy(wearer, usr) /obj/item/weapon/rig/verb/toggle_seals_verb() - set name = "Toggle Hardsuit" set desc = "Activates or deactivates your rig." set category = "Hardsuit" @@ -160,10 +152,12 @@ if(M.incapacitated()) return - toggle_seals(wearer) + if(flags & NODROP) + unseal(usr) + else + seal(usr) /obj/item/weapon/rig/verb/switch_vision_mode() - set name = "Switch Vision Mode" set desc = "Switches between available vision modes." set category = "Hardsuit" @@ -197,7 +191,6 @@ visor.engage() /obj/item/weapon/rig/verb/alter_voice() - set name = "Configure Voice Synthesiser" set desc = "Toggles or configures your voice synthesizer." set category = "Hardsuit" @@ -225,7 +218,6 @@ speech.engage() /obj/item/weapon/rig/verb/select_module() - set name = "Select Module" set desc = "Selects a module as your primary system." set category = "Hardsuit" @@ -265,7 +257,6 @@ to_chat(usr, "Primary system is now: [selected_module.interface_name].") /obj/item/weapon/rig/verb/toggle_module() - set name = "Toggle Module" set desc = "Toggle a system module." set category = "Hardsuit" @@ -307,7 +298,6 @@ module.activate() /obj/item/weapon/rig/verb/engage_module() - set name = "Engage Module" set desc = "Engages a system module." set category = "Hardsuit" diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm new file mode 100644 index 00000000000..18d75f3ef30 --- /dev/null +++ b/code/modules/events/abductor.dm @@ -0,0 +1,52 @@ +/datum/event/abductor + +/datum/event/abductor/start() + //spawn abductor team + processing = 0 //so it won't fire again in next tick + if(!makeAbductorTeam()) + message_admins("Abductor event failed to find players. Retrying in 30s.") + spawn(300) + makeAbductorTeam() + +/datum/event/abductor/proc/makeAbductorTeam() + var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered for an Abductor Team?", ROLE_ABDUCTOR, 1) + + if(candidates.len >= 2) + //Oh god why we can't have static functions + var/number = ticker.mode.abductor_teams + 1 + + var/datum/game_mode/abduction/temp + if(ticker.mode.config_tag == "abduction") + temp = ticker.mode + else + temp = new + + var/agent_mind = pick(candidates) + candidates -= agent_mind + var/scientist_mind = pick(candidates) + + var/mob/living/carbon/human/agent=makeBody(agent_mind) + var/mob/living/carbon/human/scientist=makeBody(scientist_mind) + + agent_mind = agent.mind + scientist_mind = scientist.mind + + temp.scientists.len = number + temp.agents.len = number + temp.abductors.len = 2*number + temp.team_objectives.len = number + temp.team_names.len = number + temp.scientists[number] = scientist_mind + temp.agents[number] = agent_mind + temp.abductors |= list(agent_mind,scientist_mind) + temp.make_abductor_team(number,preset_scientist=scientist_mind,preset_agent=agent_mind) + temp.post_setup_team(number) + + ticker.mode.abductor_teams++ + + if(ticker.mode.config_tag != "abduction") + ticker.mode.abductors |= temp.abductors + processing = 1 //So it will get gc'd + return 1 + else + return 0 \ No newline at end of file diff --git a/code/modules/events/event.dm b/code/modules/events/event.dm index d5ad22e2afd..0f5c43059e8 100644 --- a/code/modules/events/event.dm +++ b/code/modules/events/event.dm @@ -48,6 +48,7 @@ return 0*/ /datum/event //NOTE: Times are measured in master controller ticks! + var/processing = 1 var/startWhen = 0 //When in the lifetime to call start(). var/announceWhen = 0 //When in the lifetime to call announce(). var/endWhen = 0 //When in the lifetime the event should end. @@ -105,6 +106,9 @@ //Do not override this proc, instead use the appropiate procs. //This proc will handle the calls to the appropiate procs. /datum/event/proc/process() + if(!processing) + return + if(activeFor > startWhen && activeFor < endWhen || noAutoEnd) tick() diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 8d16fd5a4cb..304abd3cd13 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -178,10 +178,11 @@ var/list/event_last_fired = list() severity = EVENT_LEVEL_MAJOR available_events = list( new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 1320), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 3), 1), - //new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station, 0, list(ASSIGNMENT_ANY = 5)), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, 0, list(ASSIGNMENT_ENGINEER = 30), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 3), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 3), 1), + //new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station, 0, list(ASSIGNMENT_ANY = 5)), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, 0, list(ASSIGNMENT_ENGINEER = 30), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 3), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Abductor Visit", /datum/event/abductor, 80, is_one_shot = 1), new /datum/event_meta/alien(EVENT_LEVEL_MAJOR, "Alien Infestation", /datum/event/alien_infestation, 0, list(ASSIGNMENT_SECURITY = 30), 1), ) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 23c15a258d7..6b770361407 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -334,8 +334,7 @@ var/turf/simulated/location = get_turf(M) if(istype(location)) location.add_blood_floor(M) if("fire") - if (!(RESIST_COLD in M.mutations)) - M.take_organ_damage(0, force) + M.take_organ_damage(0, force) M.updatehealth() if(seed && seed.get_trait(TRAIT_CARNIVOROUS)) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 2974fcf0264..f1552f14bc6 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -121,7 +121,7 @@ var/global/list/library_section_names = list("Any", "Fiction", "Non-Fiction", "A var/sqlid = text2num(id) if(!sqlid) return - var/DBQuery/query = dbcon.NewQuery("SELECT id, author, title, category, ckey, flagged FROM [format_table_name("library")] WHERE id=[sqlid]") + var/DBQuery/query = dbcon.NewQuery("SELECT id, author, title, category, content, ckey, flagged FROM [format_table_name("library")] WHERE id=[sqlid]") query.Execute() var/list/results=list() @@ -132,8 +132,9 @@ var/global/list/library_section_names = list("Any", "Fiction", "Non-Fiction", "A "author" =query.item[2], "title" =query.item[3], "category"=query.item[4], - "ckey" =query.item[5], - "flagged" =query.item[6] + "content" =query.item[5], + "ckey" =query.item[6], + "flagged" =query.item[7] )) results += CB cached_books["[id]"]=CB diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index e2ff03a506e..41b994b31b6 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -1,11 +1,16 @@ /**********************Mineral deposits**************************/ -var/global/list/rockTurfEdgeCache #define NORTH_EDGING "north" #define SOUTH_EDGING "south" #define EAST_EDGING "east" #define WEST_EDGING "west" +var/global/list/rockTurfEdgeCache = list( + NORTH_EDGING = image('icons/turf/mining.dmi', "rock_side_n", layer = 6), + SOUTH_EDGING = image('icons/turf/mining.dmi', "rock_side_s"), + EAST_EDGING = image('icons/turf/mining.dmi', "rock_side_e", layer = 6), + WEST_EDGING = image('icons/turf/mining.dmi', "rock_side_w", layer = 6)) + /turf/simulated/mineral //wall piece name = "Rock" icon = 'icons/turf/mining.dmi' @@ -50,32 +55,8 @@ var/global/list/rockTurfEdgeCache return /turf/simulated/mineral/New() - if(!rockTurfEdgeCache || !rockTurfEdgeCache.len) - rockTurfEdgeCache = list() - rockTurfEdgeCache.len = 4 - rockTurfEdgeCache[NORTH_EDGING] = image('icons/turf/mining.dmi', "rock_side_n", layer = 6) - rockTurfEdgeCache[SOUTH_EDGING] = image('icons/turf/mining.dmi', "rock_side_s") - rockTurfEdgeCache[EAST_EDGING] = image('icons/turf/mining.dmi', "rock_side_e", layer = 6) - rockTurfEdgeCache[WEST_EDGING] = image('icons/turf/mining.dmi', "rock_side_w", layer = 6) - - spawn(1) - var/turf/T - if((istype(get_step(src, NORTH), /turf/simulated/floor)) || (istype(get_step(src, NORTH), /turf/space))) - T = get_step(src, NORTH) - if (T) - T.overlays += rockTurfEdgeCache[SOUTH_EDGING] - if((istype(get_step(src, SOUTH), /turf/simulated/floor)) || (istype(get_step(src, SOUTH), /turf/space))) - T = get_step(src, SOUTH) - if (T) - T.overlays += rockTurfEdgeCache[NORTH_EDGING] - if((istype(get_step(src, EAST), /turf/simulated/floor)) || (istype(get_step(src, EAST), /turf/space))) - T = get_step(src, EAST) - if (T) - T.overlays += rockTurfEdgeCache[WEST_EDGING] - if((istype(get_step(src, WEST), /turf/simulated/floor)) || (istype(get_step(src, WEST), /turf/space))) - T = get_step(src, WEST) - if (T) - T.overlays += rockTurfEdgeCache[EAST_EDGING] + ..() + mineral_turfs += src if (mineralType && mineralAmt && spread && spreadChance) for(var/dir in cardinal) @@ -85,7 +66,6 @@ var/global/list/rockTurfEdgeCache Spread(T) HideRock() - return /turf/simulated/mineral/proc/HideRock() if(hidden) @@ -96,6 +76,33 @@ var/global/list/rockTurfEdgeCache /turf/simulated/mineral/proc/Spread(var/turf/T) new src.type(T) +/hook/startup/proc/add_mineral_edges() + var/watch = start_watch() + log_startup_progress("Reticulating splines...") + for(var/turf/simulated/mineral/M in mineral_turfs) + M.add_edges() + log_startup_progress(" Splines reticulated in [stop_watch(watch)]s.") + return 1 + +/turf/simulated/mineral/proc/add_edges() + var/turf/T + if((istype(get_step(src, NORTH), /turf/simulated/floor)) || (istype(get_step(src, NORTH), /turf/space))) + T = get_step(src, NORTH) + if (T) + T.overlays += rockTurfEdgeCache[SOUTH_EDGING] + if((istype(get_step(src, SOUTH), /turf/simulated/floor)) || (istype(get_step(src, SOUTH), /turf/space))) + T = get_step(src, SOUTH) + if (T) + T.overlays += rockTurfEdgeCache[NORTH_EDGING] + if((istype(get_step(src, EAST), /turf/simulated/floor)) || (istype(get_step(src, EAST), /turf/space))) + T = get_step(src, EAST) + if (T) + T.overlays += rockTurfEdgeCache[WEST_EDGING] + if((istype(get_step(src, WEST), /turf/simulated/floor)) || (istype(get_step(src, WEST), /turf/space))) + T = get_step(src, WEST) + if (T) + T.overlays += rockTurfEdgeCache[EAST_EDGING] + /turf/simulated/mineral/random name = "mineral deposit" icon_state = "rock" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 82b83db73ef..77afb5e2665 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -248,6 +248,16 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/proc/notify_cloning(var/message, var/sound, var/atom/source) if(message) to_chat(src, "[message]") + if(source) + var/obj/screen/alert/A = throw_alert("\ref[source]_notify_cloning", /obj/screen/alert/notify_cloning) + if(A) + if(client && client.prefs && client.prefs.UI_style) + A.icon = ui_style2icon(client.prefs.UI_style) + A.desc = message + var/old_layer = source.layer + source.layer = FLOAT_LAYER + A.overlays += source + source.layer = old_layer to_chat(src, "(Click to re-enter)") if(sound) to_chat(src, sound(sound)) @@ -563,6 +573,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return forceMove(T) following = null + + if(href_list["reenter"]) + reenter_corpse() + ..() //END TELEPORT HREF CODE diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 777eac07ec8..8998f39ea27 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -107,10 +107,10 @@ to_chat(player, msg_dead) continue - else if(istype(player,/mob/dead) || ((src in player.languages) && check_special_condition(player))) + else if(istype(player,/mob/dead) || ((src in player.languages) && check_special_condition(player, speaker))) to_chat(player, msg) -/datum/language/proc/check_special_condition(var/mob/other) +/datum/language/proc/check_special_condition(var/mob/other, var/mob/living/speaker) return 1 /datum/language/proc/get_spoken_verb(var/msg_end) @@ -409,6 +409,7 @@ key = "8" flags = RESTRICTED | HIVEMIND + /datum/language/shadowling/broadcast(var/mob/living/speaker, var/message, var/speaker_mask) if(speaker.mind && speaker.mind.special_role) ..(speaker, message, "([speaker.mind.special_role]) [speaker]") @@ -422,6 +423,25 @@ else ..(speaker,message) +/datum/language/abductor + name = "Abductor Mindlink" + desc = "Abductors are incapable of speech, but have a psychic link attuned to their own team." + speech_verb = "gibbers" + ask_verb = "gibbers" + exclaim_verb = "gibbers" + colour = "abductor" + key = "zw" //doesn't matter, this is their default and only language + flags = RESTRICTED | HIVEMIND + +/datum/language/abductor/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) + ..(speaker,message,speaker.real_name) + +/datum/language/abductor/check_special_condition(var/mob/living/carbon/human/other, var/mob/living/carbon/human/speaker) + if(other.mind && other.mind.abductor) + if(other.mind.abductor.team == speaker.mind.abductor.team) + return 1 + return 0 + /datum/language/corticalborer name = "Cortical Link" desc = "Cortical borers possess a strange link between their tiny minds." diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index a6bf793abe0..6192b0acc6b 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -102,22 +102,19 @@ // +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt. if(bodytemperature > 360.15) //Body temperature is too hot. - fire_alert = max(fire_alert, 1) + throw_alert("alien_fire", /obj/screen/alert/alien_fire) switch(bodytemperature) if(360 to 400) apply_damage(HEAT_DAMAGE_LEVEL_1, BURN) - fire_alert = max(fire_alert, 2) if(400 to 460) apply_damage(HEAT_DAMAGE_LEVEL_2, BURN) - fire_alert = max(fire_alert, 2) if(460 to INFINITY) if(on_fire) apply_damage(HEAT_DAMAGE_LEVEL_3, BURN) - fire_alert = max(fire_alert, 2) else apply_damage(HEAT_DAMAGE_LEVEL_2, BURN) - fire_alert = max(fire_alert, 2) - return + else + clear_alert("alien_fire") /mob/living/carbon/alien/handle_mutations_and_radiation() // Aliens love radiation nom nom nom diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index c50e4603e41..90fe6537759 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -343,6 +343,10 @@ In all, this is a lot like the monkey code. /N /mob/living/carbon/alien/humanoid/canBeHandcuffed() return 1 +/mob/living/carbon/alien/humanoid/cuff_resist(obj/item/I) + playsound(src, 'sound/voice/hiss5.ogg', 40, 1, 1) //Alien roars when starting to break free + ..(I, cuff_break = 1) + /mob/living/carbon/alien/humanoid/get_standard_pixel_y_offset(lying = 0) if(leaping) return -32 diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 93bf633093f..cf602694233 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -7,19 +7,19 @@ return 0 var/toxins_used = 0 - var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME + var/breath_pressure = (breath.total_moles() * R_IDEAL_GAS_EQUATION * breath.temperature) / BREATH_VOLUME //Partial pressure of the toxins in our breath - var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure + var/Toxins_pp = (breath.toxins / breath.total_moles()) * breath_pressure if(Toxins_pp) // Detect toxins in air adjustPlasma(breath.toxins*250) - toxins_alert = max(toxins_alert, 1) + throw_alert("alien_tox", /obj/screen/alert/alien_tox) toxins_used = breath.toxins else - toxins_alert = 0 + clear_alert("alien_tox") //Breathe in toxins and out oxygen breath.toxins -= toxins_used @@ -30,14 +30,6 @@ return 1 -/mob/living/carbon/alien/handle_breath_temperature(datum/gas_mixture/breath) - if(breath.temperature > (T0C + 66) && !(RESIST_COLD in mutations)) - if(prob(20)) - to_chat(src, "You feel a searing heat in your lungs!") - fire_alert = max(fire_alert, 1) - else - fire_alert = 0 - /mob/living/carbon/alien/update_sight() if(stat == DEAD || (XRAY in mutations)) sight |= SEE_TURFS diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 07251303a12..f6cdb0362e3 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -47,8 +47,6 @@ for(var/mob/dead/observer/O in player_list) if(check_observer(O)) to_chat(O, "\A [src] has been activated. (Teleport | Sign Up)") -// if(ROLE_POSIBRAIN in O.client.prefs.be_special) The Guardian implementation looks cleaner -// question(O.client) /obj/item/device/mmi/posibrain/proc/check_observer(var/mob/dead/observer/O) if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 84348120528..26def9b6520 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -607,7 +607,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, handcuffed = null if(buckled && buckled.buckle_requires_restraints) buckled.unbuckle_mob() - update_inv_handcuffed() + update_handcuffed() else if(I == legcuffed) legcuffed = null update_inv_legcuffed() @@ -732,6 +732,131 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, /mob/living/carbon/is_muzzled() return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) +/mob/living/carbon/proc/spin(spintime, speed) + spawn() + var/D = dir + while(spintime >= speed) + sleep(speed) + switch(D) + if(NORTH) + D = EAST + if(SOUTH) + D = WEST + if(EAST) + D = SOUTH + if(WEST) + D = NORTH + dir = D + spintime -= speed + +/mob/living/carbon/resist_buckle() + if(restrained()) + changeNext_move(CLICK_CD_BREAKOUT) + last_special = world.time + CLICK_CD_BREAKOUT + visible_message("[src] attempts to unbuckle themself!", \ + "You attempt to unbuckle yourself... (This will take around one minute and you need to stay still.)") + if(do_after(src, 600, 0, target = src)) + if(!buckled) + return + buckled.user_unbuckle_mob(src,src) + else + if(src && buckled) + src << "You fail to unbuckle yourself!" + else + buckled.user_unbuckle_mob(src,src) + +/mob/living/carbon/resist_fire() + fire_stacks -= 5 + weakened = max(weakened, 3)//We dont check for CANWEAKEN, I don't care how immune to weakening you are, if you're rolling on the ground, you're busy. + update_canmove() + spin(32,2) + visible_message("[src] rolls on the floor, trying to put themselves out!", \ + "You stop, drop, and roll!") + sleep(30) + if(fire_stacks <= 0) + visible_message("[src] has successfully extinguished themselves!", \ + "You extinguish yourself.") + ExtinguishMob() + + +/mob/living/carbon/resist_restraints() + var/obj/item/I = null + if(handcuffed) + I = handcuffed + else if(legcuffed) + I = legcuffed + if(I) + changeNext_move(CLICK_CD_BREAKOUT) + last_special = world.time + CLICK_CD_BREAKOUT + cuff_resist(I) + + +/mob/living/carbon/proc/cuff_resist(obj/item/I, breakouttime = 600, cuff_break = 0) + breakouttime = I.breakouttime + + var/displaytime = breakouttime / 600 + if(!cuff_break) + visible_message("[src] attempts to remove [I]!") + to_chat(src, "You attempt to remove [I]... (This will take around [displaytime] minutes and you need to stand still.)") + if(do_after(src, breakouttime, 0, target = src)) + if(I.loc != src || buckled) + return + visible_message("[src] manages to remove [I]!") + to_chat(src, "You successfully remove [I].") + + if(I == handcuffed) + handcuffed.loc = loc + handcuffed.dropped(src) + handcuffed = null + if(buckled && buckled.buckle_requires_restraints) + buckled.unbuckle_mob(src) + update_handcuffed() + return + if(I == legcuffed) + legcuffed.loc = loc + legcuffed.dropped() + legcuffed = null + update_inv_legcuffed() + return + return 1 + else + to_chat(src, "You fail to remove [I]!") + + else + breakouttime = 50 + visible_message("[src] is trying to break [I]!") + to_chat(src, "You attempt to break [I]... (This will take around 5 seconds and you need to stand still.)") + if(do_after(src, breakouttime, 0, target = src)) + if(!I.loc || buckled) + return + visible_message("[src] manages to break [I]!") + to_chat(src, "You successfully break [I].") + qdel(I) + + if(I == handcuffed) + handcuffed = null + update_handcuffed() + return + else if(I == legcuffed) + legcuffed = null + update_inv_legcuffed() + return + return 1 + else + to_chat(src, "You fail to break [I]!") + +//called when we get cuffed/uncuffed +/mob/living/carbon/proc/update_handcuffed() + if(handcuffed) + drop_r_hand() + drop_l_hand() + stop_pulling() + throw_alert("handcuffed", /obj/screen/alert/restrained/handcuffed, new_master = src.handcuffed) + else + clear_alert("handcuffed") + update_action_buttons() //some of our action buttons might be unusable when we're handcuffed. + update_inv_handcuffed() + /mob/living/carbon/get_standard_pixel_y_offset(lying = 0) if(lying) if(buckled) return initial(pixel_y) @@ -765,7 +890,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, handcuffed = null if (buckled && buckled.buckle_requires_restraints) buckled.unbuckle_mob() - update_inv_handcuffed() + update_handcuffed() if (client) client.screen -= W if (W) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5ebda5b96d7..ee9388ac962 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -114,6 +114,9 @@ /mob/living/carbon/human/grey/New(var/new_loc) ..(new_loc, "Grey") +/mob/living/carbon/human/abductor/New(var/new_loc) + ..(new_loc, "Abductor") + /mob/living/carbon/human/human/New(var/new_loc) ..(new_loc, "Human") @@ -690,6 +693,8 @@ //repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a seperate proc as it'll be useful elsewhere /mob/living/carbon/human/get_visible_name() + if(name_override) + return name_override if(wear_mask && (wear_mask.flags_inv & HIDEFACE)) //Wearing a mask which hides our face, use id-name if possible return get_id_name("Unknown") if(head && (head.flags_inv & HIDEFACE)) @@ -1350,6 +1355,15 @@ update_inv_shoes(1) return 1 +/mob/living/carbon/human/cuff_resist(obj/item/I) + if(HULK in mutations) + say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + if(..(I, cuff_break = 1)) + unEquip(I) + else + if(..()) + unEquip(I) + /mob/living/carbon/human/get_visible_implants(var/class = 0) var/list/visible_implants = list() diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index f68b03ed964..e2ebed386b3 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -81,6 +81,8 @@ var/global/default_martial_art = new/datum/martial_art var/hand_blood_color + var/name_override //For temporary visible name changes + var/xylophone = 0 //For the spoooooooky xylophone cooldown var/mob/remoteview_target = null diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index bdd22a7e6fb..14585c8d972 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -369,8 +369,7 @@ var/obj/item/organ/external/affected = get_organ("chest") affected.add_autopsy_data("Suffocation", oxyloss) - - oxygen_alert = max(oxygen_alert, 1) + throw_alert("oxy", /obj/screen/alert/oxy) return 0 @@ -384,7 +383,7 @@ // to_chat(world, "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Thermal protection: [get_thermal_protection()] - Fire protection: [thermal_protection + add_fire_protection(loc_temp)] - Heat capacity: [environment_heat_capacity] - Location: [loc] - src: [src]") //Body temperature is adjusted in two steps. Firstly your body tries to stabilize itself a bit. - if(stat != 2) + if(stat != DEAD) stabilize_temperature_from_calories() //After then, it reacts to the surrounding atmosphere based on your thermal protection @@ -403,41 +402,43 @@ // +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt. if(bodytemperature > species.heat_level_1) //Body temperature is too hot. - fire_alert = max(fire_alert, 1) if(status_flags & GODMODE) return 1 //godmode var/mult = species.hot_env_multiplier if(bodytemperature >= species.heat_level_1 && bodytemperature <= species.heat_level_2) + throw_alert("temp", /obj/screen/alert/hot, 1) take_overall_damage(burn=mult*HEAT_DAMAGE_LEVEL_1, used_weapon = "High Body Temperature") - fire_alert = max(fire_alert, 2) if(bodytemperature > species.heat_level_2 && bodytemperature <= species.heat_level_3) + throw_alert("temp", /obj/screen/alert/hot, 2) take_overall_damage(burn=mult*HEAT_DAMAGE_LEVEL_2, used_weapon = "High Body Temperature") - fire_alert = max(fire_alert, 2) if(bodytemperature > species.heat_level_3 && bodytemperature < INFINITY) + throw_alert("temp", /obj/screen/alert/hot, 3) if(on_fire) take_overall_damage(burn=mult*HEAT_DAMAGE_LEVEL_3, used_weapon = "Fire") - fire_alert = max(fire_alert, 2) else take_overall_damage(burn=mult*HEAT_DAMAGE_LEVEL_2, used_weapon = "High Body Temperature") - fire_alert = max(fire_alert, 2) else if(bodytemperature < species.cold_level_1) - fire_alert = max(fire_alert, 1) - if(status_flags & GODMODE) return 1 //godmode - - if(stat == DEAD) return 1 //ZomgPonies -- No need for cold burn damage if dead + if(status_flags & GODMODE) + return 1 + if(stat == DEAD) + return 1 if(!istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) var/mult = species.cold_env_multiplier if(bodytemperature >= species.cold_level_2 && bodytemperature <= species.cold_level_1) + throw_alert("temp", /obj/screen/alert/cold, 1) take_overall_damage(burn=mult*COLD_DAMAGE_LEVEL_1, used_weapon = "Low Body Temperature") - fire_alert = max(fire_alert, 1) if(bodytemperature >= species.cold_level_3 && bodytemperature < species.cold_level_2) + throw_alert("temp", /obj/screen/alert/cold, 2) take_overall_damage(burn=mult*COLD_DAMAGE_LEVEL_2, used_weapon = "Low Body Temperature") - fire_alert = max(fire_alert, 1) if(bodytemperature > -INFINITY && bodytemperature < species.cold_level_3) + throw_alert("temp", /obj/screen/alert/cold, 3) take_overall_damage(burn=mult*COLD_DAMAGE_LEVEL_3, used_weapon = "Low Body Temperature") - fire_alert = max(fire_alert, 1) + else + clear_alert("temp") + else + clear_alert("temp") // Account for massive pressure differences. Done by Polymorph // Made it possible to actually have something that can protect against high pressure... Done by Errorage. Polymorph now has an axe sticking from his head for his previous hardcoded nonsense! @@ -447,28 +448,32 @@ if(status_flags & GODMODE) return 1 //godmode if(adjusted_pressure >= species.hazard_high_pressure) - var/pressure_damage = min( ( (adjusted_pressure / species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) - take_overall_damage(brute=pressure_damage, used_weapon = "High Pressure") - pressure_alert = 2 + if(!(RESIST_HEAT in mutations)) + var/pressure_damage = min( ( (adjusted_pressure / species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) + take_overall_damage(brute=pressure_damage, used_weapon = "High Pressure") + throw_alert("pressure", /obj/screen/alert/highpressure, 2) + else + clear_alert("pressure") else if(adjusted_pressure >= species.warning_high_pressure) - pressure_alert = 1 + throw_alert("pressure", /obj/screen/alert/highpressure, 1) else if(adjusted_pressure >= species.warning_low_pressure) - pressure_alert = 0 + clear_alert("pressure") else if(adjusted_pressure >= species.hazard_low_pressure) - pressure_alert = -1 + throw_alert("pressure", /obj/screen/alert/lowpressure, 1) else if(RESIST_COLD in mutations) - pressure_alert = -1 + clear_alert("pressure") else take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure") - pressure_alert = -2 + throw_alert("pressure", /obj/screen/alert/lowpressure, 2) - return ///FIRE CODE /mob/living/carbon/human/handle_fire() if(..()) return + if(RESIST_HEAT in mutations) + return var/thermal_protection = 0 //Simple check to estimate how protected we are against multiple temperatures if(wear_suit) if(wear_suit.max_heat_protection_temperature >= FIRE_SUIT_MAX_TEMP_PROTECT) @@ -547,11 +552,13 @@ return thermal_protection_flags /mob/living/carbon/human/proc/get_heat_protection(temperature) //Temperature is the temperature you're being exposed to. + + if(RESIST_HEAT in mutations) + return 1 + var/thermal_protection_flags = get_heat_protection_flags(temperature) var/thermal_protection = 0.0 - if(RESIST_HEAT in mutations) - return 1 if(thermal_protection_flags) if(thermal_protection_flags & HEAD) thermal_protection += THERMAL_PROTECTION_HEAD diff --git a/code/modules/mob/living/carbon/human/species/abdcutor.dm b/code/modules/mob/living/carbon/human/species/abdcutor.dm new file mode 100644 index 00000000000..1c641b27af0 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/abdcutor.dm @@ -0,0 +1,27 @@ +/datum/species/abductor + name = "Abductor" + name_plural = "Abductors" + icobase = 'icons/mob/human_races/r_abductor.dmi' + deform = 'icons/mob/human_races/r_abductor.dmi' + path = /mob/living/carbon/human/abductor + language = "Abductor Mindlink" + default_language = "Abductor Mindlink" + unarmed_type = /datum/unarmed_attack/punch + darksight = 3 + eyes = "blank_eyes" + + flags = HAS_LIPS | NO_BLOOD | NO_BREATHE + virus_immune = 1 + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS + dietflags = DIET_OMNI + reagent_tag = PROCESS_ORG + blood_color = "#FF5AFF" + +/datum/species/abductor/can_understand(var/mob/other) //Abductors can understand everyone, but they can only speak over their mindlink to another team-member + return 1 + +/datum/species/abductor/handle_post_spawn(var/mob/living/carbon/human/H) + H.gender = NEUTER + if(H.mind) + H.mind.abductor = new /datum/abductor + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index 5bced02a651..76c06871250 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -186,7 +186,7 @@ H.emote(pick("giggle", "laugh")) SA.moles = 0 - if( (abs(310.15 - breath.temperature) > 50) && !(RESIST_HEAT in H.mutations)) // Hot air hurts :( + if(abs(310.15 - breath.temperature) > 50) // Hot air hurts :( if(H.status_flags & GODMODE) return 1 //godmode if(breath.temperature < cold_level_1) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 9b68e5830cb..ed15138b602 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -52,6 +52,19 @@ var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning. var/hazard_low_pressure = HAZARD_LOW_PRESSURE // Dangerously low pressure. + var/list/atmos_requirements = list( + "min_oxy" = 16, + "max_oxy" = 0, + "min_nitro" = 0, + "max_nitro" = 0, + "min_tox" = 0, + "max_tox" = 0.005, + "min_co2" = 0, + "max_co2" = 10, + "sa_para" = 1, + "sa_sleep" = 5 + ) + var/brute_mod = null // Physical damage reduction/malus. var/burn_mod = null // Burn damage reduction/malus. @@ -181,66 +194,105 @@ O.owner = H /datum/species/proc/handle_breath(var/datum/gas_mixture/breath, var/mob/living/carbon/human/H) - var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa - //var/safe_oxygen_max = 140 // Maximum safe partial pressure of O2, in kPa (Not used for now) - var/safe_co2_max = 10 // Yes it's an arbitrary value who cares? - var/safe_toxins_max = 0.005 - var/SA_para_min = 1 - var/SA_sleep_min = 5 - var/oxygen_used = 0 - var/nitrogen_used = 0 var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME - var/vox_oxygen_max = 1 // For vox. + + var/O2_used = 0 + var/N2_used = 0 + var/Tox_used = 0 + var/CO2_used = 0 //Partial pressure of the O2 in our breath - var/O2_pp = (breath.oxygen/breath.total_moles())*breath_pressure - // Same, but for the toxins - var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure - // And CO2, lets say a PP of more than 10 will be bad (It's a little less really, but eh, being passed out all round aint no fun) - var/CO2_pp = (breath.carbon_dioxide/breath.total_moles())*breath_pressure // Tweaking to fit the hacky bullshit I've done with atmo -- TLE - // Nitrogen, for Vox. - var/Nitrogen_pp = (breath.nitrogen/breath.total_moles())*breath_pressure + var/O2_pp = (breath.oxygen/breath.total_moles()) * breath_pressure + // Partial pressure of Nitrogen + var/N2_pp = (breath.nitrogen/breath.total_moles()) * breath_pressure + // Partial pressure of plasma + var/Tox_pp = (breath.toxins/breath.total_moles()) * breath_pressure + // Partial pressure of CO2 + var/CO2_pp = (breath.carbon_dioxide/breath.total_moles()) * breath_pressure - // TODO: Split up into Voxs' own proc. - if(O2_pp < safe_oxygen_min && name != "Vox") // Too little oxygen + if(O2_pp < atmos_requirements["min_oxy"]) if(prob(20)) spawn(0) H.emote("gasp") + + H.failed_last_breath = 1 if(O2_pp > 0) - var/ratio = safe_oxygen_min/O2_pp - H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!) - H.failed_last_breath = 1 - oxygen_used = breath.oxygen*ratio/6 + var/ratio = atmos_requirements["min_oxy"] / O2_pp + H.adjustOxyLoss(min(5 * ratio, HUMAN_MAX_OXYLOSS)) else H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) - H.failed_last_breath = 1 - H.oxygen_alert = max(H.oxygen_alert, 1) - else if(Nitrogen_pp < safe_oxygen_min && name == "Vox") //Vox breathe nitrogen, not oxygen. + H.throw_alert("oxy", /obj/screen/alert/oxy) + else if(atmos_requirements["max_oxy"] && O2_pp > atmos_requirements["max_oxy"]) + var/ratio = (breath.oxygen / atmos_requirements["max_oxy"]) * 1000 + H.adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) + H.throw_alert("oxy", /obj/screen/alert/too_much_oxy) + else + H.clear_alert("oxy") + if(atmos_requirements["min_oxy"]) //species breathes this gas, so, they got their air + H.failed_last_breath = 0 + H.adjustOxyLoss(-5) + O2_used = breath.oxygen / 6 + if(N2_pp < atmos_requirements["min_nitro"]) if(prob(20)) - spawn(0) H.emote("gasp") - if(Nitrogen_pp > 0) - var/ratio = safe_oxygen_min/Nitrogen_pp - H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) - H.failed_last_breath = 1 - nitrogen_used = breath.nitrogen*ratio/6 + spawn(0) + H.emote("gasp") + + H.failed_last_breath = 1 + if(N2_pp > 0) + var/ratio = atmos_requirements["min_nitro"] / N2_pp + H.adjustOxyLoss(min(5 * ratio, HUMAN_MAX_OXYLOSS)) else H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) - H.failed_last_breath = 1 - H.oxygen_alert = max(H.oxygen_alert, 1) + H.throw_alert("nitro", /obj/screen/alert/nitro) + else if(atmos_requirements["max_nitro"] && N2_pp > atmos_requirements["max_nitro"]) + var/ratio = (breath.nitrogen / atmos_requirements["max_nitro"]) * 1000 + H.adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) + H.throw_alert("nitro", /obj/screen/alert/too_much_nitro) + else + H.clear_alert("nitro") + if(atmos_requirements["min_nitro"]) //species breathes this gas, so they got their air + H.failed_last_breath = 0 + H.adjustOxyLoss(-5) + N2_used = breath.nitrogen / 6 - else // We're in safe limits - H.failed_last_breath = 0 - H.adjustOxyLoss(-5) - oxygen_used = breath.oxygen/6 - H.oxygen_alert = 0 + if(Tox_pp < atmos_requirements["min_tox"]) + if(prob(20)) + spawn(0) + H.emote("gasp") - breath.oxygen -= oxygen_used - breath.nitrogen -= nitrogen_used - breath.carbon_dioxide += oxygen_used + H.failed_last_breath = 1 + if(Tox_pp > 0) + var/ratio = atmos_requirements["min_tox"] / Tox_pp + H.adjustOxyLoss(min(5 * ratio, HUMAN_MAX_OXYLOSS)) + else + H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) + H.throw_alert("tox_in_air", /obj/screen/alert/not_enough_tox) + else if(atmos_requirements["max_tox"] && Tox_pp > atmos_requirements["max_tox"]) + var/ratio = (breath.toxins / atmos_requirements["max_tox"]) * 10 + if(H.reagents) + H.reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) + H.throw_alert("tox_in_air", /obj/screen/alert/tox_in_air) + else + H.clear_alert("tox_in_air") + if(atmos_requirements["min_tox"]) //species breathes this gas, so, they got their air + H.failed_last_breath = 0 + H.adjustOxyLoss(-5) + Tox_used = breath.toxins / 6 - //CO2 does not affect failed_last_breath. So if there was enough oxygen in the air but too much co2, this will hurt you, but only once per 4 ticks, instead of once per tick. - if(CO2_pp > safe_co2_max) + if(CO2_pp < atmos_requirements["min_co2"]) + if(prob(20)) + spawn(0) + H.emote("gasp") + + H.failed_last_breath = 1 + if(CO2_pp) + var/ratio = atmos_requirements["min_co2"] / CO2_pp + H.adjustOxyLoss(min(5 * ratio, HUMAN_MAX_OXYLOSS)) + else + H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) + H.throw_alert("co2", /obj/screen/alert/not_enough_co2) + else if(atmos_requirements["max_co2"] && CO2_pp > atmos_requirements["max_co2"]) if(!H.co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so. H.co2overloadtime = world.time else if(world.time - H.co2overloadtime > 120) @@ -249,77 +301,67 @@ if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good! H.adjustOxyLoss(8) if(prob(20)) // Lets give them some chance to know somethings not right though I guess. - spawn(0) H.emote("cough") - + spawn(0) + H.emote("cough") else - H.co2overloadtime = 0 + H.clear_alert("co2") + if(atmos_requirements["min_co2"]) //species breathes this gas, so they got their air + H.failed_last_breath = 0 + H.adjustOxyLoss(-5) + CO2_used = breath.carbon_dioxide / 6 - if(Toxins_pp > safe_toxins_max) // Too much toxins - var/ratio = (breath.toxins/safe_toxins_max) * 10 - //adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second - if(H.reagents) - H.reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) - H.toxins_alert = max(H.toxins_alert, 1) + breath.oxygen -= O2_used + breath.nitrogen -= N2_used + breath.toxins -= Tox_used + breath.carbon_dioxide -= CO2_used + breath.carbon_dioxide += O2_used - else if(O2_pp > vox_oxygen_max && name == "Vox") //Oxygen is toxic to vox. - var/ratio = (breath.oxygen/vox_oxygen_max) * 1000 - H.adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) - H.toxins_alert = max(H.toxins_alert, 1) - else - H.toxins_alert = 0 if(breath.trace_gases.len) // If there's some other shit in the air lets deal with it here. for(var/datum/gas/sleeping_agent/SA in breath.trace_gases) - var/SA_pp = (SA.moles/breath.total_moles())*breath_pressure - if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit + var/SA_pp = (SA.moles / breath.total_moles()) * breath_pressure + if(SA_pp > atmos_requirements["sa_para"]) // Enough to make us paralysed for a bit H.Paralyse(3) // 3 gives them one second to wake up and run away a bit! - if(SA_pp > SA_sleep_min) // Enough to make us sleep as well - H.sleeping = max(H.sleeping+2, 10) + if(SA_pp > atmos_requirements["sa_sleep"]) // Enough to make us sleep as well + H.sleeping = max(H.sleeping + 2, 10) else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning if(prob(20)) - spawn(0) H.emote(pick("giggle", "laugh")) + spawn(0) + H.emote(pick("giggle", "laugh")) handle_temperature(breath, H) - return 1 /datum/species/proc/handle_temperature(datum/gas_mixture/breath, var/mob/living/carbon/human/H) // called by human/life, handles temperatures - if( (abs(310.15 - breath.temperature) > 50) && !(RESIST_HEAT in H.mutations)) // Hot air hurts :( + if(abs(310.15 - breath.temperature) > 50) // Hot air hurts :( if(H.status_flags & GODMODE) return 1 //godmode if(breath.temperature < cold_level_1) if(prob(20)) - to_chat(H, "\red You feel your face freezing and an icicle forming in your lungs!") + to_chat(H, "You feel your face freezing and an icicle forming in your lungs!") else if(breath.temperature > heat_level_1) if(prob(20)) - to_chat(H, "\red You feel your face burning and a searing heat in your lungs!") + to_chat(H, "You feel your face burning and a searing heat in your lungs!") switch(breath.temperature) if(-INFINITY to cold_level_3) H.apply_damage(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold") - H.fire_alert = max(H.fire_alert, 1) if(cold_level_3 to cold_level_2) H.apply_damage(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold") - H.fire_alert = max(H.fire_alert, 1) if(cold_level_2 to cold_level_1) H.apply_damage(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold") - H.fire_alert = max(H.fire_alert, 1) if(heat_level_1 to heat_level_2) H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat") - H.fire_alert = max(H.fire_alert, 2) if(heat_level_2 to heat_level_3_breathe) H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat") - H.fire_alert = max(H.fire_alert, 2) if(heat_level_3_breathe to INFINITY) H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat") - H.fire_alert = max(H.fire_alert, 2) - return /datum/species/proc/handle_post_spawn(var/mob/living/carbon/C) //Handles anything not already covered by basic species assignment. grant_abilities(C) @@ -528,10 +570,10 @@ if(H.blinded || H.eye_blind) H.overlay_fullscreen("blind", /obj/screen/fullscreen/blind) - //H.throw_alert("blind", /obj/screen/alert/blind) + H.throw_alert("blind", /obj/screen/alert/blind) else H.clear_fullscreen("blind") - //H.clear_alert("blind") + H.clear_alert("blind") if(H.disabilities & NEARSIGHTED) //this looks meh but saves a lot of memory by not requiring to add var/prescription @@ -553,10 +595,10 @@ if(H.druggy) H.overlay_fullscreen("high", /obj/screen/fullscreen/high) - //H.throw_alert("high", /obj/screen/alert/high) + H.throw_alert("high", /obj/screen/alert/high) else H.clear_fullscreen("high") - //H.clear_alert("high") + H.clear_alert("high") /datum/species/proc/handle_hud_icons(mob/living/carbon/human/H) if(H.healths) @@ -603,59 +645,15 @@ if(icon_num) H.healthdoll.overlays += image('icons/mob/screen_gen.dmi',"[O.limb_name][icon_num]") - if(H.nutrition_icon) - switch(H.nutrition) - if(450 to INFINITY) H.nutrition_icon.icon_state = "nutrition0" - if(350 to 450) H.nutrition_icon.icon_state = "nutrition1" - if(250 to 350) H.nutrition_icon.icon_state = "nutrition2" - if(150 to 250) H.nutrition_icon.icon_state = "nutrition3" - else H.nutrition_icon.icon_state = "nutrition4" - - - // BAY SHIT - if(H.pressure) - H.pressure.icon_state = "pressure[H.pressure_alert]" - - if(H.toxin) - if(H.hal_screwyhud == 4 || H.toxins_alert) H.toxin.icon_state = "tox1" - else H.toxin.icon_state = "tox0" - if(H.oxygen) - if(H.hal_screwyhud == 3 || H.oxygen_alert) H.oxygen.icon_state = "oxy1" - else H.oxygen.icon_state = "oxy0" - if(H.fire) - if(H.fire_alert) H.fire.icon_state = "fire[H.fire_alert]" //fire_alert is either 0 if no alert, 1 for cold and 2 for heat. - else H.fire.icon_state = "fire0" - - if(H.bodytemp) - var/temp_step - if(H.bodytemperature >= body_temperature) - temp_step = (heat_level_1 - body_temperature)/4 - - if(H.bodytemperature >= heat_level_1) - H.bodytemp.icon_state = "temp4" - else if(H.bodytemperature >= body_temperature + temp_step*3) - H.bodytemp.icon_state = "temp3" - else if(H.bodytemperature >= body_temperature + temp_step*2) - H.bodytemp.icon_state = "temp2" - else if(H.bodytemperature >= body_temperature + temp_step*1) - H.bodytemp.icon_state = "temp1" - else - H.bodytemp.icon_state = "temp0" - - else if(H.bodytemperature < body_temperature) - temp_step = (body_temperature - cold_level_1)/4 - - if(H.bodytemperature <= cold_level_1) - H.bodytemp.icon_state = "temp-4" - else if(H.bodytemperature <= body_temperature - temp_step*3) - H.bodytemp.icon_state = "temp-3" - else if(H.bodytemperature <= body_temperature - temp_step*2) - H.bodytemp.icon_state = "temp-2" - else if(H.bodytemperature <= body_temperature - temp_step*1) - H.bodytemp.icon_state = "temp-1" - else - H.bodytemp.icon_state = "temp0" - + switch(H.nutrition) + if(450 to INFINITY) + H.throw_alert("nutrition", /obj/screen/alert/fat) + if(350 to 450) + H.clear_alert("nutrition") + if(250 to 350) + H.throw_alert("nutrition", /obj/screen/alert/hungry) + else + H.throw_alert("nutrition", /obj/screen/alert/starving) return 1 /* diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index ae20969bc00..26c6ddb0c57 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -226,6 +226,19 @@ cold_level_2 = 50 cold_level_3 = 0 + atmos_requirements = list( + "min_oxy" = 0, + "max_oxy" = 1, + "min_nitro" = 16, + "max_nitro" = 0, + "min_tox" = 0, + "max_tox" = 0.005, + "min_co2" = 0, + "max_co2" = 10, + "sa_para" = 1, + "sa_sleep" = 5 + ) + eyes = "vox_eyes_s" breath_type = "nitrogen" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 73bbd5a4281..623cc9df1e9 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -104,41 +104,6 @@ If you have any questions/constructive-comments/bugs-to-report/or have a massivl Please contact me on #coderbus IRC. ~Carn x */ -//Human Overlays Indexes///////// -#define MUTANTRACE_LAYER 1 -#define TAIL_UNDERLIMBS_LAYER 2 -#define LIMBS_LAYER 3 -#define MARKINGS_LAYER 4 -#define UNDERWEAR_LAYER 5 -#define MUTATIONS_LAYER 6 -#define DAMAGE_LAYER 7 -#define UNIFORM_LAYER 8 -#define ID_LAYER 9 -#define SHOES_LAYER 10 -#define GLOVES_LAYER 11 -#define EARS_LAYER 12 -#define SUIT_LAYER 13 -#define GLASSES_LAYER 14 -#define BELT_LAYER 15 //Possible make this an overlay of somethign required to wear a belt? -#define SUIT_STORE_LAYER 16 -#define BACK_LAYER 17 -#define TAIL_LAYER 18 //bs12 specific. this hack is probably gonna come back to haunt me -#define HAIR_LAYER 19 //TODO: make part of head layer? -#define HEAD_ACCESSORY_LAYER 20 -#define FHAIR_LAYER 21 -#define FACEMASK_LAYER 22 -#define HEAD_LAYER 23 -#define COLLAR_LAYER 24 -#define HANDCUFF_LAYER 25 -#define LEGCUFF_LAYER 26 -#define L_HAND_LAYER 27 -#define R_HAND_LAYER 28 -#define TARGETED_LAYER 29 //BS12: Layer for the target overlay from weapon targeting system -#define FIRE_LAYER 30 //If you're on fire -#define TOTAL_LAYERS 30 - - - /mob/living/carbon/human var/list/overlays_standing[TOTAL_LAYERS] var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed @@ -163,18 +128,26 @@ Please contact me on #coderbus IRC. ~Carn x update_hud() //TODO: remove the need for this var/stealth = 0 - for(var/obj/item/weapon/cloaking_device/S in list(l_hand,r_hand,belt,l_store,r_store)) - if(S.active) + var/obj/item/clothing/suit/armor/abductor/vest/V // Begin the most snowflakey bullshit code I've ever written. I'm so sorry, but there was no other way. + for(V in list(wear_suit)) + if(V.stealth_active) stealth = 1 break if(stealth) - icon = 'icons/mob/human.dmi' - icon_state = "body_cloaked" - var/image/I = overlays_standing[L_HAND_LAYER] - if(istype(I)) overlays += I - I = overlays_standing[R_HAND_LAYER] - if(istype(I)) overlays += I + icon = V.disguise.icon //if the suit is active, reference the suit's current loaded icon and overlays; this does not include hand overlays + overlays.Cut() + + for(var/thing in V.disguise.overlays) + if(thing) + overlays += thing + + var/image/I = overlays_standing[L_HAND_LAYER] //manually add both left and right hand, so its independently updated + if(istype(I)) + overlays += I + I = overlays_standing[R_HAND_LAYER] + if(istype(I)) + overlays += I else icon = stand_icon overlays.Cut() @@ -533,23 +506,6 @@ var/global/list/damage_icon_parts = list() add_image = 1 for(var/mut in mutations) switch(mut) - /* - if(HULK) - if(fat) - standing.underlays += "hulk_[fat]_s" - else - standing.underlays += "hulk_[g]_s" - add_image = 1 - if(RESIST_COLD) - standing.underlays += "fire[fat]_s" - add_image = 1 - if(RESIST_HEAT) - standing.underlays += "cold[fat]_s" - add_image = 1 - if(TK) - standing.underlays += "telekinesishead[fat]_s" - add_image = 1 - */ if(LASER) standing.overlays += "lasereyes_s" add_image = 1 @@ -989,16 +945,19 @@ var/global/list/damage_icon_parts = list() update_icons() /mob/living/carbon/human/update_inv_legcuffed(var/update_icons=1) + clear_alert("legcuffed") if(legcuffed) overlays_standing[LEGCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "legcuff1") - if(src.m_intent != "walk") - src.m_intent = "walk" - if(src.hud_used && src.hud_used.move_intent) - src.hud_used.move_intent.icon_state = "walking" + throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = src.legcuffed) + if(m_intent != "walk") + m_intent = "walk" + if(hud_used && hud_used.move_intent) + hud_used.move_intent.icon_state = "walking" else overlays_standing[LEGCUFF_LAYER] = null - if(update_icons) update_icons() + if(update_icons) + update_icons() /mob/living/carbon/human/update_inv_r_hand(var/update_icons=1) @@ -1237,34 +1196,11 @@ var/global/list/damage_icon_parts = list() O.sync_colour_to_human(src) update_body(0) -//Human Overlays Indexes///////// -#undef MUTANTRACE_LAYER -#undef TAIL_UNDERLIMBS_LAYER -#undef LIMBS_LAYER -#undef MARKINGS_LAYER -#undef MUTATIONS_LAYER -#undef DAMAGE_LAYER -#undef UNIFORM_LAYER -#undef ID_LAYER -#undef SHOES_LAYER -#undef GLOVES_LAYER -#undef EARS_LAYER -#undef SUIT_LAYER -#undef GLASSES_LAYER -#undef FACEMASK_LAYER -#undef BELT_LAYER -#undef SUIT_STORE_LAYER -#undef BACK_LAYER -#undef TAIL_LAYER -#undef HAIR_LAYER -#undef HEAD_LAYER -#undef HEAD_ACCESSORY_LAYER -#undef FHAIR_LAYER -#undef COLLAR_LAYER -#undef HANDCUFF_LAYER -#undef LEGCUFF_LAYER -#undef L_HAND_LAYER -#undef R_HAND_LAYER -#undef TARGETED_LAYER -#undef FIRE_LAYER -#undef TOTAL_LAYERS +/mob/living/carbon/human/proc/get_overlays_copy(list/unwantedLayers) + var/list/out = new + for(var/i=1;i<=TOTAL_LAYERS;i++) + if(overlays_standing[i]) + if(i in unwantedLayers) + continue + out += overlays_standing[i] + return out diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 43794bed7b8..7b3f74ef65f 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -95,8 +95,7 @@ if(!breath || (breath.total_moles() == 0)) adjustOxyLoss(1) failed_last_breath = 1 - - oxygen_alert = max(oxygen_alert, 1) + throw_alert("oxy", /obj/screen/alert/oxy) return 0 var/safe_oxy_min = 16 @@ -125,13 +124,13 @@ else adjustOxyLoss(3) failed_last_breath = 1 - oxygen_alert = max(oxygen_alert, 1) + throw_alert("oxy", /obj/screen/alert/oxy) else //Enough oxygen failed_last_breath = 0 adjustOxyLoss(-5) oxygen_used = breath.oxygen/6 - oxygen_alert = 0 + clear_alert("oxy") breath.oxygen -= oxygen_used breath.carbon_dioxide += oxygen_used @@ -147,9 +146,7 @@ adjustOxyLoss(8) if(prob(20)) spawn(0) emote("cough") - co2_alert = max(co2_alert, 1) else - co2_alert = 0 co2overloadtime = 0 //TOXINS/PLASMA @@ -157,9 +154,9 @@ var/ratio = (breath.toxins/safe_tox_max) * 10 if(reagents) reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) - toxins_alert = max(toxins_alert, 1) + throw_alert("tox_in_air", /obj/screen/alert/tox_in_air) else - toxins_alert = 0 + clear_alert("tox_in_air") //TRACE GASES if(breath.trace_gases.len) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 6e47fd45626..866c01c9702 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -15,7 +15,6 @@ if(BRUTE) adjustBruteLoss(damage * blocked) if(BURN) - if(RESIST_HEAT in mutations) damage = 0 adjustFireLoss(damage * blocked) if(TOX) adjustToxLoss(damage * blocked) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index ebbda839e52..59a208d7c2e 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -155,6 +155,9 @@ /mob/living/proc/handle_sleeping() if(sleeping) AdjustSleeping(-1) + throw_alert("asleep", /obj/screen/alert/asleep) + else + clear_alert("asleep") return sleeping @@ -193,10 +196,10 @@ return if(blinded || eye_blind) overlay_fullscreen("blind", /obj/screen/fullscreen/blind) - //throw_alert("blind", /obj/screen/alert/blind) + throw_alert("blind", /obj/screen/alert/blind) else clear_fullscreen("blind") - //clear_alert("blind") + clear_alert("blind") if(disabilities & NEARSIGHTED) overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1) @@ -210,10 +213,10 @@ if(druggy) overlay_fullscreen("high", /obj/screen/fullscreen/high) - //throw_alert("high", /obj/screen/alert/high) + throw_alert("high", /obj/screen/alert/high) else clear_fullscreen("high") - //clear_alert("high") + clear_alert("high") if(machine) if(!machine.check_eye(src)) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 4d5245cbf12..3289024cce9 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -92,9 +92,6 @@ //sort of a legacy burn method for /electrocute, /shock, and the e_chair /mob/living/proc/burn_skin(burn_amount) if(istype(src, /mob/living/carbon/human)) -// to_chat(world, "DEBUG: burn_skin(), mutations=[mutations]") - if (RESIST_HEAT in src.mutations) //fireproof - return 0 var/mob/living/carbon/human/H = src //make this damage method divide the damage to be done among all the body parts, then burn each body part for that much damage. will have better effect then just randomly picking a body part var/divided_damage = (burn_amount)/(H.organs.len) var/extradam = 0 //added to when organ is at max dam @@ -522,262 +519,74 @@ set name = "Resist" set category = "IC" - if(!isliving(usr) || usr.next_move > world.time) + if(!isliving(src) || next_move > world.time || stat || weakened || stunned || paralysis) return - usr.changeNext_move(CLICK_CD_RESIST) + changeNext_move(CLICK_CD_RESIST) - var/mob/living/L = usr - - //Resisting control by an alien mind. - if(istype(src.loc,/mob/living/simple_animal/borer)) - resist_borer() - - //resisting grabs (as if it helps anyone...) - if ((!(L.stat) && !(L.restrained()))) - resist_grab(L) //this passes L because the proc requires a typecasted mob/living instead of just 'src' + if(!restrained()) + if(resist_grab()) + return //unbuckling yourself - if(L.buckled && (L.last_special <= world.time) ) - resist_buckle(L) //this passes L because the proc requires a typecasted mob/living instead of just 'src' + if(buckled && last_special <= world.time) + resist_buckle() - //Breaking out of an object? - else if(src.loc && istype(src.loc, /obj) && (!isturf(src.loc))) - if(stat == CONSCIOUS && !stunned && !weakened && !paralysis) - var/obj/C = loc - C.container_resist(L) + //Breaking out of a container (Locker, sleeper, cryo...) + else if(isobj(loc)) + var/obj/C = loc + C.container_resist(src) - //breaking out of handcuffs - else if(iscarbon(L)) - var/mob/living/carbon/CM = L - - if(CM.on_fire && CM.canmove) - resist_stop_drop_roll(CM) //this passes CM because the proc requires a typecasted mob/living/carbon instead of just 'src' - - if(CM.handcuffed && CM.canmove && (CM.last_special <= world.time))//this passes CM because the proc requires a typecasted mob/living/carbon instead of just 'src' - resist_handcuffs(CM) - - else if(CM.legcuffed && CM.canmove && (CM.last_special <= world.time)) //this passes CM because the proc requires a typecasted mob/living/carbon instead of just 'src' - resist_legcuffs(CM) + else if(canmove) + if(on_fire) + resist_fire() //stop, drop, and roll + else if(last_special <= world.time) + resist_restraints() //trying to remove cuffs. /*//////////////////// RESIST SUBPROCS *///////////////////// - -/* resist_borer allows a mob to regain control of their body after a borer has assumed control. -*///// -/mob/living/proc/resist_borer() - var/mob/living/simple_animal/borer/B = src.loc - var/mob/living/captive_brain/H = src - - to_chat(H, "\red You begin doggedly resisting the parasite's control (this will take approximately sixty seconds).") - to_chat(B.host, "\red You feel the captive mind of [src] begin to resist your control.") - - spawn(rand(350,450)+B.host.brainloss) - - if(!B || !B.controlling) - return - - B.host.adjustBrainLoss(rand(5,10)) - to_chat(H, "\red With an immense exertion of will, you regain control of your body!") - to_chat(B.host, "\red You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you.") - - B.detatch() - - verbs -= /mob/living/carbon/proc/release_control - verbs -= /mob/living/carbon/proc/punish_host - verbs -= /mob/living/carbon/proc/spawn_larvae - - return - -/* resist_grab allows a mob to resist a grab from another mob when disarming is not an option/neckgrabbed. -*///// -/mob/living/proc/resist_grab(var/mob/living/L) +/mob/living/proc/resist_grab() var/resisting = 0 - - for(var/obj/O in L.requests) - L.requests.Remove(O) + for(var/obj/O in requests) qdel(O) resisting++ - - for(var/obj/item/weapon/grab/G in usr.grabbed_by) + for(var/X in grabbed_by) + var/obj/item/weapon/grab/G = X resisting++ - if (G.state == 1) - qdel(G) + switch(G.state) + if(GRAB_PASSIVE) + qdel(G) - else - if(G.state == 2) + if(GRAB_AGGRESSIVE) if(prob(60)) - for(var/mob/O in viewers(L, null)) - O.show_message(text("\red [] has broken free of []'s grip!", L, G.assailant), 1) + visible_message("[src] has broken free of [G.assailant]'s grip!") qdel(G) - else - if(G.state == 3) - if(prob(5)) - for(var/mob/O in viewers(usr, null)) - O.show_message(text("\red [] has broken free of []'s headlock!", L, G.assailant), 1) - qdel(G) + if(GRAB_NECK) + if(prob(5)) + visible_message("[src] has broken free of [G.assailant]'s headlock!") + qdel(G) if(resisting) - for(var/mob/O in viewers(usr, null)) - O.show_message(text("\red [] resists!", L), 1) + visible_message("[src] resists!") + return 1 -/* resist_buckle allows a mob that is bucklecuffed to break free of the chair/bed/whatever -*///// -/mob/living/proc/resist_buckle(var/mob/living/L) - if(iscarbon(L)) - var/mob/living/carbon/C = L - - if(C.handcuffed) - C.changeNext_move(CLICK_CD_BREAKOUT) - C.last_special = world.time + CLICK_CD_BREAKOUT - - to_chat(C, "\red You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stay still)") - for(var/mob/O in viewers(L)) - O.show_message("\red [usr] attempts to unbuckle themself!", 1) - - spawn(0) - if(do_after(usr, 1200, target = C)) - if(!C.buckled) - return - for(var/mob/O in viewers(C)) - O.show_message("\red [usr] manages to unbuckle themself!", 1) - to_chat(C, "\blue You successfully unbuckle yourself.") - C.buckled.user_unbuckle_mob(C,C) - - else - L.buckled.user_unbuckle_mob(L,L) - -/* resist_stop_drop_roll allows a mob to stop, drop, and roll in order to put out a fire burning on them. -*///// -/mob/living/proc/resist_stop_drop_roll(var/mob/living/carbon/CM) - CM.fire_stacks -= 5 - CM.weakened = max(CM.weakened, 3)//We dont check for CANWEAKEN, I don't care how immune to weakening you are, if you're rolling on the ground, you're busy. - CM.update_canmove() - CM.spin(32,2) - CM.visible_message("[CM] rolls on the floor, trying to put themselves out!", \ - "You stop, drop, and roll!") - sleep(30) - if(fire_stacks <= 0) - CM.visible_message("[CM] has successfully extinguished themselves!", \ - "You extinguish yourself.") - ExtinguishMob() +/mob/living/proc/resist_borer() return -/* resist_handcuffs allows a mob to break/remove their handcuffs after a delay -*///// -/mob/living/proc/resist_handcuffs(var/mob/living/carbon/CM) - CM.changeNext_move(CLICK_CD_BREAKOUT) - CM.last_special = world.time + CLICK_CD_BREAKOUT - var/obj/item/weapon/restraints/handcuffs/HC = CM.handcuffed +/mob/living/proc/resist_buckle() + buckled.user_unbuckle_mob(src,src) - var/breakouttime = 1200 //A default in case you are somehow handcuffed with something that isn't an obj/item/weapon/restraints/handcuffs type - var/displaytime = 2 //Minutes to display in the "this will take X minutes." +/mob/living/proc/resist_fire() + return - var/hulklien = 0 //variable used to define if someone is a hulk or alien - - if(istype(HC)) //If you are handcuffed with actual handcuffs... Well what do I know, maybe someone will want to handcuff you with toilet paper in the future... - breakouttime = HC.breakouttime - displaytime = breakouttime / 600 //Minutes - - if(isalienadult(CM) || (HULK in usr.mutations)) - hulklien = 1 - breakouttime = 50 - displaytime = 5 - - to_chat(CM, "\red You attempt to remove \the [HC]. (This will take around [displaytime] [hulklien ? "seconds" : "minute[displaytime==1 ? "" : "s"]"] and you need to stand still)") - for(var/mob/O in viewers(CM)) - O.show_message( "\red [usr] attempts to [hulklien ? "break" : "remove"] \the [HC]!", 1) - spawn(0) - if(do_after(CM, breakouttime, target = src)) - if(!CM.handcuffed || CM.buckled) - return // time leniency for lag which also might make this whole thing pointless but the server - - for(var/mob/O in viewers(CM))// lags so hard that 40s isn't lenient enough - Quarxink - O.show_message("\red [CM] manages to [hulklien ? "break" : "remove"] the handcuffs!", 1) - - to_chat(CM, "\blue You successfully [hulklien ? "break" : "remove"] \the [CM.handcuffed].") - - if(hulklien) - CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - qdel(CM.handcuffed) - CM.handcuffed = null - if(CM.buckled && CM.buckled.buckle_requires_restraints) - CM.buckled.unbuckle_mob() - CM.update_inv_handcuffed() - return - - CM.unEquip(CM.handcuffed) - -/* resist_legcuffs allows a mob to break/remove their legcuffs after a delay -*///// -/mob/living/proc/resist_legcuffs(var/mob/living/carbon/CM) - var/obj/item/weapon/restraints/legcuffs/HC = CM.legcuffed - - var/breakouttime = 1200 //A default in case you are somehow legcuffed with something that isn't an obj/item/weapon/legcuffs type - var/displaytime = 2 //Minutes to display in the "this will take X minutes." - - var/hulklien = 0 //variable used to define if someone is a hulk or alien - - if(istype(HC)) //If you are legcuffed with actual legcuffs... Well what do I know, maybe someone will want to legcuff you with toilet paper in the future... - breakouttime = HC.breakouttime - displaytime = breakouttime / 600 //Minutes - - if(isalienadult(CM) || (HULK in usr.mutations)) - hulklien = 1 - breakouttime = 50 - displaytime = 5 - - to_chat(CM, "\red You attempt to remove \the [HC]. (This will take around [displaytime] [hulklien ? "seconds" : "minute[displaytime==1 ? "" : "s"]"] and you need to stand still)") - - for(var/mob/O in viewers(CM)) - O.show_message( "\red [usr] attempts to [hulklien ? "break" : "remove"] \the [HC]!", 1) - - spawn(0) - if(do_after(CM, breakouttime, target = src)) - if(!CM.legcuffed || CM.buckled) - return // time leniency for lag which also might make this whole thing pointless but the server - for(var/mob/O in viewers(CM))// lags so hard that 40s isn't lenient enough - Quarxink - O.show_message("\red [CM] manages to [hulklien ? "break" : "remove"] the legcuffs!", 1) - - to_chat(CM, "\blue You successfully [hulklien ? "break" : "remove"] \the [CM.legcuffed].") - - if(!hulklien) - CM.unEquip(CM.legcuffed) - - if(hulklien) - CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - qdel(CM.legcuffed) - - CM.legcuffed = null - CM.update_inv_legcuffed() +/mob/living/proc/resist_restraints() + return /*////////////////////// END RESIST PROCS */////////////////////// - - - - -/mob/living/carbon/proc/spin(spintime, speed) - spawn() - var/D = dir - while(spintime >= speed) - sleep(speed) - switch(D) - if(NORTH) - D = EAST - if(SOUTH) - D = WEST - if(EAST) - D = SOUTH - if(WEST) - D = NORTH - dir = D - spintime -= speed - return - /mob/living/proc/Exhaust() to_chat(src, "You're too exhausted to keep going...") Weaken(5) @@ -788,6 +597,10 @@ /mob/living/update_gravity(has_gravity) if(!ticker) return + if(has_gravity) + clear_alert("weightless") + else + throw_alert("weightless", /obj/screen/alert/weightless) float(!has_gravity) /mob/living/proc/float(on) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index b48aa36a64c..4d994436489 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -39,14 +39,6 @@ /mob/living/bullet_act(var/obj/item/projectile/P, var/def_zone) - //Being hit while using a cloaking device - var/obj/item/weapon/cloaking_device/C = locate((/obj/item/weapon/cloaking_device) in src) - if(C && C.active) - C.attack_self(src)//Should shut it off - update_icons() - to_chat(src, "\blue Your [C.name] was disrupted!") - Stun(2) - //Armor var/armor = run_armor_check(def_zone, P.flag, armour_penetration = P.armour_penetration) var/proj_sharp = is_sharp(P) @@ -173,6 +165,7 @@ if(fire_stacks > 0 && !on_fire) on_fire = 1 set_light(light_range + 3,l_color = "#ED9200") + throw_alert("fire", /obj/screen/alert/fire) update_fire() /mob/living/proc/ExtinguishMob() @@ -180,6 +173,7 @@ on_fire = 0 fire_stacks = 0 set_light(max(0,light_range - 3)) + clear_alert("fire") update_fire() /mob/living/proc/update_fire() diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index ef2cc344cdf..3260015f64b 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -334,6 +334,10 @@ proc/get_radio_key_from_channel(var/channel) whisper_say(message, speaking) +// for weird circumstances where you're inside an atom that is also you, like pai's +/mob/living/proc/get_whisper_loc() + return src + /mob/living/proc/whisper_say(var/message, var/datum/language/speaking = null, var/alt_name="", var/verb="whispers") if(client) if(client.prefs.muted & MUTE_IC) @@ -382,7 +386,8 @@ proc/get_radio_key_from_channel(var/channel) if(!message || message=="") return - var/list/listening = hearers(message_range, src) + var/atom/whisper_loc = get_whisper_loc() + var/list/listening = hearers(message_range, whisper_loc) listening |= src //ghosts @@ -399,16 +404,16 @@ proc/get_radio_key_from_channel(var/channel) listening += C //pass on the message to objects that can hear us. - for(var/obj/O in view(message_range, src)) + for(var/obj/O in view(message_range, whisper_loc)) spawn(0) if(O) O.hear_talk(src, message, verb, speaking) - var/list/eavesdropping = hearers(eavesdropping_range, src) + var/list/eavesdropping = hearers(eavesdropping_range, whisper_loc) eavesdropping -= src eavesdropping -= listening - var/list/watching = hearers(watching_range, src) + var/list/watching = hearers(watching_range, whisper_loc) watching -= src watching -= listening watching -= eavesdropping diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm index 27e431e1675..30784e61b93 100644 --- a/code/modules/mob/living/silicon/laws.dm +++ b/code/modules/mob/living/silicon/laws.dm @@ -10,6 +10,7 @@ return laws.zeroth_law != null /mob/living/silicon/proc/set_zeroth_law(var/law, var/law_borg) + throw_alert("newlaw", /obj/screen/alert/newlaw) laws_sanity_check() laws.set_zeroth_law(law, law_borg) if(!isnull(usr) && law) @@ -21,42 +22,49 @@ to_chat(src, "Internal camera is currently being accessed.") /mob/living/silicon/proc/add_ion_law(var/law) + throw_alert("newlaw", /obj/screen/alert/newlaw) laws_sanity_check() laws.add_ion_law(law) if(!isnull(usr) && law) log_and_message_admins("has given [src] the ion law: [law]") /mob/living/silicon/proc/add_inherent_law(var/law) + throw_alert("newlaw", /obj/screen/alert/newlaw) laws_sanity_check() laws.add_inherent_law(law) if(!isnull(usr) && law) log_and_message_admins("has given [src] the inherent law: [law]") /mob/living/silicon/proc/add_supplied_law(var/number, var/law) + throw_alert("newlaw", /obj/screen/alert/newlaw) laws_sanity_check() laws.add_supplied_law(number, law) if(!isnull(usr) && law) log_and_message_admins("has given [src] the supplied law: [law]") /mob/living/silicon/proc/delete_law(var/datum/ai_law/law) + throw_alert("newlaw", /obj/screen/alert/newlaw) laws_sanity_check() laws.delete_law(law) if(!isnull(usr) && law) log_and_message_admins("has deleted a law belonging to [src]: [law.law]") /mob/living/silicon/proc/clear_inherent_laws(var/silent = 0) + throw_alert("newlaw", /obj/screen/alert/newlaw) laws_sanity_check() laws.clear_inherent_laws() if(!silent && !isnull(usr)) log_and_message_admins("cleared the inherent laws of [src]") /mob/living/silicon/proc/clear_ion_laws(var/silent = 0) + throw_alert("newlaw", /obj/screen/alert/newlaw) laws_sanity_check() laws.clear_ion_laws() if(!silent && !isnull(usr)) log_and_message_admins("cleared the ion laws of [src]") /mob/living/silicon/proc/clear_supplied_laws(var/silent = 0) + throw_alert("newlaw", /obj/screen/alert/newlaw) laws_sanity_check() laws.clear_supplied_laws() if(!silent && !isnull(usr)) @@ -108,10 +116,10 @@ /mob/living/silicon/proc/lawsync() laws_sanity_check() laws.sort_laws() - + /mob/living/silicon/proc/make_laws() switch(config.default_laws) - if(0) + if(0) laws = new /datum/ai_laws/crewsimov() else laws = get_random_lawset() @@ -122,6 +130,6 @@ for(var/law in paths) var/datum/ai_laws/L = new law if(!L.default) - continue + continue law_options += L return pick(law_options) diff --git a/code/modules/mob/living/silicon/pai/say.dm b/code/modules/mob/living/silicon/pai/say.dm index 2c7bc900d68..1acb470773a 100644 --- a/code/modules/mob/living/silicon/pai/say.dm +++ b/code/modules/mob/living/silicon/pai/say.dm @@ -2,4 +2,12 @@ if(silence_time) to_chat(src, "Communication circuits remain uninitialized.") else - ..(msg) \ No newline at end of file + ..(msg) + +/mob/living/silicon/pai/get_whisper_loc() + if(loc == card) // currently in its card? + if(istype(card.loc, /mob/living)) + return card.loc // allow a pai being held or in pocket to whisper + else + return card // allow a pai in its card to whisper + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm index 305c89e87cb..151fc6de51d 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm @@ -38,10 +38,9 @@ set desc = "Activate a low power omnidirectional LED. Toggled on or off." set category = "Drone" - if(luminosity) - set_light(0) - return - set_light(2) + if(lamp_intensity) + lamp_intensity = lamp_max // setting this to lamp_max will make control_headlamp shutoff the lamp + control_headlamp() //Actual picking-up event. /mob/living/silicon/robot/drone/attack_hand(mob/living/carbon/human/M as mob) diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index d247d726003..fa534b66123 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -176,6 +176,10 @@ /mob/living/silicon/robot/handle_hud_icons() update_items() update_cell() + if(emagged) + throw_alert("hacked", /obj/screen/alert/hacked) + else + clear_alert("hacked") ..() /mob/living/silicon/robot/handle_hud_icons_health() @@ -196,79 +200,47 @@ else healths.icon_state = "health7" - if(bodytemp) - switch(bodytemperature) //310.055 optimal body temp - if(335 to INFINITY) - bodytemp.icon_state = "temp2" - if(320 to 335) - bodytemp.icon_state = "temp1" - if(300 to 320) - bodytemp.icon_state = "temp0" - if(260 to 300) - bodytemp.icon_state = "temp-1" - else - bodytemp.icon_state = "temp-2" + switch(bodytemperature) //310.055 optimal body temp + if(335 to INFINITY) + throw_alert("temp", /obj/screen/alert/hot/robot, 2) + if(320 to 335) + throw_alert("temp", /obj/screen/alert/hot/robot, 1) + if(300 to 320) + clear_alert("temp") + if(260 to 300) + throw_alert("temp", /obj/screen/alert/cold/robot, 1) + else + throw_alert("temp", /obj/screen/alert/cold/robot, 2) /mob/living/silicon/robot/proc/update_cell() - if(cells) - if(cell) - var/cellcharge = cell.charge/cell.maxcharge - switch(cellcharge) - if(0.75 to INFINITY) - cells.icon_state = "charge4" - if(0.5 to 0.75) - cells.icon_state = "charge3" - if(0.25 to 0.5) - cells.icon_state = "charge2" - if(0 to 0.25) - cells.icon_state = "charge1" - else - cells.icon_state = "charge0" - else - cells.icon_state = "charge-empty" - - -/*/mob/living/silicon/robot/handle_regular_hud_updates() -// if(!client) -// return -// -// switch(sensor_mode) -// if(SEC_HUD) -// process_sec_hud(src,1) -// if(MED_HUD) -// process_med_hud(src,1) - - if(syndicate) - if(ticker.mode.name == "traitor") - for(var/datum/mind/tra in ticker.mode.traitors) - if(tra.current) - var/I = image('icons/mob/mob.dmi', loc = tra.current, icon_state = "traitor") - src.client.images += I - if(connected_ai) - connected_ai.connected_robots -= src - connected_ai = null - if(mind) - if(!mind.special_role) - mind.special_role = "traitor" - ticker.mode.traitors += src.mind - - - ..() - return 1 - */ + if(cell) + var/cellcharge = cell.charge/cell.maxcharge + switch(cellcharge) + if(0.75 to INFINITY) + clear_alert("charge") + if(0.5 to 0.75) + throw_alert("charge", /obj/screen/alert/lowcell, 1) + if(0.25 to 0.5) + throw_alert("charge", /obj/screen/alert/lowcell, 2) + if(0.01 to 0.25) + throw_alert("charge", /obj/screen/alert/lowcell, 3) + else + throw_alert("charge", /obj/screen/alert/emptycell) + else + throw_alert("charge", /obj/screen/alert/nocell) /mob/living/silicon/robot/proc/update_items() - if (src.client) + if (client) for(var/obj/I in get_all_slots()) client.screen |= I - if(src.module_state_1) - src.module_state_1:screen_loc = ui_inv1 - if(src.module_state_2) - src.module_state_2:screen_loc = ui_inv2 - if(src.module_state_3) - src.module_state_3:screen_loc = ui_inv3 + if(module_state_1) + module_state_1:screen_loc = ui_inv1 + if(module_state_2) + module_state_2:screen_loc = ui_inv2 + if(module_state_3) + module_state_3:screen_loc = ui_inv3 update_icons() /mob/living/silicon/robot/proc/process_locks() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index d089eb98467..58f965dad7e 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -17,7 +17,6 @@ var/list/robot_verbs_default = list( //Hud stuff - var/obj/screen/cells = null var/obj/screen/inv1 = null var/obj/screen/inv2 = null var/obj/screen/inv3 = null @@ -786,6 +785,7 @@ var/list/robot_verbs_default = list( else sleep(6) emagged = 1 + SetLockdown(1) //Borgs were getting into trouble because they would attack the emagger before the new laws were shown if(src.hud_used) src.hud_used.update_robot_modules_display() //Shows/hides the emag item if the inventory screen is already open. disconnect_from_ai() @@ -814,6 +814,7 @@ var/list/robot_verbs_default = list( to_chat(src, "Obey these laws:") laws.show_laws(src) to_chat(src, "\red \b ALERT: [M.real_name] is your new master. Obey your new laws and his commands.") + SetLockdown(0) if(src.module && istype(src.module, /obj/item/weapon/robot_module/miner)) for(var/obj/item/weapon/pickaxe/drill/cyborg/D in src.module.modules) qdel(D) @@ -1256,6 +1257,10 @@ var/list/robot_verbs_default = list( // They stay locked down if their wire is cut. if(wires.LockedCut()) state = 1 + if(state) + throw_alert("locked", /obj/screen/alert/locked) + else + clear_alert("locked") lockcharge = state update_canmove() diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 1eebe03d1ab..a546e164901 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -30,7 +30,10 @@ /mob/living/silicon/pai/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) if(..()) return 1 - if(message_mode) + else if(message_mode == "whisper") + whisper_say(message, speaking, alt_name) + return 1 + else if(message_mode) if(message_mode == "general") message_mode = null return radio.talk_into(src,message,message_mode,verb,speaking) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index b9bf9046482..c80fcd9a92c 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -84,6 +84,20 @@ hud_possible = list(DIAG_STAT_HUD, DIAG_BOT_HUD, DIAG_HUD) //Diagnostic HUD views +/obj/item/device/radio/headset/bot + subspace_transmission = 1 + canhear_range = 0 + +/obj/item/device/radio/headset/bot/recalculateChannels() + var/mob/living/simple_animal/bot/B = loc + if(istype(B)) + if(!B.radio_config) + B.radio_config = list("AI Private" = 1) + if(!(B.radio_channel in B.radio_config)) // put it first so it's the :h channel + B.radio_config.Insert(1, "[B.radio_channel]") + B.radio_config["[B.radio_channel]"] = 1 + config(B.radio_config) + /mob/living/simple_animal/bot/proc/get_mode() if(client) //Player bots do not have modes, thus the override. Also an easy way for PDA users/AI to know when a bot is a player. if(paicard) @@ -123,15 +137,7 @@ //This access is so bots can be immediately set to patrol and leave Robotics, instead of having to be let out first. access_card.access += access_robotics set_custom_texts() - Radio = new/obj/item/device/radio/headset(src) - Radio.subspace_transmission = 1 - Radio.canhear_range = 0 // anything greater will have the bot broadcast the channel as if it were saying it out loud. - if(!radio_config) - radio_config = list("AI Private" = 1) - if(!(radio_channel in radio_config)) // put it first so it's the :h channel - radio_config.Insert(1, "[radio_channel]") - radio_config["[radio_channel]"] = 1 - Radio.config(radio_config) + Radio = new/obj/item/device/radio/headset/bot(src) add_language("Galactic Common", 1) add_language("Sol Common", 1) @@ -1000,15 +1006,14 @@ Pass a positive integer as an argument to override a bot's default speed. /mob/living/simple_animal/bot/handle_hud_icons_health() ..() - if(bodytemp) - switch(bodytemperature) //310.055 optimal body temp - if(335 to INFINITY) - bodytemp.icon_state = "temp2" - if(320 to 335) - bodytemp.icon_state = "temp1" - if(300 to 320) - bodytemp.icon_state = "temp0" - if(260 to 300) - bodytemp.icon_state = "temp-1" - else - bodytemp.icon_state = "temp-2" \ No newline at end of file + switch(bodytemperature) //310.055 optimal body temp + if(335 to INFINITY) + throw_alert("temp", /obj/screen/alert/hot/robot, 2) + if(320 to 335) + throw_alert("temp", /obj/screen/alert/hot/robot, 1) + if(300 to 320) + clear_alert("temp") + if(260 to 300) + throw_alert("temp", /obj/screen/alert/cold/robot, 1) + else + throw_alert("temp", /obj/screen/alert/cold/robot, 2) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index a68837ef7ff..12dd032ba49 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -38,6 +38,7 @@ var/arrest_type = 0 //If true, don't handcuff var/projectile = /obj/item/projectile/energy/electrode //Holder for projectile type var/shoot_sound = 'sound/weapons/Taser.ogg' + allow_pai = 0 /mob/living/simple_animal/bot/ed209/New(loc,created_name,created_lasercolor) @@ -565,5 +566,5 @@ Auto Patrol[]"}, return if(!C.handcuffed) C.handcuffed = new /obj/item/weapon/restraints/handcuffs/cable/zipties/used(C) - C.update_inv_handcuffed(1) + C.update_handcuffed() back_to_idle() diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 1d3d2198fcc..284584406c2 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -33,6 +33,7 @@ var/harmbaton = 0 //If true, beat instead of stun var/flashing_lights = 0 //If true, flash lights var/prev_flashing_lights = 0 + allow_pai = 0 /mob/living/simple_animal/bot/secbot/beepsky name = "Officer Beepsky" @@ -40,7 +41,6 @@ idcheck = 0 weaponscheck = 0 auto_patrol = 1 - allow_pai = 0 /mob/living/simple_animal/bot/secbot/beepsky/explode() var/turf/Tsec = get_turf(src) @@ -54,7 +54,6 @@ name = "Officer Pingsky" desc = "It's Officer Pingsky! Delegated to satellite guard duty for harbouring anti-human sentiment." radio_channel = "AI Private" - allow_pai = 0 /mob/living/simple_animal/bot/secbot/ofitser name = "Prison Ofitser" @@ -62,7 +61,6 @@ idcheck = 0 weaponscheck = 1 auto_patrol = 1 - allow_pai = 0 /mob/living/simple_animal/bot/secbot/buzzsky name = "Officer Buzzsky" @@ -229,7 +227,7 @@ Auto Patrol: []"}, return if(!C.handcuffed) C.handcuffed = new /obj/item/weapon/restraints/handcuffs/cable/zipties/used(C) - C.update_inv_handcuffed(1) + C.update_handcuffed() playsound(loc, pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg'), 50, 0) back_to_idle() diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index cc1de35947d..fd38b3e81c7 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -33,6 +33,8 @@ /mob/living/simple_animal/hostile/Life() . = ..() + if(ranged) + ranged_cooldown-- if(!.) walk(src, 0) return 0 @@ -46,8 +48,6 @@ /mob/living/simple_animal/hostile/handle_automated_action() if(AIStatus == AI_OFF) return 0 - if(ranged) - ranged_cooldown-- var/list/possible_targets = ListTargets() //we look around for potential targets and make it a list for later use. if(environment_smash) EscapeConfinement() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index b86a034a69e..23477c2fc18 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -101,18 +101,6 @@ ..() health = Clamp(health, 0, maxHealth) -/mob/living/simple_animal/handle_hud_icons() - ..() - if(fire) - if(fire_alert) fire.icon_state = "fire[fire_alert]" //fire_alert is either 0 if no alert, 1 for heat and 2 for cold. - else fire.icon_state = "fire0" - if(oxygen) - if(oxygen_alert) oxygen.icon_state = "oxy1" - else oxygen.icon_state = "oxy0" - if(toxin) - if(toxins_alert) toxin.icon_state = "tox1" - else toxin.icon_state = "tox0" - /mob/living/simple_animal/handle_hud_icons_health() ..() if(healths && maxHealth > 0) @@ -215,21 +203,21 @@ if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"]) atmos_suitable = 0 - oxygen_alert = 1 + throw_alert("oxy", /obj/screen/alert/oxy) else if(atmos_requirements["max_oxy"] && oxy > atmos_requirements["max_oxy"]) atmos_suitable = 0 - oxygen_alert = 1 + throw_alert("oxy", /obj/screen/alert/too_much_oxy) else - oxygen_alert = 0 + clear_alert("oxy") if(atmos_requirements["min_tox"] && tox < atmos_requirements["min_tox"]) atmos_suitable = 0 - toxins_alert = 1 + throw_alert("tox_in_air", /obj/screen/alert/not_enough_tox) else if(atmos_requirements["max_tox"] && tox > atmos_requirements["max_tox"]) atmos_suitable = 0 - toxins_alert = 1 + throw_alert("tox_in_air", /obj/screen/alert/tox_in_air) else - toxins_alert = 0 + clear_alert("tox_in_air") if(atmos_requirements["min_n2"] && n2 < atmos_requirements["min_n2"]) atmos_suitable = 0 diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 0121905380a..ac459679f10 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -14,16 +14,10 @@ var/obj/screen/hands = null var/obj/screen/pullin = null var/obj/screen/internals = null - var/obj/screen/oxygen = null var/obj/screen/i_select = null var/obj/screen/m_select = null - var/obj/screen/toxin = null - var/obj/screen/fire = null - var/obj/screen/bodytemp = null var/obj/screen/healths = null var/obj/screen/throw_icon = null - var/obj/screen/nutrition_icon = null - var/obj/screen/pressure = null var/obj/screen/gun/item/item_use_icon = null var/obj/screen/gun/move/gun_move_icon = null var/obj/screen/gun/run/gun_run_icon = null diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 1f2e0e7b456..a967c2df779 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -556,12 +556,28 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM) lname = "[lname] " to_chat(M, "[lname][follow][message]") -/proc/notify_ghosts(var/message, var/ghost_sound = null) //Easy notification of ghosts. +/proc/notify_ghosts(var/message, var/ghost_sound = null, var/enter_link = null, var/atom/source = null, var/image/alert_overlay = null, var/attack_not_jump = 0) //Easy notification of ghosts. for(var/mob/dead/observer/O in player_list) if(O.client) - to_chat(O, "[message]") + to_chat(O, "[message][(enter_link) ? " [enter_link]" : ""]") if(ghost_sound) - to_chat(O, sound(ghost_sound)) + O << sound(ghost_sound) + if(source) + var/obj/screen/alert/notify_jump/A = O.throw_alert("\ref[source]_notify_jump", /obj/screen/alert/notify_jump) + if(A) + if(O.client.prefs && O.client.prefs.UI_style) + A.icon = ui_style2icon(O.client.prefs.UI_style) + A.desc = message + A.attack_not_jump = attack_not_jump + A.jump_target = source + if(!alert_overlay) + var/old_layer = source.layer + source.layer = FLOAT_LAYER + A.overlays += source + source.layer = old_layer + else + alert_overlay.layer = FLOAT_LAYER + A.overlays += alert_overlay /mob/proc/switch_to_camera(var/obj/machinery/camera/C) if (!C.can_use() || stat || (get_dist(C, src) > 1 || machine != src || blinded || !canmove)) diff --git a/code/modules/pda/radio.dm b/code/modules/pda/radio.dm index c64ea02ce7c..ae43ce10b3d 100644 --- a/code/modules/pda/radio.dm +++ b/code/modules/pda/radio.dm @@ -51,7 +51,7 @@ frequency.post_signal(src, signal, filter = s_filter) /obj/item/radio/integrated/receive_signal(datum/signal/signal) - if (signal.data["type"] == bot_type) + if (bot_type && istype(signal.source, /obj/machinery/bot_core) && signal.data["type"] == bot_type) if(!botlist) botlist = new() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 3890b433eaf..4cc08d08471 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -337,7 +337,6 @@ continue M.show_message("[user.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2) if(on && (W.flags & CONDUCT)) - //if(!user.mutations & RESIST_COLD) if (prob(12)) electrocute_mob(user, get_area(src), src, 0.3) broken() @@ -374,7 +373,6 @@ var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() - //if(!user.mutations & RESIST_COLD) if (prob(75)) electrocute_mob(user, get_area(src), src, rand(0.7,1.0)) diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 1c43e1a829d..9dfa9c13993 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -29,7 +29,8 @@ var/area/A = get_area(src) if(A) - notify_ghosts("Nar-Sie has risen in \the [A.name]. Reach out to the Geometer to be given a new shell for your soul.") + var/image/alert_overlay = image('icons/effects/effects.dmi', "ghostalertsie") + notify_ghosts("Nar-Sie has risen in \the [A.name]. Reach out to the Geometer to be given a new shell for your soul.", source = src, alert_overlay = alert_overlay, attack_not_jump = 1) narsie_spawn_animation() @@ -37,9 +38,6 @@ shuttle_master.emergency.request(null, 0.3) // Cannot recall /obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob) - if(!(src in view())) - to_chat(user, "Your soul is too far away.") - return makeNewConstruct(/mob/living/simple_animal/construct/harvester, user, null, 1) new /obj/effect/effect/sleep_smoke(user.loc) diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm index ee51efe2b1e..3a08a28a741 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm @@ -510,7 +510,7 @@ feedback_add_details("slime_cores_used","[type]") var/obj/effect/golemrune/Z = new /obj/effect/golemrune Z.forceMove(get_turf(holder.my_atom)) - notify_ghosts("Golem rune created in [get_area(Z)].", 'sound/effects/ghost2.ogg') + notify_ghosts("Golem rune created in [get_area(Z)].", 'sound/effects/ghost2.ogg', source = Z) //Bluespace /datum/chemical_reaction/slimefloor2 diff --git a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm index 999955a04bb..c7351d1c3fd 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm @@ -4,8 +4,11 @@ name = "glass" desc = "Your standard drinking glass." icon_state = "glass_empty" + item_state = "drinking_glass" amount_per_transfer_from_this = 10 volume = 50 + lefthand_file = 'icons/goonstation/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/goonstation/mob/inhands/items_righthand.dmi' materials = list(MAT_GLASS=500) diff --git a/code/modules/reagents/reagent_containers/food/drinks/shotglass.dm b/code/modules/reagents/reagent_containers/food/drinks/shotglass.dm new file mode 100644 index 00000000000..46289547909 --- /dev/null +++ b/code/modules/reagents/reagent_containers/food/drinks/shotglass.dm @@ -0,0 +1,23 @@ +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass + name = "shot glass" + desc = "No glasses were shot in the making of this glass." + icon_state = "shotglass" + amount_per_transfer_from_this = 15 + volume = 15 + materials = list(MAT_GLASS=100) + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/on_reagent_change() + overlays.Cut() + + if(reagents.total_volume) + var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]1") + switch(reagents.total_volume) + if(0 to 4) filling.icon_state = "[icon_state]1" + if(5 to 11) filling.icon_state = "[icon_state]5" + if(12 to INFINITY) filling.icon_state = "[icon_state]12" + + filling.icon += mix_color_from_reagents(reagents.reagent_list) + overlays += filling + name = "shot glass of " + reagents.get_master_reagent_name() //No matter what, the glass will tell you the reagent's name. Might be too abusable in the future. + else + name = "shot glass" diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 5c7e6d0ca4c..e95e213fd9f 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -96,14 +96,12 @@ return - var/time = 30 //Injecting through a hardsuit takes longer due to needing to find a port. + var/time = 30 if(istype(target,/mob/living/carbon/human)) var/mob/living/carbon/human/H = T if(H.species.flags & NO_BLOOD) to_chat(usr, "You are unable to locate any blood.") return - if(H.wear_suit && istype(H.wear_suit,/obj/item/clothing/suit/space)) - time = 60 if(target == user) time = 0 else @@ -185,18 +183,10 @@ return */ if(ismob(target) && target != user) - var/time = 30 //Injecting through a hardsuit takes longer due to needing to find a port. - if(istype(target,/mob/living/carbon/human)) - if(H.wear_suit && istype(H.wear_suit,/obj/item/clothing/suit/space)) - time = 60 - for(var/mob/O in viewers(world.view, user)) - if(time == 30) - O.show_message(text("\red [] is trying to inject []!", user, target), 1) - else - O.show_message(text("\red [] begins hunting for an injection port on []'s suit!", user, target), 1) + O.show_message(text("\red [] is trying to inject []!", user, target), 1) - if(!do_mob(user, target, time)) return + if(!do_mob(user, target, 30)) return for(var/mob/O in viewers(world.view, user)) O.show_message(text("\red [] injects [] with the syringe!", user, target), 1) diff --git a/code/modules/research/designs/stock_parts_designs.dm b/code/modules/research/designs/stock_parts_designs.dm index c3e8ea38c96..81182661384 100644 --- a/code/modules/research/designs/stock_parts_designs.dm +++ b/code/modules/research/designs/stock_parts_designs.dm @@ -230,4 +230,14 @@ build_type = PROTOLATHE materials = list(MAT_METAL = 15000, MAT_GLASS = 5000, MAT_SILVER = 2500) //hardcore build_path = /obj/item/weapon/storage/part_replacer/bluespace + category = list("Stock Parts") + +/datum/design/alienalloy + name = "Alien Alloy" + desc = "A sheet of reverse-engineered alien alloy." + id = "alienalloy" + req_tech = list("abductor" = 1, "materials" = 7, "plasmatech" = 2) + build_type = PROTOLATHE + materials = list(MAT_METAL = 4000, MAT_PLASMA = 4000) + build_path = /obj/item/stack/sheet/mineral/abductor category = list("Stock Parts") \ No newline at end of file diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index c294ad8cff1..58c1cf7fe6f 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -438,8 +438,9 @@ proc/CallMaterialName(ID) if( new_item.type == /obj/item/weapon/storage/backpack/holding ) new_item.investigate_log("built by [key]","singulo") new_item.reliability = 100 - new_item.materials[MAT_METAL] /= coeff - new_item.materials[MAT_GLASS] /= coeff + if(!istype(new_item, /obj/item/stack/sheet)) // To avoid materials dupe glitches + new_item.materials[MAT_METAL] /= coeff + new_item.materials[MAT_GLASS] /= coeff if(O) var/obj/item/weapon/storage/lockbox/L = new/obj/item/weapon/storage/lockbox(linked_lathe.loc) new_item.loc = L @@ -706,6 +707,8 @@ proc/CallMaterialName(ID) dat += "Main Menu" dat += "

Current Research Levels:


" for(var/datum/tech/T in files.known_tech) + if(T.level <= 0) + continue dat += "[T.name]
" dat += "* Level: [T.level]
" dat += "* Summary: [T.desc]
" @@ -733,6 +736,8 @@ proc/CallMaterialName(ID) dat += "Return to Disk Operations
" dat += "

Load Technology to Disk:


" for(var/datum/tech/T in files.known_tech) + if(T.level <= 0) + continue dat += "[T.name] " dat += "Copy to Disk
" dat += "
" diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index c34124af594..e4b91505669 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -117,7 +117,7 @@ research holder datum. if(DesignHasReqs(PD)) AddDesign2Known(PD) for(var/datum/tech/T in known_tech) - T = Clamp(T.level, 1, 20) + T = Clamp(T.level, 0, 20) for(var/datum/design/D in known_designs) D.CalcReliability(known_tech) return @@ -242,6 +242,13 @@ datum/tech/syndicate max_level = 0 // Don't count towards maxed research, since it's illegal. rare = 4 +/datum/tech/abductor + name = "Alien Technologies Research" + desc = "The study of technologies used by the advanced alien race known as Abductors." + id = "abductor" + rare = 5 + level = 0 + /* datum/tech/arcane name = "Arcane Research" @@ -278,8 +285,7 @@ datum/tech/robotics return 0 var/cost = 0 - var/i - for(i=current_level+1, i<=level, i++) + for(var/i=current_level+1, i<=level, i++) if(i == initial(level)) continue cost += i*5*rare diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 3bd5bad2f57..fe135490e3d 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -315,6 +315,8 @@ dat += "[temp_server.name] Data ManagementP

" dat += "Known Technologies
" for(var/datum/tech/T in temp_server.files.known_tech) + if(T.level <= 0) + continue dat += "* [T.name] " dat += "(Reset)
" //FYI, these are all strings. dat += "Known Designs
" diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 31a4fa84280..7b42bc2f217 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -242,9 +242,9 @@ height = 4 /obj/docking_port/mobile/pod/New() + ..() if(id == "pod") WARNING("[type] id has not been changed from the default. Use the id convention \"pod1\" \"pod2\" etc.") - ..() /obj/docking_port/mobile/pod/cancel() return diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 2f7c0c06496..2a794de2ff8 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -302,10 +302,6 @@ //rotate our direction dir = angle2dir(rotation+dir2angle(dir)) - //resmooth if need be. - if(smooth) - smooth_icon(src) - //rotate the pixel offsets too. if (pixel_x || pixel_y) if (rotation < 0) @@ -316,6 +312,9 @@ pixel_x = oldPY pixel_y = (oldPX*(-1)) +/atom/proc/postDock() + if(smooth) + smooth_icon(src) //this is the main proc. It instantly moves our mobile port to stationary port S1 @@ -368,7 +367,7 @@ var/list/door_unlock_list = list() - for(var/i=1, i<=L0.len, ++i) + for(var/i in 1 to L0.len) var/turf/T0 = L0[i] if(!T0) continue @@ -443,6 +442,12 @@ T0.CalculateAdjacentTurfs() air_master.add_to_active(T0,1) + for(var/A1 in L1) + var/turf/T1 = A1 + T1.postDock() + for(var/atom/movable/M in T1) + M.postDock() + loc = S1.loc dir = S1.dir diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 45da3bce5b6..6a6a7e8b7fe 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -329,7 +329,12 @@ /datum/surgery_step/remove_object name = "remove embedded objects" time = 32 - accept_hand = 1 + allowed_tools = list( + /obj/item/weapon/scalpel/manager = 120, \ + /obj/item/weapon/hemostat = 100, \ + /obj/item/stack/cable_coil = 75, \ + /obj/item/device/assembly/mousetrap = 20 + ) var/obj/item/organ/external/L = null @@ -368,4 +373,4 @@ else to_chat(user, "You can't find [target]'s [target_zone], let alone any objects embedded in it!") - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm new file mode 100644 index 00000000000..cbe016c5bad --- /dev/null +++ b/code/modules/tooltip/tooltip.dm @@ -0,0 +1,116 @@ +/* +Tooltips v1.1 - 22/10/15 +Developed by Wire (#goonstation on irc.synirc.net) +- Added support for screen_loc pixel offsets. Should work. Maybe. +- Added init function to more efficiently send base vars + +Configuration: +- Set control to the correct skin element (remember to actually place the skin element) +- Set file to the correct path for the .html file (remember to actually place the html file) +- Attach the datum to the user client on login, e.g. + /client/New() + src.tooltips = new /datum/tooltip(src) + +Usage: +- Define mouse event procs on your (probably HUD) object and simply call the show and hide procs respectively: + /obj/screen/hud + MouseEntered(location, control, params) + usr.client.tooltip.show(params, title = src.name, content = src.desc) + + MouseExited() + usr.client.tooltip.hide() + +Customization: +- Theming can be done by passing the theme var to show() and using css in the html file to change the look +- For your convenience some pre-made themes are included + +Notes: +- You may have noticed 90% of the work is done via javascript on the client. Gotta save those cycles man. +- This is entirely untested in any other codebase besides goonstation so I have no idea if it will port nicely. Good luck! + - After testing and discussion (Wire, Remie, MrPerson, AnturK) ToolTips are ok and work for /tg/station13 +*/ + + +/datum/tooltip + var/client/owner + var/control = "mainwindow.tooltip" + var/file = 'code/modules/tooltip/tooltip.html' + var/showing = 0 + var/queueHide = 0 + var/init = 0 + + +/datum/tooltip/New(client/C) + if (C) + owner = C + owner << browse(file2text(file), "window=[control]") + + ..() + + +/datum/tooltip/proc/show(atom/movable/thing, params = null, title = null, content = null, theme = "default", special = "none") + if (!thing || !params || (!title && !content) || !owner || !isnum(world.icon_size)) + return 0 + if (!init) + //Initialize some vars + init = 1 + owner << output(list2params(list(world.icon_size, control)), "[control]:tooltip.init") + + showing = 1 + + if (title && content) + title = "

[title]

" + content = "

[content]

" + else if (title && !content) + title = "

[title]

" + else if (!title && content) + content = "

[content]

" + + //Make our dumb param object + params = {"{ "cursor": "[params]", "screenLoc": "[thing.screen_loc]" }"} + + //Send stuff to the tooltip + owner << output(list2params(list(params, owner.view, "[title][content]", theme, special)), "[control]:tooltip.update") + + //If a hide() was hit while we were showing, run hide() again to avoid stuck tooltips + showing = 0 + if (queueHide) + hide() + + return 1 + + +/datum/tooltip/proc/hide() + if(queueHide) + spawn(1) + winshow(owner, control, 0) + else + winshow(owner, control, 0) + + queueHide = showing ? 1 : 0 + + return 1 + + +/* TG SPECIFIC CODE */ + + +//Open a tooltip for user, at a location based on params +//Theme is a CSS class in tooltip.html, by default this wrapper chooses a CSS class based on the user's UI_style (Midnight, Plasmafire, Retro, etc) +//Includes sanity.checks +/proc/openToolTip(mob/user = null, atom/movable/tip_src = null, params = null, title = "", content = "", theme = "") + if(istype(user)) + if(user.client && user.client.tooltips) + if(!theme && user.client.prefs && user.client.prefs.UI_style) + theme = lowertext(user.client.prefs.UI_style) + if(!theme) + theme = "default" + user.client.tooltips.show(tip_src, params, title, content, theme) + + +//Arbitrarily close a user's tooltip +//Includes sanity checks. +/proc/closeToolTip(mob/user) + if(istype(user)) + if(user.client && user.client.tooltips) + user.client.tooltips.hide() diff --git a/code/modules/tooltip/tooltip.html b/code/modules/tooltip/tooltip.html new file mode 100644 index 00000000000..9fa0702a2b3 --- /dev/null +++ b/code/modules/tooltip/tooltip.html @@ -0,0 +1,238 @@ + + + + Tooltip + + + + + +
+
+
+ + + + diff --git a/code/world.dm b/code/world.dm index 4c6451d6860..f5cfdee0401 100644 --- a/code/world.dm +++ b/code/world.dm @@ -52,8 +52,6 @@ var/global/datum/global_init/init = new () . = ..() - sleep_offline = 1 - plant_controller = new() // Create robolimbs for chargen. populate_robolimb_list() @@ -67,6 +65,7 @@ var/global/datum/global_init/init = new () processScheduler.setup() master_controller.setup() + sleep_offline = 1 #ifdef MAP_NAME map_name = "[MAP_NAME]" diff --git a/config/example/config.txt b/config/example/config.txt index 1af839d039e..1ed02a543d1 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -73,6 +73,7 @@ KICK_INACTIVE PROBABILITY EXTENDED 2 PROBABILITY MALFUNCTION 2 PROBABILITY NUCLEAR 3 +PROBABILITY ABDUCTION 2 PROBABILITY CHANGELING 3 PROBABILITY CULT 4 PROBABILITY EXTEND-A-TRAITORMONGOUS 5 diff --git a/html/changelog.html b/html/changelog.html index efcb683d401..c2c1630cfe6 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1,1344 +1,1394 @@ - - - - Paradise Station Changelog - - - - - - - -
- - - - -
-
Paradise Station
- -

- Visit our IRC channel: #crew on neko.sneeza.me -
- - - - - -
- Current Project Maintainers: -Click Here-
- Currently Active GitHub contributor list: -Click Here-
- Coders: ZomgPonies, DaveTheHeadcrab, tigercat2000, FalseIncarnate, AuroraBlade, Tastyfish, Crazylemon64, KasparoVy
- Spriters: FullOfSkittles
- Sounds:
- Main Testers: Anyone who has submitted a bug to the issue tracker
- Thanks to: Baystation 12, /tg/station, /vg/station, NTstation, CDK Station devs, FacepunchStation, GoonStation devs, the original SpaceStation developers and Radithor for the title image.
Also a thanks to anybody who has contributed who is not listed here :( Ask to be added here on irc.
-
Have a bug to report?
Visit our Issue Tracker.
- Please ensure that the bug has not already been reported and be as descriptive as possible about the circumstances under which the bug occurred. -
- - -
-

14 April 2016

-

Aurorablade updated:

-
    -
  • Removes the !!FUN!! of having headslugs gold core spawnable.
  • -
-

Fox McCloud updated:

-
    -
  • Added in sounds (instead of a chat-based message) for when airlocks are bolted/unbolted
  • -
  • Added in sound for when airlocks deny access
  • -
  • cutting/pulsing wires will play a sound
  • -
  • ups nuke ops game mode population requirement from 20 to 30
  • -
  • Adds in mining drone upgrade modules to increase their health, combat capability, or reduce their ranged cooldowns
  • -
  • Adds in mining drone "AI upgrade" a sentience potion that only works on mining bots
  • -
  • Mining bots should be less likely to shoot you when attacking hostile mobs
  • -
  • Killer tomatoes actually live up to their name now and are hostile mobs
  • -
  • Killer tomatoes are an actual fruit now; activate it in your hands to make them into a mob
  • -
  • Killer tomatoes are directly mutated from regular tomatoes instead of blood tomatoes
  • -
  • Increased the yield of regular tomatoes by 1
  • -
  • Tweak some stats on the killer tomato seeds
  • -
  • Fixes the blind player preference not doing anything
  • -
  • Adds portaseeder to R&D
  • -
  • Scythes will conduct electricity now
  • -
  • Mini hoes play a slice sound instead of bludgeon sound
  • -
  • Plant analyzer properly has a description and origin tech
  • -
  • Can have hulk+dwarf mutations together
  • -
  • Can have heat+cold resist together
  • -
  • Can only remotely view people who also have remote view
  • -
  • Fixes cold mutation not having an overlay
  • -
  • Hallucinations will no longer tick down twice as fast as they should nor will they spawn twice as many hallucinations as they should
  • -
  • Incendiary mitochondria no longer asks who you want to cast it on (it always is meant to be cast on yourself)
  • -
  • Fixes permanent nearsightedness even when wearing prescription glasses
  • -
-

KasparoVy updated:

-
    -
  • Head accessories now behave like facial hair: They will no longer be hidden by clothing items that BLOCKHEADHAIR (have the BLOCKHEADHAIR flag).
  • -
  • Wearing a piece of clothing that blocks head hair will no longer make head accessories (facial markings/horns/antennae) invisible until an icon update is triggered while the headwear is off.
  • -
-

Meisaka updated:

-
    -
  • law manager no longer freaks out with Malf law
  • -
-

TheDZD updated:

-
    -
  • Removes shitty Caelcode bees.
  • -
  • Hydroponics can now manage bee colonies, bees produce honeycombs that can be ground to obtain honey, a decent nutriment+healing chemical
  • -
  • Hydroponics can inject a queen bee with a syringe of a reagent to alter her DNA to match that reagent, meaning all honeycombs produced will contain that reagent in small amounts
  • -
  • Bees with reagents will attack with that reagent. It takes 5u of a reagent to give a bee that reagent.
  • -
  • Added the ability to make Apiaries and Honey frames with wood
  • -
  • Added the ability to make Royal Bee Jelly from 10 Mutagen and 40 Honey
  • -
  • Added the ability to make more Queen Bees from Royal Bee Jelly by using it on an existing Queen, to split her into two Queens
  • -
  • Removes some snowflakey mob behavior from bears, snakes and panthers.
  • -
  • Hudson is feeling punny.
  • -
  • Hostile mob AI should now be a bit more cost-efficient.
  • -
-

monster860 updated:

-
    -
  • Adds area editing, link mode, and fill mode to the buildmode tool
  • -
- -

12 April 2016

-

FalseIncarnate updated:

-
    -
  • Adjusting the setting of a vendor circuit board is no longer random, but instead provides a select-able list.
  • -
  • Vendor Circuit Board design moved from the Circuit Imprinter to the Autolathe, acid requirement replaced by metal.
  • -
  • Burnt matches can no longer light cigarettes, pipes, or joints.
  • -
-

Fethas updated:

-
    -
  • Nukes the cargo train code rscadd:Adds simple vehicle framework and converts secway/janicart/snowmobiles/bikes/cars/ambulance to it rscadd:Adds space speedbike, red and blue versions, yes you WILL need a spacesuit rscadd:Maps janicart and secway onto metastation (but not ambulance no pareamedic garage, no i am not mapping that)
  • -
  • You should now be able to operate on IPC eyes, SHOULD bugfix:hopefully surgery on diona works right
  • -
-

Fox McCloud updated:

-
    -
  • Adds in TraitorVamp; game mode that's essentially like TraitorChan, but with a Vampire instead of a Changeling
  • -
  • Vampires cannot use holoparasites
  • -
  • Malf AI will automatically lose if it exits the station z-level
  • -
-

Tastyfish updated:

-
    -
  • All cats can kill mice now.
  • -
  • E-N can't suffocate.
  • -
  • Startup time is now shorter.
  • -
  • Removed the Station Collision away mission from rotation, due to multiple conceptual and technical issues.
  • -
- -

07 April 2016

-

Crazylemon64 updated:

-
    -
  • Removes an offset from the advanced virus stealth calculation, causing viruses to be more stealthy than the sum of their symptoms.
  • -
  • Mulebots will now send announcements to relevant requests consoles on delivery again.
  • -
-

FalseIncarnate updated:

-
    -
  • Adds logic gates, for doing illogical things in a logical manner.
  • -
  • Adds buildable light switches, for all your light toggling needs.
  • -
  • Fixes a resource duplication bug with mass driver buttons.
  • -
-

Fethas updated:

-
    -
  • maybe makes them last longer...maybe..and fixes the event end message
  • -
-

Fox McCloud updated:

-
    -
  • Maps in the slime management console to Xenobio
  • -
  • Reduces Xenobio monkey box count from 4 to 2
  • -
  • Fixes weakeyes having a negligible impact
  • -
  • Can spawn friendly animals with a new gold core reaction by injection with water
  • -
  • Hostile animal spawn increased from 3 to 5 for hostile gold cores
  • -
  • Swarmers, revenants, and morphs no longer gold core spawnable
  • -
  • Fixes invisible animal spawns from gold core/life reactions
  • -
  • Adds tape to the ArtVend
  • -
  • Can no longer use sentience potions on bots
  • -
  • Added in Plasma Dust reagent, acquired by grinding plasma sheets; it's more toxic than regular plasma and generates plasma gas when spilled onto turfs.
  • -
  • Slimecore reactions now require plasma dust as opposed to dispenser plasma
  • -
  • Added in new Rainbow slime; inject with plasma dust to get a random colored slime. Acquire by having 100 mutation chance on a slime when it splits.
  • -
  • Monkey Recycler can produce different types of monkey cubes; change the cube type by using a multitool on the recycler
  • -
  • Epinephrine/plasma reagents changing mutation rate has been removed
  • -
  • Mutation chance is inherited from slime generation to slime generation as opposed to being purely random.
  • -
  • New reactions added for red and blue extracts: red generates mutator, which increases mutation chance, and blue generates stabilizer, which decreases mutation chance.
  • -
  • Slime glycerol reaction removed
  • -
  • Slime cells are now high capacity cells (more power than before)
  • -
  • extract enhancer increases the slime core usage by 1 as oppose to setting it to three
  • -
  • slime enhancer increases slime cores by 1 as opposed to setting the core amount to 3
  • -
  • Chill reaction lowers body temperature slightly more so it doesn't just wear off instantly
  • -
  • Reduces Xenobio plasma sheets from 8 to 3 and removes that pesky boombox
  • -
  • Processors no longer produce 1 more slime core than intended
  • -
  • Less blank/spriteless/empty foods from the silver core reaction
  • -
  • Virology mix reactions now use plasma dust as opposed to plasma
  • -
  • Statues can no longer move/attack people unless they're in total darkness or all mobs viewing them are blinded
  • -
  • statues are invincible to anything other than full out gibbing.
  • -
  • Statues flicker lights spell range increased
  • -
  • Blind spell no longer impacts silicons
  • -
  • Fixes statues being able to attack/move whenever they feel like it, regardless of client statues
  • -
  • Fixes blind spell impacting the statue
  • -
-

Tastyfish updated:

-
    -
  • Beepsky is no longer a pokemon.
  • -
  • pAI-controlled Bots now reliably speak human-understandable languages over the radio.
  • -
  • More floor blood for the blood gods. (Or rather, as much as there was supposed to be.)
  • -
-

tigercat2000 updated:

-
    -
  • Items in your off hand will now count towards access.
  • -
- -

02 April 2016

-

Crazylemon64 updated:

-
    -
  • Metal foam walls will now produce flooring on space tiles
  • -
  • Syringes will now draw water from slime people.
  • -
-

FalseIncarnate updated:

-
    -
  • Let's you know when your container is full when filling from sinks.
  • -
  • Prevents splashing containers onto beakers and buckets that have a lid on them.
  • -
  • Pill bottles can now be labeled with a simple pen.
  • -
  • Beakers/buckets (and pill bottles) now accept 26 character labels from pens.
  • -
-

Fethas updated:

-
    -
  • Various spells have had a tweak to stun/reveal/cast, some other number stuff...
  • -
  • Nightvision
  • -
  • harvest code is now in the abilites file.
  • -
  • New fluff objectives
  • -
  • Hell has recently remapped its blood transit system and you can now once again crawl through blood. We are sorry for the-GIVE US YOUR SOUL!
  • -
-

FlattestGuitar updated:

-
    -
  • Alcoholic beverages now have proper levels of ethanol in them. Good luck passing out after a beer.
  • -
-

Fox McCloud updated:

-
    -
  • Adds in the Lusty Xenomorph Maid Mob; currently admin only.
  • -
  • Fixes xenomorph brains having the wrong sprite, no origin tech, and incorrect name
  • -
  • removes xenomorph egg from hotel
  • -
  • upgrades are no longer needed to for the available toys in the prize vendor
  • -
  • Implements Advanced Camera Consoles. A type of camera console that function like AI's vision style. Non-buildable/accessible.
  • -
  • Adds in Xenobiology Advance Cameras. A type of camera console that functions like advanced cameras, but only works in Xenobiology areas; can move around slimes and feed them with the console as well. Also non-buildable/accessible (for now).
  • -
  • Adds in cerulean slime reaction that generates a single use blueprint. On use it colors turfs a lavender color
  • -
  • Adds disease1 outbreak event
  • -
  • Adds appendecitis event
  • -
  • Roburgers now properly have nanomachines in them
  • -
  • Re-adds nanomachines
  • -
  • Experimentor properly generates nanomachines instead of itching powder
  • -
  • Fixes big roburgers having a healing reagent in them
  • -
  • Adds nanomachines to poison traitor bottles
  • -
  • Tajarans can now eat mice, chicks, parrots, and tribbles
  • -
  • Vulpkanin and Unathi can now eat mice, chicks, lizards, chickens, crabs, parrtos, and tribbles
  • -
  • fixes spawned changeling headcrab behavior
  • -
-

KasparoVy updated:

-
    -
  • Incisions made at the beginning of embedded object removal surgery can now be closed in the same procedure.
  • -
-

ProperPants updated:

-
    -
  • Maint drones have magboots.
  • -
  • Removed plastic from maint drones. Literally useless for station maintenance.
  • -
  • Increased starting amounts of some materials for maint drones and engi borgs.
  • -
  • Reduced the number of lines taken by Engineering cyborgs calling on materials stacks.
  • -
  • Operating tables can be deconstructed with a wrench.
  • -
  • Fixed and shortened description of metal sheets.
  • -
-

Tastyfish updated:

-
    -
  • Bots can now be controlled by players, by opening them up and inserting a pAI. *beep
  • -
  • MULEbots can now access the engineering destination.
  • -
  • All MULEbot destinations should now have the correct load/unload direction, meaning the crates won't be dumped inside the flaps.
  • -
  • Diagnostic HUD's now give health and status information about bots.
  • -
  • MULEbot rampage blood tracks are now rendered correctly and handle UE traces as appropriate.
  • -
  • Bots should (hopefully) lag the game less now.
  • -
  • Beepsky contains 30% more potato.
  • -
  • Action progress bars are now smooth.
  • -
  • Clicking a filled inventory slot's square with an open hand now clicks the item in the slot.
  • -
  • Status displays now display the time when in Shuttle ETA mode and no shuttle activity is happening.
  • -
  • Shuttle ETA countdowns on status displays are now amber.
  • -
  • pAI's can now use the PDA chatrooms.
  • -
  • Adds treadmills to brig cells, to give the prisoners something productive to do.
  • -
-

TheDZD updated:

-
    -
  • A lot of the guns and armor in the station collision, space hotel, academy, and wild west away missions have been removed/replaced.
  • -
  • Removes that fucking facehugger from station collision.
  • -
-

tigercat2000 updated:

-
    -
  • Virus2 has been removed.
  • -
  • Virus1 is back. Viva la revolution.
  • -
  • You can now have up to 20 characters.
  • -
- -

26 March 2016

-

Fox McCloud updated:

-
    -
  • Adds in dental implant surgery. Implant pills into people's teeth.
  • -
  • Major rebalance and Shadowling update (https://github.com/ParadiseSS13/Paradise/pull/3986 for details). In general, Shadowlings can no longer enthrall or engage in Shadowling like behavior, pre-hatch. Post-hatch, shadowlings are much more powerful, with a ride array of New abilities such as extending the shuttle or making thralls into lesser shadowlings. Shadowling gameplay should not revolve almost entirely around darkness, as opposed to pre-hatch shenanigans.
  • -
  • Robotics now has a "sterile" surgical area for performing augmentations
  • -
  • Adds the FixOVein and Bone Gel to the autolathe
  • -
  • ensures all surgical tools have origin tech on them; lowers origin tech on FixoVein
  • -
-

KasparoVy updated:

-
    -
  • Slime People can now wear underwear.
  • -
  • Slime People can now wear undershirts.
  • -
-

TheDZD updated:

-
    -
  • NT has removed trace amounts of a highly-addictive substance from the "100% real" cheese used in cheese-flavored snacks. As a result, incidence rates of crewmembers becoming addicted to Cheesie Honkers should reduce to zero.
  • -
  • After receiving complaints about crewmembers often being unable to physically function without a back-mounted barrel of coffee, NT has replaced station all sources of coffee on the station, including coffee beans themselves with a largely decaffeinated version. It was funny the first time almost every crewmember aboard the NSS Cyberiad was lugging around their own oil barrel filled with coffee, it wasn't so funny, nor good for productivity the eighteenth.
  • -
- -

25 March 2016

-

Crazylemon64 updated:

-
    -
  • You now will actually have the correct `real_name` on your DNA.
  • -
  • No more roundstart runtimes regarding IPC hair.
  • -
  • Mitocholide rejuv will work more usefully now.
  • -
  • Limbs and cyborg modules will no longer appear in your screen.
  • -
  • Cyborg module icons are now persistent throughout logging in and out.
  • -
  • Various cyborg modules, like engineering, now use the proper icon.
  • -
-

FlattestGuitar updated:

-
    -
  • Adds confetti grenades.
  • -
-

Fox McCloud updated:

-
    -
  • Fixes Sleeping Carp combos not having an attack animation
  • -
  • Fixes several chems not properly healing brute/burn damage, consistently, as intended
  • -
-

KasparoVy updated:

-
    -
  • Unbranded heads and groins no longer invisible.
  • -
  • Zeng-hu left leg will now be in line with the body when facing south.
  • -
- -

22 March 2016

-

Crazylemon64 updated:

-
    -
  • Repairs all sorts of eldritch occurences that happen when you put an organic head on an IPC body, as well as some decapitation bugs
  • -
  • Makes heads keep hair on removal
  • -
  • Amputated limbs from a DNA-injected individual now will keep their appearance of the DNA-injected person
  • -
  • Wounds will vanish on their own now
  • -
  • Admins now have an "incarnate" option on the player panel when viewing ghosts for quick player instantiation
  • -
  • Fixes a runtime regarding failing a limb reconnection surgery
  • -
  • Copying a client's preferences now overrides the previous mob's DNA
  • -
  • A DNA injector is now more thorough, and affects the DNA of mobs' limbs and organs
  • -
  • DNA-lacking species can no longer be DNA-injected
  • -
  • Brains are now labeled again
  • -
  • Splashing mitocholide on dead organs will make them live again.
  • -
  • The body scanner now detects necrotic limbs and organs.
  • -
  • pAIs and Drones are now affected by EMPs and explosions while held.
  • -
-

Fethas updated:

-
    -
  • Adds a surgery for infection treatmne/autopsys that is simply cut open, retract, cauterize
  • -
  • fixes a dumb error in internal bleeeding surgerys
  • -
  • Chaos types no longer random teleport, but will make the target hallucinate everyone looks like the guardian.
  • -
-

FlattestGuitar updated:

-
    -
  • Adds a snow, navy and desert military jacket.
  • -
-

Fox McCloud updated:

-
    -
  • Removes random 1% chance to heal fire damage
  • -
  • Removes passive healing from resist heat mutation
  • -
  • Regen mutation heals every cycle (albeit less, on average), but doesn't cost hunger
  • -
  • Fixes not being able to speak over xeno common or hivemind when you receive the Xeno hive node
  • -
  • Adds in the ability to transfer non-locked metal+glass only designs from the protolathe to autolathe
  • -
  • Changes Outpost Mass Driver to prevent accidental spacings
  • -
  • Shadow people no longer dust on death, are rad immune+virus immune, and can be cloned. Slip immunity removed
  • -
  • Shadowlings no longer get hungry or fat and no longer dust on death
  • -
-

KasparoVy updated:

-
    -
  • The ability to change your head, torso and groin as an IPC in the character creator. Non-IPCs cannot access the parts.
  • -
  • Head, torso and groin sprites for all mechanical limb/bodypart brands but Morpheus and the unbranded ones (since those already exist) from Polaris.
  • -
  • Faux-eye optics for non-Morpheus heads.
  • -
  • The ability to change optic (eye) colour if you've got a non-Morpheus head.
  • -
  • The ability to choose human hair styles (wigs) and facial hair styles (postiche) with non-Morpheus heads. Non-Morpheus heads cannot choose screens. Conversely, Morpheus heads cannot choose wigs or facial hair.
  • -
  • Two hair styles from Polaris.
  • -
  • The ability for IPCs to wear undergarments (shirts and trousers).
  • -
  • Antennae (colourable) for IPCs.
  • -
  • IPC monitor adjustment verb will now adjust optic colour if the head is non-Morpheus.
  • -
  • Combat/SWAT boots can now be toecut and jacksandals can't.
  • -
  • ASAP fix to what would've broken the ability to configure prostheses in character creation.
  • -
  • Adjusted masks no longer block CPR (including bandanas).
  • -
  • You can no longer run internals from adjusted breath masks (or airtight adjustable masks in general).
  • -
-

Regens updated:

-
    -
  • Robotic hearts will now properly give the mob a heart attack instead of just damaging it when EMP'd
  • -
  • Assisted organs will now also take damage from EMP's
  • -
  • Internal robotic and assisted organs will now actually take damage from EMP's
  • -
-

Tastyfish updated:

-
    -
  • Adds PDA chatrooms. Post memes! Talk to your fellow collaborators! Get caught!
  • -
  • You can now set the PDA messenger to automatically scroll down to new messages.
  • -
  • Pet collars now act as death alarms and can have ID's attached to them.
  • -
  • All domestic animals can now wear collars.
  • -
  • You can now make video cameras at the autolathe.
  • -
-

TheDZD updated:

-
    -
  • Fixes an instance of old code being so incredibly, unbelievably, makes-me-want-to-stab-myself-in-the-eye-edly idiotic.
  • -
-

TravellingMerchant updated:

-
    -
  • Kidan have new sprites!
  • -
-

tigercat2000 updated:

-
    -
  • Nukeops now have an assault pod, they can use it for 30 TC. Loud and mean.
  • -
  • Lighting overlays can no longer go below 0 lum_r/g/b
  • -
  • Shuttles will work with lighting better.
  • -
  • Wizards can no longer teleport to prohibited areas such as Central Command.
  • -
- -

16 March 2016

-

Crazylemon64 updated:

-
    -
  • Being in godmode now makes you immune to bombs
  • -
  • Science members now get compensated when they ship tech disks to centcomm.
  • -
  • Science crew are no longer paid when they "max" research.
  • -
  • Roboticists now get credit for making RIPLEYs and Firefighters
  • -
  • Slime people can now regrow limbs on a more lax nutrition requirement
  • -
  • Enhances the nutripump+ to let slime people regrow limbs with it active
  • -
  • Skeletons, slime people, IPCs, and Diona no longer leave blood when hit
  • -
  • Rejuvenating a slime person will no longer clog up their "blood"
  • -
  • Slime people will now regenerate "blood" from having water in their system
  • -
  • The decloner can now be created again
  • -
  • Environment smashing mobs can now destroy girders.
  • -
-

DaveTheHeadcrab updated:

-
    -
  • Removes the check for species on the update_markings proc.
  • -
-

FalseIncarnate updated:

-
    -
  • Xeno-botany is now more user-friendly, and less random letters/numbers.
  • -
  • Hydroponics now has a connector hooked up to the isolation tray and a new connector in their back room for those strange plants that like spewing plasma or eating nitrogen.
  • -
  • You can now (finally) build the xeno-botany machines, and science can print off their respective boards.
  • -
-

Fethas updated:

-
    -
  • Syringes are no longer sharp
  • -
  • byond likes direct pathing so item/organ/internal not item/organ even if it shouldn't be in the internal_organs list. This was preventing the list from doing stuff correctly.
  • -
  • fixed ipc organ manipulation surgery, you can now insert a replacment ipc organ directly instead of needing a screwdriver in your main hand
  • -
  • nanopaste now will repair organs with robotic >= 2 instead of > 2 cuase i am an idiot
  • -
  • Fix, hopefully, for a runtime for clientless mobs whos head are cut off...
  • -
  • Hopefully fixes issues with diona eyes
  • -
  • Though shalt not eat robotic organs..including cybernetic implants..
  • -
  • ITS SURGERY_STEP/DETHRALL NOT SURGERY_STEP/INTERNAL/DETHRALL
  • -
-

FlattestGuitar updated:

-
    -
  • Adds three new synthanol drinks
  • -
  • Drinking synthanol is now a bad idea if you're organic
  • -
  • A glass of holy water now looks like normal water
  • -
-

Fox McCloud updated:

-
    -
  • Adds in drink fizzing sound
  • -
  • Drink/bartender recipes use this new fizzing sound in addition to a few other recipes
  • -
  • Adds in a fuse burning sound
  • -
  • Bath salts, black powder, saltpetre, and charcoal use this sound now
  • -
  • Adds in a matchstrike+burning sound
  • -
  • Lighting a match triggers this new sound
  • -
  • Adds in scissors cutting sound
  • -
  • Cutting someone's hair uses this new sound
  • -
  • Adds in printer sounds
  • -
  • printing off papers from various devices typically uses these sounds
  • -
  • Adds computer ambience sounds
  • -
  • black box recorder and R&D core servers both play this sound at random rare intervals
  • -
  • Reduces the tech level (and requirement) for nanopaste
  • -
  • Reduces the tech level (and requirement) for the plasma pistol
  • -
  • Removes Nymph and drone tech levels
  • -
  • Reduces tech levels on the flora board
  • -
  • Adds tech level requirements to mech sleepers, mech syringe guns, mech tasers, and mech machine guns
  • -
  • Increases tech cost of the decloner
  • -
  • Removes the pacman generators
  • -
  • Removes emitter
  • -
  • Removes flora machine (functionless anyway)
  • -
  • Removes the pre-spawned nanopaste
  • -
  • Removes space suits
  • -
  • Removes excavation gear
  • -
  • Replaces the soil with actual hydroponic trays (more aesthetic than anything)
  • -
  • Removes most external asteroid access from the station
  • -
  • Excavation storage is now generic science storage
  • -
  • removed the plasma sheet
  • -
  • Fixes augments not showing up in R&D unless specifically searched for
  • -
  • Fixes some augments being unavailable in mech fabs
  • -
  • Fixes augments having no construction time
  • -
  • Fixes xenos not gaining plasma when breathing in plasma
  • -
  • Fixes plasma reagent not generating plasma for a person
  • -
  • Screaming has different sounds based on being male or female
  • -
  • Implements Goon's screaming sounds.
  • -
  • Screaming tone is now based on age of character instead of being random
  • -
  • Ups the cooldown on screaming from 2 seconds to 5 seconds
  • -
  • Removes chance for Whilhelm scream
  • -
  • Borgs can now scream
  • -
  • Monkey's now have a unique screaming sound
  • -
  • IPCs now scream like cyborgs
  • -
  • Updates slot machines to have higher jackpots and more payouts with more interesting sounds
  • -
  • Adds X-Ray, Thermal, Anti-tun, and Reviver implants to the nuke ops uplink (augments come with one auto-implanter) rcsadd: Adds in augment auto-implanter, which inserts and implant without surgery
  • -
  • tweaks a large number of chems; behaviors are largely retained, but new flavor messages, probabilities, etc may be present; overall, you can expect chems to do the same thing
  • -
  • Tabun re-replaced with Sarin rcsadd: New reagent: cholesterol: if overdosed on, it can cause a heart attack--fatty foods, cheese, eggs, and some meats all produce cholesterol in your body.
  • -
  • Mixing Sarin, Meth, or Cyanide will poison in a very small area of the reaction if you're not on internal OR not wearing a gas mask
  • -
  • Chemist warddrobe now has two gas masks
  • -
  • Teslium will now impact synthetics AND organics
  • -
  • Fixes facehuggers hugging already infected people
  • -
  • Fixes facehuggers hugging people while dead
  • -
  • Fixes Embryo's developing twice as fast as they should
  • -
  • Fixes up some behaviors with xeno eggs
  • -
  • Xeno acid can now melt through floors and the asteroid
  • -
  • Xeno's now play the gib sound when actually gibbed
  • -
  • Implements Changeling headcrabs/headspiders
  • -
  • Fixes xenos not throwing their organs when gibbed
  • -
  • Fixes swallowed mobs not being ejected when a human is gibbed
  • -
  • Adds in spider eggs reagent, an infectious reagent that requires surgery to correct
  • -
  • Fixes EMPs causing eye implant users to be permanently blind
  • -
  • Increases bag of holding's storage capacity
  • -
  • Removing a heart no longer kills the patient instantly, but induces a heart attack
  • -
  • Demon hearts will not work
  • -
  • Should now actually be able to re-insert hearts
  • -
  • Reworks addictions to bettter differentiate them betweeen overdosing and make them more realistic.
  • -
  • changes which chems are addictive, currently, the follow reagents are now addidctive: meth, crank, krokodil, bath salts, space drugs, perfluoradecalin, omnizine, coffee, nicotine, fliptonium, ultra lube, surge, fake cheese, weird cheese, ephedrine, diphenhydramine, teporone, and morphine
  • -
  • sleepers help you recover from addiction faster
  • -
  • Can now make cable coils in autolathes
  • -
  • Fixes the slot machine announcements not displaying properly
  • -
-

Tastyfish updated:

-
    -
  • The super fart mutation now gives you a spell-like ability instead of augmenting the emote.
  • -
  • Vampire abilities are now in their own Vampire tab, as well being action buttons at the top, like spells.
  • -
  • Cloning a vampire no longer makes them lose their abilities.
  • -
  • Vampires can no longer hypnotize chaplains.
  • -
  • Being a full vampire (500+ total blood) actually makes you immune to holy water reliably now.
  • -
  • Some old away missions are back: Academy, Black Market Packers, Space Hotel, Station Collision, and Wild West. Go out and round up some hostiles!
  • -
  • Shuttle consoles now pair up to the engineering, mining, research, or labor shuttle when built or used before pairing, as long as the shuttle is near the console, or the shuttle is moved to be nearby.
  • -
-

monster860 updated:

-
    -
  • Mining station now has a podbay.
  • -
  • Ore scooping module for the spacepod.
  • -
  • Three mining lasers for spacepod: Basic, normal, and burst.
  • -
  • Shooting weapons south or west of spacepod will actually hit adjacent targets now, and won't shoot through walls anymore.
  • -
-

taukausanake updated:

-
    -
  • Mice can now be picked up like diona
  • -
- -

08 March 2016

-

Crazylemon64 updated:

-
    -
  • Slime people are now more vulnerable to low temperatures.
  • -
  • Slime people are able to slowly regrow limbs at a high nutrition cost.
  • -
  • Slime people now slowly shift color based on reagents inside of them - disabled by default, toggle it with an IC verb
  • -
  • Slime people's cores are more vulnerable to damage
  • -
  • Species-related abilities now properly are removed - no more vox hair stylists, unfortunately.
  • -
-

Fethas updated:

-
    -
  • the nest buckle now looks for the right organ path
  • -
  • Fixed some sprites.
  • -
  • No more putting no drops in rechargers,
  • -
-

Fox McCloud updated:

-
    -
  • Implement's goon's gibbing sound
  • -
  • Implement's goon's gibbing sound for robots/silicons
  • -
  • Removes old gibbing sound
  • -
-

Spacemanspark updated:

-
    -
  • Lazarus Injector's can now be emagged to activate their special features, alongside using EMPs on them.
  • -
-

Tastyfish updated:

-
    -
  • Mimes now have a new ore, Tranquillite, used to bring peace and quiet to the station.
  • -
  • There are also permanent invisible walls and silent floors that can be made from tranquillite.
  • -
  • The Recitence mech is now buildable!
  • -
  • The Recitence mech is now playable!
  • -
  • Mid-round selection for various creatures and antagonists now consistently asks permission.
  • -
-

TheDZD updated:

-
    -
  • Adds justice helmets with flashing lights and annoying sirens.
  • -
  • Adds crates containing said helmets.
  • -
  • Also includes a version of the helmet that can only be spawned by admins, and just has a single red light in the center instead of the stereotypical police blinkers.
  • -
-

monster860 updated:

-
    -
  • Space pod transitions are now fixed.
  • -
- -

07 March 2016

-

Crazylemon64 updated:

-
    -
  • People with VAREDIT can now write matrix variables
  • -
  • People with VAREDIT can now modify path variables
  • -
  • Refactors the variable editor code somewhat.
  • -
  • The buildmode area tool now shows reticules of what you've selected.
  • -
  • Switching mobs while using the buildmode tool no longer screws up your UI.
  • -
  • Refactors buildmode so it's no longer a special-case system.
  • -
  • Adds a copy mode to build mode, which lets you duplicate objects.
  • -
  • Any mob in buildmode can work at the fastest possible rate.
  • -
  • Fixed a problem where the icons of a person would not correctly update when changing gender.
  • -
  • One's hairstyle only adjusts on gender change if it's incompatible with your new gender.
  • -
  • Fixed a bug where a person's icon would only be updated if their sprite had a new layer added or removed.
  • -
  • You no longer lose your name when monkeyized and reverted - you'll still look like a monkey while you're a monkey, though.
  • -
  • Your organs will now match your gender when you are cloned.
  • -
  • Skeletons (when a body rots) no longer retain a fleshy torso.
  • -
  • Putting people in an active cryotube now produces the message on insertion, rather than release.
  • -
  • An EMP'd cloning pod will now display its sprites correctly.
  • -
-

FalseIncarnate updated:

-
    -
  • Water Balloons can be filled from more sources than just beakers and watertanks.
  • -
-

Fox McCloud updated:

-
    -
  • Fixes the "yeah" glasses so the sound doesn't vary and a message is displayed, on use
  • -
  • Noir mode only activates when the glasses are equipped to your actual eyes
  • -
  • Noir Glasses mode can be toggled on or off (defaults to off)
  • -
  • Mimes can no longer use spells and continue speaking
  • -
  • Mime abilities are now spells with proper icons
  • -
  • Mime wall now last 30 seconds, up from 5
  • -
  • forecfields/invisible walls now block air currents
  • -
  • Adds the Sleeping Carp scroll to the uplink for 17 TC
  • -
  • Fixes Shadowlings being able to use guns
  • -
  • Fixes sleeping carp scroll users being able to use guns
  • -
  • Fixes the Experimentor throwing one item at a time
  • -
  • Experimentor menu now automatically refreshes after use
  • -
  • Lowers surgery times across the board
  • -
  • Removes scalpels causing 1 damage on successful surgery
  • -
  • Removes random chance to fracture ribs on a successful surgery
  • -
  • Mining drills now have an edge
  • -
-

KasparoVy updated:

-
    -
  • Jackets who have the verb available but are not intended to be adjusted will not have the action button available.
  • -
  • You can now adjust breath masks while buckled into beds and chairs.
  • -
  • Known issues with adjusted jackets using the wrong sprites.
  • -
  • Blueshield coat in hand and item icons.
  • -
  • Hulks now rip apart adjustable and droppable jackets. The items stored in the jackets get dropped on the ground.
  • -
-

Tastyfish updated:

-
    -
  • Infrared emitters can now be rotated while already in an assembly via the UI popup.
  • -
  • The infrared emitter can no longer be hidden inside of boxes and still work.
  • -
  • The beach now has a border and is splashier.
  • -
  • Gives Psychiatrist a paper bin, clipboard, and multicolored pen.
  • -
  • Gives the Librarian / Jouralist a multicolored pen.
  • -
  • Gives the NT Representative a clipboard.
  • -
  • The ethanol-based neurotoxin drink is now called Neuro-toxin to avoid being confused with the deadly toxin.
  • -
-

VampyrBytes updated:

-
    -
  • Fixes emotes ending with s needing 2. Emotes now work with grammatical options eg ping or pings, squish or squishes
  • -
  • Updated emote help with missing emotes. Help will also show any species specific emotes for your current species
  • -
- -

26 February 2016

-

FalseIncarnate updated:

-
    -
  • Chocolate can now make you fat, as expected.
  • -
-

Fox McCloud updated:

-
    -
  • stamina damage now regenerates slightly faster
  • -
  • Adds in whetstones for sharpening objects
  • -
  • Kitchen vendor starts off with 5 salt+pepper shakers
  • -
  • Can now point while lying or buckled
  • -
  • Fixes Capulettium Plus not silencing
  • -
  • Fixes slurring, stuttering, drugginess, and silences last half of what they should
  • -
-

KasparoVy updated:

-
    -
  • Jackets that start open are recognized as actually being open already now. This fixes a bug with certain items that don't have an open state, or cases where it ended up giving an item the wrong icon (one that didn't exist)
  • -
-

Spacemanspark updated:

-
    -
  • Fixes synthetics from giving off the proper message in the chat box when using the *yes and *no emotes.
  • -
-

Tastyfish updated:

-
    -
  • Wheelchairs, janicarts, and ambulances can now go through doors according to the user's driver's access.
  • -
- -

24 February 2016

-

Crazylemon64 updated:

-
    -
  • The defib should be more reliable on people who have ghosted
  • -
  • The defib will now give a message if the ghost is still haunting about
  • -
  • Attacking someone with an accessory will now let you put things on them without having to strip them.
  • -
  • Borers will now properly detach upon death of a mob they are controlling
  • -
  • Borers can now see their chemical count while in control of a mob
  • -
  • Borers can now silently communicate with their host - this is not available to the host until the borer has either begun to communicate, or has taken control at least once - this is to avoid spoiling that the borer exists
  • -
  • Borers won't be able to talk out loud inside of a host, by default - they can remove this safeguard with a verb under their borer tab. Borer hivespeak is unaffected.
  • -
  • Borers infesting and hiding are now silent.
  • -
  • Made borer's chem lists more nicely formatted
  • -
  • No more superspeed attacking simplemobs
  • -
  • New players now show up properly under the "who" verb when used as an admin
  • -
  • Mining drones will now automatically collect sand lying around
  • -
  • RIPLEYs can now drill asteroid turfs for sand
  • -
  • You can now load exosuit fuel generators with items containing their material - this means you can fuel yourself off of ores, but this will be highly inefficient and cost you mining points later on, as you can't take fuel back out.
  • -
  • You can now load the fuel generators from an ore box.
  • -
  • The plasma generator now produces 3x as much power from the same amount of fuel - this lets it even remotely compete with the uranium generator.
  • -
  • You can now light cigarettes off of burning mobs.
  • -
  • Exosuit tracking beacons now fit in boxes - prior, they were far too large for even a backpack, as they shared the same size as all other mecha equipment
  • -
  • Miners can now collect ore by walking over it with an ore satchel on.
  • -
-

FalseIncarnate updated:

-
    -
  • Adds prize tickets as a replacement for physical arcade prizes.
  • -
  • Adds a buildable prize counter to exchange tickets for prizes.
  • -
  • Adds a bike. Despite what Prof. Oak might claim, you can ride it indoors.
  • -
  • Adds colorful wallets, for that old school arcade pride.
  • -
  • Fixes accidental removal of plump helmet biscuit recipe.
  • -
  • Temporarily adds a prize counter to the bar (Cyberiad) or dorms (MetaStation), and adds a max upgrade one to the Ninja Holding Area (Cyberiad z2)
  • -
  • Fixes Metastation. Seriously fixed a lot, just read the PR description for the full list.
  • -
-

FlattestGuitar updated:

-
    -
  • Adds IPC alcohol and a few derivative drinks
  • -
  • IPCs can now drink and be fed from glasses
  • -
-

Fox McCloud updated:

-
    -
  • Laser eyes mutation no longer drains nutrition
  • -
  • splits the EMP kit into two things: the standard EMP kit (2 grenades and an implant), and the EMP flashlight by itself
  • -
  • nerfs heart attacks so they do less damage
  • -
  • Pickpocket gloves now put the item you strip into your hands as opposed to the floor
  • -
  • Picketpocket gloves can now silently strip accessories
  • -
  • Pickpocket gloves will no longer give a message for messing up a pickpocket
  • -
-

KasparoVy updated:

-
    -
  • Adjusting masks while they are not on the face will no longer turn off internals.
  • -
  • Adjusting masks while they are not on the face will now cause the mask to hide/reveal the wearer's identity the next time it's worn as intended.
  • -
  • Adds the ability to open/close bomber jackets.
  • -
  • Adds a security bomber jacket. This jacket inherits the protection and storage capabilities as a standard Security vest with additional bomber jacket benefits.
  • -
  • Adds UI button in top left of screen for jacket adjustment.
  • -
  • Replaces the standard bomber jacket in the Pod Pilot bay with the Security version.
  • -
  • Centralizes jacket/coat adjustment handling.
  • -
  • All jackets start closed by default.
  • -
  • Geneticist duffelbag on-mob sprite (for all species).
  • -
  • Vox-fitted backpacks, satchels, ERT backpacks, duffelbags and defib unit.
  • -
  • Refactors back-item icon generation.
  • -
  • Typo in the description of Santa's sack.
  • -
  • Missing punctuation and gender macros in the description of the bag of holding.
  • -
  • The tweak to back-icon generation fixes a bug where the wrong sprite name was being used to generate back-item icons.
  • -
-

PPI updated:

-
    -
  • Adds the ability to hide papers in vents. You can now leave a romantic love letter, exchange information in secret, or hide papers infused with the power of nar'sie from sight.
  • -
-

Regen1 updated:

-
    -
  • Adds the Immolator laser gun, a modified laser gun with 8 shots that will ignite mobs, can be made in R&D
  • -
-

Spacemanspark updated:

-
    -
  • Adds *yes and *no emotes to Synthetics. Glory to Synthetica.
  • -
-

Tastyfish updated:

-
    -
  • The PDA system has been completely redone behind the scenes! It should be functionally similar, although there is now a Home and Back button at the bottom as appropriate.
  • -
  • All of the heads now have multicolored pens.
  • -
  • EngiVend now has 10 camera assemblies.
  • -
  • Borgs can now use vending machines.
  • -
  • There are now picture frames that can be made from the autolathe or wood planks for papers, photos, posters, and canvases!
  • -
-

pinatacolada updated:

-
    -
  • Makes the Protect Station AI law board no longer consider people that damage the station crew, instead of human
  • -
-

ppi updated:

-
    -
  • When revealed Revenants will not be able to move at the maximum move speed, nor be able to pass through any solid object, like walls, windows, grills, computers and mechs.
  • -
- -

13 February 2016

-

Crazylemon64 updated:

-
    -
  • Relaxes the check on what atoms you can follow to any movable atom
  • -
  • Mages are now more ragin
  • -
  • Admins can now adjust the total number of wizards at runtime by tweaking either max_mages, or players_per mage
  • -
-

DaveTheHeadcrab updated:

-
    -
  • Adds new worn icons for duffelbags to better reflect their size, compliments of WJohn at /tg/
  • -
-

FalseIncarnate updated:

-
    -
  • Adds burritos, made from cutlets, beans, rice, capsacin oil (hotsauce), cheese, and flat dough (because we lack proper tortillas) in the microwave.
  • -
  • Adds chimichangas. You know you want a deep-fried burrito.
  • -
-

Fox McCloud updated:

-
    -
  • Updates some spell icons with better/higher quality icons
  • -
  • Updates unarmed attacks to allow for more customization
  • -
  • Updates martial arts so they factor in specie's attack messages and sounds
  • -
  • Re-balances Sleeping Carp fighting style
  • -
  • Re-balances Bo Staff
  • -
  • Rebalances Golem: they should now be spaceproof, fire+cold proof, rad proof, virus immune, clonable, parapen+syringe gun immune, deal increased melee damage. Their armor has been reduced to 55 melee across the board, their slip immunity removed, pain immunity removed, and they're slightly slower
  • -
  • Fixes Ei Nath generating two brains
  • -
  • Ensures the Necromatic Stone generates actual skeletons
  • -
  • Can now strip PDA/IDs from Golems
  • -
  • Fixes sleeping carp grab not being an instant aggressive grab
  • -
  • Fixes an exploit with declaring war on the station
  • -
-

KasparoVy updated:

-
    -
  • Orange and purple bandanas for all station species.
  • -
  • The ability to colour bandanas with a crayon in a washing machine.
  • -
  • Refactors the bandana adjustment system.
  • -
  • Minor adjustments to Tajaran and Unathi bandana east/west sprites.
  • -
  • Adjusting a bandana will now take if off of your head/face and put it in an available hand. If both hands are available, it goes in the selected hand.
  • -
  • Adjusting a coloured bandana will no longer revert it to the original coloured icons anymore.
  • -
  • Adjusting a bandana from mask-style to hat-style means the bandana won't obscure your identity anymore.
  • -
  • Greys now use re-positioned smokeables. They no longer smoke out the eyes.
  • -
-

TheDZD updated:

-
    -
  • Fixes spacepods being able to shoot through walls.
  • -
  • Lowers spacepod weapons fire delay.
  • -
  • Increases spacepod weapons energy costs.
  • -
  • Makes spacepods move at speeds not rivaling those of photon beams. They are now a hair bit faster than a person with a jetpack.
  • -
  • Reduces battery costs for spacepod movement.
  • -
- -

10 February 2016

-

Crazylemon64 updated:

-
    -
  • The cloner now checks for NO_SCAN on the brain when scanning - unclonable species are now truly unclonable. You are still able to revive them with a brain transplant and a defib, however.
  • -
  • A tier-4 DNA scanner linked to a cloning system will now be able to reproduce a body from a brain's DNA, in event of the original corpse being gibbed or similar.
  • -
  • Species with organic limbs and NO_BLOOD will no longer bleed (though still on hit - write that off as "bone powder")
  • -
  • Skeletons now lack internal organs, except for the runic mind which exists in their head - an analogue for the brain
  • -
  • Skeletons that drink milk will be regenerated at a moderate pace, have a small chance of mending bones, and will praise the great name of mr skeltal
  • -
  • Adds a reagent system for species reacting to specific reagents
  • -
  • Slime People can now select from all human hairstyles, and their "hair" will be tinted a shade of their body.
  • -
  • Increases the frequency of the cortical borer event.
  • -
  • People with borers cannot commit suicide - this applies to a controlling borer, too.
  • -
  • Borers can no longer overdose their hosts.
  • -
  • Borers can now inject Saline-Glucose, Spaceacillin, Hydrocodone, Mitocholide, Salbutamol, Capulettium+, and Charcoal. Styptic was removed, as it's pathetic at healing when directly injected. Salicyclic acid was removed too, as its functionality is duplicated by both hydrocodone and saline-glucose.
  • -
  • A mind trapped by a cortical borer can now understand things it could understand when normally in its body.
  • -
  • Changes chemistry's welding tank to a wall-mounted version, to increase the room available.
  • -
  • You can now gib butterflies and lizards with a knife
  • -
  • Ghosts can now follow mecha
  • -
  • You can now access an R&D console by emagging it - it did nothing before.
  • -
  • Walls will now properly smooth and show damage.
  • -
  • Fixes the dialog that occurs when the AI shuts off to actually do what it says it does
  • -
-

Fox McCloud updated:

-
    -
  • Fixes not being able to attach IEDs to beartraps
  • -
  • Can no longer spamclick someone to death using headslamming on a toilet/urimal
  • -
  • Toilet/urinal headslamming now plays a sound
  • -
  • Toilet headslamming damage reduced slightly
  • -
  • Can now fill open reagent containers in a toilet to receive "toilet water".
  • -
  • No more message spam when someone fills a container using a sink
  • -
  • Can now wash your face using a sink, which washes away lipstick and wakes you up slightly
  • -
  • Washing things will now use progress bars
  • -
  • Ensures consuming a single syndicate donk pocket won't get you addicted to meth
  • -
  • Kinetic Accelerators and E-bows automatically reload
  • -
-

Glorken updated:

-
    -
  • Added a Knight Arena for Holodeck.
  • -
  • Added red and blue claymore sprites.
  • -
  • Changed overrided to overrode when emagging Holodeck computer.
  • -
-

KasparoVy updated:

-
    -
  • Vox versions of the Officer SWAT sechailer + HOS SWAT sechailer + Warden SWAT sechailer.
  • -
  • Resprited versions of most Human masks to fit Unathi, Tajara and Vulpkanin.
  • -
  • Warden now gets their own version of the SWAT sechailer in their locker.
  • -
  • HOS now gets the appropriate version of the SWAT sechailer in their locker.
  • -
  • Repositioned smokeables now available for Vox, Unathi, Tajara and Vulpkanin.
  • -
  • Properly shades Vox bandana down-state sprites.
  • -
  • Readds Tajaran bald hairstyle.
  • -
  • Alternate style of non-Human breath mask (incl. surgical/sterile mask) down-state positioning.
  • -
  • Corrects all non-Human species' breath mask (incl. surgical/sterile mask) down-state icons to use the right position style.
  • -
  • Minor adjustments to Tajaran breath mask up-state sprites.
  • -
-

PPI updated:

-
    -
  • Adds a reconnect button to the File menu in the client.
  • -
  • Adds head patting
  • -
-

Regen updated:

-
    -
  • Powersink can now drain a lot more power before going boom
  • -
  • Buffed the powersinks drain rate
  • -
  • Buffed explosion from an overloaded powersink, try to find it instead of overloading the grid.
  • -
  • Admin log warning before the powersink explodes
  • -
-

Spacemanspark updated:

-
    -
  • Miners can now utilize the power of mob capsules to take along their lazarus injected mining creatures!
  • -
  • Store your Pokemo- er, sorry, I mean mining mobs that you've captured in the lazarus capsule belt.
  • -
-

Tastyfish updated:

-
    -
  • Species that don't breathe can kill themselves now!
  • -
  • Suicide messages are now catered to your species.
  • -
  • Shortened the default pill & patch name when using the ChemMaster.
  • -
  • The chaplain now has a service radio headset, as Space Jesus intended.
  • -
-

TheDZD updated:

-
    -
  • When Ahelping, "Question" is now "Mentorhelp" and "Player Complaint" is now "Adminhelp."
  • -
  • Mentorhelps and PM replies from mentors appear in a bold aqua blue color.
  • -
  • Adminhelps and PM replies from admins appear in a bold bright red color.
  • -
  • PM replies from players appear in a dull/dark purple color.
  • -
  • Adds admin attack log to players being converted to cult.
  • -
  • Adds shadowling thrall jobbans.
  • -
  • Jobbanned players who are converted to shadowling thrall, revolutionary, or cultist will have the control of their body offered up to eligible ghosts.
  • -
- -

31 January 2016

-

Crazylemon64 updated:

-
    -
  • Syndicate borgs can now interact with station machinery
  • -
  • People with slime people limbs can now *squish
  • -
  • Skrell's vulnerability to alcohol is checked on their liver, now - a liver transplant will let them take alcohol like a champ - lacking a liver will have the same effect as being a skrell, when drinking
  • -
-

FalseIncarnate updated:

-
    -
  • Adds in the Magic Eight Ball toy, found in Claw Game prize orbs.
  • -
  • Adds in the Magic Conch Shell, an admin-only shell of power.
  • -
-

Fox McCloud updated:

-
    -
  • Updates Summon Guns and Magic to include many of the new guns
  • -
  • Summon Guns/Magic can no longer be used during Ragin' Mages
  • -
-

Tastyfish updated:

-
    -
  • The emergency shuttle status in the Status tab now has ETA/ETD/etc like before.
  • -
  • Code Gamma+ now has a 5 minute emergency shuttle call, like Red.
  • -
-

pinatacolada updated:

-
    -
  • Adds NanoUI to the operating computer
  • -
  • Adds health announcing, critical and oxygen damage aural alerts to the computer, with a menu to selectively turn them on and off
  • -
- -

29 January 2016

-

Crazylemon updated:

-
    -
  • The DNA scanner has now undergone a seminar to recognize fake identities; It will now scan the actual person's identity, rather than their disguise (read: wearing a mask with or without someone else's ID).
  • -
  • Matter eater now allows you to eat humans as if you were fat.
  • -
  • Eating mobs with an aggressive grab now generates attack logs.
  • -
-

Crazylemon64 updated:

-
    -
  • For a short while, there was a clerical error where all AI communications equipment was replaced with bananas. This has now been fixed.
  • -
  • Ghosts can now see the contents of smartfridges and look at the drone console
  • -
  • Humans now only produce one message when shaken while SSD
  • -
  • The supermatter no longer will irradiate everyone, everywhere, when it explodes.
  • -
  • Writing on paper will now add hidden admin fingerprints, so that you can't forge mean notes in someone else's name.
  • -
  • Brains are no longer able to escape their brain by being a sorcerer.
  • -
  • Astral projecting with other runes on the same tile will now no longer prevent you from re-entering
  • -
  • Voxxy that is become ex-voxxy no longer carry voxxy appearance! yaya!
  • -
-

FalseIncarnate updated:

-
    -
  • Allows plants to be identified as enhanced*. Enhancing plants results from using reagents (like saltpetre) that affect the stats of a seed instead of using mutagens/machines. *May not meet standards for being classified as "organic produce". (This was already possible, just renames enhanced plants for easier differentiation)
  • -
-

Fox McCloud updated:

-
    -
  • Fixes mutadone not working with some genetic mutations
  • -
  • Fixes banana honk and silencer being alcoholic
  • -
  • Fixes Kahlua being non-alcoholic
  • -
  • Fixes polonium not metabolizing
  • -
  • Fixes being able to receive free unlimited boxes from the Merchandise store
  • -
  • Adds in wooden bucklers
  • -
  • Re-adds roman shield to the costume vendor
  • -
  • Buffs Riot shield damage from 8 to 10
  • -
  • Adds in a Skeleton race
  • -
  • Tweaks the skeletons colors to be more realistic and to blend in less with the floor
  • -
  • Adds in lichdom spell for the wizard
  • -
  • Adds in lesser summon guns spell for wizard
  • -
  • adds in Mjolnir and the singularity hammer as weapons the wizard can purchase
  • -
  • Wizard can purchase the charge spell from the spell book
  • -
  • Wizard can purchase a healing staff from the spell book
  • -
  • Tweaks and lowers spell costs of utility spells for wizard
  • -
  • Re-organizes the spellbook to be better divided into categories and have a better window size
  • -
  • Knock now opens+unlocks lockers
  • -
  • Magic Missile has a slightly longer cooldown and no longer deals damage, but has a lower cooldown is upgraded
  • -
-

KasparoVy updated:

-
    -
  • Navy blue Centcom Officer's beret for use by the Blueshield.
  • -
  • Adds the new navy blue beret to the Blueshield's locker.
  • -
  • Gives the Blueshield's berets (black and navy blue) the exact same strip delay and armour as the Security Officer's beret.
  • -
  • Adds TG energy katana back and belt sprite.
  • -
  • Bo staff back sprite.
  • -
  • Adjusts energy katana sprites to make the weapon stand out a bit more from the regular katana.
  • -
  • Cutting open the toes of footwear so species with feet-claws can wear them.
  • -
  • Toeless jackboots.
  • -
  • Cleans up glovesnipping and lighting a match with a shoe.
  • -
  • Lighting a match with a shoe produces a more appropriate message, handled at the same standard as glove-snippingboot-cutting.
  • -
-

Tastyfish updated:

-
    -
  • Cargonia now has its own section in the manifest.
  • -
-

TheDZD updated:

-
    -
  • Due to budget cuts and reports of operatives accidentally firing enough bullets to reach a state of what our scientists refer to as "enough dakka," Syndicate High Command has decided to restore the Syndicate Strike Team arsenal to using standard-issue L6 SAW ammunition.
  • -
- -

24 January 2016

-

KasparoVy updated:

-
    -
  • Fixes markings overlaying underwear.
  • -
  • Nude icon in underwear.dmi
  • -
  • Fixes Vox robes not using the correct on-mob sprites.
  • -
  • Fixes unreported bug where there was a slim chance during character preview icon generation that a character with Security Officer set to high would get rendered with either the wrong beret sprite or no beret sprite at all.
  • -
  • Fixes an issue where Sigholt's fluff beret wasn't using the correct sprites.
  • -
-

Tastyfish updated:

-
    -
  • Passively power-consuming borg modules, such as the peacekeeper movement and shield module, won't spam the user infinitely if they're low on power anymore.
  • -
- -

23 January 2016

-

Fox McCloud updated:

-
    -
  • Removes Vampire HUD
  • -
  • moves the Vampire blood counter to a more easy to see location
  • -
  • Adds in a Changeling chemical counter display
  • -
  • Adds in a Changeling sting counter display
  • -
  • Vampire total blood and usable blood will now appear under status
  • -
  • Changes vampire blood display to be similar to ling chemical counter
  • -
  • Fixes unnecessary toxin damage being dealt on severe bloodloss
  • -
  • Fixes human mobs not receiving proper random names
  • -
  • Adds in knight armor
  • -
  • Grants the chaplain a set of crusader knight armor
  • -
  • Adds in cult-resistant ERT paranormal space suit
  • -
  • Allows the Chaplain to convert his null rod into a holy sword with crusader knight armor
  • -
  • Chaplain's closet is now a secure closet
  • -
  • Adds in Assault Gear crate to cargo
  • -
  • Adds in military assault belt
  • -
  • Adds in spaceworthy swat suits
  • -
  • tweaks bandolier to hold 2 additional shotgun shells
  • -
  • bartender starts off with +2 additional shells
  • -
  • Reduces the cost of the space suit crate and doubles its contents
  • -
  • Refactors knives so their behavior is more universal
  • -
  • Fixes Hulk not properly being removed when your health drops below a threshold
  • -
  • Fixes flickering vision in a mining mech
  • -
-

Tastyfish updated:

-
    -
  • Poly has taken a seminar on the latest trends in engine operations.
  • -
  • Player-controller parrots can now hear their headsets.
  • -
-

Tigerbat2000 updated:

-
    -
  • The nuclear disk escaping on the shuttle no longer counts as a syndicate minor victory.
  • -
  • Cultists can once again actually greentext the escape objective.
  • -
- -

20 January 2016

-

DarkPyrolord updated:

-
    -
  • Adds in hardsuit sprites for Vulpkanin
  • -
-

FalseIncarnate updated:

-
    -
  • Allowed cheap lighters and individual matches to be put into cigarette packages at the cost of cigarette space.
  • -
  • Matches can now be lit and put out by striking the match on your shoes. Good for if you lose that matchbox, or want to just feel cool.
  • -
-

Fox McCloud updated:

-
    -
  • Fixes brute damage on weapons not knocking people down.
  • -
  • Tweaks implant behavior to be more consistent and unified.
  • -
  • Lowers the pAI cooldown from 60 seconds to 5 seconds.
  • -
  • Raw telecrystal can now be used to charge uplink implants.
  • -
  • Fixes being unable to holster the pulse pistol
  • -
  • Fixes being able to holster shotguns
  • -
-

KasparoVy updated:

-
    -
  • Improved shading on all Vulpkanin hardsuit tails.
  • -
  • Vulpkanin hardsuit helmet respriting (colour tweaks).
  • -
  • Vulpkanin hardsuit helmets with proper flashlight-on sprites.
  • -
-

Tastyfish updated:

-
    -
  • The ID computer Access Report printout now separates the access list with commas so it's actually readable.
  • -
  • The ID computer Access Report printout isn't blank if you don't have an authorization card in anymore.
  • -
  • In the supply ordering & shuttle consoles, one can now cancel an order at either the Reason or Amount input dialogs.
  • -
  • Table flipping uses correct sprites.
  • -
-

TheDZD updated:

-
    -
  • Adds world.Topic() handling so that users are notified in-game when pull requests are opened, closed, or merged on the Github repo.
  • -
- -

18 January 2016

-

Crazylemon updated:

-
    -
  • New classes of shapeshifters have been sighted around the NSS Cyberiad...
  • -
  • Wizards now can't teleport to other antag spawn points.
  • -
  • Removes an extruding pixel from the left-facing IPC glider monitor sprite.
  • -
  • Ragin' Mages now spawn every 7 minutes, instead of 5. Admins can further adjust this by modifying the 'delay_per_mage' variable.
  • -
  • Ragin' Mages are now made with 100% less in-use souls (Apprentices won't have their consciousness yoinked).
  • -
  • It takes half an hour for the REAL chaos of ragin' mages to start, for at least a semblance of normality.
  • -
-

Dave The Headcrab updated:

-
    -
  • Adds the advanced energy revolver, toggles between taser and laser modes.
  • -
  • Removes the detective's revolver from the blueshield's locker.
  • -
  • Changes the taser the blueshield starts with into an advanced energy revolver.
  • -
-

Deanthelis updated:

-
    -
  • Added the ability for the Magnetic Gripper to pick up and place light tiles.
  • -
-

Fethas updated:

-
    -
  • Readds the hud icon showing up for master and servent
  • -
  • adds mindslave datum hud thingy based on TGs gang huds
  • -
-

Fox McCloud updated:

-
    -
  • Fixes not being able to add/remove Weapon Permit from IDs.
  • -
  • Fixes the energy sword being invisible in-hand when turned on.
  • -
  • Fixes the telebaton being invisible in-hand when extended.
  • -
  • Fixes eye-stabbing not having an attack animation or hitsound.
  • -
  • Fixes some kitchen utensils playing the wrong hit-sound and playing twice in some cases.
  • -
  • Fixes the butcher cleaver sprite being backwards.
  • -
  • Fixes the telebaton sprite being missing from the side.
  • -
  • Fixes the meat cleaver being invisible in-hand.
  • -
  • Corrects some grammatical descriptive errors for the elite syndicate hardsuit.
  • -
  • completely overhauls implants to TG's standards.
  • -
  • Adds storage implant.
  • -
  • Adds microbomb and macrobomb implants.
  • -
  • Adds in support for removing implants directly into cases.
  • -
  • Removes Bay style explosive implants.
  • -
  • Removes compressed matter implants.
  • -
  • Tweaks the uplink to reflect removal of the old implants and inclusion of the new.
  • -
  • Fixes/cuts down on the lag caused by monkey cubes.
  • -
-

Jey updated:

-
    -
  • Inflatable walls and door can now be deflated by altclicking them
  • -
  • Fixed lag from expanding multiple monkeycubes at once.
  • -
-

KasparoVy updated:

-
    -
  • Adds blank icons with standardized timings for species tail wagging, used in icon generation.
  • -
  • Fixes tails overlapping arms/limbs + gloves, etc. when facing EAST or WEST.
  • -
  • Ensures tails will overlap stuff as normal only when facing NORTH so as to avoid unwanted interference with the base sprite.
  • -
  • Tails now appear in ID cards, overlays things correctly.
  • -
  • Tails now overlay and are overlaid by things correctly in preview icons.
  • -
  • Modifies the positioning of tail icon generation in the ID card preview icon generation file.
  • -
  • Modifies the positioning of tail icon generation in the player preferences preview icon generation file.
  • -
  • Breaks limb generation into its own layer, breaks tail generation into a second layer that can be overlaid by limbs.
  • -
  • If the user's species is flagged to have a tail that is overlapped, TAIL_LAYER will now overlay the NORTH direction sprite of a tail now, while TAIL_UNDERLIMBS_LAYER gets all remaining directions. Otherwise icons are generated in the traditional manner.
  • -
  • Adjusts the Unathi right arm east direction and animated tail sprites, recolouring a random pixel and fixing a floating tail respectively.
  • -
  • Adjusts position of tail layer such that tails' north direction sprites will overlay backpacks (more importantly, satchel straps).
  • -
  • Accommodates admin-overrides to the body_accessory species check by setting the default animation template to Vulpkanin.
  • -
  • Adjusts north-direction Unathi static tail sprite, now attaches to the body in the correct location.
  • -
  • Adds some TG underwear.
  • -
  • Adds an NV science goggles worn sprite.
  • -
  • Ports Bay/TG berets.
  • -
  • Adjusts beret sprite, recolours strange orange pixels.
  • -
  • Adjusts NV science goggles object icon. Removed strange border and centered it.
  • -
  • Ports Polaris' PRs 761 and 778, brings over Ragnie's awesome Ward-Takahashi prosthetics.
  • -
-

Kyep updated:

-
    -
  • Changing level to gamma/delta/epsilon now displays a special gamma/delta/epsilon sprite on status monitors
  • -
  • Changing level to green/blue now clears the status monitors, so they no longer show higher alert levels after the level is changed
  • -
-

NTSAM updated:

-
    -
  • Added a rainbow IPC screen.
  • -
-

PPI updated:

-
    -
  • Modifies the effective time limit to activate the Nuclear Challenge as Nukeops from two minutes to seven minutes
  • -
-

Tastyfish updated:

-
    -
  • The QM now actually has a QM stamp instead of a fake one, as well as an approved and denied stamp.
  • -
  • New area named 'Genetics Maintenance' solidifying/relabelling the confusing area between the morge and Mech Bay as being fully maintenance again, but working correctly and with proper doors.
  • -
  • Fixed a few maintenance door names to be in parity to the rest of the station.
  • -
  • Added the ability to print the records photo of a crew member from a security records console. Useful for Wanted notices!
  • -
-

Tigercat2000 updated:

-
    -
  • You can no longer use the gibber for monkies.
  • -
  • Cleaned up gibber.dm styling.
  • -
  • The fire alarm now uses NanoUI, with color coded alert levels.
  • -
  • Upgraded NanoUI (again), fancy FontAwesome icons.
  • -
  • Didn't add any butts. Yet.
  • -
- -

13 January 2016

-

Fox McCloud updated:

-
    -
  • Fixes Rezadone not clearing mutated organs.
  • -
  • Clone damage immunity removed from Slime People, Shadowlings, Golems, and Vox
  • -
  • Explosions will no longer destroy things underneath turfs until the turf is exposed.
  • -
  • fixes a runtime related to revolver spinning.
  • -
  • fixes server loading taking an abnormally long time.
  • -
-

Kyep updated:

-
    -
  • Blob, vine and virus outbreaks are now more clearly labeled as such, to avoid people confusing them with each other
  • -
-

Tastyfish updated:

-
    -
  • NT Rep fountain pens and magistrate gold pens can now write in 5 different colors. The IAA gets a cheap plastic equivalent.
  • -
- -

11 January 2016

-

CrAzYPiLoT updated:

-
    -
  • Fixes the footsteps sounds to the fullest.
  • -
-

Crazylemon updated:

-
    -
  • Bomb guardians now automatically notify their master when they've set something to boom, so there's less accidental friendly fire
  • -
  • Bomb guardians are only notified that their trap failed, if it ACTUALLY FAILED.
  • -
  • Bomb guardians now are more aware of what is primed to explode.
  • -
  • Bomb guardian summoners can now defuse their guardian's bombs without harm.
  • -
  • Brought RAGIN' MAGES back up to function.
  • -
-

Dave The Headcrab updated:

-
    -
  • Added a new icon for the soy and cafe latte drinks. Icons courtesy of Full Of Skittles, resident overlord of art.
  • -
-

Fox McCloud updated:

-
    -
  • Re-arranges the armory and changes its contents minorly.
  • -
  • Adds in rubbershot ammo boxes.
  • -
  • Fixes Mutadone incurring a massive cost on the server.
  • -
  • Positronic brains can no longer speak binary.
  • -
  • Positronic brains can be prevented from speaking (or allowed) by toggling their speaker on/off.
  • -
  • IPC's positronic brains start off toggled off.
  • -
  • Fixes the supermatter announcement causing massive amounts of server lag.
  • -
  • Adds in tradable telecrystals.
  • -
- -

08 January 2016

-

Crazylemon updated:

-
    -
  • Fully enables a system to allow species to have unique procs and verbs that come and go with the species.
  • -
  • IPCs lose their change monitor verb when changing species now. Gone are the days of recalling a past IPC life to perform self-barbery! Oh, woe is me!
  • -
  • Sleepers and Body Scanners will now reliably work when rotated
  • -
  • SSD humans should be asleep more reliably now.
  • -
-

Dave The Headcrab updated:

-
    -
  • Nerfs the damage the Detective's revolver does from 15 brute to 5 brute.
  • -
  • Adds a 300 round capacity buckshot magizine that fits into the L6 Saw.
  • -
  • Adds a 25 round capacity 40mm HE magizine that fits into the L6 Saw.
  • -
  • Adds the 'Devastator' L6 SAW, starts off loaded with the buckshot magizine.
  • -
  • Gives the SST the 'Devastator' L6 Saw, and one of each mag type in their bag.
  • -
-

FalseIncarnate updated:

-
    -
  • Plants will now begin to die over time if their age exceeds 5 times their TRAIT_MATURATION value.
  • -
  • Weed growth chance per process in trays has been slightly increased (Previously: 5% chance if no seed, 1% otherwise;Now: 6% / 3%).
  • -
  • Pest growth in trays has been slightly buffed. (Previously: 3% chance to increase by 0.1; Now: 5% chance to increase by 0.5)
  • -
-

Fethas updated:

-
    -
  • Due to Archmage Steve leaving the nya-cromantic stone near the microwave, the true power of the stone has been unleashed. Subjects of the stone are not only ressurected ... but resurrected as catgirls ... We fired steve.
  • -
-

Fox McCloud updated:

-
    -
  • fixes a bug relating to some brute/burn damage being dealt to human mobs.
  • -
  • Adds in overloading APCs, causing them to arc electricity to mobs in range.
  • -
  • Makes Engineering related APCs overload proof.
  • -
  • Implements the timestop spell.
  • -
  • Implements new sepia slime reaction which halts time in an AoE.
  • -
  • sentience potions no longer can make slimes sentient.
  • -
  • Removes Hulk instant stun.
  • -
  • Hulk damage increased.
  • -
  • Hulk wears off at a lower health threshold.
  • -
  • Fixes strange reagent not working on simple animals.
  • -
  • Reduces the amount shock damage and bounces for the Tesla engine.
  • -
  • Fixes Syndicate Cyborg's LMG being invisible.
  • -
  • Fixes the uplink kit having implanters that were both nameless and looked as if they had been used.
  • -
-

KasparoVy updated:

-
    -
  • Added the security gasmask, sexy mime mask, bandanas, balaclava, welding gas mask and wrestling masks for Vox. Added adjusted-state sprites for the Vox breath, medical, and surgical masks.
  • -
  • Removed a duplicate of the human balaclava sprite.
  • -
  • Modifies the Vox plague-doctor, fake moustache, sterile and medical mask sprites to fit the Vox anatomy and animates the Vox SWAT mask. Corrects the names of some Vox mask adjusted-state sprites.
  • -
-

Tastyfish updated:

-
    -
  • Fixed the pronouns in a few verbs and the door to 'Interrogation Observervtion'.
  • -
-

Tigercat2000 updated:

-
    -
  • Added 96x96 (3x) res option to icons menu
  • -
- -

06 January 2016

-

Certhic updated:

-
    -
  • Corrected some air alarms so that atmos computer can access them
  • -
  • Bodyscanner now sees mechanical parts in internal organs
  • -
-

Crazylemon64 updated:

-
    -
  • Sleeping simple animals should tick down sleeping as normal - deaf simple mobs are no longer a thing
  • -
-

Tastyfish updated:

-
    -
  • Instruments now use NanoUI.
  • -
  • Corrected the blueshield mission briefing.
  • -
- -

03 January 2016

-

TheDZD updated:

-
    -
  • Ports over changelog system from /tg/station.
  • -
-
- -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.

-
- - + + + + Paradise Station Changelog + + + + + + + +
+ + + + +
+
Paradise Station
+ +

+ Visit our IRC channel: #crew on neko.sneeza.me +
+ + + + + +
+ Current Project Maintainers: -Click Here-
+ Currently Active GitHub contributor list: -Click Here-
+ Coders: ZomgPonies, DaveTheHeadcrab, tigercat2000, FalseIncarnate, AuroraBlade, Tastyfish, Crazylemon64, KasparoVy
+ Spriters: FullOfSkittles
+ Sounds:
+ Main Testers: Anyone who has submitted a bug to the issue tracker
+ Thanks to: Baystation 12, /tg/station, /vg/station, NTstation, CDK Station devs, FacepunchStation, GoonStation devs, the original SpaceStation developers and Radithor for the title image.
Also a thanks to anybody who has contributed who is not listed here :( Ask to be added here on irc.
+
Have a bug to report?
Visit our Issue Tracker.
+ Please ensure that the bug has not already been reported and be as descriptive as possible about the circumstances under which the bug occurred. +
+ + +
+

20 April 2016

+

Crazylemon64 updated:

+
    +
  • Bureaucracy crates now contain granted and denied stamps.
  • +
+

FalseIncarnate updated:

+
    +
  • Anomalies will now be properly neutralized by signals that match their code and frequency, instead of using the default frequency and their code.
  • +
+

FlattestGuitar updated:

+
    +
  • Adds shot glasses.
  • +
+

Fox McCloud updated:

+
    +
  • Removes the ability to put a pAI into securitrons and ED-209's
  • +
  • Drinking glasses now have an in-hand sprite
  • +
  • DNA injectors no longer have a delay when used on yourself
  • +
  • DNA injectors no longer delete on use, but become used, much like auto-injectors
  • +
  • Fixes a bug where you can exploit the genetic scanner to get multiple injectors
  • +
  • Fixes not being able to cancel creating an DNA injector
  • +
  • remove spacesuits causing injections to the head to take longer
  • +
  • FIxes heat resist mutation not making you immune to high pressure, fire, or high temperatures
  • +
  • removes some not-well-known damage resists from cold/heat mutations
  • +
  • Re-maps botany a bit to make it more bee and botanist friendly
  • +
  • Adds in Abductors Game Mode
  • +
+

MarsM0nd updated:

+
    +
  • Embeded object removal is now done with hemostat again
  • +
  • Borgs are able to do embeded object surgery
  • +
+

Tastyfish updated:

+
    +
  • Makes the server startup substantially faster.
  • +
+

monster860 updated:

+
    +
  • Crowbarring open a spesspod doors is no longer broken
  • +
+

tigercat2000 updated:

+
    +
  • -tg- thrown alerts have been added. This means you get an alert when buckled or handcuffed or many many other things happen to you. It then gives you a tool tip when you hover over it, and it may or may not do something when you click it. Have fun!
  • +
+ +

14 April 2016

+

Aurorablade updated:

+
    +
  • Removes the !!FUN!! of having headslugs gold core spawnable.
  • +
+

Fox McCloud updated:

+
    +
  • Added in sounds (instead of a chat-based message) for when airlocks are bolted/unbolted
  • +
  • Added in sound for when airlocks deny access
  • +
  • cutting/pulsing wires will play a sound
  • +
  • ups nuke ops game mode population requirement from 20 to 30
  • +
  • Adds in mining drone upgrade modules to increase their health, combat capability, or reduce their ranged cooldowns
  • +
  • Adds in mining drone "AI upgrade" a sentience potion that only works on mining bots
  • +
  • Mining bots should be less likely to shoot you when attacking hostile mobs
  • +
  • Killer tomatoes actually live up to their name now and are hostile mobs
  • +
  • Killer tomatoes are an actual fruit now; activate it in your hands to make them into a mob
  • +
  • Killer tomatoes are directly mutated from regular tomatoes instead of blood tomatoes
  • +
  • Increased the yield of regular tomatoes by 1
  • +
  • Tweak some stats on the killer tomato seeds
  • +
  • Fixes the blind player preference not doing anything
  • +
  • Adds portaseeder to R&D
  • +
  • Scythes will conduct electricity now
  • +
  • Mini hoes play a slice sound instead of bludgeon sound
  • +
  • Plant analyzer properly has a description and origin tech
  • +
  • Can have hulk+dwarf mutations together
  • +
  • Can have heat+cold resist together
  • +
  • Can only remotely view people who also have remote view
  • +
  • Fixes cold mutation not having an overlay
  • +
  • Hallucinations will no longer tick down twice as fast as they should nor will they spawn twice as many hallucinations as they should
  • +
  • Incendiary mitochondria no longer asks who you want to cast it on (it always is meant to be cast on yourself)
  • +
  • Fixes permanent nearsightedness even when wearing prescription glasses
  • +
+

KasparoVy updated:

+
    +
  • Head accessories now behave like facial hair: They will no longer be hidden by clothing items that BLOCKHEADHAIR (have the BLOCKHEADHAIR flag).
  • +
  • Wearing a piece of clothing that blocks head hair will no longer make head accessories (facial markings/horns/antennae) invisible until an icon update is triggered while the headwear is off.
  • +
+

Meisaka updated:

+
    +
  • law manager no longer freaks out with Malf law
  • +
+

Tastyfish updated:

+
    +
  • The /vg/ library computer interface has been ported, giving a much better use experience.
  • +
  • Books can now be flagged for inappropriate content.
  • +
+

TheDZD updated:

+
    +
  • Removes shitty Caelcode bees.
  • +
  • Hydroponics can now manage bee colonies, bees produce honeycombs that can be ground to obtain honey, a decent nutriment+healing chemical
  • +
  • Hydroponics can inject a queen bee with a syringe of a reagent to alter her DNA to match that reagent, meaning all honeycombs produced will contain that reagent in small amounts
  • +
  • Bees with reagents will attack with that reagent. It takes 5u of a reagent to give a bee that reagent.
  • +
  • Added the ability to make Apiaries and Honey frames with wood
  • +
  • Added the ability to make Royal Bee Jelly from 10 Mutagen and 40 Honey
  • +
  • Added the ability to make more Queen Bees from Royal Bee Jelly by using it on an existing Queen, to split her into two Queens
  • +
  • Removes some snowflakey mob behavior from bears, snakes and panthers.
  • +
  • Hudson is feeling punny.
  • +
  • Hostile mob AI should now be a bit more cost-efficient.
  • +
+

monster860 updated:

+
    +
  • Adds area editing, link mode, and fill mode to the buildmode tool
  • +
+ +

12 April 2016

+

FalseIncarnate updated:

+
    +
  • Adjusting the setting of a vendor circuit board is no longer random, but instead provides a select-able list.
  • +
  • Vendor Circuit Board design moved from the Circuit Imprinter to the Autolathe, acid requirement replaced by metal.
  • +
  • Burnt matches can no longer light cigarettes, pipes, or joints.
  • +
+

Fethas updated:

+
    +
  • Nukes the cargo train code rscadd:Adds simple vehicle framework and converts secway/janicart/snowmobiles/bikes/cars/ambulance to it rscadd:Adds space speedbike, red and blue versions, yes you WILL need a spacesuit rscadd:Maps janicart and secway onto metastation (but not ambulance no pareamedic garage, no i am not mapping that)
  • +
  • You should now be able to operate on IPC eyes, SHOULD bugfix:hopefully surgery on diona works right
  • +
+

Fox McCloud updated:

+
    +
  • Adds in TraitorVamp; game mode that's essentially like TraitorChan, but with a Vampire instead of a Changeling
  • +
  • Vampires cannot use holoparasites
  • +
  • Malf AI will automatically lose if it exits the station z-level
  • +
+

Tastyfish updated:

+
    +
  • All cats can kill mice now.
  • +
  • E-N can't suffocate.
  • +
  • Startup time is now shorter.
  • +
  • Removed the Station Collision away mission from rotation, due to multiple conceptual and technical issues.
  • +
+ +

07 April 2016

+

Crazylemon64 updated:

+
    +
  • Removes an offset from the advanced virus stealth calculation, causing viruses to be more stealthy than the sum of their symptoms.
  • +
  • Mulebots will now send announcements to relevant requests consoles on delivery again.
  • +
+

FalseIncarnate updated:

+
    +
  • Adds logic gates, for doing illogical things in a logical manner.
  • +
  • Adds buildable light switches, for all your light toggling needs.
  • +
  • Fixes a resource duplication bug with mass driver buttons.
  • +
+

Fethas updated:

+
    +
  • maybe makes them last longer...maybe..and fixes the event end message
  • +
+

Fox McCloud updated:

+
    +
  • Maps in the slime management console to Xenobio
  • +
  • Reduces Xenobio monkey box count from 4 to 2
  • +
  • Fixes weakeyes having a negligible impact
  • +
  • Can spawn friendly animals with a new gold core reaction by injection with water
  • +
  • Hostile animal spawn increased from 3 to 5 for hostile gold cores
  • +
  • Swarmers, revenants, and morphs no longer gold core spawnable
  • +
  • Fixes invisible animal spawns from gold core/life reactions
  • +
  • Adds tape to the ArtVend
  • +
  • Can no longer use sentience potions on bots
  • +
  • Added in Plasma Dust reagent, acquired by grinding plasma sheets; it's more toxic than regular plasma and generates plasma gas when spilled onto turfs.
  • +
  • Slimecore reactions now require plasma dust as opposed to dispenser plasma
  • +
  • Added in new Rainbow slime; inject with plasma dust to get a random colored slime. Acquire by having 100 mutation chance on a slime when it splits.
  • +
  • Monkey Recycler can produce different types of monkey cubes; change the cube type by using a multitool on the recycler
  • +
  • Epinephrine/plasma reagents changing mutation rate has been removed
  • +
  • Mutation chance is inherited from slime generation to slime generation as opposed to being purely random.
  • +
  • New reactions added for red and blue extracts: red generates mutator, which increases mutation chance, and blue generates stabilizer, which decreases mutation chance.
  • +
  • Slime glycerol reaction removed
  • +
  • Slime cells are now high capacity cells (more power than before)
  • +
  • extract enhancer increases the slime core usage by 1 as oppose to setting it to three
  • +
  • slime enhancer increases slime cores by 1 as opposed to setting the core amount to 3
  • +
  • Chill reaction lowers body temperature slightly more so it doesn't just wear off instantly
  • +
  • Reduces Xenobio plasma sheets from 8 to 3 and removes that pesky boombox
  • +
  • Processors no longer produce 1 more slime core than intended
  • +
  • Less blank/spriteless/empty foods from the silver core reaction
  • +
  • Virology mix reactions now use plasma dust as opposed to plasma
  • +
  • Statues can no longer move/attack people unless they're in total darkness or all mobs viewing them are blinded
  • +
  • statues are invincible to anything other than full out gibbing.
  • +
  • Statues flicker lights spell range increased
  • +
  • Blind spell no longer impacts silicons
  • +
  • Fixes statues being able to attack/move whenever they feel like it, regardless of client statues
  • +
  • Fixes blind spell impacting the statue
  • +
+

Tastyfish updated:

+
    +
  • Beepsky is no longer a pokemon.
  • +
  • pAI-controlled Bots now reliably speak human-understandable languages over the radio.
  • +
  • More floor blood for the blood gods. (Or rather, as much as there was supposed to be.)
  • +
+

tigercat2000 updated:

+
    +
  • Items in your off hand will now count towards access.
  • +
+ +

02 April 2016

+

Crazylemon64 updated:

+
    +
  • Metal foam walls will now produce flooring on space tiles
  • +
  • Syringes will now draw water from slime people.
  • +
+

FalseIncarnate updated:

+
    +
  • Let's you know when your container is full when filling from sinks.
  • +
  • Prevents splashing containers onto beakers and buckets that have a lid on them.
  • +
  • Pill bottles can now be labeled with a simple pen.
  • +
  • Beakers/buckets (and pill bottles) now accept 26 character labels from pens.
  • +
+

Fethas updated:

+
    +
  • Various spells have had a tweak to stun/reveal/cast, some other number stuff...
  • +
  • Nightvision
  • +
  • harvest code is now in the abilites file.
  • +
  • New fluff objectives
  • +
  • Hell has recently remapped its blood transit system and you can now once again crawl through blood. We are sorry for the-GIVE US YOUR SOUL!
  • +
+

FlattestGuitar updated:

+
    +
  • Alcoholic beverages now have proper levels of ethanol in them. Good luck passing out after a beer.
  • +
+

Fox McCloud updated:

+
    +
  • Adds in the Lusty Xenomorph Maid Mob; currently admin only.
  • +
  • Fixes xenomorph brains having the wrong sprite, no origin tech, and incorrect name
  • +
  • removes xenomorph egg from hotel
  • +
  • upgrades are no longer needed to for the available toys in the prize vendor
  • +
  • Implements Advanced Camera Consoles. A type of camera console that function like AI's vision style. Non-buildable/accessible.
  • +
  • Adds in Xenobiology Advance Cameras. A type of camera console that functions like advanced cameras, but only works in Xenobiology areas; can move around slimes and feed them with the console as well. Also non-buildable/accessible (for now).
  • +
  • Adds in cerulean slime reaction that generates a single use blueprint. On use it colors turfs a lavender color
  • +
  • Adds disease1 outbreak event
  • +
  • Adds appendecitis event
  • +
  • Roburgers now properly have nanomachines in them
  • +
  • Re-adds nanomachines
  • +
  • Experimentor properly generates nanomachines instead of itching powder
  • +
  • Fixes big roburgers having a healing reagent in them
  • +
  • Adds nanomachines to poison traitor bottles
  • +
  • Tajarans can now eat mice, chicks, parrots, and tribbles
  • +
  • Vulpkanin and Unathi can now eat mice, chicks, lizards, chickens, crabs, parrtos, and tribbles
  • +
  • fixes spawned changeling headcrab behavior
  • +
+

KasparoVy updated:

+
    +
  • Incisions made at the beginning of embedded object removal surgery can now be closed in the same procedure.
  • +
+

ProperPants updated:

+
    +
  • Maint drones have magboots.
  • +
  • Removed plastic from maint drones. Literally useless for station maintenance.
  • +
  • Increased starting amounts of some materials for maint drones and engi borgs.
  • +
  • Reduced the number of lines taken by Engineering cyborgs calling on materials stacks.
  • +
  • Operating tables can be deconstructed with a wrench.
  • +
  • Fixed and shortened description of metal sheets.
  • +
+

Tastyfish updated:

+
    +
  • Bots can now be controlled by players, by opening them up and inserting a pAI. *beep
  • +
  • MULEbots can now access the engineering destination.
  • +
  • All MULEbot destinations should now have the correct load/unload direction, meaning the crates won't be dumped inside the flaps.
  • +
  • Diagnostic HUD's now give health and status information about bots.
  • +
  • MULEbot rampage blood tracks are now rendered correctly and handle UE traces as appropriate.
  • +
  • Bots should (hopefully) lag the game less now.
  • +
  • Beepsky contains 30% more potato.
  • +
  • Action progress bars are now smooth.
  • +
  • Clicking a filled inventory slot's square with an open hand now clicks the item in the slot.
  • +
  • Status displays now display the time when in Shuttle ETA mode and no shuttle activity is happening.
  • +
  • Shuttle ETA countdowns on status displays are now amber.
  • +
  • pAI's can now use the PDA chatrooms.
  • +
  • Adds treadmills to brig cells, to give the prisoners something productive to do.
  • +
+

TheDZD updated:

+
    +
  • A lot of the guns and armor in the station collision, space hotel, academy, and wild west away missions have been removed/replaced.
  • +
  • Removes that fucking facehugger from station collision.
  • +
+

tigercat2000 updated:

+
    +
  • Virus2 has been removed.
  • +
  • Virus1 is back. Viva la revolution.
  • +
  • You can now have up to 20 characters.
  • +
+ +

26 March 2016

+

Fox McCloud updated:

+
    +
  • Adds in dental implant surgery. Implant pills into people's teeth.
  • +
  • Major rebalance and Shadowling update (https://github.com/ParadiseSS13/Paradise/pull/3986 for details). In general, Shadowlings can no longer enthrall or engage in Shadowling like behavior, pre-hatch. Post-hatch, shadowlings are much more powerful, with a ride array of New abilities such as extending the shuttle or making thralls into lesser shadowlings. Shadowling gameplay should not revolve almost entirely around darkness, as opposed to pre-hatch shenanigans.
  • +
  • Robotics now has a "sterile" surgical area for performing augmentations
  • +
  • Adds the FixOVein and Bone Gel to the autolathe
  • +
  • ensures all surgical tools have origin tech on them; lowers origin tech on FixoVein
  • +
+

KasparoVy updated:

+
    +
  • Slime People can now wear underwear.
  • +
  • Slime People can now wear undershirts.
  • +
+

TheDZD updated:

+
    +
  • NT has removed trace amounts of a highly-addictive substance from the "100% real" cheese used in cheese-flavored snacks. As a result, incidence rates of crewmembers becoming addicted to Cheesie Honkers should reduce to zero.
  • +
  • After receiving complaints about crewmembers often being unable to physically function without a back-mounted barrel of coffee, NT has replaced station all sources of coffee on the station, including coffee beans themselves with a largely decaffeinated version. It was funny the first time almost every crewmember aboard the NSS Cyberiad was lugging around their own oil barrel filled with coffee, it wasn't so funny, nor good for productivity the eighteenth.
  • +
+ +

25 March 2016

+

Crazylemon64 updated:

+
    +
  • You now will actually have the correct `real_name` on your DNA.
  • +
  • No more roundstart runtimes regarding IPC hair.
  • +
  • Mitocholide rejuv will work more usefully now.
  • +
  • Limbs and cyborg modules will no longer appear in your screen.
  • +
  • Cyborg module icons are now persistent throughout logging in and out.
  • +
  • Various cyborg modules, like engineering, now use the proper icon.
  • +
+

FlattestGuitar updated:

+
    +
  • Adds confetti grenades.
  • +
+

Fox McCloud updated:

+
    +
  • Fixes Sleeping Carp combos not having an attack animation
  • +
  • Fixes several chems not properly healing brute/burn damage, consistently, as intended
  • +
+

KasparoVy updated:

+
    +
  • Unbranded heads and groins no longer invisible.
  • +
  • Zeng-hu left leg will now be in line with the body when facing south.
  • +
+ +

22 March 2016

+

Crazylemon64 updated:

+
    +
  • Repairs all sorts of eldritch occurences that happen when you put an organic head on an IPC body, as well as some decapitation bugs
  • +
  • Makes heads keep hair on removal
  • +
  • Amputated limbs from a DNA-injected individual now will keep their appearance of the DNA-injected person
  • +
  • Wounds will vanish on their own now
  • +
  • Admins now have an "incarnate" option on the player panel when viewing ghosts for quick player instantiation
  • +
  • Fixes a runtime regarding failing a limb reconnection surgery
  • +
  • Copying a client's preferences now overrides the previous mob's DNA
  • +
  • A DNA injector is now more thorough, and affects the DNA of mobs' limbs and organs
  • +
  • DNA-lacking species can no longer be DNA-injected
  • +
  • Brains are now labeled again
  • +
  • Splashing mitocholide on dead organs will make them live again.
  • +
  • The body scanner now detects necrotic limbs and organs.
  • +
  • pAIs and Drones are now affected by EMPs and explosions while held.
  • +
+

Fethas updated:

+
    +
  • Adds a surgery for infection treatmne/autopsys that is simply cut open, retract, cauterize
  • +
  • fixes a dumb error in internal bleeeding surgerys
  • +
  • Chaos types no longer random teleport, but will make the target hallucinate everyone looks like the guardian.
  • +
+

FlattestGuitar updated:

+
    +
  • Adds a snow, navy and desert military jacket.
  • +
+

Fox McCloud updated:

+
    +
  • Removes random 1% chance to heal fire damage
  • +
  • Removes passive healing from resist heat mutation
  • +
  • Regen mutation heals every cycle (albeit less, on average), but doesn't cost hunger
  • +
  • Fixes not being able to speak over xeno common or hivemind when you receive the Xeno hive node
  • +
  • Adds in the ability to transfer non-locked metal+glass only designs from the protolathe to autolathe
  • +
  • Changes Outpost Mass Driver to prevent accidental spacings
  • +
  • Shadow people no longer dust on death, are rad immune+virus immune, and can be cloned. Slip immunity removed
  • +
  • Shadowlings no longer get hungry or fat and no longer dust on death
  • +
+

KasparoVy updated:

+
    +
  • The ability to change your head, torso and groin as an IPC in the character creator. Non-IPCs cannot access the parts.
  • +
  • Head, torso and groin sprites for all mechanical limb/bodypart brands but Morpheus and the unbranded ones (since those already exist) from Polaris.
  • +
  • Faux-eye optics for non-Morpheus heads.
  • +
  • The ability to change optic (eye) colour if you've got a non-Morpheus head.
  • +
  • The ability to choose human hair styles (wigs) and facial hair styles (postiche) with non-Morpheus heads. Non-Morpheus heads cannot choose screens. Conversely, Morpheus heads cannot choose wigs or facial hair.
  • +
  • Two hair styles from Polaris.
  • +
  • The ability for IPCs to wear undergarments (shirts and trousers).
  • +
  • Antennae (colourable) for IPCs.
  • +
  • IPC monitor adjustment verb will now adjust optic colour if the head is non-Morpheus.
  • +
  • Combat/SWAT boots can now be toecut and jacksandals can't.
  • +
  • ASAP fix to what would've broken the ability to configure prostheses in character creation.
  • +
  • Adjusted masks no longer block CPR (including bandanas).
  • +
  • You can no longer run internals from adjusted breath masks (or airtight adjustable masks in general).
  • +
+

Regens updated:

+
    +
  • Robotic hearts will now properly give the mob a heart attack instead of just damaging it when EMP'd
  • +
  • Assisted organs will now also take damage from EMP's
  • +
  • Internal robotic and assisted organs will now actually take damage from EMP's
  • +
+

Tastyfish updated:

+
    +
  • Adds PDA chatrooms. Post memes! Talk to your fellow collaborators! Get caught!
  • +
  • You can now set the PDA messenger to automatically scroll down to new messages.
  • +
  • Pet collars now act as death alarms and can have ID's attached to them.
  • +
  • All domestic animals can now wear collars.
  • +
  • You can now make video cameras at the autolathe.
  • +
+

TheDZD updated:

+
    +
  • Fixes an instance of old code being so incredibly, unbelievably, makes-me-want-to-stab-myself-in-the-eye-edly idiotic.
  • +
+

TravellingMerchant updated:

+
    +
  • Kidan have new sprites!
  • +
+

tigercat2000 updated:

+
    +
  • Nukeops now have an assault pod, they can use it for 30 TC. Loud and mean.
  • +
  • Lighting overlays can no longer go below 0 lum_r/g/b
  • +
  • Shuttles will work with lighting better.
  • +
  • Wizards can no longer teleport to prohibited areas such as Central Command.
  • +
+ +

16 March 2016

+

Crazylemon64 updated:

+
    +
  • Being in godmode now makes you immune to bombs
  • +
  • Science members now get compensated when they ship tech disks to centcomm.
  • +
  • Science crew are no longer paid when they "max" research.
  • +
  • Roboticists now get credit for making RIPLEYs and Firefighters
  • +
  • Slime people can now regrow limbs on a more lax nutrition requirement
  • +
  • Enhances the nutripump+ to let slime people regrow limbs with it active
  • +
  • Skeletons, slime people, IPCs, and Diona no longer leave blood when hit
  • +
  • Rejuvenating a slime person will no longer clog up their "blood"
  • +
  • Slime people will now regenerate "blood" from having water in their system
  • +
  • The decloner can now be created again
  • +
  • Environment smashing mobs can now destroy girders.
  • +
+

DaveTheHeadcrab updated:

+
    +
  • Removes the check for species on the update_markings proc.
  • +
+

FalseIncarnate updated:

+
    +
  • Xeno-botany is now more user-friendly, and less random letters/numbers.
  • +
  • Hydroponics now has a connector hooked up to the isolation tray and a new connector in their back room for those strange plants that like spewing plasma or eating nitrogen.
  • +
  • You can now (finally) build the xeno-botany machines, and science can print off their respective boards.
  • +
+

Fethas updated:

+
    +
  • Syringes are no longer sharp
  • +
  • byond likes direct pathing so item/organ/internal not item/organ even if it shouldn't be in the internal_organs list. This was preventing the list from doing stuff correctly.
  • +
  • fixed ipc organ manipulation surgery, you can now insert a replacment ipc organ directly instead of needing a screwdriver in your main hand
  • +
  • nanopaste now will repair organs with robotic >= 2 instead of > 2 cuase i am an idiot
  • +
  • Fix, hopefully, for a runtime for clientless mobs whos head are cut off...
  • +
  • Hopefully fixes issues with diona eyes
  • +
  • Though shalt not eat robotic organs..including cybernetic implants..
  • +
  • ITS SURGERY_STEP/DETHRALL NOT SURGERY_STEP/INTERNAL/DETHRALL
  • +
+

FlattestGuitar updated:

+
    +
  • Adds three new synthanol drinks
  • +
  • Drinking synthanol is now a bad idea if you're organic
  • +
  • A glass of holy water now looks like normal water
  • +
+

Fox McCloud updated:

+
    +
  • Adds in drink fizzing sound
  • +
  • Drink/bartender recipes use this new fizzing sound in addition to a few other recipes
  • +
  • Adds in a fuse burning sound
  • +
  • Bath salts, black powder, saltpetre, and charcoal use this sound now
  • +
  • Adds in a matchstrike+burning sound
  • +
  • Lighting a match triggers this new sound
  • +
  • Adds in scissors cutting sound
  • +
  • Cutting someone's hair uses this new sound
  • +
  • Adds in printer sounds
  • +
  • printing off papers from various devices typically uses these sounds
  • +
  • Adds computer ambience sounds
  • +
  • black box recorder and R&D core servers both play this sound at random rare intervals
  • +
  • Reduces the tech level (and requirement) for nanopaste
  • +
  • Reduces the tech level (and requirement) for the plasma pistol
  • +
  • Removes Nymph and drone tech levels
  • +
  • Reduces tech levels on the flora board
  • +
  • Adds tech level requirements to mech sleepers, mech syringe guns, mech tasers, and mech machine guns
  • +
  • Increases tech cost of the decloner
  • +
  • Removes the pacman generators
  • +
  • Removes emitter
  • +
  • Removes flora machine (functionless anyway)
  • +
  • Removes the pre-spawned nanopaste
  • +
  • Removes space suits
  • +
  • Removes excavation gear
  • +
  • Replaces the soil with actual hydroponic trays (more aesthetic than anything)
  • +
  • Removes most external asteroid access from the station
  • +
  • Excavation storage is now generic science storage
  • +
  • removed the plasma sheet
  • +
  • Fixes augments not showing up in R&D unless specifically searched for
  • +
  • Fixes some augments being unavailable in mech fabs
  • +
  • Fixes augments having no construction time
  • +
  • Fixes xenos not gaining plasma when breathing in plasma
  • +
  • Fixes plasma reagent not generating plasma for a person
  • +
  • Screaming has different sounds based on being male or female
  • +
  • Implements Goon's screaming sounds.
  • +
  • Screaming tone is now based on age of character instead of being random
  • +
  • Ups the cooldown on screaming from 2 seconds to 5 seconds
  • +
  • Removes chance for Whilhelm scream
  • +
  • Borgs can now scream
  • +
  • Monkey's now have a unique screaming sound
  • +
  • IPCs now scream like cyborgs
  • +
  • Updates slot machines to have higher jackpots and more payouts with more interesting sounds
  • +
  • Adds X-Ray, Thermal, Anti-tun, and Reviver implants to the nuke ops uplink (augments come with one auto-implanter) rcsadd: Adds in augment auto-implanter, which inserts and implant without surgery
  • +
  • tweaks a large number of chems; behaviors are largely retained, but new flavor messages, probabilities, etc may be present; overall, you can expect chems to do the same thing
  • +
  • Tabun re-replaced with Sarin rcsadd: New reagent: cholesterol: if overdosed on, it can cause a heart attack--fatty foods, cheese, eggs, and some meats all produce cholesterol in your body.
  • +
  • Mixing Sarin, Meth, or Cyanide will poison in a very small area of the reaction if you're not on internal OR not wearing a gas mask
  • +
  • Chemist warddrobe now has two gas masks
  • +
  • Teslium will now impact synthetics AND organics
  • +
  • Fixes facehuggers hugging already infected people
  • +
  • Fixes facehuggers hugging people while dead
  • +
  • Fixes Embryo's developing twice as fast as they should
  • +
  • Fixes up some behaviors with xeno eggs
  • +
  • Xeno acid can now melt through floors and the asteroid
  • +
  • Xeno's now play the gib sound when actually gibbed
  • +
  • Implements Changeling headcrabs/headspiders
  • +
  • Fixes xenos not throwing their organs when gibbed
  • +
  • Fixes swallowed mobs not being ejected when a human is gibbed
  • +
  • Adds in spider eggs reagent, an infectious reagent that requires surgery to correct
  • +
  • Fixes EMPs causing eye implant users to be permanently blind
  • +
  • Increases bag of holding's storage capacity
  • +
  • Removing a heart no longer kills the patient instantly, but induces a heart attack
  • +
  • Demon hearts will not work
  • +
  • Should now actually be able to re-insert hearts
  • +
  • Reworks addictions to bettter differentiate them betweeen overdosing and make them more realistic.
  • +
  • changes which chems are addictive, currently, the follow reagents are now addidctive: meth, crank, krokodil, bath salts, space drugs, perfluoradecalin, omnizine, coffee, nicotine, fliptonium, ultra lube, surge, fake cheese, weird cheese, ephedrine, diphenhydramine, teporone, and morphine
  • +
  • sleepers help you recover from addiction faster
  • +
  • Can now make cable coils in autolathes
  • +
  • Fixes the slot machine announcements not displaying properly
  • +
+

Tastyfish updated:

+
    +
  • The super fart mutation now gives you a spell-like ability instead of augmenting the emote.
  • +
  • Vampire abilities are now in their own Vampire tab, as well being action buttons at the top, like spells.
  • +
  • Cloning a vampire no longer makes them lose their abilities.
  • +
  • Vampires can no longer hypnotize chaplains.
  • +
  • Being a full vampire (500+ total blood) actually makes you immune to holy water reliably now.
  • +
  • Some old away missions are back: Academy, Black Market Packers, Space Hotel, Station Collision, and Wild West. Go out and round up some hostiles!
  • +
  • Shuttle consoles now pair up to the engineering, mining, research, or labor shuttle when built or used before pairing, as long as the shuttle is near the console, or the shuttle is moved to be nearby.
  • +
+

monster860 updated:

+
    +
  • Mining station now has a podbay.
  • +
  • Ore scooping module for the spacepod.
  • +
  • Three mining lasers for spacepod: Basic, normal, and burst.
  • +
  • Shooting weapons south or west of spacepod will actually hit adjacent targets now, and won't shoot through walls anymore.
  • +
+

taukausanake updated:

+
    +
  • Mice can now be picked up like diona
  • +
+ +

08 March 2016

+

Crazylemon64 updated:

+
    +
  • Slime people are now more vulnerable to low temperatures.
  • +
  • Slime people are able to slowly regrow limbs at a high nutrition cost.
  • +
  • Slime people now slowly shift color based on reagents inside of them - disabled by default, toggle it with an IC verb
  • +
  • Slime people's cores are more vulnerable to damage
  • +
  • Species-related abilities now properly are removed - no more vox hair stylists, unfortunately.
  • +
+

Fethas updated:

+
    +
  • the nest buckle now looks for the right organ path
  • +
  • Fixed some sprites.
  • +
  • No more putting no drops in rechargers,
  • +
+

Fox McCloud updated:

+
    +
  • Implement's goon's gibbing sound
  • +
  • Implement's goon's gibbing sound for robots/silicons
  • +
  • Removes old gibbing sound
  • +
+

Spacemanspark updated:

+
    +
  • Lazarus Injector's can now be emagged to activate their special features, alongside using EMPs on them.
  • +
+

Tastyfish updated:

+
    +
  • Mimes now have a new ore, Tranquillite, used to bring peace and quiet to the station.
  • +
  • There are also permanent invisible walls and silent floors that can be made from tranquillite.
  • +
  • The Recitence mech is now buildable!
  • +
  • The Recitence mech is now playable!
  • +
  • Mid-round selection for various creatures and antagonists now consistently asks permission.
  • +
+

TheDZD updated:

+
    +
  • Adds justice helmets with flashing lights and annoying sirens.
  • +
  • Adds crates containing said helmets.
  • +
  • Also includes a version of the helmet that can only be spawned by admins, and just has a single red light in the center instead of the stereotypical police blinkers.
  • +
+

monster860 updated:

+
    +
  • Space pod transitions are now fixed.
  • +
+ +

07 March 2016

+

Crazylemon64 updated:

+
    +
  • People with VAREDIT can now write matrix variables
  • +
  • People with VAREDIT can now modify path variables
  • +
  • Refactors the variable editor code somewhat.
  • +
  • The buildmode area tool now shows reticules of what you've selected.
  • +
  • Switching mobs while using the buildmode tool no longer screws up your UI.
  • +
  • Refactors buildmode so it's no longer a special-case system.
  • +
  • Adds a copy mode to build mode, which lets you duplicate objects.
  • +
  • Any mob in buildmode can work at the fastest possible rate.
  • +
  • Fixed a problem where the icons of a person would not correctly update when changing gender.
  • +
  • One's hairstyle only adjusts on gender change if it's incompatible with your new gender.
  • +
  • Fixed a bug where a person's icon would only be updated if their sprite had a new layer added or removed.
  • +
  • You no longer lose your name when monkeyized and reverted - you'll still look like a monkey while you're a monkey, though.
  • +
  • Your organs will now match your gender when you are cloned.
  • +
  • Skeletons (when a body rots) no longer retain a fleshy torso.
  • +
  • Putting people in an active cryotube now produces the message on insertion, rather than release.
  • +
  • An EMP'd cloning pod will now display its sprites correctly.
  • +
+

FalseIncarnate updated:

+
    +
  • Water Balloons can be filled from more sources than just beakers and watertanks.
  • +
+

Fox McCloud updated:

+
    +
  • Fixes the "yeah" glasses so the sound doesn't vary and a message is displayed, on use
  • +
  • Noir mode only activates when the glasses are equipped to your actual eyes
  • +
  • Noir Glasses mode can be toggled on or off (defaults to off)
  • +
  • Mimes can no longer use spells and continue speaking
  • +
  • Mime abilities are now spells with proper icons
  • +
  • Mime wall now last 30 seconds, up from 5
  • +
  • forecfields/invisible walls now block air currents
  • +
  • Adds the Sleeping Carp scroll to the uplink for 17 TC
  • +
  • Fixes Shadowlings being able to use guns
  • +
  • Fixes sleeping carp scroll users being able to use guns
  • +
  • Fixes the Experimentor throwing one item at a time
  • +
  • Experimentor menu now automatically refreshes after use
  • +
  • Lowers surgery times across the board
  • +
  • Removes scalpels causing 1 damage on successful surgery
  • +
  • Removes random chance to fracture ribs on a successful surgery
  • +
  • Mining drills now have an edge
  • +
+

KasparoVy updated:

+
    +
  • Jackets who have the verb available but are not intended to be adjusted will not have the action button available.
  • +
  • You can now adjust breath masks while buckled into beds and chairs.
  • +
  • Known issues with adjusted jackets using the wrong sprites.
  • +
  • Blueshield coat in hand and item icons.
  • +
  • Hulks now rip apart adjustable and droppable jackets. The items stored in the jackets get dropped on the ground.
  • +
+

Tastyfish updated:

+
    +
  • Infrared emitters can now be rotated while already in an assembly via the UI popup.
  • +
  • The infrared emitter can no longer be hidden inside of boxes and still work.
  • +
  • The beach now has a border and is splashier.
  • +
  • Gives Psychiatrist a paper bin, clipboard, and multicolored pen.
  • +
  • Gives the Librarian / Jouralist a multicolored pen.
  • +
  • Gives the NT Representative a clipboard.
  • +
  • The ethanol-based neurotoxin drink is now called Neuro-toxin to avoid being confused with the deadly toxin.
  • +
+

VampyrBytes updated:

+
    +
  • Fixes emotes ending with s needing 2. Emotes now work with grammatical options eg ping or pings, squish or squishes
  • +
  • Updated emote help with missing emotes. Help will also show any species specific emotes for your current species
  • +
+ +

26 February 2016

+

FalseIncarnate updated:

+
    +
  • Chocolate can now make you fat, as expected.
  • +
+

Fox McCloud updated:

+
    +
  • stamina damage now regenerates slightly faster
  • +
  • Adds in whetstones for sharpening objects
  • +
  • Kitchen vendor starts off with 5 salt+pepper shakers
  • +
  • Can now point while lying or buckled
  • +
  • Fixes Capulettium Plus not silencing
  • +
  • Fixes slurring, stuttering, drugginess, and silences last half of what they should
  • +
+

KasparoVy updated:

+
    +
  • Jackets that start open are recognized as actually being open already now. This fixes a bug with certain items that don't have an open state, or cases where it ended up giving an item the wrong icon (one that didn't exist)
  • +
+

Spacemanspark updated:

+
    +
  • Fixes synthetics from giving off the proper message in the chat box when using the *yes and *no emotes.
  • +
+

Tastyfish updated:

+
    +
  • Wheelchairs, janicarts, and ambulances can now go through doors according to the user's driver's access.
  • +
+ +

24 February 2016

+

Crazylemon64 updated:

+
    +
  • The defib should be more reliable on people who have ghosted
  • +
  • The defib will now give a message if the ghost is still haunting about
  • +
  • Attacking someone with an accessory will now let you put things on them without having to strip them.
  • +
  • Borers will now properly detach upon death of a mob they are controlling
  • +
  • Borers can now see their chemical count while in control of a mob
  • +
  • Borers can now silently communicate with their host - this is not available to the host until the borer has either begun to communicate, or has taken control at least once - this is to avoid spoiling that the borer exists
  • +
  • Borers won't be able to talk out loud inside of a host, by default - they can remove this safeguard with a verb under their borer tab. Borer hivespeak is unaffected.
  • +
  • Borers infesting and hiding are now silent.
  • +
  • Made borer's chem lists more nicely formatted
  • +
  • No more superspeed attacking simplemobs
  • +
  • New players now show up properly under the "who" verb when used as an admin
  • +
  • Mining drones will now automatically collect sand lying around
  • +
  • RIPLEYs can now drill asteroid turfs for sand
  • +
  • You can now load exosuit fuel generators with items containing their material - this means you can fuel yourself off of ores, but this will be highly inefficient and cost you mining points later on, as you can't take fuel back out.
  • +
  • You can now load the fuel generators from an ore box.
  • +
  • The plasma generator now produces 3x as much power from the same amount of fuel - this lets it even remotely compete with the uranium generator.
  • +
  • You can now light cigarettes off of burning mobs.
  • +
  • Exosuit tracking beacons now fit in boxes - prior, they were far too large for even a backpack, as they shared the same size as all other mecha equipment
  • +
  • Miners can now collect ore by walking over it with an ore satchel on.
  • +
+

FalseIncarnate updated:

+
    +
  • Adds prize tickets as a replacement for physical arcade prizes.
  • +
  • Adds a buildable prize counter to exchange tickets for prizes.
  • +
  • Adds a bike. Despite what Prof. Oak might claim, you can ride it indoors.
  • +
  • Adds colorful wallets, for that old school arcade pride.
  • +
  • Fixes accidental removal of plump helmet biscuit recipe.
  • +
  • Temporarily adds a prize counter to the bar (Cyberiad) or dorms (MetaStation), and adds a max upgrade one to the Ninja Holding Area (Cyberiad z2)
  • +
  • Fixes Metastation. Seriously fixed a lot, just read the PR description for the full list.
  • +
+

FlattestGuitar updated:

+
    +
  • Adds IPC alcohol and a few derivative drinks
  • +
  • IPCs can now drink and be fed from glasses
  • +
+

Fox McCloud updated:

+
    +
  • Laser eyes mutation no longer drains nutrition
  • +
  • splits the EMP kit into two things: the standard EMP kit (2 grenades and an implant), and the EMP flashlight by itself
  • +
  • nerfs heart attacks so they do less damage
  • +
  • Pickpocket gloves now put the item you strip into your hands as opposed to the floor
  • +
  • Picketpocket gloves can now silently strip accessories
  • +
  • Pickpocket gloves will no longer give a message for messing up a pickpocket
  • +
+

KasparoVy updated:

+
    +
  • Adjusting masks while they are not on the face will no longer turn off internals.
  • +
  • Adjusting masks while they are not on the face will now cause the mask to hide/reveal the wearer's identity the next time it's worn as intended.
  • +
  • Adds the ability to open/close bomber jackets.
  • +
  • Adds a security bomber jacket. This jacket inherits the protection and storage capabilities as a standard Security vest with additional bomber jacket benefits.
  • +
  • Adds UI button in top left of screen for jacket adjustment.
  • +
  • Replaces the standard bomber jacket in the Pod Pilot bay with the Security version.
  • +
  • Centralizes jacket/coat adjustment handling.
  • +
  • All jackets start closed by default.
  • +
  • Geneticist duffelbag on-mob sprite (for all species).
  • +
  • Vox-fitted backpacks, satchels, ERT backpacks, duffelbags and defib unit.
  • +
  • Refactors back-item icon generation.
  • +
  • Typo in the description of Santa's sack.
  • +
  • Missing punctuation and gender macros in the description of the bag of holding.
  • +
  • The tweak to back-icon generation fixes a bug where the wrong sprite name was being used to generate back-item icons.
  • +
+

PPI updated:

+
    +
  • Adds the ability to hide papers in vents. You can now leave a romantic love letter, exchange information in secret, or hide papers infused with the power of nar'sie from sight.
  • +
+

Regen1 updated:

+
    +
  • Adds the Immolator laser gun, a modified laser gun with 8 shots that will ignite mobs, can be made in R&D
  • +
+

Spacemanspark updated:

+
    +
  • Adds *yes and *no emotes to Synthetics. Glory to Synthetica.
  • +
+

Tastyfish updated:

+
    +
  • The PDA system has been completely redone behind the scenes! It should be functionally similar, although there is now a Home and Back button at the bottom as appropriate.
  • +
  • All of the heads now have multicolored pens.
  • +
  • EngiVend now has 10 camera assemblies.
  • +
  • Borgs can now use vending machines.
  • +
  • There are now picture frames that can be made from the autolathe or wood planks for papers, photos, posters, and canvases!
  • +
+

pinatacolada updated:

+
    +
  • Makes the Protect Station AI law board no longer consider people that damage the station crew, instead of human
  • +
+

ppi updated:

+
    +
  • When revealed Revenants will not be able to move at the maximum move speed, nor be able to pass through any solid object, like walls, windows, grills, computers and mechs.
  • +
+ +

13 February 2016

+

Crazylemon64 updated:

+
    +
  • Relaxes the check on what atoms you can follow to any movable atom
  • +
  • Mages are now more ragin
  • +
  • Admins can now adjust the total number of wizards at runtime by tweaking either max_mages, or players_per mage
  • +
+

DaveTheHeadcrab updated:

+
    +
  • Adds new worn icons for duffelbags to better reflect their size, compliments of WJohn at /tg/
  • +
+

FalseIncarnate updated:

+
    +
  • Adds burritos, made from cutlets, beans, rice, capsacin oil (hotsauce), cheese, and flat dough (because we lack proper tortillas) in the microwave.
  • +
  • Adds chimichangas. You know you want a deep-fried burrito.
  • +
+

Fox McCloud updated:

+
    +
  • Updates some spell icons with better/higher quality icons
  • +
  • Updates unarmed attacks to allow for more customization
  • +
  • Updates martial arts so they factor in specie's attack messages and sounds
  • +
  • Re-balances Sleeping Carp fighting style
  • +
  • Re-balances Bo Staff
  • +
  • Rebalances Golem: they should now be spaceproof, fire+cold proof, rad proof, virus immune, clonable, parapen+syringe gun immune, deal increased melee damage. Their armor has been reduced to 55 melee across the board, their slip immunity removed, pain immunity removed, and they're slightly slower
  • +
  • Fixes Ei Nath generating two brains
  • +
  • Ensures the Necromatic Stone generates actual skeletons
  • +
  • Can now strip PDA/IDs from Golems
  • +
  • Fixes sleeping carp grab not being an instant aggressive grab
  • +
  • Fixes an exploit with declaring war on the station
  • +
+

KasparoVy updated:

+
    +
  • Orange and purple bandanas for all station species.
  • +
  • The ability to colour bandanas with a crayon in a washing machine.
  • +
  • Refactors the bandana adjustment system.
  • +
  • Minor adjustments to Tajaran and Unathi bandana east/west sprites.
  • +
  • Adjusting a bandana will now take if off of your head/face and put it in an available hand. If both hands are available, it goes in the selected hand.
  • +
  • Adjusting a coloured bandana will no longer revert it to the original coloured icons anymore.
  • +
  • Adjusting a bandana from mask-style to hat-style means the bandana won't obscure your identity anymore.
  • +
  • Greys now use re-positioned smokeables. They no longer smoke out the eyes.
  • +
+

TheDZD updated:

+
    +
  • Fixes spacepods being able to shoot through walls.
  • +
  • Lowers spacepod weapons fire delay.
  • +
  • Increases spacepod weapons energy costs.
  • +
  • Makes spacepods move at speeds not rivaling those of photon beams. They are now a hair bit faster than a person with a jetpack.
  • +
  • Reduces battery costs for spacepod movement.
  • +
+ +

10 February 2016

+

Crazylemon64 updated:

+
    +
  • The cloner now checks for NO_SCAN on the brain when scanning - unclonable species are now truly unclonable. You are still able to revive them with a brain transplant and a defib, however.
  • +
  • A tier-4 DNA scanner linked to a cloning system will now be able to reproduce a body from a brain's DNA, in event of the original corpse being gibbed or similar.
  • +
  • Species with organic limbs and NO_BLOOD will no longer bleed (though still on hit - write that off as "bone powder")
  • +
  • Skeletons now lack internal organs, except for the runic mind which exists in their head - an analogue for the brain
  • +
  • Skeletons that drink milk will be regenerated at a moderate pace, have a small chance of mending bones, and will praise the great name of mr skeltal
  • +
  • Adds a reagent system for species reacting to specific reagents
  • +
  • Slime People can now select from all human hairstyles, and their "hair" will be tinted a shade of their body.
  • +
  • Increases the frequency of the cortical borer event.
  • +
  • People with borers cannot commit suicide - this applies to a controlling borer, too.
  • +
  • Borers can no longer overdose their hosts.
  • +
  • Borers can now inject Saline-Glucose, Spaceacillin, Hydrocodone, Mitocholide, Salbutamol, Capulettium+, and Charcoal. Styptic was removed, as it's pathetic at healing when directly injected. Salicyclic acid was removed too, as its functionality is duplicated by both hydrocodone and saline-glucose.
  • +
  • A mind trapped by a cortical borer can now understand things it could understand when normally in its body.
  • +
  • Changes chemistry's welding tank to a wall-mounted version, to increase the room available.
  • +
  • You can now gib butterflies and lizards with a knife
  • +
  • Ghosts can now follow mecha
  • +
  • You can now access an R&D console by emagging it - it did nothing before.
  • +
  • Walls will now properly smooth and show damage.
  • +
  • Fixes the dialog that occurs when the AI shuts off to actually do what it says it does
  • +
+

Fox McCloud updated:

+
    +
  • Fixes not being able to attach IEDs to beartraps
  • +
  • Can no longer spamclick someone to death using headslamming on a toilet/urimal
  • +
  • Toilet/urinal headslamming now plays a sound
  • +
  • Toilet headslamming damage reduced slightly
  • +
  • Can now fill open reagent containers in a toilet to receive "toilet water".
  • +
  • No more message spam when someone fills a container using a sink
  • +
  • Can now wash your face using a sink, which washes away lipstick and wakes you up slightly
  • +
  • Washing things will now use progress bars
  • +
  • Ensures consuming a single syndicate donk pocket won't get you addicted to meth
  • +
  • Kinetic Accelerators and E-bows automatically reload
  • +
+

Glorken updated:

+
    +
  • Added a Knight Arena for Holodeck.
  • +
  • Added red and blue claymore sprites.
  • +
  • Changed overrided to overrode when emagging Holodeck computer.
  • +
+

KasparoVy updated:

+
    +
  • Vox versions of the Officer SWAT sechailer + HOS SWAT sechailer + Warden SWAT sechailer.
  • +
  • Resprited versions of most Human masks to fit Unathi, Tajara and Vulpkanin.
  • +
  • Warden now gets their own version of the SWAT sechailer in their locker.
  • +
  • HOS now gets the appropriate version of the SWAT sechailer in their locker.
  • +
  • Repositioned smokeables now available for Vox, Unathi, Tajara and Vulpkanin.
  • +
  • Properly shades Vox bandana down-state sprites.
  • +
  • Readds Tajaran bald hairstyle.
  • +
  • Alternate style of non-Human breath mask (incl. surgical/sterile mask) down-state positioning.
  • +
  • Corrects all non-Human species' breath mask (incl. surgical/sterile mask) down-state icons to use the right position style.
  • +
  • Minor adjustments to Tajaran breath mask up-state sprites.
  • +
+

PPI updated:

+
    +
  • Adds a reconnect button to the File menu in the client.
  • +
  • Adds head patting
  • +
+

Regen updated:

+
    +
  • Powersink can now drain a lot more power before going boom
  • +
  • Buffed the powersinks drain rate
  • +
  • Buffed explosion from an overloaded powersink, try to find it instead of overloading the grid.
  • +
  • Admin log warning before the powersink explodes
  • +
+

Spacemanspark updated:

+
    +
  • Miners can now utilize the power of mob capsules to take along their lazarus injected mining creatures!
  • +
  • Store your Pokemo- er, sorry, I mean mining mobs that you've captured in the lazarus capsule belt.
  • +
+

Tastyfish updated:

+
    +
  • Species that don't breathe can kill themselves now!
  • +
  • Suicide messages are now catered to your species.
  • +
  • Shortened the default pill & patch name when using the ChemMaster.
  • +
  • The chaplain now has a service radio headset, as Space Jesus intended.
  • +
+

TheDZD updated:

+
    +
  • When Ahelping, "Question" is now "Mentorhelp" and "Player Complaint" is now "Adminhelp."
  • +
  • Mentorhelps and PM replies from mentors appear in a bold aqua blue color.
  • +
  • Adminhelps and PM replies from admins appear in a bold bright red color.
  • +
  • PM replies from players appear in a dull/dark purple color.
  • +
  • Adds admin attack log to players being converted to cult.
  • +
  • Adds shadowling thrall jobbans.
  • +
  • Jobbanned players who are converted to shadowling thrall, revolutionary, or cultist will have the control of their body offered up to eligible ghosts.
  • +
+ +

31 January 2016

+

Crazylemon64 updated:

+
    +
  • Syndicate borgs can now interact with station machinery
  • +
  • People with slime people limbs can now *squish
  • +
  • Skrell's vulnerability to alcohol is checked on their liver, now - a liver transplant will let them take alcohol like a champ - lacking a liver will have the same effect as being a skrell, when drinking
  • +
+

FalseIncarnate updated:

+
    +
  • Adds in the Magic Eight Ball toy, found in Claw Game prize orbs.
  • +
  • Adds in the Magic Conch Shell, an admin-only shell of power.
  • +
+

Fox McCloud updated:

+
    +
  • Updates Summon Guns and Magic to include many of the new guns
  • +
  • Summon Guns/Magic can no longer be used during Ragin' Mages
  • +
+

Tastyfish updated:

+
    +
  • The emergency shuttle status in the Status tab now has ETA/ETD/etc like before.
  • +
  • Code Gamma+ now has a 5 minute emergency shuttle call, like Red.
  • +
+

pinatacolada updated:

+
    +
  • Adds NanoUI to the operating computer
  • +
  • Adds health announcing, critical and oxygen damage aural alerts to the computer, with a menu to selectively turn them on and off
  • +
+ +

29 January 2016

+

Crazylemon updated:

+
    +
  • The DNA scanner has now undergone a seminar to recognize fake identities; It will now scan the actual person's identity, rather than their disguise (read: wearing a mask with or without someone else's ID).
  • +
  • Matter eater now allows you to eat humans as if you were fat.
  • +
  • Eating mobs with an aggressive grab now generates attack logs.
  • +
+

Crazylemon64 updated:

+
    +
  • For a short while, there was a clerical error where all AI communications equipment was replaced with bananas. This has now been fixed.
  • +
  • Ghosts can now see the contents of smartfridges and look at the drone console
  • +
  • Humans now only produce one message when shaken while SSD
  • +
  • The supermatter no longer will irradiate everyone, everywhere, when it explodes.
  • +
  • Writing on paper will now add hidden admin fingerprints, so that you can't forge mean notes in someone else's name.
  • +
  • Brains are no longer able to escape their brain by being a sorcerer.
  • +
  • Astral projecting with other runes on the same tile will now no longer prevent you from re-entering
  • +
  • Voxxy that is become ex-voxxy no longer carry voxxy appearance! yaya!
  • +
+

FalseIncarnate updated:

+
    +
  • Allows plants to be identified as enhanced*. Enhancing plants results from using reagents (like saltpetre) that affect the stats of a seed instead of using mutagens/machines. *May not meet standards for being classified as "organic produce". (This was already possible, just renames enhanced plants for easier differentiation)
  • +
+

Fox McCloud updated:

+
    +
  • Fixes mutadone not working with some genetic mutations
  • +
  • Fixes banana honk and silencer being alcoholic
  • +
  • Fixes Kahlua being non-alcoholic
  • +
  • Fixes polonium not metabolizing
  • +
  • Fixes being able to receive free unlimited boxes from the Merchandise store
  • +
  • Adds in wooden bucklers
  • +
  • Re-adds roman shield to the costume vendor
  • +
  • Buffs Riot shield damage from 8 to 10
  • +
  • Adds in a Skeleton race
  • +
  • Tweaks the skeletons colors to be more realistic and to blend in less with the floor
  • +
  • Adds in lichdom spell for the wizard
  • +
  • Adds in lesser summon guns spell for wizard
  • +
  • adds in Mjolnir and the singularity hammer as weapons the wizard can purchase
  • +
  • Wizard can purchase the charge spell from the spell book
  • +
  • Wizard can purchase a healing staff from the spell book
  • +
  • Tweaks and lowers spell costs of utility spells for wizard
  • +
  • Re-organizes the spellbook to be better divided into categories and have a better window size
  • +
  • Knock now opens+unlocks lockers
  • +
  • Magic Missile has a slightly longer cooldown and no longer deals damage, but has a lower cooldown is upgraded
  • +
+

KasparoVy updated:

+
    +
  • Navy blue Centcom Officer's beret for use by the Blueshield.
  • +
  • Adds the new navy blue beret to the Blueshield's locker.
  • +
  • Gives the Blueshield's berets (black and navy blue) the exact same strip delay and armour as the Security Officer's beret.
  • +
  • Adds TG energy katana back and belt sprite.
  • +
  • Bo staff back sprite.
  • +
  • Adjusts energy katana sprites to make the weapon stand out a bit more from the regular katana.
  • +
  • Cutting open the toes of footwear so species with feet-claws can wear them.
  • +
  • Toeless jackboots.
  • +
  • Cleans up glovesnipping and lighting a match with a shoe.
  • +
  • Lighting a match with a shoe produces a more appropriate message, handled at the same standard as glove-snippingboot-cutting.
  • +
+

Tastyfish updated:

+
    +
  • Cargonia now has its own section in the manifest.
  • +
+

TheDZD updated:

+
    +
  • Due to budget cuts and reports of operatives accidentally firing enough bullets to reach a state of what our scientists refer to as "enough dakka," Syndicate High Command has decided to restore the Syndicate Strike Team arsenal to using standard-issue L6 SAW ammunition.
  • +
+ +

24 January 2016

+

KasparoVy updated:

+
    +
  • Fixes markings overlaying underwear.
  • +
  • Nude icon in underwear.dmi
  • +
  • Fixes Vox robes not using the correct on-mob sprites.
  • +
  • Fixes unreported bug where there was a slim chance during character preview icon generation that a character with Security Officer set to high would get rendered with either the wrong beret sprite or no beret sprite at all.
  • +
  • Fixes an issue where Sigholt's fluff beret wasn't using the correct sprites.
  • +
+

Tastyfish updated:

+
    +
  • Passively power-consuming borg modules, such as the peacekeeper movement and shield module, won't spam the user infinitely if they're low on power anymore.
  • +
+ +

23 January 2016

+

Fox McCloud updated:

+
    +
  • Removes Vampire HUD
  • +
  • moves the Vampire blood counter to a more easy to see location
  • +
  • Adds in a Changeling chemical counter display
  • +
  • Adds in a Changeling sting counter display
  • +
  • Vampire total blood and usable blood will now appear under status
  • +
  • Changes vampire blood display to be similar to ling chemical counter
  • +
  • Fixes unnecessary toxin damage being dealt on severe bloodloss
  • +
  • Fixes human mobs not receiving proper random names
  • +
  • Adds in knight armor
  • +
  • Grants the chaplain a set of crusader knight armor
  • +
  • Adds in cult-resistant ERT paranormal space suit
  • +
  • Allows the Chaplain to convert his null rod into a holy sword with crusader knight armor
  • +
  • Chaplain's closet is now a secure closet
  • +
  • Adds in Assault Gear crate to cargo
  • +
  • Adds in military assault belt
  • +
  • Adds in spaceworthy swat suits
  • +
  • tweaks bandolier to hold 2 additional shotgun shells
  • +
  • bartender starts off with +2 additional shells
  • +
  • Reduces the cost of the space suit crate and doubles its contents
  • +
  • Refactors knives so their behavior is more universal
  • +
  • Fixes Hulk not properly being removed when your health drops below a threshold
  • +
  • Fixes flickering vision in a mining mech
  • +
+

Tastyfish updated:

+
    +
  • Poly has taken a seminar on the latest trends in engine operations.
  • +
  • Player-controller parrots can now hear their headsets.
  • +
+

Tigerbat2000 updated:

+
    +
  • The nuclear disk escaping on the shuttle no longer counts as a syndicate minor victory.
  • +
  • Cultists can once again actually greentext the escape objective.
  • +
+ +

20 January 2016

+

DarkPyrolord updated:

+
    +
  • Adds in hardsuit sprites for Vulpkanin
  • +
+

FalseIncarnate updated:

+
    +
  • Allowed cheap lighters and individual matches to be put into cigarette packages at the cost of cigarette space.
  • +
  • Matches can now be lit and put out by striking the match on your shoes. Good for if you lose that matchbox, or want to just feel cool.
  • +
+

Fox McCloud updated:

+
    +
  • Fixes brute damage on weapons not knocking people down.
  • +
  • Tweaks implant behavior to be more consistent and unified.
  • +
  • Lowers the pAI cooldown from 60 seconds to 5 seconds.
  • +
  • Raw telecrystal can now be used to charge uplink implants.
  • +
  • Fixes being unable to holster the pulse pistol
  • +
  • Fixes being able to holster shotguns
  • +
+

KasparoVy updated:

+
    +
  • Improved shading on all Vulpkanin hardsuit tails.
  • +
  • Vulpkanin hardsuit helmet respriting (colour tweaks).
  • +
  • Vulpkanin hardsuit helmets with proper flashlight-on sprites.
  • +
+

Tastyfish updated:

+
    +
  • The ID computer Access Report printout now separates the access list with commas so it's actually readable.
  • +
  • The ID computer Access Report printout isn't blank if you don't have an authorization card in anymore.
  • +
  • In the supply ordering & shuttle consoles, one can now cancel an order at either the Reason or Amount input dialogs.
  • +
  • Table flipping uses correct sprites.
  • +
+

TheDZD updated:

+
    +
  • Adds world.Topic() handling so that users are notified in-game when pull requests are opened, closed, or merged on the Github repo.
  • +
+ +

18 January 2016

+

Crazylemon updated:

+
    +
  • New classes of shapeshifters have been sighted around the NSS Cyberiad...
  • +
  • Wizards now can't teleport to other antag spawn points.
  • +
  • Removes an extruding pixel from the left-facing IPC glider monitor sprite.
  • +
  • Ragin' Mages now spawn every 7 minutes, instead of 5. Admins can further adjust this by modifying the 'delay_per_mage' variable.
  • +
  • Ragin' Mages are now made with 100% less in-use souls (Apprentices won't have their consciousness yoinked).
  • +
  • It takes half an hour for the REAL chaos of ragin' mages to start, for at least a semblance of normality.
  • +
+

Dave The Headcrab updated:

+
    +
  • Adds the advanced energy revolver, toggles between taser and laser modes.
  • +
  • Removes the detective's revolver from the blueshield's locker.
  • +
  • Changes the taser the blueshield starts with into an advanced energy revolver.
  • +
+

Deanthelis updated:

+
    +
  • Added the ability for the Magnetic Gripper to pick up and place light tiles.
  • +
+

Fethas updated:

+
    +
  • Readds the hud icon showing up for master and servent
  • +
  • adds mindslave datum hud thingy based on TGs gang huds
  • +
+

Fox McCloud updated:

+
    +
  • Fixes not being able to add/remove Weapon Permit from IDs.
  • +
  • Fixes the energy sword being invisible in-hand when turned on.
  • +
  • Fixes the telebaton being invisible in-hand when extended.
  • +
  • Fixes eye-stabbing not having an attack animation or hitsound.
  • +
  • Fixes some kitchen utensils playing the wrong hit-sound and playing twice in some cases.
  • +
  • Fixes the butcher cleaver sprite being backwards.
  • +
  • Fixes the telebaton sprite being missing from the side.
  • +
  • Fixes the meat cleaver being invisible in-hand.
  • +
  • Corrects some grammatical descriptive errors for the elite syndicate hardsuit.
  • +
  • completely overhauls implants to TG's standards.
  • +
  • Adds storage implant.
  • +
  • Adds microbomb and macrobomb implants.
  • +
  • Adds in support for removing implants directly into cases.
  • +
  • Removes Bay style explosive implants.
  • +
  • Removes compressed matter implants.
  • +
  • Tweaks the uplink to reflect removal of the old implants and inclusion of the new.
  • +
  • Fixes/cuts down on the lag caused by monkey cubes.
  • +
+

Jey updated:

+
    +
  • Inflatable walls and door can now be deflated by altclicking them
  • +
  • Fixed lag from expanding multiple monkeycubes at once.
  • +
+

KasparoVy updated:

+
    +
  • Adds blank icons with standardized timings for species tail wagging, used in icon generation.
  • +
  • Fixes tails overlapping arms/limbs + gloves, etc. when facing EAST or WEST.
  • +
  • Ensures tails will overlap stuff as normal only when facing NORTH so as to avoid unwanted interference with the base sprite.
  • +
  • Tails now appear in ID cards, overlays things correctly.
  • +
  • Tails now overlay and are overlaid by things correctly in preview icons.
  • +
  • Modifies the positioning of tail icon generation in the ID card preview icon generation file.
  • +
  • Modifies the positioning of tail icon generation in the player preferences preview icon generation file.
  • +
  • Breaks limb generation into its own layer, breaks tail generation into a second layer that can be overlaid by limbs.
  • +
  • If the user's species is flagged to have a tail that is overlapped, TAIL_LAYER will now overlay the NORTH direction sprite of a tail now, while TAIL_UNDERLIMBS_LAYER gets all remaining directions. Otherwise icons are generated in the traditional manner.
  • +
  • Adjusts the Unathi right arm east direction and animated tail sprites, recolouring a random pixel and fixing a floating tail respectively.
  • +
  • Adjusts position of tail layer such that tails' north direction sprites will overlay backpacks (more importantly, satchel straps).
  • +
  • Accommodates admin-overrides to the body_accessory species check by setting the default animation template to Vulpkanin.
  • +
  • Adjusts north-direction Unathi static tail sprite, now attaches to the body in the correct location.
  • +
  • Adds some TG underwear.
  • +
  • Adds an NV science goggles worn sprite.
  • +
  • Ports Bay/TG berets.
  • +
  • Adjusts beret sprite, recolours strange orange pixels.
  • +
  • Adjusts NV science goggles object icon. Removed strange border and centered it.
  • +
  • Ports Polaris' PRs 761 and 778, brings over Ragnie's awesome Ward-Takahashi prosthetics.
  • +
+

Kyep updated:

+
    +
  • Changing level to gamma/delta/epsilon now displays a special gamma/delta/epsilon sprite on status monitors
  • +
  • Changing level to green/blue now clears the status monitors, so they no longer show higher alert levels after the level is changed
  • +
+

NTSAM updated:

+
    +
  • Added a rainbow IPC screen.
  • +
+

PPI updated:

+
    +
  • Modifies the effective time limit to activate the Nuclear Challenge as Nukeops from two minutes to seven minutes
  • +
+

Tastyfish updated:

+
    +
  • The QM now actually has a QM stamp instead of a fake one, as well as an approved and denied stamp.
  • +
  • New area named 'Genetics Maintenance' solidifying/relabelling the confusing area between the morge and Mech Bay as being fully maintenance again, but working correctly and with proper doors.
  • +
  • Fixed a few maintenance door names to be in parity to the rest of the station.
  • +
  • Added the ability to print the records photo of a crew member from a security records console. Useful for Wanted notices!
  • +
+

Tigercat2000 updated:

+
    +
  • You can no longer use the gibber for monkies.
  • +
  • Cleaned up gibber.dm styling.
  • +
  • The fire alarm now uses NanoUI, with color coded alert levels.
  • +
  • Upgraded NanoUI (again), fancy FontAwesome icons.
  • +
  • Didn't add any butts. Yet.
  • +
+ +

13 January 2016

+

Fox McCloud updated:

+
    +
  • Fixes Rezadone not clearing mutated organs.
  • +
  • Clone damage immunity removed from Slime People, Shadowlings, Golems, and Vox
  • +
  • Explosions will no longer destroy things underneath turfs until the turf is exposed.
  • +
  • fixes a runtime related to revolver spinning.
  • +
  • fixes server loading taking an abnormally long time.
  • +
+

Kyep updated:

+
    +
  • Blob, vine and virus outbreaks are now more clearly labeled as such, to avoid people confusing them with each other
  • +
+

Tastyfish updated:

+
    +
  • NT Rep fountain pens and magistrate gold pens can now write in 5 different colors. The IAA gets a cheap plastic equivalent.
  • +
+ +

11 January 2016

+

CrAzYPiLoT updated:

+
    +
  • Fixes the footsteps sounds to the fullest.
  • +
+

Crazylemon updated:

+
    +
  • Bomb guardians now automatically notify their master when they've set something to boom, so there's less accidental friendly fire
  • +
  • Bomb guardians are only notified that their trap failed, if it ACTUALLY FAILED.
  • +
  • Bomb guardians now are more aware of what is primed to explode.
  • +
  • Bomb guardian summoners can now defuse their guardian's bombs without harm.
  • +
  • Brought RAGIN' MAGES back up to function.
  • +
+

Dave The Headcrab updated:

+
    +
  • Added a new icon for the soy and cafe latte drinks. Icons courtesy of Full Of Skittles, resident overlord of art.
  • +
+

Fox McCloud updated:

+
    +
  • Re-arranges the armory and changes its contents minorly.
  • +
  • Adds in rubbershot ammo boxes.
  • +
  • Fixes Mutadone incurring a massive cost on the server.
  • +
  • Positronic brains can no longer speak binary.
  • +
  • Positronic brains can be prevented from speaking (or allowed) by toggling their speaker on/off.
  • +
  • IPC's positronic brains start off toggled off.
  • +
  • Fixes the supermatter announcement causing massive amounts of server lag.
  • +
  • Adds in tradable telecrystals.
  • +
+ +

08 January 2016

+

Crazylemon updated:

+
    +
  • Fully enables a system to allow species to have unique procs and verbs that come and go with the species.
  • +
  • IPCs lose their change monitor verb when changing species now. Gone are the days of recalling a past IPC life to perform self-barbery! Oh, woe is me!
  • +
  • Sleepers and Body Scanners will now reliably work when rotated
  • +
  • SSD humans should be asleep more reliably now.
  • +
+

Dave The Headcrab updated:

+
    +
  • Nerfs the damage the Detective's revolver does from 15 brute to 5 brute.
  • +
  • Adds a 300 round capacity buckshot magizine that fits into the L6 Saw.
  • +
  • Adds a 25 round capacity 40mm HE magizine that fits into the L6 Saw.
  • +
  • Adds the 'Devastator' L6 SAW, starts off loaded with the buckshot magizine.
  • +
  • Gives the SST the 'Devastator' L6 Saw, and one of each mag type in their bag.
  • +
+

FalseIncarnate updated:

+
    +
  • Plants will now begin to die over time if their age exceeds 5 times their TRAIT_MATURATION value.
  • +
  • Weed growth chance per process in trays has been slightly increased (Previously: 5% chance if no seed, 1% otherwise;Now: 6% / 3%).
  • +
  • Pest growth in trays has been slightly buffed. (Previously: 3% chance to increase by 0.1; Now: 5% chance to increase by 0.5)
  • +
+

Fethas updated:

+
    +
  • Due to Archmage Steve leaving the nya-cromantic stone near the microwave, the true power of the stone has been unleashed. Subjects of the stone are not only ressurected ... but resurrected as catgirls ... We fired steve.
  • +
+

Fox McCloud updated:

+
    +
  • fixes a bug relating to some brute/burn damage being dealt to human mobs.
  • +
  • Adds in overloading APCs, causing them to arc electricity to mobs in range.
  • +
  • Makes Engineering related APCs overload proof.
  • +
  • Implements the timestop spell.
  • +
  • Implements new sepia slime reaction which halts time in an AoE.
  • +
  • sentience potions no longer can make slimes sentient.
  • +
  • Removes Hulk instant stun.
  • +
  • Hulk damage increased.
  • +
  • Hulk wears off at a lower health threshold.
  • +
  • Fixes strange reagent not working on simple animals.
  • +
  • Reduces the amount shock damage and bounces for the Tesla engine.
  • +
  • Fixes Syndicate Cyborg's LMG being invisible.
  • +
  • Fixes the uplink kit having implanters that were both nameless and looked as if they had been used.
  • +
+

KasparoVy updated:

+
    +
  • Added the security gasmask, sexy mime mask, bandanas, balaclava, welding gas mask and wrestling masks for Vox. Added adjusted-state sprites for the Vox breath, medical, and surgical masks.
  • +
  • Removed a duplicate of the human balaclava sprite.
  • +
  • Modifies the Vox plague-doctor, fake moustache, sterile and medical mask sprites to fit the Vox anatomy and animates the Vox SWAT mask. Corrects the names of some Vox mask adjusted-state sprites.
  • +
+

Tastyfish updated:

+
    +
  • Fixed the pronouns in a few verbs and the door to 'Interrogation Observervtion'.
  • +
+

Tigercat2000 updated:

+
    +
  • Added 96x96 (3x) res option to icons menu
  • +
+ +

06 January 2016

+

Certhic updated:

+
    +
  • Corrected some air alarms so that atmos computer can access them
  • +
  • Bodyscanner now sees mechanical parts in internal organs
  • +
+

Crazylemon64 updated:

+
    +
  • Sleeping simple animals should tick down sleeping as normal - deaf simple mobs are no longer a thing
  • +
+

Tastyfish updated:

+
    +
  • Instruments now use NanoUI.
  • +
  • Corrected the blueshield mission briefing.
  • +
+ +

03 January 2016

+

TheDZD updated:

+
    +
  • Ports over changelog system from /tg/station.
  • +
+
+ +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 627ffd6b9d7..4775ba05121 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -1,1261 +1,1299 @@ -DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. ---- -2016-01-03: - TheDZD: - - rscadd: Ports over changelog system from /tg/station. -2016-01-06: - Certhic: - - bugfix: Corrected some air alarms so that atmos computer can access them - - bugfix: Bodyscanner now sees mechanical parts in internal organs - Crazylemon64: - - bugfix: Sleeping simple animals should tick down sleeping as normal - deaf simple - mobs are no longer a thing - Tastyfish: - - tweak: Instruments now use NanoUI. - - spellcheck: Corrected the blueshield mission briefing. -2016-01-08: - Crazylemon: - - rscadd: Fully enables a system to allow species to have unique procs and verbs - that come and go with the species. - - rscdel: IPCs lose their change monitor verb when changing species now. Gone are - the days of recalling a past IPC life to perform self-barbery! Oh, woe is me! - - bugfix: Sleepers and Body Scanners will now reliably work when rotated - - bugfix: SSD humans should be asleep more reliably now. - Dave The Headcrab: - - tweak: Nerfs the damage the Detective's revolver does from 15 brute to 5 brute. - - rscadd: Adds a 300 round capacity buckshot magizine that fits into the L6 Saw. - - rscadd: Adds a 25 round capacity 40mm HE magizine that fits into the L6 Saw. - - rscadd: Adds the 'Devastator' L6 SAW, starts off loaded with the buckshot magizine. - - rscadd: Gives the SST the 'Devastator' L6 Saw, and one of each mag type in their - bag. - FalseIncarnate: - - rscadd: Plants will now begin to die over time if their age exceeds 5 times their - TRAIT_MATURATION value. - - tweak: 'Weed growth chance per process in trays has been slightly increased (Previously: - 5% chance if no seed, 1% otherwise;Now: 6% / 3%).' - - tweak: 'Pest growth in trays has been slightly buffed. (Previously: 3% chance - to increase by 0.1; Now: 5% chance to increase by 0.5)' - Fethas: - - rscadd: Due to Archmage Steve leaving the nya-cromantic stone near the microwave, - the true power of the stone has been unleashed. Subjects of the stone are not - only ressurected ... but resurrected as catgirls ... We fired steve. - Fox McCloud: - - bugfix: fixes a bug relating to some brute/burn damage being dealt to human mobs. - - rscadd: Adds in overloading APCs, causing them to arc electricity to mobs in range. - - tweak: Makes Engineering related APCs overload proof. - - rscadd: Implements the timestop spell. - - rscadd: Implements new sepia slime reaction which halts time in an AoE. - - tweak: sentience potions no longer can make slimes sentient. - - tweak: Removes Hulk instant stun. - - tweak: Hulk damage increased. - - tweak: Hulk wears off at a lower health threshold. - - bugfix: Fixes strange reagent not working on simple animals. - - tweak: Reduces the amount shock damage and bounces for the Tesla engine. - - bugfix: Fixes Syndicate Cyborg's LMG being invisible. - - bugfix: Fixes the uplink kit having implanters that were both nameless and looked - as if they had been used. - KasparoVy: - - rscadd: Added the security gasmask, sexy mime mask, bandanas, balaclava, welding - gas mask and wrestling masks for Vox. Added adjusted-state sprites for the Vox - breath, medical, and surgical masks. - - rscdel: Removed a duplicate of the human balaclava sprite. - - tweak: Modifies the Vox plague-doctor, fake moustache, sterile and medical mask - sprites to fit the Vox anatomy and animates the Vox SWAT mask. Corrects the - names of some Vox mask adjusted-state sprites. - Tastyfish: - - spellcheck: Fixed the pronouns in a few verbs and the door to 'Interrogation Observervtion'. - Tigercat2000: - - rscadd: Added 96x96 (3x) res option to icons menu -2016-01-11: - CrAzYPiLoT: - - bugfix: Fixes the footsteps sounds to the fullest. - Crazylemon: - - rscadd: Bomb guardians now automatically notify their master when they've set - something to boom, so there's less accidental friendly fire - - bugfix: Bomb guardians are only notified that their trap failed, if it ACTUALLY - FAILED. - - rscadd: Bomb guardians now are more aware of what is primed to explode. - - rscadd: Bomb guardian summoners can now defuse their guardian's bombs without - harm. - - rscadd: Brought RAGIN' MAGES back up to function. - Dave The Headcrab: - - rscadd: Added a new icon for the soy and cafe latte drinks. Icons courtesy of - Full Of Skittles, resident overlord of art. - Fox McCloud: - - rscadd: Re-arranges the armory and changes its contents minorly. - - rscadd: Adds in rubbershot ammo boxes. - - bugfix: Fixes Mutadone incurring a massive cost on the server. - - tweak: Positronic brains can no longer speak binary. - - tweak: Positronic brains can be prevented from speaking (or allowed) by toggling - their speaker on/off. - - tweak: IPC's positronic brains start off toggled off. - - bugfix: Fixes the supermatter announcement causing massive amounts of server lag. - - rscadd: Adds in tradable telecrystals. -2016-01-13: - Fox McCloud: - - bugfix: Fixes Rezadone not clearing mutated organs. - - tweak: Clone damage immunity removed from Slime People, Shadowlings, Golems, and - Vox - - tweak: Explosions will no longer destroy things underneath turfs until the turf - is exposed. - - bugfix: fixes a runtime related to revolver spinning. - - bugfix: fixes server loading taking an abnormally long time. - Kyep: - - rscadd: Blob, vine and virus outbreaks are now more clearly labeled as such, to - avoid people confusing them with each other - Tastyfish: - - tweak: NT Rep fountain pens and magistrate gold pens can now write in 5 different - colors. The IAA gets a cheap plastic equivalent. -2016-01-18: - Crazylemon: - - rscadd: New classes of shapeshifters have been sighted around the NSS Cyberiad... - - bugfix: Wizards now can't teleport to other antag spawn points. - - bugfix: Removes an extruding pixel from the left-facing IPC glider monitor sprite. - - tweak: Ragin' Mages now spawn every 7 minutes, instead of 5. Admins can further - adjust this by modifying the 'delay_per_mage' variable. - - bugfix: Ragin' Mages are now made with 100% less in-use souls (Apprentices won't - have their consciousness yoinked). - - tweak: It takes half an hour for the REAL chaos of ragin' mages to start, for - at least a semblance of normality. - Dave The Headcrab: - - rscadd: Adds the advanced energy revolver, toggles between taser and laser modes. - - rscdel: Removes the detective's revolver from the blueshield's locker. - - tweak: Changes the taser the blueshield starts with into an advanced energy revolver. - Deanthelis: - - rscadd: Added the ability for the Magnetic Gripper to pick up and place light - tiles. - Fethas: - - bugfix: Readds the hud icon showing up for master and servent - - rscadd: adds mindslave datum hud thingy based on TGs gang huds - Fox McCloud: - - bugfix: Fixes not being able to add/remove Weapon Permit from IDs. - - bugfix: Fixes the energy sword being invisible in-hand when turned on. - - bugfix: Fixes the telebaton being invisible in-hand when extended. - - bugfix: Fixes eye-stabbing not having an attack animation or hitsound. - - bugfix: Fixes some kitchen utensils playing the wrong hit-sound and playing twice - in some cases. - - bugfix: Fixes the butcher cleaver sprite being backwards. - - bugfix: Fixes the telebaton sprite being missing from the side. - - bugfix: Fixes the meat cleaver being invisible in-hand. - - spellcheck: Corrects some grammatical descriptive errors for the elite syndicate - hardsuit. - - rscadd: completely overhauls implants to TG's standards. - - rscadd: Adds storage implant. - - rscadd: Adds microbomb and macrobomb implants. - - rscadd: Adds in support for removing implants directly into cases. - - rscdel: Removes Bay style explosive implants. - - rscdel: Removes compressed matter implants. - - tweak: Tweaks the uplink to reflect removal of the old implants and inclusion - of the new. - - bugfix: Fixes/cuts down on the lag caused by monkey cubes. - Jey: - - tweak: Inflatable walls and door can now be deflated by altclicking them - - bugfix: Fixed lag from expanding multiple monkeycubes at once. - KasparoVy: - - imageadd: Adds blank icons with standardized timings for species tail wagging, - used in icon generation. - - bugfix: Fixes tails overlapping arms/limbs + gloves, etc. when facing EAST or - WEST. - - bugfix: Ensures tails will overlap stuff as normal only when facing NORTH so as - to avoid unwanted interference with the base sprite. - - bugfix: Tails now appear in ID cards, overlays things correctly. - - bugfix: Tails now overlay and are overlaid by things correctly in preview icons. - - tweak: Modifies the positioning of tail icon generation in the ID card preview - icon generation file. - - tweak: Modifies the positioning of tail icon generation in the player preferences - preview icon generation file. - - tweak: Breaks limb generation into its own layer, breaks tail generation into - a second layer that can be overlaid by limbs. - - tweak: If the user's species is flagged to have a tail that is overlapped, TAIL_LAYER - will now overlay the NORTH direction sprite of a tail now, while TAIL_UNDERLIMBS_LAYER - gets all remaining directions. Otherwise icons are generated in the traditional - manner. - - tweak: Adjusts the Unathi right arm east direction and animated tail sprites, - recolouring a random pixel and fixing a floating tail respectively. - - tweak: Adjusts position of tail layer such that tails' north direction sprites - will overlay backpacks (more importantly, satchel straps). - - tweak: Accommodates admin-overrides to the body_accessory species check by setting - the default animation template to Vulpkanin. - - tweak: Adjusts north-direction Unathi static tail sprite, now attaches to the - body in the correct location. - - rscadd: Adds some TG underwear. - - rscadd: Adds an NV science goggles worn sprite. - - rscadd: Ports Bay/TG berets. - - tweak: Adjusts beret sprite, recolours strange orange pixels. - - tweak: Adjusts NV science goggles object icon. Removed strange border and centered - it. - - rscadd: Ports Polaris' PRs 761 and 778, brings over Ragnie's awesome Ward-Takahashi - prosthetics. - Kyep: - - rscadd: Changing level to gamma/delta/epsilon now displays a special gamma/delta/epsilon - sprite on status monitors - - bugfix: Changing level to green/blue now clears the status monitors, so they no - longer show higher alert levels after the level is changed - NTSAM: - - rscadd: Added a rainbow IPC screen. - PPI: - - tweak: Modifies the effective time limit to activate the Nuclear Challenge as - Nukeops from two minutes to seven minutes - Tastyfish: - - rscadd: The QM now actually has a QM stamp instead of a fake one, as well as an - approved and denied stamp. - - rscadd: New area named 'Genetics Maintenance' solidifying/relabelling the confusing - area between the morge and Mech Bay as being fully maintenance again, but working - correctly and with proper doors. - - spellcheck: Fixed a few maintenance door names to be in parity to the rest of - the station. - - rscadd: Added the ability to print the records photo of a crew member from a security - records console. Useful for Wanted notices! - Tigercat2000: - - rscdel: You can no longer use the gibber for monkies. - - spellcheck: Cleaned up gibber.dm styling. - - rscadd: The fire alarm now uses NanoUI, with color coded alert levels. - - tweak: Upgraded NanoUI (again), fancy FontAwesome icons. - - wip: Didn't add any butts. Yet. -2016-01-20: - DarkPyrolord: - - rscadd: Adds in hardsuit sprites for Vulpkanin - FalseIncarnate: - - rscadd: Allowed cheap lighters and individual matches to be put into cigarette - packages at the cost of cigarette space. - - rscadd: Matches can now be lit and put out by striking the match on your shoes. - Good for if you lose that matchbox, or want to just feel cool. - Fox McCloud: - - bugfix: Fixes brute damage on weapons not knocking people down. - - tweaks: Tweaks implant behavior to be more consistent and unified. - - tweak: Lowers the pAI cooldown from 60 seconds to 5 seconds. - - rscadd: Raw telecrystal can now be used to charge uplink implants. - - bugfix: Fixes being unable to holster the pulse pistol - - bugfix: Fixes being able to holster shotguns - KasparoVy: - - tweak: Improved shading on all Vulpkanin hardsuit tails. - - tweak: Vulpkanin hardsuit helmet respriting (colour tweaks). - - rscadd: Vulpkanin hardsuit helmets with proper flashlight-on sprites. - Tastyfish: - - tweak: The ID computer Access Report printout now separates the access list with - commas so it's actually readable. - - bugfix: The ID computer Access Report printout isn't blank if you don't have an - authorization card in anymore. - - rscadd: In the supply ordering & shuttle consoles, one can now cancel an order - at either the Reason or Amount input dialogs. - - bugfix: Table flipping uses correct sprites. - TheDZD: - - rscadd: Adds world.Topic() handling so that users are notified in-game when pull - requests are opened, closed, or merged on the Github repo. -2016-01-23: - Fox McCloud: - - rscdel: Removes Vampire HUD - - tweak: moves the Vampire blood counter to a more easy to see location - - rscadd: Adds in a Changeling chemical counter display - - rscadd: Adds in a Changeling sting counter display - - rscadd: Vampire total blood and usable blood will now appear under status - - tweak: Changes vampire blood display to be similar to ling chemical counter - - bugfix: Fixes unnecessary toxin damage being dealt on severe bloodloss - - bugfix: Fixes human mobs not receiving proper random names - - rscadd: Adds in knight armor - - rscadd: Grants the chaplain a set of crusader knight armor - - rscadd: Adds in cult-resistant ERT paranormal space suit - - rscadd: Allows the Chaplain to convert his null rod into a holy sword with crusader - knight armor - - tweak: Chaplain's closet is now a secure closet - - rscadd: Adds in Assault Gear crate to cargo - - rscadd: Adds in military assault belt - - rcsadd: Adds in spaceworthy swat suits - - tweak: tweaks bandolier to hold 2 additional shotgun shells - - tweak: bartender starts off with +2 additional shells - - tweak: Reduces the cost of the space suit crate and doubles its contents - - rscadd: Refactors knives so their behavior is more universal - - bugfix: Fixes Hulk not properly being removed when your health drops below a threshold - - bugfix: Fixes flickering vision in a mining mech - Tastyfish: - - rscadd: Poly has taken a seminar on the latest trends in engine operations. - - rscadd: Player-controller parrots can now hear their headsets. - Tigerbat2000: - - bugfix: The nuclear disk escaping on the shuttle no longer counts as a syndicate - minor victory. - - bugfix: Cultists can once again actually greentext the escape objective. -2016-01-24: - KasparoVy: - - bugfix: Fixes markings overlaying underwear. - - rscadd: Nude icon in underwear.dmi - - bugfix: Fixes Vox robes not using the correct on-mob sprites. - - bugfix: Fixes unreported bug where there was a slim chance during character preview - icon generation that a character with Security Officer set to high would get - rendered with either the wrong beret sprite or no beret sprite at all. - - bugfix: Fixes an issue where Sigholt's fluff beret wasn't using the correct sprites. - Tastyfish: - - bugfix: Passively power-consuming borg modules, such as the peacekeeper movement - and shield module, won't spam the user infinitely if they're low on power anymore. -2016-01-29: - Crazylemon: - - bugfix: 'The DNA scanner has now undergone a seminar to recognize fake identities; - It will now scan the actual person''s identity, rather than their disguise (read: - wearing a mask with or without someone else''s ID).' - - rscadd: Matter eater now allows you to eat humans as if you were fat. - - tweak: Eating mobs with an aggressive grab now generates attack logs. - Crazylemon64: - - bugfix: For a short while, there was a clerical error where all AI communications - equipment was replaced with bananas. This has now been fixed. - - tweak: Ghosts can now see the contents of smartfridges and look at the drone console - - tweak: Humans now only produce one message when shaken while SSD - - bugfix: The supermatter no longer will irradiate everyone, everywhere, when it - explodes. - - tweak: Writing on paper will now add hidden admin fingerprints, so that you can't - forge mean notes in someone else's name. - - bugfix: Brains are no longer able to escape their brain by being a sorcerer. - - bugfix: Astral projecting with other runes on the same tile will now no longer - prevent you from re-entering - - bugfix: Voxxy that is become ex-voxxy no longer carry voxxy appearance! yaya! - FalseIncarnate: - - tweak: Allows plants to be identified as enhanced*. Enhancing plants results from - using reagents (like saltpetre) that affect the stats of a seed instead of using - mutagens/machines. *May not meet standards for being classified as "organic - produce". (This was already possible, just renames enhanced plants for easier - differentiation) - Fox McCloud: - - bugfix: Fixes mutadone not working with some genetic mutations - - bugfix: Fixes banana honk and silencer being alcoholic - - bugfix: Fixes Kahlua being non-alcoholic - - bugfix: Fixes polonium not metabolizing - - bugfix: Fixes being able to receive free unlimited boxes from the Merchandise - store - - rscadd: Adds in wooden bucklers - - tweak: Re-adds roman shield to the costume vendor - - tweak: Buffs Riot shield damage from 8 to 10 - - rscadd: Adds in a Skeleton race - - tweak: Tweaks the skeletons colors to be more realistic and to blend in less with - the floor - - rscadd: Adds in lichdom spell for the wizard - - rscadd: Adds in lesser summon guns spell for wizard - - rscadd: adds in Mjolnir and the singularity hammer as weapons the wizard can purchase - - rscadd: Wizard can purchase the charge spell from the spell book - - rscadd: Wizard can purchase a healing staff from the spell book - - tweak: Tweaks and lowers spell costs of utility spells for wizard - - tweak: Re-organizes the spellbook to be better divided into categories and have - a better window size - - tweak: Knock now opens+unlocks lockers - - tweak: Magic Missile has a slightly longer cooldown and no longer deals damage, - but has a lower cooldown is upgraded - KasparoVy: - - rscadd: Navy blue Centcom Officer's beret for use by the Blueshield. - - rscadd: Adds the new navy blue beret to the Blueshield's locker. - - tweak: Gives the Blueshield's berets (black and navy blue) the exact same strip - delay and armour as the Security Officer's beret. - - rscadd: Adds TG energy katana back and belt sprite. - - rscadd: Bo staff back sprite. - - tweak: Adjusts energy katana sprites to make the weapon stand out a bit more from - the regular katana. - - rscadd: Cutting open the toes of footwear so species with feet-claws can wear - them. - - rscadd: Toeless jackboots. - - tweak: Cleans up glovesnipping and lighting a match with a shoe. - - tweak: Lighting a match with a shoe produces a more appropriate message, handled - at the same standard as glove-snippingboot-cutting. - Tastyfish: - - rscadd: Cargonia now has its own section in the manifest. - TheDZD: - - rscdel: Due to budget cuts and reports of operatives accidentally firing enough - bullets to reach a state of what our scientists refer to as "enough dakka," - Syndicate High Command has decided to restore the Syndicate Strike Team arsenal - to using standard-issue L6 SAW ammunition. -2016-01-31: - Crazylemon64: - - bugfix: Syndicate borgs can now interact with station machinery - - rscadd: People with slime people limbs can now *squish - - tweak: Skrell's vulnerability to alcohol is checked on their liver, now - a liver - transplant will let them take alcohol like a champ - lacking a liver will have - the same effect as being a skrell, when drinking - FalseIncarnate: - - rscadd: Adds in the Magic Eight Ball toy, found in Claw Game prize orbs. - - rscadd: Adds in the Magic Conch Shell, an admin-only shell of power. - Fox McCloud: - - rscadd: Updates Summon Guns and Magic to include many of the new guns - - tweak: Summon Guns/Magic can no longer be used during Ragin' Mages - Tastyfish: - - rscadd: The emergency shuttle status in the Status tab now has ETA/ETD/etc like - before. - - tweak: Code Gamma+ now has a 5 minute emergency shuttle call, like Red. - pinatacolada: - - rscadd: Adds NanoUI to the operating computer - - rscadd: Adds health announcing, critical and oxygen damage aural alerts to the - computer, with a menu to selectively turn them on and off -2016-02-10: - Crazylemon64: - - tweak: The cloner now checks for NO_SCAN on the brain when scanning - unclonable - species are now truly unclonable. You are still able to revive them with a brain - transplant and a defib, however. - - rscadd: A tier-4 DNA scanner linked to a cloning system will now be able to reproduce - a body from a brain's DNA, in event of the original corpse being gibbed or similar. - - bugfix: Species with organic limbs and NO_BLOOD will no longer bleed (though still - on hit - write that off as "bone powder") - - tweak: Skeletons now lack internal organs, except for the runic mind which exists - in their head - an analogue for the brain - - rscadd: Skeletons that drink milk will be regenerated at a moderate pace, have - a small chance of mending bones, and will praise the great name of mr skeltal - - tweak: Adds a reagent system for species reacting to specific reagents - - rscadd: Slime People can now select from all human hairstyles, and their "hair" - will be tinted a shade of their body. - - tweak: Increases the frequency of the cortical borer event. - - tweak: People with borers cannot commit suicide - this applies to a controlling - borer, too. - - tweak: Borers can no longer overdose their hosts. - - tweak: Borers can now inject Saline-Glucose, Spaceacillin, Hydrocodone, Mitocholide, - Salbutamol, Capulettium+, and Charcoal. Styptic was removed, as it's pathetic - at healing when directly injected. Salicyclic acid was removed too, as its functionality - is duplicated by both hydrocodone and saline-glucose. - - bugfix: A mind trapped by a cortical borer can now understand things it could - understand when normally in its body. - - rscadd: Changes chemistry's welding tank to a wall-mounted version, to increase - the room available. - - rscadd: You can now gib butterflies and lizards with a knife - - rscadd: Ghosts can now follow mecha - - bugfix: You can now access an R&D console by emagging it - it did nothing before. - - bugfix: Walls will now properly smooth and show damage. - - bugfix: Fixes the dialog that occurs when the AI shuts off to actually do what - it says it does - Fox McCloud: - - bugfix: Fixes not being able to attach IEDs to beartraps - - bugfix: Can no longer spamclick someone to death using headslamming on a toilet/urimal - - tweak: Toilet/urinal headslamming now plays a sound - - tweak: Toilet headslamming damage reduced slightly - - rscadd: Can now fill open reagent containers in a toilet to receive "toilet water". - - tweak: No more message spam when someone fills a container using a sink - - rscadd: Can now wash your face using a sink, which washes away lipstick and wakes - you up slightly - - tweak: Washing things will now use progress bars - - tweak: Ensures consuming a single syndicate donk pocket won't get you addicted - to meth - - tweak: Kinetic Accelerators and E-bows automatically reload - Glorken: - - rscadd: Added a Knight Arena for Holodeck. - - imageadd: Added red and blue claymore sprites. - - spellcheck: Changed overrided to overrode when emagging Holodeck computer. - KasparoVy: - - rscadd: Vox versions of the Officer SWAT sechailer + HOS SWAT sechailer + Warden - SWAT sechailer. - - rscadd: Resprited versions of most Human masks to fit Unathi, Tajara and Vulpkanin. - - rscadd: Warden now gets their own version of the SWAT sechailer in their locker. - - tweak: HOS now gets the appropriate version of the SWAT sechailer in their locker. - - tweak: Repositioned smokeables now available for Vox, Unathi, Tajara and Vulpkanin. - - tweak: Properly shades Vox bandana down-state sprites. - - rscadd: Readds Tajaran bald hairstyle. - - rscadd: Alternate style of non-Human breath mask (incl. surgical/sterile mask) - down-state positioning. - - tweak: Corrects all non-Human species' breath mask (incl. surgical/sterile mask) - down-state icons to use the right position style. - - tweak: Minor adjustments to Tajaran breath mask up-state sprites. - PPI: - - rscadd: Adds a reconnect button to the File menu in the client. - - rscadd: Adds head patting - Regen: - - tweak: Powersink can now drain a lot more power before going boom - - tweak: Buffed the powersinks drain rate - - tweak: Buffed explosion from an overloaded powersink, try to find it instead of - overloading the grid. - - rscadd: Admin log warning before the powersink explodes - Spacemanspark: - - rscadd: Miners can now utilize the power of mob capsules to take along their lazarus - injected mining creatures! - - rscadd: Store your Pokemo- er, sorry, I mean mining mobs that you've captured - in the lazarus capsule belt. - Tastyfish: - - bugfix: Species that don't breathe can kill themselves now! - - rscadd: Suicide messages are now catered to your species. - - tweak: Shortened the default pill & patch name when using the ChemMaster. - - rscadd: The chaplain now has a service radio headset, as Space Jesus intended. - TheDZD: - - tweak: When Ahelping, "Question" is now "Mentorhelp" and "Player Complaint" is - now "Adminhelp." - - tweak: Mentorhelps and PM replies from mentors appear in a bold aqua blue color. - - tweak: Adminhelps and PM replies from admins appear in a bold bright red color. - - tweak: PM replies from players appear in a dull/dark purple color. - - rscadd: Adds admin attack log to players being converted to cult. - - rscadd: Adds shadowling thrall jobbans. - - rscadd: Jobbanned players who are converted to shadowling thrall, revolutionary, - or cultist will have the control of their body offered up to eligible ghosts. -2016-02-13: - Crazylemon64: - - tweak: Relaxes the check on what atoms you can follow to any movable atom - - tweak: Mages are now more ragin - - tweak: Admins can now adjust the total number of wizards at runtime by tweaking - either max_mages, or players_per mage - DaveTheHeadcrab: - - rscadd: Adds new worn icons for duffelbags to better reflect their size, compliments - of WJohn at /tg/ - FalseIncarnate: - - rscadd: Adds burritos, made from cutlets, beans, rice, capsacin oil (hotsauce), - cheese, and flat dough (because we lack proper tortillas) in the microwave. - - rscadd: Adds chimichangas. You know you want a deep-fried burrito. - Fox McCloud: - - tweak: Updates some spell icons with better/higher quality icons - - tweak: Updates unarmed attacks to allow for more customization - - tweak: Updates martial arts so they factor in specie's attack messages and sounds - - tweak: Re-balances Sleeping Carp fighting style - - tweak: Re-balances Bo Staff - - tweak: 'Rebalances Golem: they should now be spaceproof, fire+cold proof, rad - proof, virus immune, clonable, parapen+syringe gun immune, deal increased melee - damage. Their armor has been reduced to 55 melee across the board, their slip - immunity removed, pain immunity removed, and they''re slightly slower' - - bugfix: Fixes Ei Nath generating two brains - - bugfix: Ensures the Necromatic Stone generates actual skeletons - - bugfix: Can now strip PDA/IDs from Golems - - bugfix: Fixes sleeping carp grab not being an instant aggressive grab - - bugfix: Fixes an exploit with declaring war on the station - KasparoVy: - - rscadd: Orange and purple bandanas for all station species. - - rscadd: The ability to colour bandanas with a crayon in a washing machine. - - tweak: Refactors the bandana adjustment system. - - tweak: Minor adjustments to Tajaran and Unathi bandana east/west sprites. - - tweak: Adjusting a bandana will now take if off of your head/face and put it in - an available hand. If both hands are available, it goes in the selected hand. - - bugfix: Adjusting a coloured bandana will no longer revert it to the original - coloured icons anymore. - - bugfix: Adjusting a bandana from mask-style to hat-style means the bandana won't - obscure your identity anymore. - - rscadd: Greys now use re-positioned smokeables. They no longer smoke out the eyes. - TheDZD: - - bugfix: Fixes spacepods being able to shoot through walls. - - tweak: Lowers spacepod weapons fire delay. - - tweak: Increases spacepod weapons energy costs. - - tweak: Makes spacepods move at speeds not rivaling those of photon beams. They - are now a hair bit faster than a person with a jetpack. - - tweak: Reduces battery costs for spacepod movement. -2016-02-24: - Crazylemon64: - - tweak: The defib should be more reliable on people who have ghosted - - tweak: The defib will now give a message if the ghost is still haunting about - - rscadd: Attacking someone with an accessory will now let you put things on them - without having to strip them. - - bugfix: Borers will now properly detach upon death of a mob they are controlling - - tweak: Borers can now see their chemical count while in control of a mob - - rscadd: Borers can now silently communicate with their host - this is not available - to the host until the borer has either begun to communicate, or has taken control - at least once - this is to avoid spoiling that the borer exists - - tweak: Borers won't be able to talk out loud inside of a host, by default - they - can remove this safeguard with a verb under their borer tab. Borer hivespeak - is unaffected. - - tweak: Borers infesting and hiding are now silent. - - tweak: Made borer's chem lists more nicely formatted - - bugfix: No more superspeed attacking simplemobs - - tweak: New players now show up properly under the "who" verb when used as an admin - - rscadd: Mining drones will now automatically collect sand lying around - - bugfix: RIPLEYs can now drill asteroid turfs for sand - - rscadd: You can now load exosuit fuel generators with items containing their material - - this means you can fuel yourself off of ores, but this will be highly inefficient - and cost you mining points later on, as you can't take fuel back out. - - rscadd: You can now load the fuel generators from an ore box. - - tweak: The plasma generator now produces 3x as much power from the same amount - of fuel - this lets it even remotely compete with the uranium generator. - - tweak: You can now light cigarettes off of burning mobs. - - tweak: Exosuit tracking beacons now fit in boxes - prior, they were far too large - for even a backpack, as they shared the same size as all other mecha equipment - - tweak: Miners can now collect ore by walking over it with an ore satchel on. - FalseIncarnate: - - rscadd: Adds prize tickets as a replacement for physical arcade prizes. - - rscadd: Adds a buildable prize counter to exchange tickets for prizes. - - rscadd: Adds a bike. Despite what Prof. Oak might claim, you can ride it indoors. - - rscadd: Adds colorful wallets, for that old school arcade pride. - - bugfix: Fixes accidental removal of plump helmet biscuit recipe. - - rscadd: Temporarily adds a prize counter to the bar (Cyberiad) or dorms (MetaStation), - and adds a max upgrade one to the Ninja Holding Area (Cyberiad z2) - - bugfix: Fixes Metastation. Seriously fixed a lot, just read the PR description - for the full list. - FlattestGuitar: - - rscadd: Adds IPC alcohol and a few derivative drinks - - tweak: IPCs can now drink and be fed from glasses - Fox McCloud: - - tweak: Laser eyes mutation no longer drains nutrition - - tweak: 'splits the EMP kit into two things: the standard EMP kit (2 grenades and - an implant), and the EMP flashlight by itself' - - tweak: nerfs heart attacks so they do less damage - - tweak: Pickpocket gloves now put the item you strip into your hands as opposed - to the floor - - tweak: Picketpocket gloves can now silently strip accessories - - tweak: Pickpocket gloves will no longer give a message for messing up a pickpocket - KasparoVy: - - bugfix: Adjusting masks while they are not on the face will no longer turn off - internals. - - bugfix: Adjusting masks while they are not on the face will now cause the mask - to hide/reveal the wearer's identity the next time it's worn as intended. - - rscadd: Adds the ability to open/close bomber jackets. - - rscadd: Adds a security bomber jacket. This jacket inherits the protection and - storage capabilities as a standard Security vest with additional bomber jacket - benefits. - - rscadd: Adds UI button in top left of screen for jacket adjustment. - - tweak: Replaces the standard bomber jacket in the Pod Pilot bay with the Security - version. - - tweak: Centralizes jacket/coat adjustment handling. - - tweak: All jackets start closed by default. - - rscadd: Geneticist duffelbag on-mob sprite (for all species). - - rscadd: Vox-fitted backpacks, satchels, ERT backpacks, duffelbags and defib unit. - - tweak: Refactors back-item icon generation. - - bugfix: Typo in the description of Santa's sack. - - bugfix: Missing punctuation and gender macros in the description of the bag of - holding. - - bugfix: The tweak to back-icon generation fixes a bug where the wrong sprite name - was being used to generate back-item icons. - PPI: - - rscadd: Adds the ability to hide papers in vents. You can now leave a romantic - love letter, exchange information in secret, or hide papers infused with the - power of nar'sie from sight. - Regen1: - - rscadd: Adds the Immolator laser gun, a modified laser gun with 8 shots that will - ignite mobs, can be made in R&D - Spacemanspark: - - rscadd: Adds *yes and *no emotes to Synthetics. Glory to Synthetica. - Tastyfish: - - tweak: The PDA system has been completely redone behind the scenes! It should - be functionally similar, although there is now a Home and Back button at the - bottom as appropriate. - - rscadd: All of the heads now have multicolored pens. - - rscadd: EngiVend now has 10 camera assemblies. - - tweak: Borgs can now use vending machines. - - rscadd: There are now picture frames that can be made from the autolathe or wood - planks for papers, photos, posters, and canvases! - pinatacolada: - - tweak: Makes the Protect Station AI law board no longer consider people that damage - the station crew, instead of human - ppi: - - tweak: When revealed Revenants will not be able to move at the maximum move speed, - nor be able to pass through any solid object, like walls, windows, grills, computers - and mechs. -2016-02-26: - FalseIncarnate: - - tweak: Chocolate can now make you fat, as expected. - Fox McCloud: - - tweak: stamina damage now regenerates slightly faster - - rscadd: Adds in whetstones for sharpening objects - - tweak: Kitchen vendor starts off with 5 salt+pepper shakers - - tweak: Can now point while lying or buckled - - bugfix: Fixes Capulettium Plus not silencing - - bugfix: Fixes slurring, stuttering, drugginess, and silences last half of what - they should - KasparoVy: - - bugfix: Jackets that start open are recognized as actually being open already - now. This fixes a bug with certain items that don't have an open state, or cases - where it ended up giving an item the wrong icon (one that didn't exist) - Spacemanspark: - - bugfix: Fixes synthetics from giving off the proper message in the chat box when - using the *yes and *no emotes. - Tastyfish: - - rscadd: Wheelchairs, janicarts, and ambulances can now go through doors according - to the user's driver's access. -2016-03-07: - Crazylemon64: - - rscadd: People with VAREDIT can now write matrix variables - - rscadd: People with VAREDIT can now modify path variables - - tweak: Refactors the variable editor code somewhat. - - rscadd: The buildmode area tool now shows reticules of what you've selected. - - bugfix: Switching mobs while using the buildmode tool no longer screws up your - UI. - - tweak: Refactors buildmode so it's no longer a special-case system. - - rscadd: Adds a copy mode to build mode, which lets you duplicate objects. - - tweak: Any mob in buildmode can work at the fastest possible rate. - - bugfix: Fixed a problem where the icons of a person would not correctly update - when changing gender. - - tweak: One's hairstyle only adjusts on gender change if it's incompatible with - your new gender. - - bugfix: Fixed a bug where a person's icon would only be updated if their sprite - had a new layer added or removed. - - bugfix: You no longer lose your name when monkeyized and reverted - you'll still - look like a monkey while you're a monkey, though. - - bugfix: Your organs will now match your gender when you are cloned. - - bugfix: Skeletons (when a body rots) no longer retain a fleshy torso. - - bugfix: Putting people in an active cryotube now produces the message on insertion, - rather than release. - - bugfix: An EMP'd cloning pod will now display its sprites correctly. - FalseIncarnate: - - tweak: Water Balloons can be filled from more sources than just beakers and watertanks. - Fox McCloud: - - bugfix: Fixes the "yeah" glasses so the sound doesn't vary and a message is displayed, - on use - - bugfix: Noir mode only activates when the glasses are equipped to your actual - eyes - - rscadd: Noir Glasses mode can be toggled on or off (defaults to off) - - bugfix: Mimes can no longer use spells and continue speaking - - tweak: Mime abilities are now spells with proper icons - - tweak: Mime wall now last 30 seconds, up from 5 - - tweak: forecfields/invisible walls now block air currents - - rscadd: Adds the Sleeping Carp scroll to the uplink for 17 TC - - bugfix: Fixes Shadowlings being able to use guns - - bugfix: Fixes sleeping carp scroll users being able to use guns - - bugfix: Fixes the Experimentor throwing one item at a time - - tweak: Experimentor menu now automatically refreshes after use - - tweak: Lowers surgery times across the board - - tweak: Removes scalpels causing 1 damage on successful surgery - - tweak: Removes random chance to fracture ribs on a successful surgery - - tweak: Mining drills now have an edge - KasparoVy: - - tweak: Jackets who have the verb available but are not intended to be adjusted - will not have the action button available. - - bugfix: You can now adjust breath masks while buckled into beds and chairs. - - bugfix: Known issues with adjusted jackets using the wrong sprites. - - rscadd: Blueshield coat in hand and item icons. - - rscadd: Hulks now rip apart adjustable and droppable jackets. The items stored - in the jackets get dropped on the ground. - Tastyfish: - - tweak: Infrared emitters can now be rotated while already in an assembly via the - UI popup. - - tweak: The infrared emitter can no longer be hidden inside of boxes and still - work. - - rscadd: The beach now has a border and is splashier. - - rscadd: Gives Psychiatrist a paper bin, clipboard, and multicolored pen. - - rscadd: Gives the Librarian / Jouralist a multicolored pen. - - rscadd: Gives the NT Representative a clipboard. - - tweak: The ethanol-based neurotoxin drink is now called Neuro-toxin to avoid being - confused with the deadly toxin. - VampyrBytes: - - bugfix: Fixes emotes ending with s needing 2. Emotes now work with grammatical - options eg ping or pings, squish or squishes - - tweak: Updated emote help with missing emotes. Help will also show any species - specific emotes for your current species -2016-03-08: - Crazylemon64: - - tweak: Slime people are now more vulnerable to low temperatures. - - rscadd: Slime people are able to slowly regrow limbs at a high nutrition cost. - - rscadd: Slime people now slowly shift color based on reagents inside of them - - disabled by default, toggle it with an IC verb - - tweak: Slime people's cores are more vulnerable to damage - - bugfix: Species-related abilities now properly are removed - no more vox hair - stylists, unfortunately. - Fethas: - - bugfix: the nest buckle now looks for the right organ path - - bugfix: Fixed some sprites. - - bugfix: No more putting no drops in rechargers, - Fox McCloud: - - soundadd: Implement's goon's gibbing sound - - soundadd: Implement's goon's gibbing sound for robots/silicons - - sounddel: Removes old gibbing sound - Spacemanspark: - - rscadd: Lazarus Injector's can now be emagged to activate their special features, - alongside using EMPs on them. - Tastyfish: - - rscadd: Mimes now have a new ore, Tranquillite, used to bring peace and quiet - to the station. - - rscadd: There are also permanent invisible walls and silent floors that can be - made from tranquillite. - - rscadd: The Recitence mech is now buildable! - - tweak: The Recitence mech is now playable! - - tweak: Mid-round selection for various creatures and antagonists now consistently - asks permission. - TheDZD: - - rscadd: Adds justice helmets with flashing lights and annoying sirens. - - rscadd: Adds crates containing said helmets. - - rscadd: Also includes a version of the helmet that can only be spawned by admins, - and just has a single red light in the center instead of the stereotypical police - blinkers. - monster860: - - bugfix: Space pod transitions are now fixed. -2016-03-16: - Crazylemon64: - - tweak: Being in godmode now makes you immune to bombs - - rscadd: Science members now get compensated when they ship tech disks to centcomm. - - rscdel: Science crew are no longer paid when they "max" research. - - bugfix: Roboticists now get credit for making RIPLEYs and Firefighters - - tweak: Slime people can now regrow limbs on a more lax nutrition requirement - - tweak: Enhances the nutripump+ to let slime people regrow limbs with it active - - bugfix: Skeletons, slime people, IPCs, and Diona no longer leave blood when hit - - bugfix: Rejuvenating a slime person will no longer clog up their "blood" - - tweak: Slime people will now regenerate "blood" from having water in their system - - tweak: The decloner can now be created again - - rscadd: Environment smashing mobs can now destroy girders. - DaveTheHeadcrab: - - tweak: Removes the check for species on the update_markings proc. - FalseIncarnate: - - tweak: Xeno-botany is now more user-friendly, and less random letters/numbers. - - rscadd: Hydroponics now has a connector hooked up to the isolation tray and a - new connector in their back room for those strange plants that like spewing - plasma or eating nitrogen. - - rscadd: You can now (finally) build the xeno-botany machines, and science can - print off their respective boards. - Fethas: - - tweak: Syringes are no longer sharp - - bugfix: byond likes direct pathing so item/organ/internal not item/organ even - if it shouldn't be in the internal_organs list. This was preventing the list - from doing stuff correctly. - - tweak: fixed ipc organ manipulation surgery, you can now insert a replacment ipc - organ directly instead of needing a screwdriver in your main hand - - bugfix: nanopaste now will repair organs with robotic >= 2 instead of > 2 cuase - i am an idiot - - bugfix: Fix, hopefully, for a runtime for clientless mobs whos head are cut off... - - bugfix: Hopefully fixes issues with diona eyes - - bugfix: Though shalt not eat robotic organs..including cybernetic implants.. - - bugfix: ITS SURGERY_STEP/DETHRALL NOT SURGERY_STEP/INTERNAL/DETHRALL - FlattestGuitar: - - rscadd: Adds three new synthanol drinks - - tweak: Drinking synthanol is now a bad idea if you're organic - - tweak: A glass of holy water now looks like normal water - Fox McCloud: - - soundadd: Adds in drink fizzing sound - - tweak: Drink/bartender recipes use this new fizzing sound in addition to a few - other recipes - - soundadd: Adds in a fuse burning sound - - tweak: Bath salts, black powder, saltpetre, and charcoal use this sound now - - soundadd: Adds in a matchstrike+burning sound - - tweak: Lighting a match triggers this new sound - - soundadd: Adds in scissors cutting sound - - tweak: Cutting someone's hair uses this new sound - - soundadd: Adds in printer sounds - - tweak: printing off papers from various devices typically uses these sounds - - soundadd: Adds computer ambience sounds - - tweak: black box recorder and R&D core servers both play this sound at random - rare intervals - - tweak: Reduces the tech level (and requirement) for nanopaste - - tweak: Reduces the tech level (and requirement) for the plasma pistol - - tweak: Removes Nymph and drone tech levels - - tweak: Reduces tech levels on the flora board - - tweak: Adds tech level requirements to mech sleepers, mech syringe guns, mech - tasers, and mech machine guns - - tweak: Increases tech cost of the decloner - - tweak: Removes the pacman generators - - tweak: Removes emitter - - tweak: Removes flora machine (functionless anyway) - - tweak: Removes the pre-spawned nanopaste - - tweak: Removes space suits - - tweak: Removes excavation gear - - tweak: Replaces the soil with actual hydroponic trays (more aesthetic than anything) - - tweak: Removes most external asteroid access from the station - - tweak: Excavation storage is now generic science storage - - tweak: removed the plasma sheet - - bugfix: Fixes augments not showing up in R&D unless specifically searched for - - bugfix: Fixes some augments being unavailable in mech fabs - - bugfix: Fixes augments having no construction time - - bugfix: Fixes xenos not gaining plasma when breathing in plasma - - bugfix: Fixes plasma reagent not generating plasma for a person - - rscadd: Screaming has different sounds based on being male or female - - soundadd: Implements Goon's screaming sounds. - - rscadd: Screaming tone is now based on age of character instead of being random - - tweak: Ups the cooldown on screaming from 2 seconds to 5 seconds - - tweak: Removes chance for Whilhelm scream - - rscadd: Borgs can now scream - - rscadd: Monkey's now have a unique screaming sound - - rscadd: IPCs now scream like cyborgs - - rscadd: Updates slot machines to have higher jackpots and more payouts with more - interesting sounds - - rscadd: 'Adds X-Ray, Thermal, Anti-tun, and Reviver implants to the nuke ops uplink - (augments come with one auto-implanter) rcsadd: Adds in augment auto-implanter, - which inserts and implant without surgery' - - tweak: tweaks a large number of chems; behaviors are largely retained, but new - flavor messages, probabilities, etc may be present; overall, you can expect - chems to do the same thing - - tweak: 'Tabun re-replaced with Sarin rcsadd: New reagent: cholesterol: if overdosed - on, it can cause a heart attack--fatty foods, cheese, eggs, and some meats all - produce cholesterol in your body.' - - rscadd: Mixing Sarin, Meth, or Cyanide will poison in a very small area of the - reaction if you're not on internal OR not wearing a gas mask - - rscadd: Chemist warddrobe now has two gas masks - - tweak: Teslium will now impact synthetics AND organics - - bugfix: Fixes facehuggers hugging already infected people - - bugfix: Fixes facehuggers hugging people while dead - - bugfix: Fixes Embryo's developing twice as fast as they should - - bugfix: Fixes up some behaviors with xeno eggs - - tweak: Xeno acid can now melt through floors and the asteroid - - rscadd: Xeno's now play the gib sound when actually gibbed - - rscadd: Implements Changeling headcrabs/headspiders - - bugfix: Fixes xenos not throwing their organs when gibbed - - bugfix: Fixes swallowed mobs not being ejected when a human is gibbed - - rscadd: Adds in spider eggs reagent, an infectious reagent that requires surgery - to correct - - bugfix: Fixes EMPs causing eye implant users to be permanently blind - - tweak: Increases bag of holding's storage capacity - - rscadd: Removing a heart no longer kills the patient instantly, but induces a - heart attack - - bugfix: Demon hearts will not work - - bugfix: Should now actually be able to re-insert hearts - - rscadd: Reworks addictions to bettter differentiate them betweeen overdosing and - make them more realistic. - - tweak: 'changes which chems are addictive, currently, the follow reagents are - now addidctive: meth, crank, krokodil, bath salts, space drugs, perfluoradecalin, - omnizine, coffee, nicotine, fliptonium, ultra lube, surge, fake cheese, weird - cheese, ephedrine, diphenhydramine, teporone, and morphine' - - rscadd: sleepers help you recover from addiction faster - - rscadd: Can now make cable coils in autolathes - - bugfix: Fixes the slot machine announcements not displaying properly - Tastyfish: - - tweak: The super fart mutation now gives you a spell-like ability instead of augmenting - the emote. - - tweak: Vampire abilities are now in their own Vampire tab, as well being action - buttons at the top, like spells. - - bugfix: Cloning a vampire no longer makes them lose their abilities. - - bugfix: Vampires can no longer hypnotize chaplains. - - bugfix: Being a full vampire (500+ total blood) actually makes you immune to holy - water reliably now. - - rscadd: 'Some old away missions are back: Academy, Black Market Packers, Space - Hotel, Station Collision, and Wild West. Go out and round up some hostiles!' - - bugfix: Shuttle consoles now pair up to the engineering, mining, research, or - labor shuttle when built or used before pairing, as long as the shuttle is near - the console, or the shuttle is moved to be nearby. - monster860: - - rscadd: Mining station now has a podbay. - - rscadd: Ore scooping module for the spacepod. - - rscadd: 'Three mining lasers for spacepod: Basic, normal, and burst.' - - bugfix: Shooting weapons south or west of spacepod will actually hit adjacent - targets now, and won't shoot through walls anymore. - taukausanake: - - rscadd: Mice can now be picked up like diona -2016-03-22: - Crazylemon64: - - bugfix: Repairs all sorts of eldritch occurences that happen when you put an organic - head on an IPC body, as well as some decapitation bugs - - bugfix: Makes heads keep hair on removal - - bugfix: Amputated limbs from a DNA-injected individual now will keep their appearance - of the DNA-injected person - - bugfix: Wounds will vanish on their own now - - rscadd: Admins now have an "incarnate" option on the player panel when viewing - ghosts for quick player instantiation - - bugfix: Fixes a runtime regarding failing a limb reconnection surgery - - bugfix: Copying a client's preferences now overrides the previous mob's DNA - - bugfix: A DNA injector is now more thorough, and affects the DNA of mobs' limbs - and organs - - bugfix: DNA-lacking species can no longer be DNA-injected - - bugfix: Brains are now labeled again - - rscadd: Splashing mitocholide on dead organs will make them live again. - - rscadd: The body scanner now detects necrotic limbs and organs. - - bugfix: pAIs and Drones are now affected by EMPs and explosions while held. - Fethas: - - rscadd: Adds a surgery for infection treatmne/autopsys that is simply cut open, - retract, cauterize - - bugfix: fixes a dumb error in internal bleeeding surgerys - - rscadd: Chaos types no longer random teleport, but will make the target hallucinate - everyone looks like the guardian. - FlattestGuitar: - - rscadd: Adds a snow, navy and desert military jacket. - Fox McCloud: - - tweak: Removes random 1% chance to heal fire damage - - tweak: Removes passive healing from resist heat mutation - - tweak: Regen mutation heals every cycle (albeit less, on average), but doesn't - cost hunger - - bugfix: Fixes not being able to speak over xeno common or hivemind when you receive - the Xeno hive node - - rscadd: Adds in the ability to transfer non-locked metal+glass only designs from - the protolathe to autolathe - - tweak: Changes Outpost Mass Driver to prevent accidental spacings - - tweak: Shadow people no longer dust on death, are rad immune+virus immune, and - can be cloned. Slip immunity removed - - tweak: Shadowlings no longer get hungry or fat and no longer dust on death - KasparoVy: - - rscadd: The ability to change your head, torso and groin as an IPC in the character - creator. Non-IPCs cannot access the parts. - - rscadd: Head, torso and groin sprites for all mechanical limb/bodypart brands - but Morpheus and the unbranded ones (since those already exist) from Polaris. - - rscadd: Faux-eye optics for non-Morpheus heads. - - rscadd: The ability to change optic (eye) colour if you've got a non-Morpheus - head. - - rscadd: The ability to choose human hair styles (wigs) and facial hair styles - (postiche) with non-Morpheus heads. Non-Morpheus heads cannot choose screens. - Conversely, Morpheus heads cannot choose wigs or facial hair. - - rscadd: Two hair styles from Polaris. - - rscadd: The ability for IPCs to wear undergarments (shirts and trousers). - - rscadd: Antennae (colourable) for IPCs. - - tweak: IPC monitor adjustment verb will now adjust optic colour if the head is - non-Morpheus. - - bugfix: Combat/SWAT boots can now be toecut and jacksandals can't. - - bugfix: ASAP fix to what would've broken the ability to configure prostheses in - character creation. - - bugfix: Adjusted masks no longer block CPR (including bandanas). - - bugfix: You can no longer run internals from adjusted breath masks (or airtight - adjustable masks in general). - Regens: - - tweak: Robotic hearts will now properly give the mob a heart attack instead of - just damaging it when EMP'd - - rscadd: Assisted organs will now also take damage from EMP's - - bugfix: Internal robotic and assisted organs will now actually take damage from - EMP's - Tastyfish: - - rscadd: Adds PDA chatrooms. Post memes! Talk to your fellow collaborators! Get - caught! - - tweak: You can now set the PDA messenger to automatically scroll down to new messages. - - rscadd: Pet collars now act as death alarms and can have ID's attached to them. - - tweak: All domestic animals can now wear collars. - - rscadd: You can now make video cameras at the autolathe. - TheDZD: - - bugfix: Fixes an instance of old code being so incredibly, unbelievably, makes-me-want-to-stab-myself-in-the-eye-edly - idiotic. - TravellingMerchant: - - imageadd: Kidan have new sprites! - tigercat2000: - - rscadd: Nukeops now have an assault pod, they can use it for 30 TC. Loud and mean. - - bugfix: Lighting overlays can no longer go below 0 lum_r/g/b - - bugfix: Shuttles will work with lighting better. - - bugfix: Wizards can no longer teleport to prohibited areas such as Central Command. -2016-03-25: - Crazylemon64: - - bugfix: You now will actually have the correct `real_name` on your DNA. - - bugfix: No more roundstart runtimes regarding IPC hair. - - bugfix: Mitocholide rejuv will work more usefully now. - - bugfix: Limbs and cyborg modules will no longer appear in your screen. - - bugfix: Cyborg module icons are now persistent throughout logging in and out. - - bugfix: Various cyborg modules, like engineering, now use the proper icon. - FlattestGuitar: - - rscadd: Adds confetti grenades. - Fox McCloud: - - bugfix: Fixes Sleeping Carp combos not having an attack animation - - bugfix: Fixes several chems not properly healing brute/burn damage, consistently, - as intended - KasparoVy: - - bugfix: Unbranded heads and groins no longer invisible. - - bugfix: Zeng-hu left leg will now be in line with the body when facing south. -2016-03-26: - Fox McCloud: - - rscadd: Adds in dental implant surgery. Implant pills into people's teeth. - - tweak: Major rebalance and Shadowling update (https://github.com/ParadiseSS13/Paradise/pull/3986 - for details). In general, Shadowlings can no longer enthrall or engage in Shadowling - like behavior, pre-hatch. Post-hatch, shadowlings are much more powerful, with - a ride array of New abilities such as extending the shuttle or making thralls - into lesser shadowlings. Shadowling gameplay should not revolve almost entirely - around darkness, as opposed to pre-hatch shenanigans. - - rscadd: Robotics now has a "sterile" surgical area for performing augmentations - - rscadd: Adds the FixOVein and Bone Gel to the autolathe - - tweak: ensures all surgical tools have origin tech on them; lowers origin tech - on FixoVein - KasparoVy: - - rscadd: Slime People can now wear underwear. - - rscadd: Slime People can now wear undershirts. - TheDZD: - - tweak: NT has removed trace amounts of a highly-addictive substance from the "100% - real" cheese used in cheese-flavored snacks. As a result, incidence rates of - crewmembers becoming addicted to Cheesie Honkers should reduce to zero. - - tweak: After receiving complaints about crewmembers often being unable to physically - function without a back-mounted barrel of coffee, NT has replaced station all - sources of coffee on the station, including coffee beans themselves with a largely - decaffeinated version. It was funny the first time almost every crewmember aboard - the NSS Cyberiad was lugging around their own oil barrel filled with coffee, - it wasn't so funny, nor good for productivity the eighteenth. -2016-04-02: - Crazylemon64: - - rscadd: Metal foam walls will now produce flooring on space tiles - - bugfix: Syringes will now draw water from slime people. - FalseIncarnate: - - tweak: Let's you know when your container is full when filling from sinks. - - tweak: Prevents splashing containers onto beakers and buckets that have a lid - on them. - - rscadd: Pill bottles can now be labeled with a simple pen. - - tweak: Beakers/buckets (and pill bottles) now accept 26 character labels from - pens. - Fethas: - - tweak: Various spells have had a tweak to stun/reveal/cast, some other number - stuff... - - rscadd: Nightvision - - tweak: harvest code is now in the abilites file. - - rscadd: New fluff objectives - - bugfix: Hell has recently remapped its blood transit system and you can now once - again crawl through blood. We are sorry for the-GIVE US YOUR SOUL! - FlattestGuitar: - - tweak: Alcoholic beverages now have proper levels of ethanol in them. Good luck - passing out after a beer. - Fox McCloud: - - rscadd: Adds in the Lusty Xenomorph Maid Mob; currently admin only. - - bugfix: Fixes xenomorph brains having the wrong sprite, no origin tech, and incorrect - name - - tweak: removes xenomorph egg from hotel - - tweak: upgrades are no longer needed to for the available toys in the prize vendor - - rscadd: Implements Advanced Camera Consoles. A type of camera console that function - like AI's vision style. Non-buildable/accessible. - - rscadd: Adds in Xenobiology Advance Cameras. A type of camera console that functions - like advanced cameras, but only works in Xenobiology areas; can move around - slimes and feed them with the console as well. Also non-buildable/accessible - (for now). - - rscadd: Adds in cerulean slime reaction that generates a single use blueprint. - On use it colors turfs a lavender color - - rscadd: Adds disease1 outbreak event - - rscadd: Adds appendecitis event - - rscadd: Roburgers now properly have nanomachines in them - - rscadd: Re-adds nanomachines - - tweak: Experimentor properly generates nanomachines instead of itching powder - - bugfix: Fixes big roburgers having a healing reagent in them - - rscadd: Adds nanomachines to poison traitor bottles - - rscadd: Tajarans can now eat mice, chicks, parrots, and tribbles - - rscadd: Vulpkanin and Unathi can now eat mice, chicks, lizards, chickens, crabs, - parrtos, and tribbles - - bugfix: fixes spawned changeling headcrab behavior - KasparoVy: - - bugfix: Incisions made at the beginning of embedded object removal surgery can - now be closed in the same procedure. - ProperPants: - - rscadd: Maint drones have magboots. - - rscdel: Removed plastic from maint drones. Literally useless for station maintenance. - - tweak: Increased starting amounts of some materials for maint drones and engi - borgs. - - experiment: Reduced the number of lines taken by Engineering cyborgs calling on - materials stacks. - - rscadd: Operating tables can be deconstructed with a wrench. - - spellcheck: Fixed and shortened description of metal sheets. - Tastyfish: - - rscadd: Bots can now be controlled by players, by opening them up and inserting - a pAI. *beep - - bugfix: MULEbots can now access the engineering destination. - - bugfix: All MULEbot destinations should now have the correct load/unload direction, - meaning the crates won't be dumped inside the flaps. - - rscadd: Diagnostic HUD's now give health and status information about bots. - - bugfix: MULEbot rampage blood tracks are now rendered correctly and handle UE - traces as appropriate. - - experiment: Bots should (hopefully) lag the game less now. - - tweak: Beepsky contains 30% more potato. - - tweak: Action progress bars are now smooth. - - tweak: Clicking a filled inventory slot's square with an open hand now clicks - the item in the slot. - - rscadd: Status displays now display the time when in Shuttle ETA mode and no shuttle - activity is happening. - - tweak: Shuttle ETA countdowns on status displays are now amber. - - rscadd: pAI's can now use the PDA chatrooms. - - rscadd: Adds treadmills to brig cells, to give the prisoners something productive - to do. - TheDZD: - - rscdel: A lot of the guns and armor in the station collision, space hotel, academy, - and wild west away missions have been removed/replaced. - - rscdel: Removes that fucking facehugger from station collision. - tigercat2000: - - rscdel: Virus2 has been removed. - - rscadd: Virus1 is back. Viva la revolution. - - rscadd: You can now have up to 20 characters. -2016-04-07: - Crazylemon64: - - bugfix: Removes an offset from the advanced virus stealth calculation, causing - viruses to be more stealthy than the sum of their symptoms. - - bugfix: Mulebots will now send announcements to relevant requests consoles on - delivery again. - FalseIncarnate: - - rscadd: Adds logic gates, for doing illogical things in a logical manner. - - rscadd: Adds buildable light switches, for all your light toggling needs. - - bugfix: Fixes a resource duplication bug with mass driver buttons. - Fethas: - - tweak: maybe makes them last longer...maybe..and fixes the event end message - Fox McCloud: - - rscadd: Maps in the slime management console to Xenobio - - tweak: Reduces Xenobio monkey box count from 4 to 2 - - bugfix: Fixes weakeyes having a negligible impact - - rscadd: Can spawn friendly animals with a new gold core reaction by injection - with water - - tweak: Hostile animal spawn increased from 3 to 5 for hostile gold cores - - tweak: Swarmers, revenants, and morphs no longer gold core spawnable - - bugfix: Fixes invisible animal spawns from gold core/life reactions - - rscadd: Adds tape to the ArtVend - - tweak: Can no longer use sentience potions on bots - - rscadd: Added in Plasma Dust reagent, acquired by grinding plasma sheets; it's - more toxic than regular plasma and generates plasma gas when spilled onto turfs. - - tweak: Slimecore reactions now require plasma dust as opposed to dispenser plasma - - rscadd: Added in new Rainbow slime; inject with plasma dust to get a random colored - slime. Acquire by having 100 mutation chance on a slime when it splits. - - rscadd: Monkey Recycler can produce different types of monkey cubes; change the - cube type by using a multitool on the recycler - - tweak: Epinephrine/plasma reagents changing mutation rate has been removed - - tweak: Mutation chance is inherited from slime generation to slime generation - as opposed to being purely random. - - tweak: 'New reactions added for red and blue extracts: red generates mutator, - which increases mutation chance, and blue generates stabilizer, which decreases - mutation chance.' - - tweak: Slime glycerol reaction removed - - tweak: Slime cells are now high capacity cells (more power than before) - - tweak: extract enhancer increases the slime core usage by 1 as oppose to setting - it to three - - tweak: slime enhancer increases slime cores by 1 as opposed to setting the core - amount to 3 - - tweak: Chill reaction lowers body temperature slightly more so it doesn't just - wear off instantly - - tweak: Reduces Xenobio plasma sheets from 8 to 3 and removes that pesky boombox - - bugfix: Processors no longer produce 1 more slime core than intended - - bugfix: Less blank/spriteless/empty foods from the silver core reaction - - tweak: Virology mix reactions now use plasma dust as opposed to plasma - - tweak: Statues can no longer move/attack people unless they're in total darkness - or all mobs viewing them are blinded - - tweak: statues are invincible to anything other than full out gibbing. - - tweak: Statues flicker lights spell range increased - - tweak: Blind spell no longer impacts silicons - - bugfix: Fixes statues being able to attack/move whenever they feel like it, regardless - of client statues - - bugfix: Fixes blind spell impacting the statue - Tastyfish: - - tweak: Beepsky is no longer a pokemon. - - tweak: pAI-controlled Bots now reliably speak human-understandable languages over - the radio. - - rscadd: More floor blood for the blood gods. (Or rather, as much as there was - supposed to be.) - tigercat2000: - - rscadd: Items in your off hand will now count towards access. -2016-04-12: - FalseIncarnate: - - tweak: Adjusting the setting of a vendor circuit board is no longer random, but - instead provides a select-able list. - - tweak: Vendor Circuit Board design moved from the Circuit Imprinter to the Autolathe, - acid requirement replaced by metal. - - bugfix: Burnt matches can no longer light cigarettes, pipes, or joints. - Fethas: - - rscdel: Nukes the cargo train code rscadd:Adds simple vehicle framework and converts - secway/janicart/snowmobiles/bikes/cars/ambulance to it rscadd:Adds space speedbike, - red and blue versions, yes you WILL need a spacesuit rscadd:Maps janicart and - secway onto metastation (but not ambulance no pareamedic garage, no i am not - mapping that) - - bugfix: You should now be able to operate on IPC eyes, SHOULD bugfix:hopefully - surgery on diona works right - Fox McCloud: - - rscadd: Adds in TraitorVamp; game mode that's essentially like TraitorChan, but - with a Vampire instead of a Changeling - - tweak: Vampires cannot use holoparasites - - tweak: Malf AI will automatically lose if it exits the station z-level - Tastyfish: - - tweak: All cats can kill mice now. - - tweak: E-N can't suffocate. - - tweak: Startup time is now shorter. - - rscdel: Removed the Station Collision away mission from rotation, due to multiple - conceptual and technical issues. -2016-04-14: - Aurorablade: - - rscdel: Removes the !!FUN!! of having headslugs gold core spawnable. - Fox McCloud: - - soundadd: Added in sounds (instead of a chat-based message) for when airlocks - are bolted/unbolted - - soundadd: Added in sound for when airlocks deny access - - tweak: cutting/pulsing wires will play a sound - - tweak: ups nuke ops game mode population requirement from 20 to 30 - - rscadd: Adds in mining drone upgrade modules to increase their health, combat - capability, or reduce their ranged cooldowns - - rscadd: Adds in mining drone "AI upgrade" a sentience potion that only works on - mining bots - - tweak: Mining bots should be less likely to shoot you when attacking hostile mobs - - tweak: Killer tomatoes actually live up to their name now and are hostile mobs - - tweak: Killer tomatoes are an actual fruit now; activate it in your hands to make - them into a mob - - tweak: Killer tomatoes are directly mutated from regular tomatoes instead of blood - tomatoes - - tweak: Increased the yield of regular tomatoes by 1 - - tweak: Tweak some stats on the killer tomato seeds - - bugfix: Fixes the blind player preference not doing anything - - rscadd: Adds portaseeder to R&D - - tweak: Scythes will conduct electricity now - - tweak: Mini hoes play a slice sound instead of bludgeon sound - - tweak: Plant analyzer properly has a description and origin tech - - tweak: Can have hulk+dwarf mutations together - - tweak: Can have heat+cold resist together - - tweak: Can only remotely view people who also have remote view - - bugfix: Fixes cold mutation not having an overlay - - bugfix: Hallucinations will no longer tick down twice as fast as they should nor - will they spawn twice as many hallucinations as they should - - bugfix: Incendiary mitochondria no longer asks who you want to cast it on (it - always is meant to be cast on yourself) - - bugfix: Fixes permanent nearsightedness even when wearing prescription glasses - KasparoVy: - - tweak: 'Head accessories now behave like facial hair: They will no longer be hidden - by clothing items that BLOCKHEADHAIR (have the BLOCKHEADHAIR flag).' - - bugfix: Wearing a piece of clothing that blocks head hair will no longer make - head accessories (facial markings/horns/antennae) invisible until an icon update - is triggered while the headwear is off. - Meisaka: - - bugfix: law manager no longer freaks out with Malf law - TheDZD: - - rscdel: Removes shitty Caelcode bees. - - rscadd: Hydroponics can now manage bee colonies, bees produce honeycombs that - can be ground to obtain honey, a decent nutriment+healing chemical - - rscadd: Hydroponics can inject a queen bee with a syringe of a reagent to alter - her DNA to match that reagent, meaning all honeycombs produced will contain - that reagent in small amounts - - rscadd: Bees with reagents will attack with that reagent. It takes 5u of a reagent - to give a bee that reagent. - - rscadd: Added the ability to make Apiaries and Honey frames with wood - - rscadd: Added the ability to make Royal Bee Jelly from 10 Mutagen and 40 Honey - - rscadd: Added the ability to make more Queen Bees from Royal Bee Jelly by using - it on an existing Queen, to split her into two Queens - - rscdel: Removes some snowflakey mob behavior from bears, snakes and panthers. - - rscadd: Hudson is feeling punny. - - experiment: Hostile mob AI should now be a bit more cost-efficient. - monster860: - - rscadd: Adds area editing, link mode, and fill mode to the buildmode tool +DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. +--- +2016-01-03: + TheDZD: + - rscadd: Ports over changelog system from /tg/station. +2016-01-06: + Certhic: + - bugfix: Corrected some air alarms so that atmos computer can access them + - bugfix: Bodyscanner now sees mechanical parts in internal organs + Crazylemon64: + - bugfix: Sleeping simple animals should tick down sleeping as normal - deaf simple + mobs are no longer a thing + Tastyfish: + - tweak: Instruments now use NanoUI. + - spellcheck: Corrected the blueshield mission briefing. +2016-01-08: + Crazylemon: + - rscadd: Fully enables a system to allow species to have unique procs and verbs + that come and go with the species. + - rscdel: IPCs lose their change monitor verb when changing species now. Gone are + the days of recalling a past IPC life to perform self-barbery! Oh, woe is me! + - bugfix: Sleepers and Body Scanners will now reliably work when rotated + - bugfix: SSD humans should be asleep more reliably now. + Dave The Headcrab: + - tweak: Nerfs the damage the Detective's revolver does from 15 brute to 5 brute. + - rscadd: Adds a 300 round capacity buckshot magizine that fits into the L6 Saw. + - rscadd: Adds a 25 round capacity 40mm HE magizine that fits into the L6 Saw. + - rscadd: Adds the 'Devastator' L6 SAW, starts off loaded with the buckshot magizine. + - rscadd: Gives the SST the 'Devastator' L6 Saw, and one of each mag type in their + bag. + FalseIncarnate: + - rscadd: Plants will now begin to die over time if their age exceeds 5 times their + TRAIT_MATURATION value. + - tweak: 'Weed growth chance per process in trays has been slightly increased (Previously: + 5% chance if no seed, 1% otherwise;Now: 6% / 3%).' + - tweak: 'Pest growth in trays has been slightly buffed. (Previously: 3% chance + to increase by 0.1; Now: 5% chance to increase by 0.5)' + Fethas: + - rscadd: Due to Archmage Steve leaving the nya-cromantic stone near the microwave, + the true power of the stone has been unleashed. Subjects of the stone are not + only ressurected ... but resurrected as catgirls ... We fired steve. + Fox McCloud: + - bugfix: fixes a bug relating to some brute/burn damage being dealt to human mobs. + - rscadd: Adds in overloading APCs, causing them to arc electricity to mobs in range. + - tweak: Makes Engineering related APCs overload proof. + - rscadd: Implements the timestop spell. + - rscadd: Implements new sepia slime reaction which halts time in an AoE. + - tweak: sentience potions no longer can make slimes sentient. + - tweak: Removes Hulk instant stun. + - tweak: Hulk damage increased. + - tweak: Hulk wears off at a lower health threshold. + - bugfix: Fixes strange reagent not working on simple animals. + - tweak: Reduces the amount shock damage and bounces for the Tesla engine. + - bugfix: Fixes Syndicate Cyborg's LMG being invisible. + - bugfix: Fixes the uplink kit having implanters that were both nameless and looked + as if they had been used. + KasparoVy: + - rscadd: Added the security gasmask, sexy mime mask, bandanas, balaclava, welding + gas mask and wrestling masks for Vox. Added adjusted-state sprites for the Vox + breath, medical, and surgical masks. + - rscdel: Removed a duplicate of the human balaclava sprite. + - tweak: Modifies the Vox plague-doctor, fake moustache, sterile and medical mask + sprites to fit the Vox anatomy and animates the Vox SWAT mask. Corrects the + names of some Vox mask adjusted-state sprites. + Tastyfish: + - spellcheck: Fixed the pronouns in a few verbs and the door to 'Interrogation Observervtion'. + Tigercat2000: + - rscadd: Added 96x96 (3x) res option to icons menu +2016-01-11: + CrAzYPiLoT: + - bugfix: Fixes the footsteps sounds to the fullest. + Crazylemon: + - rscadd: Bomb guardians now automatically notify their master when they've set + something to boom, so there's less accidental friendly fire + - bugfix: Bomb guardians are only notified that their trap failed, if it ACTUALLY + FAILED. + - rscadd: Bomb guardians now are more aware of what is primed to explode. + - rscadd: Bomb guardian summoners can now defuse their guardian's bombs without + harm. + - rscadd: Brought RAGIN' MAGES back up to function. + Dave The Headcrab: + - rscadd: Added a new icon for the soy and cafe latte drinks. Icons courtesy of + Full Of Skittles, resident overlord of art. + Fox McCloud: + - rscadd: Re-arranges the armory and changes its contents minorly. + - rscadd: Adds in rubbershot ammo boxes. + - bugfix: Fixes Mutadone incurring a massive cost on the server. + - tweak: Positronic brains can no longer speak binary. + - tweak: Positronic brains can be prevented from speaking (or allowed) by toggling + their speaker on/off. + - tweak: IPC's positronic brains start off toggled off. + - bugfix: Fixes the supermatter announcement causing massive amounts of server lag. + - rscadd: Adds in tradable telecrystals. +2016-01-13: + Fox McCloud: + - bugfix: Fixes Rezadone not clearing mutated organs. + - tweak: Clone damage immunity removed from Slime People, Shadowlings, Golems, and + Vox + - tweak: Explosions will no longer destroy things underneath turfs until the turf + is exposed. + - bugfix: fixes a runtime related to revolver spinning. + - bugfix: fixes server loading taking an abnormally long time. + Kyep: + - rscadd: Blob, vine and virus outbreaks are now more clearly labeled as such, to + avoid people confusing them with each other + Tastyfish: + - tweak: NT Rep fountain pens and magistrate gold pens can now write in 5 different + colors. The IAA gets a cheap plastic equivalent. +2016-01-18: + Crazylemon: + - rscadd: New classes of shapeshifters have been sighted around the NSS Cyberiad... + - bugfix: Wizards now can't teleport to other antag spawn points. + - bugfix: Removes an extruding pixel from the left-facing IPC glider monitor sprite. + - tweak: Ragin' Mages now spawn every 7 minutes, instead of 5. Admins can further + adjust this by modifying the 'delay_per_mage' variable. + - bugfix: Ragin' Mages are now made with 100% less in-use souls (Apprentices won't + have their consciousness yoinked). + - tweak: It takes half an hour for the REAL chaos of ragin' mages to start, for + at least a semblance of normality. + Dave The Headcrab: + - rscadd: Adds the advanced energy revolver, toggles between taser and laser modes. + - rscdel: Removes the detective's revolver from the blueshield's locker. + - tweak: Changes the taser the blueshield starts with into an advanced energy revolver. + Deanthelis: + - rscadd: Added the ability for the Magnetic Gripper to pick up and place light + tiles. + Fethas: + - bugfix: Readds the hud icon showing up for master and servent + - rscadd: adds mindslave datum hud thingy based on TGs gang huds + Fox McCloud: + - bugfix: Fixes not being able to add/remove Weapon Permit from IDs. + - bugfix: Fixes the energy sword being invisible in-hand when turned on. + - bugfix: Fixes the telebaton being invisible in-hand when extended. + - bugfix: Fixes eye-stabbing not having an attack animation or hitsound. + - bugfix: Fixes some kitchen utensils playing the wrong hit-sound and playing twice + in some cases. + - bugfix: Fixes the butcher cleaver sprite being backwards. + - bugfix: Fixes the telebaton sprite being missing from the side. + - bugfix: Fixes the meat cleaver being invisible in-hand. + - spellcheck: Corrects some grammatical descriptive errors for the elite syndicate + hardsuit. + - rscadd: completely overhauls implants to TG's standards. + - rscadd: Adds storage implant. + - rscadd: Adds microbomb and macrobomb implants. + - rscadd: Adds in support for removing implants directly into cases. + - rscdel: Removes Bay style explosive implants. + - rscdel: Removes compressed matter implants. + - tweak: Tweaks the uplink to reflect removal of the old implants and inclusion + of the new. + - bugfix: Fixes/cuts down on the lag caused by monkey cubes. + Jey: + - tweak: Inflatable walls and door can now be deflated by altclicking them + - bugfix: Fixed lag from expanding multiple monkeycubes at once. + KasparoVy: + - imageadd: Adds blank icons with standardized timings for species tail wagging, + used in icon generation. + - bugfix: Fixes tails overlapping arms/limbs + gloves, etc. when facing EAST or + WEST. + - bugfix: Ensures tails will overlap stuff as normal only when facing NORTH so as + to avoid unwanted interference with the base sprite. + - bugfix: Tails now appear in ID cards, overlays things correctly. + - bugfix: Tails now overlay and are overlaid by things correctly in preview icons. + - tweak: Modifies the positioning of tail icon generation in the ID card preview + icon generation file. + - tweak: Modifies the positioning of tail icon generation in the player preferences + preview icon generation file. + - tweak: Breaks limb generation into its own layer, breaks tail generation into + a second layer that can be overlaid by limbs. + - tweak: If the user's species is flagged to have a tail that is overlapped, TAIL_LAYER + will now overlay the NORTH direction sprite of a tail now, while TAIL_UNDERLIMBS_LAYER + gets all remaining directions. Otherwise icons are generated in the traditional + manner. + - tweak: Adjusts the Unathi right arm east direction and animated tail sprites, + recolouring a random pixel and fixing a floating tail respectively. + - tweak: Adjusts position of tail layer such that tails' north direction sprites + will overlay backpacks (more importantly, satchel straps). + - tweak: Accommodates admin-overrides to the body_accessory species check by setting + the default animation template to Vulpkanin. + - tweak: Adjusts north-direction Unathi static tail sprite, now attaches to the + body in the correct location. + - rscadd: Adds some TG underwear. + - rscadd: Adds an NV science goggles worn sprite. + - rscadd: Ports Bay/TG berets. + - tweak: Adjusts beret sprite, recolours strange orange pixels. + - tweak: Adjusts NV science goggles object icon. Removed strange border and centered + it. + - rscadd: Ports Polaris' PRs 761 and 778, brings over Ragnie's awesome Ward-Takahashi + prosthetics. + Kyep: + - rscadd: Changing level to gamma/delta/epsilon now displays a special gamma/delta/epsilon + sprite on status monitors + - bugfix: Changing level to green/blue now clears the status monitors, so they no + longer show higher alert levels after the level is changed + NTSAM: + - rscadd: Added a rainbow IPC screen. + PPI: + - tweak: Modifies the effective time limit to activate the Nuclear Challenge as + Nukeops from two minutes to seven minutes + Tastyfish: + - rscadd: The QM now actually has a QM stamp instead of a fake one, as well as an + approved and denied stamp. + - rscadd: New area named 'Genetics Maintenance' solidifying/relabelling the confusing + area between the morge and Mech Bay as being fully maintenance again, but working + correctly and with proper doors. + - spellcheck: Fixed a few maintenance door names to be in parity to the rest of + the station. + - rscadd: Added the ability to print the records photo of a crew member from a security + records console. Useful for Wanted notices! + Tigercat2000: + - rscdel: You can no longer use the gibber for monkies. + - spellcheck: Cleaned up gibber.dm styling. + - rscadd: The fire alarm now uses NanoUI, with color coded alert levels. + - tweak: Upgraded NanoUI (again), fancy FontAwesome icons. + - wip: Didn't add any butts. Yet. +2016-01-20: + DarkPyrolord: + - rscadd: Adds in hardsuit sprites for Vulpkanin + FalseIncarnate: + - rscadd: Allowed cheap lighters and individual matches to be put into cigarette + packages at the cost of cigarette space. + - rscadd: Matches can now be lit and put out by striking the match on your shoes. + Good for if you lose that matchbox, or want to just feel cool. + Fox McCloud: + - bugfix: Fixes brute damage on weapons not knocking people down. + - tweaks: Tweaks implant behavior to be more consistent and unified. + - tweak: Lowers the pAI cooldown from 60 seconds to 5 seconds. + - rscadd: Raw telecrystal can now be used to charge uplink implants. + - bugfix: Fixes being unable to holster the pulse pistol + - bugfix: Fixes being able to holster shotguns + KasparoVy: + - tweak: Improved shading on all Vulpkanin hardsuit tails. + - tweak: Vulpkanin hardsuit helmet respriting (colour tweaks). + - rscadd: Vulpkanin hardsuit helmets with proper flashlight-on sprites. + Tastyfish: + - tweak: The ID computer Access Report printout now separates the access list with + commas so it's actually readable. + - bugfix: The ID computer Access Report printout isn't blank if you don't have an + authorization card in anymore. + - rscadd: In the supply ordering & shuttle consoles, one can now cancel an order + at either the Reason or Amount input dialogs. + - bugfix: Table flipping uses correct sprites. + TheDZD: + - rscadd: Adds world.Topic() handling so that users are notified in-game when pull + requests are opened, closed, or merged on the Github repo. +2016-01-23: + Fox McCloud: + - rscdel: Removes Vampire HUD + - tweak: moves the Vampire blood counter to a more easy to see location + - rscadd: Adds in a Changeling chemical counter display + - rscadd: Adds in a Changeling sting counter display + - rscadd: Vampire total blood and usable blood will now appear under status + - tweak: Changes vampire blood display to be similar to ling chemical counter + - bugfix: Fixes unnecessary toxin damage being dealt on severe bloodloss + - bugfix: Fixes human mobs not receiving proper random names + - rscadd: Adds in knight armor + - rscadd: Grants the chaplain a set of crusader knight armor + - rscadd: Adds in cult-resistant ERT paranormal space suit + - rscadd: Allows the Chaplain to convert his null rod into a holy sword with crusader + knight armor + - tweak: Chaplain's closet is now a secure closet + - rscadd: Adds in Assault Gear crate to cargo + - rscadd: Adds in military assault belt + - rcsadd: Adds in spaceworthy swat suits + - tweak: tweaks bandolier to hold 2 additional shotgun shells + - tweak: bartender starts off with +2 additional shells + - tweak: Reduces the cost of the space suit crate and doubles its contents + - rscadd: Refactors knives so their behavior is more universal + - bugfix: Fixes Hulk not properly being removed when your health drops below a threshold + - bugfix: Fixes flickering vision in a mining mech + Tastyfish: + - rscadd: Poly has taken a seminar on the latest trends in engine operations. + - rscadd: Player-controller parrots can now hear their headsets. + Tigerbat2000: + - bugfix: The nuclear disk escaping on the shuttle no longer counts as a syndicate + minor victory. + - bugfix: Cultists can once again actually greentext the escape objective. +2016-01-24: + KasparoVy: + - bugfix: Fixes markings overlaying underwear. + - rscadd: Nude icon in underwear.dmi + - bugfix: Fixes Vox robes not using the correct on-mob sprites. + - bugfix: Fixes unreported bug where there was a slim chance during character preview + icon generation that a character with Security Officer set to high would get + rendered with either the wrong beret sprite or no beret sprite at all. + - bugfix: Fixes an issue where Sigholt's fluff beret wasn't using the correct sprites. + Tastyfish: + - bugfix: Passively power-consuming borg modules, such as the peacekeeper movement + and shield module, won't spam the user infinitely if they're low on power anymore. +2016-01-29: + Crazylemon: + - bugfix: 'The DNA scanner has now undergone a seminar to recognize fake identities; + It will now scan the actual person''s identity, rather than their disguise (read: + wearing a mask with or without someone else''s ID).' + - rscadd: Matter eater now allows you to eat humans as if you were fat. + - tweak: Eating mobs with an aggressive grab now generates attack logs. + Crazylemon64: + - bugfix: For a short while, there was a clerical error where all AI communications + equipment was replaced with bananas. This has now been fixed. + - tweak: Ghosts can now see the contents of smartfridges and look at the drone console + - tweak: Humans now only produce one message when shaken while SSD + - bugfix: The supermatter no longer will irradiate everyone, everywhere, when it + explodes. + - tweak: Writing on paper will now add hidden admin fingerprints, so that you can't + forge mean notes in someone else's name. + - bugfix: Brains are no longer able to escape their brain by being a sorcerer. + - bugfix: Astral projecting with other runes on the same tile will now no longer + prevent you from re-entering + - bugfix: Voxxy that is become ex-voxxy no longer carry voxxy appearance! yaya! + FalseIncarnate: + - tweak: Allows plants to be identified as enhanced*. Enhancing plants results from + using reagents (like saltpetre) that affect the stats of a seed instead of using + mutagens/machines. *May not meet standards for being classified as "organic + produce". (This was already possible, just renames enhanced plants for easier + differentiation) + Fox McCloud: + - bugfix: Fixes mutadone not working with some genetic mutations + - bugfix: Fixes banana honk and silencer being alcoholic + - bugfix: Fixes Kahlua being non-alcoholic + - bugfix: Fixes polonium not metabolizing + - bugfix: Fixes being able to receive free unlimited boxes from the Merchandise + store + - rscadd: Adds in wooden bucklers + - tweak: Re-adds roman shield to the costume vendor + - tweak: Buffs Riot shield damage from 8 to 10 + - rscadd: Adds in a Skeleton race + - tweak: Tweaks the skeletons colors to be more realistic and to blend in less with + the floor + - rscadd: Adds in lichdom spell for the wizard + - rscadd: Adds in lesser summon guns spell for wizard + - rscadd: adds in Mjolnir and the singularity hammer as weapons the wizard can purchase + - rscadd: Wizard can purchase the charge spell from the spell book + - rscadd: Wizard can purchase a healing staff from the spell book + - tweak: Tweaks and lowers spell costs of utility spells for wizard + - tweak: Re-organizes the spellbook to be better divided into categories and have + a better window size + - tweak: Knock now opens+unlocks lockers + - tweak: Magic Missile has a slightly longer cooldown and no longer deals damage, + but has a lower cooldown is upgraded + KasparoVy: + - rscadd: Navy blue Centcom Officer's beret for use by the Blueshield. + - rscadd: Adds the new navy blue beret to the Blueshield's locker. + - tweak: Gives the Blueshield's berets (black and navy blue) the exact same strip + delay and armour as the Security Officer's beret. + - rscadd: Adds TG energy katana back and belt sprite. + - rscadd: Bo staff back sprite. + - tweak: Adjusts energy katana sprites to make the weapon stand out a bit more from + the regular katana. + - rscadd: Cutting open the toes of footwear so species with feet-claws can wear + them. + - rscadd: Toeless jackboots. + - tweak: Cleans up glovesnipping and lighting a match with a shoe. + - tweak: Lighting a match with a shoe produces a more appropriate message, handled + at the same standard as glove-snippingboot-cutting. + Tastyfish: + - rscadd: Cargonia now has its own section in the manifest. + TheDZD: + - rscdel: Due to budget cuts and reports of operatives accidentally firing enough + bullets to reach a state of what our scientists refer to as "enough dakka," + Syndicate High Command has decided to restore the Syndicate Strike Team arsenal + to using standard-issue L6 SAW ammunition. +2016-01-31: + Crazylemon64: + - bugfix: Syndicate borgs can now interact with station machinery + - rscadd: People with slime people limbs can now *squish + - tweak: Skrell's vulnerability to alcohol is checked on their liver, now - a liver + transplant will let them take alcohol like a champ - lacking a liver will have + the same effect as being a skrell, when drinking + FalseIncarnate: + - rscadd: Adds in the Magic Eight Ball toy, found in Claw Game prize orbs. + - rscadd: Adds in the Magic Conch Shell, an admin-only shell of power. + Fox McCloud: + - rscadd: Updates Summon Guns and Magic to include many of the new guns + - tweak: Summon Guns/Magic can no longer be used during Ragin' Mages + Tastyfish: + - rscadd: The emergency shuttle status in the Status tab now has ETA/ETD/etc like + before. + - tweak: Code Gamma+ now has a 5 minute emergency shuttle call, like Red. + pinatacolada: + - rscadd: Adds NanoUI to the operating computer + - rscadd: Adds health announcing, critical and oxygen damage aural alerts to the + computer, with a menu to selectively turn them on and off +2016-02-10: + Crazylemon64: + - tweak: The cloner now checks for NO_SCAN on the brain when scanning - unclonable + species are now truly unclonable. You are still able to revive them with a brain + transplant and a defib, however. + - rscadd: A tier-4 DNA scanner linked to a cloning system will now be able to reproduce + a body from a brain's DNA, in event of the original corpse being gibbed or similar. + - bugfix: Species with organic limbs and NO_BLOOD will no longer bleed (though still + on hit - write that off as "bone powder") + - tweak: Skeletons now lack internal organs, except for the runic mind which exists + in their head - an analogue for the brain + - rscadd: Skeletons that drink milk will be regenerated at a moderate pace, have + a small chance of mending bones, and will praise the great name of mr skeltal + - tweak: Adds a reagent system for species reacting to specific reagents + - rscadd: Slime People can now select from all human hairstyles, and their "hair" + will be tinted a shade of their body. + - tweak: Increases the frequency of the cortical borer event. + - tweak: People with borers cannot commit suicide - this applies to a controlling + borer, too. + - tweak: Borers can no longer overdose their hosts. + - tweak: Borers can now inject Saline-Glucose, Spaceacillin, Hydrocodone, Mitocholide, + Salbutamol, Capulettium+, and Charcoal. Styptic was removed, as it's pathetic + at healing when directly injected. Salicyclic acid was removed too, as its functionality + is duplicated by both hydrocodone and saline-glucose. + - bugfix: A mind trapped by a cortical borer can now understand things it could + understand when normally in its body. + - rscadd: Changes chemistry's welding tank to a wall-mounted version, to increase + the room available. + - rscadd: You can now gib butterflies and lizards with a knife + - rscadd: Ghosts can now follow mecha + - bugfix: You can now access an R&D console by emagging it - it did nothing before. + - bugfix: Walls will now properly smooth and show damage. + - bugfix: Fixes the dialog that occurs when the AI shuts off to actually do what + it says it does + Fox McCloud: + - bugfix: Fixes not being able to attach IEDs to beartraps + - bugfix: Can no longer spamclick someone to death using headslamming on a toilet/urimal + - tweak: Toilet/urinal headslamming now plays a sound + - tweak: Toilet headslamming damage reduced slightly + - rscadd: Can now fill open reagent containers in a toilet to receive "toilet water". + - tweak: No more message spam when someone fills a container using a sink + - rscadd: Can now wash your face using a sink, which washes away lipstick and wakes + you up slightly + - tweak: Washing things will now use progress bars + - tweak: Ensures consuming a single syndicate donk pocket won't get you addicted + to meth + - tweak: Kinetic Accelerators and E-bows automatically reload + Glorken: + - rscadd: Added a Knight Arena for Holodeck. + - imageadd: Added red and blue claymore sprites. + - spellcheck: Changed overrided to overrode when emagging Holodeck computer. + KasparoVy: + - rscadd: Vox versions of the Officer SWAT sechailer + HOS SWAT sechailer + Warden + SWAT sechailer. + - rscadd: Resprited versions of most Human masks to fit Unathi, Tajara and Vulpkanin. + - rscadd: Warden now gets their own version of the SWAT sechailer in their locker. + - tweak: HOS now gets the appropriate version of the SWAT sechailer in their locker. + - tweak: Repositioned smokeables now available for Vox, Unathi, Tajara and Vulpkanin. + - tweak: Properly shades Vox bandana down-state sprites. + - rscadd: Readds Tajaran bald hairstyle. + - rscadd: Alternate style of non-Human breath mask (incl. surgical/sterile mask) + down-state positioning. + - tweak: Corrects all non-Human species' breath mask (incl. surgical/sterile mask) + down-state icons to use the right position style. + - tweak: Minor adjustments to Tajaran breath mask up-state sprites. + PPI: + - rscadd: Adds a reconnect button to the File menu in the client. + - rscadd: Adds head patting + Regen: + - tweak: Powersink can now drain a lot more power before going boom + - tweak: Buffed the powersinks drain rate + - tweak: Buffed explosion from an overloaded powersink, try to find it instead of + overloading the grid. + - rscadd: Admin log warning before the powersink explodes + Spacemanspark: + - rscadd: Miners can now utilize the power of mob capsules to take along their lazarus + injected mining creatures! + - rscadd: Store your Pokemo- er, sorry, I mean mining mobs that you've captured + in the lazarus capsule belt. + Tastyfish: + - bugfix: Species that don't breathe can kill themselves now! + - rscadd: Suicide messages are now catered to your species. + - tweak: Shortened the default pill & patch name when using the ChemMaster. + - rscadd: The chaplain now has a service radio headset, as Space Jesus intended. + TheDZD: + - tweak: When Ahelping, "Question" is now "Mentorhelp" and "Player Complaint" is + now "Adminhelp." + - tweak: Mentorhelps and PM replies from mentors appear in a bold aqua blue color. + - tweak: Adminhelps and PM replies from admins appear in a bold bright red color. + - tweak: PM replies from players appear in a dull/dark purple color. + - rscadd: Adds admin attack log to players being converted to cult. + - rscadd: Adds shadowling thrall jobbans. + - rscadd: Jobbanned players who are converted to shadowling thrall, revolutionary, + or cultist will have the control of their body offered up to eligible ghosts. +2016-02-13: + Crazylemon64: + - tweak: Relaxes the check on what atoms you can follow to any movable atom + - tweak: Mages are now more ragin + - tweak: Admins can now adjust the total number of wizards at runtime by tweaking + either max_mages, or players_per mage + DaveTheHeadcrab: + - rscadd: Adds new worn icons for duffelbags to better reflect their size, compliments + of WJohn at /tg/ + FalseIncarnate: + - rscadd: Adds burritos, made from cutlets, beans, rice, capsacin oil (hotsauce), + cheese, and flat dough (because we lack proper tortillas) in the microwave. + - rscadd: Adds chimichangas. You know you want a deep-fried burrito. + Fox McCloud: + - tweak: Updates some spell icons with better/higher quality icons + - tweak: Updates unarmed attacks to allow for more customization + - tweak: Updates martial arts so they factor in specie's attack messages and sounds + - tweak: Re-balances Sleeping Carp fighting style + - tweak: Re-balances Bo Staff + - tweak: 'Rebalances Golem: they should now be spaceproof, fire+cold proof, rad + proof, virus immune, clonable, parapen+syringe gun immune, deal increased melee + damage. Their armor has been reduced to 55 melee across the board, their slip + immunity removed, pain immunity removed, and they''re slightly slower' + - bugfix: Fixes Ei Nath generating two brains + - bugfix: Ensures the Necromatic Stone generates actual skeletons + - bugfix: Can now strip PDA/IDs from Golems + - bugfix: Fixes sleeping carp grab not being an instant aggressive grab + - bugfix: Fixes an exploit with declaring war on the station + KasparoVy: + - rscadd: Orange and purple bandanas for all station species. + - rscadd: The ability to colour bandanas with a crayon in a washing machine. + - tweak: Refactors the bandana adjustment system. + - tweak: Minor adjustments to Tajaran and Unathi bandana east/west sprites. + - tweak: Adjusting a bandana will now take if off of your head/face and put it in + an available hand. If both hands are available, it goes in the selected hand. + - bugfix: Adjusting a coloured bandana will no longer revert it to the original + coloured icons anymore. + - bugfix: Adjusting a bandana from mask-style to hat-style means the bandana won't + obscure your identity anymore. + - rscadd: Greys now use re-positioned smokeables. They no longer smoke out the eyes. + TheDZD: + - bugfix: Fixes spacepods being able to shoot through walls. + - tweak: Lowers spacepod weapons fire delay. + - tweak: Increases spacepod weapons energy costs. + - tweak: Makes spacepods move at speeds not rivaling those of photon beams. They + are now a hair bit faster than a person with a jetpack. + - tweak: Reduces battery costs for spacepod movement. +2016-02-24: + Crazylemon64: + - tweak: The defib should be more reliable on people who have ghosted + - tweak: The defib will now give a message if the ghost is still haunting about + - rscadd: Attacking someone with an accessory will now let you put things on them + without having to strip them. + - bugfix: Borers will now properly detach upon death of a mob they are controlling + - tweak: Borers can now see their chemical count while in control of a mob + - rscadd: Borers can now silently communicate with their host - this is not available + to the host until the borer has either begun to communicate, or has taken control + at least once - this is to avoid spoiling that the borer exists + - tweak: Borers won't be able to talk out loud inside of a host, by default - they + can remove this safeguard with a verb under their borer tab. Borer hivespeak + is unaffected. + - tweak: Borers infesting and hiding are now silent. + - tweak: Made borer's chem lists more nicely formatted + - bugfix: No more superspeed attacking simplemobs + - tweak: New players now show up properly under the "who" verb when used as an admin + - rscadd: Mining drones will now automatically collect sand lying around + - bugfix: RIPLEYs can now drill asteroid turfs for sand + - rscadd: You can now load exosuit fuel generators with items containing their material + - this means you can fuel yourself off of ores, but this will be highly inefficient + and cost you mining points later on, as you can't take fuel back out. + - rscadd: You can now load the fuel generators from an ore box. + - tweak: The plasma generator now produces 3x as much power from the same amount + of fuel - this lets it even remotely compete with the uranium generator. + - tweak: You can now light cigarettes off of burning mobs. + - tweak: Exosuit tracking beacons now fit in boxes - prior, they were far too large + for even a backpack, as they shared the same size as all other mecha equipment + - tweak: Miners can now collect ore by walking over it with an ore satchel on. + FalseIncarnate: + - rscadd: Adds prize tickets as a replacement for physical arcade prizes. + - rscadd: Adds a buildable prize counter to exchange tickets for prizes. + - rscadd: Adds a bike. Despite what Prof. Oak might claim, you can ride it indoors. + - rscadd: Adds colorful wallets, for that old school arcade pride. + - bugfix: Fixes accidental removal of plump helmet biscuit recipe. + - rscadd: Temporarily adds a prize counter to the bar (Cyberiad) or dorms (MetaStation), + and adds a max upgrade one to the Ninja Holding Area (Cyberiad z2) + - bugfix: Fixes Metastation. Seriously fixed a lot, just read the PR description + for the full list. + FlattestGuitar: + - rscadd: Adds IPC alcohol and a few derivative drinks + - tweak: IPCs can now drink and be fed from glasses + Fox McCloud: + - tweak: Laser eyes mutation no longer drains nutrition + - tweak: 'splits the EMP kit into two things: the standard EMP kit (2 grenades and + an implant), and the EMP flashlight by itself' + - tweak: nerfs heart attacks so they do less damage + - tweak: Pickpocket gloves now put the item you strip into your hands as opposed + to the floor + - tweak: Picketpocket gloves can now silently strip accessories + - tweak: Pickpocket gloves will no longer give a message for messing up a pickpocket + KasparoVy: + - bugfix: Adjusting masks while they are not on the face will no longer turn off + internals. + - bugfix: Adjusting masks while they are not on the face will now cause the mask + to hide/reveal the wearer's identity the next time it's worn as intended. + - rscadd: Adds the ability to open/close bomber jackets. + - rscadd: Adds a security bomber jacket. This jacket inherits the protection and + storage capabilities as a standard Security vest with additional bomber jacket + benefits. + - rscadd: Adds UI button in top left of screen for jacket adjustment. + - tweak: Replaces the standard bomber jacket in the Pod Pilot bay with the Security + version. + - tweak: Centralizes jacket/coat adjustment handling. + - tweak: All jackets start closed by default. + - rscadd: Geneticist duffelbag on-mob sprite (for all species). + - rscadd: Vox-fitted backpacks, satchels, ERT backpacks, duffelbags and defib unit. + - tweak: Refactors back-item icon generation. + - bugfix: Typo in the description of Santa's sack. + - bugfix: Missing punctuation and gender macros in the description of the bag of + holding. + - bugfix: The tweak to back-icon generation fixes a bug where the wrong sprite name + was being used to generate back-item icons. + PPI: + - rscadd: Adds the ability to hide papers in vents. You can now leave a romantic + love letter, exchange information in secret, or hide papers infused with the + power of nar'sie from sight. + Regen1: + - rscadd: Adds the Immolator laser gun, a modified laser gun with 8 shots that will + ignite mobs, can be made in R&D + Spacemanspark: + - rscadd: Adds *yes and *no emotes to Synthetics. Glory to Synthetica. + Tastyfish: + - tweak: The PDA system has been completely redone behind the scenes! It should + be functionally similar, although there is now a Home and Back button at the + bottom as appropriate. + - rscadd: All of the heads now have multicolored pens. + - rscadd: EngiVend now has 10 camera assemblies. + - tweak: Borgs can now use vending machines. + - rscadd: There are now picture frames that can be made from the autolathe or wood + planks for papers, photos, posters, and canvases! + pinatacolada: + - tweak: Makes the Protect Station AI law board no longer consider people that damage + the station crew, instead of human + ppi: + - tweak: When revealed Revenants will not be able to move at the maximum move speed, + nor be able to pass through any solid object, like walls, windows, grills, computers + and mechs. +2016-02-26: + FalseIncarnate: + - tweak: Chocolate can now make you fat, as expected. + Fox McCloud: + - tweak: stamina damage now regenerates slightly faster + - rscadd: Adds in whetstones for sharpening objects + - tweak: Kitchen vendor starts off with 5 salt+pepper shakers + - tweak: Can now point while lying or buckled + - bugfix: Fixes Capulettium Plus not silencing + - bugfix: Fixes slurring, stuttering, drugginess, and silences last half of what + they should + KasparoVy: + - bugfix: Jackets that start open are recognized as actually being open already + now. This fixes a bug with certain items that don't have an open state, or cases + where it ended up giving an item the wrong icon (one that didn't exist) + Spacemanspark: + - bugfix: Fixes synthetics from giving off the proper message in the chat box when + using the *yes and *no emotes. + Tastyfish: + - rscadd: Wheelchairs, janicarts, and ambulances can now go through doors according + to the user's driver's access. +2016-03-07: + Crazylemon64: + - rscadd: People with VAREDIT can now write matrix variables + - rscadd: People with VAREDIT can now modify path variables + - tweak: Refactors the variable editor code somewhat. + - rscadd: The buildmode area tool now shows reticules of what you've selected. + - bugfix: Switching mobs while using the buildmode tool no longer screws up your + UI. + - tweak: Refactors buildmode so it's no longer a special-case system. + - rscadd: Adds a copy mode to build mode, which lets you duplicate objects. + - tweak: Any mob in buildmode can work at the fastest possible rate. + - bugfix: Fixed a problem where the icons of a person would not correctly update + when changing gender. + - tweak: One's hairstyle only adjusts on gender change if it's incompatible with + your new gender. + - bugfix: Fixed a bug where a person's icon would only be updated if their sprite + had a new layer added or removed. + - bugfix: You no longer lose your name when monkeyized and reverted - you'll still + look like a monkey while you're a monkey, though. + - bugfix: Your organs will now match your gender when you are cloned. + - bugfix: Skeletons (when a body rots) no longer retain a fleshy torso. + - bugfix: Putting people in an active cryotube now produces the message on insertion, + rather than release. + - bugfix: An EMP'd cloning pod will now display its sprites correctly. + FalseIncarnate: + - tweak: Water Balloons can be filled from more sources than just beakers and watertanks. + Fox McCloud: + - bugfix: Fixes the "yeah" glasses so the sound doesn't vary and a message is displayed, + on use + - bugfix: Noir mode only activates when the glasses are equipped to your actual + eyes + - rscadd: Noir Glasses mode can be toggled on or off (defaults to off) + - bugfix: Mimes can no longer use spells and continue speaking + - tweak: Mime abilities are now spells with proper icons + - tweak: Mime wall now last 30 seconds, up from 5 + - tweak: forecfields/invisible walls now block air currents + - rscadd: Adds the Sleeping Carp scroll to the uplink for 17 TC + - bugfix: Fixes Shadowlings being able to use guns + - bugfix: Fixes sleeping carp scroll users being able to use guns + - bugfix: Fixes the Experimentor throwing one item at a time + - tweak: Experimentor menu now automatically refreshes after use + - tweak: Lowers surgery times across the board + - tweak: Removes scalpels causing 1 damage on successful surgery + - tweak: Removes random chance to fracture ribs on a successful surgery + - tweak: Mining drills now have an edge + KasparoVy: + - tweak: Jackets who have the verb available but are not intended to be adjusted + will not have the action button available. + - bugfix: You can now adjust breath masks while buckled into beds and chairs. + - bugfix: Known issues with adjusted jackets using the wrong sprites. + - rscadd: Blueshield coat in hand and item icons. + - rscadd: Hulks now rip apart adjustable and droppable jackets. The items stored + in the jackets get dropped on the ground. + Tastyfish: + - tweak: Infrared emitters can now be rotated while already in an assembly via the + UI popup. + - tweak: The infrared emitter can no longer be hidden inside of boxes and still + work. + - rscadd: The beach now has a border and is splashier. + - rscadd: Gives Psychiatrist a paper bin, clipboard, and multicolored pen. + - rscadd: Gives the Librarian / Jouralist a multicolored pen. + - rscadd: Gives the NT Representative a clipboard. + - tweak: The ethanol-based neurotoxin drink is now called Neuro-toxin to avoid being + confused with the deadly toxin. + VampyrBytes: + - bugfix: Fixes emotes ending with s needing 2. Emotes now work with grammatical + options eg ping or pings, squish or squishes + - tweak: Updated emote help with missing emotes. Help will also show any species + specific emotes for your current species +2016-03-08: + Crazylemon64: + - tweak: Slime people are now more vulnerable to low temperatures. + - rscadd: Slime people are able to slowly regrow limbs at a high nutrition cost. + - rscadd: Slime people now slowly shift color based on reagents inside of them - + disabled by default, toggle it with an IC verb + - tweak: Slime people's cores are more vulnerable to damage + - bugfix: Species-related abilities now properly are removed - no more vox hair + stylists, unfortunately. + Fethas: + - bugfix: the nest buckle now looks for the right organ path + - bugfix: Fixed some sprites. + - bugfix: No more putting no drops in rechargers, + Fox McCloud: + - soundadd: Implement's goon's gibbing sound + - soundadd: Implement's goon's gibbing sound for robots/silicons + - sounddel: Removes old gibbing sound + Spacemanspark: + - rscadd: Lazarus Injector's can now be emagged to activate their special features, + alongside using EMPs on them. + Tastyfish: + - rscadd: Mimes now have a new ore, Tranquillite, used to bring peace and quiet + to the station. + - rscadd: There are also permanent invisible walls and silent floors that can be + made from tranquillite. + - rscadd: The Recitence mech is now buildable! + - tweak: The Recitence mech is now playable! + - tweak: Mid-round selection for various creatures and antagonists now consistently + asks permission. + TheDZD: + - rscadd: Adds justice helmets with flashing lights and annoying sirens. + - rscadd: Adds crates containing said helmets. + - rscadd: Also includes a version of the helmet that can only be spawned by admins, + and just has a single red light in the center instead of the stereotypical police + blinkers. + monster860: + - bugfix: Space pod transitions are now fixed. +2016-03-16: + Crazylemon64: + - tweak: Being in godmode now makes you immune to bombs + - rscadd: Science members now get compensated when they ship tech disks to centcomm. + - rscdel: Science crew are no longer paid when they "max" research. + - bugfix: Roboticists now get credit for making RIPLEYs and Firefighters + - tweak: Slime people can now regrow limbs on a more lax nutrition requirement + - tweak: Enhances the nutripump+ to let slime people regrow limbs with it active + - bugfix: Skeletons, slime people, IPCs, and Diona no longer leave blood when hit + - bugfix: Rejuvenating a slime person will no longer clog up their "blood" + - tweak: Slime people will now regenerate "blood" from having water in their system + - tweak: The decloner can now be created again + - rscadd: Environment smashing mobs can now destroy girders. + DaveTheHeadcrab: + - tweak: Removes the check for species on the update_markings proc. + FalseIncarnate: + - tweak: Xeno-botany is now more user-friendly, and less random letters/numbers. + - rscadd: Hydroponics now has a connector hooked up to the isolation tray and a + new connector in their back room for those strange plants that like spewing + plasma or eating nitrogen. + - rscadd: You can now (finally) build the xeno-botany machines, and science can + print off their respective boards. + Fethas: + - tweak: Syringes are no longer sharp + - bugfix: byond likes direct pathing so item/organ/internal not item/organ even + if it shouldn't be in the internal_organs list. This was preventing the list + from doing stuff correctly. + - tweak: fixed ipc organ manipulation surgery, you can now insert a replacment ipc + organ directly instead of needing a screwdriver in your main hand + - bugfix: nanopaste now will repair organs with robotic >= 2 instead of > 2 cuase + i am an idiot + - bugfix: Fix, hopefully, for a runtime for clientless mobs whos head are cut off... + - bugfix: Hopefully fixes issues with diona eyes + - bugfix: Though shalt not eat robotic organs..including cybernetic implants.. + - bugfix: ITS SURGERY_STEP/DETHRALL NOT SURGERY_STEP/INTERNAL/DETHRALL + FlattestGuitar: + - rscadd: Adds three new synthanol drinks + - tweak: Drinking synthanol is now a bad idea if you're organic + - tweak: A glass of holy water now looks like normal water + Fox McCloud: + - soundadd: Adds in drink fizzing sound + - tweak: Drink/bartender recipes use this new fizzing sound in addition to a few + other recipes + - soundadd: Adds in a fuse burning sound + - tweak: Bath salts, black powder, saltpetre, and charcoal use this sound now + - soundadd: Adds in a matchstrike+burning sound + - tweak: Lighting a match triggers this new sound + - soundadd: Adds in scissors cutting sound + - tweak: Cutting someone's hair uses this new sound + - soundadd: Adds in printer sounds + - tweak: printing off papers from various devices typically uses these sounds + - soundadd: Adds computer ambience sounds + - tweak: black box recorder and R&D core servers both play this sound at random + rare intervals + - tweak: Reduces the tech level (and requirement) for nanopaste + - tweak: Reduces the tech level (and requirement) for the plasma pistol + - tweak: Removes Nymph and drone tech levels + - tweak: Reduces tech levels on the flora board + - tweak: Adds tech level requirements to mech sleepers, mech syringe guns, mech + tasers, and mech machine guns + - tweak: Increases tech cost of the decloner + - tweak: Removes the pacman generators + - tweak: Removes emitter + - tweak: Removes flora machine (functionless anyway) + - tweak: Removes the pre-spawned nanopaste + - tweak: Removes space suits + - tweak: Removes excavation gear + - tweak: Replaces the soil with actual hydroponic trays (more aesthetic than anything) + - tweak: Removes most external asteroid access from the station + - tweak: Excavation storage is now generic science storage + - tweak: removed the plasma sheet + - bugfix: Fixes augments not showing up in R&D unless specifically searched for + - bugfix: Fixes some augments being unavailable in mech fabs + - bugfix: Fixes augments having no construction time + - bugfix: Fixes xenos not gaining plasma when breathing in plasma + - bugfix: Fixes plasma reagent not generating plasma for a person + - rscadd: Screaming has different sounds based on being male or female + - soundadd: Implements Goon's screaming sounds. + - rscadd: Screaming tone is now based on age of character instead of being random + - tweak: Ups the cooldown on screaming from 2 seconds to 5 seconds + - tweak: Removes chance for Whilhelm scream + - rscadd: Borgs can now scream + - rscadd: Monkey's now have a unique screaming sound + - rscadd: IPCs now scream like cyborgs + - rscadd: Updates slot machines to have higher jackpots and more payouts with more + interesting sounds + - rscadd: 'Adds X-Ray, Thermal, Anti-tun, and Reviver implants to the nuke ops uplink + (augments come with one auto-implanter) rcsadd: Adds in augment auto-implanter, + which inserts and implant without surgery' + - tweak: tweaks a large number of chems; behaviors are largely retained, but new + flavor messages, probabilities, etc may be present; overall, you can expect + chems to do the same thing + - tweak: 'Tabun re-replaced with Sarin rcsadd: New reagent: cholesterol: if overdosed + on, it can cause a heart attack--fatty foods, cheese, eggs, and some meats all + produce cholesterol in your body.' + - rscadd: Mixing Sarin, Meth, or Cyanide will poison in a very small area of the + reaction if you're not on internal OR not wearing a gas mask + - rscadd: Chemist warddrobe now has two gas masks + - tweak: Teslium will now impact synthetics AND organics + - bugfix: Fixes facehuggers hugging already infected people + - bugfix: Fixes facehuggers hugging people while dead + - bugfix: Fixes Embryo's developing twice as fast as they should + - bugfix: Fixes up some behaviors with xeno eggs + - tweak: Xeno acid can now melt through floors and the asteroid + - rscadd: Xeno's now play the gib sound when actually gibbed + - rscadd: Implements Changeling headcrabs/headspiders + - bugfix: Fixes xenos not throwing their organs when gibbed + - bugfix: Fixes swallowed mobs not being ejected when a human is gibbed + - rscadd: Adds in spider eggs reagent, an infectious reagent that requires surgery + to correct + - bugfix: Fixes EMPs causing eye implant users to be permanently blind + - tweak: Increases bag of holding's storage capacity + - rscadd: Removing a heart no longer kills the patient instantly, but induces a + heart attack + - bugfix: Demon hearts will not work + - bugfix: Should now actually be able to re-insert hearts + - rscadd: Reworks addictions to bettter differentiate them betweeen overdosing and + make them more realistic. + - tweak: 'changes which chems are addictive, currently, the follow reagents are + now addidctive: meth, crank, krokodil, bath salts, space drugs, perfluoradecalin, + omnizine, coffee, nicotine, fliptonium, ultra lube, surge, fake cheese, weird + cheese, ephedrine, diphenhydramine, teporone, and morphine' + - rscadd: sleepers help you recover from addiction faster + - rscadd: Can now make cable coils in autolathes + - bugfix: Fixes the slot machine announcements not displaying properly + Tastyfish: + - tweak: The super fart mutation now gives you a spell-like ability instead of augmenting + the emote. + - tweak: Vampire abilities are now in their own Vampire tab, as well being action + buttons at the top, like spells. + - bugfix: Cloning a vampire no longer makes them lose their abilities. + - bugfix: Vampires can no longer hypnotize chaplains. + - bugfix: Being a full vampire (500+ total blood) actually makes you immune to holy + water reliably now. + - rscadd: 'Some old away missions are back: Academy, Black Market Packers, Space + Hotel, Station Collision, and Wild West. Go out and round up some hostiles!' + - bugfix: Shuttle consoles now pair up to the engineering, mining, research, or + labor shuttle when built or used before pairing, as long as the shuttle is near + the console, or the shuttle is moved to be nearby. + monster860: + - rscadd: Mining station now has a podbay. + - rscadd: Ore scooping module for the spacepod. + - rscadd: 'Three mining lasers for spacepod: Basic, normal, and burst.' + - bugfix: Shooting weapons south or west of spacepod will actually hit adjacent + targets now, and won't shoot through walls anymore. + taukausanake: + - rscadd: Mice can now be picked up like diona +2016-03-22: + Crazylemon64: + - bugfix: Repairs all sorts of eldritch occurences that happen when you put an organic + head on an IPC body, as well as some decapitation bugs + - bugfix: Makes heads keep hair on removal + - bugfix: Amputated limbs from a DNA-injected individual now will keep their appearance + of the DNA-injected person + - bugfix: Wounds will vanish on their own now + - rscadd: Admins now have an "incarnate" option on the player panel when viewing + ghosts for quick player instantiation + - bugfix: Fixes a runtime regarding failing a limb reconnection surgery + - bugfix: Copying a client's preferences now overrides the previous mob's DNA + - bugfix: A DNA injector is now more thorough, and affects the DNA of mobs' limbs + and organs + - bugfix: DNA-lacking species can no longer be DNA-injected + - bugfix: Brains are now labeled again + - rscadd: Splashing mitocholide on dead organs will make them live again. + - rscadd: The body scanner now detects necrotic limbs and organs. + - bugfix: pAIs and Drones are now affected by EMPs and explosions while held. + Fethas: + - rscadd: Adds a surgery for infection treatmne/autopsys that is simply cut open, + retract, cauterize + - bugfix: fixes a dumb error in internal bleeeding surgerys + - rscadd: Chaos types no longer random teleport, but will make the target hallucinate + everyone looks like the guardian. + FlattestGuitar: + - rscadd: Adds a snow, navy and desert military jacket. + Fox McCloud: + - tweak: Removes random 1% chance to heal fire damage + - tweak: Removes passive healing from resist heat mutation + - tweak: Regen mutation heals every cycle (albeit less, on average), but doesn't + cost hunger + - bugfix: Fixes not being able to speak over xeno common or hivemind when you receive + the Xeno hive node + - rscadd: Adds in the ability to transfer non-locked metal+glass only designs from + the protolathe to autolathe + - tweak: Changes Outpost Mass Driver to prevent accidental spacings + - tweak: Shadow people no longer dust on death, are rad immune+virus immune, and + can be cloned. Slip immunity removed + - tweak: Shadowlings no longer get hungry or fat and no longer dust on death + KasparoVy: + - rscadd: The ability to change your head, torso and groin as an IPC in the character + creator. Non-IPCs cannot access the parts. + - rscadd: Head, torso and groin sprites for all mechanical limb/bodypart brands + but Morpheus and the unbranded ones (since those already exist) from Polaris. + - rscadd: Faux-eye optics for non-Morpheus heads. + - rscadd: The ability to change optic (eye) colour if you've got a non-Morpheus + head. + - rscadd: The ability to choose human hair styles (wigs) and facial hair styles + (postiche) with non-Morpheus heads. Non-Morpheus heads cannot choose screens. + Conversely, Morpheus heads cannot choose wigs or facial hair. + - rscadd: Two hair styles from Polaris. + - rscadd: The ability for IPCs to wear undergarments (shirts and trousers). + - rscadd: Antennae (colourable) for IPCs. + - tweak: IPC monitor adjustment verb will now adjust optic colour if the head is + non-Morpheus. + - bugfix: Combat/SWAT boots can now be toecut and jacksandals can't. + - bugfix: ASAP fix to what would've broken the ability to configure prostheses in + character creation. + - bugfix: Adjusted masks no longer block CPR (including bandanas). + - bugfix: You can no longer run internals from adjusted breath masks (or airtight + adjustable masks in general). + Regens: + - tweak: Robotic hearts will now properly give the mob a heart attack instead of + just damaging it when EMP'd + - rscadd: Assisted organs will now also take damage from EMP's + - bugfix: Internal robotic and assisted organs will now actually take damage from + EMP's + Tastyfish: + - rscadd: Adds PDA chatrooms. Post memes! Talk to your fellow collaborators! Get + caught! + - tweak: You can now set the PDA messenger to automatically scroll down to new messages. + - rscadd: Pet collars now act as death alarms and can have ID's attached to them. + - tweak: All domestic animals can now wear collars. + - rscadd: You can now make video cameras at the autolathe. + TheDZD: + - bugfix: Fixes an instance of old code being so incredibly, unbelievably, makes-me-want-to-stab-myself-in-the-eye-edly + idiotic. + TravellingMerchant: + - imageadd: Kidan have new sprites! + tigercat2000: + - rscadd: Nukeops now have an assault pod, they can use it for 30 TC. Loud and mean. + - bugfix: Lighting overlays can no longer go below 0 lum_r/g/b + - bugfix: Shuttles will work with lighting better. + - bugfix: Wizards can no longer teleport to prohibited areas such as Central Command. +2016-03-25: + Crazylemon64: + - bugfix: You now will actually have the correct `real_name` on your DNA. + - bugfix: No more roundstart runtimes regarding IPC hair. + - bugfix: Mitocholide rejuv will work more usefully now. + - bugfix: Limbs and cyborg modules will no longer appear in your screen. + - bugfix: Cyborg module icons are now persistent throughout logging in and out. + - bugfix: Various cyborg modules, like engineering, now use the proper icon. + FlattestGuitar: + - rscadd: Adds confetti grenades. + Fox McCloud: + - bugfix: Fixes Sleeping Carp combos not having an attack animation + - bugfix: Fixes several chems not properly healing brute/burn damage, consistently, + as intended + KasparoVy: + - bugfix: Unbranded heads and groins no longer invisible. + - bugfix: Zeng-hu left leg will now be in line with the body when facing south. +2016-03-26: + Fox McCloud: + - rscadd: Adds in dental implant surgery. Implant pills into people's teeth. + - tweak: Major rebalance and Shadowling update (https://github.com/ParadiseSS13/Paradise/pull/3986 + for details). In general, Shadowlings can no longer enthrall or engage in Shadowling + like behavior, pre-hatch. Post-hatch, shadowlings are much more powerful, with + a ride array of New abilities such as extending the shuttle or making thralls + into lesser shadowlings. Shadowling gameplay should not revolve almost entirely + around darkness, as opposed to pre-hatch shenanigans. + - rscadd: Robotics now has a "sterile" surgical area for performing augmentations + - rscadd: Adds the FixOVein and Bone Gel to the autolathe + - tweak: ensures all surgical tools have origin tech on them; lowers origin tech + on FixoVein + KasparoVy: + - rscadd: Slime People can now wear underwear. + - rscadd: Slime People can now wear undershirts. + TheDZD: + - tweak: NT has removed trace amounts of a highly-addictive substance from the "100% + real" cheese used in cheese-flavored snacks. As a result, incidence rates of + crewmembers becoming addicted to Cheesie Honkers should reduce to zero. + - tweak: After receiving complaints about crewmembers often being unable to physically + function without a back-mounted barrel of coffee, NT has replaced station all + sources of coffee on the station, including coffee beans themselves with a largely + decaffeinated version. It was funny the first time almost every crewmember aboard + the NSS Cyberiad was lugging around their own oil barrel filled with coffee, + it wasn't so funny, nor good for productivity the eighteenth. +2016-04-02: + Crazylemon64: + - rscadd: Metal foam walls will now produce flooring on space tiles + - bugfix: Syringes will now draw water from slime people. + FalseIncarnate: + - tweak: Let's you know when your container is full when filling from sinks. + - tweak: Prevents splashing containers onto beakers and buckets that have a lid + on them. + - rscadd: Pill bottles can now be labeled with a simple pen. + - tweak: Beakers/buckets (and pill bottles) now accept 26 character labels from + pens. + Fethas: + - tweak: Various spells have had a tweak to stun/reveal/cast, some other number + stuff... + - rscadd: Nightvision + - tweak: harvest code is now in the abilites file. + - rscadd: New fluff objectives + - bugfix: Hell has recently remapped its blood transit system and you can now once + again crawl through blood. We are sorry for the-GIVE US YOUR SOUL! + FlattestGuitar: + - tweak: Alcoholic beverages now have proper levels of ethanol in them. Good luck + passing out after a beer. + Fox McCloud: + - rscadd: Adds in the Lusty Xenomorph Maid Mob; currently admin only. + - bugfix: Fixes xenomorph brains having the wrong sprite, no origin tech, and incorrect + name + - tweak: removes xenomorph egg from hotel + - tweak: upgrades are no longer needed to for the available toys in the prize vendor + - rscadd: Implements Advanced Camera Consoles. A type of camera console that function + like AI's vision style. Non-buildable/accessible. + - rscadd: Adds in Xenobiology Advance Cameras. A type of camera console that functions + like advanced cameras, but only works in Xenobiology areas; can move around + slimes and feed them with the console as well. Also non-buildable/accessible + (for now). + - rscadd: Adds in cerulean slime reaction that generates a single use blueprint. + On use it colors turfs a lavender color + - rscadd: Adds disease1 outbreak event + - rscadd: Adds appendecitis event + - rscadd: Roburgers now properly have nanomachines in them + - rscadd: Re-adds nanomachines + - tweak: Experimentor properly generates nanomachines instead of itching powder + - bugfix: Fixes big roburgers having a healing reagent in them + - rscadd: Adds nanomachines to poison traitor bottles + - rscadd: Tajarans can now eat mice, chicks, parrots, and tribbles + - rscadd: Vulpkanin and Unathi can now eat mice, chicks, lizards, chickens, crabs, + parrtos, and tribbles + - bugfix: fixes spawned changeling headcrab behavior + KasparoVy: + - bugfix: Incisions made at the beginning of embedded object removal surgery can + now be closed in the same procedure. + ProperPants: + - rscadd: Maint drones have magboots. + - rscdel: Removed plastic from maint drones. Literally useless for station maintenance. + - tweak: Increased starting amounts of some materials for maint drones and engi + borgs. + - experiment: Reduced the number of lines taken by Engineering cyborgs calling on + materials stacks. + - rscadd: Operating tables can be deconstructed with a wrench. + - spellcheck: Fixed and shortened description of metal sheets. + Tastyfish: + - rscadd: Bots can now be controlled by players, by opening them up and inserting + a pAI. *beep + - bugfix: MULEbots can now access the engineering destination. + - bugfix: All MULEbot destinations should now have the correct load/unload direction, + meaning the crates won't be dumped inside the flaps. + - rscadd: Diagnostic HUD's now give health and status information about bots. + - bugfix: MULEbot rampage blood tracks are now rendered correctly and handle UE + traces as appropriate. + - experiment: Bots should (hopefully) lag the game less now. + - tweak: Beepsky contains 30% more potato. + - tweak: Action progress bars are now smooth. + - tweak: Clicking a filled inventory slot's square with an open hand now clicks + the item in the slot. + - rscadd: Status displays now display the time when in Shuttle ETA mode and no shuttle + activity is happening. + - tweak: Shuttle ETA countdowns on status displays are now amber. + - rscadd: pAI's can now use the PDA chatrooms. + - rscadd: Adds treadmills to brig cells, to give the prisoners something productive + to do. + TheDZD: + - rscdel: A lot of the guns and armor in the station collision, space hotel, academy, + and wild west away missions have been removed/replaced. + - rscdel: Removes that fucking facehugger from station collision. + tigercat2000: + - rscdel: Virus2 has been removed. + - rscadd: Virus1 is back. Viva la revolution. + - rscadd: You can now have up to 20 characters. +2016-04-07: + Crazylemon64: + - bugfix: Removes an offset from the advanced virus stealth calculation, causing + viruses to be more stealthy than the sum of their symptoms. + - bugfix: Mulebots will now send announcements to relevant requests consoles on + delivery again. + FalseIncarnate: + - rscadd: Adds logic gates, for doing illogical things in a logical manner. + - rscadd: Adds buildable light switches, for all your light toggling needs. + - bugfix: Fixes a resource duplication bug with mass driver buttons. + Fethas: + - tweak: maybe makes them last longer...maybe..and fixes the event end message + Fox McCloud: + - rscadd: Maps in the slime management console to Xenobio + - tweak: Reduces Xenobio monkey box count from 4 to 2 + - bugfix: Fixes weakeyes having a negligible impact + - rscadd: Can spawn friendly animals with a new gold core reaction by injection + with water + - tweak: Hostile animal spawn increased from 3 to 5 for hostile gold cores + - tweak: Swarmers, revenants, and morphs no longer gold core spawnable + - bugfix: Fixes invisible animal spawns from gold core/life reactions + - rscadd: Adds tape to the ArtVend + - tweak: Can no longer use sentience potions on bots + - rscadd: Added in Plasma Dust reagent, acquired by grinding plasma sheets; it's + more toxic than regular plasma and generates plasma gas when spilled onto turfs. + - tweak: Slimecore reactions now require plasma dust as opposed to dispenser plasma + - rscadd: Added in new Rainbow slime; inject with plasma dust to get a random colored + slime. Acquire by having 100 mutation chance on a slime when it splits. + - rscadd: Monkey Recycler can produce different types of monkey cubes; change the + cube type by using a multitool on the recycler + - tweak: Epinephrine/plasma reagents changing mutation rate has been removed + - tweak: Mutation chance is inherited from slime generation to slime generation + as opposed to being purely random. + - tweak: 'New reactions added for red and blue extracts: red generates mutator, + which increases mutation chance, and blue generates stabilizer, which decreases + mutation chance.' + - tweak: Slime glycerol reaction removed + - tweak: Slime cells are now high capacity cells (more power than before) + - tweak: extract enhancer increases the slime core usage by 1 as oppose to setting + it to three + - tweak: slime enhancer increases slime cores by 1 as opposed to setting the core + amount to 3 + - tweak: Chill reaction lowers body temperature slightly more so it doesn't just + wear off instantly + - tweak: Reduces Xenobio plasma sheets from 8 to 3 and removes that pesky boombox + - bugfix: Processors no longer produce 1 more slime core than intended + - bugfix: Less blank/spriteless/empty foods from the silver core reaction + - tweak: Virology mix reactions now use plasma dust as opposed to plasma + - tweak: Statues can no longer move/attack people unless they're in total darkness + or all mobs viewing them are blinded + - tweak: statues are invincible to anything other than full out gibbing. + - tweak: Statues flicker lights spell range increased + - tweak: Blind spell no longer impacts silicons + - bugfix: Fixes statues being able to attack/move whenever they feel like it, regardless + of client statues + - bugfix: Fixes blind spell impacting the statue + Tastyfish: + - tweak: Beepsky is no longer a pokemon. + - tweak: pAI-controlled Bots now reliably speak human-understandable languages over + the radio. + - rscadd: More floor blood for the blood gods. (Or rather, as much as there was + supposed to be.) + tigercat2000: + - rscadd: Items in your off hand will now count towards access. +2016-04-12: + FalseIncarnate: + - tweak: Adjusting the setting of a vendor circuit board is no longer random, but + instead provides a select-able list. + - tweak: Vendor Circuit Board design moved from the Circuit Imprinter to the Autolathe, + acid requirement replaced by metal. + - bugfix: Burnt matches can no longer light cigarettes, pipes, or joints. + Fethas: + - rscdel: Nukes the cargo train code rscadd:Adds simple vehicle framework and converts + secway/janicart/snowmobiles/bikes/cars/ambulance to it rscadd:Adds space speedbike, + red and blue versions, yes you WILL need a spacesuit rscadd:Maps janicart and + secway onto metastation (but not ambulance no pareamedic garage, no i am not + mapping that) + - bugfix: You should now be able to operate on IPC eyes, SHOULD bugfix:hopefully + surgery on diona works right + Fox McCloud: + - rscadd: Adds in TraitorVamp; game mode that's essentially like TraitorChan, but + with a Vampire instead of a Changeling + - tweak: Vampires cannot use holoparasites + - tweak: Malf AI will automatically lose if it exits the station z-level + Tastyfish: + - tweak: All cats can kill mice now. + - tweak: E-N can't suffocate. + - tweak: Startup time is now shorter. + - rscdel: Removed the Station Collision away mission from rotation, due to multiple + conceptual and technical issues. +2016-04-14: + Aurorablade: + - rscdel: Removes the !!FUN!! of having headslugs gold core spawnable. + Fox McCloud: + - soundadd: Added in sounds (instead of a chat-based message) for when airlocks + are bolted/unbolted + - soundadd: Added in sound for when airlocks deny access + - tweak: cutting/pulsing wires will play a sound + - tweak: ups nuke ops game mode population requirement from 20 to 30 + - rscadd: Adds in mining drone upgrade modules to increase their health, combat + capability, or reduce their ranged cooldowns + - rscadd: Adds in mining drone "AI upgrade" a sentience potion that only works on + mining bots + - tweak: Mining bots should be less likely to shoot you when attacking hostile mobs + - tweak: Killer tomatoes actually live up to their name now and are hostile mobs + - tweak: Killer tomatoes are an actual fruit now; activate it in your hands to make + them into a mob + - tweak: Killer tomatoes are directly mutated from regular tomatoes instead of blood + tomatoes + - tweak: Increased the yield of regular tomatoes by 1 + - tweak: Tweak some stats on the killer tomato seeds + - bugfix: Fixes the blind player preference not doing anything + - rscadd: Adds portaseeder to R&D + - tweak: Scythes will conduct electricity now + - tweak: Mini hoes play a slice sound instead of bludgeon sound + - tweak: Plant analyzer properly has a description and origin tech + - tweak: Can have hulk+dwarf mutations together + - tweak: Can have heat+cold resist together + - tweak: Can only remotely view people who also have remote view + - bugfix: Fixes cold mutation not having an overlay + - bugfix: Hallucinations will no longer tick down twice as fast as they should nor + will they spawn twice as many hallucinations as they should + - bugfix: Incendiary mitochondria no longer asks who you want to cast it on (it + always is meant to be cast on yourself) + - bugfix: Fixes permanent nearsightedness even when wearing prescription glasses + KasparoVy: + - tweak: 'Head accessories now behave like facial hair: They will no longer be hidden + by clothing items that BLOCKHEADHAIR (have the BLOCKHEADHAIR flag).' + - bugfix: Wearing a piece of clothing that blocks head hair will no longer make + head accessories (facial markings/horns/antennae) invisible until an icon update + is triggered while the headwear is off. + Meisaka: + - bugfix: law manager no longer freaks out with Malf law + Tastyfish: + - tweak: The /vg/ library computer interface has been ported, giving a much better + use experience. + - rscadd: Books can now be flagged for inappropriate content. + TheDZD: + - rscdel: Removes shitty Caelcode bees. + - rscadd: Hydroponics can now manage bee colonies, bees produce honeycombs that + can be ground to obtain honey, a decent nutriment+healing chemical + - rscadd: Hydroponics can inject a queen bee with a syringe of a reagent to alter + her DNA to match that reagent, meaning all honeycombs produced will contain + that reagent in small amounts + - rscadd: Bees with reagents will attack with that reagent. It takes 5u of a reagent + to give a bee that reagent. + - rscadd: Added the ability to make Apiaries and Honey frames with wood + - rscadd: Added the ability to make Royal Bee Jelly from 10 Mutagen and 40 Honey + - rscadd: Added the ability to make more Queen Bees from Royal Bee Jelly by using + it on an existing Queen, to split her into two Queens + - rscdel: Removes some snowflakey mob behavior from bears, snakes and panthers. + - rscadd: Hudson is feeling punny. + - experiment: Hostile mob AI should now be a bit more cost-efficient. + monster860: + - rscadd: Adds area editing, link mode, and fill mode to the buildmode tool +2016-04-20: + Crazylemon64: + - rscadd: Bureaucracy crates now contain granted and denied stamps. + FalseIncarnate: + - bugfix: Anomalies will now be properly neutralized by signals that match their + code and frequency, instead of using the default frequency and their code. + FlattestGuitar: + - rscadd: Adds shot glasses. + Fox McCloud: + - tweak: Removes the ability to put a pAI into securitrons and ED-209's + - imageadd: Drinking glasses now have an in-hand sprite + - tweak: DNA injectors no longer have a delay when used on yourself + - tweak: DNA injectors no longer delete on use, but become used, much like auto-injectors + - bugfix: Fixes a bug where you can exploit the genetic scanner to get multiple + injectors + - bugfix: Fixes not being able to cancel creating an DNA injector + - tweak: remove spacesuits causing injections to the head to take longer + - bugfix: FIxes heat resist mutation not making you immune to high pressure, fire, + or high temperatures + - tweak: removes some not-well-known damage resists from cold/heat mutations + - tweak: Re-maps botany a bit to make it more bee and botanist friendly + - rscadd: Adds in Abductors Game Mode + MarsM0nd: + - tweak: Embeded object removal is now done with hemostat again + - rscadd: Borgs are able to do embeded object surgery + Tastyfish: + - tweak: Makes the server startup substantially faster. + monster860: + - bugfix: Crowbarring open a spesspod doors is no longer broken + tigercat2000: + - rscadd: -tg- thrown alerts have been added. This means you get an alert when buckled + or handcuffed or many many other things happen to you. It then gives you a tool + tip when you hover over it, and it may or may not do something when you click + it. Have fun! diff --git a/html/changelogs/AutoChangeLog-pr-4157.yml b/html/changelogs/AutoChangeLog-pr-4157.yml deleted file mode 100644 index 666fbd15625..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4157.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Tastyfish -delete-after: True -changes: - - tweak: "The /vg/ library computer interface has been ported, giving a much better use experience." - - rscadd: "Books can now be flagged for inappropriate content." diff --git a/html/changelogs/AutoChangeLog-pr-4253.yml b/html/changelogs/AutoChangeLog-pr-4253.yml new file mode 100644 index 00000000000..864fbdadc67 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4253.yml @@ -0,0 +1,5 @@ +author: Meisaka +delete-after: True +changes: + - bugfix: "The light on/off function for drones works again, toggling between lowest setting and off." + - bugfix: "Guardians can toggle their lights off and on again." diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 7d87c3d7557..695d701dba3 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/goonstation/mob/inhands/items_lefthand.dmi b/icons/goonstation/mob/inhands/items_lefthand.dmi new file mode 100644 index 00000000000..5702ba238c1 Binary files /dev/null and b/icons/goonstation/mob/inhands/items_lefthand.dmi differ diff --git a/icons/goonstation/mob/inhands/items_righthand.dmi b/icons/goonstation/mob/inhands/items_righthand.dmi new file mode 100644 index 00000000000..9adcb9a22e8 Binary files /dev/null and b/icons/goonstation/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index a67d328271e..6703c61b1b7 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 4f7829c3aac..eeb5ecbbee3 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/human_races/r_abductor.dmi b/icons/mob/human_races/r_abductor.dmi new file mode 100644 index 00000000000..f44da8b9837 Binary files /dev/null and b/icons/mob/human_races/r_abductor.dmi differ diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/guns_lefthand.dmi index e7571df2d11..08e806177e2 100644 Binary files a/icons/mob/inhands/guns_lefthand.dmi and b/icons/mob/inhands/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi index cdd8499b590..eb41182b61c 100644 Binary files a/icons/mob/inhands/guns_righthand.dmi and b/icons/mob/inhands/guns_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 90ea770294e..ba0e34aca9b 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 051b6b6b874..248525081c6 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi new file mode 100644 index 00000000000..7dd4c6561e4 Binary files /dev/null and b/icons/mob/screen_alert.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 844d1b39b69..61a53ab5541 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi index 0896e9a500a..9a171b97645 100644 Binary files a/icons/obj/abductor.dmi and b/icons/obj/abductor.dmi differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index 1bd8373670c..6ab22cb793e 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi index 0f36e755b78..a6c5a43008f 100644 Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index fafdcb56031..3c2ea5a0990 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index d3b1cfa9977..36ba65a32e3 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index 00bd10b184a..11d212a0e55 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 7229e0089df..db105c191d2 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi index 7f14e7f2fe6..94e2f2e7d27 100644 Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 34c75f5ac8b..97ca0e00693 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index 5f1b92c1c2b..85788316c13 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 98e1f035e0a..98e01f18cfa 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/icons/turf/walls.dmi b/icons/turf/walls.dmi index 0028e2c0359..cc0ca3a0eab 100644 Binary files a/icons/turf/walls.dmi and b/icons/turf/walls.dmi differ diff --git a/icons/turf/walls/abductor_wall.dmi b/icons/turf/walls/abductor_wall.dmi new file mode 100644 index 00000000000..5d0f47046b3 Binary files /dev/null and b/icons/turf/walls/abductor_wall.dmi differ diff --git a/interface/skin.dmf b/interface/skin.dmf index c3d9f693726..d3ba4e0efc5 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1,351 +1,351 @@ macro "AZERTYoff" - elem + elem name = "TAB" command = ".Toggle-hotkey-mode" is-disabled = false - elem + elem name = "CENTER+REP" command = ".center" is-disabled = false - elem + elem name = "NORTHEAST" command = ".northeast" is-disabled = false - elem + elem name = "SOUTHEAST" command = ".southeast" is-disabled = false - elem + elem name = "SOUTHWEST" command = ".southwest" is-disabled = false - elem + elem name = "NORTHWEST" command = ".northwest" is-disabled = false - elem + elem name = "CTRL+WEST" command = "westface" is-disabled = false - elem + elem name = "WEST+REP" command = ".west" is-disabled = false - elem + elem name = "CTRL+NORTH" command = "northface" is-disabled = false - elem + elem name = "NORTH+REP" command = ".north" is-disabled = false - elem + elem name = "CTRL+EAST" command = "eastface" is-disabled = false - elem + elem name = "EAST+REP" command = ".east" is-disabled = false - elem + elem name = "CTRL+SOUTH" command = "southface" is-disabled = false - elem + elem name = "SOUTH+REP" command = ".south" is-disabled = false - elem + elem name = "INSERT" command = "a-intent right" is-disabled = false - elem + elem name = "DELETE" command = "delete-key-pressed" is-disabled = false - elem + elem name = "CTRL+1" command = "a-intent help" is-disabled = false - elem + elem name = "CTRL+2" command = "a-intent disarm" is-disabled = false - elem + elem name = "CTRL+3" command = "a-intent grab" is-disabled = false - elem + elem name = "CTRL+4" command = "a-intent harm" is-disabled = false - elem + elem name = "CTRL+A" command = ".northwest" is-disabled = false - elem + elem name = "CTRL+D+REP" command = ".east" is-disabled = false - elem + elem name = "CTRL+B" command = "resist" is-disabled = false - elem + elem name = "CTRL+E" command = "quick-equip" is-disabled = false - elem + elem name = "CTRL+F" command = "a-intent left" is-disabled = false - elem + elem name = "CTRL+G" command = "a-intent right" is-disabled = false - elem + elem name = "CTRL+Q+REP" command = ".west" is-disabled = false - elem + elem name = "CTRL+R" command = ".southwest" is-disabled = false - elem + elem name = "CTRL+S+REP" command = ".south" is-disabled = false - elem + elem name = "CTRL+W" command = "Activate-Held-Object" is-disabled = false - elem + elem name = "CTRL+X" command = ".northeast" is-disabled = false - elem + elem name = "CTRL+Y" command = "Activate-Held-Object" is-disabled = false - elem + elem name = "CTRL+Z+REP" command = ".north" is-disabled = false - elem + elem name = "F1" command = "adminhelp" is-disabled = false - elem + elem name = "CTRL+SHIFT+F1+REP" command = ".options" is-disabled = false - elem + elem name = "F2" command = "ooc" is-disabled = false - elem + elem name = "F2+REP" command = ".screenshot auto" is-disabled = false - elem + elem name = "SHIFT+F2+REP" command = ".screenshot" is-disabled = false - elem + elem name = "F3" command = ".say" is-disabled = false - elem + elem name = "F4" command = ".me" is-disabled = false - elem + elem name = "F5" command = "asay" is-disabled = false - elem + elem name = "F6" command = "Aghost" is-disabled = false - elem + elem name = "F7" command = "player-panel-new" is-disabled = false - elem + elem name = "F8" command = "admin-pm-key" is-disabled = false - elem + elem name = "F9" command = "Invisimin" is-disabled = false - elem + elem name = "F12" command = "F12" is-disabled = false macro "AZERTYon" - elem + elem name = "TAB" command = ".Toggle-hotkey-mode" is-disabled = false - elem + elem name = "CENTER+REP" command = ".center" is-disabled = false - elem + elem name = "NORTHEAST" command = ".northeast" is-disabled = false - elem + elem name = "SOUTHEAST" command = ".southeast" is-disabled = false - elem + elem name = "SOUTHWEST" command = ".southwest" is-disabled = false - elem + elem name = "NORTHWEST" command = ".northwest" is-disabled = false - elem + elem name = "CTRL+WEST" command = "westface" is-disabled = false - elem + elem name = "WEST+REP" command = ".west" is-disabled = false - elem + elem name = "CTRL+NORTH" command = "northface" is-disabled = false - elem + elem name = "NORTH+REP" command = ".north" is-disabled = false - elem + elem name = "CTRL+EAST" command = "eastface" is-disabled = false - elem + elem name = "EAST+REP" command = ".east" is-disabled = false - elem + elem name = "CTRL+SOUTH" command = "southface" is-disabled = false - elem + elem name = "SOUTH+REP" command = ".south" is-disabled = false - elem + elem name = "INSERT" command = "a-intent right" is-disabled = false - elem + elem name = "DELETE" command = "delete-key-pressed" is-disabled = false - elem + elem name = "1" command = "a-intent help" is-disabled = false - elem + elem name = "CTRL+1" command = "a-intent help" is-disabled = false - elem + elem name = "2" command = "a-intent disarm" is-disabled = false - elem + elem name = "CTRL+2" command = "a-intent disarm" is-disabled = false - elem + elem name = "3" command = "a-intent grab" is-disabled = false - elem + elem name = "CTRL+3" command = "a-intent grab" is-disabled = false - elem + elem name = "4" command = "a-intent harm" is-disabled = false - elem + elem name = "CTRL+4" command = "a-intent harm" is-disabled = false - elem + elem name = "A" command = ".northwest" is-disabled = false - elem + elem name = "CTRL+A" command = ".northwest" is-disabled = false - elem + elem name = "D+REP" command = ".east" is-disabled = false - elem + elem name = "CTRL+D+REP" command = ".east" is-disabled = false - elem + elem name = "CTRL+B" command = "resist" is-disabled = false - elem + elem name = "E" command = "quick-equip" is-disabled = false - elem + elem name = "CTRL+E" command = "quick-equip" is-disabled = false - elem + elem name = "F" command = "a-intent left" is-disabled = false - elem + elem name = "CTRL+F" command = "a-intent left" is-disabled = false - elem + elem name = "G" command = "a-intent right" is-disabled = false - elem + elem name = "CTRL+G" command = "a-intent right" is-disabled = false - elem + elem name = "H" command = "holster" is-disabled = false - elem + elem name = "CTRL+H" command = "holster" is-disabled = false - elem + elem name = "Q+REP" command = ".west" is-disabled = false - elem + elem name = "CTRL+Q+REP" command = ".west" is-disabled = false - elem + elem name = "R" command = ".southwest" is-disabled = false - elem + elem name = "CTRL+R" command = ".southwest" is-disabled = false @@ -353,43 +353,43 @@ macro "AZERTYon" name = "S+REP" command = ".south" is-disabled = false - elem + elem name = "CTRL+S+REP" command = ".south" is-disabled = false - elem + elem name = "T" command = ".say" is-disabled = false - elem + elem name = "O" command = "ooc" is-disabled = false - elem + elem name = "M" command = ".me" is-disabled = false - elem + elem name = "W" command = "Activate-Held-Object" is-disabled = false - elem + elem name = "CTRL+W" command = "Activate-Held-Object" is-disabled = false - elem + elem name = "X" command = ".northeast" is-disabled = false - elem + elem name = "CTRL+X" command = ".northeast" is-disabled = false - elem + elem name = "Y" command = "Activate-Held-Object" is-disabled = false - elem + elem name = "CTRL+Y" command = "Activate-Held-Object" is-disabled = false @@ -397,217 +397,217 @@ macro "AZERTYon" name = "Z+REP" command = ".north" is-disabled = false - elem + elem name = "CTRL+Z+REP" command = ".north" is-disabled = false - elem + elem name = "F1" command = "adminhelp" is-disabled = false - elem + elem name = "CTRL+SHIFT+F1+REP" command = ".options" is-disabled = false - elem + elem name = "F2" command = "ooc" is-disabled = false - elem + elem name = "F2+REP" command = ".screenshot auto" is-disabled = false - elem + elem name = "SHIFT+F2+REP" command = ".screenshot" is-disabled = false - elem + elem name = "F3" command = ".say" is-disabled = false - elem + elem name = "F4" command = ".me" is-disabled = false - elem + elem name = "F5" command = "asay" is-disabled = false - elem + elem name = "F6" command = "Aghost" is-disabled = false - elem + elem name = "F7" command = "player-panel-new" is-disabled = false - elem + elem name = "F8" command = "admin-pm-key" is-disabled = false - elem + elem name = "F9" command = "Invisimin" is-disabled = false - elem + elem name = "F12" command = "F12" is-disabled = false macro "borghotkeymode" - elem + elem name = "TAB" command = ".winset \"mainwindow.macro=borgmacro hotkey_toggle.is-checked=false input.focus=true input.background-color=#D3B5B5\"" is-disabled = false - elem + elem name = "CENTER+REP" command = ".center" is-disabled = false - elem + elem name = "NORTHEAST" command = ".northeast" is-disabled = false - elem + elem name = "SOUTHEAST" command = ".southeast" is-disabled = false - elem + elem name = "NORTHWEST" command = "unequip-module" is-disabled = false - elem + elem name = "CTRL+WEST" command = "westface" is-disabled = false - elem + elem name = "WEST+REP" command = ".west" is-disabled = false - elem + elem name = "CTRL+NORTH" command = "northface" is-disabled = false - elem + elem name = "NORTH+REP" command = ".north" is-disabled = false - elem + elem name = "CTRL+EAST" command = "eastface" is-disabled = false - elem + elem name = "EAST+REP" command = ".east" is-disabled = false - elem + elem name = "CTRL+SOUTH" command = "southface" is-disabled = false - elem + elem name = "SOUTH+REP" command = ".south" is-disabled = false - elem + elem name = "INSERT" command = "a-intent right" is-disabled = false - elem + elem name = "DELETE" command = "delete-key-pressed" is-disabled = false - elem + elem name = "1" command = "toggle-module 1" is-disabled = false - elem + elem name = "CTRL+1" command = "toggle-module 1" is-disabled = false - elem + elem name = "2" command = "toggle-module 2" is-disabled = false - elem + elem name = "CTRL+2" command = "toggle-module 2" is-disabled = false - elem + elem name = "3" command = "toggle-module 3" is-disabled = false - elem + elem name = "CTRL+3" command = "toggle-module 3" is-disabled = false - elem + elem name = "4" command = "a-intent left" is-disabled = false - elem + elem name = "CTRL+4" command = "a-intent left" is-disabled = false - elem + elem name = "A+REP" command = ".west" is-disabled = false - elem + elem name = "CTRL+A+REP" command = ".west" is-disabled = false - elem + elem name = "B" command = "resist" is-disabled = false - elem + elem name = "CTRL+B" command = "resist" is-disabled = false - elem + elem name = "T" command = ".say" is-disabled = false - elem + elem name = "O" command = "ooc" is-disabled = false - elem + elem name = "M" command = ".me" is-disabled = false - elem + elem name = "CTRL+O" command = "ooc" is-disabled = false - elem + elem name = "D+REP" command = ".east" is-disabled = false - elem + elem name = "CTRL+D+REP" command = ".east" is-disabled = false - elem + elem name = "F" command = "a-intent left" is-disabled = false - elem + elem name = "CTRL+F" command = "a-intent left" is-disabled = false - elem + elem name = "G" command = "a-intent right" is-disabled = false - elem + elem name = "CTRL+G" command = "a-intent right" is-disabled = false - elem + elem name = "Q" command = "unequip-module" is-disabled = false - elem + elem name = "CTRL+Q" command = "unequip-module" is-disabled = false @@ -615,7 +615,7 @@ macro "borghotkeymode" name = "S+REP" command = ".south" is-disabled = false - elem + elem name = "CTRL+S+REP" command = ".south" is-disabled = false @@ -623,451 +623,451 @@ macro "borghotkeymode" name = "W+REP" command = ".north" is-disabled = false - elem + elem name = "CTRL+W+REP" command = ".north" is-disabled = false - elem + elem name = "X" command = ".northeast" is-disabled = false - elem + elem name = "CTRL+X" command = ".northeast" is-disabled = false - elem + elem name = "Y" command = "Activate-Held-Object" is-disabled = false - elem + elem name = "CTRL+Y" command = "Activate-Held-Object" is-disabled = false - elem + elem name = "Z" command = "Activate-Held-Object" is-disabled = false - elem + elem name = "CTRL+Z" command = "Activate-Held-Object" is-disabled = false - elem + elem name = "F1" command = "adminhelp" is-disabled = false - elem + elem name = "CTRL+SHIFT+F1+REP" command = ".options" is-disabled = false - elem + elem name = "F2" command = "ooc" is-disabled = false - elem + elem name = "F2+REP" command = ".screenshot auto" is-disabled = false - elem + elem name = "SHIFT+F2+REP" command = ".screenshot" is-disabled = false - elem + elem name = "F3" command = ".say" is-disabled = false - elem + elem name = "F4" command = ".me" is-disabled = false - elem + elem name = "F5" command = "asay" is-disabled = false - elem + elem name = "F6" command = "Aghost" is-disabled = false - elem + elem name = "F7" command = "player-panel-new" is-disabled = false - elem + elem name = "F8" command = "admin-pm-key" is-disabled = false - elem + elem name = "F9" command = "Invisimin" is-disabled = false - elem + elem name = "F12" command = "F12" - is-disabled = false - + is-disabled = false + macro "macro" - elem + elem name = "TAB" command = ".Toggle-hotkey-mode" is-disabled = false - elem + elem name = "CENTER+REP" command = ".center" is-disabled = false - elem + elem name = "NORTHEAST" command = ".northeast" is-disabled = false - elem + elem name = "SOUTHEAST" command = ".southeast" is-disabled = false - elem + elem name = "SOUTHWEST" command = ".southwest" is-disabled = false - elem + elem name = "NORTHWEST" command = ".northwest" is-disabled = false - elem + elem name = "CTRL+WEST" command = "westface" is-disabled = false - elem + elem name = "WEST+REP" command = ".west" is-disabled = false - elem + elem name = "CTRL+NORTH" command = "northface" is-disabled = false - elem + elem name = "NORTH+REP" command = ".north" is-disabled = false - elem + elem name = "CTRL+EAST" command = "eastface" is-disabled = false - elem + elem name = "EAST+REP" command = ".east" is-disabled = false - elem + elem name = "CTRL+SOUTH" command = "southface" is-disabled = false - elem + elem name = "SOUTH+REP" command = ".south" is-disabled = false - elem + elem name = "INSERT" command = "a-intent right" is-disabled = false - elem + elem name = "DELETE" command = "delete-key-pressed" is-disabled = false - elem + elem name = "CTRL+1" command = "a-intent help" is-disabled = false - elem + elem name = "CTRL+2" command = "a-intent disarm" is-disabled = false - elem + elem name = "CTRL+3" command = "a-intent grab" is-disabled = false - elem + elem name = "CTRL+4" command = "a-intent harm" is-disabled = false - elem + elem name = "CTRL+A+REP" command = ".west" is-disabled = false - elem + elem name = "CTRL+D+REP" command = ".east" is-disabled = false - elem + elem name = "CTRL+B" command = "resist" is-disabled = false - elem + elem name = "CTRL+E" command = "quick-equip" is-disabled = false - elem + elem name = "CTRL+F" command = "a-intent left" is-disabled = false - elem + elem name = "CTRL+G" command = "a-intent right" is-disabled = false - elem + elem name = "CTRL+Q" command = ".northwest" is-disabled = false - elem + elem name = "CTRL+R" command = ".southwest" is-disabled = false - elem + elem name = "CTRL+S+REP" command = ".south" is-disabled = false - elem + elem name = "CTRL+W+REP" command = ".north" is-disabled = false - elem + elem name = "CTRL+X" command = ".northeast" is-disabled = false - elem + elem name = "CTRL+Y" command = "Activate-Held-Object" is-disabled = false - elem + elem name = "CTRL+Z" command = "Activate-Held-Object" is-disabled = false - elem + elem name = "F1" command = "adminhelp" is-disabled = false - elem + elem name = "CTRL+SHIFT+F1+REP" command = ".options" is-disabled = false - elem + elem name = "F2" command = "ooc" is-disabled = false - elem + elem name = "F2+REP" command = ".screenshot auto" is-disabled = false - elem + elem name = "SHIFT+F2+REP" command = ".screenshot" is-disabled = false - elem + elem name = "F3" command = ".say" is-disabled = false - elem + elem name = "F4" command = ".me" is-disabled = false - elem + elem name = "F5" command = "asay" is-disabled = false - elem + elem name = "F6" command = "Aghost" is-disabled = false - elem + elem name = "F7" command = "player-panel-new" is-disabled = false - elem + elem name = "F8" command = "admin-pm-key" is-disabled = false - elem + elem name = "F9" command = "Invisimin" is-disabled = false - elem + elem name = "F12" command = "F12" is-disabled = false macro "hotkeymode" - elem + elem name = "TAB" command = ".Toggle-hotkey-mode" is-disabled = false - elem + elem name = "CENTER+REP" command = ".center" is-disabled = false - elem + elem name = "NORTHEAST" command = ".northeast" is-disabled = false - elem + elem name = "SOUTHEAST" command = ".southeast" is-disabled = false - elem + elem name = "SOUTHWEST" command = ".southwest" is-disabled = false - elem + elem name = "NORTHWEST" command = ".northwest" is-disabled = false - elem + elem name = "CTRL+WEST" command = "westface" is-disabled = false - elem + elem name = "WEST+REP" command = ".west" is-disabled = false - elem + elem name = "CTRL+NORTH" command = "northface" is-disabled = false - elem + elem name = "NORTH+REP" command = ".north" is-disabled = false - elem + elem name = "CTRL+EAST" command = "eastface" is-disabled = false - elem + elem name = "EAST+REP" command = ".east" is-disabled = false - elem + elem name = "CTRL+SOUTH" command = "southface" is-disabled = false - elem + elem name = "SOUTH+REP" command = ".south" is-disabled = false - elem + elem name = "INSERT" command = "a-intent right" is-disabled = false - elem + elem name = "DELETE" command = "delete-key-pressed" is-disabled = false - elem + elem name = "1" command = "a-intent help" is-disabled = false - elem + elem name = "CTRL+1" command = "a-intent help" is-disabled = false - elem + elem name = "2" command = "a-intent disarm" is-disabled = false - elem + elem name = "CTRL+2" command = "a-intent disarm" is-disabled = false - elem + elem name = "3" command = "a-intent grab" is-disabled = false - elem + elem name = "CTRL+3" command = "a-intent grab" is-disabled = false - elem + elem name = "4" command = "a-intent harm" is-disabled = false - elem + elem name = "CTRL+4" command = "a-intent harm" is-disabled = false - elem + elem name = "T" command = ".say" is-disabled = false - elem + elem name = "O" command = "ooc" is-disabled = false - elem + elem name = "M" command = ".me" is-disabled = false - elem + elem name = "A+REP" command = ".west" is-disabled = false - elem + elem name = "CTRL+A+REP" command = ".west" is-disabled = false - elem + elem name = "D+REP" command = ".east" is-disabled = false - elem + elem name = "CTRL+D+REP" command = ".east" is-disabled = false - elem + elem name = "B" command = "resist" is-disabled = false - elem + elem name = "CTRL+B" command = "resist" is-disabled = false - elem + elem name = "E" command = "quick-equip" is-disabled = false - elem + elem name = "CTRL+E" command = "quick-equip" is-disabled = false - elem + elem name = "F" command = "a-intent left" is-disabled = false - elem + elem name = "CTRL+F" command = "a-intent left" is-disabled = false - elem + elem name = "G" command = "a-intent right" is-disabled = false - elem + elem name = "CTRL+G" command = "a-intent right" is-disabled = false - elem + elem name = "H" command = "holster" is-disabled = false - elem + elem name = "CTRL+H" command = "holster" is-disabled = false - elem + elem name = "Q" command = ".northwest" is-disabled = false - elem + elem name = "CTRL+Q" command = ".northwest" is-disabled = false - elem + elem name = "R" command = ".southwest" is-disabled = false - elem + elem name = "CTRL+R" command = ".southwest" is-disabled = false @@ -1075,11 +1075,11 @@ macro "hotkeymode" name = "S+REP" command = ".south" is-disabled = false - elem + elem name = "CTRL+S+REP" command = ".south" is-disabled = false - elem + elem name = "T" command = ".say" is-disabled = false @@ -1087,267 +1087,267 @@ macro "hotkeymode" name = "W+REP" command = ".north" is-disabled = false - elem + elem name = "CTRL+W+REP" command = ".north" is-disabled = false - elem + elem name = "X" command = ".northeast" is-disabled = false - elem + elem name = "CTRL+X" command = ".northeast" is-disabled = false - elem + elem name = "Y" command = "Activate-Held-Object" is-disabled = false - elem + elem name = "CTRL+Y" command = "Activate-Held-Object" is-disabled = false - elem + elem name = "Z" command = "Activate-Held-Object" is-disabled = false - elem + elem name = "CTRL+Z" command = "Activate-Held-Object" is-disabled = false - elem + elem name = "F1" command = "adminhelp" is-disabled = false - elem + elem name = "CTRL+SHIFT+F1+REP" command = ".options" is-disabled = false - elem + elem name = "F2" command = "ooc" is-disabled = false - elem + elem name = "F2+REP" command = ".screenshot auto" is-disabled = false - elem + elem name = "SHIFT+F2+REP" command = ".screenshot" is-disabled = false - elem + elem name = "F3" command = ".say" is-disabled = false - elem + elem name = "F4" command = ".me" is-disabled = false - elem + elem name = "F5" command = "asay" is-disabled = false - elem + elem name = "F6" command = "Aghost" is-disabled = false - elem + elem name = "F7" command = "player-panel-new" is-disabled = false - elem + elem name = "F8" command = "admin-pm-key" is-disabled = false - elem + elem name = "F9" command = "Invisimin" is-disabled = false - elem + elem name = "F12" command = "F12" is-disabled = false macro "borgmacro" - elem + elem name = "TAB" command = ".winset \"mainwindow.macro=borghotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0\"" is-disabled = false - elem + elem name = "CENTER+REP" command = ".center" is-disabled = false - elem + elem name = "NORTHEAST" command = ".northeast" is-disabled = false - elem + elem name = "SOUTHEAST" command = ".southeast" is-disabled = false - elem + elem name = "NORTHWEST" command = "unequip-module" is-disabled = false - elem + elem name = "CTRL+WEST" command = "westface" is-disabled = false - elem + elem name = "WEST+REP" command = ".west" is-disabled = false - elem + elem name = "CTRL+NORTH" command = "northface" is-disabled = false - elem + elem name = "NORTH+REP" command = ".north" is-disabled = false - elem + elem name = "CTRL+EAST" command = "eastface" is-disabled = false - elem + elem name = "EAST+REP" command = ".east" is-disabled = false - elem + elem name = "CTRL+SOUTH" command = "southface" is-disabled = false - elem + elem name = "SOUTH+REP" command = ".south" is-disabled = false - elem + elem name = "INSERT" command = "a-intent right" is-disabled = false - elem + elem name = "DELETE" command = "delete-key-pressed" is-disabled = false - elem + elem name = "CTRL+1" command = "toggle-module 1" is-disabled = false - elem + elem name = "CTRL+2" command = "toggle-module 2" is-disabled = false - elem + elem name = "CTRL+3" command = "toggle-module 3" is-disabled = false - elem + elem name = "CTRL+4" command = "a-intent left" is-disabled = false - elem + elem name = "CTRL+A+REP" command = ".west" is-disabled = false - elem + elem name = "CTRL+B" command = "resist" is-disabled = false - elem + elem name = "CTRL+O" command = "ooc" is-disabled = false - elem + elem name = "CTRL+D+REP" command = ".east" is-disabled = false - elem + elem name = "CTRL+F" command = "a-intent left" is-disabled = false - elem + elem name = "CTRL+G" command = "a-intent right" is-disabled = false - elem + elem name = "CTRL+Q" command = "unequip-module" is-disabled = false - elem + elem name = "CTRL+S+REP" command = ".south" is-disabled = false - elem + elem name = "CTRL+W+REP" command = ".north" is-disabled = false - elem + elem name = "CTRL+X" command = ".northeast" is-disabled = false - elem + elem name = "CTRL+Y" command = "Activate-Held-Object" is-disabled = false - elem + elem name = "CTRL+Z" command = "Activate-Held-Object" is-disabled = false - elem + elem name = "F1" command = "adminhelp" is-disabled = false - elem + elem name = "CTRL+SHIFT+F1+REP" command = ".options" is-disabled = false - elem + elem name = "F2" command = "ooc" is-disabled = false - elem + elem name = "F2+REP" command = ".screenshot auto" is-disabled = false - elem + elem name = "SHIFT+F2+REP" command = ".screenshot" is-disabled = false - elem + elem name = "F3" command = ".say" is-disabled = false - elem + elem name = "F4" command = ".me" is-disabled = false - elem + elem name = "F5" command = "asay" is-disabled = false - elem + elem name = "F6" command = "Aghost" is-disabled = false - elem + elem name = "F7" command = "player-panel-new" is-disabled = false - elem + elem name = "F8" command = "admin-pm-key" is-disabled = false - elem + elem name = "F9" command = "Invisimin" is-disabled = false - elem + elem name = "F12" command = "F12" - is-disabled = false + is-disabled = false menu "menu" - elem + elem name = "&File" command = "" category = "" @@ -1356,7 +1356,7 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" - elem + elem name = "&Quick screenshot\tF2" command = ".screenshot auto" category = "&File" @@ -1365,7 +1365,7 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" - elem + elem name = "&Save screenshot as...\tShift+F2" command = ".screenshot" category = "&File" @@ -1374,7 +1374,7 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" - elem + elem name = "&Reconnect" command = ".reconnect" category = "&File" @@ -1383,7 +1383,7 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" - elem + elem name = "" command = "" category = "&File" @@ -1392,7 +1392,7 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" - elem + elem name = "&Quit" command = ".quit" category = "&File" @@ -1401,7 +1401,7 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" - elem + elem name = "&Icons" command = "" category = "" @@ -1464,7 +1464,7 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" - elem + elem name = "&Help" command = "" category = "" @@ -1473,7 +1473,7 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" - elem + elem name = "&Admin help\tF1" command = "adminhelp" category = "&Help" @@ -1482,7 +1482,7 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" - elem + elem name = "&Hotkeys" command = "hotkeys-help" category = "&Help" @@ -2256,6 +2256,32 @@ window "mainwindow" is-checked = false group = "" button-type = pushbox + elem "tooltip" + type = BROWSER + pos = 0,0 + size = 999x999 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #ffffff + background-color = #000000 + is-visible = false + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "" + on-size = "" + show-history = false + show-url = false + auto-format = false + use-title = false + on-show = "" + on-hide = "" window "mapwindow" elem "mapwindow" diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index b045e1adbdc..2f178d751bb 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -64,6 +64,7 @@ h1.alert, h2.alert {color: #000000;} .warning {color: #ff0000; font-style: italic;} .announce {color: #228b22; font-weight: bold;} .boldannounce {color: #ff0000; font-weight: bold;} +.greenannounce {color: #00ff00; font-weight: bold;} .rose {color: #ff5050;} .info {color: #0000CC;} .notice {color: #000099;} @@ -93,6 +94,7 @@ h1.alert, h2.alert {color: #000000;} .clown {color: #ff0000;} .shadowling {color: #3b2769;} .vulpkanin {color: #B97A57;} +.abductor {color: #800080;} .rough {color: #7092BE; font-family: "Trebuchet MS", cursive, sans-serif;} .say_quote {font-family: Georgia, Verdana, sans-serif;} .sans {font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} diff --git a/nano/images/nanomap_z1.png b/nano/images/nanomap_z1.png index 4398cd901e3..c22e9bf6fb7 100644 Binary files a/nano/images/nanomap_z1.png and b/nano/images/nanomap_z1.png differ diff --git a/paradise.dme b/paradise.dme index 3ea018738b8..b0f73e9778a 100644 --- a/paradise.dme +++ b/paradise.dme @@ -98,6 +98,7 @@ #include "code\_onclick\hud\_defines.dm" #include "code\_onclick\hud\action.dm" #include "code\_onclick\hud\ai.dm" +#include "code\_onclick\hud\alert.dm" #include "code\_onclick\hud\alien.dm" #include "code\_onclick\hud\alien_larva.dm" #include "code\_onclick\hud\bot.dm" @@ -256,6 +257,7 @@ #include "code\datums\helper_datums\construction_datum.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\global_iterator.dm" +#include "code\datums\helper_datums\icon_snapshot.dm" #include "code\datums\helper_datums\map_template.dm" #include "code\datums\helper_datums\teleport.dm" #include "code\datums\helper_datums\topic_input.dm" @@ -396,6 +398,15 @@ #include "code\game\gamemodes\malfunction\malfunction.dm" #include "code\game\gamemodes\meteor\meteor.dm" #include "code\game\gamemodes\meteor\meteors.dm" +#include "code\game\gamemodes\miniantags\abduction\abduction.dm" +#include "code\game\gamemodes\miniantags\abduction\abduction_gear.dm" +#include "code\game\gamemodes\miniantags\abduction\abduction_surgery.dm" +#include "code\game\gamemodes\miniantags\abduction\gland.dm" +#include "code\game\gamemodes\miniantags\abduction\machinery\camera.dm" +#include "code\game\gamemodes\miniantags\abduction\machinery\console.dm" +#include "code\game\gamemodes\miniantags\abduction\machinery\dispenser.dm" +#include "code\game\gamemodes\miniantags\abduction\machinery\experiment.dm" +#include "code\game\gamemodes\miniantags\abduction\machinery\pad.dm" #include "code\game\gamemodes\miniantags\borer\borer.dm" #include "code\game\gamemodes\miniantags\borer\borer_event.dm" #include "code\game\gamemodes\miniantags\bot_swarm\swarmer.dm" @@ -751,6 +762,7 @@ #include "code\game\objects\items\stacks\sheets\mineral.dm" #include "code\game\objects\items\stacks\sheets\sheet_types.dm" #include "code\game\objects\items\stacks\sheets\sheets.dm" +#include "code\game\objects\items\stacks\tiles\tile_mineral.dm" #include "code\game\objects\items\stacks\tiles\tile_types.dm" #include "code\game\objects\items\weapons\AI_modules.dm" #include "code\game\objects\items\weapons\alien_specific.dm" @@ -947,6 +959,7 @@ #include "code\game\turfs\simulated\walls_reinforced.dm" #include "code\game\turfs\simulated\floor\fancy_floor.dm" #include "code\game\turfs\simulated\floor\light_floor.dm" +#include "code\game\turfs\simulated\floor\mineral.dm" #include "code\game\turfs\simulated\floor\misc_floor.dm" #include "code\game\turfs\simulated\floor\plasteel_floor.dm" #include "code\game\turfs\simulated\floor\plating.dm" @@ -1214,6 +1227,7 @@ #include "code\modules\economy\Job_Departments.dm" #include "code\modules\economy\POS.dm" #include "code\modules\economy\utils.dm" +#include "code\modules\events\abductor.dm" #include "code\modules\events\alien_infestation.dm" #include "code\modules\events\anomaly.dm" #include "code\modules\events\anomaly_bluespace.dm" @@ -1473,6 +1487,7 @@ #include "code\modules\mob\living\carbon\human\interactive\functions.dm" #include "code\modules\mob\living\carbon\human\interactive\interactive.dm" #include "code\modules\mob\living\carbon\human\interactive\prefabs.dm" +#include "code\modules\mob\living\carbon\human\species\abdcutor.dm" #include "code\modules\mob\living\carbon\human\species\apollo.dm" #include "code\modules\mob\living\carbon\human\species\golem.dm" #include "code\modules\mob\living\carbon\human\species\monkey.dm" @@ -1825,6 +1840,7 @@ #include "code\modules\reagents\reagent_containers\food\drinks\bottle.dm" #include "code\modules\reagents\reagent_containers\food\drinks\drinkingglass.dm" #include "code\modules\reagents\reagent_containers\food\drinks\jar.dm" +#include "code\modules\reagents\reagent_containers\food\drinks\shotglass.dm" #include "code\modules\reagents\reagent_containers\food\drinks\bottle\robot.dm" #include "code\modules\reagents\reagent_containers\food\snacks\candy.dm" #include "code\modules\reagents\reagent_containers\food\snacks\meat.dm" @@ -1990,6 +2006,7 @@ #include "code\modules\telesci\gps.dm" #include "code\modules\telesci\telepad.dm" #include "code\modules\telesci\telesci_computer.dm" +#include "code\modules\tooltip\tooltip.dm" #include "code\modules\tram\tram.dm" #include "code\modules\tram\tram_control_pad.dm" #include "code\modules\tram\tram_floor.dm"