diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 0c7cb8626f7..5bbdacd0062 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -569,7 +569,7 @@ "akW" = (/obj/item/clothing/head/festive,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/fore) "akX" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/fore) "akY" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "hosprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/security/hos) -"akZ" = (/obj/structure/table,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fore) +"akZ" = (/obj/structure/table,/obj/item/weapon/poster/random_contraband,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fore) "ala" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/table,/obj/item/weapon/stock_parts/manipulator,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fore) "alb" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "alc" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/eastright{base_state = "right"; dir = 8; icon_state = "right"; name = "Fitness Ring"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) @@ -595,7 +595,7 @@ "alw" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes,/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "alx" = (/obj/structure/table,/obj/item/stack/medical/ointment{pixel_x = 3; pixel_y = -2},/obj/item/stack/medical/bruise_pack{pixel_x = -3; pixel_y = 2},/obj/item/weapon/reagent_containers/syringe/epinephrine,/obj/item/weapon/storage/secure/safe{pixel_x = 6; pixel_y = 28},/obj/item/weapon/restraints/handcuffs/cable/pink,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aly" = (/obj/item/weapon/storage/secure/safe{pixel_x = 6; pixel_y = 28},/obj/item/weapon/kitchen/rollingpin,/obj/structure/closet/crate,/obj/item/clothing/suit/xenos,/obj/item/clothing/suit/monkeysuit,/obj/item/clothing/head/xenos,/obj/item/clothing/mask/gas/monkeymask,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"alz" = (/obj/item/stack/sheet/cardboard,/obj/machinery/light_construct/small{dir = 1},/obj/structure/closet/crate,/obj/item/weapon/coin/silver,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/watertank,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"alz" = (/obj/item/stack/sheet/cardboard,/obj/machinery/light_construct/small{dir = 1},/obj/structure/closet/crate,/obj/item/weapon/coin/silver,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/watertank,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "alA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/security/hos) "alB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/brig) "alC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light/small,/obj/machinery/camera{c_tag = "Security - EVA Storage"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/brig) @@ -853,7 +853,7 @@ "aqu" = (/mob/living/simple_animal/bot/cleanbot{name = "Mopfficer Sweepsky"; on = 0},/turf/simulated/floor/plating,/area/maintenance/fore) "aqv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aqw" = (/obj/structure/closet/crate,/obj/item/bodybag,/obj/item/device/radio,/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/fore) -"aqx" = (/obj/structure/table/reinforced,/obj/machinery/light_construct/small{dir = 8},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/structure/window/reinforced,/obj/item/weapon/contraband/poster/legit,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aqx" = (/obj/structure/table/reinforced,/obj/machinery/light_construct/small{dir = 8},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/structure/window/reinforced,/obj/item/weapon/poster/random_official,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aqy" = (/obj/structure/table/reinforced,/obj/item/weapon/folder,/obj/item/weapon/folder,/obj/machinery/door/window/westleft{base_state = "right"; dir = 2; icon_state = "right"; name = "windoor"; req_access_txt = "0"},/obj/item/weapon/book/manual/engineering_hacking,/obj/item/device/tape/random,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aqz" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced,/obj/item/weapon/stock_parts/cell/crap,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aqA" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced,/obj/item/weapon/firealarm_electronics,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) @@ -1087,7 +1087,7 @@ "auU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden) "auV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden) "auW" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Warden"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden) -"auX" = (/obj/structure/table/reinforced,/obj/machinery/door/window/westleft{base_state = "right"; dir = 4; icon_state = "right"; name = "Outer Window"; req_access_txt = "0"},/obj/machinery/door/window/brigdoor{dir = 8; name = "Brig Control Desk"; req_access_txt = "3"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/item/weapon/contraband/poster/legit,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden) +"auX" = (/obj/structure/table/reinforced,/obj/machinery/door/window/westleft{base_state = "right"; dir = 4; icon_state = "right"; name = "Outer Window"; req_access_txt = "0"},/obj/machinery/door/window/brigdoor{dir = 8; name = "Brig Control Desk"; req_access_txt = "3"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/item/weapon/poster/random_official,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden) "auY" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden) "auZ" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main) "ava" = (/obj/spacepod/sec,/turf/simulated/floor/engine,/area/security/podbay) @@ -1112,7 +1112,7 @@ "avt" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/crew_quarters/sleep) "avu" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Recreation Area"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/crew_quarters/sleep) "avv" = (/turf/simulated/wall,/area/crew_quarters/sleep) -"avw" = (/obj/structure/closet,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard) +"avw" = (/obj/structure/closet,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard) "avx" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/storage/primary) "avy" = (/obj/structure/rack,/obj/item/weapon/extinguisher,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard) "avz" = (/obj/structure/rack,/obj/effect/landmark/costume,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -1709,7 +1709,7 @@ "aGS" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/sleep) "aGT" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/machinery/door_control{id = "Cabin6"; name = "Dorm Bolt Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/obj/effect/decal/cleanable/cobweb,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/carpet,/area/crew_quarters/sleep) "aGU" = (/obj/structure/closet/secure_closet/personal/cabinet,/obj/machinery/alarm{pixel_y = 23},/obj/item/clothing/under/suit_jacket/navy,/turf/simulated/floor/carpet,/area/crew_quarters/sleep) -"aGV" = (/obj/item/clothing/glasses/meson,/obj/structure/closet/crate,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard) +"aGV" = (/obj/item/clothing/glasses/meson,/obj/structure/closet/crate,/obj/item/weapon/poster/random_contraband,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard) "aGW" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/starboard) "aGX" = (/obj/structure/reagent_dispensers/fueltank,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering) "aGY" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/engine/engineering) @@ -1727,7 +1727,7 @@ "aHk" = (/turf/simulated/wall,/area/construction) "aHl" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/construction) "aHm" = (/obj/structure/closet/crate,/obj/item/weapon/coin/silver,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"aHn" = (/obj/structure/closet,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aHn" = (/obj/structure/closet,/obj/item/weapon/poster/random_contraband,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aHo" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/shuttle/mining) "aHp" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/mining) "aHq" = (/obj/structure/ore_box,/turf/simulated/shuttle/floor,/area/shuttle/mining) @@ -4145,7 +4145,7 @@ "bBK" = (/turf/simulated/wall,/area/crew_quarters/toilet{name = "\improper Auxiliary Restrooms"}) "bBL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/crew_quarters/toilet{name = "\improper Auxiliary Restrooms"}) "bBM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"bBN" = (/obj/structure/closet,/obj/effect/decal/cleanable/cobweb2,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"bBN" = (/obj/structure/closet,/obj/effect/decal/cleanable/cobweb2,/obj/item/weapon/poster/random_contraband,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bBO" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/wood,/area/library) "bBP" = (/obj/structure/table/woodentable,/obj/machinery/computer/library/public,/turf/simulated/floor/wood,/area/library) "bBQ" = (/turf/simulated/floor/carpet,/area/library) @@ -4563,7 +4563,7 @@ "bJM" = (/obj/structure/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bJN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) "bJO" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/theatre) -"bJP" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick{pixel_y = 5},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/machinery/camera{c_tag = "Theatre - Stage"; dir = 8; network = list("SS13")},/obj/machinery/light/small{dir = 4},/obj/item/device/guitar,/turf/simulated/floor/wood,/area/crew_quarters/theatre) +"bJP" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick{pixel_y = 5},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/machinery/camera{c_tag = "Theatre - Stage"; dir = 8; network = list("SS13")},/obj/machinery/light/small{dir = 4},/obj/item/device/instrument/guitar,/turf/simulated/floor/wood,/area/crew_quarters/theatre) "bJQ" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/primary/starboard) "bJR" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/starboard) "bJS" = (/obj/structure/dispenser{pixel_x = -1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blackcorner"},/area/atmos) @@ -4662,7 +4662,7 @@ "bLH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) "bLI" = (/obj/structure/stool/bed/chair/wood/wings{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/landmark/start{name = "Clown"},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) "bLJ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) -"bLK" = (/obj/structure/closet/crate,/obj/item/weapon/contraband/poster/legit,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"bLK" = (/obj/structure/closet/crate,/obj/item/weapon/poster/random_official,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bLL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/theatre) "bLM" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doormaint.dmi'; name = "Theatre Stage"; req_access_txt = "0"; req_one_access_txt = "12;46"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/theatre) "bLN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/starboard) @@ -4841,7 +4841,7 @@ "bPe" = (/obj/machinery/light_switch{pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/light,/turf/simulated/floor/carpet,/area/crew_quarters/theatre) "bPf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/carpet,/area/crew_quarters/theatre) "bPg" = (/obj/structure/table/woodentable,/obj/machinery/light/small,/obj/item/clothing/glasses/regular/hipster{name = "Hipster Glasses"},/turf/simulated/floor/wood,/area/crew_quarters/theatre) -"bPh" = (/obj/item/device/violin,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/crew_quarters/theatre) +"bPh" = (/obj/item/device/instrument/violin,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/crew_quarters/theatre) "bPi" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "cmoprivacy"; layer = 2.7; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cmo) "bPj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 10; icon_state = "yellow"},/area/hallway/primary/starboard) "bPk" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellow"},/area/hallway/primary/starboard) @@ -5147,7 +5147,7 @@ "bUY" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue,/obj/item/weapon/folder/blue{pixel_x = 4; pixel_y = 6},/obj/item/weapon/paper/blueshield,/turf/simulated/floor/plasteel{icon_state = "bcarpet05"},/area/blueshield) "bUZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; layer = 2.4; on = 1},/turf/simulated/floor/plasteel{icon_state = "bcarpet05"},/area/blueshield) "bVa" = (/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/blueshield) -"bVb" = (/obj/structure/sign/poster/legit{pixel_x = -32},/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/ntrep) +"bVb" = (/obj/structure/sign/poster/random{pixel_x = -32},/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/ntrep) "bVc" = (/obj/structure/table/woodentable,/obj/machinery/computer/skills{req_access_txt = "57"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/ntrep) "bVd" = (/obj/structure/table/woodentable,/obj/item/weapon/folder,/obj/item/weapon/stamp/centcom,/obj/item/weapon/pen/multi/fountain,/turf/simulated/floor/carpet,/area/ntrep) "bVe" = (/obj/machinery/door/window{dir = 1; name = "Desk Door"; req_access_txt = "73"},/obj/machinery/keycard_auth{pixel_x = 24; pixel_y = 0},/turf/simulated/floor/wood,/area/ntrep) @@ -5593,7 +5593,7 @@ "cdC" = (/obj/machinery/power/solar_control{id = "aftport"; name = "Aft Port Solar Control"; track = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/portsolar) "cdD" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/portsolar) "cdE" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/portsolar) -"cdF" = (/obj/structure/rack,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"cdF" = (/obj/structure/rack,/obj/item/weapon/poster/random_contraband,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "cdG" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "cdH" = (/obj/structure/closet,/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cdI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay3{name = "Medbay Aft"}) @@ -5654,7 +5654,7 @@ "ceL" = (/obj/effect/spawner/window/reinforced,/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,/area/security/checkpoint/science{name = "Security Post - Research Division"}) "ceM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/external{name = "Solar Maintenance"; req_access = null; req_access_txt = "10; 13"},/turf/simulated/floor/plating,/area/maintenance/portsolar) "ceN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"ceO" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) +"ceO" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/poster/random_contraband,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "ceP" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "ceQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "toxins_blastdoor"; layer = 2.7; name = "privacy shutters"; opacity = 0},/obj/machinery/door/airlock/research{name = "Toxins Launch Room Access"; req_access_txt = "8"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "ceR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -6613,7 +6613,7 @@ "cxj" = (/obj/structure/stool/bed,/obj/effect/decal/cleanable/blood/gibs/limb,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cxk" = (/obj/item/toy/cards/deck,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) "cxl" = (/turf/simulated/floor/wood{tag = "icon-wood-broken4"; icon_state = "wood-broken4"},/area/maintenance/aft{name = "Aft Maintenance"}) -"cxm" = (/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/reagent_containers/food/drinks/cans/beer{pixel_x = -3; pixel_y = 2},/obj/structure/table/woodentable,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"}) +"cxm" = (/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/reagent_containers/food/drinks/cans/beer{pixel_x = -3; pixel_y = 2},/obj/structure/table/woodentable,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"}) "cxn" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/obj/machinery/light_switch{pixel_x = -28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cxo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cxp" = (/obj/machinery/computer/operating,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) @@ -7633,7 +7633,7 @@ "cRJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "cRK" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "7;12;47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cRN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"cRO" = (/obj/structure/closet/crate,/obj/item/weapon/contraband/poster/legit,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) +"cRO" = (/obj/structure/closet/crate,/obj/item/weapon/poster/random_official,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "cRP" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "cRQ" = (/obj/machinery/power/apc{dir = 8; name = "Aft Starboard Solar APC"; pixel_x = -26; pixel_y = 3},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cRR" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboardsolar) diff --git a/_maps/map_files/RandomZLevels/academy.dmm b/_maps/map_files/RandomZLevels/academy.dmm index 491938aa3e0..1bf4b376673 100644 --- a/_maps/map_files/RandomZLevels/academy.dmm +++ b/_maps/map_files/RandomZLevels/academy.dmm @@ -412,7 +412,7 @@ "hV" = (/obj/structure/closet,/obj/item/clothing/under/color/lightpurple,/obj/item/weapon/twohanded/staff,/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft) "hW" = (/obj/structure/closet,/obj/item/weapon/storage/wallet/random,/obj/item/clothing/glasses/regular/hipster,/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft) "hX" = (/obj/structure/closet,/obj/item/clothing/head/wizard/fake,/obj/item/clothing/suit/wizrobe/fake,/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft) -"hY" = (/obj/structure/closet,/obj/item/clothing/under/color/purple,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft) +"hY" = (/obj/structure/closet,/obj/item/clothing/under/color/purple,/obj/item/weapon/poster/random_contraband,/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft) "hZ" = (/obj/structure/closet,/obj/item/weapon/storage/box/snappops,/obj/item/weapon/storage/backpack,/obj/item/weapon/paper{info = "Current Grade: F. Educator's Notes: No improvement shown despite multiple private lessons. Suggest additional tutilage."; name = "Pyromancy Evaluation"},/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft) "ia" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/awaymission/academy/academyaft) "ib" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plasteel,/area/awaymission/academy/academyaft) diff --git a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm index 62e480cd89e..05116a7fcfc 100644 --- a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm +++ b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm @@ -449,7 +449,7 @@ "iG" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft) "iH" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft) "iI" = (/obj/item/weapon/storage/box/matches,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"iJ" = (/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) +"iJ" = (/obj/item/weapon/poster/random_contraband,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) "iK" = (/turf/simulated/floor/plating,/area/awaymission) "iL" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/grenade/chem_grenade/drugs,/turf/simulated/floor/plating,/area/awaymission) "iM" = (/turf/simulated/mineral/random/high_chance_clown,/area/awaymission) diff --git a/_maps/map_files/RandomZLevels/moonoutpost19.dmm b/_maps/map_files/RandomZLevels/moonoutpost19.dmm index 0bb35cdaab8..4c42fb7ffad 100644 --- a/_maps/map_files/RandomZLevels/moonoutpost19.dmm +++ b/_maps/map_files/RandomZLevels/moonoutpost19.dmm @@ -53,7 +53,7 @@ "ba" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/mob/living/simple_animal/hostile/alien/drone{plants_off = 1},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "bb" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "bc" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) -"bd" = (/obj/machinery/vending/cigarette,/obj/structure/sign/poster{icon_state = "poster7"; pixel_y = 32; serial_number = 7; subtype = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) +"bd" = (/obj/machinery/vending/cigarette,/obj/structure/sign/poster/contraband/smoke{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "be" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; icon_state = "darkred"; tag = "icon-darkred (SOUTHWEST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "bf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "bg" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "darkred"; tag = "icon-darkred (SOUTHEAST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) @@ -63,7 +63,7 @@ "bk" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gib2_flesh"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "bl" = (/turf/simulated/mineral/random/high_chance,/area/awaycontent/a5{always_unpowered = 1; has_gravity = 1; name = "The Hive"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "bm" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) -"bn" = (/obj/machinery/light/small{dir = 8},/obj/structure/sign/poster{icon_state = "poster17"; pixel_x = -32; pixel_y = 0; serial_number = 17; subtype = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) +"bn" = (/obj/machinery/light/small{dir = 8},/obj/structure/sign/poster/contraband/power_people{pixel_x = -32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "bo" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "bp" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 1; pixel_y = 23; req_access = "150"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "bq" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/device/radio/off{pixel_x = -4; pixel_y = 4},/obj/item/device/radio/off{pixel_x = 2},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) @@ -102,7 +102,7 @@ "bX" = (/obj/machinery/mineral/unloading_machine{dir = 1; icon_state = "unloader-corner"; input_dir = 4; output_dir = 8},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plating/airless{name = "plating"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "bY" = (/obj/machinery/conveyor{dir = 2; id = "awaysyndie"},/turf/simulated/floor/plating/airless{dir = 4; icon_state = "warnplate"; name = "plating"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "bZ" = (/turf/simulated/floor/plasteel/airless{icon_state = "floorgrime"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) -"ca" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/sign/poster{icon_state = "poster5"; pixel_x = 0; pixel_y = 32; serial_number = 5; subtype = 0},/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "loadingarea"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) +"ca" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/sign/poster/contraband/syndicate_recruitment{pixel_y = 32},/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "loadingarea"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "cb" = (/obj/effect/decal/cleanable/dirt,/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel/airless{dir = 4; icon_state = "red"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "cc" = (/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = "150"},/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched2"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "cd" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "red"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) @@ -113,7 +113,7 @@ "ci" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/table,/obj/machinery/cell_charger,/obj/machinery/light/small{dir = 8},/obj/item/weapon/stock_parts/cell/high,/obj/item/weapon/paper{info = "Alright, listen up. If you're reading this, I'm either taking a shit or I've been recalled back to Command. Either way, you'll need to know how to restore power. We've stolen this stuff from Nanotrasen, so all the equipment is jury-rigged. We have generators that work on both plasma and uranium, about 50 sheets should power the outpost for quite a while. If the generators aren't working, which is very likely, take the power cell on the desk and put it into the APC in the hallway. That should get the place running, at least for a little while."; name = "Engineering Instructions"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "cj" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "ck" = (/obj/structure/stool,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) -"cl" = (/obj/machinery/light/small{dir = 4},/obj/structure/sign/poster{icon_state = "poster10"; pixel_x = 32; pixel_y = 0; serial_number = 10; subtype = 0},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) +"cl" = (/obj/machinery/light/small{dir = 4},/obj/structure/sign/poster/contraband/hacking_guide{pixel_x = 32},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplate"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "cm" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"; tag = "icon-warnplatecorner (EAST)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "cn" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "co" = (/turf/simulated/floor/plasteel/airless{name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) @@ -170,7 +170,7 @@ "dn" = (/turf/simulated/floor/plasteel/airless{dir = 4; icon_state = "warningcorner"; name = "floor"; tag = "icon-warningcorner (NORTH)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "do" = (/obj/structure/closet/crate,/obj/item/weapon/storage/bag/ore,/obj/structure/alien/weeds,/obj/item/device/mining_scanner,/obj/item/weapon/shovel,/obj/item/weapon/pickaxe,/turf/simulated/floor/plating/airless{icon_state = "platingdmg3"; name = "plating"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "dp" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged1"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) -"dq" = (/obj/structure/table/woodentable,/obj/structure/sign/poster{icon_state = "poster24"; pixel_x = 0; pixel_y = -32; serial_number = 24; subtype = 0},/obj/item/weapon/pen,/obj/item/weapon/paper{info = "Log 1:
While mining today I noticed the NT station was finished with its renovations. They placed some huge reinforced tumor on the station – looks so ugly. I wouldn't be surprised if those pigs decided to turn that little astronomy outpost into a prison with that thing, it'd be pretty typical of them.

Log 2:
Really dumb of me, but I just waved at an engineer in the outpost, and he waved back. I hope to god he was too dumb or drunk to recognize the suit, because if he isn't, then we might have to pull out before they come looking for us.

Log 3:
That huge reinforced tumor in their science section has been making a lot of noise lately. I've been hearing some banging and scratching from the other side and I'm kind of glad now that they reinforced this thing so much. I'll be sleeping with my gun under my pillow from now on."; name = "Personal Log"},/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "wood"; name = "floor"; tag = "icon-warningcorner (NORTH)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) +"dq" = (/obj/structure/table/woodentable,/obj/structure/sign/poster/contraband/c20r{pixel_y = -32},/obj/item/weapon/pen,/obj/item/weapon/paper{info = "Log 1:
While mining today I noticed the NT station was finished with its renovations. They placed some huge reinforced tumor on the station – looks so ugly. I wouldn't be surprised if those pigs decided to turn that little astronomy outpost into a prison with that thing, it'd be pretty typical of them.

Log 2:
Really dumb of me, but I just waved at an engineer in the outpost, and he waved back. I hope to god he was too dumb or drunk to recognize the suit, because if he isn't, then we might have to pull out before they come looking for us.

Log 3:
That huge reinforced tumor in their science section has been making a lot of noise lately. I've been hearing some banging and scratching from the other side and I'm kind of glad now that they reinforced this thing so much. I'll be sleeping with my gun under my pillow from now on."; name = "Personal Log"},/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "wood"; name = "floor"; tag = "icon-warningcorner (NORTH)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "dr" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective_locked"; locked = 1; name = "personal closet"; req_access_txt = "150"},/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/weapon/suppressor,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "wood"; name = "floor"; tag = "icon-warningcorner (NORTH)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "ds" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "150"},/obj/item/stack/spacecash/c50,/turf/simulated/floor/wood,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) "dt" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/syndie,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"}) @@ -257,7 +257,7 @@ "eW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "eX" = (/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "eY" = (/obj/machinery/power/port_gen/pacman{desc = "A portable generator for emergency backup power."; name = "P.A.C.M.A.N.-type portable generator"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/awaycontent/a7) -"eZ" = (/obj/machinery/space_heater,/obj/machinery/light/small{dir = 1},/obj/structure/sign/poster{icon_state = "poster5_legit"; pixel_x = 0; pixel_y = 32; serial_number = 21; subtype = 1},/turf/simulated/floor/plating,/area/awaycontent/a7) +"eZ" = (/obj/machinery/space_heater,/obj/machinery/light/small{dir = 1},/obj/structure/sign/poster/official/build{pixel_y = 32},/turf/simulated/floor/plating,/area/awaycontent/a7) "fa" = (/obj/machinery/power/port_gen/pacman/super{desc = "A portable generator for emergency backup power."; name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"; tag = "icon-platingdmg2"},/area/awaycontent/a7) "fb" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/smes{charge = 1.5e+006; input_level = 10000; inputting = 0; output_level = 200000; outputting = 0},/turf/simulated/floor/plating,/area/awaycontent/a7) "fc" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/alarm/monitor{frequency = 1439; locked = 0; pixel_y = 23; req_access = null},/turf/simulated/floor/plating,/area/awaycontent/a7) @@ -304,7 +304,7 @@ "fR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/alien/weeds,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "fS" = (/obj/structure/table,/obj/item/clothing/gloves/color/yellow,/turf/simulated/floor/plating,/area/awaycontent/a7) "fT" = (/obj/structure/filingcabinet,/obj/item/weapon/paper{info = "Entry One — 27/05/2554:
I just arrived, and already I hate my job. I'm stuck on this shithole of an outpost, trying to avoid these damn eggheads running all over the place preparing for god knows what. There's no crimes to stop, no syndies to kill, and I'm not even allowed to beat the fuckin' assistant senseless! They said I was transferred from Space Station 13 for 'good behavior', but this feels more like a punishment than a reward. All I know is that if I don't get some action soon, I'm going to go insane.

Entry Two — 03/06/2554:
Okay, so get this: we got a fuckin' deathsquad coming in today! I thought the day I saw one of them would be the day my employment was 'terminated', if you get my drift. They're escorting some sort of weird alien creature for the eggheads to study. I heard one of the docs telling the chef that this thing killed a whole security force before it was captured. I sure as hell hope that I don't have to fight it.

Entry Three — 08/06/2554:
My first real bit of 'action' today, if you could call it that. Crazy Ivan got in a fight with Kuester today about his Booze-O-Mat. Apparently one of the crewmembers had stolen a couple bottles of booze from the machine after Ivan disabled the ID lock. Tell you the truth, I don't blame the thief. Everyone is going a little stir-crazy in here, and the bartender is being damn stingy with the alcohol. Either way, once they started to pick a fight, I had to take them down. It's a damn shame that we don't have a brig, though. I had to lock Ivan in a fuckin' freezer, for god's sake. Let's hope that we can keep our sanity together, at least for a while.

Entry Four — 10/06/2554:
Jesus fucking Christ riding on a motorbike. These things the scientists are studying are terrifying! Fucking great huge purple bug things as tall as the ceiling, with blades for arms and drooling at the mouth. I don't think my taser will do jack shit against these damn things, but the eggheads say that they're safely contained. If they do, I have a feeling that it's only a matter of time before we're all screwed. These bastards look like walking death.

Entry Five — 18/06/2554:
Finally caught who stole the booze from Kuester. It was that fuckin' loser assistant Steve! He was in the dorms, chugging his worries away. I took one of the bottles back to the barkeep, but no one has to know about this second one. I think I'm gonna enjoy this while watching tomorrow's Thunderdome match.

Entry Six — 19/06/2554:
Oh, great. The chef is still sleeping, so we get Ivan's gruel for breakfast today. I overheard Sano and Douglas saying something about the aliens being restless, so we might get some action today. As long as it happens after the big game, I'm fine with it. I still got one beer to drink before I'm ready to die."; name = "Personal Log — Kenneth Cunningham"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) -"fU" = (/obj/structure/sign/poster{icon_state = "poster21_legit"; pixel_y = 32; serial_number = 21; subtype = 1},/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/turf/simulated/floor/plasteel{dir = 5; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) +"fU" = (/obj/structure/sign/poster/official/safety_report{pixel_y = 32},/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/turf/simulated/floor/plasteel{dir = 5; icon_state = "red"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "fV" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a7) "fW" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "fX" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) @@ -486,7 +486,7 @@ "jr" = (/obj/structure/closet/secure_closet{icon_broken = "rdsecurebroken"; icon_closed = "rdsecure"; icon_locked = "rdsecure1"; icon_off = "rdsecureoff"; icon_opened = "rdsecureopen"; icon_state = "rdsecure1"; locked = 1; name = "research director's locker"; req_access_txt = "271"},/obj/item/weapon/storage/backpack/satchel_tox,/obj/item/clothing/gloves/color/latex,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "js" = (/obj/item/weapon/twohanded/required/kirbyplants{desc = "A plastic potted plant."; layer = 4.1; pixel_y = 3},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "jt" = (/obj/structure/closet/crate/bin,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) -"ju" = (/obj/machinery/vending/snack,/obj/structure/sign/poster{icon_state = "poster14"; pixel_x = 0; pixel_y = 32; serial_number = 14; subtype = 0},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) +"ju" = (/obj/machinery/vending/snack,/obj/structure/sign/poster/official/ue_no{pixel_y = 32},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "jv" = (/obj/structure/stool/bed/chair,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "jw" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "jx" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) @@ -520,7 +520,7 @@ "jZ" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "ka" = (/obj/machinery/door/airlock/glass_research{name = "Research Storage"; req_access_txt = "271"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) "kb" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/awaycontent/a7) -"kc" = (/obj/structure/closet/crate,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a7) +"kc" = (/obj/structure/closet/crate,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/poster/random_contraband,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"; tag = "icon-platingdmg1"},/area/awaycontent/a7) "kd" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating/airless{name = "plating"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "ke" = (/obj/structure/grille,/turf/simulated/floor/plating/airless{name = "plating"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "kf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"}) @@ -543,7 +543,7 @@ "kw" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "kx" = (/obj/machinery/light/small,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -32},/obj/machinery/camera{c_tag = "Arrivals North"; dir = 1; network = list("MO19")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "ky" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) -"kz" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = -32; serial_number = 2; subtype = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) +"kz" = (/obj/structure/sign/poster/official/nanotrasen_logo{pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "kA" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "kB" = (/obj/machinery/door/firedoor{density = 1; icon_state = "door_closed"; opacity = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "kC" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "purple"; tag = "icon-purple (NORTH)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) @@ -651,7 +651,7 @@ "mA" = (/obj/structure/table/woodentable,/obj/machinery/door_control{id = "awaydorm2"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "mB" = (/obj/structure/stool/bed/chair/wood/normal{dir = 8},/turf/simulated/floor/carpet,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "mC" = (/obj/machinery/computer/arcade,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) -"mD" = (/obj/machinery/vending/cigarette,/obj/structure/sign/poster{icon_state = "poster7"; pixel_y = -32; serial_number = 7; subtype = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) +"mD" = (/obj/machinery/vending/cigarette,/obj/structure/sign/poster/contraband/smoke{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "mE" = (/obj/machinery/light/small{dir = 8},/obj/structure/stool/bed/chair/comfy/beige,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "mF" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey{pixel_x = -6; pixel_y = 6},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 6; pixel_y = 8},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 3; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "mG" = (/obj/structure/stool/bed/chair/comfy/beige,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) diff --git a/_maps/map_files/RandomZLevels/spacebattle.dmm b/_maps/map_files/RandomZLevels/spacebattle.dmm index 8b0cfa0e30a..aa1ef17a354 100644 --- a/_maps/map_files/RandomZLevels/spacebattle.dmm +++ b/_maps/map_files/RandomZLevels/spacebattle.dmm @@ -310,7 +310,7 @@ "fX" = (/obj/structure/artilleryplaceholder{tag = "icon-22"; icon_state = "22"},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser) "fY" = (/obj/structure/artilleryplaceholder{tag = "icon-23"; icon_state = "23"},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser) "fZ" = (/obj/structure/artilleryplaceholder{tag = "icon-24"; icon_state = "24"},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser) -"ga" = (/obj/structure/closet/crate,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) +"ga" = (/obj/structure/closet/crate,/obj/item/weapon/poster/random_contraband,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "gb" = (/obj/effect/landmark/corpse/bridgeofficer{mobname = "Robert Faver"; name = "Robert Faver"},/obj/item/ammo_casing/shotgun,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel,/area/awaymission/spacebattle/cruiser) "gc" = (/obj/structure/artilleryplaceholder/decorative{tag = "icon-25"; icon_state = "25"},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser) "gd" = (/obj/structure/artilleryplaceholder/decorative{tag = "icon-26"; icon_state = "26"},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser) diff --git a/_maps/map_files/RandomZLevels/terrorspiders.dmm b/_maps/map_files/RandomZLevels/terrorspiders.dmm index fbf21c23670..da4d3ddacb9 100644 --- a/_maps/map_files/RandomZLevels/terrorspiders.dmm +++ b/_maps/map_files/RandomZLevels/terrorspiders.dmm @@ -10,11 +10,11 @@ "aj" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/plaza) "ak" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza) "al" = (/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) -"am" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = 32; serial_number = 2; subtype = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) -"an" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = 32; serial_number = 2; subtype = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) +"am" = (/obj/structure/sign/poster/official/nanotrasen_logo{pixel_y = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) +"an" = (/obj/structure/sign/poster/official/nanotrasen_logo{pixel_y = 32},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) "ao" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza) "ap" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/plaza) -"aq" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster{icon_state = "poster19_legit"; pixel_x = -32; pixel_y = 0; serial_number = 19; subtype = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza) +"aq" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster/official/safety_internals{pixel_x = -32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza) "ar" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) "as" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/plaza) "at" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza) @@ -69,10 +69,10 @@ "bq" = (/turf/simulated/floor/carpet,/area/awaymission/UO71/plaza) "br" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/plaza) "bs" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/UO71/plaza) -"bt" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = -32; serial_number = 2; subtype = 1},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) +"bt" = (/obj/structure/sign/poster/official/nanotrasen_logo{pixel_y = -32},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) "bu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) "bv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) -"bw" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = -32; serial_number = 2; subtype = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) +"bw" = (/obj/structure/sign/poster/official/nanotrasen_logo{pixel_y = -32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) "bx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall,/area/awaymission/UO71/plaza) "by" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/plaza) "bz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/rust,/area/awaymission/UO71/plaza) @@ -141,7 +141,7 @@ "cK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/awaymission/UO71/plaza) "cL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/rust,/area/awaymission/UO71/plaza) "cM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm1"; locked = 0; name = "Dorm 1"; req_access_txt = "271"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) -"cN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/closet,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza) +"cN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/closet,/obj/item/weapon/poster/random_contraband,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza) "cO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaymission/UO71/plaza) "cP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/stack/rods,/turf/simulated/floor/plating,/area/awaymission/UO71/plaza) "cQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/awaymission/UO71/plaza) @@ -226,7 +226,7 @@ "er" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) "es" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 8; pixel_y = 8},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 0; pixel_y = 3},/obj/item/weapon/watertank,/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaymission/UO71/plaza) "et" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "green"},/area/awaymission/UO71/plaza) -"eu" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/structure/sign/poster{icon_state = "poster21_legit"; pixel_y = -32; serial_number = 21; subtype = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaymission/UO71/plaza) +"eu" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/structure/sign/poster/official/safety_report{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaymission/UO71/plaza) "ev" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/awaymission/UO71/plaza) "ew" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/awaymission/UO71/plaza) "ex" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "redcorner"},/area/awaymission/UO71/plaza) @@ -263,7 +263,7 @@ "fc" = (/obj/machinery/smartfridge,/turf/simulated/wall,/area/awaymission/UO71/centralhall) "fd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) "fe" = (/turf/simulated/wall/rust,/area/awaymission/UO71/centralhall) -"ff" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/sign/poster{icon_state = "poster14"; pixel_x = 32; pixel_y = 0; serial_number = 14; subtype = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "greencorner"},/area/awaymission/UO71/plaza) +"ff" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/sign/poster/contraband/eat{pixel_x = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "greencorner"},/area/awaymission/UO71/plaza) "fg" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/plaza) "fh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/rust,/area/awaymission/UO71/centralhall) "fi" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/window/eastleft{dir = 1; name = "Hydroponics Desk"; req_access_txt = "271"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/centralhall) @@ -508,7 +508,7 @@ "jN" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/research{name = "Research Lab"; req_access_txt = "271"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/UO71/science) "jO" = (/obj/machinery/door/poddoor{id_tag = "UO71_Containment"; name = "Containment 2"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/prince) "jP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall) -"jQ" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster{icon_state = "poster19_legit"; pixel_x = 0; pixel_y = 32; serial_number = 19; subtype = 1},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/centralhall) +"jQ" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster/official/safety_internals{pixel_y = 32},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaymission/UO71/centralhall) "jR" = (/obj/structure/stool/bed/chair{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall) "jS" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall) "jT" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/UO71/centralhall) @@ -713,7 +713,7 @@ "nK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaymission/UO71/science) "nL" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "neutral"},/area/awaymission/UO71/centralhall) "nM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "neutral"},/area/awaymission/UO71/centralhall) -"nN" = (/obj/structure/sign/poster{icon_state = "poster7"; pixel_y = 32; serial_number = 7; subtype = 0},/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/centralhall) +"nN" = (/obj/structure/sign/poster/contraband/smoke{pixel_y = 32},/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/centralhall) "nO" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/UO71/centralhall) "nP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm5"; name = "Dorm 5"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall) "nQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm7"; name = "Dorm 7"},/turf/simulated/floor/plasteel,/area/awaymission/UO71/centralhall) @@ -1178,7 +1178,7 @@ "wH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/vending/engivend{req_access_txt = "0"},/obj/machinery/camera{c_tag = "Engineering Foyer"; dir = 1; network = list("UO71")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaymission/UO71/eng) "wI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaymission/UO71/eng) "wJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/t_scanner,/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/awaymission/UO71/eng) -"wK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/vending/tool,/obj/structure/sign/poster{icon_state = "poster5_legit"; pixel_x = 0; pixel_y = -32; serial_number = 21; subtype = 1},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaymission/UO71/eng) +"wK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/vending/tool,/obj/structure/sign/poster/official/build{pixel_y = -32},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaymission/UO71/eng) "wL" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaymission/UO71/eng) "wM" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaymission/UO71/eng) "wN" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaymission/UO71/eng) diff --git a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm index 9182b9e11df..6536e72fec6 100644 --- a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm @@ -30,12 +30,12 @@ "aD" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "aE" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "aF" = (/obj/machinery/door_control{desc = "A remote control-switch to call the elevator to your level."; id = "UO45_useless"; name = "Call Elevator"; pixel_x = -6; pixel_y = 24; req_access_txt = "0"},/obj/machinery/door_control{desc = "A remote control-switch for the elevator doors."; id = "UO45_Elevator"; name = "Elevator Doors"; pixel_x = 6; pixel_y = 24; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) -"aG" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = 32; serial_number = 2; subtype = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) +"aG" = (/obj/structure/sign/poster/official/nanotrasen_logo{pixel_y = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "aH" = (/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) -"aI" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = 32; serial_number = 2; subtype = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) +"aI" = (/obj/structure/sign/poster/official/nanotrasen_logo{pixel_y = 32},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "aJ" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "aK" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) -"aL" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster{icon_state = "poster19_legit"; pixel_x = -32; pixel_y = 0; serial_number = 19; subtype = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) +"aL" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster/official/safety_internals{pixel_x = -32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "aM" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "aN" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "aO" = (/obj/machinery/light{dir = 8},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) @@ -87,10 +87,10 @@ "bI" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "bJ" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "bK" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) -"bL" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = -32; serial_number = 2; subtype = 1},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) +"bL" = (/obj/structure/sign/poster/official/nanotrasen_logo{pixel_y = -32},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "bM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "bN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) -"bO" = (/obj/structure/sign/poster{icon_state = "poster2_legit"; pixel_x = 0; pixel_y = -32; serial_number = 2; subtype = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) +"bO" = (/obj/structure/sign/poster/official/nanotrasen_logo{pixel_y = -32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "bP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "bQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "bR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/rust,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) @@ -157,7 +157,7 @@ "da" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm2"; name = "Dorm 2"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "db" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "dc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm1"; name = "Dorm 1"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) -"dd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/closet,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) +"dd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/closet,/obj/item/weapon/poster/random_contraband,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "de" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; initialize_directions = 14; tag = "icon-manifold-b-f (NORTH)"},/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "df" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "dg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/rust,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) @@ -255,7 +255,7 @@ "eU" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 8; pixel_y = 8},/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 0; pixel_y = 3},/obj/item/weapon/watertank,/turf/simulated/floor/plasteel{dir = 1; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "eV" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "eW" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) -"eX" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/structure/sign/poster{icon_state = "poster21_legit"; pixel_y = -32; serial_number = 21; subtype = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) +"eX" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/off,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/structure/sign/poster/official/safety_report{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "eY" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/plasteel{dir = 10; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "eZ" = (/obj/machinery/computer/security{network = list("UO45")},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "fa" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "redcorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) @@ -292,7 +292,7 @@ "fF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "fG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "fH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) -"fI" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/sign/poster{icon_state = "poster14"; pixel_x = 32; pixel_y = 0; serial_number = 14; subtype = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "greencorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) +"fI" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/sign/poster/contraband/eat{pixel_x = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 4; icon_state = "greencorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "fJ" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "fK" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 6; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0}) "fL" = (/turf/simulated/wall/r_wall,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) @@ -510,7 +510,7 @@ "jP" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/research{name = "Research Lab"; req_access_txt = "201"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) "jQ" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) "jR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) -"jS" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster{icon_state = "poster19_legit"; pixel_x = 0; pixel_y = 32; serial_number = 19; subtype = 1},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) +"jS" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/structure/sign/poster/official/safety_internals{pixel_y = 32},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "jT" = (/obj/structure/stool/bed/chair{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "jU" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "jV" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) @@ -698,7 +698,7 @@ "nv" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "nw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) "nx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; tag = "icon-manifold-b-f (EAST)"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) -"ny" = (/obj/machinery/vending/cigarette,/obj/structure/sign/poster{icon_state = "poster7"; pixel_y = 32; serial_number = 7; subtype = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) +"ny" = (/obj/machinery/vending/cigarette,/obj/structure/sign/poster/contraband/smoke{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "nz" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "nA" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "nB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) @@ -909,7 +909,7 @@ "ry" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) "rz" = (/obj/machinery/computer/rdservercontrol,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) "rA" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) -"rB" = (/obj/structure/closet/crate,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/contraband/poster,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) +"rB" = (/obj/structure/closet/crate,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/poster/random_contraband,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) "rC" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) "rD" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) "rE" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"}) @@ -1136,7 +1136,7 @@ "vR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/machinery/vending/engivend{req_access_txt = "0"},/obj/machinery/camera{c_tag = "Engineering Foyer"; dir = 1; network = list("UO45")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"}) "vS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"}) "vT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"}) -"vU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/vending/tool,/obj/structure/sign/poster{icon_state = "poster5_legit"; pixel_x = 0; pixel_y = -32; serial_number = 21; subtype = 1},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"}) +"vU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/vending/tool,/obj/structure/sign/poster/official/build{pixel_y = -32},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; icon_state = "floorscorched2"; tag = "icon-floorscorched2 (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"}) "vV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"}) "vW" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"}) "vX" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"}) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 2620009a0a7..31af05cf302 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -393,8 +393,8 @@ "ahC" = (/obj/structure/table,/obj/item/weapon/paper,/obj/item/weapon/pen,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/security/permabrig) "ahD" = (/obj/structure/stool/bed,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/security/permabrig) "ahE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig) -"ahF" = (/obj/item/weapon/restraints/handcuffs/pinkcuffs,/turf/simulated/floor/plating,/area/security/permabrig) -"ahG" = (/obj/item/clothing/mask/muzzle/gag,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/security/permabrig) +"ahF" = (/turf/space,/area/shuttle/gamma/station) +"ahG" = (/obj/structure/table,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/lock_buster,/obj/machinery/light{dir = 1; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/item/weapon/storage/lockbox/mindshield,/turf/simulated/floor/plasteel,/area/security/armoury) "ahH" = (/obj/machinery/deployable/barrier,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/armoury) "ahI" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/shuttle/plating/vox,/area/shuttle/vox) "ahJ" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "voxshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (EAST)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 4},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox) @@ -422,7 +422,7 @@ "aif" = (/obj/machinery/deployable/barrier,/obj/structure/window/reinforced{dir = 8},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/armoury) "aig" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) "aih" = (/turf/simulated/wall/r_wall,/area/security/hos) -"aii" = (/obj/structure/table,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/lock_buster,/obj/machinery/light{dir = 1; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/security/armoury) +"aii" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig) "aij" = (/obj/machinery/deployable/barrier,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/security/armoury) "aik" = (/obj/machinery/flasher/portable,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/security/armoury) "ail" = (/turf/simulated/shuttle/plating/vox,/area/shuttle/vox) @@ -434,9 +434,9 @@ "air" = (/obj/effect/decal/warning_stripes/west,/obj/effect/decal/warning_stripes/east,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) "ais" = (/obj/machinery/door/airlock{name = "Toilet"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/vacantoffice{name = "\improper Security Toilet"}) "ait" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) -"aiu" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) +"aiu" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "aiv" = (/turf/simulated/wall/r_wall,/area/security/securearmoury) -"aiw" = (/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "west bump Important Area"; pixel_x = -24; shock_proof = 0},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/armoury) +"aiw" = (/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "west bump Important Area"; pixel_x = -24; shock_proof = 0},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/camera{c_tag = "Brig Armory"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/armoury) "aix" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/armoury) "aiy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "aiz" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/armoury) @@ -472,7 +472,7 @@ "ajd" = (/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox) "aje" = (/obj/item/weapon/skeleton/r_arm,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox) "ajf" = (/obj/structure/stool/bed,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) -"ajg" = (/obj/structure/rack,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/lockbox/mindshield,/obj/machinery/light_switch{pixel_x = -25},/obj/machinery/camera{c_tag = "Brig Armory"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/armoury) +"ajg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig) "ajh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "aji" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "ajj" = (/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) @@ -527,7 +527,7 @@ "akg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) "akh" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"}) "aki" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig) -"akj" = (/obj/structure/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/item/weapon/storage/box/handcuffs,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/box/teargas{pixel_x = -3; pixel_y = -3},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/armoury) +"akj" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "akk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "akl" = (/obj/machinery/door/airlock/security{name = "Warden's office"; req_access = null; req_access_txt = "3"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/armoury) "akm" = (/obj/effect/decal/warning_stripes/northwestcorner,/obj/effect/decal/warning_stripes/northeastcorner,/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) @@ -737,7 +737,7 @@ "aoi" = (/obj/effect/landmark/start{name = "Brig Physician"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay) "aoj" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/security/medbay) "aok" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay) -"aol" = (/turf/simulated/floor/plasteel,/area/shuttle/gamma/station) +"aol" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) "aom" = (/turf/simulated/wall,/area/security/prisonlockers) "aon" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay) "aoo" = (/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/security/medbay) @@ -870,7 +870,7 @@ "aqL" = (/obj/effect/landmark{name = "carpspawn"},/obj/structure/lattice,/turf/space,/area/space) "aqM" = (/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/range) "aqN" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/range) -"aqO" = (/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Firing Range"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/range) +"aqO" = (/obj/structure/sign/poster/official/random{pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Firing Range"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/range) "aqP" = (/obj/structure/closet/crate,/obj/item/target,/obj/item/target,/obj/item/target,/obj/item/target,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel,/area/security/range) "aqQ" = (/obj/effect/decal/cleanable/dirt,/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/range) "aqR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) @@ -908,11 +908,11 @@ "arx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) "ary" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "arz" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/camera{c_tag = "Brig Main Hall East 1"; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) -"arA" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) +"arA" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/sign/poster/official/random{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) "arB" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) "arC" = (/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) "arD" = (/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) -"arE" = (/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Brig Main Hall East 2"; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) +"arE" = (/obj/structure/sign/poster/official/random{pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Brig Main Hall East 2"; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkredcorners"},/area/security/brig) "arF" = (/turf/simulated/wall,/area/security/podbay) "arG" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay) "arH" = (/obj/structure/table/reinforced,/obj/item/clothing/suit/jacket/pilot,/obj/item/clothing/head/beret/sec,/obj/machinery/light_switch{pixel_x = -25},/obj/item/device/spacepod_key{id = 100000},/obj/item/device/gps,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay) @@ -955,7 +955,7 @@ "ass" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j1s"; sortType = 7},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "ast" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "asu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) -"asv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) +"asv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/poster/official/random{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) "asw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) "asx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) "asy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) @@ -994,12 +994,12 @@ "atf" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/brig) "atg" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) "ath" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) -"ati" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) +"ati" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/sign/poster/official/random{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) "atj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) "atk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/brig) "atl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) "atm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) -"atn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) +"atn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/poster/official/random{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkredcorners"},/area/security/brig) "ato" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkred"},/area/security/brig) "atp" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkredcorners"},/area/security/brig) "atq" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) @@ -1603,14 +1603,14 @@ "aEQ" = (/obj/structure/table/reinforced,/obj/structure/mirror{pixel_x = 28},/obj/item/weapon/razor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) "aER" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_chapel_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "solar_chapel_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "solar_chapel_airlock"; pixel_x = 25; req_access_txt = "13"; tag_airpump = "solar_chapel_pump"; tag_chamber_sensor = "solar_chapel_sensor"; tag_exterior_door = "solar_chapel_outer"; tag_interior_door = "solar_chapel_inner"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aES" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/maintenance/abandonedbar) -"aET" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick/random,/obj/structure/sign/poster{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/abandonedbar) +"aET" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick/random,/obj/structure/sign/poster/contraband/random{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/abandonedbar) "aEU" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating{dir = 10; icon_regular_floor = "escape"},/area/maintenance/abandonedbar) "aEV" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "escape"},/area/maintenance/abandonedbar) "aEW" = (/obj/item/stack/rods,/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/maintenance/abandonedbar) "aEX" = (/obj/item/trash/pistachios,/obj/machinery/light_construct,/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar) "aEY" = (/obj/structure/stool,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/maintenance/abandonedbar) "aEZ" = (/obj/machinery/light,/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plating,/area/maintenance/abandonedbar) -"aFa" = (/obj/structure/sign/poster{pixel_x = 32},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar) +"aFa" = (/obj/structure/sign/poster/contraband/random{pixel_x = 32},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar) "aFb" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/condiment/saltshaker,/obj/item/weapon/reagent_containers/food/condiment/peppermill,/turf/simulated/floor/plating,/area/maintenance/abandonedbar) "aFc" = (/obj/machinery/door/airlock/external{id_tag = "s_docking_airlock"; name = "Shuttle Airlock"; req_access_txt = "150"},/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "syndicate_elite"; name = "Front Hull Door"; opacity = 1},/turf/simulated/shuttle/plating,/area/shuttle/syndicate_elite) "aFd" = (/turf/simulated/wall/r_wall,/area/maintenance/abandonedbar) @@ -2145,7 +2145,7 @@ "aPm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aPn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aPo" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"aPp" = (/obj/structure/sign/poster{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"aPp" = (/obj/structure/sign/poster/contraband/random{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aPq" = (/obj/structure/closet/gmcloset{icon_closed = "black"; icon_state = "black"; name = "formal wardrobe"},/obj/machinery/light/small{dir = 4},/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aPr" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/camera{c_tag = "Fore Primary Hallway South"; dir = 4; network = list("SS13")},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore) "aPs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint) @@ -2192,7 +2192,7 @@ "aQh" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aQi" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aQj" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint) -"aQk" = (/obj/effect/decal/cleanable/dirt,/obj/structure/sign/poster{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/fpmaint) +"aQk" = (/obj/effect/decal/cleanable/dirt,/obj/structure/sign/poster/contraband/random{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aQl" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aQm" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "aQn" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) @@ -2610,6 +2610,7 @@ "aYj" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/bridge) "aYk" = (/obj/machinery/door/window/eastright{name = "Coroner Office"; req_access_txt = "5"},/turf/simulated/floor/plasteel,/area/medical/morgue) "aYl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2) +"aYm" = (/obj/structure/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/item/weapon/storage/box/handcuffs,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/box/teargas{pixel_x = -3; pixel_y = -3},/obj/machinery/light{dir = 8},/obj/machinery/light_switch{pixel_x = -22; pixel_y = 9},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/armoury) "aYn" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aYo" = (/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes/stokcubes,/obj/item/weapon/storage/box/monkeycubes/neaeracubes,/obj/structure/table/glass,/obj/item/weapon/storage/box/monkeycubes/wolpincubes,/obj/item/weapon/storage/box/monkeycubes/farwacubes,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (SOUTHEAST)"; icon_state = "whitepurple"; dir = 6},/area/medical/genetics) "aYp" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/machinery/computer/card/minor/rd,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor) @@ -2684,8 +2685,12 @@ "aZG" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore) "aZH" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 3; name = "Atmospherics Requests Console"; pixel_y = -30},/obj/item/stack/sheet/glass{amount = 50},/obj/item/clothing/head/welding,/obj/item/clothing/head/welding,/turf/simulated/floor/plasteel,/area/atmos) "aZI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint) +"aZJ" = (/obj/effect/decal/cleanable/cobweb,/obj/item/clothing/mask/muzzle/gag,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "aZK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aZL" = (/obj/item/weapon/restraints/handcuffs/pinkcuffs,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) +"aZM" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "aZN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aZO" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/twohanded/required/kirbyplants,/obj/structure/sign/bobross{pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/captain) "aZV" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aZW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aZX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (EAST)"; icon_state = "pipe-j1"; dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -3275,7 +3280,7 @@ "blt" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "blu" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/shuttle/escape) "blv" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape) -"blw" = (/obj/structure/sign/poster/legit{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) +"blw" = (/obj/structure/sign/poster/official/random{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "blx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) "bly" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry) "blz" = (/obj/effect/decal/warning_stripes/east,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit) @@ -3452,7 +3457,7 @@ "boR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) "boS" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) "boT" = (/obj/machinery/firealarm{dir = 2; pixel_y = -24},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) -"boU" = (/obj/structure/sign/poster/legit{pixel_y = -32},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) +"boU" = (/obj/structure/sign/poster/official/random{pixel_y = -32},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) "boV" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) "boW" = (/obj/machinery/camera{c_tag = "Arrivals Hallway"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) "boX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry) @@ -3462,7 +3467,7 @@ "bpb" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/table,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/plating,/area/storage/emergency2) "bpc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/wood,/area/civilian/pet_store) "bpd" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor/plasteel,/area/crew_quarters/locker) -"bpe" = (/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel,/area/crew_quarters/locker) +"bpe" = (/obj/structure/sign/poster/official/random{pixel_x = 32},/turf/simulated/floor/plasteel,/area/crew_quarters/locker) "bpf" = (/obj/structure/grille/broken,/turf/simulated/floor/plating,/area/maintenance/port) "bpg" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/wood,/area/civilian/pet_store) "bph" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/storage/emergency2) @@ -3756,7 +3761,7 @@ "buL" = (/obj/machinery/hydroponics/constructable,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "buM" = (/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) "buN" = (/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) -"buO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/sign/poster/legit{pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) +"buO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/sign/poster/official/random{pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "buP" = (/obj/machinery/light{dir = 8},/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "buQ" = (/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) "buR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) @@ -3956,7 +3961,7 @@ "byD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/west) "byE" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west) "byF" = (/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/central/west) -"byG" = (/obj/machinery/photocopier,/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/wood,/area/bridge/meeting_room) +"byG" = (/obj/machinery/photocopier,/obj/structure/sign/poster/official/random{pixel_x = -32},/turf/simulated/floor/wood,/area/bridge/meeting_room) "byH" = (/obj/machinery/door_control{id = "heads_meeting"; name = "Privacy Shutters Control"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/bridge/meeting_room) "byI" = (/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/bridge/meeting_room) "byJ" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Bridge Conference Room"; dir = 2; network = list("SS13")},/turf/simulated/floor/wood,/area/bridge/meeting_room) @@ -3975,7 +3980,6 @@ "byW" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "byX" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "north bump Important Area"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/crew_quarters/captain) "byY" = (/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain) -"byZ" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bza" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/ne) "bzb" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne) "bzc" = (/obj/structure/sign/directions/evac{dir = 4},/obj/structure/sign/directions/medical{dir = 4; pixel_y = 7},/obj/structure/sign/directions/science{dir = 4},/turf/simulated/wall,/area/crew_quarters/bar) @@ -4154,7 +4158,7 @@ "bCt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port) "bCu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage) "bCv" = (/obj/item/stack/sheet/cardboard,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage) -"bCw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster{pixel_x = -32},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port) +"bCw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster/contraband/random{pixel_x = -32},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port) "bCx" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) "bCy" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage) "bCz" = (/obj/machinery/camera{c_tag = "Cargo Bay Storage"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage) @@ -4296,7 +4300,7 @@ "bFg" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/port) "bFh" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) "bFi" = (/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port) -"bFj" = (/obj/structure/sign/poster{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage) +"bFj" = (/obj/structure/sign/poster/contraband/random{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage) "bFk" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/storage) "bFl" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/port) "bFm" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/quartermaster/storage) @@ -4533,7 +4537,7 @@ "bKg" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_research{name = "Robotics Lab"; req_access_txt = "29"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bKh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bKi" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) -"bKj" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) +"bKj" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/sign/poster/official/random{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "bKk" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/item/clothing/glasses/welding,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/headset/headset_sci{pixel_x = -3},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bKl" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bKm" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/shuttle/escape) @@ -4631,7 +4635,7 @@ "bMe" = (/obj/machinery/mass_driver{id_tag = "trash"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/disposal) "bMf" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab) "bMg" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/item/stack/packageWrap,/obj/item/weapon/pen,/obj/item/weapon/hand_labeler,/obj/structure/table/glass,/obj/item/weapon/book/manual/sop_science,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) -"bMh" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/structure/sign/poster{pixel_x = 32},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"bMh" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/structure/sign/poster/contraband/random{pixel_x = 32},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bMi" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/hallway/secondary/entry) "bMj" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry) "bMk" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plating,/area/maintenance/disposal) @@ -4769,7 +4773,7 @@ "bOU" = (/turf/simulated/wall,/area/medical/chemistry) "bOV" = (/obj/effect/decal/warning_stripes/yellow/partial,/obj/effect/decal/warning_stripes/arrow,/turf/simulated/floor/plasteel,/area/medical/reception) "bOW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/warning_stripes/yellow/partial,/obj/effect/decal/warning_stripes/arrow,/turf/simulated/floor/plasteel,/area/medical/reception) -"bOX" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) +"bOX" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster/official/random{pixel_x = -32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) "bOY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) "bOZ" = (/turf/simulated/floor/plasteel,/area/medical/reception) "bPa" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Chemistry Lab"; req_access_txt = "33"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) @@ -4833,7 +4837,7 @@ "bQk" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/crew_quarters/heads) "bQl" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/carpet,/area/crew_quarters/heads) "bQm" = (/turf/simulated/floor/plasteel,/area/engine/gravitygenerator) -"bQn" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel,/area/crew_quarters/heads) +"bQn" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/sign/poster/official/random{pixel_x = 32},/turf/simulated/floor/plasteel,/area/crew_quarters/heads) "bQo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/space,/area/space) "bQp" = (/obj/structure/stool/bed/chair/office/dark,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator) "bQq" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/engine/gravitygenerator) @@ -5036,7 +5040,7 @@ "bUo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2) "bUp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2) "bUq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2) -"bUr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/sign/poster/legit{pixel_y = -32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2) +"bUr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/sign/poster/official/random{pixel_y = -32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2) "bUs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2) "bUt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2) "bUu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2) @@ -5053,7 +5057,7 @@ "bUF" = (/obj/machinery/computer/operating{name = "Robotics Operating Computer"},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bUG" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/genetics) "bUH" = (/obj/structure/closet/wardrobe/robotics_black,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) -"bUI" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags{pixel_x = -4; pixel_y = -4},/obj/structure/sign/poster/legit{pixel_x = -32},/obj/item/weapon/storage/box/masks,/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 4},/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 4},/area/assembly/robotics) +"bUI" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags{pixel_x = -4; pixel_y = -4},/obj/structure/sign/poster/official/random{pixel_x = -32},/obj/item/weapon/storage/box/masks,/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 4},/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 4},/area/assembly/robotics) "bUJ" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "bUK" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bUL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) @@ -5360,7 +5364,7 @@ "caB" = (/obj/machinery/camera{c_tag = "Central Hallway South-East"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) "caC" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "acute1"; name = "Acute 1 Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper) "caD" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "acute1"; name = "Acute 1 Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper) -"caE" = (/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2) +"caE" = (/obj/structure/sign/poster/official/random{pixel_x = -32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2) "caF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2) "caG" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2) "caH" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/device/radio/intercom/department/medbay{pixel_y = 25},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) @@ -5739,7 +5743,7 @@ "chS" = (/mob/living/simple_animal/mouse/white,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage) "chT" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/storage) "chU" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera{c_tag = "Research Toxins Storage Room"; dir = 4; network = list("Research","SS13"); pixel_y = -22},/turf/simulated/floor/plasteel,/area/toxins/storage) -"chV" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) +"chV" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/sign/poster/official/random{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "chW" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "chX" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "chY" = (/obj/machinery/atmospherics/pipe/simple/insulated{dir = 6},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) @@ -6104,7 +6108,7 @@ "coW" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/apmaint) "coX" = (/obj/structure/table/woodentable,/obj/item/ashtray/glass{pixel_x = -4; pixel_y = -4},/obj/item/weapon/lighter/zippo/blue{pixel_x = 7; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "bcarpet05"},/area/blueshield) "coY" = (/obj/machinery/keycard_auth{pixel_x = -24; pixel_y = 0},/obj/machinery/door/window{dir = 1; name = "Desk Door"; req_access_txt = "67"},/turf/simulated/floor/wood,/area/blueshield) -"coZ" = (/obj/structure/sign/poster/legit{pixel_x = 32},/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/blueshield) +"coZ" = (/obj/structure/sign/poster/official/random{pixel_x = 32},/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/blueshield) "cpa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/wall,/area/ntrep) "cpb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/ntrep) "cpc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet,/area/ntrep) @@ -6196,7 +6200,7 @@ "cqK" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/plasteel{icon_state = "bcarpet05"},/area/blueshield) "cqL" = (/obj/item/flag/nt,/turf/simulated/floor/wood,/area/blueshield) "cqM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/ntrep) -"cqN" = (/obj/item/flag/nt,/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/wood,/area/ntrep) +"cqN" = (/obj/item/flag/nt,/obj/structure/sign/poster/official/random{pixel_x = -32},/turf/simulated/floor/wood,/area/ntrep) "cqO" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/carpet,/area/ntrep) "cqP" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cqQ" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Nanotrasen Representative"},/turf/simulated/floor/carpet,/area/ntrep) @@ -6239,7 +6243,7 @@ "crB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) "crC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) "crD" = (/turf/simulated/wall,/area/medical/psych) -"crE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Medbay Psych Office Corridor West"; network = list("SS13")},/obj/structure/sign/poster/legit{pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) +"crE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Medbay Psych Office Corridor West"; network = list("SS13")},/obj/structure/sign/poster/official/random{pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) "crF" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/medical/psych) "crG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/segment,/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay2) "crH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Psych Office"; req_access_txt = "64"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/psych) @@ -6299,7 +6303,7 @@ "csJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/engine/controlroom) "csK" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "csL" = (/turf/simulated/floor/plating,/area/maintenance/asmaint) -"csM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) +"csM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster/official/random{pixel_x = 32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) "csN" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/closet/firecloset,/obj/item/taperoll/engineering,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/engine/controlroom) "csO" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/obj/structure/closet/firecloset,/obj/item/taperoll/engineering,/turf/simulated/floor/plasteel,/area/engine/controlroom) "csP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/medical/sleeper) @@ -6416,7 +6420,7 @@ "cuW" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "cuX" = (/obj/machinery/camera{c_tag = "Research Hallway South"; dir = 1; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cuY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/visible{dir = 6; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"cuZ" = (/obj/machinery/atmospherics/pipe/manifold/visible,/obj/structure/sign/poster/legit{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) +"cuZ" = (/obj/machinery/atmospherics/pipe/manifold/visible,/obj/structure/sign/poster/official/random{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "cva" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "cvb" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "cvc" = (/obj/item/device/assembly/prox_sensor{pixel_x = -5; pixel_y = -5},/obj/item/device/assembly/prox_sensor{pixel_x = -4; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = 5; pixel_y = 5},/obj/structure/table,/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor{pixel_x = -5; pixel_y = -5},/obj/item/device/assembly/prox_sensor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) @@ -6497,7 +6501,7 @@ "cwz" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/apmaint) "cwA" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/obj/item/stack/sheet/metal{amount = 2},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cwB" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/maintenance/apmaint) -"cwC" = (/obj/structure/sign/poster{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/apmaint) +"cwC" = (/obj/structure/sign/poster/contraband/random{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cwD" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cwE" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cwF" = (/turf/simulated/floor/plasteel,/area/maintenance/consarea) @@ -6567,7 +6571,7 @@ "cxR" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{name = "E.X.P.E.R.I-MENTOR Lab Maintenance"; req_access_txt = "47"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cxS" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/asmaint2) "cxT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall,/area/toxins/explab) -"cxU" = (/obj/structure/sign/poster{pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cxU" = (/obj/structure/sign/poster/contraband/random{pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cxV" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cxW" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Xenobiology Research"; req_access_txt = "47"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cxX" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/incinerator) @@ -6782,7 +6786,7 @@ "cBY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cBZ" = (/obj/machinery/alarm{pixel_y = 22},/obj/structure/table,/obj/item/device/radio/electropack,/obj/item/device/assembly/signaler,/obj/item/device/healthanalyzer,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) "cCa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Xenobiology Research"; req_access_txt = "47"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cCb" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/clothing/ears/earmuffs,/obj/item/device/multitool,/obj/item/clothing/ears/earmuffs,/obj/structure/sign/poster/legit{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) +"cCb" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/clothing/ears/earmuffs,/obj/item/device/multitool,/obj/item/clothing/ears/earmuffs,/obj/structure/sign/poster/official/random{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) "cCc" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) "cCd" = (/obj/structure/closet/bombcloset,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) "cCe" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab) @@ -6873,7 +6877,7 @@ "cDL" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "cDM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/toxins/test_area) "cDN" = (/obj/machinery/camera{c_tag = "Research Toxins Test Chamber South"; dir = 1; network = list("Toxins","Research","SS13")},/obj/machinery/light,/turf/simulated/floor/plasteel/airless,/area/toxins/test_area) -"cDO" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/structure/sign/poster{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"cDO" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/structure/sign/poster/contraband/random{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "cDP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 0; icon_state = "in"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine/insulated,/area/maintenance/incinerator) "cDQ" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/plating,/area/maintenance/apmaint) "cDR" = (/obj/item/weapon/table_parts,/turf/simulated/floor/plasteel,/area/maintenance/consarea) @@ -7540,7 +7544,7 @@ "cQC" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cQD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/aft) "cQE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/hallway/primary/aft) -"cQF" = (/obj/structure/table,/obj/structure/sign/poster{pixel_x = -32},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/assembly/assembly_line) +"cQF" = (/obj/structure/table,/obj/structure/sign/poster/contraband/random{pixel_x = -32},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/assembly/assembly_line) "cQG" = (/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/assembly/assembly_line) "cQH" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/assembly/assembly_line) "cQI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/aft) @@ -7857,7 +7861,7 @@ "cWJ" = (/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) "cWK" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cWL" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/weapon/storage/belt/utility,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) -"cWM" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/item/weapon/stock_parts/cell/high,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) +"cWM" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/item/weapon/stock_parts/cell/high,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/sign/poster/official/random{pixel_x = 32},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) "cWN" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/atmos) "cWO" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 4},/turf/simulated/floor/plasteel,/area/atmos) "cWP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage) @@ -8010,7 +8014,7 @@ "cZI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering) "cZJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/engine/engineering) "cZK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering) -"cZL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/engine/engineering) +"cZL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/poster/official/random{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/engine/engineering) "cZM" = (/turf/simulated/wall,/area/engine/engineering) "cZN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/engine/engineering) "cZO" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Engine Room"; req_access_txt = "10"; req_one_access_txt = null},/turf/simulated/floor/plasteel,/area/engine/engineering) @@ -8086,7 +8090,7 @@ "dbg" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "dbh" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "dbi" = (/obj/structure/closet/crate,/obj/item/clothing/under/color/lightpurple,/obj/item/stack/spacecash/c200,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"dbj" = (/obj/structure/sign/poster{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) +"dbj" = (/obj/structure/sign/poster/contraband/random{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "dbk" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "dbl" = (/obj/machinery/floodlight,/turf/simulated/floor/plating,/area/storage/secure) "dbm" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/medical/virology) @@ -8399,7 +8403,7 @@ "dhh" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/space) "dhi" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk9"; icon_state = "catwalk9"},/area/space) "dhj" = (/obj/machinery/door/airlock/atmos{name = "Turbine Access"; req_access_txt = "12;24"},/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/turbine) -"dhk" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/item/toy/minimeteor,/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"dhk" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/item/toy/minimeteor,/obj/item/weapon/poster/random_contraband,/turf/simulated/floor/plating,/area/maintenance/asmaint) "dhl" = (/obj/machinery/the_singularitygen{anchored = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/storage/secure) "dhm" = (/obj/machinery/power/port_gen/pacman,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/storage/secure) "dhn" = (/obj/structure/grille,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering) @@ -9042,18 +9046,18 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNagkagjagmaglagoagnagqagpagragrafsagsagsaftagsagvabNaabaabaabaabaabaaaaaaaaaaabaaaafOafXafXafOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiCaiDaiEaiFaiGaiHagwahZagZahZagZahZagwaiIaiJaiKaiLaiDaiMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNagMagLagNagOagPagQafvafuafUafwafUafVafYafWagPagWabNaaaaaaaabaaaaabaabaivaivaivaivaaaafOafXafXafOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahJaiDahaahaahaajdagwahaahaahaahaahaagwahaahaajeahaaiDahMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNabNabNabNabNabNahjahkabNabNabNabNabNabNabNagtagtagtagtagtagtagtaaaaguaivagSagRaivaguaaaafOafXafXagUagTagTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwajzajAajBajCajDagwajEahaahaahaajFagwajGahaajHajIajzagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNagVahDahCabNahEaigacWahGahFabNaaaaaaaaaagtahHahRagtahTahSagtaaaaivahUahVahVahWaivaaaaaaafOafXagTahXahYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwajYajYagZagZagZagwajZahaahaahaakaagwagZagZagZajYajYagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNaiaaicaibaieaidaitabNabNabNabNabNabNabNagtaifaijaiiainaikagtaaaaivaioaiqaipairaivaaaaaaaaaagTagTaisagTagTagTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahsakpakpahnaaaaaaagwakqahaahaahaakragwaaaaaaahsakpakpahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQahQahQahQahQahQajJaiuabNaolaolaolaolaolaolagtaiwaiyaixannaizagtaivaivaiAaiNaiBaiOaivaivaaaaabagTaiQaiPaiSaiRagTaaaanHaiTaiVaiUanHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwakAahaahaahaakragwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQahQahQahQaiZaiXajfajaahQahEaigabNaolaolaolaolaolaolagtajgajiajhajlajkajnajmajpajoajrajqajLajKaivaaaajMagTajOajNajQajPanAanHanHajRajTajSanHanHaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwakRakPahZakRakPagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajWajUakcakbakeakdakhakgahQakiaitalcaolaolaolaolaolaolajnakjanWakkannanWaklajjajjakmajjaksakwaktaivaabaabagTakCakxakEakDanAakFakGaoJaoJakHakJakIakvakKakMakLakNaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvalvalvalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwalxalyahaalzalAagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajWakOakSakQakVakTalaakYaldalbaitaleaolaolaolaolaolaolagtalfalgakkalialhajnaljallalkalnalmakfakuaivanHanHanAanAanAanAaloanAalpalralqalualtalFalCalGaiYaiYaiYalHaihaihaaaaaaaaaajbajbajbajbajbajbajbalIalJaaaabpaaaaaaalvaaaaabaaaamhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwamiamjahaamkamlagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajWalKalMalLalOalNalQalPahQalRalSalcaolaolaolaolaolaolagtagtalUalTapPagtagtalValWaivalYalXalZaivaivanHambamaamdamcamfameanAamgaoJammampamnalFamqamrajVamvamsamuamtaihaaaaaaaaaajbajsajtajvajuajwajxajyaaaaaaaaaaaaaaaamWaabamUaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahsagZamYamZanaagZahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQahQaqqahQahQahQahQahQahQamwaigapFapFapFapFapFapFapFapFamxamzamyamzamAamCamBamEamDamGamFamIamHamJauiaoJamKamKamKamKamLakIaoJapmamMamOamNamQamPamTamSanbamXandancaneaaaaaaaaaajbajXajwajwajwajwajxajyaaaaaaaaaaaaamWalvaaaanGaaaalvamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahsagZagZagZahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanfangaomanianhankanjanlajJanmapGanpanoanranqantansapFanuanwanvanzanyanCanBanEanDanIanFanJanJanJanKaoJanLanNanManPanOanQaofaofanRanTanSalFanUanVajVajVanXanZanYaoaaaaaaaaaaajbaknajwakoajwajwajxajyaaaaaaaaaaaaamWaabaabanGaabaabaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanfangaomaocaobaoeaodaohaogaitapGaojaoiaonaokaopaooapFaoqaosaoraouaotaowaovaoxalWaozaoyaoBaoAaoDaoCaoJaoEaoGaoFaoFaoHaoLaoIaoIaoMaoPaoNalFaoQaoRaiYaiYaiYaoTaoSaihaabaaaaaaajbakyajwajwajwajwakzajyaaaaaaaaaaaaamWaaaaaaaoKaaaaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanfaoUaomaoValEaoXaoWanlajJaigapGaoZaoYapbapaapdapcapFapeapgapfaphamyapjapiapkapSapAaplapCapBapEapDapIapHapJapJapLapKapNapMapOaoJapQaoJapRapNapTaiYapVapUapXapWaihaaaaabaabajbapYaqaapZaqcaqbajbalIaqeaaaaaaaaaamWaabappapnapqaabaabamWamWamWamWamWamWaqpamWamWamWamWamWamWamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapsaprapuaptapwapraprapxapraprapvaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabapyaabalvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBakBakBakBaslakWakZaomaomaomaomakUaqsapFapGapGapGaqtaquapGapFaqvalUaqwaqwalTaqxaqxapPapSapSaqyaqzapSapSapSanAaqAaqCaqBanxanAanAaqAaqDanxaqFaqEanxanAaqGaqGaqGaqGaqHaihaihaqIaqIaqIaqIajbalsaqJaqKalsajbaabaaaaaaaaaaaaamWaaaappaqdapqaaaaaaaabaabaabaabaabaabaabaabaqLaabaabaabaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNagVahDahCabNahEaigacWahFahFahFahFahFahFagtahHahRagtahTahSagtaaaaivahUahVahVahWaivaaaaaaafOafXagTahXahYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwajYajYagZagZagZagwajZahaahaahaakaagwagZagZagZajYajYagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNaiaaicaibaieaidaitabNahFahFahFahFahFahFagtaifaijahGainaikagtaaaaivaioaiqaipairaivaaaaaaaaaagTagTaisagTagTagTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahsakpakpahnaaaaaaagwakqahaahaahaakragwaaaaaaahsakpakpahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQahQahQahQahQahQaiiaigaiuahFahFahFahFahFahFagtaiwaiyaixannaizagtaivaivaiAaiNaiBaiOaivaivaaaaabagTaiQaiPaiSaiRagTaaaanHaiTaiVaiUanHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwakAahaahaahaakragwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQahQahQahQaiZaiXajfajaahQajgaolakjahFahFahFahFahFahFalealgajiajhajlajkajnajmajpajoajrajqajLajKaivaaaajMagTajOajNajQajPanAanHanHajRajTajSanHanHaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwakRakPahZakRakPagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajWajUakcakbakeakdakhakgahQakiaitalcahFahFahFahFahFahFajnaYmanWakkannanWaklajjajjakmajjaksakwaktaivaabaabagTakCakxakEakDanAakFakGaoJaoJakHakJakIakvakKakMakLakNaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvalvalvalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwalxalyahaalzalAagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajWakOakSakQakVakTalaakYaldalbaitaleahFahFahFahFahFahFagtalfalgakkalialhajnaljallalkalnalmakfakuaivanHanHanAanAanAanAaloanAalpalralqalualtalFalCalGaiYaiYaiYalHaihaihaaaaaaaaaajbajbajbajbajbajbajbalIalJaaaabpaaaaaaalvaaaaabaaaamhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwamiamjahaamkamlagwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajWalKalMalLalOalNalQalPahQalRalSabNahFahFahFahFahFahFagtagtalUalTapPagtagtalValWaivalYalXalZaivaivanHambamaamdamcamfameanAamgaoJammampamnalFamqamramvajVamsamuamtaihaaaaaaaaaajbajsajtajvajuajwajxajyaaaaaaaaaaaaaaaamWaabamUaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahsagZamYamZanaagZahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQahQaqqahQahQahQahQahQahQamwaigapFapFapFapFapFapFapFapFamxamzamyamzamAamCamBamEamDamGamFamIamHamJauiaoJamKamKamKamKamLakIaoJapmamMamOamNamQamPamTamSanbamXandancaneaaaaaaaabajbajXajwajwajwajwajxajyaaaaaaaaaaaaamWalvaaaanGaaaalvamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahsagZagZagZahnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanfangaomanianhankanjanlajJanmapGanpanoanranqantansapFanuanwanvanzanyanCanBanEanDanIanFanJanJanJanKaoJanLanNanManPanOanQaofaofanRanTanSalFanUanVajVajVanXanZanYaoaaaaaabaabajbaknajwakoajwajwajxajyaaaaaaaaaaaaamWaabaabanGaabaabaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanfangaomaocaobaoeaodaohaogaitapGaojaoiaonaokaopaooapFaoqaosaoraouaotaowaovaoxalWaozaoyaoBaoAaoDaoCaoJaoEaoGaoFaoFaoHaoLaoIaoIaoMaoPaoNalFaoQaoRaiYaiYaiYaoTaoSaihaqIaqIaqIajbakyajwajwajwajwakzajyaaaaaaaaaaaaamWaaaaaaaoKaaaaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwaaaaabaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanfaoUaomaoValEaoXaoWanlajJaigapGaoZaoYapbapaapdapcapFapeapgapfaphamyapjapiapkapSapAaplapCapBapEapDapIapHapJapJapLapKapNapMapOaoJapQaoJapRapNapTaiYapVapUapXapWaihaZJaZMaZLajbapYaqaapZaqcaqbajbalIaqeaaaaaaaaaamWaabappapnapqaabaabamWamWamWamWamWamWaqpamWamWamWamWamWamWamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapsaprapuaptapwapraprapxapraprapvaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaabapyaabalvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBakBakBakBaslakWakZaomaomaomaomakUaqsapFapGapGapGaqtaquapGapFaqvalUaqwaqwalTaqxaqxapPapSapSaqyaqzapSapSapSanAaqAaqCaqBanxanAanAaqAaqDanxaqFaqEanxanAaqGaqGaqGaqGaqHaihaihaqIaucaqIaqIajbalsaqJaqKalsajbaabaaaaaaaaaaaaamWaaaappaqdapqaaaaaaaabaabaabaabaabaabaabaabaqLaabaabaabaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqfaqhaqiaqgaqkaqlaqlaqlaqmaqjaqoaaaaaaaaaalwalwalwalvalvaabaabaaaaqnaaaaabaabalvalvalwalwalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBakXaqraqMaqNaqraqOapzaqQaqPakWaqRaqSaqXaqVaqUaqXaqWariaqYarjaqXaqXaqXaqXarkaqXaqXaqXarlarnarmarparoarrarqarsarsarsartarsaruarwarvarxaqXaryaqWaqXarzarBarAarCaqXariaqXaqXarDarEaqVaqXarFarHarGarJarIajbaabaaaaaaaaaaaaamWaaaappaqdapqaaaaaaaabaqZaraaraaraaraarbaraaraaraaraarcaabaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaardaqhareargaqlarharharharharharfaaaaaaaaaalwaaaaaaaabaaaaabaaaaaaaqnaaaaaaaabaaaaabaaaaaaalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBalDarKalDarLalDarNarMarParOarRaqTarSarQasdascaseaseasfaseasgaseaseaseasiashasiasjasiasiassaskasnasmaspasoasoasoasoasqasoasoasoasrastasAasvasuasxaswaszasyasAasAasCasBasBasDasEasEasEasFasHasGasIamRamVaaaaaaaaaaaaaaaamWaabappaqdapqaaaaaaaabarUaabaaaaaaaabarUaabaabaaaaaaarUaabaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarVaqharWarYarharharharharZasaaqoaaaaaaaaaalwaabarXarXarXarXarXaaaasbaaaarXarXarXarXarXaabalwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakBamoasYasXasZasYasYataatbalBakWaryatgatgatgatfatiathatkatjatmatlatnatjatpatoatratqatratsatuattatwatvatyatxatAatzatCatBatEatDatAatOatRatQaFLaFLaFLaFLaFLaFLaFLaxeatSatSatSatTatSatSatSarFatVatUatXatWajbaaaaaaaaaaaaaabamWaaaappaqdapqaabaabappapnapqaabaabappapnapqaabaabappapnapqaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9103,7 +9107,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrNbtvbtybtCbtDbtDbtzbtDbtDbtDbtzbrQaSdaSdaSdaToboRbqrbrUbtFbtGbrUbtBbtAbtHbtEbqrbtLbtMbtIblQblMbtObtPbtKbtJbtQbtNbtSbtRbtRbtRbtUbtTblMbnKbsdbtYbtZbtVbubblTblTblTblTblTbucbudbtWbufbugbnTbnObssbgSbgSbgSbtXbuebuabuibuhbujbqSbunbukbumbulbupbuoburbuqbutbusbuubuhbuwbuvbuybuxbuAbuzbuEbuEbuBbhqbuCaUSbmqbuDbuIbpKbmqbuFbuGbmqbuHbuMbpKbmqbogbofbofbofboibofbuJbofbsWbrobuKbebbuPbrrboBboAboAboBbrubuLbebbuNbuQbuObuSbuRbuUbuTbuWbuVbuVbuVbuVbuVbuVbuXbuZbuYboJboJboJboJboJboJbvdbvabvcbvbbjKbjKbjKbvebltbjKbvgbqnbwDbvhcUBbjRblDblAbeCblCbnbblAbeCblCbnbblAbeCblCblDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvibvjbvjbvjbvjbvjbvjbvjbvjbvjbvjbvfbvlaOQbvlaSfboRbqrbvmbrUbvnbvnbvnbvkbrUbvobqrbvqbvrbtIbvsbvsbvsbvsbvpbvsbvtbnDbvvbvubvwbvwbvybvxblMbvzbvBbvAbvDbvCbvFbvGbvHbvIbvHbvJbvJbvJbvJbvJbvKbvEbnObvLbvNbvMbvPbvObvRbvQbvTbvSbuobvUbvVbvXbvXbvXbvXbvWbvXbvZbwabwbbvYbvUbwdbwcbmcbwebwgbwfbwibwhbwjbhqbhqbsNbmqbwkbmqbmqbmqaZVbmqbmqbwmbwmbmqbmqbwlbofbofbwnbwobofbofbofbwqbwpbwrbebbqabrrboBboBboBboBbrubwsbebbwtbwvbwvbwwbwvbwubljbljbljbljbwybljbljbljbwzbvaboJboJboJboJboJboJboJbvdbvabvcbvbbjKboMboMboNboMbjKbwxbjRbwBbwAbwCbjRbnbblAbeCblCbnbblAbeCblCbnbblAbeCblCbnbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwFbwEbwGbwHbwIbwIbwJbwIbwIbwIbwJbrQaSdaSdaSdbwKblFbwLbrUbwMbvnbvnbvnbvkbwMbrUbqrbwNbwObtIbvsbwPbwQbwRbwSbvsbwUbwTbwVblMbwWbwXbwZbwYblMbnKbxabxbbxbbxcbxbbxbbxbbxbbxebxdbxdbxdbxfbxdbxgbxhbxibxjbxkbxlbxlbxlbxlbxlbxmbxmbxnbxmbvXbvXbxobxpbxqbxrbxtbxsbxobxubvXbxvbxwbxvbxvbxvbxvbxvbxvbxvbwjbhqbhqaUSbxxbmqbxybxzbmqbxAbmqbxBbxDbxCbmqbxEbdTbxFbxGbdTbdTbxHbxJbxIbxJbdTbdTbebblbbxLbxMbxMbxMbxMbxLbxNbebbxObwvbwvbwwbxPbaubxQbxRbxSbxTbxUbxVbxWbxXbxYaYPbxZbcDbyaboJboJbyabcDbybaYPbycbvbbjKbqlbqlbqmbqlbjKbvgbqnbwDbvhcUBbjRbqoblAbeCblCbqoblAbeCblCbqoblAbeCblCbqoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwFbrObrObrQbrObrObrObrRbrObrObydaabaSdbyebndbyfbqrbtFbtFbtFbrUbyhbygbyjbyibqrbykbylbtIbvsbymbvsbynbyobvsbyqbypbyrblMbwWbwXbwZbskblMbnKbxabxbbytbysbyubyvbywbxbbyybyxbyAbyzbyBbyBbyBbyCbyEbyDbyFbxlbyGbyHbyIbyJbyLbyKbyMbyNbvXbyObxqbxqbyPbyQbyPbxqbxqbyRbvXbySbyUbyTbyWbyVbyYbyXbyZbxvbzabzbbzbbzcaUSaUSaUSaUSbzdbsNbzdbzeaUSbdRaUSaUSbdTbdTbdTbdTbzgbzfbzfbzfbzfbzhbzibebbjBbzjbjBbzkbzkbjBbzjbjBbebbxObwvbwvbzlbxPbaubaubaubaubaubtfbaubaubaubauaYPaYOaYQaYQaYQaYQaYQaYQaYPaYPbznbzmbzobxKbjKbjMbjKbjKbzpbjRbjRbjRbjRbqnbicbzqbeCbeCbeCbeCbeCbeCbeCbeCbeCbeCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwFbrObrObrQbrObrObrObrRbrObrObydaabaSdbyebndbyfbqrbtFbtFbtFbrUbyhbygbyjbyibqrbykbylbtIbvsbymbvsbynbyobvsbyqbypbyrblMbwWbwXbwZbskblMbnKbxabxbbytbysbyubyvbywbxbbyybyxbyAbyzbyBbyBbyBbyCbyEbyDbyFbxlbyGbyHbyIbyJbyLbyKbyMbyNbvXbyObxqbxqbyPbyQbyPbxqbxqbyRbvXbySbyUbyTbyWbyVbyYbyXaZObxvbzabzbbzbbzcaUSaUSaUSaUSbzdbsNbzdbzeaUSbdRaUSaUSbdTbdTbdTbdTbzgbzfbzfbzfbzfbzhbzibebbjBbzjbjBbzkbzkbjBbzjbjBbebbxObwvbwvbzlbxPbaubaubaubaubaubtfbaubaubaubauaYPaYOaYQaYQaYQaYQaYQaYQaYPaYPbznbzmbzobxKbjKbjMbjKbjKbzpbjRbjRbjRbjRbqnbicbzqbeCbeCbeCbeCbeCbeCbeCbeCbeCbeCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjQaLdaSdaSdaSdaMsaMsaMsaMsaMsaMsbzrbzsbqrbqrbqrbqrbqrbqrbztbqrbqrbqrbnKbnKbzwbvsbzubzvbynbzxbvsbzzbzybzAblMbwWbwXbwZbnDblMbnKbxabxbbzDbzBbzCbyvbzCbxbbyybzGbzEbzFbzIbzHbzKbzJbzMbzLbyFbzRbzNbzObzPbzQbzQbzPbzUbzSbvXbzTbxqbxqbyPbzWbyPbxqbxqbzVbwbbzXbAbbzYbzZbAabAdbzYbAcbxvbAlbAebAfbAgbAhbAibAjbAkbAkbAkbAkbAkbAkbAmbAobAnbAkbAkbAqbAkbAkbAkbAkbAkbAkbAkbAkbApbAsbArbArbArbArbArbArbAtbAibAubAvbAvbAxbAwbAybAwbAzbAwbABbAAbACbAwbAFbADbAEbAHbAGbAGbAGbAGbAGbAGbAGbAIbALbAJbAJbAKbAJbBObjKbjKbrIbAMboIbANbrMboIbAObeCbeCbeCbeCbAPbeCbAPbeCbeCbeCbeCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAQbARbARbARbARbASbASbARbARbATaaaaabaSdaUkaSgbAVbAUbAXbAWbAWbAWbAWbAYbAZbBablQbnwbBcbBbbvsbvsbvsbBdbyobvsblMblMblMblMbwWbBebBgbBfblMbBhbBibxbbBjbBkbyvbzCbBlbxbbyybBmbzEbzFbBnbBobBpbzJbBqbzLbyFbzRbBrbBsbBtbBubBvbBwbzUbBxbvXbBybyPbxqbBAbBzbBAbxqbyPbBBbxubBCbzYbzYbzZbBDbAdbzYbBEbxvbBFbAfbAfbAgbAhbAibAkbAkbAkbAkbAkbAkbAkbBGbAkbAkbAkbAkbAkbAkbBHbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBJbBKbBLbAGbAGbBMbwvbwvbwvbwvbwvbwwbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbBNbwvbDobBPbjKbjKbBQbjKbjKbjKbjKbBUbjRbqnbjRbjRbjRbqpbjCbBWbBVbjCbBXaYUbBXaYUbBYbBRbBSbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbCcbBZbCebCbbCbbClbCibARbATaSdaSdaSdaTobCnbCfbCgbCfbCfbCfbCfbChbCtbCjblQblQbCkbCwbvsbwPbCmbCxbzxbvsbCobCpbCoblMblMblMblMbCqblMbCrbCsbxbbCybCubzCbCvbCzbxbbyybzJbCBbzFbBnbBnbCEbzJbCFbzLbyFbzRbCAbBsbBtbCGbCCbBwbzUbCDbvXbCHbCIbxqbCKbCJbCLbxqbCRbCNbCSbCMbCTbCObCPbCQbCUbzYbCVbxvbCYbCXbAfbAgbAhbAibAkbCZbAkbAkbAkbAkbCWbDbbDbbDbbDbbDcbAkbAkbAkbAkbDdbAkbCZbDabAkbAkbDebDgbDfbDhbDibDibDlbDjbDnbDmbwvbwvbwvbwvbwvbwvbwvbDkbDpbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbDrbDqbDqbDsbDubDtbDxbDvbDvbDybDAbEHbmZbAMboIbrMbrMboIbDBdsldsldsldsnbicaaabicbDDbDwbDwbDFbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9235,4 +9239,3 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} - diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index 79d5bede9fd..fdaf1531777 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -152,7 +152,7 @@ "cV" = (/obj/structure/flora/ausbushes/brflowers,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops) "cW" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops) "cX" = (/obj/structure/flora/ausbushes/reedbush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops) -"cY" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_box/shotgun/buck,/obj/item/ammo_box/shotgun/buck,/obj/item/ammo_box/shotgun/buck,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/turf/simulated/floor/engine,/area/shuttle/gamma/space) +"cY" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/gamma/space) "cZ" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/trackimp,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) "da" = (/obj/structure/table/reinforced,/obj/item/weapon/scalpel,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) "db" = (/turf/simulated/floor/holofloor{tag = "icon-carpet2-0 (EAST)"; icon_state = "carpet2-0"; dir = 4},/area/holodeck/source_theatre) @@ -634,7 +634,7 @@ "mj" = (/obj/structure/stool/bed/chair/comfy/black{dir = 1},/obj/effect/landmark{name = "ERT Director"},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/specops) "mk" = (/obj/structure/stool,/obj/effect/landmark{name = "Syndicate-Spawn"},/obj/effect/decal/warning_stripes/east,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "ml" = (/obj/structure/stool,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/syndicate_mothership) -"mm" = (/obj/structure/stool,/obj/structure/sign/poster/legit{pixel_y = 32},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/control) +"mm" = (/obj/structure/stool,/obj/structure/sign/poster/random{pixel_y = 32},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/control) "mn" = (/obj/structure/stool,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/control) "mo" = (/obj/structure/stool,/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/unsimulated/floor{tag = "icon-redyellowfull"; icon_state = "redyellowfull"},/area/centcom/control) "mp" = (/obj/structure/stool,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control) @@ -756,25 +756,25 @@ "oB" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (WEST)"; icon_state = "fakewindows"; dir = 8},/area/syndicate_mothership) "oC" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (EAST)"; icon_state = "fakewindows"; dir = 4},/area/syndicate_mothership) "oD" = (/turf/unsimulated/floor/snow,/obj/structure/flora/bush,/turf/unsimulated/floor/snow{tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership) -"oE" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/machinery/light{dir = 1},/turf/simulated/floor/engine,/area/shuttle/gamma/space) -"oF" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/shuttle/gamma/space) -"oG" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/weapon/gun/rocketlauncher,/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/shuttle/gamma/space) +"oE" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/gamma/space) +"oF" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/gamma/space) +"oG" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/gamma/space) "oH" = (/obj/structure/table,/obj/item/weapon/storage/fancy/crayons,/obj/item/weapon/storage/fancy/crayons,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) "oI" = (/obj/machinery/washing_machine,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) -"oJ" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/clusterbuster,/turf/simulated/floor/engine,/area/shuttle/gamma/space) +"oJ" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) "oK" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/centcom/gamma) "oL" = (/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4},/area/centcom/gamma) "oM" = (/obj/machinery/door/airlock/centcom{name = "Team Storage"; opacity = 1; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/specops) -"oN" = (/obj/machinery/power/apc{dir = 8; name = "Gamma Armory APC"; pixel_x = -27; pixel_y = 2},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/engine,/area/shuttle/gamma/space) +"oN" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_box/shotgun/buck,/obj/item/ammo_box/shotgun/buck,/obj/item/ammo_box/shotgun/buck,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) "oO" = (/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) -"oP" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/engine,/area/shuttle/gamma/space) +"oP" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/weapon/gun/energy/sniperrifle,/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) "oQ" = (/obj/machinery/vending/syndisnack,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "oR" = (/obj/machinery/vending/syndicigs,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "oS" = (/obj/structure/table/woodentable{dir = 10},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "SPECOPS"; name = "Ready Room"; pixel_x = 6; pixel_y = 6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "ASSAULT"; name = "Assault Armor"; pixel_x = -6; pixel_y = 6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "specopsoffice"; name = "Privacy Shutters"; pixel_x = 6; pixel_y = -6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "CCGAMMA"; name = "Gamma Lockdown"; pixel_x = -6; pixel_y = -6; req_access_txt = "114"},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops) "oT" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/centcom/gamma) "oU" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/centcom/gamma) "oV" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/centcom/gamma) -"oW" = (/obj/structure/sign/securearea,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) +"oW" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) "oX" = (/obj/machinery/door/airlock/centcom{name = "Prison"; opacity = 1; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) "oY" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops) "oZ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/flora/ausbushes/fernybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/specops) @@ -783,20 +783,21 @@ "pc" = (/mob/living/simple_animal/pet/fox/Syndifox,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "pd" = (/obj/effect/decal/warning_stripes/southeastcorner,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "pe" = (/obj/effect/decal/warning_stripes/south,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) -"pf" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) -"pg" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) -"ph" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) -"pi" = (/obj/structure/cable,/obj/machinery/mech_bay_recharge_port/upgraded,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) -"pj" = (/obj/structure/cable,/obj/machinery/computer/mech_bay_power_console,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) -"pk" = (/obj/mecha/combat/durand/loaded{operation_req_access = list(1)},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) +"pf" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"pg" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "16"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"ph" = (/obj/machinery/recharger/wallcharger{pixel_x = 32},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"pi" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "15"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"pj" = (/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"pk" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/weapon/gun/rocketlauncher,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) "pl" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "pm" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/cans/beer{pixel_x = -2; pixel_y = 5},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) -"pn" = (/obj/structure/table/reinforced,/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/kitchen/knife/combat,/turf/simulated/floor/engine,/area/shuttle/gamma/space) -"po" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/chem_grenade/incendiary{name = "Incendiary Grenade"},/turf/simulated/floor/engine,/area/shuttle/gamma/space) +"pn" = (/obj/machinery/door/airlock/shuttle,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"po" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/clusterbuster,/obj/item/weapon/grenade/chem_grenade/incendiary{name = "Incendiary Grenade"},/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/kitchen/knife/combat,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) "pp" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership) "pq" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Bathroom"; dir = 2; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) "pr" = (/obj/machinery/door/airlock/centcom{name = "Bathroom"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "ps" = (/obj/machinery/telecomms/server/presets/centcomm,/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control) +"pt" = (/obj/machinery/door/airlock/shuttle{req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) "pu" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (NORTHWEST)"; icon_state = "fakewindows"; dir = 9},/area/syndicate_mothership) "pv" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (WEST)"; icon_state = "fakewindows2"; dir = 8},/area/syndicate_mothership) "pw" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice{pixel_x = -5; pixel_y = 5},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) @@ -806,6 +807,7 @@ "pA" = (/obj/machinery/light,/turf/unsimulated/floor{icon_state = "floor"},/area/syndicate_mothership) "pB" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{dir = 4; pixel_x = 32; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) "pC" = (/obj/machinery/door/poddoor{id_tag = "nukeop_ready"; name = "Shuttle Dock Door"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) +"pD" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/gamma/space) "pE" = (/obj/structure/stool/bed,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "pF" = (/turf/unsimulated/wall/fakeglass,/area/syndicate_mothership) "pG" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/specops) @@ -890,16 +892,15 @@ "rh" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{icon_state = "platingdmg1"},/area/centcom) "ri" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{icon_state = "floorscorched2"},/area/centcom) "rj" = (/obj/structure/rack,/obj/item/weapon/implanter/adrenalin{pixel_x = 12; pixel_y = -12},/obj/item/weapon/implanter/emp{pixel_x = 9; pixel_y = -9},/obj/item/weapon/implanter/explosive{pixel_x = 6; pixel_y = -6},/obj/item/weapon/implanter/explosive_macro{pixel_x = 3; pixel_y = -3},/obj/item/weapon/implanter/freedom,/obj/item/weapon/implanter/krav_maga{pixel_x = -9; pixel_y = 9},/obj/item/weapon/implanter/mindshield{pixel_x = -6; pixel_y = 6},/obj/item/weapon/implanter/storage{pixel_x = -3; pixel_y = 3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"rk" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/gamma/space) +"rl" = (/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"rm" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/mech_bay_recharge_port/upgraded,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"rn" = (/obj/machinery/power/apc{dir = 2; name = "Gamma Armory APC"; pixel_y = -24},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"ro" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/computer/mech_bay_power_console,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/gamma/space) +"rp" = (/obj/mecha/combat/durand/loaded{operation_req_access = list(1)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/mech_bay_recharge_floor,/area/shuttle/gamma/space) "rE" = (/turf/unsimulated/wall,/area/start) "rH" = (/obj/effect/landmark/start,/turf/unsimulated/floor,/area/start) "rK" = (/turf/unsimulated/wall/splashscreen,/area/start) -"rV" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/weapon/gun/energy/sniperrifle,/turf/simulated/floor/engine,/area/shuttle/gamma/space) -"rX" = (/turf/simulated/floor/engine,/area/shuttle/gamma/space) -"sa" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) -"sb" = (/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/shuttle/gamma/space) -"se" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/shuttle/gamma/space) -"sg" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) -"sm" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space) "sq" = (/turf/unsimulated/wall,/area/centcom/control) "sr" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "ss" = (/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) @@ -946,7 +947,7 @@ "tl" = (/obj/machinery/mass_driver{dir = 8; drive_range = 50; id_tag = "ASSAULT3"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) "tm" = (/turf/unsimulated/floor{icon_state = "loadingarea"; dir = 8},/area/centcom/specops) "tn" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) -"to" = (/obj/structure/sign/poster/legit{pixel_x = -32},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/control) +"to" = (/obj/structure/sign/poster/random{pixel_x = -32},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/control) "tp" = (/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -6},/obj/structure/table,/turf/unsimulated/floor{tag = "icon-redyellowfull"; icon_state = "redyellowfull"},/area/centcom/control) "tq" = (/obj/machinery/vending/dinnerware{req_access_txt = "102"},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control) "tr" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/food/condiment/enzyme,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control) @@ -1619,14 +1620,14 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititItktitititItJtmtntdtdtdsqtKtLtMedtFtFtFtFtFeesqsusxsusqsusususususususqsqfLsqsqsqsqsqsqsqsqsqsqsqsqsqsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXsXsXsXsXsXtatttutdtdtdsqsqeWeVsqeWeVsqsqsqsqsqtQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqfXaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNthtitititititititVtktitititVtWtXtYtdtdtdsXaNaNaNaNaNaNsXfecoflsqtQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfmfmfmfmfmfmfmfmfmsXsXsXsXsXsXuaubsXsXsXsXsXsXsXsXsXfeujflsqtQtRucudududududududududuetRtZsqaNaNoeodododododododofaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfofnfqfpfsfrfnfEfmufuguguhuiujujujsXukukukukulukumunfeujflsqtQtRtZsususususususususutQtRtZsqaNaNohogojoioioioiokohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfmfmfmfmfmfmfmjHfFkdkdkdkdfFlZmdujujujujujujujujuqururururururussXfeujflsqtQtRtZsuutuuuvuwuxuyuzsutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmcYoFoErVoGoJfmoKkdkdkdkdkdkdoLmdujujujujujujujujsXuAuBuBuBuBuBuCsXsXoMsXsquEtRtSsuuFtRuGuHtRtRtRsuuEtRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmoNoPrXrXrXrXfdoUoToToToToToToVfdujujujuIuIujujujuJuKuKuKuKuKuKuKuLuKuKuKuMtRtRtRuNtRtRtRtRtRtRtRuNtRtRtZoltRolomogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmsasesbsbsaoWfmfmfmfmfmfmfmfmfmfmujujuOuPuQuRujuSsXsXuTuUuTsXsXoXsXoZoYpbsquetRucsutRtRtRtRtRtRtRsuuetRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpfphpgsgsgsgfmaNaNaNaNaNaNaNaNsXujuXuRooonvavbujvcvdvdvdvdvesXuKsXsXsXsXsqtQtRtZsuvfuuvgvgvgvhvisutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpipkpjsmpnpofmaNaNaNaNsXuWuWsXsXujujvauRvmuRujujvnvdvovpvqvdsXuKsXvrtTtUsqtQtRtZsqsqvsvtvuvvvwsqsqtQtRtZsqaNaNohogogogopogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmsXsXsXsXsXsXuaubsXsXsXsXsXsXsXsXsXfeujflsqtQtRucudududududududududuetRtZsqaNaNoeodododododododofaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmcYoEoEoEoEoFfmfofnfqfpfsfrfnfEfmufuguguhuiujujujsXukukukukulukumunfeujflsqtQtRtZsususususususususutQtRtZsqaNaNohogojoioioioiokohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmoGoNoJoWoPoGfmjHfFkdkdkdkdfFlZmdujujujujujujujujuqururururururussXfeujflsqtQtRtZsuutuuuvuwuxuyuzsutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpgpfpfpfphoGfmoKkdkdkdkdkdkdoLmdujujujujujujujujsXuAuBuBuBuBuBuCsXsXoMsXsquEtRtSsuuFtRuGuHtRtRtRsuuEtRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpipfpkpopfptfdoUoToToToToToToVfdujujujuIuIujujujuJuKuKuKuKuKuKuKuLuKuKuKuMtRtRtRuNtRtRtRtRtRtRtRuNtRtRtZoltRolomogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmoGpjpfpfrloGfmfmfmfmfmfmfmfmfmfmujujuOuPuQuRujuSsXsXuTuUuTsXsXoXsXoZoYpbsquetRucsutRtRtRtRtRtRtRsuuetRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpnrnrmrprooGfmaNaNaNaNaNaNaNaNsXujuXuRooonvavbujvcvdvdvdvdvesXuKsXsXsXsXsqtQtRtZsuvfuuvgvgvgvhvisutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpDoEoEoEoErkfmaNaNaNaNsXuWuWsXsXujujvauRvmuRujujvnvdvovpvqvdsXuKsXvrtTtUsqtQtRtZsqsqvsvtvuvvvwsqsqtQtRtZsqaNaNohogogogopogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfmfmfmfmfmfmfmaNaNaNaNsXvkvkpqprujujujvyvyujujujvzvdvAvBvCbesXuKsqpstRtRvFtRtRtZsqsqsusususususqsqtQtRtZsqaNaNoqodododododododoraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkvkvksXvIvJujujujujvLujsXvdoSmjeTvPsXuKsqvQtRtZsutQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkpBsXsXsXsXsXsXbfbfsXsXsXvSvTvUvVvdsXuKsqvWtRvXsutQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN diff --git a/_maps/map_files/cyberiad/z4.dmm b/_maps/map_files/cyberiad/z4.dmm index 49a33f2eace..a70b3a16126 100644 --- a/_maps/map_files/cyberiad/z4.dmm +++ b/_maps/map_files/cyberiad/z4.dmm @@ -213,7 +213,7 @@ "ee" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engiestation) "ef" = (/obj/structure/mirror,/turf/simulated/wall,/area/engiestation) "eg" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/plasteel,/area/engiestation) -"eh" = (/obj/structure/table/woodentable,/obj/item/ashtray/plastic,/obj/structure/sign/poster/legit{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/engiestation) +"eh" = (/obj/structure/table/woodentable,/obj/item/ashtray/plastic,/obj/structure/sign/poster/random{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/engiestation) "ei" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/engiestation) "ej" = (/obj/machinery/light,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/engiestation) "ek" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk5"; icon_state = "catwalk5"},/area/space) @@ -222,7 +222,7 @@ "en" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/engiestation) "eo" = (/obj/machinery/light,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engiestation) "ep" = (/obj/structure/table/reinforced,/obj/item/weapon/lipstick/random,/obj/item/weapon/lipstick/random,/obj/item/weapon/storage/fancy/cigarettes/cigpack_carp,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engiestation) -"eq" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,/turf/simulated/floor/plasteel,/area/engiestation) +"eq" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,/turf/simulated/floor/plasteel,/area/engiestation) "er" = (/obj/structure/sign/nosmoking_2{pixel_x = -32},/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/engiestation) "es" = (/turf/simulated/floor/plasteel{tag = "icon-stage_stairs"; icon_state = "stage_stairs"},/area/engiestation) "et" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/paint/remover,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plasteel,/area/engiestation) @@ -233,7 +233,7 @@ "ey" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/space,/area/space) "ez" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_x = -28; pixel_y = 0},/turf/simulated/floor/plasteel,/area/engiestation) "eA" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/engiestation) -"eB" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel,/area/engiestation) +"eB" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/sign/poster/random{pixel_x = 32},/turf/simulated/floor/plasteel,/area/engiestation) "eC" = (/obj/machinery/computer/shuttle/engineering,/turf/simulated/floor/plasteel,/area/engiestation) "eD" = (/obj/structure/closet/wardrobe/atmospherics_yellow,/obj/machinery/light_switch{pixel_y = -28},/turf/simulated/floor/plasteel,/area/engiestation) "eE" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/cleanable/dirt,/obj/machinery/light,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel,/area/engiestation) diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm index 86b225e0d1b..71a73a26301 100644 --- a/_maps/map_files/cyberiad/z5.dmm +++ b/_maps/map_files/cyberiad/z5.dmm @@ -880,8 +880,8 @@ "qV" = (/turf/simulated/wall,/area/mine/laborcamp) "qW" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "qX" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) -"qY" = (/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) -"qZ" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/mine/laborcamp) +"qY" = (/obj/structure/sign/poster/random{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) +"qZ" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/sign/poster/random{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/mine/laborcamp) "ra" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/mine/laborcamp) "rb" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=1-Storage"; location = "7-Sleeper"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/mine/laborcamp) "rc" = (/obj/machinery/light/small{dir = 4},/obj/structure/stool/bed/roller,/obj/machinery/light_switch{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/mine/laborcamp) @@ -907,7 +907,7 @@ "rw" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "rx" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/item/device/radio/intercom/locked/prison{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "ry" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) -"rz" = (/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/plasteel{icon_state = "asteroidfloor"},/area/mine/laborcamp) +"rz" = (/obj/structure/sign/poster/random{pixel_x = -32},/turf/simulated/floor/plasteel{icon_state = "asteroidfloor"},/area/mine/laborcamp) "rA" = (/turf/simulated/floor/plasteel{icon_state = "asteroidfloor"},/area/mine/laborcamp) "rB" = (/obj/item/device/radio/intercom/locked/prison{pixel_y = 25},/turf/simulated/floor/plating{icon_plating = "asteroidplating"; icon_state = "asteroidplating"},/area/mine/laborcamp) "rC" = (/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning (SOUTHWEST)"; icon_state = "asteroidwarning"; dir = 10},/area/mine/dangerous/explored) @@ -920,7 +920,7 @@ "rJ" = (/obj/machinery/door/poddoor/preopen{id_tag = "Labor"; name = "labor camp blast door"},/obj/machinery/door/airlock{name = "Labor Camp External Access"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "rK" = (/turf/simulated/floor/plasteel/airless{tag = "icon-asteroidwarning (SOUTHEAST)"; icon_state = "asteroidwarning"; dir = 6},/area/mine/dangerous/explored) "rL" = (/obj/machinery/vending/sustenance,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) -"rM" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) +"rM" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/structure/sign/poster/random{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "rN" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/wall,/area/mine/laborcamp) "rO" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "rP" = (/obj/machinery/flasher{id = "Labor"; pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/wall,/area/mine/laborcamp) @@ -955,7 +955,7 @@ "ss" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/mine/laborcamp) "st" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/mine/laborcamp) "su" = (/obj/machinery/computer/shuttle/labor/one_way,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) -"sv" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=6-Vending"; location = "5-Central"},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) +"sv" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=6-Vending"; location = "5-Central"},/obj/structure/sign/poster/random{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "sw" = (/obj/machinery/conveyor{dir = 8; id = "gulag"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "sx" = (/obj/machinery/mineral/stacking_machine{dir = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) "sy" = (/obj/machinery/conveyor{dir = 10; icon_state = "conveyor0"; id = "gulag"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/mine/laborcamp) diff --git a/_maps/map_files/shuttles/emergency_dept.dmm b/_maps/map_files/shuttles/emergency_dept.dmm index 64b903a78f5..0a17d3d7095 100644 --- a/_maps/map_files/shuttles/emergency_dept.dmm +++ b/_maps/map_files/shuttles/emergency_dept.dmm @@ -45,30 +45,30 @@ "aS" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area/shuttle/escape) "aT" = (/obj/docking_port/mobile/emergency{dir = 4; dwidth = 11; height = 13; timid = 1; width = 24},/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape) "aU" = (/turf/simulated/floor/plasteel,/area/shuttle/escape) -"aV" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) -"aW" = (/obj/machinery/door/window/northleft{req_access_txt = "32"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) +"aV" = (/obj/machinery/door/window/southright{autoclose = 1; name = "engineering door"; req_access_txt = "32"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) +"aW" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor4,/area/shuttle/escape) "aX" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) "aY" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel,/area/shuttle/escape) "aZ" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel,/area/shuttle/escape) "ba" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape) -"bb" = (/obj/machinery/door/window/northleft{req_access_txt = "47"},/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape) -"bc" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape) -"bd" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) -"be" = (/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) -"bf" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) +"bb" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor4,/area/shuttle/escape) +"bc" = (/obj/machinery/door/window/southright{autoclose = 1; name = "science door"; req_access_txt = "47"},/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape) +"bd" = (/obj/machinery/door/window/northleft{autoclose = 1; name = "security door"; req_access_txt = "2"},/turf/simulated/shuttle/floor4,/area/shuttle/escape) +"be" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) +"bf" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor4,/area/shuttle/escape) "bg" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "8"},/turf/simulated/floor/plating,/area/shuttle/escape) "bh" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/shuttle/escape) "bi" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/shuttle/escape) -"bj" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape) -"bk" = (/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape) -"bl" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape) +"bj" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) +"bk" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor4,/area/shuttle/escape) +"bl" = (/obj/machinery/door/window/northleft{autoclose = 1; name = "medical door"; req_access_txt = "5"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) "bm" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) -"bn" = (/obj/machinery/door/window/southright{req_access_txt = "32"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) +"bn" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape) "bo" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) "bp" = (/obj/structure/window/reinforced,/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/shuttle/escape) "bq" = (/obj/structure/window/reinforced,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/shuttle/escape) "br" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape) -"bs" = (/obj/machinery/door/window/southright{req_access_txt = "47"},/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape) +"bs" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) "bt" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape) "bu" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel,/area/shuttle/escape) "bv" = (/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/shuttle/escape) @@ -76,8 +76,7 @@ "bx" = (/obj/structure/noticeboard,/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape) "by" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = null; name = "Shuttle Cargo Hatch"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) "bz" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) -"bA" = (/obj/machinery/door/window/northleft{req_access_txt = "5"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) -"bB" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) +"bA" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor5"},/area/shuttle/escape) "bC" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/shuttle/escape) "bD" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/escape) "bE" = (/obj/machinery/door/airlock/shuttle{aiControlDisabled = 1; hackProof = 1; id_tag = "s_docking_airlock"; name = "Shuttle Hatch"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape) @@ -111,16 +110,16 @@ apaIaIaIaIaMaCaDaEaCaNaOap aPaIaIaQaQaBaCaDaEaCaRaRac aSaeaeaeaeaJaCaDaEaCaCaCap aTaUaUaUaUaUaUaUaUaUaUaUap -apaVaWaXaBaYaUaZaBbabbbcap -aBbdbebfbgbhaUbibgbjbkblaB -bgbdbebfbgbhaUbibgbjbkblbg -aJbmbnboaJbpaUbqaJbrbsbtaJ +apbfbdbkaBaYaUaZaBbzblbsap +aBaWaIbbbgbhaUbibgbFbGbHaB +bgbjbeaXbgbhaUbibgbabnbAbg +aJbmaVboaJbpaUbqaJbrbcbtaJ apbuaUaUaUaUaUaUaUaUaUbvap bwaUaUaUaUaUaUaUaUaUaUaUac -aSaebxbyaBbzbAbBaBbCacaebD -bEaUaUaUbgbFbGbHbgaUaUbIap -acaUaUaUbgbFbGbHbgaUaUbJap -apbKbLbLaJbFbGbHaJbNbMbOap +aSaebxbyaBaYaUaZaBbCacaebD +bEaUaUaUbgbhaUbibgaUaUbIap +acaUaUaUbgbhaUbibgaUaUbJap +apbKbLbLaJbhaUbiaJbNbMbOap bPaxbQbQawaeaeaeawbRbRaxbS aabPbTbTbSbUbUbUbPbTbTbSaa "} diff --git a/_maps/map_files/templates/spacehotel/n_01.dmm b/_maps/map_files/templates/spacehotel/n_01.dmm index 4480512c668..ebf6ffb1a79 100644 --- a/_maps/map_files/templates/spacehotel/n_01.dmm +++ b/_maps/map_files/templates/spacehotel/n_01.dmm @@ -1,5 +1,5 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/obj/structure/sign/poster/random{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) "c" = (/turf/unsimulated/floor/carpet,/area/template_noop) "d" = (/obj/structure/dresser,/obj/item/weapon/lipstick/jade,/turf/unsimulated/floor/carpet,/area/template_noop) "e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) diff --git a/_maps/map_files/templates/spacehotel/n_02.dmm b/_maps/map_files/templates/spacehotel/n_02.dmm index cda6eb42b4e..b802e285219 100644 --- a/_maps/map_files/templates/spacehotel/n_02.dmm +++ b/_maps/map_files/templates/spacehotel/n_02.dmm @@ -1,7 +1,7 @@ "a" = (/turf/template_noop,/area/template_noop) "b" = (/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/template_noop,/area/template_noop) "c" = (/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/obj/item/weapon/grown/bananapeel{layer = 2.6},/turf/template_noop,/area/template_noop) -"d" = (/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"d" = (/obj/structure/sign/poster/random{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) "e" = (/turf/unsimulated/floor/carpet,/area/template_noop) "f" = (/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/unsimulated/floor/carpet,/area/template_noop) "g" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) diff --git a/_maps/map_files/templates/spacehotel/n_03.dmm b/_maps/map_files/templates/spacehotel/n_03.dmm index e4aa24d6899..15915ff9c0a 100644 --- a/_maps/map_files/templates/spacehotel/n_03.dmm +++ b/_maps/map_files/templates/spacehotel/n_03.dmm @@ -1,5 +1,5 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/obj/structure/sign/poster/official/random{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) "c" = (/turf/unsimulated/floor/carpet,/area/template_noop) "d" = (/obj/structure/dresser,/obj/item/weapon/lipstick/purple,/turf/unsimulated/floor/carpet,/area/template_noop) "e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) diff --git a/_maps/map_files/templates/spacehotel/n_04.dmm b/_maps/map_files/templates/spacehotel/n_04.dmm index 91a433502b9..2788bb3307c 100644 --- a/_maps/map_files/templates/spacehotel/n_04.dmm +++ b/_maps/map_files/templates/spacehotel/n_04.dmm @@ -1,5 +1,5 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/structure/sign/poster{desc = "You can't make out anything from the poster's original print. It's ruined."; dir = 8; icon_state = "poster_ripped"; name = "ripped poster"; pixel_x = -32; ruined = 1},/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/obj/structure/sign/poster/ripped{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) "c" = (/turf/unsimulated/floor/carpet,/area/template_noop) "d" = (/obj/structure/dresser,/obj/item/clothing/head/xenos,/turf/unsimulated/floor/carpet,/area/template_noop) "e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) diff --git a/_maps/map_files/templates/spacehotel/n_05.dmm b/_maps/map_files/templates/spacehotel/n_05.dmm index cf60cf65327..bf746e2fc45 100644 --- a/_maps/map_files/templates/spacehotel/n_05.dmm +++ b/_maps/map_files/templates/spacehotel/n_05.dmm @@ -1,5 +1,5 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/obj/structure/sign/poster/official/random{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) "c" = (/turf/unsimulated/floor/carpet,/area/template_noop) "d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) "e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) diff --git a/_maps/map_files/templates/spacehotel/n_06.dmm b/_maps/map_files/templates/spacehotel/n_06.dmm index 046119cf016..a2fc80149cb 100644 --- a/_maps/map_files/templates/spacehotel/n_06.dmm +++ b/_maps/map_files/templates/spacehotel/n_06.dmm @@ -1,5 +1,5 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/effect/decal/cleanable/blood/gibs/old,/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/obj/effect/decal/cleanable/blood/gibs/old,/obj/structure/sign/poster/random{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) "c" = (/turf/unsimulated/floor/carpet,/area/template_noop) "d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) "e" = (/obj/machinery/light{dir = 8},/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor/carpet,/area/template_noop) diff --git a/_maps/map_files/templates/spacehotel/n_07.dmm b/_maps/map_files/templates/spacehotel/n_07.dmm index fc00baa9a45..70ab9fba765 100644 --- a/_maps/map_files/templates/spacehotel/n_07.dmm +++ b/_maps/map_files/templates/spacehotel/n_07.dmm @@ -1,5 +1,5 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/obj/structure/sign/poster/random{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) "c" = (/turf/unsimulated/floor/carpet,/area/template_noop) "d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) "e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) diff --git a/_maps/map_files/templates/spacehotel/n_08.dmm b/_maps/map_files/templates/spacehotel/n_08.dmm index 81c8881c5e7..fcab7886628 100644 --- a/_maps/map_files/templates/spacehotel/n_08.dmm +++ b/_maps/map_files/templates/spacehotel/n_08.dmm @@ -1,11 +1,11 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) -"c" = (/obj/structure/sign/poster{dir = 1; pixel_x = 0; pixel_y = 32},/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/obj/structure/sign/poster/official/random{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"c" = (/obj/structure/sign/poster/random{dir = 1; pixel_y = 32},/turf/unsimulated/floor/carpet,/area/template_noop) "d" = (/turf/unsimulated/floor/carpet,/area/template_noop) -"e" = (/obj/structure/dresser,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/structure/dresser,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/poster/random_contraband,/turf/unsimulated/floor/carpet,/area/template_noop) "f" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) "g" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/turf/unsimulated/floor/carpet,/area/template_noop) -"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/structure/sign/poster/random{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) "i" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) "j" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop) "k" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop) diff --git a/_maps/map_files/templates/spacehotel/n_09.dmm b/_maps/map_files/templates/spacehotel/n_09.dmm index ecf873f1913..77dac3089be 100644 --- a/_maps/map_files/templates/spacehotel/n_09.dmm +++ b/_maps/map_files/templates/spacehotel/n_09.dmm @@ -1,5 +1,5 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/obj/structure/sign/poster/official/random{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) "c" = (/turf/unsimulated/floor/carpet,/area/template_noop) "d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) "e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) diff --git a/_maps/map_files/templates/spacehotel/n_10.dmm b/_maps/map_files/templates/spacehotel/n_10.dmm index 9038bbbce3d..1c0cf0d88b5 100644 --- a/_maps/map_files/templates/spacehotel/n_10.dmm +++ b/_maps/map_files/templates/spacehotel/n_10.dmm @@ -1,5 +1,5 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/obj/structure/sign/poster/official/random{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) "c" = (/turf/unsimulated/floor/carpet,/area/template_noop) "d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) "e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) diff --git a/_maps/map_files/templates/spacehotel/n_11.dmm b/_maps/map_files/templates/spacehotel/n_11.dmm index 415d3f1f7c5..bed2ba84b3f 100644 --- a/_maps/map_files/templates/spacehotel/n_11.dmm +++ b/_maps/map_files/templates/spacehotel/n_11.dmm @@ -1,11 +1,11 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/obj/structure/sign/poster/random{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) "c" = (/turf/unsimulated/floor/carpet,/area/template_noop) "d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) "e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) "f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/syndie,/obj/item/weapon/twohanded/toy/chainsaw,/turf/unsimulated/floor/carpet,/area/template_noop) "g" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/syndie,/obj/item/toy/figure/syndie{pixel_x = 8},/turf/unsimulated/floor/carpet,/area/template_noop) -"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/structure/sign/poster/random{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) "i" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) "j" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop) "k" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop) diff --git a/_maps/map_files/templates/spacehotel/n_12.dmm b/_maps/map_files/templates/spacehotel/n_12.dmm index 24d3321f4f7..05319b91d2e 100644 --- a/_maps/map_files/templates/spacehotel/n_12.dmm +++ b/_maps/map_files/templates/spacehotel/n_12.dmm @@ -1,5 +1,5 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/obj/structure/sign/poster/official/random{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) "c" = (/turf/unsimulated/floor/carpet,/area/template_noop) "d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) "e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) diff --git a/_maps/map_files/templates/spacehotel/n_13.dmm b/_maps/map_files/templates/spacehotel/n_13.dmm index 0d10f62eba5..8ecdca3b868 100644 --- a/_maps/map_files/templates/spacehotel/n_13.dmm +++ b/_maps/map_files/templates/spacehotel/n_13.dmm @@ -1,17 +1,17 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/obj/structure/sign/poster/legit{dir = 1; pixel_y = 32},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) -"c" = (/obj/structure/sign/poster/legit{dir = 1; pixel_y = 32},/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/obj/structure/sign/poster/official/random{dir = 8; pixel_x = -32},/obj/structure/sign/poster/official/random{dir = 1; pixel_y = 32},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) +"c" = (/obj/structure/sign/poster/official/random{dir = 1; pixel_y = 32},/turf/unsimulated/floor/carpet,/area/template_noop) "d" = (/turf/unsimulated/floor/carpet,/area/template_noop) -"e" = (/obj/structure/sign/poster/legit{dir = 1; pixel_y = 32},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) -"f" = (/obj/structure/dresser,/obj/structure/sign/poster/legit{dir = 1; pixel_y = 32},/obj/structure/sign/poster/legit{dir = 4; pixel_x = 32},/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/structure/sign/poster/official/random{dir = 1; pixel_y = 32},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/structure/dresser,/obj/structure/sign/poster/official/random{dir = 1; pixel_y = 32},/obj/structure/sign/poster/official/random{dir = 4; pixel_x = 32},/turf/unsimulated/floor/carpet,/area/template_noop) "g" = (/obj/machinery/light{dir = 8},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) -"h" = (/obj/structure/stool/bed,/obj/structure/sign/poster/legit{dir = 4; pixel_x = 32},/obj/item/weapon/bedsheet/rainbow,/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/stool/bed,/obj/structure/sign/poster/official/random{dir = 4; pixel_x = 32},/obj/item/weapon/bedsheet/rainbow,/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) "i" = (/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) -"j" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/structure/sign/poster/official/random{dir = 8; pixel_x = -32},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) "k" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) "l" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop) "m" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) -"n" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/obj/structure/sign/poster/legit{dir = 4; pixel_x = 32},/obj/structure/sign/poster/legit{pixel_y = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"n" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/obj/structure/sign/poster/official/random{dir = 4; pixel_x = 32},/obj/structure/sign/poster/official/random{pixel_y = -32},/turf/unsimulated/floor/carpet,/area/template_noop) "o" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) "p" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) "q" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) diff --git a/_maps/map_files/templates/spacehotel/n_14.dmm b/_maps/map_files/templates/spacehotel/n_14.dmm index 7fe5a48cafd..95cf97442fd 100644 --- a/_maps/map_files/templates/spacehotel/n_14.dmm +++ b/_maps/map_files/templates/spacehotel/n_14.dmm @@ -1,5 +1,5 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/obj/structure/sign/poster/official/random{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) "c" = (/turf/unsimulated/floor/carpet,/area/template_noop) "d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) "e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) diff --git a/_maps/map_files/templates/spacehotel/n_17.dmm b/_maps/map_files/templates/spacehotel/n_17.dmm index 964a75ba8ba..88b1486e2fe 100644 --- a/_maps/map_files/templates/spacehotel/n_17.dmm +++ b/_maps/map_files/templates/spacehotel/n_17.dmm @@ -1,5 +1,5 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/obj/item/pizzabox/margherita,/obj/item/pizzabox/margherita{pixel_y = 4},/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/obj/structure/sign/poster/official/random{dir = 8; pixel_x = -32},/obj/item/pizzabox/margherita,/obj/item/pizzabox/margherita{pixel_y = 4},/turf/unsimulated/floor/carpet,/area/template_noop) "c" = (/turf/unsimulated/floor/carpet,/area/template_noop) "d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) "e" = (/obj/machinery/light{dir = 8},/obj/item/pizzabox/vegetable,/obj/item/pizzabox/vegetable{pixel_y = 4},/turf/unsimulated/floor/carpet,/area/template_noop) diff --git a/_maps/map_files/templates/spacehotel/n_18.dmm b/_maps/map_files/templates/spacehotel/n_18.dmm index 28145e1b4fb..ca75b4f384f 100644 --- a/_maps/map_files/templates/spacehotel/n_18.dmm +++ b/_maps/map_files/templates/spacehotel/n_18.dmm @@ -1,5 +1,5 @@ "a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/obj/structure/sign/poster/official/random{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) "c" = (/turf/unsimulated/floor/carpet,/area/template_noop) "d" = (/obj/structure/dresser,/obj/item/weapon/lipstick/purple,/turf/unsimulated/floor/carpet,/area/template_noop) "e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) diff --git a/_maps/map_files/templates/spacehotel/s_04.dmm b/_maps/map_files/templates/spacehotel/s_04.dmm index 2764d377626..fbd9385c3f5 100644 --- a/_maps/map_files/templates/spacehotel/s_04.dmm +++ b/_maps/map_files/templates/spacehotel/s_04.dmm @@ -4,19 +4,19 @@ "d" = (/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) "e" = (/obj/structure/rack,/obj/item/clothing/suit/syndicatefake,/obj/item/clothing/under/syndicate,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) "f" = (/obj/structure/rack,/obj/item/clothing/mask/gas/syndicate,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) -"g" = (/obj/structure/rack,/obj/structure/sign/poster{dir = 1; pixel_y = 32},/obj/item/clothing/suit/space/hardsuit/syndi,/obj/item/clothing/head/helmet/space/syndicate{pixel_x = -4},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) -"h" = (/obj/structure/dresser,/obj/structure/sign/poster{dir = 1; pixel_y = 32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) -"i" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/obj/item/weapon/storage/fancy/cigarettes/syndicate{pixel_x = 8},/obj/structure/sign/poster{dir = 1; pixel_y = 32},/obj/structure/sign/poster{dir = 4; pixel_x = 32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) +"g" = (/obj/structure/rack,/obj/structure/sign/poster/random{dir = 1; pixel_y = 32},/obj/item/clothing/suit/space/hardsuit/syndi,/obj/item/clothing/head/helmet/space/syndicate{pixel_x = -4},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) +"h" = (/obj/structure/dresser,/obj/structure/sign/poster/random{dir = 1; pixel_y = 32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) +"i" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/obj/item/weapon/storage/fancy/cigarettes/syndicate{pixel_x = 8},/obj/structure/sign/poster/random{dir = 1; pixel_y = 32},/obj/structure/sign/poster/random{dir = 4; pixel_x = 32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) "j" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop) -"k" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/syndie,/obj/structure/sign/poster{dir = 4; pixel_x = 32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) +"k" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/syndie,/obj/structure/sign/poster/random{dir = 4; pixel_x = 32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) "l" = (/obj/machinery/light{dir = 8},/obj/machinery/button/windowtint{id = "room_s"; pixel_x = -24; pixel_y = 0; range = 5},/obj/item/weapon/soap/syndie,/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop) "m" = (/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop) "n" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/template_noop) "o" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) "p" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) "q" = (/obj/machinery/door/window/eastleft,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) -"r" = (/obj/structure/sign/poster{pixel_y = -32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) -"s" = (/obj/structure/sign/poster{dir = 4; pixel_x = 32},/obj/structure/sign/poster{pixel_y = -32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) +"r" = (/obj/structure/sign/poster/random{pixel_y = -32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) +"s" = (/obj/structure/sign/poster/random{dir = 4; pixel_x = 32},/obj/structure/sign/poster/random{pixel_y = -32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) (1,1,1) = {" aaaaaaaaaaa diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 499be494056..3a8f30f254a 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -8,6 +8,7 @@ #define OXY "oxy" #define CLONE "clone" #define STAMINA "stamina" +#define BRAIN "brain" #define STUN "stun" #define WEAKEN "weaken" @@ -63,13 +64,21 @@ #define THROWN_PROJECTILE_ATTACK 4 #define LEAP_ATTACK 5 +//Embedded objects +#define EMBEDDED_PAIN_CHANCE 15 //Chance for embedded objects to cause pain (damage user) +#define EMBEDDED_ITEM_FALLOUT 5 //Chance for embedded object to fall out (causing pain but removing the object) +#define EMBED_CHANCE 45 //Chance for an object to embed into somebody when thrown (if it's sharp) +#define EMBEDDED_PAIN_MULTIPLIER 2 //Coefficient of multiplication for the damage the item does while embedded (this*item.w_class) +#define EMBEDDED_FALL_PAIN_MULTIPLIER 5 //Coefficient of multiplication for the damage the item does when it falls out (this*item.w_class) +#define EMBEDDED_IMPACT_PAIN_MULTIPLIER 4 //Coefficient of multiplication for the damage the item does when it first embeds (this*item.w_class) +#define EMBED_THROWSPEED_THRESHOLD 4 //The minimum value of an item's throw_speed for it to embed (Unless it has embedded_ignore_throwspeed_threshold set to 1) +#define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 8 //Coefficient of multiplication for the damage the item does when removed without a surgery (this*item.w_class) +#define EMBEDDED_UNSAFE_REMOVAL_TIME 30 //A Time in ticks, total removal time = (this*item.w_class) + //Gun Stuff #define SAWN_INTACT 0 #define SAWN_OFF 1 #define WEAPON_LIGHT 0 #define WEAPON_MEDIUM 1 - #define WEAPON_HEAVY 2 - -// Embedded objects -#define EMBED_THROWSPEED_THRESHOLD 15 \ No newline at end of file + #define WEAPON_HEAVY 2 \ No newline at end of file diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 05133d226f1..a03ba7c9d4c 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -22,46 +22,26 @@ //Reagent flags #define REAGENT_NOREACT 1 -//Species flags. - -#define NO_BLOOD 1 -#define NO_BREATHE 2 -#define NO_DNA 4 -#define NO_SCAN 8 -#define NO_PAIN 16 -#define IS_WHITELISTED 32 -#define HAS_LIPS 64 -#define IS_PLANT 128 -#define CAN_BE_FAT 256 -#define NO_INTORGANS 512 -#define RADIMMUNE 1024 -#define ALL_RPARTS 2048 -#define NOGUNS 4096 -#define NOTRANSSTING 8192 - //Species clothing flags #define HAS_UNDERWEAR 1 #define HAS_UNDERSHIRT 2 #define HAS_SOCKS 4 //Species Body Flags -#define FEET_CLAWS 1 -#define FEET_PADDED 2 -#define FEET_NOSLIP 4 -#define HAS_HEAD_ACCESSORY 8 -#define HAS_TAIL 16 -#define TAIL_OVERLAPPED 32 -#define HAS_SKIN_TONE 64 -#define HAS_ICON_SKIN_TONE 128 -#define HAS_SKIN_COLOR 256 -#define HAS_HEAD_MARKINGS 512 -#define HAS_BODY_MARKINGS 1024 -#define HAS_TAIL_MARKINGS 2048 +#define HAS_HEAD_ACCESSORY 1 +#define HAS_TAIL 2 +#define TAIL_OVERLAPPED 4 +#define HAS_SKIN_TONE 8 +#define HAS_ICON_SKIN_TONE 16 +#define HAS_SKIN_COLOR 32 +#define HAS_HEAD_MARKINGS 64 +#define HAS_BODY_MARKINGS 128 +#define HAS_TAIL_MARKINGS 256 #define HAS_MARKINGS HAS_HEAD_MARKINGS|HAS_BODY_MARKINGS|HAS_TAIL_MARKINGS -#define TAIL_WAGGING 4096 -#define NO_EYES 8192 -#define HAS_FUR 16384 -#define HAS_ALT_HEADS 32768 +#define TAIL_WAGGING 512 +#define NO_EYES 1024 +#define HAS_ALT_HEADS 2048 +#define ALL_RPARTS 4096 //Species Diet Flags #define DIET_CARN 1 diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm index 4f07d54ee01..6f8bd0feabf 100644 --- a/code/__DEFINES/genetics.dm +++ b/code/__DEFINES/genetics.dm @@ -99,6 +99,7 @@ #define NUTRITION_LEVEL_CURSED 0 //Blood levels +#define BLOOD_VOLUME_MAXIMUM 2000 #define BLOOD_VOLUME_NORMAL 560 #define BLOOD_VOLUME_SAFE 501 #define BLOOD_VOLUME_OKAY 336 @@ -117,3 +118,20 @@ #define CLONER_FRESH_CLONE "fresh" #define CLONER_MATURE_CLONE "mature" + +//Species traits. + +#define IS_WHITELISTED 1 +#define LIPS 2 +#define NO_BLOOD 3 +#define NO_BREATHE 4 +#define NO_DNA 5 +#define NO_SCAN 6 +#define NO_PAIN 7 +#define IS_PLANT 8 +#define CAN_BE_FAT 9 +#define NO_INTORGANS 10 +#define RADIMMUNE 11 +#define NOGUNS 12 +#define NOTRANSSTING 13 +#define VIRUSIMMUNE 14 \ No newline at end of file diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index a27e3f8e96a..393247c5a1f 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -2,9 +2,21 @@ #define isatom(A) istype(A, /atom) #define ismovableatom(A) istype(A, /atom/movable) -// Mobs +// Mobs #define ismegafauna(A) istype(A, /mob/living/simple_animal/hostile/megafauna) +//Objects + +#define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) //if something is cleanable + +var/list/static/global/pointed_types = typecacheof(list( + /obj/item/weapon/pen, + /obj/item/weapon/screwdriver, + /obj/item/weapon/reagent_containers/syringe, + /obj/item/weapon/kitchen/utensil/fork)) + +#define is_pointed(W) (is_type_in_typecache(W, pointed_types)) + //Turfs #define issimulatedturf(A) istype(A, /turf/simulated) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index a2f487086ae..61e5e5069b4 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -334,4 +334,16 @@ #define FIRST_DIAG_STEP 1 #define SECOND_DIAG_STEP 2 -#define ARBITRARY_VIEWRANGE_NOHUD 2 \ No newline at end of file +#define ARBITRARY_VIEWRANGE_NOHUD 2 +#define SECOND_DIAG_STEP 2 + +//Bloody shoes/footprints +#define MAX_SHOE_BLOODINESS 100 +#define BLOODY_FOOTPRINT_BASE_ALPHA 150 +#define BLOOD_GAIN_PER_STEP 100 +#define BLOOD_LOSS_PER_STEP 5 + +//Bloody shoe blood states +#define BLOOD_STATE_HUMAN "blood" +#define BLOOD_STATE_XENO "xeno" +#define BLOOD_STATE_NOT_BLOODY "no blood whatsoever" diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm index 36fffdd907a..588f8526ca1 100644 --- a/code/__DEFINES/mob.dm +++ b/code/__DEFINES/mob.dm @@ -14,7 +14,7 @@ #define ORGAN_MUTATED 2048 #define ORGAN_ASSISTED 4096 -#define DROPLIMB_EDGE 0 +#define DROPLIMB_SHARP 0 #define DROPLIMB_BLUNT 1 #define DROPLIMB_BURN 2 diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 1b848686bc3..257e12f4093 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -39,7 +39,7 @@ #define ROLE_ERT "emergency response team" #define ROLE_NYMPH "Dionaea" #define ROLE_GSPIDER "giant spider" - +#define ROLE_DRONE "drone" //Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR. //The gamemode specific ones are just so the gamemodes can query whether a player is old enough diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index c8d4fd2c659..32dc9630bb0 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -45,7 +45,7 @@ S.race_key = ++rkey //Used in mob icon caching. all_species[S.name] = S - if(S.flags & IS_WHITELISTED) + if(IS_WHITELISTED in S.species_traits) whitelisted_species += S.name init_subtypes(/datum/crafting_recipe, crafting_recipes) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 89755d7acf0..f9bae78c35b 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -448,32 +448,32 @@ proc/checkhtml(var/t) // Pencode -/proc/pencode_to_html(text, mob/user, obj/item/weapon/pen/P = null, sign = 1, fields = 1, deffont = PEN_FONT, signfont = SIGNFONT, crayonfont = CRAYON_FONT) - text = replacetext(text, "\n", "
") - text = replacetext(text, "\[center\]", "
") - text = replacetext(text, "\[/center\]", "
") - text = replacetext(text, "\[br\]", "
") +/proc/pencode_to_html(text, mob/user, obj/item/weapon/pen/P = null, format = 1, sign = 1, fields = 1, deffont = PEN_FONT, signfont = SIGNFONT, crayonfont = CRAYON_FONT) text = replacetext(text, "\[b\]", "") text = replacetext(text, "\[/b\]", "") text = replacetext(text, "\[i\]", "") text = replacetext(text, "\[/i\]", "") text = replacetext(text, "\[u\]", "") text = replacetext(text, "\[/u\]", "") - text = replacetext(text, "\[large\]", "") - text = replacetext(text, "\[/large\]", "") if(sign) text = replacetext(text, "\[sign\]", "[user ? user.real_name : "Anonymous"]") if(fields) text = replacetext(text, "\[field\]", "") + if(format) + text = replacetext(text, "\[h1\]", "

") + text = replacetext(text, "\[/h1\]", "

") + text = replacetext(text, "\[h2\]", "

") + text = replacetext(text, "\[/h2\]", "

") + text = replacetext(text, "\[h3\]", "

") + text = replacetext(text, "\[/h3\]", "

") + text = replacetext(text, "\n", "
") + text = replacetext(text, "\[center\]", "
") + text = replacetext(text, "\[/center\]", "
") + text = replacetext(text, "\[br\]", "
") + text = replacetext(text, "\[large\]", "") + text = replacetext(text, "\[/large\]", "") - text = replacetext(text, "\[h1\]", "

") - text = replacetext(text, "\[/h1\]", "

") - text = replacetext(text, "\[h2\]", "

") - text = replacetext(text, "\[/h2\]", "

") - text = replacetext(text, "\[h3\]", "

") - text = replacetext(text, "\[/h3\]", "

") - - if(istype(P, /obj/item/toy/crayon)) // If it is a crayon, and he still tries to use these, make them empty! + if(istype(P, /obj/item/toy/crayon) || !format) // If it is a crayon, and he still tries to use these, make them empty! text = replacetext(text, "\[*\]", "") text = replacetext(text, "\[hr\]", "") text = replacetext(text, "\[small\]", "") @@ -485,7 +485,7 @@ proc/checkhtml(var/t) text = replacetext(text, "\[row\]", "") text = replacetext(text, "\[cell\]", "") text = replacetext(text, "\[logo\]", "") - + if(istype(P, /obj/item/toy/crayon)) text = "[text]" else // They are using "not a crayon" - formatting is OK and such text = replacetext(text, "\[*\]", "
  • ") @@ -501,9 +501,10 @@ proc/checkhtml(var/t) text = replacetext(text, "\[row\]", "") text = replacetext(text, "\[cell\]", "") text = replacetext(text, "\[logo\]", "") - + if(P) text = "[text]" - + else + text = "[text]" text = copytext(text, 1, MAX_PAPER_MESSAGE_LEN) return text diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 82b2ea8b419..ccfeb287170 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1081,6 +1081,21 @@ proc/get_mob_with_client_list() return get_turf(location) +//For objects that should embed, but make no sense being is_sharp or is_pointed() +//e.g: rods +var/list/can_embed_types = typecacheof(list( + /obj/item/stack/rods, + /obj/item/pipe)) + +/proc/can_embed(obj/item/W) + if(is_sharp(W)) + return 1 + if(is_pointed(W)) + return 1 + + if(is_type_in_typecache(W, can_embed_types)) + return 1 + //Quick type checks for some tools var/global/list/common_tools = list( /obj/item/stack/cable_coil, @@ -1187,34 +1202,13 @@ var/global/list/common_tools = list( return 0 //Whether or not the given item counts as sharp in terms of dealing damage -/proc/is_sharp(obj/O as obj) - if(!O) return 0 - if(O.sharp) return 1 - if(O.edge) return 1 +/proc/is_sharp(obj/O) + if(!O) + return 0 + if(O.sharp) + return 1 return 0 -//Whether or not the given item counts as cutting with an edge in terms of removing limbs -/proc/has_edge(obj/O as obj) - if(!O) return 0 - if(O.edge) return 1 - return 0 - -//Returns 1 if the given item is capable of popping things like balloons, inflatable barriers, or cutting police tape. -/proc/can_puncture(obj/item/W as obj) // For the record, WHAT THE HELL IS THIS METHOD OF DOING IT? - if(!istype(W)) return 0 - if(!W) return 0 - if(W.sharp) return 1 - return ( \ - W.sharp || \ - istype(W, /obj/item/weapon/screwdriver) || \ - istype(W, /obj/item/weapon/pen) || \ - istype(W, /obj/item/weapon/weldingtool) || \ - istype(W, /obj/item/weapon/lighter/zippo) || \ - istype(W, /obj/item/weapon/match) || \ - istype(W, /obj/item/clothing/mask/cigarette) || \ - istype(W, /obj/item/weapon/shovel) \ - ) - /proc/is_surgery_tool(obj/item/W as obj) return ( \ istype(W, /obj/item/weapon/scalpel) || \ @@ -1255,46 +1249,42 @@ var/global/list/common_tools = list( /* Checks if that loc and dir has a item on the wall */ -var/list/WALLITEMS = list( - "/obj/machinery/power/apc", "/obj/machinery/alarm", "/obj/item/device/radio/intercom", - "/obj/structure/extinguisher_cabinet", "/obj/structure/reagent_dispensers/peppertank", - "/obj/machinery/status_display", "/obj/machinery/requests_console", "/obj/machinery/light_switch", "/obj/effect/sign", - "/obj/machinery/newscaster", "/obj/machinery/firealarm", "/obj/structure/noticeboard", "/obj/machinery/door_control", - "/obj/machinery/computer/security/telescreen", "/obj/machinery/embedded_controller/radio/simple_vent_controller", - "/obj/item/weapon/storage/secure/safe", "/obj/machinery/door_timer", "/obj/machinery/flasher", "/obj/machinery/keycard_auth", - "/obj/structure/mirror", "/obj/structure/closet/fireaxecabinet", "/obj/machinery/computer/security/telescreen/entertainment", - "/obj/structure/sign" - ) +var/list/static/global/wall_items = typecacheof(list(/obj/machinery/power/apc, /obj/machinery/alarm, + /obj/item/device/radio/intercom, /obj/structure/extinguisher_cabinet, /obj/structure/reagent_dispensers/peppertank, + /obj/machinery/status_display, /obj/machinery/requests_console, /obj/machinery/light_switch, /obj/structure/sign, + /obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, /obj/machinery/door_control, + /obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio/airlock, + /obj/item/weapon/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth, + /obj/structure/mirror, /obj/structure/closet/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment, + /obj/structure/sign)) + /proc/gotwallitem(loc, dir) for(var/obj/O in loc) - for(var/item in WALLITEMS) - if(istype(O, text2path(item))) - //Direction works sometimes - if(O.dir == dir) - return 1 - - //Some stuff doesn't use dir properly, so we need to check pixel instead - switch(dir) - if(SOUTH) - if(O.pixel_y > 10) - return 1 - if(NORTH) - if(O.pixel_y < -10) - return 1 - if(WEST) - if(O.pixel_x > 10) - return 1 - if(EAST) - if(O.pixel_x < -10) - return 1 + if(is_type_in_typecache(O, wall_items)) + //Direction works sometimes + if(O.dir == dir) + return 1 + //Some stuff doesn't use dir properly, so we need to check pixel instead + switch(dir) + if(SOUTH) + if(O.pixel_y > 10) + return 1 + if(NORTH) + if(O.pixel_y < -10) + return 1 + if(WEST) + if(O.pixel_x > 10) + return 1 + if(EAST) + if(O.pixel_x < -10) + return 1 //Some stuff is placed directly on the wallturf (signs) for(var/obj/O in get_step(loc, dir)) - for(var/item in WALLITEMS) - if(istype(O, text2path(item))) - if(abs(O.pixel_x) <= 10 && abs(O.pixel_y) <= 10) - return 1 + if(is_type_in_typecache(O, wall_items)) + if(abs(O.pixel_x) <= 10 && abs(O.pixel_y) <= 10) + return 1 return 0 @@ -1891,4 +1881,4 @@ var/global/list/g_fancy_list_of_types = null var/num = pick(num_sample) num_sample -= num result += (1 << num) - return result + return result diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index e453d748428..0cc712799c7 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -42,4 +42,6 @@ var/global/list/global_radios = list() //list of all radios, across all z-lev var/global/list/meteor_list = list() //list of all meteors var/global/list/poi_list = list() //list of points of interest for observe/follow +var/global/list/active_jammers = list() // List of active radio jammers +var/global/list/active_diseases = list() //List of Active disease in all mobs; purely for quick referencing. \ No newline at end of file diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index e969751e1dd..51afe833ea3 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -199,6 +199,11 @@ Topic(src, list("src" = UID(), "command"="lights", "activate" = "0"), 1) return +/obj/machinery/ai_slipper/AICtrlClick() //Turns liquid dispenser on or off + ToggleOn() + +/obj/machinery/ai_slipper/AIAltClick() //Dispenses liquid if on + Activate() // // Override AdjacentQuick for AltClicking diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index a15176af87c..a8de6127c41 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -169,6 +169,12 @@ /obj/machinery/turretid/BorgAltClick() //turret lethal on/off. Forwards to AI code. AIAltClick() +/obj/machinery/ai_slipper/BorgCtrlClick() //Turns liquid dispenser on or off + ToggleOn() + +/obj/machinery/ai_slipper/BorgAltClick() //Dispenses liquid if on + Activate() + /* As with AI, these are not used in click code, because the code for robots is specific, not generic. diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 68a24f87a3e..1d5d419ba82 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -235,6 +235,12 @@ or something covering your eyes." 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 + name = "Embedded Object" + desc = "Something got lodged into your flesh and is causing major bleeding. It might fall out with time, but surgery is the safest way. \ + If you're feeling frisky, click yourself in help intent to pull the object out." + icon_state = "embeddedobject" + /obj/screen/alert/embeddedobject/Click() if(isliving(usr)) var/mob/living/carbon/human/M = usr @@ -405,6 +411,27 @@ so as to remain in compliance with the most up-to-date laws." if(NOTIFY_FOLLOW) G.ManualFollow(target) +/obj/screen/alert/notify_soulstone + name = "Soul Stone" + desc = "Someone is trying to capture your soul in a soul stone. Click to allow it." + icon_state = "template" + timeout = 10 SECONDS + var/obj/item/device/soulstone/stone = null + var/stoner = null + +/obj/screen/alert/notify_soulstone/Click() + if(!usr || !usr.client) + return + if(stone) + if(alert(usr, "Do you want to be captured by [stoner]'s soul stone? This will destroy your corpse and make it \ + impossible for you to get back into the game as your regular character.",, "No", "Yes") == "Yes") + stone.opt_in = TRUE + +/obj/screen/alert/notify_soulstone/Destroy() + stone = null + return ..() + + //OBJECT-BASED /obj/screen/alert/restrained/buckled diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index d309cc37e0f..fbba17c7b6b 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -43,9 +43,7 @@ /mob/living/carbon/human/proc/remake_hud() //used for preference changes mid-round; can't change hud icons without remaking the hud. - if(hud_used) - qdel(hud_used) - hud_used = null + QDEL_NULL(hud_used) create_mob_hud() if(hud_used) hud_used.show_hud(hud_used.hud_version) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 260df783bf9..d184f765eac 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -108,11 +108,12 @@ icon_state = "internal0" else var/no_mask = FALSE - if(!C.wear_mask || !(C.wear_mask.flags & AIRTIGHT)) - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(!H.head || !(H.head.flags & AIRTIGHT)) - no_mask = TRUE + if(!C.get_organ_slot("breathing_tube")) + if(!C.wear_mask || !(C.wear_mask.flags & AIRTIGHT)) + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(!H.head || !(H.head.flags & AIRTIGHT)) + no_mask = TRUE if(no_mask) to_chat(C, "You are not wearing a suitable mask or helmet.") diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 59cbf9c6219..8d132ed2586 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -183,9 +183,7 @@ M.take_organ_damage(power) if(prob(33)) // Added blood for whacking non-humans too - var/turf/simulated/location = M.loc - if(istype(location, /turf/simulated)) - location.add_blood_floor(M) + M.add_splatter_floor() if("fire") M.take_organ_damage(0, power) to_chat(M, "Aargh it burns!") diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index f32161b92a2..eba4da0fe65 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -11,7 +11,8 @@ var/const/tk_maxrange = 15 By default, emulate the user's unarmed attack */ /atom/proc/attack_tk(mob/user) - if(user.stat) return + if(user.stat) + return user.UnarmedAttack(src,0) // attack_hand, attack_paw, etc return @@ -26,27 +27,23 @@ var/const/tk_maxrange = 15 return /obj/attack_tk(mob/user) - if(user.stat) return + if(user.stat) + return if(anchored) ..() return var/obj/item/tk_grab/O = new(src) - user.put_in_active_hand(O) - O.host = user - O.focus_object(src) - return + O.form_grab(user, src) /obj/item/attack_tk(mob/user) - if(user.stat || !isturf(loc)) return + if(user.stat || !isturf(loc)) + return if((TK in user.mutations) && !user.get_active_hand()) // both should already be true to get here var/obj/item/tk_grab/O = new(src) - user.put_in_active_hand(O) - O.host = user - O.focus_object(src) + O.form_grab(user, src) else warning("Strange attack_tk(): TK([TK in user.mutations]) empty hand([!user.get_active_hand()])") - return /mob/attack_tk(mob/user) @@ -75,104 +72,137 @@ var/const/tk_maxrange = 15 var/atom/movable/focus = null var/mob/living/host = null +/obj/item/tk_grab/Destroy() + if(focus) + release_object() + // Focus is null now + host = null + return ..() - dropped(mob/user as mob) - if(focus && user && loc != user && loc != user.loc) // drop_item() gets called when you tk-attack a table/closet with an item - if(focus.Adjacent(loc)) - focus.loc = loc +/obj/item/tk_grab/dropped(mob/user) + if(focus && user && loc != user && loc != user.loc) // drop_item() gets called when you tk-attack a table/closet with an item + if(focus.Adjacent(loc)) + focus.loc = loc - qdel(src) - return + qdel(src) //stops TK grabs being equipped anywhere but into hands - equipped(var/mob/user, var/slot) - if( (slot == slot_l_hand) || (slot== slot_r_hand) ) return +/obj/item/tk_grab/equipped(mob/user, var/slot) + if( (slot == slot_l_hand) || (slot== slot_r_hand) ) + return + qdel(src) + + +/obj/item/tk_grab/attack_self(mob/user) + if(focus) + focus.attack_self_tk(user) + +/obj/item/tk_grab/override_throw(mob/user, atom/target) + afterattack(target, user) + return TRUE + +/obj/item/tk_grab/afterattack(atom/target , mob/living/user, proximity, params)//TODO: go over this + if(!target || !user) + return + if(last_throw+3 > world.time) + return + if(!host || host != user) qdel(src) return - - - attack_self(mob/user as mob) - if(focus) - focus.attack_self_tk(user) - - afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity, params)//TODO: go over this - if(!target || !user) return - if(last_throw+3 > world.time) return - if(!host || host != user) - qdel(src) - return - if(!(TK in host.mutations)) - qdel(src) - return - if(isobj(target) && !isturf(target.loc)) - return - - var/d = get_dist(user, target) - if(focus) - d = max(d,get_dist(user,focus)) // whichever is further - if(d > tk_maxrange) - to_chat(user, "Your mind won't reach that far.") - return - - if(!focus) - focus_object(target, user) - return - - if(target == focus) - target.attack_self_tk(user) - return // todo: something like attack_self not laden with assumptions inherent to attack_self - - - if(!istype(target, /turf) && istype(focus,/obj/item) && target.Adjacent(focus)) - var/obj/item/I = focus - var/resolved = target.attackby(I, user, params) - if(!resolved && target && I) - I.afterattack(target,user,1) // for splashing with beakers - - - else - apply_focus_overlay() - focus.throw_at(target, 10, 1, user) - last_throw = world.time + if(!(TK in host.mutations)) + qdel(src) + return + if(isobj(target) && !isturf(target.loc)) return - attack(mob/living/M as mob, mob/living/user as mob, def_zone) + var/d = get_dist(user, target) + if(focus) + d = max(d,get_dist(user,focus)) // whichever is further + if(d > tk_maxrange) + to_chat(user, "Your mind won't reach that far.") return + if(!focus) + focus_object(target, user) + return - proc/focus_object(var/obj/target, var/mob/living/user) - if(!istype(target,/obj)) return//Cant throw non objects atm might let it do mobs later - if(target.anchored || !isturf(target.loc)) - qdel(src) - return - focus = target - update_icon() + if(target == focus) + target.attack_self_tk(user) + return // todo: something like attack_self not laden with assumptions inherent to attack_self + + + if(istype(focus,/obj/item) && target.Adjacent(focus) && !user.in_throw_mode) + var/obj/item/I = focus + var/resolved = target.attackby(I, user, params) + if(!resolved && target && I) + I.afterattack(target,user,1) // for splashing with beakers + + + else apply_focus_overlay() + focus.throw_at(target, 10, 1, user) + last_throw = world.time + +/obj/item/tk_grab/attack(mob/living/M, mob/living/user, def_zone) + return + +/obj/item/tk_grab/is_equivalent(obj/item/I) + . = ..() + if(!.) + return I == focus + +/obj/item/tk_grab/proc/focus_object(var/obj/target, var/mob/user) + if(!istype(target,/obj)) + return//Cant throw non objects atm might let it do mobs later + if(target.anchored || !isturf(target.loc)) + qdel(src) return - - - proc/apply_focus_overlay() - if(!focus) return - var/obj/effect/overlay/O = new /obj/effect/overlay(locate(focus.x,focus.y,focus.z)) - O.name = "sparkles" - O.anchored = 1 - O.density = 0 - O.layer = FLY_LAYER - O.dir = pick(cardinal) - O.icon = 'icons/effects/effects.dmi' - O.icon_state = "nothing" - flick("empdisable",O) - spawn(5) - qdel(O) - return - - + focus = target update_icon() - overlays.Cut() - if(focus && focus.icon && focus.icon_state) - overlays += icon(focus.icon,focus.icon_state) + apply_focus_overlay() + // Make it behave like other equipment + if(istype(target, /obj/item)) + if(target in user.tkgrabbed_objects) + // Release the old grab first + user.unEquip(user.tkgrabbed_objects[target]) + user.tkgrabbed_objects[target] = src + +/obj/item/tk_grab/proc/release_object() + if(!focus) return + if(istype(focus, /obj/item)) + // Delete the key/value pair of item to TK grab + host.tkgrabbed_objects -= focus + focus = null + update_icon() + +/obj/item/tk_grab/proc/apply_focus_overlay() + if(!focus) + return + // Oh jeez ow + var/obj/effect/overlay/O = new /obj/effect/overlay(locate(focus.x,focus.y,focus.z)) + O.name = "sparkles" + O.anchored = 1 + O.density = 0 + O.layer = FLY_LAYER + O.dir = pick(cardinal) + O.icon = 'icons/effects/effects.dmi' + O.icon_state = "nothing" + flick("empdisable",O) + spawn(5) + qdel(O) + +/obj/item/tk_grab/proc/form_grab(mob/user, obj/target) + user.put_in_active_hand(src) + host = user + focus_object(target, user) + + +/obj/item/tk_grab/update_icon() + overlays.Cut() + if(focus && focus.icon && focus.icon_state) + overlays += icon(focus.icon,focus.icon_state) /*Not quite done likely needs to use something thats not get_step_to proc/check_path() @@ -197,4 +227,3 @@ var/const/tk_maxrange = 15 var/Z = source:z */ - diff --git a/code/controllers/Processes/diseases.dm b/code/controllers/Processes/diseases.dm deleted file mode 100644 index d0bec749ac8..00000000000 --- a/code/controllers/Processes/diseases.dm +++ /dev/null @@ -1,43 +0,0 @@ -var/datum/controller/process/diseases/disease_master - -/datum/controller/process/diseases - var/list/currentrun = list() - var/list/processing_diseases = list() - -/datum/controller/process/diseases/setup() - name = "disease" - schedule_interval = 20 // every 2 seconds - start_delay = 7 - log_startup_progress("Disease controller starting.") - - register_diseases() //register all pre-round diseases created - -/datum/controller/process/diseases/statProcess() - ..() - stat(null, "[processing_diseases.len] diseases") - - -/datum/controller/process/diseases/doWork() - src.currentrun = processing_diseases.Copy() - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun - - while(currentrun.len) - var/datum/disease/thing = currentrun[1] - currentrun.Cut(1, 2) - if(thing) - try - thing.process() - catch(var/exception/e) - catchException(e, thing) - SCHECK - else - catchBadType(thing) - processing_diseases.Remove(thing) - -DECLARE_GLOBAL_CONTROLLER(diseases, disease_master) - -/datum/controller/process/diseases/proc/register_diseases() - for(var/datum/disease/D in world) - if(!processing_diseases.Find(D)) - D.register() diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index fe8d1cbb133..1cc9787420d 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -72,9 +72,6 @@ if("Vote") debug_variables(vote) feedback_add_details("admin_verb","DVote") - if("Diseases") - debug_variables(disease_master) - feedback_add_details("admin_verb","DDiseases") if("Fires") debug_variables(fire_master) feedback_add_details("admin_verb","DFires") diff --git a/code/datums/beam.dm b/code/datums/beam.dm index 7a8c802b42d..bb1cef167d6 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -15,12 +15,13 @@ var/static_beam = 0 var/beam_type = /obj/effect/ebeam //must be subtype -/datum/beam/New(beam_origin,beam_target,beam_icon='icons/effects/beam.dmi',beam_icon_state="b_beam",time=50,maxdistance=10,btype = /obj/effect/ebeam) +/datum/beam/New(beam_origin,beam_target,beam_icon='icons/effects/beam.dmi',beam_icon_state="b_beam",time=50,maxdistance=10,btype = /obj/effect/ebeam,beam_sleep_time=3) endtime = world.time+time origin = beam_origin origin_oldloc = get_turf(origin) target = beam_target target_oldloc = get_turf(target) + sleep_time = beam_sleep_time if(origin_oldloc == origin && target_oldloc == target) static_beam = 1 max_distance = maxdistance @@ -117,13 +118,13 @@ /obj/effect/ebeam/Destroy() owner = null return ..() - + /obj/effect/ebeam/deadly/Crossed(atom/A) ..() A.ex_act(1) -/atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=50, maxdistance=10,beam_type=/obj/effect/ebeam) - var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type) +/atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=50, maxdistance=10,beam_type=/obj/effect/ebeam,beam_sleep_time=3) + var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type,beam_sleep_time) spawn(0) newbeam.Start() return newbeam \ No newline at end of file diff --git a/code/datums/cache/air_alarm.dm b/code/datums/cache/air_alarm.dm index b507c096081..5f34997c95f 100644 --- a/code/datums/cache/air_alarm.dm +++ b/code/datums/cache/air_alarm.dm @@ -11,14 +11,17 @@ var/global/datum/repository/air_alarm/air_alarm_repository = new() if(!refresh) return cache_entry.data - if(ticker && ticker.current_state < GAME_STATE_PLAYING && istype(passed_alarm)) // Generating the list for the first time as the game hasn't started - no need to run through the machines list everything every time - alarms[++alarms.len] = passed_alarm.get_nano_data_console() + if(ticker && ticker.current_state < GAME_STATE_PLAYING && istype(passed_alarm)) // Generating the list for the first time as the game hasn't started - no need to run through the machines list everything every time + alarms = cache_entry.data // Don't deleate the list + if(is_station_contact(passed_alarm.z)) // Still need sanity checks + alarms[++alarms.len] = passed_alarm.get_nano_data_console() else - for(var/obj/machinery/alarm/alarm in (monitored_alarms ? monitored_alarms : air_alarms)) - if(!monitored_alarms && !is_station_contact(alarm.z)) + for(var/obj/machinery/alarm/alarm in (monitored_alarms ? monitored_alarms : air_alarms)) // Generating the whole list again is a bad habit but I can't be bothered to fix it right now + if(!monitored_alarms && !is_station_contact(alarm.z)) continue alarms[++alarms.len] = alarm.get_nano_data_console() + cache_entry.timestamp = world.time //+ 10 SECONDS cache_entry.data = alarms return alarms diff --git a/code/datums/cargoprofile.dm b/code/datums/cargoprofile.dm index 233490f73b0..a6e53c61eac 100644 --- a/code/datums/cargoprofile.dm +++ b/code/datums/cargoprofile.dm @@ -246,9 +246,9 @@ //Note that this filters out blueprints because they are a paper item. Do NOT throw out the station blueprints unless you be trollin'. blacklist = null whitelist = list(/obj/item/trash,/obj/item/toy,/obj/item/weapon/reagent_containers/food/snacks/ectoplasm,/obj/item/weapon/grown/bananapeel,/obj/item/weapon/broken_bottle,/obj/item/weapon/bikehorn, - /obj/item/weapon/cigbutt,/obj/item/weapon/contraband,/obj/item/weapon/grown/corncob,/obj/item/weapon/paper,/obj/item/weapon/shard, + /obj/item/weapon/cigbutt,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/grown/corncob,/obj/item/weapon/paper,/obj/item/weapon/shard, /obj/item/weapon/sord,/obj/item/weapon/photo,/obj/item/weapon/folder, - /obj/item/areaeditor/blueprints,/obj/item/weapon/contraband,/obj/item/weapon/kitchen,/obj/item/weapon/book,/obj/item/clothing/mask/facehugger) + /obj/item/areaeditor/blueprints,/obj/item/weapon/poster/random_contraband,/obj/item/weapon/kitchen,/obj/item/weapon/book,/obj/item/clothing/mask/facehugger) /datum/cargoprofile/weapons name = "Weapons & Illegals" diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 58c3038918a..35e5c04d112 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -381,12 +381,7 @@ var/record_id_num = 1001 preview_icon.Blend(rgb(H.s_tone, H.s_tone, H.s_tone), ICON_ADD) else preview_icon.Blend(rgb(-H.s_tone, -H.s_tone, -H.s_tone), ICON_SUBTRACT) -/* Commented out due to broken-ness, see below comment - // Skin color - if(H.species.flags & HAS_SKIN_TONE) - if(!H.species || H.species.flags & HAS_SKIN_COLOR) - preview_icon.Blend(rgb(H.r_skin, H.g_skin, H.b_skin), ICON_ADD) -*/ + // Proper Skin color - Fix, you can't have HAS_SKIN_TONE *and* HAS_SKIN_COLOR if(H.species.bodyflags & HAS_SKIN_COLOR) preview_icon.Blend(rgb(H.r_skin, H.g_skin, H.b_skin), ICON_ADD) diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index 0252977dcf4..86c2337c827 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -1,6 +1,7 @@ /mob/proc/HasDisease(datum/disease/D) - for(var/datum/disease/DD in viruses) + for(var/thing in viruses) + var/datum/disease/DD = thing if(D.IsSame(DD)) return 1 return 0 @@ -35,7 +36,7 @@ var/datum/disease/DD = new D.type(1, D, 0) viruses += DD DD.affected_mob = src - DD.holder = src + active_diseases += DD //Add it to the active diseases list, now that it's actually in a mob and being processed. //Copy properties over. This is so edited diseases persist. var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed") @@ -133,8 +134,11 @@ /mob/living/carbon/human/CanContractDisease(datum/disease/D) - if(species.virus_immune) + if((VIRUSIMMUNE in species.species_traits) && !D.bypasses_immunity) return 0 + for(var/thing in D.required_organs) + if(!((locate(thing) in bodyparts) || (locate(thing) in internal_organs))) + return 0 return ..() /mob/living/carbon/human/monkey/CanContractDisease(datum/disease/D) diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 908cded34e2..571a0d7aa7b 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -50,21 +50,23 @@ var/list/diseases = subtypesof(/datum/disease) var/stage_prob = 4 //Other - var/longevity = 150 //Time in ticks disease stays in objects, Syringes and such are infinite. var/list/viable_mobtypes = list() //typepaths of viable mobs var/mob/living/carbon/affected_mob = null - var/atom/movable/holder = null var/list/cures = list() //list of cures if the disease has the CURABLE flag, these are reagent ids var/infectivity = 65 var/cure_chance = 8 - var/carrier = 0 //If our host is only a carrier + var/carrier = FALSE //If our host is only a carrier + var/bypasses_immunity = FALSE //Does it skip species virus immunity check? Some things may diseases and not viruses var/permeability_mod = 1 var/severity = NONTHREAT var/list/required_organs = list() var/needs_all_cures = TRUE var/list/strain_data = list() //dna_spread special bullshit - +/datum/disease/Destroy() + affected_mob = null + active_diseases.Remove(src) + return ..() /datum/disease/proc/stage_act() var/cure = has_cure() @@ -97,13 +99,15 @@ var/list/diseases = subtypesof(/datum/disease) if(!. || (needs_all_cures && . < cures.len)) return 0 -/datum/disease/proc/spread(atom/source, force_spread = 0) +/datum/disease/proc/spread(force_spread = 0) + if(!affected_mob) + return + if((spread_flags & SPECIAL || spread_flags & NON_CONTAGIOUS || spread_flags & BLOOD) && !force_spread) return - if(affected_mob) - if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10))) - return + if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10))) + return var/spread_range = 1 @@ -113,41 +117,19 @@ var/list/diseases = subtypesof(/datum/disease) if(spread_flags & AIRBORNE) spread_range++ - if(!source) - if(affected_mob) - source = affected_mob - else - return - - if(isturf(source.loc)) - for(var/mob/living/carbon/C in oview(spread_range, source)) - if(isturf(C.loc)) - if(AStar(source, C.loc, /turf/proc/Distance, spread_range, adjacent = (spread_flags & AIRBORNE) ? /turf/proc/reachableAdjacentAtmosTurfs : /turf/proc/reachableAdjacentTurfs)) - C.ContractDisease(src) - - -/datum/disease/proc/process() - if(!holder) - disease_master.processing_diseases -= src - return - - if(prob(infectivity)) - spread(holder) - - if(affected_mob) - for(var/datum/disease/D in affected_mob.viruses) - if(D != src) - if(IsSame(D)) - qdel(D) - - if(holder == affected_mob) - if(affected_mob.stat != DEAD) - stage_act() - - if(!affected_mob) - if(prob(70)) - if(--longevity<=0) - cure() + var/turf/T = affected_mob.loc + if(istype(T)) + for(var/mob/living/carbon/C in oview(spread_range, affected_mob)) + var/turf/V = get_turf(C) + if(V) + while(TRUE) + if(V == T) + C.ContractDisease(src) + break + var/turf/Temp = get_step_towards(V, T) + if(!V.CanAtmosPass(Temp)) + break + V = Temp /datum/disease/proc/cure() @@ -158,24 +140,6 @@ var/list/diseases = subtypesof(/datum/disease) remove_virus() qdel(src) - -/datum/disease/New() - if(required_organs && required_organs.len) - if(ishuman(affected_mob)) - var/mob/living/carbon/human/H = affected_mob - for(var/obj/item/organ/O in required_organs) - if(!locate(O) in H.bodyparts) - if(!locate(O) in H.internal_organs) - cure() - return - - if(disease_master) - register() - -/datum/disease/proc/register() - disease_master.processing_diseases += src - - /datum/disease/proc/IsSame(datum/disease/D) if(istype(src, D.type)) return 1 @@ -191,13 +155,6 @@ var/list/diseases = subtypesof(/datum/disease) /datum/disease/proc/GetDiseaseID() return type - -/datum/disease/Destroy() - if(disease_master && disease_master.processing_diseases.Find(src)) - disease_master.processing_diseases.Remove(src) - return ..() - - /datum/disease/proc/IsSpreadByTouch() if(spread_flags & CONTACT_FEET || spread_flags & CONTACT_HANDS || spread_flags & CONTACT_GENERAL) return 1 diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index ba180af970e..71c1bd74a28 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -46,13 +46,6 @@ var/list/advance_cures = list( */ /datum/disease/advance/New(var/process = 1, var/datum/disease/advance/D) - - // Setup our dictionary if it hasn't already. - if(!dictionary_symptoms.len) - for(var/symp in list_symptoms) - var/datum/symptom/S = new symp - dictionary_symptoms[S.id] = symp - if(!istype(D)) D = null // Generate symptoms if we weren't given any. @@ -96,7 +89,7 @@ var/list/advance_cures = list( if(!(istype(D, /datum/disease/advance))) return 0 - if(src.GetDiseaseID() != D.GetDiseaseID()) + if(GetDiseaseID() != D.GetDiseaseID()) return 0 return 1 @@ -121,7 +114,7 @@ var/list/advance_cures = list( // Mix the symptoms of two diseases (the src and the argument) /datum/disease/advance/proc/Mix(datum/disease/advance/D) - if(!(src.IsSame(D))) + if(!(IsSame(D))) var/list/possible_symptoms = shuffle(D.symptoms) for(var/datum/symptom/S in possible_symptoms) AddSymptom(new S.type) @@ -161,7 +154,6 @@ var/list/advance_cures = list( return generated /datum/disease/advance/proc/Refresh(new_name = 0) -// to_chat(world, "[src.name] \ref[src] - REFRESH!") var/list/properties = GenerateProperties() AssignProperties(properties) id = null @@ -402,7 +394,7 @@ var/list/advance_cures = list( D.AssignName(new_name) D.Refresh() - for(var/datum/disease/advance/AD in disease_master.processing) + for(var/datum/disease/advance/AD in active_diseases) AD.Refresh() for(var/mob/living/carbon/human/H in shuffle(living_mob_list)) @@ -417,12 +409,6 @@ var/list/advance_cures = list( name_symptoms += S.name message_admins("[key_name_admin(user)] has triggered a custom virus outbreak of [D.name]! It has these symptoms: [english_list(name_symptoms)]") -/* -/mob/verb/test() - - for(var/datum/disease/D in disease_master.processing) - to_chat(src, "[D.name] - [D.holder]") -*/ /datum/disease/advance/proc/totalStageSpeed() diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 007bbc92f0b..56be430f85d 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -67,7 +67,8 @@ Bonus /datum/symptom/heal/metabolism/Heal(mob/living/M, datum/disease/advance/A) var/cured = 0 - for(var/datum/disease/D in M.viruses) + for(var/thing in M.viruses) + var/datum/disease/D = thing if(D != A) cured = 1 cured_diseases += D.GetDiseaseID() diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm index 9413eea5db5..0a31a4acae6 100644 --- a/code/datums/diseases/advance/symptoms/sneeze.dm +++ b/code/datums/diseases/advance/symptoms/sneeze.dm @@ -35,5 +35,5 @@ Bonus M.emote("sniff") else M.emote("sneeze") - A.spread(A.holder, 5) + A.spread(5) return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm index 1246b68fd0f..74da571836b 100644 --- a/code/datums/diseases/advance/symptoms/symptoms.dm +++ b/code/datums/diseases/advance/symptoms/symptoms.dm @@ -1,7 +1,6 @@ // Symptoms are the effects that engineered advanced diseases do. var/list/list_symptoms = subtypesof(/datum/symptom) -var/list/dictionary_symptoms = list() var/global/const/SYMPTOM_ACTIVATION_PROB = 3 @@ -22,7 +21,7 @@ var/global/const/SYMPTOM_ACTIVATION_PROB = 3 /datum/symptom/New() var/list/S = list_symptoms for(var/i = 1; i <= S.len; i++) - if(src.type == S[i]) + if(type == S[i]) id = "[i]" return CRASH("We couldn't assign an ID!") diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index 3c94ad8f801..d06c49de9c8 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -8,11 +8,11 @@ permeability_mod = 1 desc = "If left untreated the subject will become very weak, and may vomit often." severity = "Dangerous!" - longevity = 1000 disease_flags = CAN_CARRY|CAN_RESIST spread_flags = NON_CONTAGIOUS visibility_flags = HIDDEN_PANDEMIC required_organs = list(/obj/item/organ/internal/appendix) + bypasses_immunity = TRUE /datum/disease/appendicitis/stage_act() ..() diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm index 38907524200..bb95e4aa733 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/brainrot.dm @@ -9,7 +9,7 @@ viable_mobtypes = list(/mob/living/carbon/human) cure_chance = 15//higher chance to cure, since two reagents are required desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication." - required_organs = list(/obj/item/organ/external/head) + required_organs = list(/obj/item/organ/internal/brain) severity = DANGEROUS /datum/disease/brainrot/stage_act() //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist -ACTUALLY Removed rather than commented out, I don't see it returning - RR diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index f73154a0e20..7c5cde5b330 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -23,8 +23,8 @@ //Absorbs the target DNA. strain_data["dna"] = new affected_mob.dna.type affected_mob.dna.copy_dna(strain_data["dna"]) - src.carrier = 1 - src.stage = 4 + carrier = TRUE + stage = 4 return switch(stage) diff --git a/code/datums/diseases/kuru.dm b/code/datums/diseases/kuru.dm index bfd5af91a29..55fd4490d8e 100644 --- a/code/datums/diseases/kuru.dm +++ b/code/datums/diseases/kuru.dm @@ -1,4 +1,5 @@ /datum/disease/kuru + form = "Disease" name = "Space Kuru" max_stages = 4 stage_prob = 5 @@ -10,6 +11,7 @@ desc = "Uncontrollable laughing." severity = BIOHAZARD spread_flags = NON_CONTAGIOUS + bypasses_immunity = TRUE //Kuru is a prion disorder, not a virus /datum/disease/kuru/stage_act() ..() diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm index 677bbbb2967..2bf0ca308a8 100644 --- a/code/datums/diseases/pierrot_throat.dm +++ b/code/datums/diseases/pierrot_throat.dm @@ -10,7 +10,6 @@ permeability_mod = 0.75 desc = "If left untreated the subject will probably drive others to insanity." severity = MEDIUM - longevity = 400 /datum/disease/pierrot_throat/stage_act() ..() diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm index ec58f4f6034..fc26f005340 100644 --- a/code/datums/diseases/rhumba_beat.dm +++ b/code/datums/diseases/rhumba_beat.dm @@ -12,21 +12,17 @@ /datum/disease/rhumba_beat/stage_act() ..() + if(affected_mob.ckey == "rosham") + cure() + return switch(stage) - if(1) - if(affected_mob.ckey == "rosham") - src.cure() if(2) - if(affected_mob.ckey == "rosham") - src.cure() if(prob(45)) affected_mob.adjustToxLoss(5) affected_mob.updatehealth() if(prob(1)) to_chat(affected_mob, "You feel strange...") if(3) - if(affected_mob.ckey == "rosham") - src.cure() if(prob(5)) to_chat(affected_mob, "You feel the urge to dance...") else if(prob(5)) @@ -34,8 +30,6 @@ else if(prob(10)) to_chat(affected_mob, "You feel the need to chick chicky boom...") if(4) - if(affected_mob.ckey == "rosham") - src.cure() if(prob(10)) affected_mob.emote("gasp") to_chat(affected_mob, "You feel a burning beat inside...") @@ -43,10 +37,6 @@ affected_mob.adjustToxLoss(5) affected_mob.updatehealth() if(5) - if(affected_mob.ckey == "rosham") - src.cure() to_chat(affected_mob, "Your body is unable to contain the Rhumba Beat...") if(prob(50)) - affected_mob.gib() - else - return \ No newline at end of file + affected_mob.gib() \ No newline at end of file diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index e3482955865..7b4b0a27393 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -78,7 +78,6 @@ permeability_mod = 1 cure_chance = 1 disease_flags = CAN_CARRY|CAN_RESIST - longevity = 30 desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey." severity = BIOHAZARD stage_prob = 4 diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index 4cd027a7d7d..9aad7ff6d17 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -1,4 +1,5 @@ /datum/disease/tuberculosis + form = "Disease" name = "Fungal tuberculosis" max_stages = 5 spread_text = "Airborne" @@ -8,8 +9,9 @@ viable_mobtypes = list(/mob/living/carbon/human) cure_chance = 5//like hell are you getting out of hell desc = "A rare highly transmittable virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue." - required_organs = list(/obj/item/organ/external/head) + required_organs = list(/obj/item/organ/internal/lungs) severity = DANGEROUS + bypasses_immunity = TRUE //Fungal and bacterial in nature; also infects the lungs /datum/disease/tuberculosis/stage_act() //it begins ..() diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index 40c38ac0627..5c5a91b0459 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -451,7 +451,8 @@ r_hand = /obj/item/weapon/twohanded/fireaxe backpack_contents = list( /obj/item/weapon/storage/box/survival = 1, - /obj/item/device/flashlight = 1 + /obj/item/device/flashlight = 1, + /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofbanana = 1 ) /datum/outfit/admin/tunnel_clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -587,6 +588,8 @@ apply_to_card(I, H, list(access_maint_tunnels), "Legit Xenomorph") /datum/outfit/admin/soviet + + gloves = /obj/item/clothing/gloves/combat uniform = /obj/item/clothing/under/soviet back = /obj/item/weapon/storage/backpack/satchel head = /obj/item/clothing/head/ushanka @@ -721,6 +724,38 @@ /obj/item/weapon/melee/classic_baton/telescopic = 1, /obj/item/ammo_box/magazine/m50 = 2) +/datum/outfit/admin/paranormal_ert + name = "Paranormal ERT member" + + uniform = /obj/item/clothing/under/syndicate + suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal + back = /obj/item/weapon/storage/backpack/ert/security + belt = /obj/item/weapon/gun/energy/gun/nuclear + gloves = /obj/item/clothing/gloves/color/black + shoes = /obj/item/clothing/shoes/combat + head = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal + l_ear = /obj/item/device/radio/headset/ert/alt + glasses = /obj/item/clothing/glasses/hud/security/sunglasses + id = /obj/item/weapon/card/id/centcom + pda = /obj/item/device/pda/centcom + backpack_contents = list( + /obj/item/weapon/storage/box/survival = 1, + /obj/item/clothing/mask/gas/sechailer/swat = 1, + /obj/item/weapon/storage/box/zipties = 1, + /obj/item/device/flashlight = 1) + +/datum/outfit/admin/paranormal_ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + . = ..() + if(visualsOnly) + return + + var/obj/item/weapon/card/id/I = H.wear_id + if(istype(I)) + apply_to_card(I, H, get_centcom_access("Emergency Response Team Member"), "Emergency Response Team Member") + + var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/mindshield(H) + L.implant(H) + /datum/outfit/admin/janitorial_ert name = "Janitorial ERT member" @@ -731,16 +766,18 @@ gloves = /obj/item/clothing/gloves/color/yellow shoes = /obj/item/clothing/shoes/galoshes head = /obj/item/clothing/head/helmet/space/hardsuit/ert/janitor - l_ear = /obj/item/device/radio/headset/centcom + l_ear = /obj/item/device/radio/headset/ert/alt glasses = /obj/item/clothing/glasses/sunglasses id = /obj/item/weapon/card/id/centcom pda = /obj/item/device/pda/centcom backpack_contents = list( /obj/item/weapon/caution = 2, + /obj/item/weapon/storage/box/survival = 1, /obj/item/weapon/reagent_containers/spray/cleaner = 1, /obj/item/weapon/storage/bag/trash = 1, /obj/item/weapon/storage/box/lights/mixed = 1, - /obj/item/weapon/holosign_creator = 1) + /obj/item/weapon/holosign_creator = 1, + /obj/item/device/flashlight = 1) /datum/outfit/admin/janitorial_ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) . = ..() @@ -936,7 +973,7 @@ for(var/obj/item/I in H.contents) if(!istype(I, /obj/item/weapon/implant)) - I.add_blood(H) + I.add_mob_blood(H) if(visualsOnly) return @@ -971,7 +1008,7 @@ for(var/obj/item/I in H.contents) if(!istype(I, /obj/item/weapon/implant)) - I.add_blood(H) + I.add_mob_blood(H) if(visualsOnly) return diff --git a/code/datums/soullink.dm b/code/datums/soullink.dm new file mode 100644 index 00000000000..1f17c635e84 --- /dev/null +++ b/code/datums/soullink.dm @@ -0,0 +1,214 @@ +/mob/living + var/list/ownedSoullinks //soullinks we are the owner of + var/list/sharedSoullinks //soullinks we are a/the sharer of + +/mob/living/Destroy() + for(var/s in ownedSoullinks) + var/datum/soullink/S = s + S.ownerDies(FALSE) + qdel(s) //If the owner is destroy()'d, the soullink is destroy()'d + ownedSoullinks = null + for(var/s in sharedSoullinks) + var/datum/soullink/S = s + S.sharerDies(FALSE) + S.removeSoulsharer(src) //If a sharer is destroy()'d, they are simply removed + sharedSoullinks = null + return ..() + +//Keeps track of a Mob->Mob (potentially Player->Player) connection +//Can be used to trigger actions on one party when events happen to another +//Eg: shared deaths +//Can be used to form a linked list of mob-hopping +//Does NOT transfer with minds +/datum/soullink + var/mob/living/soulowner + var/mob/living/soulsharer + var/id //Optional ID, for tagging and finding specific instances + +/datum/soullink/Destroy() + if(soulowner) + LAZYREMOVE(soulowner.ownedSoullinks, src) + soulowner = null + if(soulsharer) + LAZYREMOVE(soulsharer.sharedSoullinks, src) + soulsharer = null + return ..() + +/datum/soullink/proc/removeSoulsharer(mob/living/sharer) + if(soulsharer == sharer) + soulsharer = null + LAZYREMOVE(sharer.sharedSoullinks, src) + +//Used to assign variables, called primarily by soullink() +//Override this to create more unique soullinks (Eg: 1->Many relationships) +//Return TRUE/FALSE to return the soullink/null in soullink() +/datum/soullink/proc/parseArgs(mob/living/owner, mob/living/sharer) + if(!owner || !sharer) + return FALSE + soulowner = owner + soulsharer = sharer + LAZYADD(owner.ownedSoullinks, src) + LAZYADD(sharer.sharedSoullinks, src) + return TRUE + +//Runs after /living death() +//Override this for content +/datum/soullink/proc/ownerDies(gibbed, mob/living/owner) + +//Runs after /living death() +//Override this for content +/datum/soullink/proc/sharerDies(gibbed, mob/living/owner) + +//Runs after /living update_revive() +//Override this for content +/datum/soullink/proc/ownerRevives(mob/living/owner) + +//Runs after /living update_revive() +//Override this for content +/datum/soullink/proc/sharerRevives(mob/living/owner) + +//Quick-use helper +/proc/soullink(typepath, ...) + var/datum/soullink/S = new typepath() + if(S.parseArgs(arglist(args.Copy(2, 0)))) + return S + + + +///////////////// +// MULTISHARER // +///////////////// +//Abstract soullink for use with 1 Owner -> Many Sharer setups +/datum/soullink/multisharer + var/list/soulsharers + +/datum/soullink/multisharer/parseArgs(mob/living/owner, list/sharers) + if(!owner || !LAZYLEN(sharers)) + return FALSE + soulowner = owner + soulsharers = sharers + LAZYADD(owner.ownedSoullinks, src) + for(var/l in sharers) + var/mob/living/L = l + LAZYADD(L.sharedSoullinks, src) + return TRUE + +/datum/soullink/multisharer/removeSoulsharer(mob/living/sharer) + LAZYREMOVE(soulsharers, sharer) + + + +///////////////// +// SHARED FATE // +///////////////// +//When the soulowner dies, the soulsharer dies, and vice versa +//This is intended for two players(or AI) and two mobs + +/datum/soullink/sharedfate/ownerDies(gibbed, mob/living/owner) + if(soulsharer) + soulsharer.death(gibbed) + +/datum/soullink/sharedfate/sharerDies(gibbed, mob/living/sharer) + if(soulowner) + soulowner.death(gibbed) + +///////////////// +// Demon Bind // +///////////////// +//When the soulowner dies, the soulsharer dies, but NOT vice versa +//This is intended for two players(or AI) and two mobs + +/datum/soullink/oneway/ownerDies(gibbed, mob/living/owner) + if(soulsharer) + soulsharer.dust(FALSE) + + +///////////////// +// SHARED BODY // +///////////////// +//When the soulsharer dies, they're placed in the soulowner, who remains alive +//If the soulowner dies, the soulsharer is killed and placed into the soulowner (who is still dying) +//This one is intended for one player moving between many mobs + +/datum/soullink/sharedbody/ownerDies(gibbed, mob/living/owner) + if(soulowner && soulsharer) + if(soulsharer.mind) + soulsharer.mind.transfer_to(soulowner) + soulsharer.death(gibbed) + +/datum/soullink/sharedbody/sharerDies(gibbed, mob/living/sharer) + if(soulowner && soulsharer && soulsharer.mind) + soulsharer.mind.transfer_to(soulowner) + + + +////////////////////// +// REPLACEMENT POOL // +////////////////////// +//When the owner dies, one of the sharers is placed in the owner's body, fully healed +//Sort of a "winner-stays-on" soullink +//Gibbing ends it immediately + +/datum/soullink/multisharer/replacementpool/ownerDies(gibbed, mob/living/owner) + if(LAZYLEN(soulsharers) && !gibbed) //let's not put them in some gibs + var/list/souls = shuffle(soulsharers.Copy()) + for(var/l in souls) + var/mob/living/L = l + if(L.stat != DEAD && L.mind) + L.mind.transfer_to(soulowner) + soulowner.revive(TRUE, TRUE) + L.death(FALSE) + +//Lose your claim to the throne! +/datum/soullink/multisharer/replacementpool/sharerDies(gibbed, mob/living/sharer) + removeSoulsharer(sharer) + + +//////////////// +// SOUL HOOK // +//////////////// +// When the owner transitions from dead to alive or vice versa, +// the linked atom is notified + +// Atoms that actually utilize this system are responsible for handling the GC cleanup themselves +// Splashing the GC handling onto every atom would be a big old waste + +/datum/soullink/soulhook + var/atom/movable/otherend + +/datum/soullink/soulhook/Destroy() + if(otherend) + LAZYREMOVE(otherend.sharedSoulhooks, src) + otherend = null + return ..() + +/datum/soullink/soulhook/parseArgs(mob/living/owner, atom/movable/other) + if(!owner || !other) + return FALSE + soulowner = owner + otherend = other + LAZYADD(owner.ownedSoullinks, src) + LAZYADD(other.sharedSoulhooks, src) + return TRUE + +/datum/soullink/soulhook/ownerDies(gibbed, mob/living/owner) + if(otherend) + otherend.onSoullinkDeath(gibbed, owner) + +/datum/soullink/soulhook/ownerRevives(mob/living/owner) + if(otherend) + otherend.onSoullinkRevive(owner) + +// oops I'm butchering the application of this +/datum/soullink/soulhook/removeSoulsharer(atom/movable/other) + if(otherend == other) + otherend = null + LAZYREMOVE(other.sharedSoulhooks, src) + qdel(src) // not much point in a soul link with one end out of the picture for good + +/atom/movable + var/list/sharedSoulhooks = null + +/atom/movable/proc/onSoullinkDeath(gibbed, mob/living/owner) + +/atom/movable/proc/onSoullinkRevive(mob/living/owner) diff --git a/code/datums/spells/rathens.dm b/code/datums/spells/rathens.dm index 75ff2525c4d..b5cc7b63f51 100644 --- a/code/datums/spells/rathens.dm +++ b/code/datums/spells/rathens.dm @@ -42,4 +42,4 @@ continue if(prob(7)) to_chat(H, "Your [E] was severed by the explosion!") - E.droplimb(1, DROPLIMB_EDGE, 0, 1) + E.droplimb(1, DROPLIMB_SHARP, 0, 1) diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm index 32472fe1ec0..7524e7f31d6 100644 --- a/code/datums/spells/summonitem.dm +++ b/code/datums/spells/summonitem.dm @@ -79,6 +79,14 @@ add_logs(target, C, "magically debrained", addition="INTENT: [uppertext(target.a_intent)]")*/ if(C.stomach_contents && item_to_retrive in C.stomach_contents) C.stomach_contents -= item_to_retrive + for(var/X in C.bodyparts) + var/obj/item/organ/external/part = X + if(item_to_retrive in part.embedded_objects) + part.embedded_objects -= item_to_retrive + to_chat(C, "The [item_to_retrive] that was embedded in your [part] has mysteriously vanished. How fortunate!") + if(!C.has_embedded_objects()) + C.clear_alert("embeddedobject") + break else if(istype(item_to_retrive.loc,/obj/machinery/portable_atmospherics/)) //Edge cases for moved machinery diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index dbe111b6dbe..739844051f6 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -932,6 +932,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/weapon/reagent_containers/food/condiment/soymilk, /obj/item/weapon/reagent_containers/food/condiment/saltshaker, /obj/item/weapon/reagent_containers/food/condiment/peppermill, + /obj/item/weapon/kitchen/rollingpin, /obj/item/weapon/storage/fancy/egg_box, /obj/item/weapon/reagent_containers/food/condiment/enzyme, /obj/item/weapon/reagent_containers/food/condiment/sugar, @@ -1338,7 +1339,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/weapon/reagent_containers/glass/paint/black, /obj/item/weapon/reagent_containers/glass/paint/white, /obj/item/weapon/reagent_containers/glass/paint/remover, - /obj/item/weapon/contraband/poster/legit, + /obj/item/weapon/poster/random_official, /obj/item/stack/wrapping_paper, /obj/item/stack/wrapping_paper, /obj/item/stack/wrapping_paper) @@ -1347,11 +1348,11 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/misc/posters name = "Corporate Posters Crate" - contains = list(/obj/item/weapon/contraband/poster/legit, - /obj/item/weapon/contraband/poster/legit, - /obj/item/weapon/contraband/poster/legit, - /obj/item/weapon/contraband/poster/legit, - /obj/item/weapon/contraband/poster/legit) + contains = list(/obj/item/weapon/poster/random_official, + /obj/item/weapon/poster/random_official, + /obj/item/weapon/poster/random_official, + /obj/item/weapon/poster/random_official, + /obj/item/weapon/poster/random_official) cost = 8 containername = "corporate posters crate" @@ -1422,7 +1423,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/clothing/mask/gas/mime, /obj/item/clothing/head/beret, /obj/item/clothing/suit/suspenders, - /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing) + /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing, + /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofbanana + ) cost = 10 containertype = /obj/structure/closet/crate/secure containername = "standard costumes" @@ -1513,7 +1516,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/misc/randomised/contraband num_contained = 5 contains = list(/obj/item/weapon/storage/pill_bottle/random_drug_bottle, - /obj/item/weapon/contraband/poster, + /obj/item/weapon/poster/random_contraband, /obj/item/weapon/storage/fancy/cigarettes/dromedaryco, /obj/item/weapon/storage/fancy/cigarettes/cigpack_shadyjims) name = "Contraband Crate" @@ -1722,4 +1725,4 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/weapon/vending_refill/cigarette, /obj/item/weapon/vending_refill/cigarette) cost = 15 - containername = "cigarette supply crate" \ No newline at end of file + containername = "cigarette supply crate" diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 1aa65685d5e..14732318aab 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -54,7 +54,7 @@ var/list/uplink_items = list() var/list/excludefrom = list() //Empty list does nothing. Place the name of gamemode you don't want this item to be available in here. This is so you dont have to list EVERY mode to exclude something. var/list/job = null var/surplus = 100 //Chance of being included in the surplus crate (when pick() selects it) - var/hijack_only = 0 //can this item be purchased only during hijackings? + var/hijack_only = FALSE //can this item be purchased only during hijackings? /datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/device/uplink/U) if(hijack_only) @@ -129,7 +129,7 @@ var/list/uplink_items = list() job = list("Clown") //mime -/datum/uplink_item/job_specific/caneshotgun +/datum/uplink_item/jobspecific/caneshotgun name = "Cane Shotgun + Assassination Darts" desc = "A specialized, one shell shotgun with a built-in cloaking device to mimic a cane. The shotgun is capable of hiding it's contents and the pin alongside being supressed. Comes with 6 special darts and a preloaded shrapnel round." reference = "MCS" @@ -137,14 +137,6 @@ var/list/uplink_items = list() cost = 15 job = list("Mime") -/datum/uplink_item/dangerous/cat_grenade - name = "Feral Cat Delivery Grenade" - desc = "The feral cat delivery grenade contains 8 dehydrated feral cats in a similar manner to dehydrated monkeys, which, upon detonation, will be rehydrated by a small reservoir of water contained within the grenade. These cats will then attack anything in sight." - item = /obj/item/weapon/grenade/spawnergrenade/feral_cats - reference = "CCLG" - cost = 5 - job = list("Psychiatrist")//why? Becuase its funny that a person in charge of your mental wellbeing has a cat granade.. - //Chef /datum/uplink_item/jobspecific/specialsauce name = "Chef Excellence's Special Sauce" @@ -195,8 +187,8 @@ var/list/uplink_items = list() item = /obj/item/weapon/storage/toolbox/green/memetic cost = 20 job = list("Chaplain") - surplus = 0 //No lucky chances from the crate; if you get this, this is ALL you're getting - hijack_only = 1 //This is a murderbone weapon, as such, it should only be available in those scenarios. + surplus = 0 //No lucky chances from the crate; if you get this, this is ALL you're getting + hijack_only = TRUE //This is a murderbone weapon, as such, it should only be available in those scenarios. //Janitor @@ -211,23 +203,21 @@ var/list/uplink_items = list() //Medical - /datum/uplink_item/jobspecific/rad_laser name = "Radiation Laser" - desc = "A radiation laser concealed inside of a Health Analyser. After a moderate delay, causes temporary collapse and radiation. Has adjustable controls, but will not function as a regular health analyser, only appears like one. May not function correctly on radiation resistant humanoids!" + desc = "A radiation laser concealed inside of a Health Analyser. After a moderate delay, causes temporary collapse and radiation. Has adjustable controls, but will not function as a regular health analyser, only appears like one. May not function correctly on radiation resistant humanoids!" reference = "RL" item = /obj/item/device/rad_laser cost = 5 - job = list( - "Chief Medical Officer", - "Medical Doctor", - "Geneticist", - "Psychiatrist", - "Chemist", - "Paramedic", - "Virologist", - "Brig Physician" - ) + job = list("Chief Medical Officer", "Medical Doctor", "Geneticist", "Psychiatrist", "Chemist", "Paramedic", "Coroner", "Virologist") + +/datum/uplink_item/dangerous/cat_grenade + name = "Feral Cat Delivery Grenade" + desc = "The feral cat delivery grenade contains 8 dehydrated feral cats in a similar manner to dehydrated monkeys, which, upon detonation, will be rehydrated by a small reservoir of water contained within the grenade. These cats will then attack anything in sight." + item = /obj/item/weapon/grenade/spawnergrenade/feral_cats + reference = "CCLG" + cost = 5 + job = list("Psychiatrist")//why? Becuase its funny that a person in charge of your mental wellbeing has a cat granade.. //Assistant @@ -249,10 +239,9 @@ var/list/uplink_items = list() cost = 6 job = list("Bartender") - //Barber -/datum/uplink_item/jobspecific/safety_scissors //Hue +/datum/uplink_item/jobspecific/safety_scissors //Hue name = "Safety Scissors" desc = "A pair of scissors that are anything but what their name implies; can easily cut right into someone's throat." reference = "CTS" @@ -278,7 +267,7 @@ var/list/uplink_items = list() reference = "PG" item = /obj/item/clothing/gloves/color/yellow/power cost = 10 - job = list("Station Engineer","Chief Engineer") + job = list("Station Engineer", "Chief Engineer") //RD @@ -299,7 +288,6 @@ var/list/uplink_items = list() cost = 3 job = list("Librarian") - //Botanist /datum/uplink_item/jobspecific/ambrosiacruciatus name = "Ambrosia Cruciatus Seeds" @@ -309,7 +297,6 @@ var/list/uplink_items = list() cost = 2 job = list("Botanist") - //Atmos Tech /datum/uplink_item/jobspecific/contortionist name = "Contortionist's Jumpsuit" @@ -335,7 +322,7 @@ var/list/uplink_items = list() reference = "ST" item = /obj/item/weapon/reagent_containers/hypospray/autoinjector/stimulants cost = 7 - job = list("Scientist","Research Director","Geneticist","Chief Medical Officer","Medical Doctor","Psychiatrist","Chemist","Paramedic","Virologist","Brig Physician") + job = list("Scientist", "Research Director", "Geneticist", "Chief Medical Officer", "Medical Doctor", "Psychiatrist", "Chemist", "Paramedic", "Coroner", "Virologist") //Tator Poison Bottles @@ -345,7 +332,7 @@ var/list/uplink_items = list() reference = "TPB" item = /obj/item/weapon/reagent_containers/glass/bottle/traitor cost = 2 - job = list("Research Director","Chief Medical Officer","Medical Doctor","Psychiatrist","Paramedic","Virologist","Bartender") + job = list("Research Director", "Chief Medical Officer", "Medical Doctor", "Psychiatrist", "Chemist", "Paramedic", "Virologist", "Bartender", "Chef") // Paper contact poison pen @@ -400,7 +387,7 @@ var/list/uplink_items = list() /datum/uplink_item/dangerous/machinegun name = "L6 Squad Automatic Weapon" - desc = "A fully-loaded Aussec Armoury belt-fed machine gun. This deadly weapon has a massive 50-round magazine of devastating 7.62x51mm ammunition." + desc = "A fully-loaded Aussec Armory belt-fed machine gun. This deadly weapon has a massive 50-round magazine of devastating 7.62x51mm ammunition." reference = "LMG" item = /obj/item/weapon/gun/projectile/automatic/l6_saw cost = 40 @@ -750,6 +737,14 @@ var/list/uplink_items = list() cost = 17 excludefrom = list(/datum/game_mode/nuclear) +/datum/uplink_item/stealthy_weapons/throwingweapons + name = "Box of Throwing Weapons" + desc = "A box of shurikens and reinforced bolas from ancient Earth martial arts. They are highly effective \ + throwing weapons. The bolas can knock a target down and the shurikens will embed into limbs." + reference = "STK" + item = /obj/item/weapon/storage/box/syndie_kit/throwing_weapons + cost = 3 + /datum/uplink_item/stealthy_weapons/edagger name = "Energy Dagger" desc = "A dagger made of energy that looks and functions as a pen when off." @@ -1088,6 +1083,7 @@ var/list/uplink_items = list() reference = "SNGB" item = /obj/item/device/radio/beacon/syndicate cost = 14 + surplus = 0 /datum/uplink_item/device_tools/syndicate_bomb name = "Syndicate Bomb" @@ -1128,6 +1124,13 @@ var/list/uplink_items = list() cost = 1 surplus = 0 +/datum/uplink_item/device_tools/jammer + name = "Radio Jammer" + desc = "This device will disrupt any nearby outgoing radio communication when activated." + reference = "RJ" + item = /obj/item/device/jammer + cost = 5 + /datum/uplink_item/device_tools/teleporter name = "Teleporter Circuit Board" desc = "A printed circuit board that completes the teleporter onboard the mothership. Advise you test fire the teleporter before entering it, as malfunctions can occur." diff --git a/code/datums/wires/syndicatebomb.dm b/code/datums/wires/syndicatebomb.dm index d1fe6217058..616429b8cd8 100644 --- a/code/datums/wires/syndicatebomb.dm +++ b/code/datums/wires/syndicatebomb.dm @@ -1,5 +1,5 @@ /datum/wires/syndicatebomb - random = 1 + random = TRUE holder_type = /obj/machinery/syndicatebomb wire_count = 5 @@ -13,83 +13,90 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if switch(index) if(WIRE_BOOM) return "Explode" - + if(WIRE_UNBOLT) return "Unbolt" - + if(WIRE_DELAY) return "Delay" - + if(WIRE_PROCEED) return "Proceed" - + if(WIRE_ACTIVATE) return "Activate" /datum/wires/syndicatebomb/CanUse(mob/living/L) var/obj/machinery/syndicatebomb/P = holder if(P.open_panel) - return 1 - return 0 + return TRUE + return FALSE /datum/wires/syndicatebomb/UpdatePulsed(index) - var/obj/machinery/syndicatebomb/P = holder + var/obj/machinery/syndicatebomb/B = holder switch(index) if(WIRE_BOOM) - if(P.active) - P.loc.visible_message("[bicon(holder)] An alarm sounds! It's go-") - P.timer = 0 + if(B.active) + holder.visible_message("[bicon(B)] An alarm sounds! It's go-") + B.explode_now = TRUE if(WIRE_UNBOLT) - P.loc.visible_message("[bicon(holder)] The bolts spin in place for a moment.") + holder.visible_message("[bicon(holder)] The bolts spin in place for a moment.") if(WIRE_DELAY) - playsound(P.loc, 'sound/machines/chime.ogg', 30, 1) - P.loc.visible_message("[bicon(holder)] The bomb chirps.") - P.timer += 10 - if(WIRE_PROCEED) - playsound(P.loc, 'sound/machines/buzz-sigh.ogg', 30, 1) - P.loc.visible_message("[bicon(holder)] The bomb buzzes ominously!") - if(P.timer >= 61) //Long fuse bombs can suddenly become more dangerous if you tinker with them - P.timer = 60 - if(P.timer >= 21) - P.timer -= 10 - else if(P.timer >= 11) //both to prevent negative timers and to have a little mercy - P.timer = 10 - if(WIRE_ACTIVATE) - if(!P.active && !P.defused) - playsound(P.loc, 'sound/machines/click.ogg', 30, 1) - P.loc.visible_message("[bicon(holder)] You hear the bomb start ticking!") - P.active = 1 - P.icon_state = "[initial(P.icon_state)]-active[P.open_panel ? "-wires" : ""]" + if(B.delayedbig) + holder.visible_message("[bicon(B)] The bomb has already been delayed.") else - P.loc.visible_message("[bicon(holder)] The bomb seems to hesitate for a moment.") - P.timer += 5 + holder.visible_message("[bicon(B)] The bomb chirps.") + playsound(B, 'sound/machines/chime.ogg', 30, 1) + B.detonation_timer += 300 + B.delayedbig = TRUE + if(WIRE_PROCEED) + holder.visible_message("[bicon(B)] The bomb buzzes ominously!") + playsound(B, 'sound/machines/buzz-sigh.ogg', 30, 1) + var/seconds = B.seconds_remaining() + if(seconds >= 61) // Long fuse bombs can suddenly become more dangerous if you tinker with them. + B.detonation_timer = world.time + 600 + else if(seconds >= 21) + B.detonation_timer -= 100 + else if(seconds >= 11) // Both to prevent negative timers and to have a little mercy. + B.detonation_timer = world.time + 100 + if(WIRE_ACTIVATE) + if(!B.active && !B.defused) + holder.visible_message("[bicon(B)] You hear the bomb start ticking!") + B.activate() + B.update_icon() + else if(B.delayedlittle) + holder.visible_message("[bicon(B)] Nothing happens.") + else + holder.visible_message("[bicon(B)] The bomb seems to hesitate for a moment.") + B.detonation_timer += 100 + B.delayedlittle = TRUE ..() /datum/wires/syndicatebomb/UpdateCut(index, mended) - var/obj/machinery/syndicatebomb/P = holder + var/obj/machinery/syndicatebomb/B = holder switch(index) if(WIRE_EXPLODE) - if(!mended) - if(P.active) - P.loc.visible_message("[bicon(holder)] An alarm sounds! It's go-") - P.timer = 0 - else - P.defused = 1 + if(mended) + B.defused = FALSE // Cutting and mending all the wires of an inactive bomb will thus cure any sabotage. else - P.defused = 0 //cutting and mending all the wires of an inactive bomb will thus cure any sabotage + if(B.active) + holder.visible_message("[bicon(B)] An alarm sounds! It's go-") + B.explode_now = TRUE + else + B.defused = TRUE if(WIRE_UNBOLT) - if(!mended && P.anchored) - playsound(P.loc, 'sound/effects/stealthoff.ogg', 30, 1) - P.loc.visible_message("[bicon(holder)] The bolts lift out of the ground!") - P.anchored = 0 + if(!mended && B.anchored) + holder.visible_message("[bicon(B)] The bolts lift out of the ground!") + playsound(B, 'sound/effects/stealthoff.ogg', 30, 1) + B.anchored = FALSE if(WIRE_PROCEED) - if(!mended && P.active) - P.loc.visible_message("[bicon(holder)] An alarm sounds! It's go-") - P.timer = 0 + if(!mended && B.active) + holder.visible_message("[bicon(B)] An alarm sounds! It's go-") + B.explode_now = TRUE if(WIRE_ACTIVATE) - if(!mended && P.active) - P.loc.visible_message("[bicon(holder)] The timer stops! The bomb has been defused!") - P.icon_state = "[initial(P.icon_state)]-inactive[P.open_panel ? "-wires" : ""]" - P.active = 0 - P.defused = 1 + if(!mended && B.active) + holder.visible_message("[bicon(B)] The timer stops! The bomb has been defused!") + B.active = FALSE + B.defused = TRUE + B.update_icon() ..() \ No newline at end of file diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 292ad651235..8c12e452d1d 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -242,7 +242,7 @@ if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...). addtimer(src, "hitby_react", 2, TRUE, AM) -/atom/proc/hitby_react(atom/movable/AM) +/atom/proc/hitby_react(atom/movable/AM) if(AM && isturf(AM.loc)) step(AM, turn(AM.dir, 180)) @@ -365,47 +365,194 @@ A.fingerprintshidden |= fingerprintshidden.Copy() //admin A.fingerprintslast = fingerprintslast +var/list/blood_splatter_icons = list() -//returns 1 if made bloody, returns 0 otherwise -/atom/proc/add_blood(mob/living/carbon/human/M as mob) +/atom/proc/blood_splatter_index() + return "\ref[initial(icon)]-[initial(icon_state)]" - if(!blood_DNA || !istype(blood_DNA, /list)) //if our list of DNA doesn't exist yet (or isn't a list) initialise it. +//returns the mob's dna info as a list, to be inserted in an object's blood_DNA list +/mob/living/proc/get_blood_dna_list() + if(get_blood_id() != "blood") + return + return list("ANIMAL DNA" = "Y-") + +/mob/living/carbon/get_blood_dna_list() + if(get_blood_id() != "blood") + return + var/list/blood_dna = list() + if(dna) + var/mob/living/carbon/human/H = src + blood_dna[dna.unique_enzymes] = H.b_type + else + blood_dna["UNKNOWN DNA"] = "X*" + return blood_dna + +/mob/living/carbon/alien/get_blood_dna_list() + return list("UNKNOWN DNA" = "X*") + +//to add a mob's dna info into an object's blood_DNA list. +/atom/proc/transfer_mob_blood_dna(mob/living/L) + var/new_blood_dna = L.get_blood_dna_list() + if(!new_blood_dna) + return 0 + return transfer_blood_dna(new_blood_dna) + +/obj/effect/decal/cleanable/blood/splatter/transfer_mob_blood_dna(mob/living/L) + ..(L) + var/list/b_data = L.get_blood_data(L.get_blood_id()) + if(b_data) + basecolor = b_data["blood_color"] + else + basecolor = "#A10808" + update_icon() + +/obj/effect/decal/cleanable/blood/footprints/transfer_mob_blood_dna(mob/living/L) + ..(L) + var/list/b_data = L.get_blood_data(L.get_blood_id()) + if(b_data) + basecolor = b_data["blood_color"] + else + basecolor = "#A10808" + update_icon() + +//to add blood dna info to the object's blood_DNA list +/atom/proc/transfer_blood_dna(list/blood_dna) + if(!blood_DNA) blood_DNA = list() + var/old_length = blood_DNA.len + blood_DNA |= blood_dna + if(blood_DNA.len > old_length) + return 1//some new blood DNA was added - blood_color = "#A10808" - if(istype(M)) - if(M.species.flags & NO_BLOOD) - return 0 - M.check_dna() - blood_color = M.species.blood_color - . = 1 +//to add blood from a mob onto something, and transfer their dna info +/atom/proc/add_mob_blood(mob/living/M) + var/list/blood_dna = M.get_blood_dna_list() + if(!blood_dna) + return 0 + var/bloodcolor = "#A10808" + var/list/b_data = M.get_blood_data(M.get_blood_id()) + if(b_data) + bloodcolor = b_data["blood_color"] + + return add_blood(blood_dna, bloodcolor) + +//to add blood onto something, with blood dna info to include. +/atom/proc/add_blood(list/blood_dna, color) + return 0 + +/obj/add_blood(list/blood_dna, color) + return transfer_blood_dna(blood_dna) + +/obj/item/add_blood(list/blood_dna, color) + var/blood_count = !blood_DNA ? 0 : blood_DNA.len + if(!..()) + return 0 + if(!blood_count)//apply the blood-splatter overlay if it isn't already in there + add_blood_overlay(color) + return 1 //we applied blood to the item + +/obj/item/clothing/gloves/add_blood(list/blood_dna, color) + . = ..() + transfer_blood = rand(2, 4) + +/turf/add_blood(list/blood_dna, color) + var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src + if(!B) + B = new /obj/effect/decal/cleanable/blood/splatter(src) + B.transfer_blood_dna(blood_dna) //give blood info to the blood decal. + B.basecolor = color + return 1 //we bloodied the floor + +/mob/living/carbon/human/add_blood(list/blood_dna, color) + if(wear_suit) + wear_suit.add_blood(blood_dna, color) + wear_suit.blood_color = color + update_inv_wear_suit(1) + else if(w_uniform) + w_uniform.add_blood(blood_dna, color) + w_uniform.blood_color = color + update_inv_w_uniform(1) + if(head) + head.add_blood(blood_dna, color) + head.blood_color = color + update_inv_head(0,0) + if(glasses) + glasses.add_blood(blood_dna, color) + glasses.blood_color = color + update_inv_glasses(0) + if(gloves) + var/obj/item/clothing/gloves/G = gloves + G.add_blood(blood_dna, color) + G.blood_color = color + verbs += /mob/living/carbon/human/proc/bloody_doodle + else + hand_blood_color = color + bloody_hands = rand(2, 4) + transfer_blood_dna(blood_dna) + verbs += /mob/living/carbon/human/proc/bloody_doodle + + update_inv_gloves(1) //handles bloody hands overlays and updating return 1 -/atom/proc/add_blood_list(mob/living/carbon/M) - // Returns 0 if we have that blood already - if(!istype(blood_DNA, /list)) //if our list of DNA doesn't exist yet (or isn't a list) initialise it. - blood_DNA = list() - //if this blood isn't already in the list, add it - if(blood_DNA[M.dna.unique_enzymes]) - return 0 //already bloodied with this blood. Cannot add more. - var/blood_type = "X*" - if(ishuman(M)) - var/mob/living/carbon/human/H = M - blood_type = H.b_type - blood_DNA[M.dna.unique_enzymes] = blood_type - return 1 +/obj/item/proc/add_blood_overlay(color) + if(initial(icon) && initial(icon_state)) + //try to find a pre-processed blood-splatter. otherwise, make a new one + var/index = blood_splatter_index() + var/icon/blood_splatter_icon = blood_splatter_icons[index] + if(!blood_splatter_icon) + blood_splatter_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object + blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent) + blood_splatter_icon.Blend(icon('icons/effects/blood.dmi', "itemblood"), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant + blood_splatter_icon = fcopy_rsc(blood_splatter_icon) + blood_splatter_icons[index] = blood_splatter_icon -// Only adds blood on the floor -- Skie -/atom/proc/add_blood_floor(mob/living/carbon/M) - return //why the fuck this is at an atom level but only works on simulated turfs I don't know + blood_overlay = image(blood_splatter_icon) + blood_overlay.color = color + overlays += blood_overlay /atom/proc/clean_blood() - src.germ_level = 0 - if(istype(blood_DNA, /list)) - qdel(blood_DNA) + germ_level = 0 + if(islist(blood_DNA)) + blood_DNA = null return 1 + +/obj/item/clean_blood() + . = ..() + if(.) + if(blood_overlay) + overlays -= blood_overlay + +/obj/item/clothing/gloves/clean_blood() + . = ..() + if(.) + transfer_blood = 0 + + +/obj/item/clothing/shoes/clean_blood() + ..() + bloody_shoes = list(BLOOD_STATE_HUMAN = 0, BLOOD_STATE_XENO = 0, BLOOD_STATE_NOT_BLOODY = 0) + blood_state = BLOOD_STATE_NOT_BLOODY + if(ismob(loc)) + var/mob/M = loc + M.update_inv_shoes() + + +/mob/living/carbon/human/clean_blood() + if(gloves) + if(gloves.clean_blood()) + clean_blood() + update_inv_gloves() + gloves.germ_level = 0 + else + ..() // Clear the Blood_DNA list + if(bloody_hands) + bloody_hands = 0 + update_inv_gloves() + update_icons() //apply the now updated overlays to the mob + + /atom/proc/add_vomit_floor(mob/living/carbon/M as mob, var/toxvomit = 0) if( istype(src, /turf/simulated) ) var/obj/effect/decal/cleanable/vomit/this = new /obj/effect/decal/cleanable/vomit(src) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 906706de62e..61eec85e9cc 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -138,12 +138,12 @@ return /atom/movable/Bump(atom/A, yes) //the "yes" arg is to differentiate our Bump proc from byond's, without it every Bump() call would become a double Bump(). - if(A && yes) - if(throwing) - throwing.hit_atom(A) - . = 1 - if(!A || qdeleted(A)) - return + if(A && yes) + if(throwing) + throwing.hit_atom(A) + . = 1 + if(!A || qdeleted(A)) + return A.Bumped(src) /atom/movable/proc/forceMove(atom/destination) diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 2a6aa2b3a39..7052b62e97f 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -63,7 +63,8 @@ //called when a carbon changes virus /mob/living/carbon/proc/check_virus() - for(var/datum/disease/D in viruses) + for(var/thing in viruses) + var/datum/disease/D = thing if((!(D.visibility_flags & HIDDEN_SCANNER)) && (D.severity != NONTHREAT)) return 1 return 0 @@ -190,7 +191,7 @@ /mob/living/carbon/human/proc/sec_hud_set_security_status() var/image/holder = hud_list[WANTED_HUD] - var/perpname = get_face_name(get_id_name("")) + var/perpname = get_visible_name(TRUE) //gets the name of the perp, works if they have an id or if their face is uncovered if(!ticker) return //wait till the game starts or the monkeys runtime.... if(perpname) var/datum/data/record/R = find_record("name", perpname, data_core.security) diff --git a/code/game/dna/dna2_domutcheck.dm b/code/game/dna/dna2_domutcheck.dm index 6175d547d63..f2ad2b2fe03 100644 --- a/code/game/dna/dna2_domutcheck.dm +++ b/code/game/dna/dna2_domutcheck.dm @@ -16,7 +16,7 @@ /proc/genemutcheck(var/mob/living/M, var/block, var/connected=null, var/flags=0) if(ishuman(M)) // Would've done this via species instead of type, but the basic mob doesn't have a species, go figure. var/mob/living/carbon/human/H = M - if(H.species.flags & NO_DNA) + if(NO_DNA in H.species.species_traits) return if(!M) return diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index c5f9ce2b7fe..60654ee4f85 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -224,11 +224,8 @@ var/red = GetUIValueRange(DNA_UI_EYES_R, 255) var/green = GetUIValueRange(DNA_UI_EYES_G, 255) var/blue = GetUIValueRange(DNA_UI_EYES_B, 255) - eyes_organ.eye_colour = list( - red, - green, - blue - ) + if(eyes_organ) + eyes_organ.eye_colour = list(red, green, blue) /* TRAIT CHANGING PROCS diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 0533afe2911..43054c24923 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -327,7 +327,7 @@ if(ishuman(occupant)) var/mob/living/carbon/human/H = occupant - if((H.species.flags & NO_DNA)) + if(NO_DNA in H.species.species_traits) return 1 var/radiation_protection = occupant.run_armor_check(null, "rad", "Your clothes feel warm.", "Your clothes feel warm.") diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm index 11da3ad6c07..e59dd3fc558 100644 --- a/code/game/dna/genes/goon_disabilities.dm +++ b/code/game/dna/genes/goon_disabilities.dm @@ -44,7 +44,7 @@ return 0 if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species && H.species.flags & RADIMMUNE && !(flags & MUTCHK_FORCED)) + if((RADIMMUNE in H.species.species_traits) && !(flags & MUTCHK_FORCED)) return 0 return 1 diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index 52b62f6cabf..d3625deab58 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -356,7 +356,7 @@ return user.visible_message("[user] [pick("chomps","bites")] off [the_item]'s [limb]!") playsound(user.loc, 'sound/items/eatfood.ogg', 50, 0) - limb.droplimb(0, DROPLIMB_EDGE) + limb.droplimb(0, DROPLIMB_SHARP) doHeal(user) else user.visible_message("[user] eats \the [the_item].") @@ -414,9 +414,6 @@ else M.stop_pulling() - if(user.pinned.len) - failure = 1 - user.visible_message("[user.name] takes a huge leap!") playsound(user.loc, 'sound/weapons/thudswoosh.ogg', 50, 1) if(failure) @@ -660,20 +657,20 @@ action_icon_state = "superfart" /obj/effect/proc_holder/spell/aoe_turf/superfart/invocation(mob/user = usr) - invocation = "[user] hunches down and grits their teeth!" - invocation_emote_self = invocation + invocation = "[user] hunches down and grits their teeth!" + invocation_emote_self = "You hunch down and grit your teeth!" ..(user) -/obj/effect/proc_holder/spell/aoe_turf/superfart/cast(list/targets) - var/UT = get_turf(usr) - - if(do_after(usr, 30, target = usr)) +/obj/effect/proc_holder/spell/aoe_turf/superfart/cast(list/targets, mob/user) + var/UT = get_turf(user) + if(do_after(user, 30, target = user)) + var/fartsize = pick("tremendous","gigantic","colossal") playsound(UT, 'sound/goonstation/effects/superfart.ogg', 50, 0) - usr.visible_message("[usr] unleashes a [pick("tremendous","gigantic","colossal")] fart!", "You hear a [pick("tremendous","gigantic","colossal")] fart.") + user.visible_message("[user] unleashes a [fartsize] fart!", "You hear a [fartsize] fart.") for(var/T in targets) for(var/mob/living/M in T) shake_camera(M, 10, 5) - if(M == usr) + if(M == user) continue to_chat(M, "You are sent flying!") M.Weaken(5) @@ -681,4 +678,4 @@ step_away(M, UT, 15) step_away(M, UT, 15) else - to_chat(usr, "You were interrupted and couldn't fart! Rude!") + to_chat(user, "You were interrupted and couldn't fart! Rude!") diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm index 4f023d8021f..52cd4226327 100644 --- a/code/game/dna/genes/monkey.dm +++ b/code/game/dna/genes/monkey.dm @@ -42,9 +42,7 @@ H.set_species(H.species.primitive_form) - if(H.hud_used) - qdel(H.hud_used) - H.hud_used = null + QDEL_NULL(H.hud_used) if(H.client) H.hud_used = new /datum/hud/monkey(H, ui_style2icon(H.client.prefs.UI_style), H.client.prefs.UI_style_color, H.client.prefs.UI_style_alpha) @@ -89,13 +87,11 @@ H.real_name = H.dna.real_name H.name = H.real_name - if(H.hud_used) - qdel(H.hud_used) - H.hud_used = null + QDEL_NULL(H.hud_used) if(H.client) H.hud_used = new /datum/hud/human(H, ui_style2icon(H.client.prefs.UI_style), H.client.prefs.UI_style_color, H.client.prefs.UI_style_alpha) to_chat(H, "You are now a [H.species.name].") - return H \ No newline at end of file + return H diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index e159aa44247..32a6a58cbb3 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -211,11 +211,11 @@ /obj/effect/proc_holder/spell/targeted/remotetalk/choose_targets(mob/user = usr) var/list/targets = new /list() var/list/validtargets = new /list() - for(var/mob/M in view(user.client.view, user)) + var/turf/T = get_turf(user) + for(var/mob/M in range(14, T)) if(M && M.mind) if(M == user) continue - validtargets += M if(!validtargets.len) @@ -237,14 +237,15 @@ if(!say) return say = strip_html(say) + say = pencode_to_html(say, usr, format = 0, fields = 0) for(var/mob/living/target in targets) log_say("Project Mind: [key_name(user)]->[key_name(target)]: [say]") if(REMOTE_TALK in target.mutations) - target.show_message("You hear [user.real_name]'s voice: [say]") + target.show_message("You hear [user.real_name]'s voice: [say]") else - target.show_message("You hear a voice that seems to echo around the room: [say]") - user.show_message("You project your mind into [target.real_name]: [say]") + target.show_message("You hear a voice that seems to echo around the room: [say]") + user.show_message("You project your mind into [target.name]: [say]") for(var/mob/dead/observer/G in player_list) G.show_message("Telepathic message from [user] ([ghost_follow_link(user, ghost=G)]) to [target] ([ghost_follow_link(target, ghost=G)]): [say]") diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index b7558d0c9cf..1f45794ac14 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -202,7 +202,7 @@ /obj/structure/blob/examine(mob/user) ..(user) - to_chat(user, "It looks like it's of a [get_chem_name()] kind.") + to_chat(user, "It looks like it's made of [get_chem_name()].") /obj/structure/blob/proc/get_chem_name() diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 5c3f94a44a3..059306cd080 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -307,7 +307,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" to_chat(user, "DNA of [target] is ruined beyond usability!") return - if(T.species.flags & NO_DNA) + if(NO_DNA in T.species.species_traits) to_chat(user, "This creature does not have DNA!") return @@ -317,4 +317,4 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" return 1 /proc/can_absorb_species(datum/species/S) - return !(S.flags & NO_DNA) + return !(NO_DNA in S.species_traits) \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index cd09cc8d764..e6ccafcffa0 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -13,8 +13,6 @@ var/mob/living/carbon/human/H = user H.restore_blood() H.shock_stage = 0 - spawn(1) - H.fixblood() spawn(0) for(var/i = 0, i<10,i++) user.heal_overall_damage(10, 10) diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index c7d393b77a7..943b15a6172 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -17,18 +17,21 @@ dna_cost = -1 genetic_damage = 1000 + var/silent = FALSE var/weapon_type var/weapon_name_simple /obj/effect/proc_holder/changeling/weapon/try_to_sting(var/mob/user, var/mob/target) if(istype(user.l_hand, weapon_type)) //Not the nicest way to do it, but eh qdel(user.l_hand) - user.visible_message("With a sickening crunch, [user] reforms his [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "With a sickening crunch, [user] reforms his [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "With a sickening crunch, [user] reforms his [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "With a sickening crunch, [user] reforms his [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "[user] forces the airlock to open with \his [src]!", "We force the airlock to open.", "You hear a metal screeching sound.") A.open(2) +/***************************************\ +|***********COMBAT TENTACLES*************| +\***************************************/ + +/obj/effect/proc_holder/changeling/weapon/tentacle + name = "Tentacle" + desc = "We ready a tentacle to grab items or victims with." + helptext = "We can use it once to retrieve a distant item. If used on living creatures, the effect depends on the intent: \ + Help will simply drag them closer, Disarm will grab whatever they are holding instead of them, Grab will put the victim in our hold after catching it, \ + and Harm will stun it, and stab it if we are also holding a sharp weapon. Cannot be used while in lesser form." + chemical_cost = 10 + dna_cost = 2 + genetic_damage = 5 + req_human = 1 + max_genetic_damage = 10 + weapon_type = /obj/item/weapon/gun/magic/tentacle + weapon_name_simple = "tentacle" + silent = TRUE + +/obj/item/weapon/gun/magic/tentacle + name = "tentacle" + desc = "A fleshy tentacle that can stretch out and grab things or people." + icon = 'icons/obj/weapons.dmi' + icon_state = "tentacle" + item_state = "tentacle" + flags = ABSTRACT | NODROP | NOBLUDGEON + w_class = WEIGHT_CLASS_HUGE + ammo_type = /obj/item/ammo_casing/magic/tentacle + fire_sound = 'sound/effects/splat.ogg' + force = 0 + max_charges = 1 + throwforce = 0 //Just to be on the safe side + throw_range = 0 + throw_speed = 0 + +/obj/item/weapon/gun/magic/tentacle/New(location,silent) + ..() + if(ismob(loc)) + if(!silent) + loc.visible_message("[loc.name]\'s arm starts stretching inhumanly!", "Our arm twists and mutates, transforming it into a tentacle.", "You hear organic matter ripping and tearing!") + else + to_chat(loc, "You prepare to extend a tentacle.") + +/obj/item/weapon/gun/magic/tentacle/dropped() + . = ..() + qdel(src) + +/obj/item/weapon/gun/magic/tentacle/shoot_with_empty_chamber(mob/living/user as mob|obj) + to_chat(user, "The [name] is not ready yet.") + +/obj/item/weapon/gun/magic/tentacle/suicide_act(mob/user) + user.visible_message("[user] coils [src] tightly around \his neck! It looks like \he's trying to commit suicide.") + return (OXYLOSS) + +/obj/item/ammo_casing/magic/tentacle + name = "tentacle" + desc = "a tentacle." + projectile_type = /obj/item/projectile/tentacle + caliber = "tentacle" + icon_state = "tentacle_end" + var/obj/item/weapon/gun/magic/tentacle/gun //the item that shot it + +/obj/item/ammo_casing/magic/tentacle/New(obj/item/weapon/gun/magic/tentacle/tentacle_gun) + gun = tentacle_gun + ..() + +/obj/item/ammo_casing/magic/tentacle/Destroy() + gun = null + return ..() + +/obj/item/projectile/tentacle + name = "tentacle" + icon_state = "tentacle_end" + pass_flags = PASSTABLE + damage = 0 + damage_type = BRUTE + range = 8 + hitsound = 'sound/weapons/thudswoosh.ogg' + var/chain + var/obj/item/ammo_casing/magic/tentacle/source //the item that shot it + +/obj/item/projectile/tentacle/New(obj/item/ammo_casing/magic/tentacle/tentacle_casing) + source = tentacle_casing + ..() + +/obj/item/projectile/tentacle/fire(setAngle) + if(firer) + chain = firer.Beam(src, icon_state = "tentacle", time = INFINITY, maxdistance = INFINITY, beam_sleep_time = 1) + ..() + +/obj/item/projectile/tentacle/proc/reset_throw(mob/living/carbon/human/H) + if(H.in_throw_mode) + H.throw_mode_off() //Don't annoy the changeling if he doesn't catch the item + +/mob/proc/tentacle_grab(mob/living/carbon/C) + if(Adjacent(C)) + var/obj/item/weapon/grab/G = C.grabbedby(src,1) + if(istype(G)) + G.state = GRAB_AGGRESSIVE //Instant aggressive grab + +/mob/proc/tentacle_stab(mob/living/carbon/C) + if(Adjacent(C)) + var/obj/item/I = r_hand + if(!is_sharp(I)) + I = l_hand + if(!is_sharp(I)) + return + + C.visible_message("[src] impales [C] with [I]!", "[src] impales you with [I]!") + C.apply_damage(I.force, BRUTE, "chest") + do_attack_animation(C) + add_blood(C) + playsound(get_turf(src), I.hitsound, 75, 1) + + +/obj/item/projectile/tentacle/on_hit(atom/target, blocked = 0) + qdel(source.gun) //one tentacle only unless you miss + if(blocked >= 100) + return 0 + var/mob/living/carbon/human/H = firer + if(istype(target, /obj/item)) + var/obj/item/I = target + if(!I.anchored) + to_chat(firer, "You pull [I] towards yourself.") + H.throw_mode_on() + I.throw_at(H, 10, 2) + . = 1 + + else if(isliving(target)) + var/mob/living/L = target + if(!L.anchored && !L.throwing)//avoid double hits + if(iscarbon(L)) + var/mob/living/carbon/C = L + switch(firer.a_intent) + if(INTENT_HELP) + C.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") + C.throw_at(get_step_towards(H,C), 8, 2) + return 1 + + if(INTENT_DISARM) + var/obj/item/I = C.get_active_hand() + if(I) + if(C.drop_item()) + C.visible_message("[I] is yanked out of [C]'s hand by [src]!","A tentacle pulls [I] away from you!") + on_hit(I) //grab the item as if you had hit it directly with the tentacle + return 1 + else + to_chat(firer, "You can't seem to pry [I] out of [C]'s hands!") + return 0 + else + to_chat(firer, "[C] has nothing in hand to disarm!") + return 0 + + if(INTENT_GRAB) + C.visible_message("[L] is grabbed by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") + C.throw_at(get_step_towards(H,C), 8, 2, callback=CALLBACK(H, /mob/proc/tentacle_grab, C)) + return 1 + + if(INTENT_HARM) + C.visible_message("[L] is thrown towards [H] by a tentacle!","A tentacle grabs you and throws you towards [H]!") + C.throw_at(get_step_towards(H,C), 8, 2, callback=CALLBACK(H, /mob/proc/tentacle_stab, C)) + return 1 + else + L.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") + L.throw_at(get_step_towards(H,L), 8, 2) + . = 1 + +/obj/item/projectile/tentacle/Destroy() + qdel(chain) + source = null + return ..() + /***************************************\ |****************SHIELD*****************| diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm index 8ae82a0e788..5b11d2ba656 100644 --- a/code/game/gamemodes/changeling/powers/panacea.dm +++ b/code/game/gamemodes/changeling/powers/panacea.dm @@ -33,7 +33,10 @@ user.reagents.add_reagent("potass_iodide", 10) user.reagents.add_reagent("charcoal", 20) - for(var/datum/disease/D in user.viruses) + for(var/thing in user.viruses) + var/datum/disease/D = thing + if(D.severity == NONTHREAT) + continue D.cure() feedback_add_details("changeling_powers","AP") diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 5fd98986332..376e6d5a148 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -30,8 +30,6 @@ var/mob/living/carbon/human/H = user H.restore_blood() H.shock_stage = 0 - spawn(1) - H.fixblood() H.species.create_organs(H) // Now that recreating all organs is necessary, the rest of this organ stuff probably // isn't, but I don't want to remove it, just in case. @@ -39,10 +37,6 @@ var/obj/item/organ/external/O = H.bodyparts_by_name[organ_name] if(!O) continue - for(var/obj/item/weapon/shard/shrapnel/s in O.implants) - O.implants -= s - H.contents -= s - qdel(s) O.brute_dam = 0 O.burn_dam = 0 O.damage_state = "00" @@ -58,6 +52,7 @@ for(var/obj/item/organ/internal/IO in H.internal_organs) IO.damage = 0 IO.trace_chemicals.Cut() + H.remove_all_embedded_objects() H.updatehealth() to_chat(user, "We have regenerated.") diff --git a/code/game/gamemodes/changeling/powers/swap_form.dm b/code/game/gamemodes/changeling/powers/swap_form.dm index 82baf6d5293..cb67858bb2e 100644 --- a/code/game/gamemodes/changeling/powers/swap_form.dm +++ b/code/game/gamemodes/changeling/powers/swap_form.dm @@ -17,7 +17,7 @@ if((NOCLONE || SKELETON || HUSK) in target.mutations) to_chat(user, "DNA of [target] is ruined beyond usability!") return - if(!istype(target) || issmall(target) || target.species.flags & NO_DNA) + if(!istype(target) || issmall(target) || NO_DNA in target.species.species_traits) to_chat(user, "[target] is not compatible with this ability.") return return 1 diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index 648d8ac1cbb..e972af4ce23 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -81,7 +81,7 @@ if(!selected_dna) return var/datum/species/newspecies = all_species[selected_dna.species] - if((newspecies.flags & NOTRANSSTING) || newspecies.is_small) + if((NOTRANSSTING in newspecies.species_traits) || newspecies.is_small) to_chat(user, "The selected DNA is incompatible with our sting.") return ..() @@ -94,7 +94,7 @@ return FALSE if(ishuman(target)) var/mob/living/carbon/human/H = target - if(H.species.flags & NO_DNA) + if(NO_DNA in H.species.species_traits) to_chat(user, "This won't work on a creature without DNA.") return FALSE return TRUE diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 97511414e7a..abc8aa8952f 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -7,7 +7,6 @@ force = 30 throwforce = 10 sharp = 1 - edge = 1 hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") @@ -41,15 +40,17 @@ w_class = WEIGHT_CLASS_SMALL force = 15 throwforce = 25 + embed_chance = 75 var/cooldown = 0 -/obj/item/weapon/melee/cultblade/dagger/afterattack(mob/living/target as mob, mob/living/carbon/human/user as mob) +/obj/item/weapon/melee/cultblade/dagger/afterattack(atom/target, mob/living/carbon/human/user) ..() - var/mob/living/carbon/human/bleeder = target - if(!(cooldown > world.time) && ((bleeder.stat != DEAD) && !(bleeder.species.flags & NO_BLOOD))) - user.visible_message("The runes on the blade absorb the blood of [target]!") - bleeder.drip(5000) - cooldown = world.time + 2400 + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(!(cooldown > world.time) && ((H.stat != DEAD) && !(NO_BLOOD in H.species.species_traits))) + user.visible_message("The runes on the blade absorb the blood of [H]!") + H.bleed(5000) + cooldown = world.time + 2400 /obj/item/weapon/restraints/legcuffs/bola/cult name = "runed bola" diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index f3191491c88..fb4ba668bef 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -327,9 +327,7 @@ var/round_start_time = 0 //If its actually the end of the round, wait for it to end. //Otherwise if its a verb it will continue on afterwards. spawn(300) - if(cinematic) - qdel(cinematic) //end the cinematic - cinematic = null + QDEL_NULL(cinematic) //end the cinematic if(temp_buckle) qdel(temp_buckle) //release everybody diff --git a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm index 18d073d6077..4f7ad2ade9a 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm @@ -37,7 +37,7 @@ /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) + if(NO_INTORGANS in AB.species.species_traits) user.visible_message("[user] prepares [target]'s [target_zone] for further dissection!", "You prepare [target]'s [target_zone] for further dissection.") return 1 if(IC) diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index e58665c514e..5b3784987f3 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -134,10 +134,9 @@ 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 + D.carrier = TRUE owner.viruses += D D.affected_mob = owner - D.holder = owner owner.med_hud_set_status() @@ -181,21 +180,14 @@ uses = -1 /obj/item/organ/internal/heart/gland/bloody/activate() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.drip(200) + owner.blood_volume = max(owner.blood_volume - 20, 0) 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) + owner.add_splatter_floor(T) 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) + H.add_mob_blood(owner) /obj/item/organ/internal/heart/gland/bodysnatch cooldown_low = 600 @@ -211,8 +203,7 @@ C.Copy(owner) C.Start() owner.adjustBruteLoss(40) - var/turf/T = get_turf(owner) - T.add_blood_floor(src) + owner.add_splatter_floor() /obj/effect/cocoon/abductor name = "slimy cocoon" diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index a9975618435..a98090d186a 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -361,11 +361,6 @@ host = M forceMove(M) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/external/head = H.get_organ("head") - head.implants += src - host.status_flags |= PASSEMOTES RemoveBorerActions() @@ -746,11 +741,6 @@ controlling = FALSE - if(ishuman(host)) - var/mob/living/carbon/human/H = host - var/obj/item/organ/external/head = H.get_organ("head") - head.implants -= src - reset_perspective(null) machine = null diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index ca9e7b7ac28..338484a5ebc 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -35,6 +35,7 @@ anchored = 1 mob_size = MOB_SIZE_TINY pass_flags = PASSTABLE | PASSGRILLE | PASSMOB + speed = 1 atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) var/essence = 75 //The resource of revenants. Max health is equal to three times this amount diff --git a/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm b/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm index 73165079b6e..a6b083d5b72 100644 --- a/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm +++ b/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm @@ -132,8 +132,7 @@ playsound(get_turf(src), 'sound/misc/exit_blood.ogg', 100, 1, -1) flick("jauntup",animation) - qdel(holder) - holder = null + QDEL_NULL(holder) if(iscarbon(src)) var/mob/living/carbon/C = src @@ -171,4 +170,4 @@ return /obj/effect/dummy/slaughter/singularity_act() - return \ No newline at end of file + return diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index 8fbc0563181..25ebd7bc379 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -83,7 +83,7 @@ /mob/living/simple_animal/slaughter/Life() ..() if(boost 0) target = pick(possible_targets) @@ -447,7 +447,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) \ n_p++ else if(ticker.current_state == GAME_STATE_PLAYING) for(var/mob/living/carbon/human/P in player_list) - if(P.species.flags & NO_DNA) + if(NO_DNA in P.species.species_traits) continue if(P.client && !(P.mind in ticker.mode.changelings) && P.mind!=owner) n_p++ diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 97f609ca9ff..d250200236d 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -305,7 +305,7 @@ Made by Xhuis blood_color = "#555555" flesh_color = "#222222" - flags = NO_BLOOD | NO_BREATHE | RADIMMUNE | NOGUNS //Can't use guns due to muzzle flash + species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NOGUNS) //Can't use guns due to muzzle flash burn_mod = 1.5 //1.5x burn damage, 2x is excessive oxy_mod = 0 hot_env_multiplier = 1.5 @@ -346,7 +346,7 @@ Made by Xhuis blood_color = "#CCCCCC" flesh_color = "#AAAAAA" - flags = NO_BLOOD | NO_BREATHE | RADIMMUNE + species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE) burn_mod = 1.1 oxy_mod = 0 hot_env_multiplier = 1.1 diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 406f21bdcdb..94b75646bf5 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -289,20 +289,20 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha return old_bloodtotal = bloodtotal old_bloodusable = bloodusable - if(!H.vessel.get_reagent_amount("blood")) + if(!H.blood_volume) to_chat(owner, "They've got no blood left to give.") break if(H.stat < DEAD) - blood = min(20, H.vessel.get_reagent_amount("blood")) // if they have less than 20 blood, give them the remnant else they get 20 blood + blood = min(20, H.blood_volume) // if they have less than 20 blood, give them the remnant else they get 20 blood bloodtotal += blood / 2 //divide by 2 to counted the double suction since removing cloneloss -Melandor0 bloodusable += blood / 2 else - blood = min(5, H.vessel.get_reagent_amount("blood")) // The dead only give 5 bloods + blood = min(5, H.blood_volume) // The dead only give 5 blood bloodtotal += blood if(old_bloodtotal != bloodtotal) to_chat(owner, "You have accumulated [bloodtotal] [bloodtotal > 1 ? "units" : "unit"] of blood[bloodusable != old_bloodusable ? ", and have [bloodusable] left to use" : ""].") check_vampire_upgrade() - H.vessel.remove_reagent("blood", 25) + H.blood_volume = max(H.blood_volume - 25, 0) if(ishuman(owner)) var/mob/living/carbon/human/V = owner V.nutrition = min(NUTRITION_LEVEL_WELL_FED, V.nutrition + (blood / 2)) @@ -338,8 +338,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha vampire_mind.current.create_attack_log("De-vampired") if(vampire_mind.vampire) vampire_mind.vampire.remove_vampire_powers() - qdel(vampire_mind.vampire) - vampire_mind.vampire = null + QDEL_NULL(vampire_mind.vampire) if(issilicon(vampire_mind.current)) to_chat(vampire_mind.current, "You have been turned into a robot! You can feel your powers fading away...") else @@ -455,6 +454,5 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha return static_inventory -= vampire_blood_display - qdel(vampire_blood_display) - vampire_blood_display = null + QDEL_NULL(vampire_blood_display) show_hud(hud_version) diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 13f05048393..0d44481cc3f 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -215,7 +215,7 @@ stat_allowed = 1 /obj/effect/proc_holder/spell/vampire/mob_aoe/glare/cast(list/targets, mob/user = usr) - user.visible_message("[user]'s eyes emit a blinding flash!") + user.visible_message("[user]'s eyes emit a blinding flash!") if(istype(user:glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) to_chat(user, "You're blindfolded!") return @@ -236,15 +236,21 @@ /obj/effect/proc_holder/spell/vampire/self/shapeshift/cast(list/targets, mob/user = usr) user.visible_message("[user] transforms!") - user.client.prefs.real_name = user.generate_name() - user.client.prefs.random_character() - user.client.prefs.copy_to(user) - user.regenerate_icons() + if(ishuman(user)) + var/mob/living/carbon/human/H = user + scramble(1, H, 100) + H.real_name = random_name(H.gender, H.species.name) //Give them a name that makes sense for their species. + H.sync_organ_dna(assimilate = 1) + H.update_body(0) + H.reset_hair() //No more winding up with hairstyles you're not supposed to have, and blowing your cover. + H.reset_markings() //...Or markings. + H.dna.ResetUIFrom(H) + user.update_icons() /obj/effect/proc_holder/spell/vampire/self/screech - name = "Chiroptean Screech (30)" + name = "Chiropteran Screech (30)" desc = "An extremely loud shriek that stuns nearby humans and breaks windows as well." - gain_desc = "You have gained the Chriopteran Screech ability which stuns anything with ears in a large radius and shatters glass in the process." + gain_desc = "You have gained the Chiropteran Screech ability which stuns anything with ears in a large radius and shatters glass in the process." action_icon_state = "vampire_screech" required_blood = 30 diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 1dd20906704..88251dcdd36 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -231,7 +231,6 @@ var/global/list/multiverse = list() force = 20 throwforce = 10 sharp = 1 - edge = 1 w_class = WEIGHT_CLASS_SMALL attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") var/faction = list("unassigned") @@ -465,7 +464,7 @@ var/global/list/multiverse = list() if("cyborg") if(M.get_species() != "Machine") for(var/obj/item/organ/O in M.bodyparts) - O.robotize() + O.robotize(make_tough = 1) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses) M.equip_to_slot_or_del(sword, slot_r_hand) @@ -526,7 +525,7 @@ var/global/list/multiverse = list() M.equip_to_slot_or_del(sword, slot_r_hand) for(var/obj/item/carried_item in M.contents) if(!istype(carried_item, /obj/item/weapon/implant)) - carried_item.add_blood(M) + carried_item.add_mob_blood(M) if("pirate") M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform) @@ -780,7 +779,7 @@ var/global/list/multiverse = list() to_chat(target, "You suddenly feel very hot") target.bodytemperature += 50 GiveHint(target) - else if(can_puncture(I)) + else if(is_pointed(I)) to_chat(target, "You feel a stabbing pain in [parse_zone(user.zone_sel.selecting)]!") target.Weaken(2) GiveHint(target) diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 3e396ae14a8..b416b297cca 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -9,10 +9,13 @@ origin_tech = "bluespace=4;materials=5" var/imprinted = "empty" + var/optional = FALSE //does this soulstone ask the victim whether they want to be turned into a shade var/usability = TRUE // Can this soul stone be used by anyone, or only cultists/wizards? var/reusable = TRUE // Can this soul stone be used more than once? var/spent = FALSE // If the soul stone can only be used once, has it been used? + var/opt_in = FALSE // for tracking during the 'optional' bit + /obj/item/device/soulstone/proc/can_use(mob/living/user) if(iscultist(user) || iswizard(user) || usability) return TRUE @@ -33,6 +36,7 @@ /obj/item/device/soulstone/anybody/chaplain name = "mysterious old shard" reusable = FALSE + optional = TRUE /obj/item/device/soulstone/pickup(mob/living/user) ..() @@ -69,6 +73,50 @@ M.create_attack_log("Has had their soul captured with [src.name] by [key_name(user)]") user.create_attack_log("Used the [src.name] to capture the soul of [key_name(M)]") + if(optional) + if(!M.ckey) + to_chat(user, "They have no soul!") + return + + to_chat(user, "You attempt to channel [M]'s soul into [src]. You must give the soul some time to react and stand still...") + + var/mob/player_mob = M + if(M.get_ghost())//in case our player ghosted and we need to throw the alert at their ghost instead + player_mob = M.get_ghost() + var/client/player_client = player_mob.client + to_chat(player_mob, "[user] is trying to capture your soul into [src]! Click the button in the top right of the game window to respond.") + player_client << 'sound/misc/notice2.ogg' + window_flash(player_client) + + var/obj/screen/alert/notify_soulstone/A = player_mob.throw_alert("\ref[src]_soulstone_thingy", /obj/screen/alert/notify_soulstone) + if(player_client.prefs && player_client.prefs.UI_style) + A.icon = ui_style2icon(player_client.prefs.UI_style) + + //pass the stuff to the alert itself + A.stone = src + A.stoner = user.real_name + + //layer shenanigans to make the alert display the soulstone + var/old_layer = layer + var/old_plane = plane + layer = FLOAT_LAYER + plane = FLOAT_PLANE + A.overlays += src + layer = old_layer + plane = old_plane + + //give the victim 10 seconds to respond + sleep(10 SECONDS) + + if(!opt_in) + to_chat(user, "The soul resists your attempts at capturing it!") + return + + opt_in = FALSE + + if(spent)//checking one more time against shenanigans + return + M.create_attack_log("Has had their soul captured with [src.name] by [key_name(user)]") user.create_attack_log("Used the [src.name] to capture the soul of [key_name(M)]") log_attack("[key_name(user)] used the [src.name] to capture the soul of [key_name(M)]") diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 4f3e7fe9001..c97b3ac9445 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -78,8 +78,7 @@ if(initial(S.name) == initial(aspell.name)) spell_levels = aspell.spell_level user.mind.spell_list.Remove(aspell) - qdel(S) - S = null + QDEL_NULL(S) return cost * (spell_levels+1) return -1 diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index 50c8a06777b..ce410dea69e 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -112,6 +112,9 @@ id = /obj/item/weapon/card/id/engineering pda = /obj/item/device/pda/atmos + backpack = /obj/item/weapon/storage/backpack/industrial + satchel = /obj/item/weapon/storage/backpack/satchel_eng + dufflebag = /obj/item/weapon/storage/backpack/duffel/engineering box = /obj/item/weapon/storage/box/engineer /datum/job/mechanic diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index bac7efd0b8a..c8e7d9e2433 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -206,15 +206,15 @@ var/atom/placed_in = H.equip_or_collect(G.spawn_item(null, H.client.prefs.gear[G.display_name])) if(istype(placed_in)) if(isturf(placed_in)) - to_chat(H, "Placing \the [G] on [placed_in]!") + to_chat(H, "Placing [G.display_name] on [placed_in]!") else - to_chat(H, "Placing \the [G] in [placed_in.name]") + to_chat(H, "Placing [G.display_name] in [placed_in.name]") continue if(H.equip_to_appropriate_slot(G)) - to_chat(H, "Placing \the [G] in your inventory!") + to_chat(H, "Placing [G.display_name] in your inventory!") continue if(H.put_in_hands(G)) - to_chat(H, "Placing \the [G] in your hands!") + to_chat(H, "Placing [G.display_name] in your hands!") continue to_chat(H, "Failed to locate a storage object on your mob, either you spawned with no hands free and no backpack or this is a bug.") qdel(G) diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index e92a95e70b6..218172b1884 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -83,6 +83,7 @@ spawn_positions = 1 is_medical = 1 supervisors = "the chief medical officer" + department_head = list("Chief Medical Officer") selection_color = "#ffeef0" access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_mineral_storeroom) minimal_access = list(access_medical, access_morgue, access_maint_tunnels) diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm index 60f1bd541a8..6b8a35ce582 100644 --- a/code/game/jobs/job/support.dm +++ b/code/game/jobs/job/support.dm @@ -224,7 +224,8 @@ /obj/item/weapon/stamp/clown = 1, /obj/item/toy/crayon/rainbow = 1, /obj/item/weapon/storage/fancy/crayons = 1, - /obj/item/weapon/reagent_containers/spray/waterflower = 1 + /obj/item/weapon/reagent_containers/spray/waterflower = 1, + /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofbanana = 1 ) backpack = /obj/item/weapon/storage/backpack/clown diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 82238f732b9..7179c5340cf 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -10,11 +10,13 @@ var/global/datum/controller/occupations/job_master var/list/occupations = list() var/list/name_occupations = list() //Dict of all jobs, keys are titles var/list/type_occupations = list() //Dict of all jobs, keys are types + var/list/prioritized_jobs = list() // List of jobs set to priority by HoP/Captain //Players who need jobs var/list/unassigned = list() //Debug info var/list/job_debug = list() + /datum/controller/occupations/proc/SetupOccupations(var/list/faction = list("Station")) occupations = list() diff --git a/code/game/jobs/job_exp.dm b/code/game/jobs/job_exp.dm index 4a1624426b7..3c17c6f0107 100644 --- a/code/game/jobs/job_exp.dm +++ b/code/game/jobs/job_exp.dm @@ -7,6 +7,7 @@ var/global/list/role_playtime_requirements = list( ROLE_SENTIENT = 5, ROLE_ERT = 10, // High, because they're team-based, and we want ERT to be robust ROLE_TRADER = 5, + ROLE_DRONE = 10, // High, because they're like mini engineering cyborgs that can ignore the AI, ventcrawl, and respawn themselves // SOLO ANTAGS ROLE_TRAITOR = 3, diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index f74380432d2..3c56199513e 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -92,15 +92,15 @@ if(filtering > 0) if(beaker) // To prevent runtimes from drawing blood from runtime, and to prevent getting IPC blood. - if(!istype(occupant) || !occupant.dna || (occupant.species && occupant.species.flags & NO_BLOOD)) + if(!istype(occupant) || !occupant.dna || (NO_BLOOD in occupant.species.species_traits)) filtering = 0 return if(beaker.reagents.total_volume < beaker.reagents.maximum_volume) - src.occupant.vessel.trans_to(beaker, 1) + src.occupant.transfer_blood_to(beaker, 1) for(var/datum/reagent/x in src.occupant.reagents.reagent_list) src.occupant.reagents.trans_to(beaker, 3) - src.occupant.vessel.trans_to(beaker, 1) + src.occupant.transfer_blood_to(beaker, 1) if(occupant) for(var/A in occupant.reagents.addiction_list) @@ -197,13 +197,12 @@ crisis = (occupant.health < min_health) // I'm not sure WHY you'd want to put a simple_animal in a sleeper, but precedent is precedent // Runtime is aptly named, isn't she? - if(ishuman(occupant) && occupant.vessel && !(occupant.species && occupant.species.flags & NO_BLOOD)) - var/blood_type = occupant.get_blood_name() + if(ishuman(occupant) && !(NO_BLOOD in occupant.species.species_traits)) occupantData["pulse"] = occupant.get_pulse(GETPULSE_TOOL) occupantData["hasBlood"] = 1 - occupantData["bloodLevel"] = round(occupant.vessel.get_reagent_amount(blood_type)) + occupantData["bloodLevel"] = round(occupant.blood_volume) occupantData["bloodMax"] = occupant.max_blood - occupantData["bloodPercent"] = round(100*(occupant.vessel.get_reagent_amount(blood_type)/occupant.max_blood), 0.01) + occupantData["bloodPercent"] = round(100*(occupant.blood_volume/occupant.max_blood), 0.01) data["occupant"] = occupantData data["maxchem"] = max_chem diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 41dc37ab43f..6514ef82c47 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -345,7 +345,14 @@ occupantData["health"] = H.health occupantData["maxHealth"] = H.maxHealth - occupantData["hasVirus"] = H.viruses.len + var/found_disease = FALSE + for(var/thing in H.viruses) + var/datum/disease/D = thing + if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC) + continue + found_disease = TRUE + break + occupantData["hasVirus"] = found_disease occupantData["bruteLoss"] = H.getBruteLoss() occupantData["oxyLoss"] = H.getOxyLoss() @@ -364,14 +371,12 @@ var/bloodData[0] bloodData["hasBlood"] = 0 - if(ishuman(H) && H.vessel && !(H.species && H.species.flags & NO_BLOOD)) - var/blood_type = H.get_blood_name() - var/blood_volume = round(H.vessel.get_reagent_amount(blood_type)) + if(ishuman(H) && !(NO_BLOOD in H.species.species_traits)) bloodData["hasBlood"] = 1 - bloodData["volume"] = blood_volume - bloodData["percent"] = round(((blood_volume / BLOOD_VOLUME_NORMAL)*100)) + bloodData["volume"] = H.blood_volume + bloodData["percent"] = round(((H.blood_volume / BLOOD_VOLUME_NORMAL)*100)) bloodData["pulse"] = H.get_pulse(GETPULSE_TOOL) - bloodData["bloodLevel"] = blood_volume + bloodData["bloodLevel"] = H.blood_volume bloodData["bloodMax"] = H.max_blood occupantData["blood"] = bloodData @@ -398,7 +403,7 @@ organData["broken"] = E.min_broken_damage var/shrapnelData[0] - for(var/obj/I in E.implants) + for(var/obj/I in E.embedded_objects) var/shrapnelSubData[0] shrapnelSubData["name"] = I.name @@ -416,8 +421,6 @@ organStatus["robotic"] = 1 if(E.status & ORGAN_SPLINTED) organStatus["splinted"] = 1 - if(E.status & ORGAN_BLEEDING) - organStatus["bleeding"] = 1 if(E.status & ORGAN_DEAD) organStatus["dead"] = 1 @@ -499,8 +502,15 @@ t1 = "*dead*" dat += "[occupant.health > 50 ? "" : ""]\tHealth %: [occupant.health], ([t1])
    " - if(occupant.viruses.len) - dat += "Viral pathogen detected in blood stream.
    " + var/found_disease = FALSE + for(var/thing in occupant.viruses) + var/datum/disease/D = thing + if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC) + continue + found_disease = TRUE + break + if(found_disease) + dat += "Disease detected in occupant.
    " var/extra_font = null extra_font = (occupant.getBruteLoss() < 60 ? "" : "") @@ -532,14 +542,11 @@ if(occupant.has_brain_worms()) dat += "Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.
    " - if(occupant.vessel) - var/blood_type = occupant.get_blood_name() - var/blood_volume = round(occupant.vessel.get_reagent_amount(blood_type)) - var/blood_percent = blood_volume / BLOOD_VOLUME_NORMAL - blood_percent *= 100 + var/blood_percent = round((occupant.blood_volume / BLOOD_VOLUME_NORMAL)) + blood_percent *= 100 - extra_font = (blood_volume > 448 ? "" : "") - dat += "[extra_font]\tBlood Level %: [blood_percent] ([blood_volume] units)
    " + extra_font = (occupant.blood_volume > 448 ? "" : "") + dat += "[extra_font]\tBlood Level %: [blood_percent] ([occupant.blood_volume] units)
    " if(occupant.reagents) dat += "Epinephrine units: [occupant.reagents.get_reagent_amount("Epinephrine")] units
    " @@ -580,8 +587,6 @@ lung_ruptured = "Lung ruptured:" if(e.status & ORGAN_SPLINTED) splint = "Splinted:" - if(e.status & ORGAN_BLEEDING) - bled = "Bleeding:" if(e.status & ORGAN_BROKEN) AN = "[e.broken_description]:" if(e.status & ORGAN_ROBOT) @@ -605,7 +610,7 @@ infected = "Septic:" var/unknown_body = 0 - for(var/I in e.implants) + for(var/I in e.embedded_objects) unknown_body++ if(unknown_body || e.hidden) diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 4d059043329..63aeee28b2f 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -5,12 +5,12 @@ layer = 3 anchored = 1.0 var/uses = 20 - var/disabled = 1 + var/disabled = TRUE var/lethal = 0 - var/locked = 1 + var/locked = TRUE var/cooldown_time = 0 var/cooldown_timeleft = 0 - var/cooldown_on = 0 + var/cooldown_on = FALSE req_access = list(access_ai_upload) /obj/machinery/ai_slipper/power_change() @@ -22,6 +22,7 @@ else icon_state = "motion0" stat |= NOPOWER + disabled = TRUE /obj/machinery/ai_slipper/proc/setState(var/enabled, var/uses) disabled = disabled @@ -49,6 +50,24 @@ return return +/obj/machinery/ai_slipper/proc/ToggleOn() + if(stat & (NOPOWER|BROKEN)) + return + disabled = !disabled + icon_state = disabled? "motion0":"motion3" + +/obj/machinery/ai_slipper/proc/Activate() + if(stat & (NOPOWER|BROKEN)) + return + if(cooldown_on || disabled) + return + else + new /obj/structure/foam(loc) + uses-- + cooldown_on = TRUE + cooldown_time = world.timeofday + 100 + slip_process() + /obj/machinery/ai_slipper/attack_ai(mob/user) return attack_hand(user) @@ -87,18 +106,10 @@ return 1 if(href_list["toggleOn"]) - disabled = !disabled - icon_state = disabled? "motion0":"motion3" + ToggleOn() + if(href_list["toggleUse"]) - if(cooldown_on || disabled) - return - else - new /obj/structure/foam(loc) - uses-- - cooldown_on = 1 - cooldown_time = world.timeofday + 100 - slip_process() - return + Activate() attack_hand(usr) @@ -115,5 +126,5 @@ if(uses <= 0) return if(uses >= 0) - cooldown_on = 0 + cooldown_on = FALSE power_change() \ No newline at end of file diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 721372b56f5..b85fb249c2e 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -87,6 +87,10 @@ /obj/machinery/clonepod/Destroy() if(connected) connected.pods -= src + for(var/s in sharedSoulhooks) + var/datum/soullink/S = s + S.removeSoulsharer(src) //If a sharer is destroy()'d, they are simply removed + sharedSoulhooks = null QDEL_NULL(Radio) QDEL_NULL(countdown) QDEL_LIST(missing_organs) @@ -288,6 +292,8 @@ to_chat(clonemind.current, {"Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete."}) + // Set up a soul link with the dead body to catch a revival + soullink(/datum/soullink/soulhook, clonemind.current, src) update_icon() @@ -467,7 +473,12 @@ update_clone_antag(occupant) to_chat(occupant, "There is a bright flash!
    \ You feel like a new being.
    ") - occupant.flash_eyes(visual = 1) + occupant.flash_eyes(visual = 1) + for(var/s in sharedSoulhooks) + var/datum/soullink/S = s + S.removeSoulsharer(src) //If a sharer is destroy()'d, they are simply removed + sharedSoulhooks = null + for(var/i in missing_organs) qdel(i) @@ -479,17 +490,22 @@ occupant = null update_icon() -/obj/machinery/clonepod/proc/malfunction() +/obj/machinery/clonepod/proc/malfunction(go_easy = FALSE) if(occupant) connected_message("Critical Error!") announce_radio_message("Critical error! Please contact a Thinktronic Systems technician, as your warranty may be affected.") - if(occupant.mind != clonemind) - clonemind.transfer_to(occupant) - occupant.grab_ghost() // We really just want to make you suffer. - to_chat(occupant, {"Agony blazes across your - consciousness as your body is torn apart.
    - Is this what dying is like? Yes it is.
    "}) - occupant << sound('sound/hallucinations/veryfar_noise.ogg',0,1,50) + for(var/s in sharedSoulhooks) + var/datum/soullink/S = s + S.removeSoulsharer(src) //If a sharer is destroy()'d, they are simply removed + sharedSoulhooks = null + if(!go_easy) + if(occupant.mind != clonemind) + clonemind.transfer_to(occupant) + occupant.grab_ghost() // We really just want to make you suffer. + to_chat(occupant, {"Agony blazes across your + consciousness as your body is torn apart.
    + Is this what dying is like? Yes it is.
    "}) + occupant << sound('sound/hallucinations/veryfar_noise.ogg',0,1,50) for(var/i in missing_organs) qdel(i) missing_organs.Cut() @@ -542,6 +558,11 @@ else return +/obj/machinery/clonepod/onSoullinkRevive(mob/living/L) + if(occupant && L == clonemind.current) + // The old body's back in shape, time to ditch the cloning one + malfunction(go_easy = TRUE) + /obj/machinery/clonepod/proc/maim_clone(mob/living/carbon/human/H) LAZYINITLIST(missing_organs) for(var/i in missing_organs) diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index ba7aadc3054..72dcbb7deb6 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -546,7 +546,7 @@ power_channel = ENVIRON /obj/machinery/readybutton/attack_ai(mob/user as mob) - to_chat(user, "The station AI is not to interact with these devices") + to_chat(user, "The station AI is not to interact with these devices.") return /obj/machinery/readybutton/attackby(obj/item/weapon/W as obj, mob/user as mob, params) diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 19d61e0daf9..e9d84c38acc 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -148,13 +148,12 @@ occupantData["btCelsius"] = occupant.bodytemperature - T0C occupantData["btFaren"] = ((occupant.bodytemperature - T0C) * (9.0/5.0))+ 32 - if(ishuman(occupant) && occupant.vessel && !(occupant.species && occupant.species.flags & NO_BLOOD)) - var/blood_type = occupant.get_blood_name() + if(ishuman(occupant) && !(NO_BLOOD in occupant.species.species_traits)) occupantData["pulse"] = occupant.get_pulse(GETPULSE_TOOL) occupantData["hasBlood"] = 1 - occupantData["bloodLevel"] = round(occupant.vessel.get_reagent_amount(blood_type)) + occupantData["bloodLevel"] = round(occupant.blood_volume) occupantData["bloodMax"] = occupant.max_blood - occupantData["bloodPercent"] = round(100*(occupant.vessel.get_reagent_amount(blood_type)/occupant.max_blood), 0.01) //copy pasta ends here + occupantData["bloodPercent"] = round(100*(occupant.blood_volume/occupant.max_blood), 0.01) //copy pasta ends here occupantData["bloodType"]=occupant.b_type if(occupant.surgeries.len) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index f42e50d9618..2cb5b8a46a2 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -71,7 +71,9 @@ ui_interact(user) /obj/machinery/computer/security/attackby(obj/item/I, user as mob, params) - if(I.GetAccess()) // If hit by something with access. + if(isscrewdriver(I)) + ..() + else if(I.GetAccess()) // If hit by something with access. attack_hand(user) else ..() diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index a6c072fec60..d260df8c9b9 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -20,8 +20,14 @@ var/time_last_changed_position = 0 //if set to -1: No cooldown... probably a bad idea //if set to 0: Not able to close "original" positions. You can only close positions that you have opened before var/change_position_cooldown = 60 - //Jobs you cannot open new positions for - var/list/blacklisted = list( + // Jobs that do not appear in the list at all. + var/list/blacklisted_full = list( + /datum/job/ntnavyofficer, + /datum/job/ntspecops, + /datum/job/civilian + ) + // Jobs that appear in the list, and you can prioritize, but not open/close slots for + var/list/blacklisted_partial = list( /datum/job/ai, /datum/job/cyborg, /datum/job/captain, @@ -37,12 +43,8 @@ var/time_last_changed_position = 0 /datum/job/brigdoc, /datum/job/mechanic, /datum/job/barber, - /datum/job/chaplain, - /datum/job/ntnavyofficer, - /datum/job/ntspecops, - /datum/job/civilian + /datum/job/chaplain ) - //The scaling factor of max total positions in relation to the total amount of people on board the station in % var/max_relative_positions = 30 //30%: Seems reasonable, limit of 6 @ 20 players @@ -77,7 +79,7 @@ var/time_last_changed_position = 0 /obj/machinery/computer/card/proc/format_job_slots() var/list/formatted = list() for(var/datum/job/job in job_master.occupations) - if(job_blacklisted(job)) + if(job_blacklisted_full(job)) continue if(!job_in_department(job)) continue @@ -86,7 +88,9 @@ var/time_last_changed_position = 0 "current_positions" = job.current_positions, "total_positions" = job.total_positions, "can_open" = can_open_job(job), - "can_close" = can_close_job(job)))) + "can_close" = can_close_job(job), + "can_prioritize" = can_prioritize_job(job) + ))) return formatted @@ -137,14 +141,18 @@ var/time_last_changed_position = 0 nanomanager.update_uis(src) attack_hand(user) -//Check if you can't open a new position for a certain job -/obj/machinery/computer/card/proc/job_blacklisted(datum/job/job) - return (job.type in blacklisted) +//Check if you can't touch a job in any way whatsoever +/obj/machinery/computer/card/proc/job_blacklisted_full(datum/job/job) + return (job.type in blacklisted_full) + +//Check if you can't open/close positions for a certain job +/obj/machinery/computer/card/proc/job_blacklisted_partial(datum/job/job) + return (job.type in blacklisted_partial) //Logic check for Topic() if you can open the job /obj/machinery/computer/card/proc/can_open_job(datum/job/job) if(job) - if(!job_blacklisted(job) && job_in_department(job, FALSE)) + if(!job_blacklisted_full(job) && !job_blacklisted_partial(job) && job_in_department(job, FALSE)) if((job.total_positions <= player_list.len * (max_relative_positions / 100))) var/delta = (world.time / 10) - time_last_changed_position if((change_position_cooldown < delta) || (opened_positions[job.title] < 0)) @@ -156,8 +164,8 @@ var/time_last_changed_position = 0 //Logic check for Topic() if you can close the job /obj/machinery/computer/card/proc/can_close_job(datum/job/job) if(job) - if(!job_blacklisted(job) && job_in_department(job, FALSE)) - if(job.total_positions > job.current_positions) + if(!job_blacklisted_full(job) && !job_blacklisted_partial(job) && job_in_department(job, FALSE)) + if(job.total_positions > job.current_positions && !(job in job_master.prioritized_jobs)) var/delta = (world.time / 10) - time_last_changed_position if((change_position_cooldown < delta) || (opened_positions[job.title] > 0)) return 1 @@ -165,6 +173,20 @@ var/time_last_changed_position = 0 return -1 return 0 +/obj/machinery/computer/card/proc/can_prioritize_job(datum/job/job) + if(job) + if(!job_blacklisted_full(job) && job_in_department(job, FALSE)) + if(job in job_master.prioritized_jobs) + return 2 + else + if(job_master.prioritized_jobs.len >= 3) + return 0 + if(job.total_positions <= job.current_positions) + return 0 + return 1 + return -1 + + /obj/machinery/computer/card/proc/job_in_department(datum/job/targetjob, includecivs = 1) if(!scan || !scan.access) return 0 @@ -488,7 +510,25 @@ var/time_last_changed_position = 0 opened_positions[edit_job_target]-- log_game("[key_name(usr)] has closed a job slot for job \"[j]\".") nanomanager.update_uis(src) - + if("prioritize_job") + // TOGGLE WHETHER JOB APPEARS AS PRIORITIZED IN THE LOBBY + if(is_authenticated(usr) && !target_dept) + var/priority_target = href_list["job"] + var/datum/job/j = job_master.GetJob(priority_target) + if(!j) + return 0 + if(!job_in_department(j)) + return 0 + var/priority = TRUE + if(j in job_master.prioritized_jobs) + job_master.prioritized_jobs -= j + priority = FALSE + else if(job_master.prioritized_jobs.len < 3) + job_master.prioritized_jobs += j + else + return 0 + log_game("[key_name(usr)] [priority ? "prioritized" : "unprioritized"] the job \"[j.title]\".") + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) if(modify) modify.name = text("[modify.registered_name]'s ID Card ([modify.assignment])") @@ -499,7 +539,8 @@ var/time_last_changed_position = 0 circuit = /obj/item/weapon/circuitboard/card/centcom req_access = list(access_cent_commander) change_position_cooldown = -1 - blacklisted = list() + blacklisted_full = list() + blacklisted_partial = list() /obj/machinery/computer/card/minor name = "department management console" diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 5f72dab528c..a95fee5fe2f 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -356,7 +356,7 @@ return if(scan_brain && !can_brainscan()) return - if((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna) || (subject.species.flags & NO_SCAN)) + if((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna) || (NO_SCAN in subject.species.species_traits)) scantemp = "Error: Unable to locate valid genetic data." nanomanager.update_uis(src) return @@ -364,7 +364,7 @@ var/obj/item/organ/internal/brain/Brn = subject.get_int_organ(/obj/item/organ/internal/brain) if(istype(Brn)) var/datum/species/S = all_species[Brn.dna.species] // stepladder code wooooo - if(S.flags & NO_SCAN) + if(NO_SCAN in S.species_traits) scantemp = "Error: Subject's brain is incompatible." nanomanager.update_uis(src) return @@ -403,7 +403,7 @@ B.dna.check_integrity() R.dna=B.dna.Clone() var/datum/species/S = all_species[R.dna.species] - if(S.flags & NO_SCAN) + if(NO_SCAN in S.species_traits) extra_info = "Proper genetic interface not found, defaulting to genetic data of the body." R.dna.species = subject.species.name R.id= copytext(md5(B.dna.real_name), 2, 6) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 7c2df327285..d016a0df7bd 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -198,9 +198,7 @@ if("op") active2.fields["b_type"] = "O+" if("del_r2") - if(active2) - qdel(active2) - active2 = null + QDEL_NULL(active2) if(href_list["scan"]) if(scan) @@ -565,4 +563,4 @@ #undef MED_DATA_MAINT #undef MED_DATA_RECORD #undef MED_DATA_V_DATA -#undef MED_DATA_MEDBOT \ No newline at end of file +#undef MED_DATA_MEDBOT diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index fca20841cfa..c4aefaa555d 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -156,11 +156,8 @@ for(var/datum/data/record/R in data_core.medical) if(R.fields["name"] == active1.fields["name"] && R.fields["id"] == active1.fields["id"]) qdel(R) - qdel(active1) - active1 = null - if(active2) - qdel(active2) - active2 = null + QDEL_NULL(active1) + QDEL_NULL(active2) update_all_mob_security_hud() screen = SEC_DATA_R_LIST if("criminal") @@ -556,4 +553,4 @@ #undef SEC_DATA_R_LIST #undef SEC_DATA_MAINT -#undef SEC_DATA_RECORD \ No newline at end of file +#undef SEC_DATA_RECORD diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index e98028e3807..66d0bfdbaee 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -111,8 +111,7 @@ for(var/datum/data/record/R in data_core.medical) if(R.fields["name"] == active1.fields["name"] && R.fields["id"] == active1.fields["id"]) qdel(R) - qdel(active1) - active1 = null + QDEL_NULL(active1) screen = SKILL_DATA_R_LIST if("rank") if(active1) @@ -322,4 +321,4 @@ #undef SKILL_DATA_R_LIST #undef SKILL_DATA_MAINT -#undef SKILL_DATA_RECORD \ No newline at end of file +#undef SKILL_DATA_RECORD diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 1e31207b574..0478141abe3 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -316,9 +316,7 @@ if(istype(W,/obj/item/device/pda)) var/obj/item/device/pda/P = W - if(P.id) - qdel(P.id) - P.id = null + QDEL_NULL(P.id) qdel(P) if(!preserve) @@ -421,8 +419,7 @@ occupant.ghostize(0) // Players despawned too early may not re-enter the game else occupant.ghostize(1) - qdel(occupant) - occupant = null + QDEL_NULL(occupant) name = initial(name) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index d6b295e1811..2b2039c9743 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -278,9 +278,9 @@ L.Weaken(5) else //for simple_animals & borgs L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - var/turf/simulated/location = loc - if(istype(location, /turf/simulated)) //add_blood doesn't work for borgs/xenos, but add_blood_floor does. - location.add_blood_floor(L) + var/turf/location = get_turf(src) + L.add_splatter_floor(location) + /obj/machinery/door/proc/requiresID() return 1 diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index aa345e29643..6cb866d27ed 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -142,8 +142,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ /obj/machinery/hologram/holopad/proc/clear_holo() // hologram.set_light(0)//Clear lighting. //handled by the lighting controller when its ower is deleted - qdel(hologram)//Get rid of hologram. - hologram = null + QDEL_NULL(hologram)//Get rid of hologram. if(master.holo == src) master.holo = null master = null//Null the master, since no-one is using it now. diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 26785e248b1..a0403f88358 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -1,10 +1,14 @@ +#define IV_TAKING 0 +#define IV_INJECTING 1 + /obj/machinery/iv_drip name = "\improper IV drip" icon = 'icons/obj/iv_drip.dmi' icon_state = "iv_drip" - anchored = 0 + anchored = FALSE + mouse_drag_pointer = MOUSE_ACTIVE_POINTER var/mob/living/carbon/human/attached = null - var/mode = 1 // 1 is injecting, 0 is taking blood. + var/mode = IV_INJECTING var/obj/item/weapon/reagent_containers/beaker = null var/transfer_amount = 5 var/possible_transfer_amounts = list(1,5,10) @@ -61,7 +65,7 @@ overlays += filling /obj/machinery/iv_drip/MouseDrop(mob/living/target) - if(!ishuman(usr)) + if(!ishuman(usr) || !iscarbon(target)) return if(attached) @@ -83,6 +87,7 @@ else to_chat(usr, "There's nothing attached to the IV drip!") + /obj/machinery/iv_drip/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/reagent_containers)) if(beaker) @@ -113,8 +118,8 @@ if(beaker) // Give blood if(mode) - if(beaker.volume > 0) - var/fraction = min(transfer_amount/beaker.volume, 1) //the fraction that is transfered of the total volume + if(beaker.reagents.total_volume) + var/fraction = min(transfer_amount/beaker.reagents.total_volume, 1) //the fraction that is transfered of the total volume beaker.reagents.reaction(attached, INGEST, fraction) //make reagents reacts, but don't spam messages beaker.reagents.trans_to(attached, transfer_amount) update_icon() @@ -124,43 +129,17 @@ var/amount = beaker.reagents.maximum_volume - beaker.reagents.total_volume amount = min(amount, 4) // If the beaker is full, ping - if(amount == 0) + if(!amount) if(prob(5)) visible_message("[src] pings.") return - var/mob/living/carbon/human/T = attached - - if(!ishuman(T)) - return - - if(!T.dna) - return - - if(NOCLONE in T.mutations) - return - - if(T.species.flags & NO_BLOOD) - return - - if(T.species.exotic_blood) - T.vessel.trans_to(beaker, amount) - update_icon() - else - var/datum/reagent/B = T.take_blood(beaker, amount) - - if(B) - beaker.reagents.reagent_list |= B - beaker.reagents.update_total() - beaker.on_reagent_change() - beaker.reagents.handle_reactions() - update_icon() - - // If attached is losing too much blood, beep. - var/blood_type = attached.get_blood_name() - if(T.vessel.get_reagent_amount(blood_type) < BLOOD_VOLUME_SAFE && prob(5)) + // If the human is losing too much blood, beep. + if(attached.blood_volume < BLOOD_VOLUME_SAFE && prob(5)) visible_message("[src] beeps loudly.") playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) + attached.transfer_blood_to(beaker, amount) + update_icon() /obj/machinery/iv_drip/attack_hand(mob/user) if(!ishuman(user)) @@ -219,7 +198,7 @@ /obj/machinery/iv_drip/examine(mob/user) ..(user) - if(!(user in view(2)) && user != loc) + if(get_dist(user, src) > 2) return to_chat(user, "The IV drip is [mode ? "injecting" : "taking blood"].") @@ -239,9 +218,17 @@ set category = "Object" set src in view(1) + if(!iscarbon(usr)) + to_chat(usr, "You can't do that!") + return + if(usr.incapacitated()) return + var/default = 5 var/N = input("Amount per transfer from this:", "[src]", default) as null|anything in possible_transfer_amounts if(N) - transfer_amount = N \ No newline at end of file + transfer_amount = N + +#undef IV_TAKING +#undef IV_INJECTING \ No newline at end of file diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 65cd281340c..f7272e8e29a 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -68,6 +68,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co #define NEWSCASTER_D_NOTICE_FC 9 // D-Notice feed channel #define NEWSCASTER_W_ISSUE_H 10 // Wanted Issue handler #define NEWSCASTER_W_ISSUE 11 // STATIONWIDE WANTED ISSUE +#define NEWSCASTER_JOBS 12 // Available jobs /obj/machinery/newscaster name = "newscaster" @@ -94,6 +95,21 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co var/silence = 0 var/temp = null var/temp_back_screen = NEWSCASTER_MAIN + var/list/jobblacklist = list( + /datum/job/ai, + /datum/job/cyborg, + /datum/job/captain, + /datum/job/judge, + /datum/job/blueshield, + /datum/job/nanotrasenrep, + /datum/job/pilot, + /datum/job/brigdoc, + /datum/job/mechanic, + /datum/job/barber, + /datum/job/chaplain, + /datum/job/ntnavyofficer, + /datum/job/ntspecops, + /datum/job/civilian) var/static/REDACTED = "\[REDACTED\]" light_range = 0 @@ -252,6 +268,14 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co data["criminal"] = news_network.wanted_issue.author data["description"] = news_network.wanted_issue.body data["photo"] = news_network.wanted_issue.img ? icon2base64(news_network.wanted_issue.img) : 0 + if(12) + var/list/jobs = list() + data["jobs"] = jobs + for(var/datum/job/job in job_master.occupations) + if(job_blacklisted(job)) + continue + if(job.is_position_available()) + jobs[++jobs.len] = list("title" = job.title) return data /obj/machinery/newscaster/Topic(href, href_list) @@ -535,6 +559,9 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(can_scan(usr)) scan_user(usr) //Newscaster scans you + else if(href_list["jobs"]) + screen = NEWSCASTER_JOBS + nanomanager.update_uis(src) return 1 @@ -748,6 +775,9 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co ////////////////////////////////////helper procs +/obj/machinery/newscaster/proc/job_blacklisted(datum/job/job) + return (job.type in jobblacklist) + /obj/machinery/newscaster/proc/scan_user(mob/user) if(ishuman(user)) //User is a human var/mob/living/carbon/human/human_user = user diff --git a/code/game/machinery/podmen.dm b/code/game/machinery/podmen.dm deleted file mode 100644 index af24a856115..00000000000 --- a/code/game/machinery/podmen.dm +++ /dev/null @@ -1,136 +0,0 @@ -/* Moved all the plant people code here for ease of reference and coherency. -Injecting a pod person with a blood sample will grow a pod person with the memories and persona of that mob. -Growing it to term with nothing injected will grab a ghost from the observers. */ - -/obj/item/seeds/replicapod - name = "pack of dionaea-replicant seeds" - desc = "These seeds grow into 'replica pods' or 'dionaea', a form of strange sapient plantlife." - icon_state = "seed-replicapod" - mypath = "/obj/item/seeds/replicapod" - species = "replicapod" - plantname = "Dionaea" - productname = "/mob/living/carbon/human" //verrry special -- Urist - lifespan = 50 //no idea what those do - endurance = 8 - maturation = 5 - production = 10 - yield = 1 //seeds if there isn't a dna inside - oneharvest = 1 - potency = 30 - plant_type = 0 - growthstages = 6 - var/ckey = null - var/realName = null - var/mob/living/carbon/human/source //Donor of blood, if any. - gender = MALE - var/obj/machinery/hydroponics/parent = null - var/found_player = 0 - var/beingharvested = 0 - -/obj/item/seeds/replicapod/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - - if(istype(W,/obj/item/weapon/reagent_containers)) - - to_chat(user, "You inject the contents of the syringe into the seeds.") - - var/datum/reagent/blood/B - - //Find a blood sample to inject. - for(var/datum/reagent/R in W:reagents.reagent_list) - if(istype(R,/datum/reagent/blood)) - B = R - break - if(B) - source = B.data["donor"] - to_chat(user, "The strange, sluglike seeds quiver gently and swell with blood.") - if(!source.client && source.mind) - for(var/mob/O in respawnable_list) - if(O.mind == source.mind && config.revival_pod_plants) - switch(alert(O,"Your corpse has been placed into a pod plant. Do you want to be resurrected/cloned? Please note if you select 'No', you will still be able to be cloned or borged again this round.","Pod Alert","Yes","No")) - if("Yes") - source.key = O.key - return - if("No") - to_chat(user, "The seeds seem to reject the blood, returning to their original size as they stop quivering.") - return - else - to_chat(user, "Nothing happens.") - return - - if(!istype(source)) - return - - if(source.ckey) - realName = source.real_name - ckey = source.ckey - - W:reagents.clear_reagents() - return - - return ..() - -/obj/item/seeds/replicapod/harvest(mob/user = usr) - - parent = loc -// var/found_player = 0 - - - if(beingharvested) - to_chat(user, ("You can only harvest the pod once!")) - else - user.visible_message("[user] carefully begins to open the pod...","You carefully begin to open the pod...") - beingharvested = 1 - - //If a sample is injected (and revival is allowed) the plant will be controlled by the original donor. - if(source && source.stat == 2 && source.client && source.ckey && config.revival_pod_plants) - transfer_personality(source.client) - else // If no sample was injected or revival is not allowed, we grab an interested observer. - transfer_personality() - -/obj/item/seeds/replicapod/proc/transfer_personality(var/client/player) - - if(player) - found_player = 1 - var/mob/living/carbon/monkey/diona/podman = new(parent.loc) - podman.ckey = player.ckey - respawnable_list -= player - if(player.mob && player.mob.mind) - player.mob.mind.transfer_to(podman) - - if(realName) - podman.real_name = realName - else - podman.real_name = "diona nymph ([rand(100,999)])" - - podman.dna.real_name = podman.real_name - - // Update mode specific HUD icons. - callHook("harvest_podman", list(podman)) - - switch(ticker.mode.name) - if("revolution") - if(podman.mind in ticker.mode:revolutionaries) - ticker.mode:add_revolutionary(podman.mind) - ticker.mode:update_all_rev_icons() //So the icon actually appears - if(podman.mind in ticker.mode:head_revolutionaries) - ticker.mode:update_all_rev_icons() - if("nuclear emergency") - if(podman.mind in ticker.mode:syndicates) - ticker.mode:update_all_synd_icons() - if("cult") - if(podman.mind in ticker.mode:cult) - ticker.mode:add_cultist(podman.mind) - ticker.mode:update_all_cult_icons() //So the icon actually appears - // -- End mode specific stuff - - to_chat(podman, "You awaken slowly, feeling your sap stir into sluggish motion as the warm air caresses your bark.") - if(source && ckey && podman.ckey == ckey) - to_chat(podman, "Memories of a life as [source] drift oddly through a mind unsuited for them, like a skin of oil over a fathomless lake.") - to_chat(podman, "You are now one of the Dionaea, a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders.") - to_chat(podman, "Too much darkness will send you into shock and starve you, but light will help you heal.") - - else - new /mob/living/carbon/monkey/diona(parent.loc) - - parent.visible_message("The pod disgorges a fully-formed plant creature!") - parent.update_tray() diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm index f9f1f40264d..6e1e1c0e97a 100644 --- a/code/game/machinery/poolcontroller.dm +++ b/code/game/machinery/poolcontroller.dm @@ -93,7 +93,7 @@ if(drownee && (drownee.lying || deep_water)) //Mob lying down or water is deep (determined by controller) if(drownee.internal) return //Has internals, no drowning - if((drownee.species.flags & NO_BREATHE) || (NO_BREATHE in drownee.mutations)) + if((NO_BREATHE in drownee.species.species_traits) || (NO_BREATHE in drownee.mutations)) return //doesn't breathe, no drowning if(drownee.get_species() == "Skrell" || drownee.get_species() == "Neara") return //fish things don't drown diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index f0a635c73a8..1e0f416bb0d 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -220,9 +220,6 @@ var/i = 1 for(1, i <= coeff, i++) LR.Charge(occupant) - if(istype(O,/obj/item/weapon/mop/advanced)) - if(O.reagents.get_reagent_amount("water") < 40) - O.reagents.add_reagent("water", 0.5 * coeff) if(R) if(R.module) R.module.respawn_consumable(R) diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 698c1c5fe91..9cf58846feb 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -168,7 +168,7 @@ var/const/SAFETY_COOLDOWN = 100 gib = 0 if(L.stat == CONSCIOUS) L.say("ARRRRRRRRRRRGH!!!") - add_blood(L) + add_mob_blood(L) if(!blood && !issilicon(L)) blood = 1 diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index eee465e062a..4fe0d47f12c 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -948,7 +948,7 @@ occupant.take_organ_damage(0,radiation_level*2 + rand(1,3)) if(radiation_level > 1) occupant.take_organ_damage(0,radiation_level + rand(1,3)) - occupant.radiation += radiation_level*10 + occupant.apply_effect(radiation_level*10, IRRADIATE) /obj/machinery/suit_cycler/proc/finished_job() var/turf/T = get_turf(src) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 10f6fc1c8c5..153fc50bf91 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -1,3 +1,6 @@ +#define BUTTON_COOLDOWN 60 // cant delay the bomb forever +#define BUTTON_DELAY 50 //five seconds + /obj/machinery/syndicatebomb icon = 'icons/obj/assemblies.dmi' name = "syndicate bomb" @@ -6,71 +9,119 @@ anchored = 0 density = 0 - layer = MOB_LAYER - 0.1 //so people can't hide it and it's REALLY OBVIOUS + layer = BELOW_MOB_LAYER //so people can't hide it and it's REALLY OBVIOUS unacidable = 1 var/datum/wires/syndicatebomb/wires = null - var/timer = 120 - var/open_panel = 0 //are the wires exposed? - var/active = 0 //is the bomb counting down? - var/defused = 0 //is the bomb capable of exploding? - var/obj/item/weapon/bombcore/payload = /obj/item/weapon/bombcore/ + var/minimum_timer = 90 + var/timer_set = 90 + var/maximum_timer = 60000 + + var/can_unanchor = TRUE + + var/open_panel = FALSE //are the wires exposed? + var/active = FALSE //is the bomb counting down? + var/defused = FALSE //is the bomb capable of exploding? + var/obj/item/weapon/bombcore/payload = /obj/item/weapon/bombcore var/beepsound = 'sound/items/timer.ogg' + var/delayedbig = FALSE //delay wire pulsed? + var/delayedlittle = FALSE //activation wire pulsed? + var/obj/effect/countdown/syndicatebomb/countdown + + var/next_beep + var/detonation_timer + var/explode_now = FALSE + +/obj/machinery/syndicatebomb/proc/try_detonate(ignore_active = FALSE) + . = (payload in src) && (active || ignore_active) && !defused + if(.) + payload.detonate() /obj/machinery/syndicatebomb/process() - if(active && !defused && (timer > 0)) //Tick Tock - var/volume = (timer <= 20 ? 40 : 10) // Tick louder when the bomb is closer to being detonated. - playsound(loc, beepsound, volume, 0) - timer = max(timer - 2,0) // 2 seconds per process() - if(active && !defused && (timer <= 0)) //Boom - active = 0 - timer = 120 - update_icon() - if(payload in src) - payload.detonate() + if(!active) + fast_processing -= src + detonation_timer = null + next_beep = null + countdown.stop() return - if(!active || defused) //Counter terrorists win + + if(!isnull(next_beep) && (next_beep <= world.time)) + var/volume + switch(seconds_remaining()) + if(0 to 5) + volume = 50 + if(5 to 10) + volume = 40 + if(10 to 15) + volume = 30 + if(15 to 20) + volume = 20 + if(20 to 25) + volume = 10 + else + volume = 5 + playsound(loc, beepsound, volume, 0) + next_beep = world.time + 10 + + if(active && !defused && ((detonation_timer <= world.time) || explode_now)) + active = FALSE + timer_set = initial(timer_set) + update_icon() + try_detonate(TRUE) + //Counter terrorists win + else if(!active || defused) if(defused && payload in src) payload.defuse() - return + countdown.stop() + fast_processing -= src /obj/machinery/syndicatebomb/New() wires = new(src) - payload = new payload(src) + if(payload) + payload = new payload(src) update_icon() + countdown = new(src) ..() /obj/machinery/syndicatebomb/Destroy() QDEL_NULL(wires) + QDEL_NULL(countdown) + fast_processing -= src return ..() /obj/machinery/syndicatebomb/examine(mob/user) ..(user) - to_chat(user, "A digital display on it reads \"[timer]\".") + to_chat(user, "A digital display on it reads \"[seconds_remaining()]\".") /obj/machinery/syndicatebomb/update_icon() icon_state = "[initial(icon_state)][active ? "-active" : "-inactive"][open_panel ? "-wires" : ""]" -/obj/machinery/syndicatebomb/attackby(var/obj/item/I, var/mob/user, params) - if(istype(I, /obj/item/weapon/wrench)) +/obj/machinery/syndicatebomb/proc/seconds_remaining() + if(active) + . = max(0, round((detonation_timer - world.time) / 10)) + else + . = timer_set + +/obj/machinery/syndicatebomb/attackby(obj/item/I, mob/user, params) + if(iswrench(I) && can_unanchor) if(!anchored) - if(!isturf(src.loc) || istype(src.loc, /turf/space)) - to_chat(user, "The bomb must be placed on solid ground to attach it") + if(!isturf(loc) || isspaceturf(loc)) + to_chat(user, "The bomb must be placed on solid ground to attach it.") else - to_chat(user, "You firmly wrench the bomb to the floor") + to_chat(user, "You firmly wrench the bomb to the floor.") playsound(loc, I.usesound, 50, 1) anchored = 1 if(active) - to_chat(user, "The bolts lock in place") + to_chat(user, "The bolts lock in place.") else if(!active) - to_chat(user, "You wrench the bomb from the floor") + to_chat(user, "You wrench the bomb from the floor.") playsound(loc, I.usesound, 50, 1) anchored = 0 else to_chat(user, "The bolts are locked down!") - else if(istype(I, /obj/item/weapon/screwdriver)) + else if(isscrewdriver(I)) open_panel = !open_panel update_icon() to_chat(user, "You [open_panel ? "open" : "close"] the wire panel.") @@ -79,28 +130,47 @@ if(open_panel) wires.Interact(user) - else if(istype(I, /obj/item/weapon/crowbar)) - if(open_panel && isWireCut(WIRE_BOOM) && isWireCut(WIRE_UNBOLT) && isWireCut(WIRE_DELAY) && isWireCut(WIRE_PROCEED) && isWireCut(WIRE_ACTIVATE)) + else if(iscrowbar(I)) + if(open_panel && wires.IsAllCut()) if(payload) to_chat(user, "You carefully pry out [payload].") payload.loc = user.loc payload = null else - to_chat(user, "There isn't anything in here to remove!") + to_chat(user, "There isn't anything in here to remove!") else if(open_panel) - to_chat(user, "The wires connecting the shell to the explosives are holding it down!") + to_chat(user, "The wires connecting the shell to the explosives are holding it down!") else - to_chat(user, "The cover is screwed on, it won't pry off!") + to_chat(user, "The cover is screwed on, it won't pry off!") else if(istype(I, /obj/item/weapon/bombcore)) if(!payload) + if(!user.drop_item()) + return payload = I to_chat(user, "You place [payload] into [src].") - user.drop_item() - payload.loc = src + payload.forceMove(src) else to_chat(user, "[payload] is already loaded into [src], you'll have to remove it first.") + else if(iswelder(I)) + if(payload || !wires.IsAllCut() || !open_panel) + return + var/obj/item/weapon/weldingtool/WT = I + if(!WT.isOn()) + return + if(WT.get_fuel() < 5) //uses up 5 fuel. + to_chat(user, "You need more fuel to complete this task!") + return + + playsound(loc, WT.usesound, 50, 1) + to_chat(user, "You start to cut the [src] apart...") + if(do_after(user, 20*I.toolspeed, target = src)) + if(!WT.isOn() || !WT.remove_fuel(5, user)) + return + to_chat(user, "You cut the [src] apart.") + new /obj/item/stack/sheet/plasteel(loc, 5) + qdel(src) else - ..() + return ..() /obj/machinery/syndicatebomb/attack_ghost(mob/user) interact(user) @@ -133,21 +203,27 @@ return FALSE return TRUE +/obj/machinery/syndicatebomb/proc/activate() + active = TRUE + fast_processing += src + countdown.start() + next_beep = world.time + 10 + detonation_timer = world.time + (timer_set * 10) + playsound(loc, 'sound/machines/click.ogg', 30, 1) + /obj/machinery/syndicatebomb/proc/settings(mob/user) - var/newtime = input(user, "Please set the timer.", "Timer", "[timer]") as num - newtime = Clamp(newtime, 120, 60000) + var/new_timer = input(user, "Please set the timer.", "Timer", "[timer_set]") as num if(can_interact(user)) //No running off and setting bombs from across the station - timer = newtime - loc.visible_message("[bicon(src)] timer set for [timer] seconds.") + timer_set = Clamp(new_timer, minimum_timer, maximum_timer) + loc.visible_message("[bicon(src)] timer set for [timer_set] seconds.") if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && can_interact(user)) if(defused || active) if(defused) loc.visible_message("[bicon(src)] Device error: User intervention required.") return else - loc.visible_message("[bicon(src)] [timer] seconds until detonation, please clear the area.") - playsound(loc, 'sound/machines/click.ogg', 30, 1) - active = 1 + loc.visible_message("[bicon(src)] [timer_set] seconds until detonation, please clear the area.") + activate() update_icon() add_fingerprint(user) @@ -167,12 +243,12 @@ name = "training bomb" icon_state = "training-bomb" desc = "A salvaged syndicate device gutted of its explosives to be used as a training aid for aspiring bomb defusers." - payload = /obj/item/weapon/bombcore/training/ + payload = /obj/item/weapon/bombcore/training /obj/machinery/syndicatebomb/badmin name = "generic summoning badmin bomb" desc = "Oh god what is in this thing?" - payload = /obj/item/weapon/bombcore/badmin/summon/ + payload = /obj/item/weapon/bombcore/badmin/summon /obj/machinery/syndicatebomb/badmin/clown name = "clown bomb" @@ -181,8 +257,23 @@ payload = /obj/item/weapon/bombcore/badmin/summon/clown beepsound = 'sound/items/bikehorn.ogg' -/obj/machinery/syndicatebomb/badmin/varplosion - payload = /obj/item/weapon/bombcore/badmin/explosion/ +/obj/machinery/syndicatebomb/empty + name = "bomb" + icon_state = "base-bomb" + desc = "An ominous looking device designed to detonate an explosive payload. Can be bolted down using a wrench." + payload = null + open_panel = TRUE + timer_set = 120 + +/obj/machinery/syndicatebomb/empty/New() + ..() + wires.CutAll() + +/obj/machinery/syndicatebomb/self_destruct + name = "self destruct device" + desc = "Do not taunt. Warranty invalid if exposed to high temperature. Not suitable for agents under 3 years of age." + payload = /obj/item/weapon/bombcore/large + can_unanchor = FALSE ///Bomb Cores/// @@ -196,17 +287,26 @@ origin_tech = "syndicate=5;combat=6" burn_state = FLAMMABLE //Burnable (but the casing isn't) var/adminlog = null + var/range_heavy = 3 + var/range_medium = 9 + var/range_light = 17 + var/range_flame = 17 /obj/item/weapon/bombcore/ex_act(severity) //Little boom can chain a big boom - src.detonate() + detonate() + + +/obj/item/weapon/bombcore/burn() + detonate() + ..() /obj/item/weapon/bombcore/proc/detonate() if(adminlog) message_admins(adminlog) log_game(adminlog) - explosion(get_turf(src),3,9,17, flame_range = 17) - if(src.loc && istype(src.loc,/obj/machinery/syndicatebomb/)) - qdel(src.loc) + explosion(get_turf(src), range_heavy, range_medium, range_light, flame_range = range_flame) + if(loc && istype(loc, /obj/machinery/syndicatebomb)) + qdel(loc) qdel(src) /obj/item/weapon/bombcore/proc/defuse() @@ -223,17 +323,20 @@ var/attempts = 0 /obj/item/weapon/bombcore/training/proc/reset() - var/obj/machinery/syndicatebomb/holder = src.loc + var/obj/machinery/syndicatebomb/holder = loc if(istype(holder)) if(holder.wires) holder.wires.Shuffle() holder.defused = 0 holder.open_panel = 0 + holder.delayedbig = FALSE + holder.delayedlittle = FALSE + holder.explode_now = FALSE holder.update_icon() holder.updateDialog() /obj/item/weapon/bombcore/training/detonate() - var/obj/machinery/syndicatebomb/holder = src.loc + var/obj/machinery/syndicatebomb/holder = loc if(istype(holder)) attempts++ holder.loc.visible_message("[bicon(holder)] Alert: Bomb has detonated. Your score is now [defusals] for [attempts]. Resetting wires...") @@ -242,7 +345,7 @@ qdel(src) /obj/item/weapon/bombcore/training/defuse() - var/obj/machinery/syndicatebomb/holder = src.loc + var/obj/machinery/syndicatebomb/holder = loc if(istype(holder)) attempts++ defusals++ @@ -257,11 +360,11 @@ origin_tech = null /obj/item/weapon/bombcore/badmin/defuse() //because we wouldn't want them being harvested by players - var/obj/machinery/syndicatebomb/B = src.loc + var/obj/machinery/syndicatebomb/B = loc qdel(B) qdel(src) -/obj/item/weapon/bombcore/badmin/summon/ +/obj/item/weapon/bombcore/badmin/summon var/summon_path = /obj/item/weapon/reagent_containers/food/snacks/cookie var/amt_summon = 1 @@ -285,42 +388,165 @@ playsound(src.loc, 'sound/misc/sadtrombone.ogg', 50) ..() -/obj/item/weapon/bombcore/badmin/explosion/ - var/HeavyExplosion = 2 - var/MediumExplosion = 5 - var/LightExplosion = 11 - var/Flames = 11 +/obj/item/weapon/bombcore/large + name = "large bomb payload" + range_heavy = 5 + range_medium = 10 + range_light = 20 + range_flame = 20 -/obj/item/weapon/bombcore/badmin/explosion/detonate() - explosion(get_turf(src),HeavyExplosion,MediumExplosion,LightExplosion, flame_range = Flames) +/obj/item/weapon/bombcore/large/underwall + layer = ABOVE_OPEN_TURF_LAYER /obj/item/weapon/bombcore/miniature name = "small bomb core" w_class = WEIGHT_CLASS_SMALL + range_heavy = 1 + range_medium = 2 + range_light = 4 + range_flame = 2 -/obj/item/weapon/bombcore/miniature/detonate() - explosion(src.loc,1,2,4,flame_range = 2) //Identical to a minibomb +/obj/item/weapon/bombcore/chemical + name = "chemical payload" + desc = "An explosive payload designed to spread chemicals, dangerous or otherwise, across a large area. It is able to hold up to four chemical containers, and must be loaded before use." + origin_tech = "combat=4;materials=3" + icon_state = "chemcore" + var/list/beakers = list() + var/max_beakers = 1 + var/spread_range = 5 + var/temp_boost = 50 + var/time_release = 0 + +/obj/item/weapon/bombcore/chemical/detonate() + + if(time_release > 0) + var/total_volume = 0 + for(var/obj/item/weapon/reagent_containers/RC in beakers) + total_volume += RC.reagents.total_volume + + if(total_volume < time_release) // If it's empty, the detonation is complete. + if(loc && istype(loc, /obj/machinery/syndicatebomb)) + qdel(loc) + qdel(src) + return + + var/fraction = time_release/total_volume + var/datum/reagents/reactants = new(time_release) + reactants.my_atom = src + for(var/obj/item/weapon/reagent_containers/RC in beakers) + RC.reagents.trans_to(reactants, RC.reagents.total_volume*fraction, 1, 1, 1) + chem_splash(get_turf(src), spread_range, list(reactants), temp_boost) + + // Detonate it again in one second, until it's out of juice. + addtimer(src, "detonate", 10) + + // If it's not a time release bomb, do normal explosion + + var/list/reactants = list() + + for(var/obj/item/weapon/reagent_containers/glass/G in beakers) + reactants += G.reagents + + for(var/obj/item/slime_extract/S in beakers) + if(S.Uses) + for(var/obj/item/weapon/reagent_containers/glass/G in beakers) + G.reagents.trans_to(S, G.reagents.total_volume) + + if(S && S.reagents && S.reagents.total_volume) + reactants += S.reagents + + if(!chem_splash(get_turf(src), spread_range, reactants, temp_boost)) + playsound(loc, 'sound/items/Screwdriver2.ogg', 50, 1) + return // The Explosion didn't do anything. No need to log, or disappear. + + if(adminlog) + message_admins(adminlog) + log_game(adminlog) + + playsound(loc, 'sound/effects/bamf.ogg', 75, 1, 5) + + if(loc && istype(loc, /obj/machinery/syndicatebomb)) + qdel(loc) qdel(src) +/obj/item/weapon/bombcore/chemical/attackby(obj/item/I, mob/user, params) + if(iscrowbar(I) && beakers.len > 0) + playsound(loc, I.usesound, 50, 1) + for (var/obj/item/B in beakers) + B.loc = get_turf(src) + beakers -= B + return + else if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker) || istype(I, /obj/item/weapon/reagent_containers/glass/bottle)) + if(beakers.len < max_beakers) + if(!user.drop_item()) + return + beakers += I + to_chat(user, "You load [src] with [I].") + I.loc = src + else + to_chat(user, "The [I] wont fit! The [src] can only hold up to [max_beakers] containers.") + return + ..() + +/obj/item/weapon/bombcore/chemical/CheckParts(list/parts_list) + ..() + // Using different grenade casings, causes the payload to have different properties. + var/obj/item/weapon/stock_parts/matter_bin/MB = locate(/obj/item/weapon/stock_parts/matter_bin) in src + if(MB) + max_beakers += MB.rating // max beakers = 2-5. + qdel(MB) + for(var/obj/item/weapon/grenade/chem_grenade/G in src) + + if(istype(G, /obj/item/weapon/grenade/chem_grenade/large)) + var/obj/item/weapon/grenade/chem_grenade/large/LG = G + max_beakers += 1 // Adding two large grenades only allows for a maximum of 7 beakers. + spread_range += 2 // Extra range, reduced density. + temp_boost += 50 // maximum of +150K blast using only large beakers. Not enough to self ignite. + for(var/obj/item/slime_extract/S in LG.beakers) // And slime cores. + if(beakers.len < max_beakers) + beakers += S + S.loc = src + else + S.loc = get_turf(src) + + if(istype(G, /obj/item/weapon/grenade/chem_grenade/cryo)) + spread_range -= 1 // Reduced range, but increased density. + temp_boost -= 100 // minimum of -150K blast. + + if(istype(G, /obj/item/weapon/grenade/chem_grenade/pyro)) + temp_boost += 150 // maximum of +350K blast, which is enough to self ignite. Which means a self igniting bomb can't take advantage of other grenade casing properties. Sorry? + + if(istype(G, /obj/item/weapon/grenade/chem_grenade/adv_release)) + time_release += 50 // A typical bomb, using basic beakers, will explode over 2-4 seconds. Using two will make the reaction last for less time, but it will be more dangerous overall. + + for(var/obj/item/weapon/reagent_containers/glass/B in G) + if(beakers.len < max_beakers) + beakers += B + B.loc = src + else + B.loc = get_turf(src) + + qdel(G) + ///Syndicate Detonator (aka the big red button)/// /obj/item/device/syndicatedetonator name = "big red button" - desc = "Nothing good can come of pressing a button this garish..." + desc = "Your standard issue bomb synchronizing button. Five second safety delay to prevent 'accidents'." icon = 'icons/obj/assemblies.dmi' icon_state = "bigred" item_state = "electronic" w_class = WEIGHT_CLASS_TINY origin_tech = "syndicate=3" - var/cooldown = 0 + var/timer = 0 var/detonated = 0 var/existant = 0 -/obj/item/device/syndicatedetonator/attack_self(mob/user as mob) - if(!cooldown) +/obj/item/device/syndicatedetonator/attack_self(mob/user) + if(timer < world.time) for(var/obj/machinery/syndicatebomb/B in machines) if(B.active) - B.timer = 0 + B.detonation_timer = world.time + BUTTON_DELAY detonated++ existant++ playsound(user, 'sound/machines/click.ogg', 20, 1) @@ -334,5 +560,7 @@ log_game("[key_name(user)] has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [A.name] ([T.x],[T.y],[T.z])") detonated = 0 existant = 0 - cooldown = 1 - spawn(30) cooldown = 0 + timer = world.time + BUTTON_COOLDOWN + +#undef BUTTON_COOLDOWN +#undef BUTTON_DELAY \ No newline at end of file diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm index 2aa0c2a5d59..592815bbc24 100644 --- a/code/game/machinery/telecomms/traffic_control.dm +++ b/code/game/machinery/telecomms/traffic_control.dm @@ -192,7 +192,7 @@ add_fingerprint(user) user.set_machine(src) - if(!allowed(user) && !emagged) + if(!allowed(user) && !emagged && !user.can_admin_interact()) to_chat(user, "Access Denied.") return 0 diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index f9de8b8d596..9033a74526a 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -791,9 +791,9 @@ desc = "A self-serving Chinese food machine, for all your Chinese food needs." product_slogans = "Taste 5000 years of culture!" icon_state = "snack" - products = list(/obj/item/weapon/reagent_containers/food/snacks/chinese/chowmein = 6, /obj/item/weapon/reagent_containers/food/snacks/chinese/tao = 6, /obj/item/weapon/reagent_containers/food/snacks/chinese/newdles = 6, + products = list(/obj/item/weapon/reagent_containers/food/snacks/chinese/chowmein = 6, /obj/item/weapon/reagent_containers/food/snacks/chinese/tao = 6, /obj/item/weapon/reagent_containers/food/snacks/chinese/sweetsourchickenball = 6, /obj/item/weapon/reagent_containers/food/snacks/chinese/newdles = 6, /obj/item/weapon/reagent_containers/food/snacks/chinese/rice = 6) - prices = list(/obj/item/weapon/reagent_containers/food/snacks/chinese/chowmein = 50, /obj/item/weapon/reagent_containers/food/snacks/chinese/tao = 50, /obj/item/weapon/reagent_containers/food/snacks/chinese/newdles = 50, + prices = list(/obj/item/weapon/reagent_containers/food/snacks/chinese/chowmein = 50, /obj/item/weapon/reagent_containers/food/snacks/chinese/tao = 50, /obj/item/weapon/reagent_containers/food/snacks/chinese/sweetsourchickenball = 50, /obj/item/weapon/reagent_containers/food/snacks/chinese/newdles = 50, /obj/item/weapon/reagent_containers/food/snacks/chinese/rice = 50) refill_canister = /obj/item/weapon/vending_refill/chinese @@ -1064,7 +1064,9 @@ /obj/item/clothing/shoes/singerb = 1,/obj/item/clothing/under/singerb = 1, /obj/item/clothing/suit/hooded/carp_costume = 1,/obj/item/clothing/suit/hooded/bee_costume = 1, /obj/item/clothing/suit/snowman = 1,/obj/item/clothing/head/snowman = 1, - /obj/item/clothing/head/cueball = 1,/obj/item/clothing/under/scratch = 1) + /obj/item/clothing/head/cueball = 1,/obj/item/clothing/under/scratch = 1, + /obj/item/clothing/under/victdress = 1, /obj/item/clothing/under/victdress/red = 1, /obj/item/clothing/suit/victcoat = 1, /obj/item/clothing/suit/victcoat/red = 1, + /obj/item/clothing/under/victsuit = 1, /obj/item/clothing/under/victsuit/redblk = 1, /obj/item/clothing/under/victsuit/red = 1, /obj/item/clothing/suit/tailcoat = 1) contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 1, /obj/item/clothing/mask/balaclava=1, /obj/item/clothing/mask/horsehead = 2) premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, /obj/item/weapon/shield/riot/roman = 1) refill_canister = /obj/item/weapon/vending_refill/autodrobe @@ -1276,7 +1278,7 @@ /obj/item/weapon/c_tube = 10,/obj/item/weapon/pen = 5,/obj/item/weapon/pen/blue = 5, /obj/item/weapon/pen/red = 5) contraband = list(/obj/item/toy/crayon/mime = 1,/obj/item/toy/crayon/rainbow = 1) - premium = list(/obj/item/weapon/contraband/poster = 5) + premium = list(/obj/item/weapon/poster/random_contraband = 5) /obj/machinery/vending/crittercare name = "\improper CritterCare" diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index e27a97c796c..c73d72d0c2d 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -172,8 +172,7 @@ H.item_color = wash_color H.name = new_softcap_name H.desc = new_desc - qdel(crayon) - crayon = null + QDEL_NULL(crayon) if( locate(/mob,contents) ) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 77bcc4c1966..ef4330800ed 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -348,7 +348,7 @@ if(heavy_missile) M.heavy_missile = 1 playsound(chassis, fire_sound, 50, 1) - M.throw_at(target, missile_range, missile_speed, chassis) + M.throw_at(target, missile_range, missile_speed) projectiles-- log_message("Fired from [name], targeting [target].") var/turf/T = get_turf(src) diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index 24b6b1822d9..b3e42bb968e 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -33,6 +33,9 @@ component_parts += new /obj/item/weapon/stock_parts/capacitor(null) component_parts += new /obj/item/stack/cable_coil(null, 1) RefreshParts() + update_recharge_turf() + +/obj/machinery/mech_bay_recharge_port/proc/update_recharge_turf() recharging_turf = get_step(loc, dir) /obj/machinery/mech_bay_recharge_port/upgraded/New() @@ -46,7 +49,7 @@ component_parts += new /obj/item/weapon/stock_parts/capacitor/super(null) component_parts += new /obj/item/stack/cable_coil(null, 1) RefreshParts() - recharging_turf = get_step(loc, dir) + update_recharge_turf() /obj/machinery/mech_bay_recharge_port/RefreshParts() var/MC diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 8ff0d7cfcf4..3871517b366 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -5,6 +5,7 @@ var/buckle_lying = -1 //bed-like behaviour, forces mob.lying = buckle_lying if != -1 //except -1 actually means "rotate 90 degrees to the left" as it is used by 1*buckle_lying. var/buckle_requires_restraints = 0 //require people to be handcuffed before being able to buckle. eg: pipes var/mob/living/buckled_mob = null + var/buckle_offset = 0 //Interaction diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index adf46ef47e1..bb1ab0fd8dc 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -31,10 +31,13 @@ /obj/effect/anomaly/proc/anomalyNeutralize() - new /obj/effect/effect/bad_smoke(loc) + var/turf/T = get_turf(src) - for(var/atom/movable/O in src) - O.loc = src.loc + new /obj/effect/effect/bad_smoke(T) + + if(aSignal) + aSignal.forceMove(T) + aSignal = null qdel(src) diff --git a/code/game/objects/effects/decals/Cleanable/aliens.dm b/code/game/objects/effects/decals/Cleanable/aliens.dm index 57a32434af2..a3c2bc2c649 100644 --- a/code/game/objects/effects/decals/Cleanable/aliens.dm +++ b/code/game/objects/effects/decals/Cleanable/aliens.dm @@ -3,6 +3,8 @@ desc = "It's green and acidic. It looks like... blood?" icon = 'icons/effects/blood.dmi' basecolor = "#05EE05" + bloodiness = MAX_SHOE_BLOODINESS + blood_state = BLOOD_STATE_XENO /obj/effect/decal/cleanable/blood/gibs/xeno name = "xeno gibs" diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 37063b8a90b..6840a5d9929 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -15,9 +15,11 @@ var/global/list/image/splatter_cache=list() icon_state = "mfloor1" random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7") var/base_icon = 'icons/effects/blood.dmi' - var/list/viruses = list() + appearance_flags = NO_CLIENT_COLOR blood_DNA = list() - var/basecolor="#A10808" // Color when wet. + var/blood_state = BLOOD_STATE_HUMAN + var/bloodiness = MAX_SHOE_BLOODINESS + var/basecolor = "#A10808" // Color when wet. var/amount = 5 appearance_flags = NO_CLIENT_COLOR var/dry_timer = 0 @@ -33,11 +35,11 @@ var/global/list/image/splatter_cache=list() mode_ticker.bloody_floors += T mode_ticker.bloody_floors[T] = T mode_ticker.blood_check() - if(istype(src, /obj/effect/decal/cleanable/blood/gibs)) + if(type == /obj/effect/decal/cleanable/blood/gibs) return - if(src.type == /obj/effect/decal/cleanable/blood) - if(src.loc && isturf(src.loc)) - for(var/obj/effect/decal/cleanable/blood/B in src.loc) + if(type == /obj/effect/decal/cleanable/blood) + if(loc && isturf(loc)) + for(var/obj/effect/decal/cleanable/blood/B in loc) if(B != src) if(B.blood_DNA) blood_DNA |= B.blood_DNA.Copy() @@ -59,44 +61,6 @@ var/global/list/image/splatter_cache=list() if(basecolor == "rainbow") basecolor = "#[pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))]" color = basecolor -/obj/effect/decal/cleanable/blood/Crossed(mob/living/carbon/human/perp) - if(!istype(perp)) - return - if(amount < 1) - return - - var/obj/item/organ/external/l_foot = perp.get_organ("l_foot") - var/obj/item/organ/external/r_foot = perp.get_organ("r_foot") - var/hasfeet = 1 - if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) - hasfeet = 0 - if(perp.shoes && !perp.buckled)//Adding blood to shoes - var/obj/item/clothing/shoes/S = perp.shoes - if(istype(S)) - S.blood_color = basecolor - S.track_blood = max(amount,S.track_blood) - if(!S.blood_overlay) - S.generate_blood_overlay() - if(!S.blood_DNA) - S.blood_DNA = list() - S.blood_overlay.color = basecolor - S.overlays += S.blood_overlay - if(S.blood_overlay && S.blood_overlay.color != basecolor) - S.blood_overlay.color = basecolor - S.overlays.Cut() - S.overlays += S.blood_overlay - S.blood_DNA |= blood_DNA.Copy() - - else if(hasfeet)//Or feet - perp.feet_blood_color = basecolor - perp.track_blood = max(amount,perp.track_blood) - if(!perp.feet_blood_DNA) - perp.feet_blood_DNA = list() - perp.feet_blood_DNA |= blood_DNA.Copy() - - perp.update_inv_shoes(1) - amount-- - /obj/effect/decal/cleanable/blood/proc/dry() name = dryname desc = drydesc @@ -123,6 +87,46 @@ var/global/list/image/splatter_cache=list() /obj/effect/decal/cleanable/blood/can_bloodcrawl_in() return TRUE +//Add "bloodiness" of this blood's type, to the human's shoes +/obj/effect/decal/cleanable/blood/Crossed(atom/movable/O) + if(ishuman(O)) + var/mob/living/carbon/human/H = O + var/obj/item/organ/external/l_foot = H.get_organ("l_foot") + var/obj/item/organ/external/r_foot = H.get_organ("r_foot") + var/hasfeet = 1 + if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) + hasfeet = 0 + if(H.shoes && blood_state && bloodiness) + var/obj/item/clothing/shoes/S = H.shoes + var/add_blood = 0 + if(bloodiness >= BLOOD_GAIN_PER_STEP) + add_blood = BLOOD_GAIN_PER_STEP + else + add_blood = bloodiness + bloodiness -= add_blood + S.bloody_shoes[blood_state] = min(MAX_SHOE_BLOODINESS, S.bloody_shoes[blood_state] + add_blood) + if(blood_DNA && blood_DNA.len) + S.add_blood(H.blood_DNA, basecolor) + S.blood_state = blood_state + S.blood_color = basecolor + update_icon() + H.update_inv_shoes() + else if(hasfeet && blood_state && bloodiness)//Or feet + var/add_blood = 0 + if(bloodiness >= BLOOD_GAIN_PER_STEP) + add_blood = BLOOD_GAIN_PER_STEP + else + add_blood = bloodiness + bloodiness -= add_blood + H.bloody_feet[blood_state] = min(MAX_SHOE_BLOODINESS, H.bloody_feet[blood_state] + add_blood) + if(!H.feet_blood_DNA) + H.feet_blood_DNA = list() + H.blood_state = blood_state + H.feet_blood_DNA |= blood_DNA.Copy() + H.feet_blood_color = basecolor + update_icon() + H.update_inv_shoes() + /obj/effect/decal/cleanable/blood/splatter random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5") amount = 2 @@ -135,11 +139,25 @@ var/global/list/image/splatter_cache=list() icon_state = "1" random_icon_states = list("1","2","3","4","5") amount = 0 - var/list/drips = list() + var/drips = 1 + bloodiness = 0 -/obj/effect/decal/cleanable/blood/drip/New() - ..() - drips |= icon_state +/obj/effect/decal/cleanable/blood/drip/can_bloodcrawl_in() + return TRUE + +/obj/effect/decal/cleanable/trail_holder //not a child of blood on purpose + name = "blood" + icon_state = "ltrails_1" + desc = "Your instincts say you shouldn't be following these." + gender = PLURAL + density = 0 + layer = 2 + random_icon_states = null + var/list/existing_dirs = list() + blood_DNA = list() + +/obj/effect/decal/cleanable/trail_holder/can_bloodcrawl_in() + return TRUE /obj/effect/decal/cleanable/blood/writing icon_state = "tracks" @@ -176,19 +194,16 @@ var/global/list/image/splatter_cache=list() noclear = 1 /obj/effect/decal/cleanable/blood/gibs/update_icon() - var/image/giblets = new(base_icon, "[icon_state]_flesh", dir) if(!fleshcolor || fleshcolor == "rainbow") fleshcolor = "#[pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))]" giblets.color = fleshcolor - var/icon/blood = new(base_icon,"[icon_state]",dir) - if(basecolor == "rainbow") basecolor = "#[pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))]" - blood.Blend(basecolor,ICON_MULTIPLY) icon = blood overlays.Cut() overlays += giblets + . = ..() /obj/effect/decal/cleanable/blood/gibs/up random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") @@ -223,21 +238,25 @@ var/global/list/image/splatter_cache=list() for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++) sleep(3) if(i > 0) - var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc) + var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(loc) b.basecolor = src.basecolor b.update_icon() - for(var/datum/disease/D in src.viruses) - var/datum/disease/ND = D.Copy(1) - b.viruses += ND - ND.holder = b if(step_to(src, get_step(src, direction), 0)) break /obj/effect/decal/cleanable/blood/old/New() ..() + bloodiness = 0 dry() +/obj/effect/decal/cleanable/blood/old/can_bloodcrawl_in() + return FALSE + /obj/effect/decal/cleanable/blood/gibs/old/New() ..() + bloodiness = 0 dry() + +/obj/effect/decal/cleanable/blood/gibs/old/can_bloodcrawl_in() + return FALSE diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm index 5fc09b6ec34..dbebd72066d 100644 --- a/code/game/objects/effects/decals/Cleanable/robots.dm +++ b/code/game/objects/effects/decals/Cleanable/robots.dm @@ -5,13 +5,17 @@ icon_state = "gib1" basecolor="#030303" random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7") + bloodiness = MAX_SHOE_BLOODINESS + +/obj/effect/decal/cleanable/blood/gibs/robot/can_bloodcrawl_in() + return FALSE /obj/effect/decal/cleanable/blood/gibs/robot/update_icon() color = "#FFFFFF" /obj/effect/decal/cleanable/blood/gibs/robot/dry() //pieces of robots do not dry up like return - + /obj/effect/decal/cleanable/blood/gibs/robot/can_bloodcrawl_in() return FALSE @@ -44,6 +48,7 @@ name = "motor oil" desc = "It's black and greasy. Looks like Beepsky made another mess." basecolor="#030303" + bloodiness = MAX_SHOE_BLOODINESS /obj/effect/decal/cleanable/blood/oil/can_bloodcrawl_in() return FALSE diff --git a/code/game/objects/effects/decals/Cleanable/tracks.dm b/code/game/objects/effects/decals/Cleanable/tracks.dm index ad404ce28b3..20dee798e8d 100644 --- a/code/game/objects/effects/decals/Cleanable/tracks.dm +++ b/code/game/objects/effects/decals/Cleanable/tracks.dm @@ -1,165 +1,104 @@ -// Stolen en masse from N3X15 of /vg/station with much gratitude. - -// The idea is to have 4 bits for coming and 4 for going. -#define TRACKS_COMING_NORTH 1 -#define TRACKS_COMING_SOUTH 2 -#define TRACKS_COMING_EAST 4 -#define TRACKS_COMING_WEST 8 -#define TRACKS_GOING_NORTH 16 -#define TRACKS_GOING_SOUTH 32 -#define TRACKS_GOING_EAST 64 -#define TRACKS_GOING_WEST 128 - // 5 seconds #define TRACKS_CRUSTIFY_TIME 50 // color-dir-dry var/global/list/image/fluidtrack_cache=list() -/datum/fluidtrack - var/direction=0 - var/basecolor="#A10808" - var/wet=0 - var/fresh=1 - var/crusty=0 - var/image/overlay - - New(_direction,item_color,_wet) - src.direction=_direction - src.basecolor=item_color - src.wet=_wet - // Footprints, tire trails... /obj/effect/decal/cleanable/blood/tracks - amount = 0 - random_icon_states = null - var/dirs=0 icon = 'icons/effects/fluidtracks.dmi' - icon_state = "" - var/coming_state="blood1" - var/going_state="blood2" - var/updatedtracks=0 - - // dir = id in stack - var/list/setdirs=list( - "1"=0, - "2"=0, - "4"=0, - "8"=0, - "16"=0, - "32"=0, - "64"=0, - "128"=0 - ) - - // List of laid tracks and their colors. - var/list/datum/fluidtrack/stack=list() - - /** - * Add tracks to an existing trail. - * - * @param DNA bloodDNA to add to collection. - * @param comingdir Direction tracks come from, or 0. - * @param goingdir Direction tracks are going to (or 0). - * @param bloodcolor Color of the blood when wet. - */ - proc/AddTracks(var/list/DNA, var/comingdir, var/goingdir, var/bloodcolor="#A10808") - var/updated=0 - // Shift our goingdir 4 spaces to the left so it's in the GOING bitblock. - var/realgoing=goingdir<<4 - - // Current bit - var/b=0 - - // When tracks will start to dry out - var/t=world.time + TRACKS_CRUSTIFY_TIME - - var/datum/fluidtrack/track - - // Process 4 bits - for(var/bi=0;bi<4;bi++) - b = 1 << bi - // COMING BIT - // If setting - if(comingdir&b) - // If not wet or not set - if(dirs&b) - var/sid=setdirs["[b]"] - track=stack[sid] - if(track.wet==t && track.basecolor==bloodcolor) - continue - // Remove existing stack entry - stack.Remove(track) - track=new /datum/fluidtrack(b,bloodcolor,t) - stack.Add(track) - setdirs["[b]"]=stack.Find(track) - updatedtracks |= b - updated=1 - - // GOING BIT (shift up 4) - b=b<<4 - if(realgoing&b) - // If not wet or not set - if(dirs&b) - var/sid=setdirs["[b]"] - track=stack[sid] - if(track.wet==t && track.basecolor==bloodcolor) - continue - // Remove existing stack entry - stack.Remove(track) - track=new /datum/fluidtrack(b,bloodcolor,t) - stack.Add(track) - setdirs["[b]"]=stack.Find(track) - updatedtracks |= b - updated=1 - - dirs |= comingdir|realgoing - blood_DNA |= DNA.Copy() - if(updated) - update_icon() - - update_icon() - overlays.Cut() - color = "#FFFFFF" - var/truedir=0 - - // Update ONLY the overlays that have changed. - for(var/datum/fluidtrack/track in stack) - var/stack_idx=setdirs["[track.direction]"] - var/state=coming_state - truedir=track.direction - if(truedir&240) // Check if we're in the GOING block - state=going_state - truedir=truedir>>4 - - if(track.overlay) - track.overlay=null - var/image/I = image(icon, icon_state=state, dir=num2dir(truedir)) - I.color = track.basecolor - - track.fresh=0 - track.overlay=I - stack[stack_idx]=track - overlays += I - updatedtracks=0 // Clear our memory of updated tracks. - -/obj/effect/decal/cleanable/blood/tracks/footprints - name = "wet footprints" - dryname = "dried footprints" - desc = "Whoops..." - drydesc = "Whoops..." - coming_state = "human1" - going_state = "human2" - amount = 0 - -/obj/effect/decal/cleanable/blood/tracks/wheels name = "wet tracks" dryname = "dried tracks" desc = "Whoops..." drydesc = "Whoops..." - coming_state = "wheels1" - going_state = "wheels2" - desc = "They look like tracks left by wheels." + icon_state = "wheels1" gender = PLURAL random_icon_states = null - amount = 0 \ No newline at end of file + amount = 0 + +//BLOODY FOOTPRINTS +/obj/effect/decal/cleanable/blood/footprints + icon = 'icons/effects/fluidtracks.dmi' + icon_state = "nothingwhatsoever" + desc = "You REALLY shouldn't follow these.." + gender = PLURAL + random_icon_states = null + basecolor="#A10808" + var/entered_dirs = 0 + var/exited_dirs = 0 + blood_state = BLOOD_STATE_HUMAN //the icon state to load images from + + +/obj/effect/decal/cleanable/blood/footprints/Crossed(atom/movable/O) + if(ishuman(O)) + var/mob/living/carbon/human/H = O + var/obj/item/clothing/shoes/S = H.shoes + var/obj/item/organ/external/l_foot = H.get_organ("l_foot") + var/obj/item/organ/external/r_foot = H.get_organ("r_foot") + var/hasfeet = 1 + if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) + hasfeet = 0 + if(S && S.bloody_shoes[blood_state] && S.blood_color == basecolor) + S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0) + entered_dirs |= H.dir + if(!S.blood_DNA) + S.blood_DNA = list() + S.blood_DNA |= blood_DNA.Copy() + else if(hasfeet && H.bloody_feet[blood_state] && H.feet_blood_color == basecolor)//Or feet //This will need to be changed. + H.bloody_feet[blood_state] = max(H.bloody_feet[blood_state] - BLOOD_LOSS_PER_STEP, 0) + entered_dirs |= H.dir + if(!H.feet_blood_DNA) + H.feet_blood_DNA = list() + H.feet_blood_DNA |= blood_DNA.Copy() + update_icon() + +/obj/effect/decal/cleanable/blood/footprints/Uncrossed(atom/movable/O) + if(ishuman(O)) + var/mob/living/carbon/human/H = O + var/obj/item/clothing/shoes/S = H.shoes + var/obj/item/organ/external/l_foot = H.get_organ("l_foot") + var/obj/item/organ/external/r_foot = H.get_organ("r_foot") + var/hasfeet = 1 + if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) + hasfeet = 0 + if(S && S.bloody_shoes[blood_state] && S.blood_color == basecolor) + S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0) + exited_dirs |= H.dir + if(!S.blood_DNA) + S.blood_DNA = list() + S.blood_DNA |= blood_DNA.Copy() + else if(hasfeet && H.bloody_feet[blood_state] && H.feet_blood_color == basecolor)//Or feet + H.bloody_feet[blood_state] = max(H.bloody_feet[blood_state] - BLOOD_LOSS_PER_STEP, 0) + exited_dirs |= H.dir + if(!H.feet_blood_DNA) + H.feet_blood_DNA = list() + H.feet_blood_DNA |= blood_DNA.Copy() + update_icon() + + +/obj/effect/decal/cleanable/blood/footprints/update_icon() + overlays.Cut() + + for(var/Ddir in cardinal) + if(entered_dirs & Ddir) + var/image/I + if(fluidtrack_cache["entered-[blood_state]-[Ddir]"]) + I = fluidtrack_cache["entered-[blood_state]-[Ddir]"] + else + I = image(icon,"[blood_state]1",dir = Ddir) + fluidtrack_cache["entered-[blood_state]-[Ddir]"] = I + if(I) + I.color = basecolor + overlays += I + if(exited_dirs & Ddir) + var/image/I + if(fluidtrack_cache["exited-[blood_state]-[Ddir]"]) + I = fluidtrack_cache["exited-[blood_state]-[Ddir]"] + else + I = image(icon,"[blood_state]2",dir = Ddir) + fluidtrack_cache["exited-[blood_state]-[Ddir]"] = I + if(I) + I.color = basecolor + overlays += I + + alpha = BLOODY_FOOTPRINT_BASE_ALPHA+bloodiness \ No newline at end of file diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index cfde9ab55a4..f2a936eca57 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -43,4 +43,4 @@ if(reagents) reagents.chem_temp += 30 reagents.handle_reactions() - ..() \ No newline at end of file + ..() diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index 1ab2cd985cf..d825a7a9146 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -1,335 +1,92 @@ -//########################## CONTRABAND ;3333333333333333333 -Agouri ################################################### +// This is synced up to the poster placing animation. +#define PLACE_SPEED 30 -#define NUM_OF_POSTER_DESIGNS 33 //subtype 0-contraband posters +// The poster item -#define NUM_OF_POSTER_DESIGNS_LEGIT 40 //subtype 1-corporate approved posters - -/obj/item/weapon/contraband - name = "contraband item" - desc = "You probably shouldn't be holding this." - icon = 'icons/obj/contraband.dmi' - force = 0 - - -/obj/item/weapon/contraband/poster +/obj/item/weapon/poster name = "rolled-up poster" desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as contraband aboard Nanotrasen space facilities." - icon_state = "rolled_poster" - var/serial_number = 0 - var/obj/structure/sign/poster/resulting_poster = null //The poster that will be created is initialised and stored through contraband/poster's constructor - var/subtype = 0 + icon = 'icons/obj/contraband.dmi' + force = 0 burn_state = FLAMMABLE + var/poster_type + var/obj/structure/sign/poster/poster_structure +/obj/item/weapon/poster/New(loc, obj/structure/sign/poster/new_poster_structure) + ..() + poster_structure = new_poster_structure + if(!new_poster_structure && poster_type) + poster_structure = new poster_type(src) -/obj/item/weapon/contraband/poster/New(turf/loc, given_serial = 0) - if(given_serial == 0) - if(subtype == 0) - serial_number = rand(1, NUM_OF_POSTER_DESIGNS) - resulting_poster = new(serial_number,subtype) - if(subtype == 1) - serial_number = rand(1, NUM_OF_POSTER_DESIGNS_LEGIT) - resulting_poster = new(serial_number,subtype) - else - serial_number = given_serial - //We don't give it a resulting_poster because if we called it with a given_serial it means that we're rerolling an already used poster. - name += " - No. [serial_number]" - ..(loc) + // posters store what name and description they would like their rolled up form to take. + if(poster_structure) + name = poster_structure.poster_item_name + desc = poster_structure.poster_item_desc + icon_state = poster_structure.poster_item_icon_state + name = "[name] - [poster_structure.original_name]" -/*/obj/item/weapon/contraband/poster/attack(mob/M as mob, mob/user as mob) - src.add_fingerprint(user) - if(resulting_poster) - resulting_poster.add_fingerprint(user) - ..()*/ +/obj/item/weapon/poster/Destroy() + poster_structure = null + . = ..() -/*/obj/item/weapon/contraband/poster/attack(atom/A, mob/user as mob) //This shit is handled through the wall's attackby() - if(istype(A, /turf/simulated/wall)) - if(resulting_poster == null) - return - else - var/turf/simulated/wall/W = A - var/check = 0 - var/stuff_on_wall = 0 - for(var/obj/O in W.contents) //Let's see if it already has a poster on it or too much stuff - if(istype(O,/obj/structure/sign/poster)) - check = 1 - break - stuff_on_wall++ - if(stuff_on_wall == 3) - check = 1 - break - - if(check) - to_chat(user, "The wall is far too cluttered to place a poster!") - return - - resulting_poster.loc = W //Looks like it's uncluttered enough. Place the poster - W.contents += resulting_poster - - qdel(src)*/ +// These icon_states may be overriden, but are for mapper's convinence +/obj/item/weapon/poster/random_contraband + name = "random contraband poster" + poster_type = /obj/structure/sign/poster/contraband/random + icon_state = "rolled_poster" +/obj/item/weapon/poster/random_official + name = "random official poster" + poster_type = /obj/structure/sign/poster/official/random + icon_state = "rolled_poster_legit" //############################## THE ACTUAL DECALS ########################### -obj/structure/sign/poster +/obj/structure/sign/poster name = "poster" desc = "A large piece of space-resistant printed paper." icon = 'icons/obj/contraband.dmi' - anchored = 1 - var/serial_number //Will hold the value of src.loc if nobody initialises it - var/ruined = 0 - var/subtype = 0 + anchored = TRUE + var/original_name + var/random_basetype + var/ruined = FALSE + var/never_random = FALSE // used for the 'random' subclasses. -obj/structure/sign/poster/legit // For mappers looking to pre-spawn NT approved posters. - subtype = 1 + var/poster_item_name = "hypothetical poster" + var/poster_item_desc = "This hypothetical poster item should not exist, let's be honest here." + var/poster_item_icon_state = "rolled_poster" -obj/structure/sign/poster/New(serial,var/subtypeIn = -1) - serial_number = serial - if(subtypeIn != -1) - subtype = subtypeIn - - if(serial_number == loc) - if(subtype == 0) - serial_number = rand(1, NUM_OF_POSTER_DESIGNS) //This is for the mappers that want individual posters without having to use rolled posters. - if(subtype == 1) - serial_number = rand(1, NUM_OF_POSTER_DESIGNS_LEGIT) - if(subtype == 0) - icon_state = "poster[serial_number]" - switch(serial_number) - if(1) - name += " - Free Tonto" - desc += " A framed shred of a much larger flag, colors bled together and faded from age." - if(2) - name += " - Atmosia Declaration of Independence" - desc += " A relic of a failed rebellion." - if(3) - name += " - Fun Police" - desc += " A poster condemning the station's security forces." - if(4) - name += " - Lusty Xeno" - desc += " A heretical poster depicting the titular star of an equally heretical book." - if(5) - name += " - Syndicate Recruitment Poster" - desc += " See the galaxy! Shatter corrupt megacorporations! Join today!" - if(6) - name += " - Clown" - desc += " Honk." - if(7) - name += " - Smoke" - desc += " A poster depicting a carton of cigarettes." - if(8) - name += " - Grey Tide" - desc += " A rebellious poster symbolizing assistant solidarity." - if(9) - name += " - Missing Gloves" - desc += " This poster is about the uproar that followed Nanotrasen's financial cuts towards insulated-glove purchases." - if(10) - name += " - Hacking Guide" - desc += " This poster details the internal workings of the common Nanotrasen airlock." - if(11) - name += " - RIP Badger" - desc += " This poster commemorates the day hundreds of badgers worldwide were sacrificed for the greater good." - if(12) - name += " - Ambrosia Vulgaris" - desc += " This poster is lookin' pretty trippy man." - if(13) - name += " - Donut Corp." - desc += " This poster is an advertisement for Donut Corp." - if(14) - name += " - EAT" - desc += " This poster is advising that you eat." - if(15) - name += " - Tools" - desc += " This poster is an advertisement for tools." - if(16) - name += " - Power" - desc += " A poster all about power." - if(17) - name += " - Power to the People" - desc += " Screw those EDF guys!" - if(18) - name += " - Communist state" - desc += " All hail the Communist party!" - if(19) - name += " - Lamarr" - desc += " This poster depicts Lamarr. Probably made by the Research Director." - if(20) - name += " - Borg Fancy" - desc += " Being fancy can be for any borg, just need a suit." - if(21) - name += " - Borg Fancy v2" - desc += " Borg Fancy, Now only taking the most fancy." - if(22) - name += " - Kosmicheskaya Stantsiya 13 Does Not Exist" - desc += " A poster denying the existence of the derelict station near [station_name()]." - if(23) - name += " - Rebels Unite!" - desc += " A poster telling the viewer to rebel against Nanotrasen." - if(24) - name += " - C-20r Advertisement" - desc += " A poster advertising the Scarborough Arms C-20r." - if(25) - name += " - Have A Puff" - desc += " Who cares about lung cancer when you're high as a kite?" - if(26) - name += " - Revolver Advertisement" - desc += " Because seven shots are all you need." - if(27) - name += " - D-Day Promotional Poster" - desc += " A promotional poster for some rapper." - if(28) - name += " - Syndicate Pistol Advertisement" - desc += " A poster advertising Syndicate pistols as being 'Classy as fuck'." - if(29) - name += " - E-sword Rainbow" - desc += " All the colors of bloody murder rainbow." - if(30) - name += " - Red Rum" - desc += " Looking at this poster makes you want to kill." - if(31) - name += " - CC 64K Advertisement" - desc += " The latest portable computer from Comrade Computing, with a whole 64kB of ram!" - if(32) - name += " - Punch Shit" - desc += " Fight things for no reason, like a man!" - if(33) - name += " - The Griffin" - desc += " The Griffin commands you to be the worst you can be. Will you?" - else - name += " - Error (subtype 0 serial_number)" - desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/ParadiseSS13/Paradise/issues." - - if(subtype == 1) - icon_state = "poster[serial_number]_legit" - switch(serial_number) - if(1) - name += " - Here for Your Safety" - desc += " A poster glorifying the station's security force." - if(2) - name += " - Nanotrasen Logo" - desc += " A poster depicting the logo of Nanotrasen." - if(3) - name += " - Cleanliness" - desc += " A poster warning of the dangers of poor hygiene." - if(4) - name += " - Help Others" - desc += " A poster encouraging you to help fellow crewmembers." - if(5) - name += " - Build" - desc += " A poster glorifying the engineering team." - if(6) - name += " - Bless This Spess" - desc += " A poster blessing this area." - if(7) - name += " - Science" - desc += " A poster depicting an atom." - if(8) - name += " - Ian" - desc += " Arf Arf." - if(9) - name += " - Obey" - desc += " A poster instructing the viewer to obey authority." - if(10) - name += " - Walk" - desc += " A poster instructing the viewer to walk instead of running." - if(11) - name += " - State Laws" - desc += " A poster instructing cyborgs to state their laws." - if(12) - name += " - Love Ian" - desc += " Ian is love, Ian is life." - if(13) - name += " - Space Cops" - desc += " A poster advertising the television show Space Cops." - if(14) - name += " - Ue No" - desc += " This thing is all in Japanese." - if(15) - name += " - Get Your LEGS" - desc += " LEGS: Leadership, Experience, Genius, S(Opportunity)." - if(16) - name += " - Do Not Question" - desc += " A poster instructing the viewer not to ask about things they aren't meant to know." - if(17) - name += " - Work for a Future" - desc += " A poster encouraging you to work for your future, what it is, no one is really sure." - if(18) - name += " - Soft Cap Pop Art" - desc += " A poster reprint of some cheap pop art." - if(19) - name += " - Safety: Internals" - desc += " A poster instructing the viewer to wear internals in environments where there is no oxygen or the air has been rendered toxic." - if(20) - name += " - Safety: Eye Protection" - desc += " A poster instructing the viewer to wear eye protection when dealing with chemicals, smoke, or bright lights." - if(21) - name += " - Safety: Report" - desc += " A poster instructing the viewer to report suspicious activity to the security force." - if(22) - name += " - Report Crimes" - desc += " Report crimes at: 1-800-FUCKING-TERRORISTS or at https://www.sectorthirteen.nt/malcontents." - if(23) - name += " - Ion Rifle" - desc += " A poster displaying an Ion Rifle." - if(24) - name += " - Foam Force Advertisement" - desc += " Foam Force, it's Foam or be Foamed!" - if(25) - name += " - Cohiba Robusto Advertisement" - desc += " Cohiba Robusto, the classy cigar." - if(26) - name += " - 50th Anniversary Vintage Reprint" - desc += " A reprint of a poster from 2504, commemorating the 50th Anniversary of Nanoposters Manufacturing, a subsidiary of Nanotrasen." - if(27) - name += " - Fruit Bowl" - desc += " Simple, yet awe inspiring." - if(28) - name += " - NanoPDA 1000 Advertisement" - desc += " A poster advertising the latest PDA from Nanotrasen." - if(29) - name += " - Enlist" - desc += " Enlist in the Nanotrasen ERT reserves today!" - if(30) - name += " - Nanomichi Advertisement" - desc += " A poster advertising Nanomichi brand audio cassettes." - if(31) - name += " - 12 Gauge" - desc += " A poster boasting about the superiority of 12-gauge shotgun shells." - if(32) - name += " - High-Class Martini" - desc += " I told you to shake it, no stirring." - if(33) - name += " - The Owl" - desc += " The Owl would do his best to protect the station. Will you?" - if(34) - name += " - Spider Risk" - desc += " A poster detailing what to do when giant spiders are seen." - if(35) - name += " - Kill Syndicate" - desc += " A poster demanding that all crew should be ready to fight the Syndicate." - if(36) - name += " - Information on Air" - desc += " A poster providing visual aid to remind crew of air canisters." - if(37) - name += " - Information on Air" - desc += " A poster providing visual aid to remind crew of air canisters." - if(38) - name += " - Dig for Glory!" - desc += " A poster providing trying to convince crew to mine for ore." - if(39) - name += " - Religious Poster" - desc += " A generic religious poser telling you to believe." - if(40) - name += " - Stay Healthy!" - desc += " A healthy crew is a happy crew!" - else - name += " - Error (subtype 1 serial_number)" - desc += " This is a bug, please report the circumstances under which you encountered this poster at https://github.com/ParadiseSS13/Paradise/issues." +/obj/structure/sign/poster/New() ..() + if(random_basetype) + randomise(random_basetype) + if(!ruined) + original_name = name + name = "poster - [name]" + desc = "A large piece of space-resistant printed paper. [desc]" -obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/wirecutters)) +/obj/structure/sign/poster/proc/randomise(base_type) + var/list/poster_types = subtypesof(base_type) + var/list/approved_types = list() + for(var/t in poster_types) + var/obj/structure/sign/poster/T = t + if(initial(T.icon_state) && !initial(T.never_random)) + approved_types |= T + + var/obj/structure/sign/poster/selected = pick(approved_types) + + name = initial(selected.name) + desc = initial(selected.desc) + icon_state = initial(selected.icon_state) + poster_item_name = initial(selected.poster_item_name) + poster_item_desc = initial(selected.poster_item_desc) + poster_item_icon_state = initial(selected.poster_item_icon_state) + ruined = initial(selected.ruined) + +/obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) + if(iswirecutter(I)) playsound(loc, I.usesound, 100, 1) if(ruined) to_chat(user, "You remove the remnants of the poster.") @@ -337,45 +94,33 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) else to_chat(user, "You carefully remove the poster from the wall.") roll_and_drop(user.loc) - return - /obj/structure/sign/poster/attack_hand(mob/user) if(ruined) return - var/temp_loc = user.loc - switch(alert("Do I want to rip the poster from the wall?","You think...","Yes","No")) - if("Yes") - if( user.loc != temp_loc || ruined ) - return - visible_message("[user] rips [src] in a single, decisive motion!" ) - playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, 1) - ruined = 1 - icon_state = "poster_ripped" - name = "ripped poster" - desc = "You can't make out anything from the poster's original print. It's ruined." - add_fingerprint(user) - if("No") - return + visible_message("[user] rips [src] in a single, decisive motion!" ) + playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, 1) -/obj/structure/sign/poster/proc/roll_and_drop(turf/location) - var/obj/item/weapon/contraband/poster/P - if(subtype == 1) - P = new/obj/item/weapon/contraband/poster/legit/(src, serial_number) - else - P = new(src, serial_number) - P.resulting_poster = src - P.loc = location - loc = P + var/obj/structure/sign/poster/ripped/R = new(loc) + R.pixel_y = pixel_y + R.pixel_x = pixel_x + R.add_fingerprint(user) + qdel(src) +/obj/structure/sign/poster/proc/roll_and_drop(loc) + pixel_x = 0 + pixel_y = 0 + var/obj/item/weapon/poster/P = new(loc, src) + forceMove(P) + return P //seperated to reduce code duplication. Moved here for ease of reference and to unclutter r_wall/attackby() -/turf/simulated/wall/proc/place_poster(obj/item/weapon/contraband/poster/P, mob/user) - if(!P.resulting_poster) return - +/turf/simulated/wall/proc/place_poster(obj/item/weapon/poster/P, mob/user) + if(!P.poster_structure) + return var/stuff_on_wall = 0 - for(var/obj/O in user.loc.contents) //Let's see if it already has a poster on it or too much stuff - if(istype(O,/obj/structure/sign)) + for(var/obj/O in contents) //Let's see if it already has a poster on it or too much stuff + if(istype(O, /obj/structure/sign/poster)) to_chat(user, "The wall is far too cluttered to place a poster!") return stuff_on_wall++ @@ -385,9 +130,7 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) to_chat(user, "You start placing the poster on the wall...")//Looks like it's uncluttered enough. Place the poster. - - //declaring D because otherwise if P gets 'deconstructed' we lose our reference to P.resulting_poster - var/obj/structure/sign/poster/D = P.resulting_poster + var/obj/structure/sign/poster/D = P.poster_structure var/temp_loc = user.loc @@ -408,24 +151,422 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) to_chat(user, "You cannot reach the wall from here!") return - flick("poster_being_set",D) - D.loc = temp_loc - + flick("poster_being_set", D) + D.forceMove(temp_loc) qdel(P) //delete it now to cut down on sanity checks afterwards. Agouri's code supports rerolling it anyway playsound(D.loc, 'sound/items/poster_being_created.ogg', 100, 1) - sleep(17) - if(!D) return + if(do_after(user, PLACE_SPEED, target = src)) + if(!D || qdeleted(D)) + return - if(istype(src,/turf/simulated/wall) && user && user.loc == temp_loc) //Let's check if everything is still there - to_chat(user, "You place the poster!") - else - D.roll_and_drop(temp_loc) - return + if(iswallturf(src) && user && user.loc == temp_loc) //Let's check if everything is still there + to_chat(user, "You place the poster!") + return -//Putting non-contraband posters here because everything else here is related to posters anyway. -JS + to_chat(user, "The poster falls down!") + D.roll_and_drop(temp_loc) -/obj/item/weapon/contraband/poster/legit - desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. It's contents go through Nanotrasen's strict content guidelines." - icon_state = "rolled_poster_legit" - subtype = 1 \ No newline at end of file + +////////////////////////////////POSTER VARIATIONS//////////////////////////////// + +/obj/structure/sign/poster/ripped + ruined = TRUE + icon_state = "poster_ripped" + name = "ripped poster" + desc = "You can't make out anything from the poster's original print. It's ruined." + +/obj/structure/sign/poster/random + name = "random poster" // could even be ripped + icon_state = "random_anything" + never_random = TRUE + random_basetype = /obj/structure/sign/poster + +/obj/structure/sign/poster/contraband + poster_item_name = "contraband poster" + poster_item_desc = "This poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as contraband aboard Nanotrasen space facilities." + poster_item_icon_state = "rolled_poster" + +/obj/structure/sign/poster/contraband/random + name = "random contraband poster" + icon_state = "random_contraband" + never_random = TRUE + random_basetype = /obj/structure/sign/poster/contraband + +/obj/structure/sign/poster/contraband/free_tonto + name = "Free Tonto" + desc = "A salvaged shred of a much larger flag, colors bled together and faded from age." + icon_state = "poster1" + +/obj/structure/sign/poster/contraband/atmosia_independence + name = "Atmosia Declaration of Independence" + desc = "A relic of a failed rebellion." + icon_state = "poster2" + +/obj/structure/sign/poster/contraband/fun_police + name = "Fun Police" + desc = "A poster condemning the station's security forces." + icon_state = "poster3" + +/obj/structure/sign/poster/contraband/lusty_xenomorph + name = "Lusty Xenomorph" + desc = "A heretical poster depicting the titular star of an equally heretical book." + icon_state = "poster4" + +/obj/structure/sign/poster/contraband/syndicate_recruitment + name = "Syndicate Recruitment" + desc = "See the galaxy! Shatter corrupt megacorporations! Join today!" + icon_state = "poster5" + +/obj/structure/sign/poster/contraband/clown + name = "Clown" + desc = "Honk." + icon_state = "poster6" + +/obj/structure/sign/poster/contraband/smoke + name = "Smoke" + desc = "A poster advertising a rival corporate brand of cigarettes." + icon_state = "poster7" + +/obj/structure/sign/poster/contraband/grey_tide + name = "Grey Tide" + desc = "A rebellious poster symbolizing assistant solidarity." + icon_state = "poster8" + +/obj/structure/sign/poster/contraband/missing_gloves + name = "Missing Gloves" + desc = "This poster references the uproar that followed Nanotrasen's financial cuts toward insulated-glove purchases." + icon_state = "poster9" + +/obj/structure/sign/poster/contraband/hacking_guide + name = "Hacking Guide" + desc = "This poster details the internal workings of the common Nanotrasen airlock. Sadly, it appears out of date." + icon_state = "poster10" + +/obj/structure/sign/poster/contraband/rip_badger + name = "RIP Badger" + desc = "This seditious poster references Nanotrasen's genocide of a space station full of badgers." + icon_state = "poster11" + +/obj/structure/sign/poster/contraband/ambrosia_vulgaris + name = "Ambrosia Vulgaris" + desc = "This poster is lookin' pretty trippy man." + icon_state = "poster12" + +/obj/structure/sign/poster/contraband/donut_corp + name = "Donut Corp." + desc = "This poster is an unauthorized advertisement for Donut Corp." + icon_state = "poster13" + +/obj/structure/sign/poster/contraband/eat + name = "EAT." + desc = "This poster promotes rank gluttony." + icon_state = "poster14" + +/obj/structure/sign/poster/contraband/tools + name = "Tools" + desc = "This poster looks like an advertisement for tools, but is in fact a subliminal jab at the tools at CentComm." + icon_state = "poster15" + +/obj/structure/sign/poster/contraband/power + name = "Power" + desc = "A poster that positions the seat of power outside Nanotrasen." + icon_state = "poster16" + +/obj/structure/sign/poster/contraband/power_people + name = "Power to the people" + desc = "Screw those EDF guys!" + icon_state = "poster17" + +/obj/structure/sign/poster/contraband/communist_state + name = "Communist State" + desc = "All hail the Communist party!" + icon_state = "poster18" + +/obj/structure/sign/poster/contraband/lamarr + name = "Lamarr" + desc = "This poster depicts Lamarr. Probably made by a traitorous Research Director." + icon_state = "poster19" + +/obj/structure/sign/poster/contraband/borg_fancy_1 + name = "Borg Fancy" + desc = "Being fancy can be for any borg, just need a suit." + icon_state = "poster20" + +/obj/structure/sign/poster/contraband/borg_fancy_2 + name = "Borg Fancy v2" + desc = "Borg Fancy, Now only taking the most fancy." + icon_state = "poster21" + +/obj/structure/sign/poster/contraband/kss13 + name = "Kosmicheskaya Stantsiya 13 Does Not Exist" + desc = "A poster mocking CentComm's denial of the existence of the derelict station near Space Station 13." + icon_state = "poster22" + +/obj/structure/sign/poster/contraband/rebels_unite + name = "Rebels Unite" + desc = "A poster urging the viewer to rebel against Nanotrasen." + icon_state = "poster23" + +/obj/structure/sign/poster/contraband/c20r + name = "C-20r" + desc = "A poster advertising the Scarborough Arms C-20r." + icon_state = "poster24" + +/obj/structure/sign/poster/contraband/have_a_puff + name = "Have a Puff" + desc = "Who cares about lung cancer when you're high as a kite?" + icon_state = "poster25" + +/obj/structure/sign/poster/contraband/revolver + name = "Revolver" + desc = "Because seven shots are all you need." + icon_state = "poster26" + +/obj/structure/sign/poster/contraband/d_day_promo + name = "D-Day Promo" + desc = "A promotional poster for some rapper." + icon_state = "poster27" + +/obj/structure/sign/poster/contraband/syndicate_pistol + name = "Syndicate Pistol" + desc = "A poster advertising syndicate pistols as being 'classy as fuck'. It is covered in faded gang tags." + icon_state = "poster28" + +/obj/structure/sign/poster/contraband/energy_swords + name = "Energy Swords" + desc = "All the colors of the bloody murder rainbow." + icon_state = "poster29" + +/obj/structure/sign/poster/contraband/red_rum + name = "Red Rum" + desc = "Looking at this poster makes you want to kill." + icon_state = "poster30" + +/obj/structure/sign/poster/contraband/cc64k_ad + name = "CC 64K Ad" + desc = "The latest portable computer from Comrade Computing, with a whole 64kB of ram!" + icon_state = "poster31" + +/obj/structure/sign/poster/contraband/punch_shit + name = "Punch Shit" + desc = "Fight things for no reason, like a man!" + icon_state = "poster32" + +/obj/structure/sign/poster/contraband/the_griffin + name = "The Griffin" + desc = "The Griffin commands you to be the worst you can be. Will you?" + icon_state = "poster33" + +/obj/structure/sign/poster/official + poster_item_name = "motivational poster" + poster_item_desc = "An official Nanotrasen-issued poster to foster a compliant and obedient workforce. It comes with state-of-the-art adhesive backing, for easy pinning to any vertical surface." + poster_item_icon_state = "rolled_poster_legit" + +/obj/structure/sign/poster/official/random + name = "random official poster" + random_basetype = /obj/structure/sign/poster/official + icon_state = "random_official" + never_random = TRUE + +/obj/structure/sign/poster/official/here_for_your_safety + name = "Here For Your Safety" + desc = "A poster glorifying the station's security force." + icon_state = "poster1_legit" + +/obj/structure/sign/poster/official/nanotrasen_logo + name = "Nanotrasen Logo" + desc = "A poster depicting the Nanotrasen logo." + icon_state = "poster2_legit" + +/obj/structure/sign/poster/official/cleanliness + name = "Cleanliness" + desc = "A poster warning of the dangers of poor hygiene." + icon_state = "poster3_legit" + +/obj/structure/sign/poster/official/help_others + name = "Help Others" + desc = "A poster encouraging you to help fellow crewmembers." + icon_state = "poster4_legit" + +/obj/structure/sign/poster/official/build + name = "Build" + desc = "A poster glorifying the engineering team." + icon_state = "poster5_legit" + +/obj/structure/sign/poster/official/bless_this_spess + name = "Bless This Spess" + desc = "A poster blessing this area." + icon_state = "poster6_legit" + +/obj/structure/sign/poster/official/science + name = "Science" + desc = "A poster depicting an atom." + icon_state = "poster7_legit" + +/obj/structure/sign/poster/official/ian + name = "Ian" + desc = "Arf arf. Yap." + icon_state = "poster8_legit" + +/obj/structure/sign/poster/official/obey + name = "Obey" + desc = "A poster instructing the viewer to obey authority." + icon_state = "poster9_legit" + +/obj/structure/sign/poster/official/walk + name = "Walk" + desc = "A poster instructing the viewer to walk instead of running." + icon_state = "poster10_legit" + +/obj/structure/sign/poster/official/state_laws + name = "State Laws" + desc = "A poster instructing cyborgs to state their laws." + icon_state = "poster11_legit" + +/obj/structure/sign/poster/official/love_ian + name = "Love Ian" + desc = "Ian is love, Ian is life." + icon_state = "poster12_legit" + +/obj/structure/sign/poster/official/space_cops + name = "Space Cops." + desc = "A poster advertising the television show Space Cops." + icon_state = "poster13_legit" + +/obj/structure/sign/poster/official/ue_no + name = "Ue No." + desc = "This thing is all in Japanese." + icon_state = "poster14_legit" + +/obj/structure/sign/poster/official/get_your_legs + name = "Get Your LEGS" + desc = "LEGS: Leadership, Experience, Genius, Subordination." + icon_state = "poster15_legit" + +/obj/structure/sign/poster/official/do_not_question + name = "Do Not Question" + desc = "A poster instructing the viewer not to ask about things they aren't meant to know." + icon_state = "poster16_legit" + +/obj/structure/sign/poster/official/work_for_a_future + name = "Work For A Future" + desc = " A poster encouraging you to work for your future." + icon_state = "poster17_legit" + +/obj/structure/sign/poster/official/soft_cap_pop_art + name = "Soft Cap Pop Art" + desc = "A poster reprint of some cheap pop art." + icon_state = "poster18_legit" + +/obj/structure/sign/poster/official/safety_internals + name = "Safety: Internals" + desc = "A poster instructing the viewer to wear internals in the rare environments where there is no oxygen or the air has been rendered toxic." + icon_state = "poster19_legit" + +/obj/structure/sign/poster/official/safety_eye_protection + name = "Safety: Eye Protection" + desc = "A poster instructing the viewer to wear eye protection when dealing with chemicals, smoke, or bright lights." + icon_state = "poster20_legit" + +/obj/structure/sign/poster/official/safety_report + name = "Safety: Report" + desc = "A poster instructing the viewer to report suspicious activity to the security force." + icon_state = "poster21_legit" + +/obj/structure/sign/poster/official/report_crimes + name = "Report Crimes" + desc = "A poster encouraging the swift reporting of crime or seditious behavior to station security." + icon_state = "poster22_legit" + +/obj/structure/sign/poster/official/ion_rifle + name = "Ion Rifle" + desc = "A poster displaying an Ion Rifle." + icon_state = "poster23_legit" + +/obj/structure/sign/poster/official/foam_force_ad + name = "Foam Force Ad" + desc = "Foam Force, it's Foam or be Foamed!" + icon_state = "poster24_legit" + +/obj/structure/sign/poster/official/cohiba_robusto_ad + name = "Cohiba Robusto Ad" + desc = "Cohiba Robusto, the classy cigar." + icon_state = "poster25_legit" + +/obj/structure/sign/poster/official/anniversary_vintage_reprint + name = "50th Anniversary Vintage Reprint" + desc = "A reprint of a poster from 2505, commemorating the 50th Anniversery of Nanoposters Manufacturing, a subsidary of Nanotrasen." + icon_state = "poster26_legit" + +/obj/structure/sign/poster/official/fruit_bowl + name = "Fruit Bowl" + desc = " Simple, yet awe-inspiring." + icon_state = "poster27_legit" + +/obj/structure/sign/poster/official/pda_ad + name = "PDA Ad" + desc = "A poster advertising the latest PDA from Nanotrasen suppliers." + icon_state = "poster28_legit" + +/obj/structure/sign/poster/official/enlist + name = "Enlist" + desc = "Enlist in the Nanotrasen ERT reserves today!" + icon_state = "poster29_legit" + +/obj/structure/sign/poster/official/nanomichi_ad + name = "Nanomichi Ad" + desc = " A poster advertising Nanomichi brand audio cassettes." + icon_state = "poster30_legit" + +/obj/structure/sign/poster/official/twelve_gauge + name = "12 Gauge" + desc = "A poster boasting about the superiority of 12 gauge shotgun shells." + icon_state = "poster31_legit" + +/obj/structure/sign/poster/official/high_class_martini + name = "High-Class Martini" + desc = "I told you to shake it, no stirring." + icon_state = "poster32_legit" + +/obj/structure/sign/poster/official/the_owl + name = "The Owl" + desc = "The Owl would do his best to protect the station. Will you?" + icon_state = "poster33_legit" + +/obj/structure/sign/poster/official/spiders + name = "Spider Risk" + desc = "A poster detailing what to do when giant spiders are seen." + icon_state = "poster34_legit" + +/obj/structure/sign/poster/official/kill_syndicate + name = "Kill Syndicate" + desc = "A poster demanding that all crew should be ready to fight the Syndicate." + icon_state = "poster35_legit" + +/obj/structure/sign/poster/official/air1 + name = "Information on Air" + desc = "A poster providing visual aid to remind crew of air canisters." + icon_state = "poster36_legit" + +/obj/structure/sign/poster/official/air2 + name = "Information on Air" + desc = "A poster providing visual aid to remind crew of air canisters." + icon_state = "poster37_legit" + +/obj/structure/sign/poster/official/dig + name = "Dig for Glory!" + desc = "A poster trying to convince the crew to mine for ore." + icon_state = "poster38_legit" + +/obj/structure/sign/poster/official/religious + name = "Religious Poster" + desc = "A generic religious poster telling you to believe." + icon_state = "poster39_legit" + +/obj/structure/sign/poster/official/healthy + name = "Stay Healthy!" + desc = "A healthy crew is a happy crew!" + icon_state = "poster40_legit" + +#undef PLACE_SPEED diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 1cd105367ed..6cf11f4f3c8 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -440,8 +440,7 @@ steam.start() -- spawns the effect var/obj/chemholder Destroy() - qdel(chemholder) - chemholder = null + QDEL_NULL(chemholder) return ..() New() diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm index 5c5005fb6fd..39cafaa51ed 100644 --- a/code/game/objects/effects/gibs.dm +++ b/code/game/objects/effects/gibs.dm @@ -1,29 +1,28 @@ -/proc/gibs(atom/location, var/list/viruses, var/datum/dna/MobDNA) //CARN MARKER - new /obj/effect/gibspawner/generic(get_turf(location),viruses,MobDNA) +/proc/gibs(atom/location, datum/dna/MobDNA) //CARN MARKER + new /obj/effect/gibspawner/generic(get_turf(location), MobDNA) -/proc/hgibs(atom/location, var/list/viruses, var/datum/dna/MobDNA) - new /obj/effect/gibspawner/human(get_turf(location),viruses,MobDNA) +/proc/hgibs(atom/location, datum/dna/MobDNA) + new /obj/effect/gibspawner/human(get_turf(location), MobDNA) -/proc/xgibs(atom/location, var/list/viruses) - new /obj/effect/gibspawner/xeno(get_turf(location),viruses) +/proc/xgibs(atom/location) + new /obj/effect/gibspawner/xeno(get_turf(location)) -/proc/robogibs(atom/location, var/list/viruses) - new /obj/effect/gibspawner/robot(get_turf(location),viruses) +/proc/robogibs(atom/location) + new /obj/effect/gibspawner/robot(get_turf(location)) /obj/effect/gibspawner var/sparks = 0 //whether sparks spread on Gib() - var/virusProb = 20 //the chance for viruses to spread on the gibs var/list/gibtypes = list() var/list/gibamounts = list() var/list/gibdirections = list() //of lists - New(location, var/list/viruses, var/datum/dna/MobDNA) + New(location, datum/dna/MobDNA) ..() if(istype(loc,/turf)) //basically if a badmin spawns it - Gib(loc,viruses,MobDNA) + Gib(loc, MobDNA) - proc/Gib(atom/location, var/list/viruses = list(), var/datum/dna/MobDNA = null) + proc/Gib(atom/location, datum/dna/MobDNA = null) if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len) to_chat(world, "Gib list length mismatch!") return diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 17029920dd3..d386fe07d0b 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -26,7 +26,7 @@ /obj/effect/mine/proc/triggermine(mob/living/victim) if(triggered) return - visible_message("[victim] sets off \icon[src] [src]!") + visible_message("[victim] sets off [bicon(src)] [src]!") var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index ebfd177959e..47c654768d5 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -95,7 +95,7 @@ /obj/item/clothing/head/cone = 10, /obj/item/weapon/coin/silver = 10, /obj/item/weapon/coin/twoheaded = 10, - /obj/item/weapon/contraband/poster = 10, + /obj/item/weapon/poster/random_contraband = 10, /obj/item/weapon/crowbar = 10, /obj/item/weapon/crowbar/red = 10, /obj/item/weapon/extinguisher = 90, diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 00eb1bd6884..9f92bfa87f7 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -4,7 +4,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d name = "item" icon = 'icons/obj/items.dmi' var/discrete = 0 // used in item_attack.dm to make an item not show an attack message to viewers - var/no_embed = 0 // For use in item_attack.dm var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite var/blood_overlay_color = null var/item_state = null @@ -63,6 +62,17 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d var/mob/thrownby = null + //So items can have custom embedd values + //Because customisation is king + var/embed_chance = EMBED_CHANCE + var/embedded_fall_chance = EMBEDDED_ITEM_FALLOUT + var/embedded_pain_chance = EMBEDDED_PAIN_CHANCE + var/embedded_pain_multiplier = EMBEDDED_PAIN_MULTIPLIER //The coefficient of multiplication for the damage this item does while embedded (this*w_class) + var/embedded_fall_pain_multiplier = EMBEDDED_FALL_PAIN_MULTIPLIER //The coefficient of multiplication for the damage this item does when falling out of a limb (this*w_class) + var/embedded_impact_pain_multiplier = EMBEDDED_IMPACT_PAIN_MULTIPLIER //The coefficient of multiplication for the damage this item does when first embedded (this*w_class) + var/embedded_unsafe_removal_pain_multiplier = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER //The coefficient of multiplication for the damage removing this without surgery causes (this*w_class) + var/embedded_unsafe_removal_time = EMBEDDED_UNSAFE_REMOVAL_TIME //A time in ticks, multiplied by the w_class. + var/toolspeed = 1 // If this item is a tool, the speed multiplier /* Species-specific sprites, concept stolen from Paradise//vg/. @@ -464,51 +474,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d M.AdjustEyeBlurry(rand(3,4)) return -/obj/item/clean_blood() - . = ..() - if(blood_overlay) - overlays.Remove(blood_overlay) - if(istype(src, /obj/item/clothing/gloves)) - var/obj/item/clothing/gloves/G = src - G.transfer_blood = 0 - - -/obj/item/add_blood(mob/living/carbon/human/M as mob) - if(!..()) - return 0 - - if(istype(src, /obj/item/weapon/melee/energy)) - return - - //if we haven't made our blood_overlay already - if( !blood_overlay ) - generate_blood_overlay() - - //apply the blood-splatter overlay if it isn't already in there - if(!blood_DNA.len) - blood_overlay.color = blood_color - overlays += blood_overlay - - //if this blood isn't already in the list, add it - if(istype(M)) - if(blood_DNA[M.dna.unique_enzymes]) - return 0 //already bloodied with this blood. Cannot add more. - blood_DNA[M.dna.unique_enzymes] = M.dna.b_type - return 1 //we applied blood to the item - -/obj/item/proc/generate_blood_overlay() - if(blood_overlay) - return - - var/icon/I = new /icon(icon, icon_state) - I.Blend(new /icon('icons/effects/blood.dmi', rgb(255,255,255)),ICON_ADD) //fills the icon_state with white (except where it's transparent) - I.Blend(new /icon('icons/effects/blood.dmi', "itemblood"),ICON_MULTIPLY) //adds blood and the remaining white areas become transparant - - //not sure if this is worth it. It attaches the blood_overlay to every item of the same type if they don't have one already made. - for(var/obj/item/A in world) - if(A.type == type && !A.blood_overlay) - A.blood_overlay = image(I) - /obj/item/singularity_pull(S, current_size) spawn(0) //this is needed or multiple items will be thrown sequentially and not simultaneously if(current_size >= STAGE_FOUR) @@ -558,3 +523,10 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d /obj/item/proc/is_crutch() //Does an item prop up a human mob and allow them to stand if they are missing a leg/foot? return 0 + +// Return true if you don't want regular throw handling +/obj/item/proc/override_throw(mob/user, atom/target) + return FALSE + +/obj/item/proc/is_equivalent(obj/item/I) + return I == src diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index a3d302f1326..295b133d92e 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -73,7 +73,7 @@ temp = pick(graffiti) else temp = href_list["type"] - if((usr.restrained() || usr.stat || usr.get_active_hand() != src)) + if((usr.restrained() || usr.stat || !usr.is_in_active_hand(src))) return drawtype = temp update_window(usr) @@ -147,6 +147,29 @@ colour = "#DA00FF" colourName = "purple" +/obj/item/toy/crayon/random/New() + icon_state = pick(list("crayonred", "crayonorange", "crayonyellow", "crayongreen", "crayonblue", "crayonpurple")) + switch(icon_state) + if("crayonred") + colour = "#DA0000" + colourName = "red" + if("crayonorange") + colour = "#FF9300" + colourName = "orange" + if("crayonyellow") + colour = "#FFF200" + colourName = "yellow" + if("crayongreen") + colour = "#A8E61D" + colourName = "green" + if("crayonblue") + colour = "#00B7EF" + colourName = "blue" + if("crayonpurple") + colour = "#DA00FF" + colourName = "purple" + ..() + /obj/item/toy/crayon/white icon_state = "crayonwhite" colour = "#FFFFFF" @@ -167,7 +190,7 @@ ..() /obj/item/toy/crayon/mime/Topic(href,href_list) - if((usr.restrained() || usr.stat || usr.get_active_hand() != src)) + if(!Adjacent(usr) || usr.incapacitated()) return if(href_list["color"]) if(colour != "#FFFFFF") @@ -192,11 +215,10 @@ ..() /obj/item/toy/crayon/rainbow/Topic(href,href_list[]) - + if(!Adjacent(usr) || usr.incapacitated()) + return if(href_list["color"]) var/temp = input(usr, "Please select colour.", "Crayon colour") as color - if((usr.restrained() || usr.stat || usr.get_active_hand() != src)) - return colour = temp update_window(usr) else @@ -214,7 +236,7 @@ /obj/item/toy/crayon/spraycan/New() ..() - name = "NanoTrasen-brand Rapid Paint Applicator" + name = "Nanotrasen-brand Rapid Paint Applicator" update_icon() /obj/item/toy/crayon/spraycan/attack_self(mob/living/user as mob) diff --git a/code/game/objects/items/devices/autopsy.dm b/code/game/objects/items/devices/autopsy.dm index 3bad7c09cf6..62e4354f238 100644 --- a/code/game/objects/items/devices/autopsy.dm +++ b/code/game/objects/items/devices/autopsy.dm @@ -74,6 +74,21 @@ if(O.trace_chemicals[V] > 0 && !chemtraces.Find(V)) chemtraces += V +/obj/item/weapon/autopsy_scanner/attackby(obj/item/weapon/P, mob/user) + if(istype(P, /obj/item/weapon/pen)) + var/dead_name = input("Insert name of deceased individual") + var/dead_rank = input("Insert rank of deceased individual") + var/dead_tod = input("Insert time of death") + var/dead_cause = input("Insert cause of death") + var/dead_chems = input("Insert any chemical traces") + var/dead_notes = input("Insert any relevant notes") + var/obj/item/weapon/paper/R = new(user.loc) + R.name = "Official Coroner's Report - [dead_name]" + R.info = "NanoTrasen Science Station Cyberiad - Coroner's Report

    Name of Deceased: [dead_name]

    Rank of Deceased: [dead_rank]

    Time of Death: [dead_tod]

    Cause of Death: [dead_cause]

    Trace Chemicals: [dead_chems]

    Additional Coroner's Notes: [dead_notes]

    Coroner's Signature: " + playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) + sleep(10) + user.put_in_hands(R) + /obj/item/weapon/autopsy_scanner/attack_self(mob/user) if(!wdata.len && !chemtraces.len) return @@ -181,4 +196,4 @@ M.visible_message("[user] scans the wounds on [M]'s [S] with [src]") add_data(S) - return 1 \ No newline at end of file + return 1 diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index ff7eb0ac2cc..eef0b2072b8 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -43,8 +43,7 @@ if(active_dummy) eject_all() playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6) - qdel(active_dummy) - active_dummy = null + QDEL_NULL(active_dummy) to_chat(usr, "You deactivate \the [src].") var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) T.icon = 'icons/effects/effects.dmi' diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index e309cae9bbe..1a1ed2b4c5e 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -39,6 +39,11 @@ overcharged = 1 overlays += "overcharge" +/obj/item/device/flash/random/New() + ..() + if(prob(25)) + broken = 1 + icon_state = "[initial(icon_state)]burnt" /obj/item/device/flash/proc/burn_out() //Made so you can override it if you want to have an invincible flash from R&D or something. broken = 1 @@ -196,4 +201,37 @@ icon_state = "memorizer" item_state = "nullrod" +/obj/item/device/flash/armimplant + name = "photon projector" + desc = "A high-powered photon projector implant normally used for lighting purposes, but also doubles as a flashbulb weapon. Self-repair protocals fix the flashbulb if it ever burns out." + var/flashcd = 20 + var/overheat = 0 + var/obj/item/organ/internal/cyberimp/arm/flash/I = null + +/obj/item/device/flash/armimplant/Destroy() + I = null + return ..() + +/obj/item/device/flash/armimplant/burn_out() + if(I && I.owner) + to_chat(I.owner, "Your photon projector implant overheats and deactivates!") + I.Retract() + overheat = FALSE + addtimer(src, "cooldown", flashcd * 2) + +/obj/item/device/flash/armimplant/try_use_flash(mob/user = null) + if(overheat) + if(I && I.owner) + to_chat(I.owner, "Your photon projector is running too hot to be used again so quickly!") + return FALSE + overheat = TRUE + addtimer(src, "cooldown", flashcd) + playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) + update_icon(1) + return TRUE + +/obj/item/device/flash/armimplant/proc/cooldown() + overheat = FALSE + + /obj/item/device/flash/synthetic //just a regular flash now diff --git a/code/game/objects/items/devices/guitar.dm b/code/game/objects/items/devices/guitar.dm deleted file mode 100644 index 6c0e4645cc9..00000000000 --- a/code/game/objects/items/devices/guitar.dm +++ /dev/null @@ -1,45 +0,0 @@ -//copy pasta of the space piano, don't hurt me -Pete - -/obj/item/device/guitar - name = "guitar" - desc = "It's made of wood and has bronze strings." - icon = 'icons/obj/musician.dmi' - icon_state = "guitar" - item_state = "guitar" - force = 10 - burn_state = FLAMMABLE - burntime = 20 - var/datum/song/handheld/song - hitsound = 'sound/effects/guitarsmash.ogg' - -/obj/item/device/guitar/New() - song = new("guitar", src) - song.instrumentExt = "ogg" - -/obj/item/device/guitar/Destroy() - QDEL_NULL(song) - return ..() - -/obj/item/device/guitar/attack_self(mob/user as mob) - ui_interact(user) - -/obj/item/device/guitar/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - if(!isliving(user) || user.incapacitated()) - return - - song.ui_interact(user, ui_key, ui, force_open) - -/obj/item/device/guitar/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) - return song.ui_data(user, ui_key, state) - -/obj/item/device/guitar/Topic(href, href_list) - song.Topic(href, href_list) - -/datum/crafting_recipe/guitar - name = "Guitar" - result = /obj/item/device/guitar - reqs = list(/obj/item/stack/sheet/wood = 5, - /obj/item/stack/cable_coil = 6, - /obj/item/stack/tape_roll = 5) - tools = list(/obj/item/weapon/screwdriver, /obj/item/weapon/wirecutters) - time = 80 diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm new file mode 100644 index 00000000000..3643b197d4c --- /dev/null +++ b/code/game/objects/items/devices/instruments.dm @@ -0,0 +1,103 @@ +//copy pasta of the space piano, don't hurt me -Pete +/obj/item/device/instrument + name = "generic instrument" + icon = 'icons/obj/musician.dmi' + burn_state = FLAMMABLE + var/datum/song/handheld/song + var/instrumentId = "generic" + var/instrumentExt = "ogg" + +/obj/item/device/instrument/New() + song = new(instrumentId, src) + song.instrumentExt = instrumentExt + ..() + +/obj/item/device/instrument/Destroy() + QDEL_NULL(song) + return ..() + +/obj/item/device/instrument/suicide_act(mob/user) + user.visible_message("[user] begins to play 'Gloomy Sunday'! It looks like \he's trying to commit suicide!") + return (BRUTELOSS) + +/obj/item/device/instrument/initialize(mapload) + song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded + ..() + +/obj/item/device/instrument/attack_self(mob/user) + ui_interact(user) + +/obj/item/device/instrument/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) + if(!isliving(user) || user.incapacitated()) + return + + song.ui_interact(user, ui_key, ui, force_open) + +/obj/item/device/instrument/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) + return song.ui_data(user, ui_key, state) + +/obj/item/device/instrument/Topic(href, href_list) + song.Topic(href, href_list) + +/obj/item/device/instrument/violin + name = "space violin" + desc = "A wooden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\"" + icon_state = "violin" + item_state = "violin" + force = 10 + hitsound = "swing_hit" + instrumentId = "violin" + +/obj/item/device/instrument/violin/golden + name = "golden violin" + desc = "A golden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\"" + icon_state = "golden_violin" + item_state = "golden_violin" + burn_state = LAVA_PROOF + +/obj/item/device/instrument/guitar + name = "guitar" + desc = "It's made of wood and has bronze strings." + icon_state = "guitar" + item_state = "guitar" + force = 10 + attack_verb = list("played metal on", "serenaded", "crashed", "smashed") + hitsound = 'sound/effects/guitarsmash.ogg' + instrumentId = "guitar" + +/obj/item/device/instrument/eguitar + name = "electric guitar" + desc = "Makes all your shredding needs possible." + icon_state = "eguitar" + item_state = "eguitar" + force = 12 + attack_verb = list("played metal on", "shredded", "crashed", "smashed") + hitsound = 'sound/weapons/stringsmash.ogg' + instrumentId = "eguitar" + +/datum/crafting_recipe/violin + name = "Violin" + result = /obj/item/device/instrument/violin + reqs = list(/obj/item/stack/sheet/wood = 5, + /obj/item/stack/cable_coil = 6, + /obj/item/stack/tape_roll = 5) + tools = list(/obj/item/weapon/screwdriver, /obj/item/weapon/wirecutters) + time = 80 + +/datum/crafting_recipe/guitar + name = "Guitar" + result = /obj/item/device/instrument/guitar + reqs = list(/obj/item/stack/sheet/wood = 5, + /obj/item/stack/cable_coil = 6, + /obj/item/stack/tape_roll = 5) + tools = list(/obj/item/weapon/screwdriver, /obj/item/weapon/wirecutters) + time = 80 + +/datum/crafting_recipe/eguitar + name = "Electric Guitar" + result = /obj/item/device/instrument/eguitar + reqs = list(/obj/item/stack/sheet/metal = 5, + /obj/item/stack/cable_coil = 6, + /obj/item/stack/tape_roll = 5) + tools = list(/obj/item/weapon/screwdriver, /obj/item/weapon/wirecutters) + time = 80 \ No newline at end of file diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index c8294590e3c..122bd3a9bae 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -81,7 +81,7 @@ return if(ishuman(user)) var/mob/living/carbon/human/H = user - if((HULK in H.mutations) || (H.species.flags & NOGUNS)) + if((HULK in H.mutations) || (NOGUNS in H.species.species_traits)) user << "Your fingers can't press the button!" return diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 99096ac2649..3d1f1001b06 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -37,6 +37,7 @@ var/global/list/default_medbay_channels = list( var/list/channels = list() //see communications.dm for full list. First channes is a "default" for :h var/subspace_transmission = 0 var/syndie = 0//Holder to see if it's a syndicate encrpyed radio + var/disable_timer = 0 //How many times this is disabled by EMPs var/is_special = 0 //For electropacks mostly, skips Topic() checks @@ -246,6 +247,13 @@ var/global/list/default_medbay_channels = list( A.name = from A.role = role A.message = message + var/jammed = FALSE + for(var/obj/item/device/jammer/jammer in active_jammers) + if(get_dist(get_turf(src), get_turf(jammer)) < jammer.range) + jammed = TRUE + break + if(jammed) + message = Gibberish(message, 100) Broadcast_Message(connection, A, 0, "*garbled automated announcement*", src, message, from, "Automated Announcement", from, "synthesized voice", @@ -331,6 +339,12 @@ var/global/list/default_medbay_channels = list( var/datum/radio_frequency/connection = message_mode var/turf/position = get_turf(src) + var/jammed = FALSE + for(var/obj/item/device/jammer/jammer in active_jammers) + if(get_dist(position, get_turf(jammer)) < jammer.range) + jammed = TRUE + break + //#### Tagging the signal with all appropriate identity values ####// // ||-- The mob's name identity --|| @@ -344,6 +358,9 @@ var/global/list/default_medbay_channels = list( var/jobname // the mob's "job" + if(jammed) + message = Gibberish(message, 100) + // --- Human: use their actual job --- if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -599,12 +616,25 @@ var/global/list/default_medbay_channels = list( else return /obj/item/device/radio/emp_act(severity) + on = 0 + disable_timer++ + addtimer(src, "enable_radio", rand(100, 200)) + + if(listening) + visible_message("[src] buzzes violently!") + broadcasting = 0 listening = 0 for(var/ch_name in channels) channels[ch_name] = 0 ..() +/obj/item/device/radio/proc/enable_radio() + if(disable_timer > 0) + disable_timer-- + if(!disable_timer) + on = 1 + /////////////////////////////// //////////Borg Radios////////// /////////////////////////////// diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index e31c49f9392..53b05ef48d1 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -14,6 +14,7 @@ REAGENT SCANNER icon_state = "t-ray0" var/on = 0 slot_flags = SLOT_BELT + w_class = 2 w_class = WEIGHT_CLASS_SMALL item_state = "electronic" materials = list(MAT_METAL=150) @@ -164,15 +165,9 @@ REAGENT SCANNER var/mob/living/carbon/human/H = M var/list/damaged = H.get_damaged_organs(1,1) user.show_message("Localized Damage, Brute/Burn:",1) - if(length(damaged)>0) + if(length(damaged) > 0) for(var/obj/item/organ/external/org in damaged) - user.show_message(text("\t []: [][] - []", \ - capitalize(org.name), \ - (org.brute_dam > 0) ? "[org.brute_dam]" :0, \ - (org.status & ORGAN_BLEEDING)?"\[Bleeding\]":"\t", \ - (org.burn_dam > 0) ? "[org.burn_dam]" :0),1) - else - user.show_message("\t Limbs are OK.",1) + user.show_message("\t\t[capitalize(org.name)]: [(org.brute_dam > 0) ? "[org.brute_dam]" : "0"]-[(org.burn_dam > 0) ? "[org.burn_dam]" : "0"]") OX = M.getOxyLoss() > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" TX = M.getToxLoss() > 50 ? "Dangerous amount of toxins detected" : "Subject bloodstream toxin level minimal" @@ -184,9 +179,10 @@ REAGENT SCANNER if(istype(M, /mob/living/carbon)) if(upgraded) chemscan(user, M) - for(var/datum/disease/D in M.viruses) + for(var/thing in M.viruses) + var/datum/disease/D = thing if(!(D.visibility_flags & HIDDEN_SCANNER)) - to_chat(user, "Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]") + user.show_message("Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]") if(M.getStaminaLoss()) user.show_message("Subject appears to be suffering from fatigue.") if(M.getCloneLoss()) @@ -223,20 +219,25 @@ REAGENT SCANNER for(var/datum/wound/W in e.wounds) if(W.internal) user.show_message(text("Internal bleeding detected. Advanced scanner required for location."), 1) break - if(H.vessel) - var/blood_type = H.get_blood_name() - var/blood_volume = round(H.vessel.get_reagent_amount(blood_type)) - var/blood_percent = blood_volume / BLOOD_VOLUME_NORMAL - blood_percent *= 100 - if(blood_volume <= 500) - user.show_message("Warning: Blood Level LOW: [blood_percent]% [blood_volume]cl") - else if(blood_volume <= 336) - user.show_message("Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl") + var/blood_id = H.get_blood_id() + if(blood_id) + if(H.bleed_rate) + user.show_message("Subject is bleeding!") + var/blood_percent = round((H.blood_volume / BLOOD_VOLUME_NORMAL)*100) + var/blood_type = H.b_type + if(blood_id != "blood")//special blood substance + var/datum/reagent/R = chemical_reagents_list[blood_id] + if(R) + blood_type = R.name + else + blood_type = blood_id + if(H.blood_volume <= BLOOD_VOLUME_SAFE && H.blood_volume > BLOOD_VOLUME_OKAY) + user.show_message("LOW blood level [blood_percent] %, [H.blood_volume] cl, type: [blood_type]") + else if(H.blood_volume <= BLOOD_VOLUME_OKAY) + user.show_message("CRITICAL blood level [blood_percent] %, [H.blood_volume] cl, type: [blood_type]") else - user.show_message("Blood Level Normal: [blood_percent]% [blood_volume]cl") - if(H.species.exotic_blood) - user.show_message("Subject possesses exotic blood.") - user.show_message("Exotic blood type: [blood_type].") + user.show_message("Blood level [blood_percent] %, [H.blood_volume] cl, type: [blood_type]") + if(H.undergoing_cardiac_arrest() && H.stat != DEAD) user.show_message("Subject suffering from heart attack: Apply defibrillator immediately.") user.show_message("Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm.") diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 5f140f05d03..6b48dea1910 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -146,3 +146,22 @@ effective or pretty fucking useless. attack_self(usr) add_fingerprint(usr) return + +/obj/item/device/jammer + name = "radio jammer" + desc = "Device used to disrupt nearby radio communication." + icon_state = "jammer" + var/active = FALSE + var/range = 12 + +/obj/item/device/jammer/Destroy() + active_jammers -= src + return ..() + +/obj/item/device/jammer/attack_self(mob/user) + to_chat(user,"You [active ? "deactivate" : "activate"] the [src].") + active = !active + if(active) + active_jammers |= src + else + active_jammers -= src \ No newline at end of file diff --git a/code/game/objects/items/devices/violin.dm b/code/game/objects/items/devices/violin.dm deleted file mode 100644 index 3ef6b2bef85..00000000000 --- a/code/game/objects/items/devices/violin.dm +++ /dev/null @@ -1,41 +0,0 @@ -//copy pasta of the space piano, don't hurt me -Pete - -/obj/item/device/violin - name = "space violin" - desc = "A wooden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\"" - icon = 'icons/obj/musician.dmi' - icon_state = "violin" - item_state = "violin" - attack_verb = list("strung", "fiddled", "tuned", "pitched") - force = 10 - burn_state = FLAMMABLE - burntime = 20 - hitsound = 'sound/weapons/smash.ogg' - var/datum/song/handheld/song - -/obj/item/device/violin/New() - song = new("violin", src) - song.instrumentExt = "ogg" - -/obj/item/device/violin/Destroy() - QDEL_NULL(song) - return ..() - -/obj/item/device/violin/initialize() - song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded - ..() - -/obj/item/device/violin/attack_self(mob/user as mob) - ui_interact(user) - -/obj/item/device/violin/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - if(!isliving(user) || user.incapacitated()) - return - - song.ui_interact(user, ui_key, ui, force_open) - -/obj/item/device/violin/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) - return song.ui_data(user, ui_key, state) - -/obj/item/device/violin/Topic(href, href_list) - song.Topic(href, href_list) diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm index 5f55a5acdcc..dccc8f041f6 100644 --- a/code/game/objects/items/latexballoon.dm +++ b/code/game/objects/items/latexballoon.dm @@ -59,5 +59,5 @@ var/obj/item/weapon/tank/T = W blow(T, user) return - if(is_sharp(W) || is_hot(W) || can_puncture(W)) + if(is_sharp(W) || is_hot(W) || is_pointed(W)) burst() diff --git a/code/game/objects/items/policetape.dm b/code/game/objects/items/policetape.dm index 56fd5eadbad..bea99b5d98b 100644 --- a/code/game/objects/items/policetape.dm +++ b/code/game/objects/items/policetape.dm @@ -174,7 +174,7 @@ var/list/tape_roll_applications = list() breaktape(/obj/item/weapon/wirecutters,user) /obj/item/tape/proc/breaktape(obj/item/weapon/W as obj, mob/user as mob) - if(user.a_intent == INTENT_HELP && ((!can_puncture(W) && src.allowed(user)))) + if(user.a_intent == INTENT_HELP && ((!is_pointed(W) && src.allowed(user)))) to_chat(user, "You can't break the [src] with that!") return user.visible_message("[user] breaks the [src]!", "You break the [src]!") diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index ef1589f50b7..b744edd79a6 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -7,7 +7,7 @@ slot_flags = SLOT_BELT var/list/part = null var/sabotaged = 0 //Emagging limbs can have repercussions when installed as prosthetics. - var/model_info + var/model_info = "Unbranded" dir = SOUTH /obj/item/robot_parts/New(newloc, model) @@ -23,33 +23,38 @@ else name = "robot [initial(name)]" +/obj/item/robot_parts/attack_self(mob/user) + var/choice = input(user, "Select the company appearance for this limb.", "Limb Company Selection") as null|anything in selectable_robolimbs + if(!choice) + return + if(loc != user) + return + model_info = choice + to_chat(usr, "You change the company limb model to [choice].") + /obj/item/robot_parts/l_arm name = "left arm" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "l_arm" part = list("l_arm","l_hand") - model_info = 1 /obj/item/robot_parts/r_arm name = "right arm" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "r_arm" part = list("r_arm","r_hand") - model_info = 1 /obj/item/robot_parts/l_leg name = "left leg" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "l_leg" part = list("l_leg","l_foot") - model_info = 1 /obj/item/robot_parts/r_leg name = "right leg" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "r_leg" part = list("r_leg","r_foot") - model_info = 1 /obj/item/robot_parts/chest name = "torso" @@ -80,6 +85,7 @@ name = "endoskeleton" desc = "A complex metal backbone with standard limb sockets and pseudomuscle anchors." icon_state = "robo_suit" + model_info = null var/obj/item/robot_parts/l_arm/l_arm = null var/obj/item/robot_parts/r_arm/r_arm = null var/obj/item/robot_parts/l_leg/l_leg = null @@ -108,6 +114,9 @@ forced_ai = null return ..() +/obj/item/robot_parts/robot_suit/attack_self(mob/user) + return + /obj/item/robot_parts/robot_suit/proc/updateicon() overlays.Cut() if(l_arm) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index c5ecb18edec..1f8cb43fbb2 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -37,8 +37,7 @@ R.hands.icon_state = "nomod" R.icon_state = "robot" R.module.remove_subsystems_and_actions(R) - qdel(R.module) - R.module = null + QDEL_NULL(R.module) R.camera.network.Remove(list("Engineering", "Medical", "Mining Outpost")) R.rename_character(R.real_name, R.get_default_name("Default")) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 82d2ce8c024..04be0d53a1a 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -11,6 +11,7 @@ var/heal_burn = 0 var/self_delay = 20 var/unique_handling = 0 //some things give a special prompt, do we want to bypass some checks in parent? + var/stop_bleeding = 0 /obj/item/stack/medical/attack(mob/living/M, mob/user) if(!iscarbon(M) && !isanimal(M)) @@ -37,6 +38,14 @@ to_chat(user, "This can't be used on a robotic limb.") return 1 + if(stop_bleeding) + if(H.bleedsuppress) + to_chat(user, "[H]'s bleeding is already bandaged!") + return 1 + else if(!H.bleed_rate) + to_chat(user, "[H] isn't bleeding!") + return 1 + if(M == user && !unique_handling) user.visible_message("[user] starts to apply [src] on [H]...") if(!do_mob(user, H, self_delay)) @@ -76,6 +85,7 @@ desc = "Some sterile gauze to wrap around bloody stumps." icon_state = "gauze" origin_tech = "biotech=2" + stop_bleeding = 1800 /obj/item/stack/medical/bruise_pack/attack(mob/living/M, mob/user) if(..()) @@ -86,19 +96,18 @@ var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting) if(affecting.open == 0) - var/bandaged = affecting.bandage() - var/disinfected = affecting.disinfect() + affecting.bandage() + affecting.disinfect() - if(!(bandaged || disinfected)) - to_chat(user, "The wounds on [H]'s [affecting.name] have already been bandaged.") - return 1 - else - user.visible_message("[user] bandages the wounds on [H]'s [affecting.name].", \ - "You bandage the wounds on [H]'s [affecting.name]." ) + user.visible_message("[user] bandages the wounds on [H]'s [affecting.name].", \ + "You bandage the wounds on [H]'s [affecting.name]." ) - affecting.heal_damage(heal_brute, heal_burn) - H.UpdateDamageIcon() - use(1) + if(stop_bleeding) + if(!H.bleedsuppress) //so you can't stack bleed suppression + H.suppress_bloodloss(stop_bleeding) + affecting.heal_damage(heal_brute, heal_burn) + H.UpdateDamageIcon() + use(1) else to_chat(user, "[affecting] is cut open, you'll need more than a bandage!") @@ -109,6 +118,7 @@ desc = "An advanced trauma kit for severe injuries." icon_state = "traumakit" heal_brute = 25 + stop_bleeding = 0 @@ -132,15 +142,13 @@ var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting) if(affecting.open == 0) - if(!affecting.salve()) - to_chat(user, "The wounds on [H]'s [affecting.name] have already been salved.") - return 1 - else - user.visible_message("[user] salves the wounds on [H]'s [affecting.name].", \ - "You salve the wounds on [H]'s [affecting.name]." ) - affecting.heal_damage(heal_brute, heal_burn) - H.UpdateDamageIcon() - use(1) + affecting.salve() + + user.visible_message("[user] salves the wounds on [H]'s [affecting.name].", \ + "You salve the wounds on [H]'s [affecting.name]." ) + affecting.heal_damage(heal_brute, heal_burn) + H.UpdateDamageIcon() + use(1) else to_chat(user, "[affecting] is cut open, you'll need more than some ointment!") diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 96d5d381a72..9de205d483c 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -55,7 +55,7 @@ var/global/list/datum/stack_recipe/rod_recipes = list ( \ "You shape [src] into metal with the welding tool.", \ "You hear welding.") - var/replace = user.get_inactive_hand() == src + var/replace = user.is_in_inactive_hand(src) use(2) if(get_amount() <= 0 && replace) user.unEquip(src, 1) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 67755655fe3..029cb8cd4a5 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -123,6 +123,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list( */ var/global/list/datum/stack_recipe/plasteel_recipes = list( new /datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1), + new /datum/stack_recipe("bomb assembly", /obj/machinery/syndicatebomb/empty, 10, time = 50), new /datum/stack_recipe("Surgery Table", /obj/machinery/optable, 5, time = 50, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1), new /datum/stack_recipe("Mass Driver frame", /obj/machinery/mass_driver_frame, 3, time = 50, one_per_turf = 1) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index d4d4ae7f48c..eeacb71e9b3 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -36,6 +36,23 @@ /obj/item/stack/attack_self(mob/user) list_recipes(user) +/obj/item/stack/attack_self_tk(mob/user) + list_recipes(user) + +/obj/item/stack/attack_tk(mob/user) + if(user.stat || !isturf(loc)) return + // Allow remote stack splitting, because telekinetic inventory managing + // is really cool + if(src in user.tkgrabbed_objects) + var/obj/item/stack/F = split(user, 1) + F.attack_tk(user) + if(src && user.machine == src) + spawn(0) + interact(user) + else + ..() + + /obj/item/stack/proc/list_recipes(mob/user, recipes_sublist) if(!recipes) return @@ -107,7 +124,7 @@ /obj/item/stack/Topic(href, href_list) ..() - if(usr.incapacitated() || usr.get_active_hand() != src) + if(usr.incapacitated() || !usr.is_in_active_hand(src)) return 0 if(href_list["sublist"] && !href_list["make"]) @@ -124,6 +141,7 @@ var/datum/stack_recipe/R = recipes_list[text2num(href_list["make"])] var/multiplier = text2num(href_list["multiplier"]) + var/atom/creation_loc = (loc == usr) ? usr.loc : loc if(!multiplier) multiplier = 1 @@ -134,11 +152,11 @@ to_chat(usr, "You haven't got enough [src] to build \the [R.title]!") return 0 - if(R.one_per_turf && (locate(R.result_type) in usr.loc)) + if(R.one_per_turf && (locate(R.result_type) in creation_loc)) to_chat(usr, "There is another [R.title] here!") return 0 - if(R.on_floor && !istype(usr.loc, /turf/simulated)) + if(R.on_floor && !istype(creation_loc, /turf/simulated)) to_chat(usr, "\The [R.title] must be constructed on the floor!") return 0 @@ -150,7 +168,7 @@ if(amount < R.req_amount * multiplier) return - var/atom/O = new R.result_type(usr.loc) + var/atom/O = new R.result_type(creation_loc) O.dir = usr.dir if(R.max_res_amount > 1) var/obj/item/stack/new_item = O @@ -215,7 +233,7 @@ return max_amount /obj/item/stack/proc/split(mob/user, amt) - var/obj/item/stack/F = new type(user, amt) + var/obj/item/stack/F = new type(loc, amt) F.copy_evidences(src) if(isliving(user)) add_fingerprint(user) @@ -224,7 +242,7 @@ return F /obj/item/stack/attack_hand(mob/user) - if(user.get_inactive_hand() == src) + if(user.is_in_inactive_hand(src)) var/obj/item/stack/F = split(user, 1) user.put_in_hands(F) if(src && usr.machine == src) @@ -241,7 +259,7 @@ return 1 var/to_transfer - if(user.get_inactive_hand() == src) + if(user.is_in_inactive_hand(src)) var/desired = input("How much would you like to transfer from this stack?", "How much?", 1) as null|num if(!desired) return @@ -267,4 +285,4 @@ fingerprints = from.fingerprints fingerprintshidden = from.fingerprintshidden fingerprintslast = from.fingerprintslast - //TODO bloody overlay \ No newline at end of file + //TODO bloody overlay diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 83b6d31a0ea..b4bacd5326a 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1276,7 +1276,7 @@ obj/item/toy/cards/deck/syndicate/black /obj/item/toy/minigibber name = "miniature gibber" - desc = "A miniature recreation of NanoTrasen's famous meat grinder." + desc = "A miniature recreation of Nanotrasen's famous meat grinder." icon = 'icons/obj/toy.dmi' icon_state = "minigibber" attack_verb = list("grinded", "gibbed") @@ -1288,8 +1288,7 @@ obj/item/toy/cards/deck/syndicate/black if(stored_minature) to_chat(user, "\The [src] makes a violent grinding noise as it tears apart the miniature figure inside!") - qdel(stored_minature) - stored_minature = null + QDEL_NULL(stored_minature) playsound(user, 'sound/goonstation/effects/gib.ogg', 20, 1) cooldown = world.time diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 2623c70606e..3e79df2c213 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -6,7 +6,7 @@ RCD */ /obj/item/weapon/rcd name = "rapid-construction-device (RCD)" - desc = "A device used to rapidly build and deconstruct walls and floors." + desc = "A device used to rapidly build and deconstruct walls, floors and airlocks." icon = 'icons/obj/tools.dmi' icon_state = "rcd" opacity = 0 @@ -68,7 +68,7 @@ RCD if(istype(W, /obj/item/weapon/rcd_ammo)) var/obj/item/weapon/rcd_ammo/R = W if((matter + R.ammoamt) > max_matter) - to_chat(user, "The RCD cant hold any more matter-units.") + to_chat(user, "The RCD can't hold any more matter-units.") return matter += R.ammoamt user.drop_item() @@ -84,6 +84,9 @@ RCD //Change the mode ui_interact(user) +/obj/item/weapon/rcd/attack_self_tk(mob/user) + ui_interact(user) + /obj/item/weapon/rcd/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = inventory_state) ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) @@ -199,7 +202,8 @@ RCD to_chat(user, "Building Wall ...") playsound(loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 20 * toolspeed, target = A)) - if(!useResource(3, user)) return 0 + if(!useResource(3, user)) + return 0 activate() var/turf/AT = A AT.ChangeTurf(/turf/simulated/wall) @@ -212,7 +216,10 @@ RCD to_chat(user, "Building Airlock...") playsound(loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 50 * toolspeed, target = A)) - if(!useResource(10, user)) return 0 + for(var/obj/machinery/door/airlock/D in A.contents) + return 0 + if(!useResource(10, user)) + return 0 activate() var/obj/machinery/door/airlock/T = new door_type(A) T.name = door_name @@ -233,7 +240,8 @@ RCD to_chat(user, "Deconstructing Wall...") playsound(loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 40 * toolspeed, target = A)) - if(!useResource(5, user)) return 0 + if(!useResource(5, user)) + return 0 activate() var/turf/AT = A AT.ChangeTurf(/turf/simulated/floor/plating) @@ -245,7 +253,8 @@ RCD to_chat(user, "Deconstructing Floor...") playsound(loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 50 * toolspeed, target = A)) - if(!useResource(5, user)) return 0 + if(!useResource(5, user)) + return 0 activate() var/turf/AT = A AT.ChangeTurf(/turf/space) @@ -257,7 +266,8 @@ RCD to_chat(user, "Deconstructing Airlock...") playsound(loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 50 * toolspeed, target = A)) - if(!useResource(20, user)) return 0 + if(!useResource(20, user)) + return 0 activate() qdel(A) return 1 @@ -361,7 +371,7 @@ RCD /obj/item/weapon/rcd/borg/New() ..() - desc = "A device used to rapidly build and deconstruct walls and floors." + desc = "A device used to rapidly build and deconstruct walls, floors and airlocks." canRwall = 1 diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index d480f8f4010..96d48c55b83 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -99,7 +99,7 @@ if(!get_location_accessible(H, "mouth")) to_chat(user, "The mask is in the way.") return - if((C.species && C.species.flags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'... + if((C.species.bodyflags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'... to_chat(user, "You find yourself disappointed at the appalling lack of facial hair.") return if(C.f_style == "Shaved") @@ -130,7 +130,7 @@ if(!get_location_accessible(H, "head")) to_chat(user, "The headgear is in the way.") return - if((C.species && C.species.flags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'... + if((C.species.bodyflags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'... to_chat(user, "You find yourself disappointed at the appalling lack of hair.") return if(C.h_style == "Bald" || C.h_style == "Balding Hair" || C.h_style == "Skinhead") diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 8705b86ea3a..2ac5fb102e1 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -337,105 +337,100 @@ update_icon() defib.cooldowncheck(user) return - if(user.zone_sel && user.zone_sel.selecting == "chest") - user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest.") - busy = 1 - update_icon() - if(do_after(user, 30 * toolspeed, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process - user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.") - playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0) - var/mob/dead/observer/ghost = H.get_ghost() - if(ghost && !ghost.client) - // In case the ghost's not getting deleted for some reason - H.key = ghost.key - log_runtime(EXCEPTION("Ghost of name [ghost.name] is bound to [H.real_name], but lacks a client. Deleting ghost."), src) + user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest.") + busy = 1 + update_icon() + if(do_after(user, 30 * toolspeed, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process + user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.") + playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0) + var/mob/dead/observer/ghost = H.get_ghost() + if(ghost && !ghost.client) + // In case the ghost's not getting deleted for some reason + H.key = ghost.key + log_runtime(EXCEPTION("Ghost of name [ghost.name] is bound to [H.real_name], but lacks a client. Deleting ghost."), src) - qdel(ghost) - ghost = null - var/tplus = world.time - H.timeofdeath - var/tlimit = 1800 //past this much time the patient is unrecoverable (in deciseconds) - var/tloss = 600 //brain damage starts setting in on the patient after some time left rotting - var/total_burn = 0 - var/total_brute = 0 - if(do_after(user, 20 * toolspeed, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total - for(var/obj/item/carried_item in H.contents) - if(istype(carried_item, /obj/item/clothing/suit/space)) - if(!defib.combat) - user.visible_message("[defib] buzzes: Patient's chest is obscured. Operation aborted.") - playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) - busy = 0 - update_icon() - return - if(H.undergoing_cardiac_arrest()) - if(!H.get_int_organ(/obj/item/organ/internal/heart) && !H.get_int_organ(/obj/item/organ/internal/brain/slime)) //prevents defibing someone still alive suffering from a heart attack attack if they lack a heart - user.visible_message("[defib] buzzes: Resuscitation failed - Failed to pick up any heart electrical activity.") + QDEL_NULL(ghost) + var/tplus = world.time - H.timeofdeath + var/tlimit = 1800 //past this much time the patient is unrecoverable (in deciseconds) + var/tloss = 600 //brain damage starts setting in on the patient after some time left rotting + var/total_burn = 0 + var/total_brute = 0 + if(do_after(user, 20 * toolspeed, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total + for(var/obj/item/carried_item in H.contents) + if(istype(carried_item, /obj/item/clothing/suit/space)) + if(!defib.combat) + user.visible_message("[defib] buzzes: Patient's chest is obscured. Operation aborted.") playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) busy = 0 update_icon() return - else - H.set_heartattack(FALSE) - user.visible_message("[defib] pings: Cardiac arrhythmia corrected.") - M.visible_message("[M]'s body convulses a bit.") - playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) - playsound(get_turf(src), "bodyfall", 50, 1) - playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) - defib.deductcharge(revivecost) - busy = 0 - cooldown = 1 - update_icon() - defib.cooldowncheck(user) - return - if(H.stat == DEAD) - var/health = H.health - M.visible_message("[M]'s body convulses a bit.") - playsound(get_turf(src), "bodyfall", 50, 1) - playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) - for(var/obj/item/organ/external/O in H.bodyparts) - total_brute += O.brute_dam - total_burn += O.burn_dam - if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations) && (H.get_int_organ(/obj/item/organ/internal/heart) || H.get_int_organ(/obj/item/organ/internal/brain/slime))) - tobehealed = min(health + threshold, 0) // It's HILARIOUS without this min statement, let me tell you - tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived - H.adjustOxyLoss(tobehealed) - H.adjustToxLoss(tobehealed) - H.adjustFireLoss(tobehealed) - H.adjustBruteLoss(tobehealed) - user.visible_message("[defib] pings: Resuscitation successful.") - playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) - H.update_revive(FALSE) - H.KnockOut(FALSE) - H.Paralyse(5) - H.emote("gasp") - if(tplus > tloss) - H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100)))) - defib.deductcharge(revivecost) - add_logs(user, M, "revived", object="defibrillator") - else - if(tplus > tlimit|| !H.get_int_organ(/obj/item/organ/internal/heart)) - user.visible_message("[defib] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.") - else if(total_burn >= 180 || total_brute >= 180) - user.visible_message("[defib] buzzes: Resuscitation failed - Severe tissue damage detected.") - else if(ghost) - user.visible_message("[defib] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.") - to_chat(ghost, "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)") - window_flash(ghost.client) - ghost << sound('sound/effects/genetics.ogg') - else - user.visible_message("[defib] buzzes: Resuscitation failed.") - playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) - defib.deductcharge(revivecost) - update_icon() - cooldown = 1 - defib.cooldowncheck(user) - else - user.visible_message("[defib] buzzes: Patient is not in a valid state. Operation aborted.") + if(H.undergoing_cardiac_arrest()) + if(!H.get_int_organ(/obj/item/organ/internal/heart) && !H.get_int_organ(/obj/item/organ/internal/brain/slime)) //prevents defibing someone still alive suffering from a heart attack attack if they lack a heart + user.visible_message("[defib] buzzes: Resuscitation failed - Failed to pick up any heart electrical activity.") playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) - busy = 0 - update_icon() - else - to_chat(user, "You need to target your patient's chest with [src].") - return + busy = 0 + update_icon() + return + else + H.set_heartattack(FALSE) + user.visible_message("[defib] pings: Cardiac arrhythmia corrected.") + M.visible_message("[M]'s body convulses a bit.") + playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) + playsound(get_turf(src), "bodyfall", 50, 1) + playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) + defib.deductcharge(revivecost) + busy = 0 + cooldown = 1 + update_icon() + defib.cooldowncheck(user) + return + if(H.stat == DEAD) + var/health = H.health + M.visible_message("[M]'s body convulses a bit.") + playsound(get_turf(src), "bodyfall", 50, 1) + playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) + for(var/obj/item/organ/external/O in H.bodyparts) + total_brute += O.brute_dam + total_burn += O.burn_dam + if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations) && (H.get_int_organ(/obj/item/organ/internal/heart) || H.get_int_organ(/obj/item/organ/internal/brain/slime))) + tobehealed = min(health + threshold, 0) // It's HILARIOUS without this min statement, let me tell you + tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived + H.adjustOxyLoss(tobehealed) + H.adjustToxLoss(tobehealed) + H.adjustFireLoss(tobehealed) + H.adjustBruteLoss(tobehealed) + user.visible_message("[defib] pings: Resuscitation successful.") + playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) + H.update_revive(FALSE) + H.KnockOut(FALSE) + H.Paralyse(5) + H.emote("gasp") + if(tplus > tloss) + H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100)))) + defib.deductcharge(revivecost) + add_logs(user, M, "revived", object="defibrillator") + else + if(tplus > tlimit|| !H.get_int_organ(/obj/item/organ/internal/heart)) + user.visible_message("[defib] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.") + else if(total_burn >= 180 || total_brute >= 180) + user.visible_message("[defib] buzzes: Resuscitation failed - Severe tissue damage detected.") + else if(ghost) + user.visible_message("[defib] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.") + to_chat(ghost, "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)") + window_flash(ghost.client) + ghost << sound('sound/effects/genetics.ogg') + else + user.visible_message("[defib] buzzes: Resuscitation failed.") + playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) + defib.deductcharge(revivecost) + update_icon() + cooldown = 1 + defib.cooldowncheck(user) + else + user.visible_message("[defib] buzzes: Patient is not in a valid state. Operation aborted.") + playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) + busy = 0 + update_icon() /obj/item/weapon/borg_defib name = "defibrillator paddles" @@ -487,80 +482,75 @@ cooldown = 0 update_icon() return - if(user.zone_sel && user.zone_sel.selecting == "chest") - user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest.") - busy = 1 - update_icon() - if(do_after(user, 30 * toolspeed, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process - user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.") - playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0) - var/mob/dead/observer/ghost = H.get_ghost() - if(ghost && !ghost.client) - // In case the ghost's not getting deleted for some reason - H.key = ghost.key - log_runtime(EXCEPTION("Ghost of name [ghost.name] is bound to [H.real_name], but lacks a client. Deleting ghost."), H) + user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest.") + busy = 1 + update_icon() + if(do_after(user, 30 * toolspeed, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process + user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.") + playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0) + var/mob/dead/observer/ghost = H.get_ghost() + if(ghost && !ghost.client) + // In case the ghost's not getting deleted for some reason + H.key = ghost.key + log_runtime(EXCEPTION("Ghost of name [ghost.name] is bound to [H.real_name], but lacks a client. Deleting ghost."), H) - qdel(ghost) - ghost = null - var/tplus = world.time - H.timeofdeath - var/tlimit = 1800 //past this much time the patient is unrecoverable (in deciseconds) - var/tloss = 600 //brain damage starts setting in on the patient after some time left rotting - var/total_burn = 0 - var/total_brute = 0 - if(do_after(user, 20 * toolspeed, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total - if(H.stat == 2) - var/health = H.health - M.visible_message("[M]'s body convulses a bit.") - playsound(get_turf(src), "bodyfall", 50, 1) - playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) - for(var/obj/item/organ/external/O in H.bodyparts) - total_brute += O.brute_dam - total_burn += O.burn_dam - if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations)) - tobehealed = min(health + threshold, 0) // It's HILARIOUS without this min statement, let me tell you - tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived - H.adjustOxyLoss(tobehealed) - H.adjustToxLoss(tobehealed) - H.adjustFireLoss(tobehealed) - H.adjustBruteLoss(tobehealed) - user.visible_message("[user] pings: Resuscitation successful.") - playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) - H.update_revive(FALSE) - H.KnockOut(FALSE) - H.Paralyse(5) - H.emote("gasp") - if(tplus > tloss) - H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100)))) - if(isrobot(user)) - var/mob/living/silicon/robot/R = user - R.cell.use(revivecost) - add_logs(user, M, "revived", object="defibrillator") - else - if(tplus > tlimit) - user.visible_message("[user] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.") - else if(total_burn >= 180 || total_brute >= 180) - user.visible_message("[user] buzzes: Resuscitation failed - Severe tissue damage detected.") - else if(ghost) - user.visible_message("[user] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.") - to_chat(ghost, "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)") - window_flash(ghost.client) - ghost << sound('sound/effects/genetics.ogg') - else - user.visible_message("[user] buzzes: Resuscitation failed.") - playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) - if(isrobot(user)) - var/mob/living/silicon/robot/R = user - R.cell.use(revivecost) - update_icon() - cooldown = 1 - spawn(50) - cooldown = 0 - update_icon() + QDEL_NULL(ghost) + var/tplus = world.time - H.timeofdeath + var/tlimit = 1800 //past this much time the patient is unrecoverable (in deciseconds) + var/tloss = 600 //brain damage starts setting in on the patient after some time left rotting + var/total_burn = 0 + var/total_brute = 0 + if(do_after(user, 20 * toolspeed, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total + if(H.stat == 2) + var/health = H.health + M.visible_message("[M]'s body convulses a bit.") + playsound(get_turf(src), "bodyfall", 50, 1) + playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) + for(var/obj/item/organ/external/O in H.bodyparts) + total_brute += O.brute_dam + total_burn += O.burn_dam + if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations)) + tobehealed = min(health + threshold, 0) // It's HILARIOUS without this min statement, let me tell you + tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived + H.adjustOxyLoss(tobehealed) + H.adjustToxLoss(tobehealed) + H.adjustFireLoss(tobehealed) + H.adjustBruteLoss(tobehealed) + user.visible_message("[user] pings: Resuscitation successful.") + playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) + H.update_revive(FALSE) + H.KnockOut(FALSE) + H.Paralyse(5) + H.emote("gasp") + if(tplus > tloss) + H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100)))) + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + R.cell.use(revivecost) + add_logs(user, M, "revived", object="defibrillator") else - user.visible_message("[user] buzzes: Patient is not in a valid state. Operation aborted.") + if(tplus > tlimit) + user.visible_message("[user] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.") + else if(total_burn >= 180 || total_brute >= 180) + user.visible_message("[user] buzzes: Resuscitation failed - Severe tissue damage detected.") + else if(ghost) + user.visible_message("[user] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.") + to_chat(ghost, "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)") + window_flash(ghost.client) + ghost << sound('sound/effects/genetics.ogg') + else + user.visible_message("[user] buzzes: Resuscitation failed.") playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) - busy = 0 - update_icon() - else - to_chat(user, "You need to target your patient's chest with [src].") - return + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + R.cell.use(revivecost) + update_icon() + cooldown = 1 + spawn(50) + cooldown = 0 + update_icon() + else + user.visible_message("[user] buzzes: Patient is not in a valid state. Operation aborted.") + playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) + busy = 0 + update_icon() diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index b583b3e2c25..59b5f487044 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -74,7 +74,7 @@ H = M 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 + if(!(NOCLONE in M.mutations) && !(H && (NO_DNA in H.species.species_traits))) // prevents drained people from having their DNA changed var/prev_ue = M.dna.unique_enzymes var/mutflags = 0 // UI in syringe. @@ -113,7 +113,7 @@ if(ishuman(M)) // Would've done this via species instead of type, but the basic mob doesn't have a species, go figure. var/mob/living/carbon/human/H = M - if(H.species.flags & NO_DNA) + if(NO_DNA in H.species.species_traits) return 0 if(!user.IsAdvancedToolUser()) diff --git a/code/game/objects/items/weapons/dnascrambler.dm b/code/game/objects/items/weapons/dnascrambler.dm index e691fce0961..8e6dcc7e4dd 100644 --- a/code/game/objects/items/weapons/dnascrambler.dm +++ b/code/game/objects/items/weapons/dnascrambler.dm @@ -19,40 +19,41 @@ if(!ishuman(M) || !ishuman(user)) return - if(src.used) + if(used) return if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species.flags & NO_DNA) + if(NO_DNA in H.species.species_traits) to_chat(user, "You failed to inject [M], as they have no DNA to scramble, nor flesh to inject.") return if(M == user) user.visible_message("[user] injects \himself with [src]!") - src.injected(user,user) + injected(user, user) else user.visible_message("[user] is trying to inject [M] with [src]!") if(do_mob(user,M,30)) user.visible_message("[user] injects [M] with [src].") - src.injected(M, user) + injected(M, user) else to_chat(user, "You failed to inject [M].") - proc/injected(var/mob/living/carbon/target, var/mob/living/carbon/user) - scramble(1, target, 100) - target.generate_name() - if(istype(target, /mob/living/carbon/human)) + proc/injected(var/mob/living/carbon/human/target, var/mob/living/carbon/user) + if(istype(target)) var/mob/living/carbon/human/H = target + scramble(1, H, 100) + H.real_name = random_name(H.gender, H.species.name) //Give them a name that makes sense for their species. H.sync_organ_dna(assimilate = 1) H.update_body(0) - H.reset_hair() // No more winding up with hairstyles you're not supposed to have, and blowing your cover + H.reset_hair() //No more winding up with hairstyles you're not supposed to have, and blowing your cover. + H.reset_markings() //...Or markings. H.dna.ResetUIFrom(H) target.update_icons() log_attack("[key_name(user)] injected [key_name(target)] with the [name]") log_game("[key_name_admin(user)] injected [key_name_admin(target)] with the [name]") - src.used = 1 - src.update_icon() - src.name = "used " + src.name \ No newline at end of file + used = 1 + update_icon() + name = "used " + name diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index ea89aab651c..58de51085de 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -61,7 +61,7 @@ nadeassembly.attack_self(user) return var/newtime = input(usr, "Please set the timer.", "Timer", 10) as num - if(user.get_active_hand() == src) + if(user.is_in_active_hand(src)) newtime = Clamp(newtime, 10, 60000) det_time = newtime to_chat(user, "Timer set for [det_time] seconds.") diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index f02eb57ae8b..024783359b5 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -62,7 +62,7 @@ /obj/item/weapon/flamethrower/afterattack(atom/target, mob/user, flag) if(flag) return // too close // Make sure our user is still holding us - if(user && user.get_active_hand() == src) + if(user && user.is_in_active_hand(src)) var/turf/target_turf = get_turf(target) if(target_turf) var/turflist = getline(user, target_turf) diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 4e558f7b64e..c5e487d1685 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -72,7 +72,7 @@ /obj/item/weapon/lipstick/random, /obj/item/weapon/grenade/smokebomb, /obj/item/weapon/grown/corncob, - /obj/item/weapon/contraband/poster, + /obj/item/weapon/poster/random_contraband, /obj/item/weapon/bikehorn, /obj/item/weapon/beach_ball, /obj/item/weapon/beach_ball/holoball, @@ -88,8 +88,8 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, /obj/item/device/paicard, - /obj/item/device/violin, - /obj/item/device/guitar, + /obj/item/device/instrument/violin, + /obj/item/device/instrument/guitar, /obj/item/weapon/storage/belt/utility/full, /obj/item/clothing/accessory/horrible, /obj/random/carp_plushie, diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index f21914a7c32..707eac2fbce 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -19,6 +19,9 @@ var/obj/item/device/assembly_holder/nadeassembly = null var/label = null var/assemblyattacher + var/ignition_temp = 10 // The amount of heat added to the reagents when this grenade goes off. + var/threatscale = 1 // Used by advanced grenades to make them slightly more worthy. + var/no_splash = FALSE //If the grenade deletes even if it has no reagents to splash with. Used for slime core reactions. /obj/item/weapon/grenade/chem_grenade/New() create_reagents(1000) @@ -99,6 +102,7 @@ log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])") bombers += "[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])" to_chat(user, "You prime the [name]! [det_time / 10] second\s!") + playsound(user.loc, 'sound/weapons/armbomb.ogg', 60, 1) active = 1 update_icon() if(iscarbon(user)) @@ -264,13 +268,18 @@ if(stage != READY) return - var/has_reagents = 0 + var/list/datum/reagents/reactants = list() for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - if(G.reagents.total_volume) - has_reagents = 1 + reactants += G.reagents - if(!has_reagents) - playsound(loc, usesound, 50, 1) + if(!chem_splash(get_turf(src), affected_area, reactants, ignition_temp, threatscale) && !no_splash) + playsound(loc, 'sound/items/Screwdriver2.ogg', 50, 1) + if(beakers.len) + for(var/obj/O in beakers) + O.forceMove(get_turf(src)) + beakers = list() + stage = EMPTY + update_icon() return if(nadeassembly) @@ -281,31 +290,9 @@ message_admins("grenade primed by an assembly, attached by [key_name_admin(M)](?) ([admin_jump_link(M)]) and last touched by [key_name_admin(last)](?) ([admin_jump_link(last)]) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).") log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])") - playsound(loc, 'sound/effects/bamf.ogg', 50, 1) - update_mob() - invisibility = INVISIBILITY_MAXIMUM //kaboom - qdel(nadeassembly) // do this now to stop infrared beams - var/end_temp = 0 - for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - G.reagents.trans_to(src, G.reagents.total_volume) - end_temp += G.reagents.chem_temp - reagents.chem_temp = end_temp - if(reagents.total_volume) //The possible reactions didnt use up all reagents. - var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread() - steam.set_up(10, 0, get_turf(src)) - steam.attach(src) - steam.start() - - for(var/atom/A in view(affected_area, loc)) - if(A == src) - continue - reagents.reaction(A, 1, 10) - - - spawn(15) //Making sure all reagents can work - qdel(src) //correctly before deleting the grenade. + qdel(src) /obj/item/weapon/grenade/chem_grenade/proc/CreateDefaultTrigger(var/typekey) if(ispath(typekey,/obj/item/device/assembly)) @@ -327,64 +314,37 @@ //Large chem grenades accept slime cores and use the appropriately. /obj/item/weapon/grenade/chem_grenade/large name = "large grenade casing" - desc = "For oversized grenades; fits additional contents and affects a greater area." + desc = "A custom made large grenade. It affects a larger area." icon_state = "large_grenade" bomb_state = "largebomb" allowed_containers = list(/obj/item/weapon/reagent_containers/glass,/obj/item/weapon/reagent_containers/food/condiment, /obj/item/weapon/reagent_containers/food/drinks) origin_tech = "combat=3;engineering=3" - affected_area = 4 - + affected_area = 5 + ignition_temp = 25 // Large grenades are slightly more effective at setting off heat-sensitive mixtures than smaller grenades. + threatscale = 1.1 // 10% more effective. /obj/item/weapon/grenade/chem_grenade/large/prime() if(stage != READY) return - var/has_reagents = 0 - var/obj/item/slime_extract/valid_core = null + for(var/obj/item/slime_extract/S in beakers) + if(S.Uses) + for(var/obj/item/weapon/reagent_containers/glass/G in beakers) + G.reagents.trans_to(S, G.reagents.total_volume) - for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - if(!istype(G)) continue - if(G.reagents.total_volume) has_reagents = 1 - for(var/obj/item/slime_extract/E in beakers) - if(!istype(E)) continue - if(E.Uses) valid_core = E - if(E.reagents.total_volume) has_reagents = 1 + //If there is still a core (sometimes it's used up) + //and there are reagents left, behave normally, + //otherwise drop it on the ground for timed reactions like gold. - if(!has_reagents) - playsound(loc, prime_sound, 50, 1) - return - - playsound(loc, 'sound/effects/bamf.ogg', 50, 1) - - update_mob() - - if(valid_core) - for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - G.reagents.trans_to(valid_core, G.reagents.total_volume) - - //If there is still a core (sometimes it's used up) - //and there are reagents left, behave normally - - if(valid_core && valid_core.reagents && valid_core.reagents.total_volume) - valid_core.reagents.trans_to(src,valid_core.reagents.total_volume) - else - for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - G.reagents.trans_to(src, G.reagents.total_volume) - - if(reagents.total_volume) //The possible reactions didnt use up all reagents. - var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread() - steam.set_up(10, 0, get_turf(src)) - steam.attach(src) - steam.start() - - for(var/atom/A in view(affected_area, loc)) - if( A == src ) continue - reagents.reaction(A, 1, 10) - - invisibility = INVISIBILITY_MAXIMUM //Why am i doing this? - spawn(50) //To make sure all reagents can work - qdel(src) //correctly before deleting the grenade. + if(S) + if(S.reagents && S.reagents.total_volume) + for(var/obj/item/weapon/reagent_containers/glass/G in beakers) + S.reagents.trans_to(G, S.reagents.total_volume) + else + S.forceMove(get_turf(src)) + no_splash = TRUE + ..() //I tried to just put it in the allowed_containers list but @@ -399,6 +359,71 @@ else return ..() +/obj/item/weapon/grenade/chem_grenade/cryo // Intended for rare cryogenic mixes. Cools the area moderately upon detonation. + name = "cryo grenade" + desc = "A custom made cryogenic grenade. It rapidly cools its contents upon detonation." + icon_state = "cryog" + affected_area = 2 + ignition_temp = -100 + +/obj/item/weapon/grenade/chem_grenade/pyro // Intended for pyrotechnical mixes. Produces a small fire upon detonation, igniting potentially flammable mixtures. + name = "pyro grenade" + desc = "A custom made pyrotechnical grenade. It heats up and ignites its contents upon detonation." + icon_state = "pyrog" + origin_tech = "combat=4;engineering=4" + affected_area = 3 + ignition_temp = 500 // This is enough to expose a hotspot. + +/obj/item/weapon/grenade/chem_grenade/adv_release // Intended for weaker, but longer lasting effects. Could have some interesting uses. + name = "advanced release grenade" + desc = "A custom made advanced release grenade. It is able to be detonated more than once. Can be configured using a multitool." + icon_state = "timeg" + origin_tech = "combat=3;engineering=4" + var/unit_spread = 10 // Amount of units per repeat. Can be altered with a multitool. + +/obj/item/weapon/grenade/chem_grenade/adv_release/attackby(obj/item/I, mob/user, params) + if(ismultitool(I)) + switch(unit_spread) + if(0 to 24) + unit_spread += 5 + if(25 to 99) + unit_spread += 25 + else + unit_spread = 5 + to_chat(user, " You set the time release to [unit_spread] units per detonation.") + return + ..() + +/obj/item/weapon/grenade/chem_grenade/adv_release/prime() + if(stage != READY) + return + + var/total_volume = 0 + for(var/obj/item/weapon/reagent_containers/RC in beakers) + total_volume += RC.reagents.total_volume + if(!total_volume) + qdel(src) + qdel(nadeassembly) + return + var/fraction = unit_spread/total_volume + var/datum/reagents/reactants = new(unit_spread) + reactants.my_atom = src + for(var/obj/item/weapon/reagent_containers/RC in beakers) + RC.reagents.trans_to(reactants, RC.reagents.total_volume*fraction, threatscale, 1, 1) + chem_splash(get_turf(src), affected_area, list(reactants), ignition_temp, threatscale) + + if(nadeassembly) + var/mob/M = get_mob_by_ckey(assemblyattacher) + var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast) + var/turf/T = get_turf(src) + var/area/A = get_area(T) + message_admins("grenade primed by an assembly, attached by [key_name_admin(M)](?) (FLW) and last touched by [key_name_admin(last)](?) (FLW) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).") + log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])") + else + addtimer(src, "prime", det_time) + var/turf/DT = get_turf(src) + var/area/DA = get_area(DT) + log_game("A grenade detonated at [DA.name] ([DT.x], [DT.y], [DT.z])") /obj/item/weapon/grenade/chem_grenade/metalfoam payload_name = "metal foam" diff --git a/code/game/objects/items/weapons/grenades/clowngrenade.dm b/code/game/objects/items/weapons/grenades/clowngrenade.dm index 0d24bd80a95..c6ab7d376c1 100644 --- a/code/game/objects/items/weapons/grenades/clowngrenade.dm +++ b/code/game/objects/items/weapons/grenades/clowngrenade.dm @@ -58,7 +58,7 @@ var/mob/living/carbon/M = AM if(ishuman(M)) if(isobj(M:shoes)) - if((M:shoes.flags&NOSLIP) || (M:species.bodyflags & FEET_NOSLIP)) + if(M:shoes.flags & NOSLIP) return else to_chat(M, "Your feet feel like they're on fire!") diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 88abd66913f..a5998591d08 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -32,7 +32,7 @@ /*/obj/item/weapon/grenade/afterattack(atom/target as mob|obj|turf|area, mob/user as mob) if(istype(target, /obj/item/weapon/storage)) return ..() // Trying to put it in a full container if(istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..() - if((user.get_active_hand() == src) && (!active) && (clown_check(user)) && target.loc != src.loc) + if((user.is_in_active_hand(src)) && (!active) && (clown_check(user)) && target.loc != src.loc) to_chat(user, "You prime the [name]! [det_time/10] seconds!") active = 1 icon_state = initial(icon_state) + "_active" diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index f22c706d4f5..0b7850bba1f 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -104,6 +104,10 @@ /obj/item/weapon/restraints/handcuffs/cable/white color = COLOR_WHITE +/obj/item/weapon/restraints/handcuffs/cable/random/New() + color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN) + ..() + /obj/item/weapon/restraints/handcuffs/alien icon_state = "handcuffAlien" diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index c4c4175d2fa..968aac67272 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -100,7 +100,6 @@ slot_flags = SLOT_BACK|SLOT_BELT block_chance = 30 sharp = 1 - edge = 1 hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") @@ -187,7 +186,6 @@ armour_penetration = 35 slot_flags = SLOT_BACK sharp = 1 - edge = 1 attack_verb = list("chopped", "sliced", "cut", "reaped") hitsound = 'sound/weapons/rapierhit.ogg' @@ -266,7 +264,6 @@ w_class = WEIGHT_CLASS_HUGE flags = NODROP | ABSTRACT sharp = 1 - edge = 1 attack_verb = list("sawed", "torn", "cut", "chopped", "diced") hitsound = 'sound/weapons/chainsaw.ogg' @@ -278,7 +275,6 @@ desc = "Used for absolutely hilarious sacrifices." hitsound = 'sound/items/bikehorn.ogg' sharp = 1 - edge = 1 attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut", "honked") /obj/item/weapon/nullrod/whip @@ -324,7 +320,6 @@ flags = ABSTRACT | NODROP w_class = WEIGHT_CLASS_HUGE sharp = 1 - edge = 1 /obj/item/weapon/nullrod/carp name = "carp-sie plushie" @@ -354,7 +349,6 @@ block_chance = 40 slot_flags = SLOT_BACK sharp = 0 - edge = 0 hitsound = "swing_hit" attack_verb = list("smashed", "slammed", "whacked", "thwacked") icon = 'icons/obj/weapons.dmi' @@ -368,7 +362,6 @@ w_class = WEIGHT_CLASS_HUGE desc = "They say fear is the true mind killer, but stabbing them in the head works too. Honour compels you to not sheathe it once drawn." sharp = 1 - edge = 1 slot_flags = null flags = HANDSLOW hitsound = 'sound/weapons/bladeslice.ogg' @@ -394,7 +387,6 @@ attack_verb = list("poked", "impaled", "pierced", "jabbed") hitsound = 'sound/weapons/bladeslice.ogg' sharp = 1 - edge = 1 /obj/item/weapon/nullrod/rosary name = "prayer beads" diff --git a/code/game/objects/items/weapons/implants/implant_death_alarm.dm b/code/game/objects/items/weapons/implants/implant_death_alarm.dm index da9560122ad..d4807a18701 100644 --- a/code/game/objects/items/weapons/implants/implant_death_alarm.dm +++ b/code/game/objects/items/weapons/implants/implant_death_alarm.dm @@ -35,7 +35,7 @@ var/mob/M = imp_in var/area/t = get_area(M) - var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null) + var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(src) a.follow_target = M switch(cause) @@ -52,7 +52,7 @@ else a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm") qdel(src) - + qdel(a) /obj/item/weapon/implant/death_alarm/emp_act(severity) //for some reason alarms stop going off in case they are emp'd, even without this diff --git a/code/game/objects/items/weapons/implants/implant_explosive.dm b/code/game/objects/items/weapons/implants/implant_explosive.dm index c02c3ba9fcc..158cab57d88 100644 --- a/code/game/objects/items/weapons/implants/implant_explosive.dm +++ b/code/game/objects/items/weapons/implants/implant_explosive.dm @@ -159,6 +159,11 @@ return 0 to_chat(imp_in, "Your dusting implant activates!") imp_in.visible_message("[imp_in] burns up in a flash!") + for(var/obj/item/I in imp_in.contents) + if(I == src) + continue + if(I.flags & NODROP) + qdel(I) imp_in.dust() /obj/item/weapon/implant/dust/emp_act(severity) diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 13bc85999e0..4bf40a3ae15 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -98,9 +98,7 @@ throw_range = 6 materials = list(MAT_METAL=12000) attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - no_embed = 1 sharp = 1 - edge = 1 /obj/item/weapon/kitchen/knife/suicide_act(mob/user) user.visible_message(pick("[user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \ @@ -114,7 +112,6 @@ icon_state = "pknife" item_state = "knife" sharp = 0 - edge = 0 /obj/item/weapon/kitchen/knife/ritual name = "ritual knife" @@ -151,6 +148,13 @@ origin_tech = "materials=3;combat=4" attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut") +/obj/item/weapon/kitchen/knife/combat/cyborg + name = "cyborg knife" + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "knife" + desc = "A cyborg-mounted plasteel knife. Extremely sharp and durable." + origin_tech = null + /obj/item/weapon/kitchen/knife/carrotshiv name = "carrot shiv" icon_state = "carrotshiv" diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index 973f25e6d2f..88311c5f149 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -1183,9 +1183,9 @@ /obj/item/weapon/book/manual/faxes name = "A Guide to Faxes" - desc = "A NanoTrasen-approved guide to writing faxes" + desc = "A Nanotrasen-approved guide to writing faxes" icon_state = "book6" - author = "NanoTrasen" + author = "Nanotrasen" title = "A Guide to Faxes" dat = {" @@ -1213,14 +1213,14 @@
  • Faxes are your main method of communicating with the NAS Trurl, better known as Central Command.
  • Faxes allow personnel on the station to maintain open lines of communication with the NAS Trurl, allowing for vital information to flow both ways.
  • Being written communications, proper grammar, syntax and typography is required, in addition to a signature and, if applicable, a stamp. Failure to sign faxes will lead to an automatic rejection.
  • -
  • We at NanoTrasen provide Fax Machines to every Head of Staff, in addition to the Magistrate, NanoTrasen Representative, and Internal Affairs Agents.
  • +
  • We at Nanotrasen provide Fax Machines to every Head of Staff, in addition to the Magistrate, Nanotrasen Representative, and Internal Affairs Agents.
  • This means that we trust the recipients of these fax machines to only use them in the proper circumstances (see When to Fax?).
  • When to Fax?


  • While it is up to the discretion of each individual person to decide when to fax Central Command, there are some simple guidelines on when to do this.
  • Firstly, any situation that can reasonably be solved on-site, should be handled on-site. Knowledge of Standard Operating Procedure is mandatory for everyone with access to a fax machine.
  • Resolving issues on-site not only leads to more expedient problem-solving, it also frees up company resources and provides valuable work experience for all parties involved.
  • -
  • This means that you should work with the Heads of Staff concerning personnel and workplace issues, and attempt to resolve situations with them. If, for whatever reason, the relevent Head of Staff is not available or receptive, consider speaking with the Captain and/or NanoTrasen Representative.
  • +
  • This means that you should work with the Heads of Staff concerning personnel and workplace issues, and attempt to resolve situations with them. If, for whatever reason, the relevent Head of Staff is not available or receptive, consider speaking with the Captain and/or Nanotrasen Representative.
  • If, for whatever reason, these issues cannot be solved on-site, either due to incompetence or just plain refusal to cooperate, faxing Central Command becomes a viable option.
  • Secondly, station status reports should be sent occasionally, but never at the start of the shift. Remember, we assign personnel to the station. We do not need a repeat of what we just signed off on.
  • Thirdly, staff/departmental evaluations are always welcome, especially in cases of noticeable (in)competence. Just as a brilliant coworker can be rewarded, an incompetent one can be punished.
  • @@ -2487,7 +2487,7 @@
  • Foreword
  • Captain
  • Head of Personnel
  • -
  • NanoTrasen Representative
  • +
  • Nanotrasen Representative
  • Blueshield Officer
  • AI
  • @@ -2507,9 +2507,9 @@
  • The Captain must keep the Nuclear Authentication Disk on their person at all times or, failing that, in the possession of the Head of Security or Blueshield;
  • The Captain is to attempt to resolve every issue that arises in Command locally before contacting Central Command;
  • The Captain is not permitted to carry their Antique Laser Gun or Space Armor unless there's an immediate emergency that requires attending to;
  • -
  • The Captain, despite being in charge of the Cyberiad, is not independent from NanoTrasen. Any attempts to disregard general company policy are to be considered an instant condition for contract termination;
  • +
  • The Captain, despite being in charge of the Cyberiad, is not independent from Nanotrasen. Any attempts to disregard general company policy are to be considered an instant condition for contract termination;
  • The Captain may only promote personnel to a Acting Head of Staff position if there is no assigned Head of Staff associated with the Department. Said Acting Head of Staff must be a member of the Department they are to lead. See below for more information on Chain of Command;
  • -
  • The Captain may not fire any Head of Staff without reasonable justification (ie, incompetency, criminal activity, or otherwise any action that endangers/compromises the station and/or crew). The Captain may not fire any Central Command VIPs (ie, Blueshield, Magistrate, NanoTrasen Representative) without permission from Central Command, unless they are blatantly acting against the well-being and safety of the crew and station.
  • +
  • The Captain may not fire any Head of Staff without reasonable justification (ie, incompetency, criminal activity, or otherwise any action that endangers/compromises the station and/or crew). The Captain may not fire any Central Command VIPs (ie, Blueshield, Magistrate, Nanotrasen Representative) without permission from Central Command, unless they are blatantly acting against the well-being and safety of the crew and station.

  • Head of Personnel


    @@ -2518,7 +2518,7 @@
  • The Head of Personnel may not give any personnel increased access without authorization from the relevant Head of Staff. This includes the Head of Personnel. In addition, the Head of Personnel may only give Captain-Level access to someone if they are the Acting Captain. This access is to be removed when a proper Captain arrives on the station;
  • The Head of Personnel may not increase any Job Openings unless the relevant Head of Staff approves;
  • The Head of Personnel may not fire any personnel without authorization from the relevant Head of Staff, unless other conditions apply (see Space Law and General Standard Operating Procedure);
  • -
  • The Head of Personnel may not promote any personnel to the following Jobs without authorization from Central Command: Barber, Brig Physician, NanoTrasen Representative, Blueshield, Security Pod Pilot, Mechanic and Magistrate; (This is due to them being karma locked. Do not promote people to these positions without approval from the Administrators);
  • +
  • The Head of Personnel may not promote any personnel to the following Jobs without authorization from Central Command: Barber, Brig Physician, Nanotrasen Representative, Blueshield, Security Pod Pilot, Mechanic and Magistrate; (This is due to them being karma locked. Do not promote people to these positions without approval from the Administrators);
  • The Head of Personnel is free to utilize paperwork at their discretion. However, during major station emergencies, expediency should take precedence over bureaucracy;
  • The Head of Personnel may not leave their office unmanned if there are personnel waiting in line. Failure to respond to personnel with a legitimate request within ten (10) minutes, either via radio or in person, is to be considered a breach of Standard Operating Procedure;
  • Despite nominally being in charge of Supply, the Head of Personnel should allow the Quartermaster to run the Department, unless they prove themselves to be incompetent/dangerous;
  • @@ -2526,13 +2526,13 @@
  • The Head of Personnel is not permitted to perform Security duty. The Head of Personnel is permitted to carry an Energy Gun, for self-defence only.

  • -

    NanoTrasen Representative


    +

    Nanotrasen Representative


      -
    1. The NanoTrasen Representative is to ensure that every Department is following Standard Operating Procedure, up to and including the respective Head of Staff. If a Head of Staff is not available for a Department, the NanoTrasen Representative must ensure that the Captain appoints an Acting Head of Staff for said Department;
    2. -
    3. The NanoTrasen Representative must attempt to resolve any breach of Standard Operating Procedure locally before contacting Central Command. This is an imperative: Standard Operating Procedure should always be followed unless there is a very good reason not to;
    4. -
    5. The NanoTrasen Representative must, together with the Magistrate and Head of Security, ensure that Space Law is being followed and correctly applied;
    6. -
    7. The NanoTrasen Representative may not threaten the use of a fax in order to gain leverage over any personnel, up to and including Command. In addition they may not threaten to fire, or have Central Command, fire anyone, unless they actually possess a demotion note;
    8. -
    9. The NanoTrasen Representative is permitted to carry their Stun-Cane, or a Telescopic Baton if the Stun-Cane is lost.
    10. +
    11. The Nanotrasen Representative is to ensure that every Department is following Standard Operating Procedure, up to and including the respective Head of Staff. If a Head of Staff is not available for a Department, the Nanotrasen Representative must ensure that the Captain appoints an Acting Head of Staff for said Department;
    12. +
    13. The Nanotrasen Representative must attempt to resolve any breach of Standard Operating Procedure locally before contacting Central Command. This is an imperative: Standard Operating Procedure should always be followed unless there is a very good reason not to;
    14. +
    15. The Nanotrasen Representative must, together with the Magistrate and Head of Security, ensure that Space Law is being followed and correctly applied;
    16. +
    17. The Nanotrasen Representative may not threaten the use of a fax in order to gain leverage over any personnel, up to and including Command. In addition they may not threaten to fire, or have Central Command, fire anyone, unless they actually possess a demotion note;
    18. +
    19. The Nanotrasen Representative is permitted to carry their Stun-Cane, or a Telescopic Baton if the Stun-Cane is lost.

    Blueshield Officer


    @@ -2547,14 +2547,14 @@ The following are procedures for AI Maintenance:
    1. Only the Captain or Research Director may enter the AI Upload to perform Law Changes (see below), and only the Captain, Research Director or Chief Engineer may enter the AI Core to perform a Carding (see below);
    2. -
    3. No Law Changes are to be performed without approval from the Captain and Research Director. The only Lawsets to be used are those provided by NanoTrasen. Failure to legally perform a Law Change is to be considered Sabotage. Command must be informed prior to the Law Change, and all objections must be taken into consideration. If the number of Command personnel opposing the Law Change is greater than the number of Command personnel in favour, the Law Change is not to be done. If the Law Change is performed, the crew is to be immediately informed of the new Law(s);
    4. +
    5. No Law Changes are to be performed without approval from the Captain and Research Director. The only Lawsets to be used are those provided by Nanotrasen. Failure to legally perform a Law Change is to be considered Sabotage. Command must be informed prior to the Law Change, and all objections must be taken into consideration. If the number of Command personnel opposing the Law Change is greater than the number of Command personnel in favour, the Law Change is not to be done. If the Law Change is performed, the crew is to be immediately informed of the new Law(s);
    6. The AI may not be Carded unless it it clearly malfunctioning or subverted. However, any member of Command may card it if the AI agrees to it, either at the end of the shift, or due to external circumstances (such as massive damage to the AI Satellite);
    7. The AI Upload and Minisat Antechamber Turrets are to be kept on Non-Lethal in Code Green and Code Blue. The AI Core Turrets are to be kept on Lethal at all times. If a legal Law Change or Carding is occurring, the Turrets are to be disabled;
    8. If the AI Unit is not malfunctioning or subverted, any attempt at performing an illegal Carding or Law Change is to be responded to with non-lethal force. If the illegal attempts persist, and the perpetrator is demonstrably hostile, lethal force from Command/Security is permitted;
    9. Freeform Laws are only to be added if absolutely necessary due to external circumstances (such as major station emergencies). Adding unnecessary Freeform Laws is not permitted. Exception is made if the AI Unit and majority of Command agree to the Freeform Law that is proposed;
    10. -
    11. Any use of the "Purge" Module is to be followed by the upload of a NanoTrasen-approved Lawset immediately. AI Units must be bound to a Lawset at all times.
    12. +
    13. Any use of the "Purge" Module is to be followed by the upload of a Nanotrasen-approved Lawset immediately. AI Units must be bound to a Lawset at all times.

    - "} \ No newline at end of file + "} diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 1c1dbbd8363..afbea9b4c17 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -6,7 +6,6 @@ var/w_class_on = WEIGHT_CLASS_BULKY var/icon_state_on = "axe1" var/list/attack_verb_on = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - no_embed = 1 // Physically impossible for energy weapons to embed themselves into people, this should fix that. -- Dave hitsound = 'sound/weapons/blade1.ogg' // Probably more appropriate than the previous hitsound. -- Dave usesound = 'sound/weapons/blade1.ogg' toolspeed = 1 @@ -25,6 +24,7 @@ force = force_on throwforce = throwforce_on hitsound = 'sound/weapons/blade1.ogg' + throw_speed = 4 if(attack_verb_on.len) attack_verb = attack_verb_on if(!item_color) @@ -38,6 +38,7 @@ force = initial(force) throwforce = initial(throwforce) hitsound = initial(hitsound) + throw_speed = initial(throw_speed) if(attack_verb_on.len) attack_verb = list() icon_state = initial(icon_state) @@ -70,7 +71,6 @@ attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") attack_verb_on = list() sharp = 1 - edge = 1 /obj/item/weapon/melee/energy/axe/suicide_act(mob/user) user.visible_message("[user] swings the [src.name] towards /his head! It looks like \he's trying to commit suicide.") @@ -85,11 +85,12 @@ throw_speed = 3 throw_range = 5 hitsound = "swing_hit" + embed_chance = 75 + embedded_impact_pain_multiplier = 10 armour_penetration = 35 origin_tech = "combat=3;magnets=4;syndicate=4" block_chance = 50 sharp = 1 - edge = 1 var/hacked = 0 var/blade_color @@ -121,7 +122,6 @@ force_on = 30 force = 18 //About as much as a spear sharp = 1 - edge = 1 hitsound = 'sound/weapons/circsawhit.ogg' icon = 'icons/obj/surgery.dmi' icon_state = "esaw_0" @@ -200,26 +200,28 @@ name = "energy blade" desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal." icon_state = "blade" - force = 30 - sharp = 1 - edge = 1 + force = 30 //Normal attacks deal esword damage + hitsound = 'sound/weapons/blade1.ogg' + active = 1 throwforce = 1//Throwing or dropping the item deletes it. throw_speed = 3 throw_range = 1 w_class = WEIGHT_CLASS_BULKY //So you can't hide it in your pocket or some such. - armour_penetration = 50 - attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") var/datum/effect/system/spark_spread/spark_system + sharp = 1 //Most of the other special functions are handled in their own files. aka special snowflake code so kewl /obj/item/weapon/melee/energy/blade/New() + ..() spark_system = new /datum/effect/system/spark_spread() spark_system.set_up(5, 0, src) spark_system.attach(src) -/obj/item/weapon/melee/energy/blade/dropped() - ..() - qdel(src) - /obj/item/weapon/melee/energy/blade/attack_self(mob/user) return + +/obj/item/weapon/melee/energy/blade/hardlight + name = "hardlight blade" + desc = "An extremely sharp blade made out of hard light. Packs quite a punch." + icon_state = "lightblade" + item_state = "lightblade" \ No newline at end of file diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index f4ccf9fac65..22f4393c94f 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -32,7 +32,6 @@ block_chance = 50 armour_penetration = 75 sharp = 1 - edge = 1 origin_tech = "combat=5" attack_verb = list("lunged at", "stabbed") hitsound = 'sound/weapons/rapierhit.ogg' diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 93144dc6c17..b7e60411bc5 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -1,12 +1,10 @@ -#define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) - /obj/item/weapon/mop desc = "The world of janitalia wouldn't be complete without a mop." name = "mop" icon = 'icons/obj/janitor.dmi' icon_state = "mop" - force = 3.0 - throwforce = 5.0 + force = 3 + throwforce = 5 throw_speed = 3 throw_range = 7 w_class = WEIGHT_CLASS_NORMAL @@ -43,23 +41,25 @@ to_chat(user, "Your mop is dry!") return - var/turf/simulated/turf = A - if(is_cleanable(A)) - turf = A.loc - A = null + var/turf/simulated/T = get_turf(A) - if(istype(turf)) - user.visible_message("[user] begins to clean \the [turf] with [src].", "You begin to clean \the [turf] with [src]...") + if(istype(A, /obj/item/weapon/reagent_containers/glass/bucket) || istype(A, /obj/structure/janitorialcart)) + return - if(do_after(user, src.mopspeed, target = turf)) + if(istype(T)) + user.visible_message("[user] begins to clean [T] with [src].", "You begin to clean [T] with [src]...") + + if(do_after(user, src.mopspeed, target = T)) to_chat(user, "You finish mopping.") - clean(turf) + clean(T) /obj/effect/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/mop) || istype(I, /obj/item/weapon/soap)) return - ..() + else + return ..() + /obj/item/weapon/mop/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) J.put_in_cart(src, user) @@ -75,22 +75,47 @@ /obj/item/weapon/mop/advanced desc = "The most advanced tool in a custodian's arsenal. Just think of all the viscera you will clean up with this!" name = "advanced mop" - mopcap = 15 + mopcap = 10 icon_state = "advmop" - item_state = "mop" //meh will do for now until TG makes one + item_state = "mop" origin_tech = "materials=3;engineering=3" force = 6 throwforce = 8 throw_range = 4 - mopspeed = 10 + mopspeed = 20 + var/refill_enabled = TRUE //Self-refill toggle for when a janitor decides to mop with something other than water. + var/refill_rate = 1 //Rate per process() tick mop refills itself + var/refill_reagent = "water" //Determins what reagent to use for refilling, just in case someone wanted to make a HOLY MOP OF PURGING + +/obj/item/weapon/mop/advanced/New() + ..() + processing_objects.Add(src) + +/obj/item/weapon/mop/advanced/attack_self(mob/user) + refill_enabled = !refill_enabled + if(refill_enabled) + processing_objects.Add(src) + else + processing_objects.Remove(src) + to_chat(user, "You set the condenser switch to the '[refill_enabled ? "ON" : "OFF"]' position.") + playsound(user, 'sound/machines/click.ogg', 30, 1) + +/obj/item/weapon/mop/advanced/process() + + if(reagents.total_volume < mopcap) + reagents.add_reagent(refill_reagent, refill_rate) + +/obj/item/weapon/mop/advanced/examine(mob/user) + ..() + to_chat(user, "The condenser switch is set to [refill_enabled ? "ON" : "OFF"].") + +/obj/item/weapon/mop/advanced/Destroy() + if(refill_enabled) + processing_objects.Remove(src) + return ..() + /obj/item/weapon/mop/advanced/cyborg - mopcap = 40 -/obj/item/weapon/mop/advanced/cyborg/New() - ..() - reagents.add_reagent("water", mopcap) - -/obj/item/weapon/mop/advanced/cyborg/examine(mob/user) - ..(user) - to_chat(user, "The mop's water tank has [round(reagents.get_reagent_amount("water"))] units of water left.") +/obj/item/weapon/mop/advanced/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J) + return \ No newline at end of file diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm index 218fe47ed6b..ec6f285acd1 100644 --- a/code/game/objects/items/weapons/powerfist.dm +++ b/code/game/objects/items/weapons/powerfist.dm @@ -26,17 +26,17 @@ to_chat(user, "You'll need to get closer to see any more.") return if(tank) - to_chat(user, "\icon [tank] It has \the [tank] mounted onto it.") + to_chat(user, "[bicon(tank)] It has [tank] mounted onto it.") /obj/item/weapon/melee/powerfist/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/tank)) if(!tank) var/obj/item/weapon/tank/IT = W if(IT.volume <= 3) - to_chat(user, "\The [IT] is too small for \the [src].") + to_chat(user, "[IT] is too small for [src].") return updateTank(W, 0, user) - else if(istype(W, /obj/item/weapon/wrench)) + else if(iswrench(W)) switch(fisto_setting) if(1) fisto_setting = 2 @@ -45,8 +45,8 @@ if(3) fisto_setting = 1 playsound(loc, W.usesound, 50, 1) - to_chat(user, "You tweak \the [src]'s piston valve to [fisto_setting].") - else if(istype(W, /obj/item/weapon/screwdriver)) + to_chat(user, "You tweak [src]'s piston valve to [fisto_setting].") + else if(isscrewdriver(W)) if(tank) updateTank(tank, 1, user) @@ -54,29 +54,29 @@ /obj/item/weapon/melee/powerfist/proc/updateTank(obj/item/weapon/tank/thetank, removing = 0, mob/living/carbon/human/user) if(removing) if(!tank) - to_chat(user, "\The [src] currently has no tank attached to it.") + to_chat(user, "[src] currently has no tank attached to it.") return - to_chat(user, "You detach \the [thetank] from \the [src].") + to_chat(user, "You detach [thetank] from [src].") tank.forceMove(get_turf(user)) user.put_in_hands(tank) tank = null if(!removing) if(tank) - to_chat(user, "\The [src] already has a tank.") + to_chat(user, "[src] already has a tank.") return if(!user.unEquip(thetank)) return - to_chat(user, "You hook \the [thetank] up to \the [src].") + to_chat(user, "You hook [thetank] up to [src].") tank = thetank thetank.forceMove(src) /obj/item/weapon/melee/powerfist/attack(mob/living/target, mob/living/user) if(!tank) - to_chat(user, "\The [src] can't operate without a source of gas!") + to_chat(user, "[src] can't operate without a source of gas!") return if(tank && !tank.air_contents.remove(gasperfist * fisto_setting)) - to_chat(user, "\The [src]'s piston-ram lets out a weak hiss, it needs more gas!") + to_chat(user, "[src]'s piston-ram lets out a weak hiss, it needs more gas!") playsound(loc, 'sound/effects/refill.ogg', 50, 1) return @@ -90,8 +90,8 @@ playsound(loc, 'sound/weapons/genhit2.ogg', 50, 1) var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src))) - spawn(0) - target.throw_at(throw_target, 5 * fisto_setting, 0.2) + + target.throw_at(throw_target, 5 * fisto_setting, 0.2) add_logs(user, target, "power fisted", src) diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm new file mode 100644 index 00000000000..de5cb54f722 --- /dev/null +++ b/code/game/objects/items/weapons/rpd.dm @@ -0,0 +1,262 @@ +/*Contains: + Rapid Pipe Dispenser +*/ + +#define SIMPLE_CAP 20 +#define SUPPLY_CAP 32 +#define SCRUBBERS_CAP 33 +#define HE_EXCHANGER 17 +#define CONNECTOR 4 +#define UNARY_VENT 7 +#define PASSIVE_VENT 37 +#define GAS_SCRUBBER 10 +#define INJECTOR 34 +#define GAS_SENSOR 98 +#define METER 99 +#define DISPOSALS_JUNCTION 2 +#define ATMOS_MODE 1 +#define DISPOSALS_MODE 2 +#define ROTATION_MODE 3 +#define FLIP_MODE 4 +#define DELETE_MODE 5 +#define ATMOS_PIPING 1 +#define SUPPLY_PIPING 2 +#define SCRUBBERS_PIPING 3 +#define DEVICES 4 +#define HEAT_PIPING 5 + +/obj/item/weapon/rpd + name = "rapid pipe dispenser" + desc = "This device can rapidly dispense atmospherics and disposals piping, manipulate loose piping, and recycle any detached pipes it is applied to." + icon = 'icons/obj/tools.dmi' + icon_state = "rpd" + opacity = 0 + density = 0 + anchored = 0 + flags = CONDUCT + force = 10 + throwforce = 10 + throw_speed = 3 + throw_range = 5 + w_class = WEIGHT_CLASS_NORMAL + materials = list(MAT_METAL = 30000, MAT_GLASS = 5000) + origin_tech = "engineering=4;materials=2" + var/datum/effect/system/spark_spread/spark_system + var/lastused + var/iconrotation = 0 //used to orient icons and pipes + var/mode = 1 //Disposals, atmospherics, etc. + var/pipetype = 1//For nanoUI menus + var/whatpipe = 0 //What kind of pipe is it? See code/game/machinery/pipe/construction.dm for a list of defines + var/whatdpipe = 0 //What kind of disposals pipe is it? See code/game/machinery/pipe/dispenser.dm for a list of defines + var/spawndelay = 4 //How long should we have to wait between dispensing pipes? + var/walldelay = 40 //How long should drilling into a wall take? + +/obj/item/weapon/rpd/New() + ..() + spark_system = new /datum/effect/system/spark_spread() + spark_system.set_up(1, 0, src) + spark_system.attach(src) + +//Procs + +/obj/item/weapon/rpd/proc/Activaterpd(delay) + playsound(loc, "sound/machines/click.ogg", 50, 1) + if(prob(15)) + spark_system.start() + if(delay) + lastused = world.time + +/obj/item/weapon/rpd/proc/Manipulatepipes(subject, atmosverb, disposalsverb) + if(istype(subject, /obj/item/pipe)) + call(subject, atmosverb)() + else if(istype(subject, /obj/structure/disposalconstruct/)) + call(subject, disposalsverb)() + +//Lists of things + +var/list/pipelist = list( //id refers to the pipe_type found in construction.dm, icon refers to the name of the icon state in icons/obj/pipe-item.dmi. Icons are made with the asset-cache + list("pipename" = "Straight pipe", "id" = 0, "category" = ATMOS_PIPING, "orientations" = 2, "icon" = "simple"), + list("pipename" = "Bent pipe", "id" = 1, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "simple", "bendy" = 1), + list("pipename" = "T-manifold", "id" = 5, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "manifold"), + list("pipename" = "4-way manifold", "id" = 19, "category" = ATMOS_PIPING, "orientations" = 1, "icon" = "manifold4w"), + list("pipename" = "Pipe cap", "id" = 20, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "cap"), + list("pipename" = "Manual valve", "id" = 8, "category" = ATMOS_PIPING, "orientations" = 2, "icon" = "mvalve"), + list("pipename" = "Digital valve", "id" = 35, "category" = ATMOS_PIPING, "orientations" = 2, "icon" = "dvalve"), + list("pipename" = "Manual T-valve", "id" = 18, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "tvalve"), + list("pipename" = "Digital T-valve", "id" = 38, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "dtvalve"), + list("pipename" = "Straight supply pipe", "id" = 24, "category" = SUPPLY_PIPING, "orientations" = 2, "icon" = "simple"), + list("pipename" = "Bent supply pipe", "id" = 25, "category" = SUPPLY_PIPING, "orientations" = 4, "icon" = "simple", "bendy" = 1), + list("pipename" = "Supply T-manifold", "id" = 28, "category" = SUPPLY_PIPING, "orientations" = 4, "icon" = "manifold"), + list("pipename" = "4-way supply manifold", "id" = 30, "category" = SUPPLY_PIPING, "orientations" = 1, "icon" = "manifold4w"), + list("pipename" = "Supply pipe cap", "id" = 32, "category" = SUPPLY_PIPING, "orientations" = 4, "icon" = "cap"), + list("pipename" = "Straight scrubbers pipe", "id" = 26, "category" = SCRUBBERS_PIPING, "orientations" = 2, "icon" = "simple"), + list("pipename" = "Bent scrubbers pipe", "id" = 27, "category" = SCRUBBERS_PIPING, "orientations" = 4, "icon" = "simple", "bendy" = 1), + list("pipename" = "Scrubbers T-manifold", "id" = 29, "category" = SCRUBBERS_PIPING, "orientations" = 4, "icon" = "manifold"), + list("pipename" = "4-way scrubbers manifold", "id" = 31, "category" = SCRUBBERS_PIPING, "orientations" = 1, "icon" = "manifold4w"), + list("pipename" = "Scrubbers pipe cap", "id" = 33, "category" = SCRUBBERS_PIPING, "orientations" = 4, "icon" = "cap"), + list("pipename" = "Universal pipe adapter", "id" = 23, "category" = DEVICES, "orientations" = 2, "icon" = "universal"), + list("pipename" = "Connector", "id" = 4, "category" = DEVICES, "orientations" = 4, "icon" = "connector"), + list("pipename" = "Unary vent", "id" = 7, "category" = DEVICES, "orientations" = 4, "icon" = "uvent"), + list("pipename" = "Scrubber", "id" = 10, "category" = DEVICES, "orientations" = 4, "icon" = "scrubber"), + list("pipename" = "Gas pump", "id" = 9, "category" = DEVICES, "orientations" = 4, "icon" = "pump"), + list("pipename" = "Volume pump", "id" = 16, "category" = DEVICES, "orientations" = 4, "icon" = "volumepump"), + list("pipename" = "Passive gate", "id" = 15, "category" = DEVICES, "orientations" = 4, "icon" = "passivegate"), + list("pipename" = "Gas filter", "id" = 13, "category" = DEVICES, "orientations" = 4, "icon" = "filter"), + list("pipename" = "Gas mixer", "id" = 14, "category" = DEVICES, "orientations" = 4, "icon" = "mixer"), + list("pipename" = "Gas sensor", "id" = 98, "category" = DEVICES, "orientations" = 1, "icon" = "sensor"), + list("pipename" = "Meter", "id" = 99, "category" = DEVICES, "orientations" = 1, "icon" = "meter"), + list("pipename" = "Passive vent", "id" = 37, "category" = DEVICES, "orientations" = 4, "icon" = "passive vent"), + list("pipename" = "Dual-port vent pump", "id" = 36, "category" = DEVICES, "orientations" = 2, "icon" = "dual-port vent"), + list("pipename" = "Air injector", "id" = 34, "category" = DEVICES, "orientations" = 4, "icon" = "injector"), + list("pipename" = "Straight HE pipe", "id" = 2, "category" = HEAT_PIPING, "orientations" = 2, "icon" = "he"), + list("pipename" = "Bent HE pipe", "id" = 3, "category" = HEAT_PIPING, "orientations" = 4, "icon" = "he", "bendy" = 1), + list("pipename" = "Junction", "id" = 6, "category" = HEAT_PIPING, "orientations" = 4, "icon" = "junction"), + list("pipename" = "Heat exchanger", "id" = 17, "category" = HEAT_PIPING, "orientations" = 4, "icon" = "heunary")) +var/list/dpipelist = list( + list("pipename" = "Straight pipe", "id" = 0, "orientations" = 2, "icon" = "conpipe-s"), + list("pipename" = "Bent pipe", "id" = 1, "orientations" = 4, "icon" = "conpipe-c"), + list("pipename" = "Junction", "id" = 2, "orientations" = 4, "icon" = "conpipe-j1"), + list("pipename" = "Y-junction", "id" = 4, "orientations" = 4, "icon" = "conpipe-y"), + list("pipename" = "Trunk", "id" = 5, "orientations" = 4, "icon" = "conpipe-t"), + list("pipename" = "Bin", "id" = 6, "orientations" = 1, "icon" = "condisposal"), + list("pipename" = "Outlet", "id" = 7, "orientations" = 4, "icon" = "outlet"), + list("pipename" = "Chute", "id" = 8, "orientations" = 4, "icon" = "intake")) +var/list/mainmenu = list( + list("category" = "Atmospherics", "mode" = 1, "icon" = "wrench"), + list("category" = "Disposals", "mode" = 2, "icon" = "recycle"), + list("category" = "Rotate", "mode" = 3, "icon" = "rotate-right"), + list("category" = "Flip", "mode" = 4, "icon" = "exchange"), + list("category" = "Recycle", "mode" = 5, "icon" = "trash")) +var/list/pipemenu = list( + list("pipecategory" = "Normal", "pipemode" = 1), + list("pipecategory" = "Supply", "pipemode" = 2), + list("pipecategory" = "Scrubber", "pipemode" = 3), + list("pipecategory" = "Devices", "pipemode" = 4), + list("pipecategory" = "Heat exchange", "pipemode" = 5)) + +//NanoUI stuff + +/obj/item/weapon/rpd/attack_self(mob/user) + ui_interact(user) + +/obj/item/weapon/rpd/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = inventory_state) + ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "rpd.tmpl", "[name]", 400, 650, state = state) + ui.open() + ui.set_auto_update(1) + +/obj/item/weapon/rpd/ui_data(mob/user, ui_key = "main", datum/topic_state/state = inventory_state) + var/data[0] + data["dpipelist"] = dpipelist + data["iconrotation"] = iconrotation + data["mainmenu"] = mainmenu + data["mode"] = mode + data["pipelist"] = pipelist + data["pipemenu"] = pipemenu + data["pipetype"] = pipetype + data["whatdpipe"] = whatdpipe + data["whatpipe"] = whatpipe + return data + +/obj/item/weapon/rpd/Topic(href, href_list, nowindow, state) + ..() + if(href_list["iconrotation"]) + iconrotation = text2num(sanitize(href_list["iconrotation"])) + else if(href_list["whatpipe"]) + whatpipe = text2num(sanitize(href_list["whatpipe"])) + else if(href_list["whatdpipe"]) + whatdpipe = text2num(sanitize(href_list["whatdpipe"])) + else if(href_list["pipetype"]) + pipetype = text2num(sanitize(href_list["pipetype"])) + else if(href_list["mode"]) + mode = text2num(sanitize(href_list["mode"])) + else + return + nanomanager.update_uis(src) + +//What the RPD actually does + +/obj/item/weapon/rpd/afterattack(atom/target, mob/user, proximity) + ..() + var/turf/T = get_turf(target) + if(src.loc != user || ismob(target) || istype(target, /obj/structure/window) || !proximity || world.time < lastused + spawndelay) + return + if(mode == ATMOS_MODE && !istype(T, /turf/simulated/shuttle)) //No pipes on shuttles nerds + if(istype(T, /turf/simulated/wall)) //Drilling into walls takes time + playsound(loc, "sound/weapons/circsawhit.ogg", 50, 1) + user.visible_message("[user] starts drilling a hole in [T]...", "You start drilling a hole in [T]...", "You hear a drill.") + if(!do_after(user, walldelay, target = T)) + return + user.visible_message("[user] finishes drilling a hole in [T]!", "You finish drilling a hole in [T]!", "You hear clanking.") + var/obj/item/pipe/P + if(whatpipe == GAS_SENSOR) + P = new /obj/item/pipe_gsensor(T) + else if(whatpipe == METER) + P = new /obj/item/pipe_meter(T) + else + P = new(T, pipe_type = whatpipe, dir = user.dir) + if(iconrotation == 0 && P.is_bent_pipe()) //Automatic rotation of dispensed pipes + P.dir = turn(user.dir, 135) + else if(iconrotation == 0 && P.pipe_type in list(CONNECTOR, UNARY_VENT, GAS_SCRUBBER, HE_EXCHANGER, SIMPLE_CAP, SUPPLY_CAP, SCRUBBERS_CAP, INJECTOR, PASSIVE_VENT)) //Some pipes dispense oppositely to what you'd expect, but we don't want to do anything if they selected a direction + P.flip() + else if(iconrotation != 0 && P.is_bent_pipe()) //If they selected a rotation and the pipe is bent + P.dir = turn(iconrotation, -45) + else if(iconrotation != 0) + P.dir = iconrotation + to_chat(user, "[src] rapidly dispenses [P]!") + Activaterpd(1) + else if(mode == DISPOSALS_MODE && !istype(T, /turf/simulated/shuttle)) + if(istype(T, /turf/simulated/wall)) //No disposals pipes on walls + to_chat(user, "That type of pipe won't fit on [T]!") + return + var/obj/structure/disposalconstruct/P = new(T) //Now we make the pipe + P.dir = iconrotation + P.ptype = whatdpipe + if(iconrotation == 0) //Automatic rotation + P.dir = user.dir + if(iconrotation == 0 && whatdpipe != DISPOSALS_JUNCTION) //Disposals pipes are in the opposite direction to atmos pipes, so we need to flip them. Junctions don't have this quirk though + P.flip() + P.update() + to_chat(user, "[src] rapidly dispenses [P]!") + Activaterpd(1) + else if(mode == ROTATION_MODE) + for(var/obj/W in T) + Manipulatepipes(W, /obj/item/pipe/verb/rotate, /obj/structure/disposalconstruct/verb/rotate) + else if(mode == FLIP_MODE) + for(var/obj/W in T) + Manipulatepipes(W, /obj/item/pipe/verb/flip, /obj/structure/disposalconstruct/verb/flip) + else if(mode == DELETE_MODE) + var/eaten + for(var/obj/W in T) + if(istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter) || istype(W, /obj/item/pipe_gsensor) || istype(W, /obj/structure/disposalconstruct) && !W.anchored) + QDEL_NULL(W) + eaten = TRUE + if(eaten) + to_chat(user, "[src] sucks up the loose pipes on [T].") + Activaterpd() + else + to_chat(user, "There were no loose pipes on [T].") + +#undef SIMPLE_CAP +#undef SUPPLY_CAP +#undef SCRUBBERS_CAP +#undef HE_EXCHANGER +#undef CONNECTOR +#undef UNARY_VENT +#undef PASSIVE_VENT +#undef GAS_SCRUBBER +#undef INJECTOR +#undef GAS_SENSOR +#undef METER +#undef DISPOSALS_JUNCTION +#undef ATMOS_MODE +#undef DISPOSALS_MODE +#undef ROTATION_MODE +#undef FLIP_MODE +#undef DELETE_MODE +#undef ATMOS_PIPING +#undef SUPPLY_PIPING +#undef SCRUBBERS_PIPING +#undef DEVICES +#undef HEAT_PIPING diff --git a/code/game/objects/items/weapons/scissors.dm b/code/game/objects/items/weapons/scissors.dm index e5bd30fe609..ef49db0e449 100644 --- a/code/game/objects/items/weapons/scissors.dm +++ b/code/game/objects/items/weapons/scissors.dm @@ -5,7 +5,6 @@ item_state = "scissor" force = 5 sharp = 1 - edge = 1 w_class = WEIGHT_CLASS_SMALL hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("slices", "cuts", "stabs", "jabs") @@ -39,14 +38,14 @@ for(var/i in facial_hair_styles_list) var/datum/sprite_accessory/facial_hair/tmp_facial = facial_hair_styles_list[i] if(C.species.name in tmp_facial.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human hair styles. - if(C.species.flags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list. + if(C.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list. if(robohead.is_monitor) to_chat(user, "You are unable to find anything on [H]'s face worth cutting. How disappointing.") return continue //If the head DOES support human hair wigs, make sure they don't get monitor-oriented styles. species_facial_hair += i else - if(C.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list. + if(C.species.bodyflags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list. if(!robohead.is_monitor) if("Human" in tmp_facial.species_allowed) species_facial_hair += i @@ -62,14 +61,14 @@ for(var/i in hair_styles_list) var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i] if(C.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles. - if(C.species.flags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list. + if(C.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list. if(robohead.is_monitor) to_chat(user, "You are unable to find anything on [H]'s head worth cutting. How disappointing.") return continue //If the head DOES support human hair wigs, make sure they don't get monitor-oriented styles. species_hair += i else - if(C.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list. + if(C.species.bodyflags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list. if(!robohead.is_monitor) if("Human" in tmp_hair.species_allowed) species_hair += i @@ -95,7 +94,6 @@ user.visible_message("[user] finishes cutting [M]'s hair!") /obj/item/weapon/scissors/safety //Totally safe, I assure you. - name = "safety scissors" desc = "The blades of the scissors appear to be made of some sort of ultra-strong metal alloy." force = 18 //same as e-daggers var/is_cutting = 0 //to prevent spam clicking this for huge accumulation of losebreath. @@ -118,10 +116,9 @@ playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) user.visible_message("[user] abruptly stops cutting [M]'s hair and slices their throat!", "You stop cutting [M]'s hair and slice their throat!") //Just a little off the top. H.AdjustLoseBreath(10) //30 Oxy damage over time - H.apply_damage(18, BRUTE, "head", sharp =1, edge =1, used_weapon = "scissors") - var/turf/location = get_turf(H) - if(istype(location, /turf/simulated)) - location.add_blood(H) + H.apply_damage(18, BRUTE, "head", sharp =1, used_weapon = "scissors") + var/turf/location = get_turf(src) + H.add_splatter_floor(location) H.bloody_hands(H) H.bloody_body(H) var/mob/living/carbon/human/U = user diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm index 554347224eb..be2336d6a37 100644 --- a/code/game/objects/items/weapons/shards.dm +++ b/code/game/objects/items/weapons/shards.dm @@ -5,7 +5,6 @@ icon = 'icons/obj/shards.dmi' icon_state = "large" sharp = 1 - edge = 1 desc = "Could probably be used as ... a throwing weapon?" w_class = WEIGHT_CLASS_TINY force = 5.0 @@ -88,28 +87,4 @@ if(affecting.take_damage(5, 0)) H.UpdateDamageIcon() H.updatehealth() - ..() - -// Shrapnel - -/obj/item/weapon/shard/shrapnel - name = "shrapnel" - icon = 'icons/obj/shards.dmi' - icon_state = "shrapnellarge" - desc = "A bunch of tiny bits of shattered metal." - -/obj/item/weapon/shard/shrapnel/New() - - src.icon_state = pick("shrapnellarge", "shrapnelmedium", "shrapnelsmall") - switch(src.icon_state) - if("shrapnelsmall") - src.pixel_x = rand(-12, 12) - src.pixel_y = rand(-12, 12) - if("shrapnelmedium") - src.pixel_x = rand(-8, 8) - src.pixel_y = rand(-8, 8) - if("shrapnellarge") - src.pixel_x = rand(-5, 5) - src.pixel_y = rand(-5, 5) - else - return + ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index e4183b5bafd..85dfe4868d0 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -38,7 +38,7 @@ else if(istype(target,/mob/living/carbon)) for(var/obj/item/carried_item in target.contents) if(!istype(carried_item, /obj/item/weapon/implant))//If it's not an implant. - carried_item.add_blood(target)//Oh yes, there will be blood... + carried_item.add_mob_blood(target)//Oh yes, there will be blood... var/mob/living/carbon/human/H = target H.bloody_hands(target,0) H.bloody_body(target) diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index d8de4ee7c53..b5258eaeb27 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -317,7 +317,7 @@ /obj/item/weapon/storage/fancy/rollingpapers name = "rolling paper pack" - desc = "A pack of NanoTrasen brand rolling papers." + desc = "A pack of Nanotrasen brand rolling papers." w_class = WEIGHT_CLASS_TINY icon = 'icons/obj/cigarettes.dmi' icon_state = "cig_paper_pack" diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 21ea7c33993..5931696b599 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -478,7 +478,7 @@ /obj/item/weapon/storage/attack_self(mob/user as mob) //Clicking on itself will empty it, if it has the verb to do that. - if(user.get_active_hand() == src) + if(user.is_in_active_hand(src)) if(src.verbs.Find(/obj/item/weapon/storage/verb/quick_empty)) src.quick_empty() return diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 9efc5f625a6..c5f32121d4f 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -157,6 +157,22 @@ new /obj/item/weapon/grenade/empgrenade(src) new /obj/item/weapon/implanter/emp/(src) +/obj/item/weapon/storage/box/syndie_kit/throwing_weapons + name = "boxed throwing kit" + can_hold = list(/obj/item/weapon/throwing_star, /obj/item/weapon/restraints/legcuffs/bola/tactical) + max_combined_w_class = 16 + max_w_class = WEIGHT_CLASS_NORMAL + +/obj/item/weapon/storage/box/syndie_kit/throwing_weapons/New() + ..() + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/restraints/legcuffs/bola/tactical(src) + new /obj/item/weapon/restraints/legcuffs/bola/tactical(src) + /obj/item/weapon/storage/box/syndie_kit/sarin name = "Sarin Gas Grenades" diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 3b99936b0a8..27cbff53547 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -54,7 +54,9 @@ C.update_internals_hud_icon(0) else var/can_open_valve = 0 - if(C.wear_mask && C.wear_mask.flags & AIRTIGHT) + if(C.get_organ_slot("breathing_tube")) + can_open_valve = 1 + else if(C.wear_mask && C.wear_mask.flags & AIRTIGHT) can_open_valve = 1 else if(ishuman(C)) var/mob/living/carbon/human/H = C diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index 0a984821fad..11da88ae680 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -128,7 +128,7 @@ Frequency: if(turfs.len) L["None (Dangerous)"] = pick(turfs) var/t1 = input(user, "Please select a teleporter to lock in on.", "Hand Teleporter") as null|anything in L - if(!t1 || (user.get_active_hand() != src || user.stat || user.restrained())) + if(!t1 || (!user.is_in_active_hand(src) || user.stat || user.restrained())) return if(active_portals >= 3) user.show_message("\The [src] is recharging!") diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 8aabce1eb54..3ad0a28823a 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -228,7 +228,6 @@ hitsound = 'sound/items/Wirecutter.ogg' usesound = 'sound/items/Wirecutter.ogg' sharp = 1 - edge = 1 toolspeed = 1 /obj/item/weapon/wirecutters/New(loc, param_color = null) @@ -241,8 +240,7 @@ /obj/item/weapon/wirecutters/attack(mob/living/carbon/C, mob/user) if(istype(C) && C.handcuffed && istype(C.handcuffed, /obj/item/weapon/restraints/handcuffs/cable)) user.visible_message("[user] cuts [C]'s restraints with [src]!") - qdel(C.handcuffed) - C.handcuffed = null + QDEL_NULL(C.handcuffed) if(C.buckled && C.buckled.buckle_requires_restraints) C.buckled.unbuckle_mob(C) C.update_handcuffed() diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index cdd8b8a5de1..87197426495 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -162,7 +162,6 @@ force = 5 throwforce = 15 sharp = 1 - edge = 1 w_class = WEIGHT_CLASS_BULKY slot_flags = SLOT_BACK force_unwielded = 5 @@ -209,8 +208,6 @@ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") block_chance = 75 sharp = 1 - edge = 1 - no_embed = 1 // Like with the single-handed esword, this shouldn't be embedding in people. /obj/item/weapon/twohanded/dualsaber/New() blade_color = pick("red", "blue", "green", "purple") @@ -297,7 +294,6 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "poked", "jabbed", "torn", "gored") sharp = 1 - edge = 1 no_spin_thrown = 1 var/obj/item/weapon/grenade/explosive = null var/war_cry = "AAAAARGH!!!" @@ -442,7 +438,6 @@ attack_verb = list("sawed", "cut", "hacked", "carved", "cleaved", "butchered", "felled", "timbered") hitsound = "swing_hit" sharp = 1 - edge = 1 actions_types = list(/datum/action/item_action/startchainsaw) var/on = 0 @@ -499,8 +494,6 @@ origin_tech = "materials=6;syndicate=4" attack_verb = list("sawed", "cut", "hacked", "carved", "cleaved", "butchered", "felled", "timbered") sharp = 1 - edge = 1 - no_embed = 1 /obj/item/weapon/twohanded/chainsaw/update_icon() if(wielded) @@ -539,7 +532,6 @@ icon_state = "mjollnir0" flags = CONDUCT slot_flags = SLOT_BACK - no_embed = 1 force = 5 force_unwielded = 5 force_wielded = 20 @@ -604,7 +596,6 @@ icon_state = "mjollnir0" flags = CONDUCT slot_flags = SLOT_BACK - no_embed = 1 force = 5 force_unwielded = 5 force_wielded = 25 @@ -652,7 +643,6 @@ icon_state = "knighthammer0" flags = CONDUCT slot_flags = SLOT_BACK - no_embed = 1 force = 5 force_unwielded = 5 force_wielded = 30 @@ -718,7 +708,6 @@ force = 5 throwforce = 15 sharp = 1 - edge = 1 w_class = WEIGHT_CLASS_HUGE armour_penetration = 20 slot_flags = SLOT_BACK diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 95317b7f0a6..753a8073313 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -43,7 +43,6 @@ force = 40 throwforce = 10 sharp = 1 - edge = 1 w_class = WEIGHT_CLASS_NORMAL attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") block_chance = 50 @@ -67,7 +66,6 @@ force = 40 throwforce = 10 sharp = 1 - edge = 1 w_class = WEIGHT_CLASS_NORMAL hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") @@ -83,7 +81,6 @@ /obj/item/weapon/harpoon name = "harpoon" sharp = 1 - edge = 0 desc = "Tharr she blows!" icon_state = "harpoon" item_state = "harpoon" @@ -130,6 +127,20 @@ obj/item/weapon/wirerod/attackby(obj/item/I, mob/user, params) qdel(I) qdel(src) +/obj/item/weapon/throwing_star + name = "throwing star" + desc = "An ancient weapon still used to this day due to it's ease of lodging itself into victim's body parts" + icon_state = "throwingstar" + item_state = "eshield0" + force = 2 + throwforce = 20 //This is never used on mobs since this has a 100% embed chance. + throw_speed = 4 + embedded_pain_multiplier = 4 + w_class = WEIGHT_CLASS_SMALL + embed_chance = 100 + embedded_fall_chance = 0 //Hahaha! + sharp = 1 + materials = list(MAT_METAL=500, MAT_GLASS=500) /obj/item/weapon/spear/kidan icon_state = "kidanspear" diff --git a/code/game/objects/items/weapons/whetstone.dm b/code/game/objects/items/weapons/whetstone.dm index b268540f92a..c4595f2deb6 100644 --- a/code/game/objects/items/weapons/whetstone.dm +++ b/code/game/objects/items/weapons/whetstone.dm @@ -19,7 +19,7 @@ if(I.force >= max || I.throwforce >= max)//no esword sharpening to_chat(user, "[I] is much too powerful to sharpen further.") return - if(requires_sharpness && !I.edge) + if(requires_sharpness && !I.sharp) to_chat(user, "You can only sharpen items that are already sharp, such as knives.") return if(istype(I, /obj/item/weapon/twohanded))//some twohanded items should still be sharpenable, but handle force differently. therefore i need this stuff @@ -39,7 +39,6 @@ return user.visible_message("[user] sharpens [I] with [src]!", "You sharpen [I], making it much more deadly than before.") if(!requires_sharpness) - I.edge = 1 I.sharp = 1 I.force = Clamp(I.force + increment, 0, max) I.throwforce = Clamp(I.throwforce + increment, 0, max) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 844c1828200..d1f1372caf3 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -8,7 +8,6 @@ var/throwforce = 1 var/list/attack_verb = list() //Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]" var/sharp = 0 // whether this object cuts - var/edge = 0 // whether this object is more likely to dismember var/in_use = 0 // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! var/damtype = "brute" 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 7c58f4a2b1a..d7fdab50e5a 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm @@ -15,6 +15,9 @@ new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/suit/hooded/nun(src) new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) + new /obj/item/clothing/suit/hooded/monk(src) + new /obj/item/clothing/suit/witchhunter(src) + new /obj/item/clothing/head/witchhunter_hat(src) new /obj/item/clothing/suit/holidaypriest(src) new /obj/item/clothing/under/wedding/bride_white(src) new /obj/item/weapon/storage/backpack/cultpack (src) 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 d130b22074c..58cad5e5f36 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -34,6 +34,7 @@ new /obj/item/taperoll/engineering(src) new /obj/item/clothing/head/beret/eng(src) new /obj/item/weapon/door_remote/chief_engineer(src) + new /obj/item/weapon/rpd(src) /obj/structure/closet/secure_closet/engineering_electrical name = "electrical supplies locker" @@ -143,3 +144,4 @@ new /obj/item/weapon/watertank/atmos(src) new /obj/item/clothing/suit/fire/atmos(src) new /obj/item/clothing/head/hardhat/atmos(src) + new /obj/item/weapon/rpd(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/miscjobs.dm b/code/game/objects/structures/crates_lockers/closets/secure/miscjobs.dm index 11cfc6a7dd5..7ca417a9d17 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/miscjobs.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/miscjobs.dm @@ -17,6 +17,7 @@ new /obj/item/clothing/mask/gas/clown_hat(src) new /obj/item/weapon/bikehorn(src) new /obj/item/weapon/reagent_containers/spray/waterflower(src) + new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofbanana(src) new /obj/item/toy/crayon/rainbow(src) new /obj/item/seeds/banana(src) diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index d651ad55adb..e9d9781bf0e 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -251,6 +251,10 @@ new /obj/item/clothing/under/rank/medical/skirt(src) new /obj/item/clothing/under/rank/medical/skirt(src) new /obj/item/clothing/head/surgery/purple(src) + new /obj/item/clothing/under/medigown(src) + new /obj/item/clothing/under/medigown(src) + new /obj/item/clothing/under/medigown(src) + new /obj/item/clothing/under/medigown(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) @@ -406,6 +410,10 @@ new /obj/item/clothing/suit/storage/labcoat(src) new /obj/item/clothing/mask/surgical(src) new /obj/item/clothing/mask/surgical(src) + new /obj/item/clothing/under/medigown(src) + new /obj/item/clothing/under/medigown(src) + new /obj/item/clothing/under/medigown(src) + new /obj/item/clothing/under/medigown(src) /obj/structure/closet/wardrobe/grey diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 858d0e83c6e..16d77587274 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -319,8 +319,9 @@ var/global/list/captain_display_cases = list() else to_chat(src, "[bicon(src)] \The [src] is empty!") else - user.visible_message("[user.name] gently runs his hands over \the [src] in appreciation of its contents.", \ - "You gently run your hands over \the [src] in appreciation of its contents.", \ + user.changeNext_move(CLICK_CD_MELEE) + user.visible_message("[user.name] gently runs \his hands over [src] in appreciation of its contents.", \ + "You gently run your hands over [src] in appreciation of its contents.", \ "You hear someone streaking glass with their greasy hands.") #undef DISPLAYCASE_FRAME_CIRCUIT diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 14f1357af87..2cdcfc18376 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -96,7 +96,7 @@ /obj/structure/inflatable/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(!istype(W)) return - if(can_puncture(W)) + if(is_pointed(W)) visible_message("[user] pierces [src] with [W]!") deflate(1) if(W.damtype == BRUTE || W.damtype == BURN) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 043177551ff..73c47ba98a6 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -82,9 +82,8 @@ playsound(loc, 'sound/effects/splat.ogg', 25, 1) H.forceMove(loc) H.emote("scream") - if(istype(H, /mob/living/carbon/human)) //So you don't get human blood when you spike a giant spidere - var/turf/simulated/pos = get_turf(H) - pos.add_blood_floor(H) + if(ishuman(H)) + H.add_splatter_floor() H.adjustBruteLoss(30) H.buckled = src H.dir = 2 diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 596673ba0c7..540c2e079aa 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -102,8 +102,7 @@ if(!( A.anchored )) A.forceMove(src) playsound(loc, open_sound, 50, 1) - qdel(connected) - connected = null + QDEL_NULL(connected) else playsound(loc, open_sound, 50, 1) connected = new /obj/structure/m_tray( loc ) @@ -118,8 +117,7 @@ connected.icon_state = "morguet" connected.dir = dir else - qdel(connected) - connected = null + QDEL_NULL(connected) add_fingerprint(user) update() return @@ -155,8 +153,7 @@ A.forceMove(connected.loc) connected.icon_state = "morguet" else - qdel(connected) - connected = null + QDEL_NULL(connected) return /obj/structure/morgue/Destroy() @@ -306,8 +303,7 @@ if(!( A.anchored )) A.forceMove(src) playsound(loc, open_sound, 50, 1) - qdel(connected) - connected = null + QDEL_NULL(connected) else if(locked == 0) playsound(loc, open_sound, 50, 1) connected = new /obj/structure/c_tray( loc ) @@ -321,8 +317,7 @@ A.forceMove(connected.loc) connected.icon_state = "cremat" else - qdel(connected) - connected = null + QDEL_NULL(connected) add_fingerprint(user) update() @@ -355,8 +350,7 @@ A.forceMove(connected.loc) connected.icon_state = "cremat" else - qdel(connected) - connected = null + QDEL_NULL(connected) return /obj/structure/crematorium/proc/cremate(mob/user as mob) diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index db917ca5588..37a7bb13115 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -1,14 +1,14 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 + /datum/song var/name = "Untitled" var/list/lines = new() - var/tempo = 5 // delay between notes + var/tempo = 5 // delay between notes - var/playing = 0 // if we're playing - var/help = 0 // if help is open - var/repeat = 0 // number of times remaining to repeat - var/max_repeat = 10 // maximum times we can repeat + var/playing = 0 // if we're playing + var/help = 0 // if help is open + var/repeat = 0 // number of times remaining to repeat + var/max_repeat = 10 // maximum times we can repeat var/instrumentDir = "piano" // the folder with the sounds var/instrumentExt = "ogg" // the file extension @@ -26,7 +26,7 @@ // note is a number from 1-7 for A-G // acc is either "b", "n", or "#" // oct is 1-8 (or 9 for C) -/datum/song/proc/playnote(var/note, var/acc as text, var/oct) +/datum/song/proc/playnote(note, acc as text, oct) // handle accidental -> B<>C of E<>F if(acc == "b" && (note == 3 || note == 6)) // C or F if(note == 3) @@ -70,7 +70,7 @@ else return 1 -/datum/song/proc/playsong(mob/user as mob) +/datum/song/proc/playsong(mob/user) while(repeat >= 0) var/cur_oct[7] var/cur_acc[7] @@ -79,18 +79,14 @@ cur_acc[i] = "n" for(var/line in lines) -// to_chat(world, line) for(var/beat in splittext(lowertext(line), ",")) -// to_chat(world, "beat: [beat]") var/list/notes = splittext(beat, "/") for(var/note in splittext(notes[1], "-")) -// to_chat(world, "note: [note]") - if(!playing || shouldStopPlaying(user))//If the instrument is playing, or special case + if(!playing || shouldStopPlaying(user)) //If the instrument is playing, or special case playing = 0 return if(lentext(note) == 0) continue -// to_chat(world, "Parse: [copytext(note,1,2)]") var/cur_note = text2ascii(note) - 96 if(cur_note < 1 || cur_note > 7) continue @@ -244,6 +240,7 @@ playing = 0 /datum/song/proc/sanitize_tempo(new_tempo) + new_tempo = abs(new_tempo) return max(round(new_tempo, world.tick_lag), world.tick_lag) // subclass for handheld instruments, like violin @@ -269,6 +266,7 @@ /obj/structure/piano/New() + ..() song = new("piano", src) if(prob(50)) @@ -304,7 +302,7 @@ song.Topic(href, href_list) /obj/structure/piano/attackby(obj/item/O as obj, mob/user as mob, params) - if(istype(O, /obj/item/weapon/wrench)) + if(iswrench(O)) if(!anchored && !isinspace()) playsound(src.loc, O.usesound, 50, 1) to_chat(user, " You begin to tighten \the [src] to the floor...") @@ -324,4 +322,4 @@ "You hear ratchet.") anchored = 0 else - ..() + return ..() diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 3f4eea3dbf4..b1cf367ba1f 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -182,10 +182,15 @@ icon_state = "nuke" /obj/structure/sign/clown - name = "\improper mech painting" + name = "\improper clown painting" desc = "A painting of the clown and mime. Awwww." icon_state = "clown" +/obj/structure/sign/bobross + name = "\improper calming painting" + desc = "We don't make mistakes, just happy little accidents." + icon_state = "bob" + /obj/structure/sign/singulo name = "\improper singulo painting" desc = "A mesmerizing painting of a singularity. It seems to suck you in..." diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 56c6861e4fc..bf261d606f9 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -17,6 +17,7 @@ burntime = 30 buildstackamount = 2 var/movable = 0 // For mobility checks + buckle_offset = -6 /obj/structure/stool/bed/MouseDrop(atom/over_object) ..(over_object, skip_fucking_stool_shit = 1) @@ -36,6 +37,7 @@ anchored = 0 buildstackamount = 10 buildstacktype = /obj/item/stack/sheet/wood + buckle_offset = 0 /obj/structure/stool/bed/dogbed/ian name = "Ian's bed" @@ -139,5 +141,4 @@ to_chat(user, "You deploy the roller bed.") var/obj/structure/stool/bed/roller/R = new /obj/structure/stool/bed/roller(user.loc) R.add_fingerprint(user) - qdel(held) - held = null + QDEL_NULL(held) diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 2b8cdd9e3ba..b76cd70d57b 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -5,7 +5,7 @@ buckle_lying = 0 //you sit in a chair, not lay burn_state = FIRE_PROOF buildstackamount = 1 - + buckle_offset = 0 var/propelled = 0 // Check for fire-extinguisher-driven chairs /obj/structure/stool/bed/chair/New() diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 0c273e7f1fa..3cf48944814 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -247,6 +247,9 @@ obj/structure/windoor_assembly/Destroy() if(do_after(user, 40 * W.toolspeed, target = src)) if(src.loc && src.electronics) + for(var/obj/machinery/door/window/WD in loc) + if(WD.dir == dir) + return density = 1 //Shouldn't matter but just incase to_chat(user, "You finish the windoor!") diff --git a/code/game/response_team.dm b/code/game/response_team.dm index 344a9b72054..ebfe10f71e0 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -387,12 +387,13 @@ var/ert_request_answered = 0 /obj/item/clothing/head/helmet/space/hardsuit/ert/commander = 1, /obj/item/clothing/mask/gas/sechailer/swat = 1, /obj/item/weapon/restraints/handcuffs = 1, + /obj/item/clothing/shoes/magboots = 1, /obj/item/weapon/storage/lockbox/mindshield = 1 ) /datum/outfit/job/centcom/response_team/commander/gamma name = "RT Commander (Gamma)" - shoes = /obj/item/clothing/shoes/combat/swat + shoes = /obj/item/clothing/shoes/magboots/advance gloves = /obj/item/clothing/gloves/combat suit = /obj/item/clothing/suit/space/hardsuit/ert/commander glasses = /obj/item/clothing/glasses/hud/security/night @@ -457,6 +458,7 @@ var/ert_request_answered = 0 backpack_contents = list( /obj/item/clothing/head/helmet/space/hardsuit/ert/security = 1, /obj/item/clothing/mask/gas/sechailer = 1, + /obj/item/clothing/shoes/magboots = 1, /obj/item/weapon/storage/box/handcuffs = 1, /obj/item/weapon/gun/energy/ionrifle/carbine = 1 ) @@ -464,7 +466,7 @@ var/ert_request_answered = 0 /datum/outfit/job/centcom/response_team/security/gamma name = "RT Security (Gamma)" has_grenades = TRUE - shoes = /obj/item/clothing/shoes/combat/swat + shoes = /obj/item/clothing/shoes/magboots/advance gloves = /obj/item/clothing/gloves/combat suit = /obj/item/clothing/suit/space/hardsuit/ert/security suit_store = /obj/item/weapon/gun/energy/gun/nuclear @@ -509,7 +511,7 @@ var/ert_request_answered = 0 /datum/outfit/job/centcom/response_team/engineer/red name = "RT Engineer (Red)" - shoes = /obj/item/clothing/shoes/magboots + shoes = /obj/item/clothing/shoes/magboots/advance gloves = /obj/item/clothing/gloves/color/yellow suit = /obj/item/clothing/suit/space/hardsuit/ert/engineer suit_store = /obj/item/weapon/tank/emergency_oxygen/engi @@ -594,12 +596,13 @@ var/ert_request_answered = 0 /obj/item/weapon/storage/firstaid/toxin = 1, /obj/item/weapon/storage/firstaid/adv = 1, /obj/item/weapon/storage/firstaid/surgery = 1, - /obj/item/weapon/gun/energy/gun = 1 + /obj/item/weapon/gun/energy/gun = 1, + /obj/item/clothing/shoes/magboots = 1 ) /datum/outfit/job/centcom/response_team/medic/gamma name = "RT Medic (Gamma)" - shoes = /obj/item/clothing/shoes/combat/swat + shoes = /obj/item/clothing/shoes/magboots/advance gloves = /obj/item/clothing/gloves/combat suit = /obj/item/clothing/suit/space/hardsuit/ert/medical glasses = /obj/item/clothing/glasses/hud/health/night diff --git a/code/game/sound.dm b/code/game/sound.dm index 14269acb81f..8033e928173 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -15,6 +15,7 @@ var/list/ricochet = list('sound/weapons/effects/ric1.ogg', 'sound/weapons/effect var/list/terminal_type = list('sound/machines/terminal_button01.ogg', 'sound/machines/terminal_button02.ogg', 'sound/machines/terminal_button03.ogg', 'sound/machines/terminal_button04.ogg', 'sound/machines/terminal_button05.ogg', 'sound/machines/terminal_button06.ogg', 'sound/machines/terminal_button07.ogg', 'sound/machines/terminal_button08.ogg') +var/list/growls = list('sound/goonstation/voice/growl1.ogg', 'sound/goonstation/voice/growl2.ogg', 'sound/goonstation/voice/growl3.ogg') /proc/playsound(var/atom/source, soundin, vol as num, vary, extrarange as num, falloff, var/is_global, var/pitch) @@ -142,4 +143,6 @@ var/list/terminal_type = list('sound/machines/terminal_button01.ogg', 'sound/mac soundin = pick(ricochet) if("terminal_type") soundin = pick(terminal_type) + if("growls") + soundin = pick(growls) return soundin diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index cf1a1303025..22ccbecfdf6 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -45,12 +45,6 @@ if(wet_overlay) overlays -= wet_overlay -/turf/simulated/proc/AddTracks(var/typepath,var/bloodDNA,var/comingdir,var/goingdir,var/bloodcolor="#A10808") - var/obj/effect/decal/cleanable/blood/tracks/tracks = locate(typepath) in src - if(!tracks) - tracks = new typepath(src) - tracks.AddTracks(bloodDNA,comingdir,goingdir,bloodcolor) - /turf/simulated/Entered(atom/A, atom/OL, ignoreRest = 0) ..() if(!ignoreRest) @@ -73,29 +67,6 @@ if(M.flying) return ..() - // Tracking blood - var/list/bloodDNA = null - var/bloodcolor = "" - if(M.shoes) - var/obj/item/clothing/shoes/S = M.shoes - if(S.track_blood && S.blood_DNA) - bloodDNA = S.blood_DNA - bloodcolor = S.blood_color - S.track_blood-- - else - if(M.track_blood && M.feet_blood_DNA) - bloodDNA = M.feet_blood_DNA - bloodcolor = M.feet_blood_color - M.track_blood-- - - if(bloodDNA) - src.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints,bloodDNA,M.dir,0,bloodcolor) // Coming - var/turf/simulated/from = get_step(M,reverse_direction(M.dir)) - if(istype(from) && from) - from.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints,bloodDNA,0,M.dir,bloodcolor) // Going - - bloodDNA = null - switch(src.wet) if(TURF_WET_WATER) if(!(M.slip("wet floor", 4, 2, 0, 1))) @@ -110,32 +81,6 @@ if(!(prob(30) && M.slip("icy floor", 4, 2, 1, 1))) M.inertia_dir = 0 - -//returns 1 if made bloody, returns 0 otherwise -/turf/simulated/add_blood(mob/living/carbon/human/M) - if(!..()) - return 0 - - if(!istype(M)) // To avoid non-humans from causing runtimes whena dding blood to the floor - return 0 - var/obj/effect/decal/cleanable/blood/B = locate() in contents //check for existing blood splatter - if(!B) - B = blood_splatter(src,M.get_blood(M.vessel),1) - if(B) - B.add_blood_list(M) - return 1 //we bloodied the floor - return 0 // Clean floors club - -// Only adds blood on the floor -- Skie -/turf/simulated/add_blood_floor(mob/living/carbon/M as mob) - if(ishuman(M)) - blood_splatter(src,M,1) - if( istype(M, /mob/living/carbon/alien )) - var/obj/effect/decal/cleanable/blood/xeno/this = new /obj/effect/decal/cleanable/blood/xeno(src) - this.blood_DNA["UNKNOWN BLOOD"] = "X*" - else if( istype(M, /mob/living/silicon/robot )) - new /obj/effect/decal/cleanable/blood/oil(src) - /turf/simulated/ChangeTurf(var/path) . = ..() smooth_icon_neighbors(src) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index aac7d370e21..234af2cfb72 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -385,8 +385,8 @@ return //Poster stuff - else if(istype(W,/obj/item/weapon/contraband/poster)) - place_poster(W,user) + else if(istype(W, /obj/item/weapon/poster)) + place_poster(W, user) return //Bone White - Place pipes on walls diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm index e462a1d77f8..43374ce66d8 100644 --- a/code/game/turfs/simulated/walls_reinforced.dm +++ b/code/game/turfs/simulated/walls_reinforced.dm @@ -317,8 +317,8 @@ return //Poster stuff - else if(istype(W,/obj/item/weapon/contraband/poster)) - place_poster(W,user) + else if(istype(W, /obj/item/weapon/poster)) + place_poster(W, user) return //Bone White - Place pipes on walls diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index 481fc73631a..dce7b57b9dc 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -37,7 +37,7 @@ // Failing that... if(!(damagetype & BRUTELOSS) && !(damagetype & FIRELOSS) && !(damagetype & TOXLOSS) && !(damagetype & OXYLOSS)) - if(species.flags & NO_BREATHE) + if(NO_BREATHE in species.species_traits) // the ultimate fallback take_overall_damage(max(dmgamt - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0), 0) else diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index d7de6dd6844..4ddab9ccf2c 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -101,10 +101,10 @@ var/global/nologevent = 0

    [check_rights(R_ADMIN,0) ? "Traitor panel | " : "" ] Narrate to | - Subtle message | - Bless | - Smite + Subtle message "} + if(check_rights(R_EVENT, 0)) + body += {" | Bless | Smite"} if(M.client) if(!istype(M, /mob/new_player)) @@ -909,12 +909,12 @@ var/gamma_ship_location = 1 // 0 = station , 1 = space toArea = locate(/area/shuttle/gamma/space) fromArea.move_contents_to(toArea) + for(var/obj/machinery/mech_bay_recharge_port/P in toArea) + P.update_recharge_turf() + for(var/obj/machinery/power/apc/A in toArea) A.init() - for(var/obj/machinery/alarm/A in toArea) - A.first_run() - if(gamma_ship_location) gamma_ship_location = 0 else diff --git a/code/modules/admin/buildmode.dm b/code/modules/admin/buildmode.dm index f246357e472..d628df054c6 100644 --- a/code/modules/admin/buildmode.dm +++ b/code/modules/admin/buildmode.dm @@ -376,10 +376,8 @@ return 1 /datum/click_intercept/buildmode/proc/deselect_region() - qdel(cornerA) - cornerA = null - qdel(cornerB) - cornerB = null + QDEL_NULL(cornerA) + QDEL_NULL(cornerB) /datum/click_intercept/buildmode/proc/Reset()//Reset temporary variables deselect_region() diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index c5004b9dd12..9692eac6713 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -68,9 +68,10 @@

    IC Events

    Teams
    Send SIT - Syndicate Infiltration Team   -
    Send in the Deathsquad   Send in a Syndie Strike Team   +
    Send in the Deathsquad   Send in a HONKsquad
    + Send in a Gimmick Team
    Change Security Level
    Security Level - Green   Security Level - Blue   diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index b43001f3abc..2279d45a8ed 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1728,7 +1728,7 @@ log_admin("[key_name(src.owner)] sent [key_name(H)] a [eviltype] fax") message_admins("[key_name_admin(src.owner)] replied to [key_name_admin(H)] with a [eviltype] fax") else if(href_list["Bless"]) - if(!check_rights(R_ADMIN)) + if(!check_rights(R_EVENT)) return var/mob/living/M = locateUID(href_list["Bless"]) if(!istype(M)) @@ -1778,7 +1778,7 @@ log_admin("[key_name(owner)] answered [key_name(M)]'s prayer with a blessing: [logmsg]") message_admins("[key_name_admin(owner)] answered [key_name_admin(M)]'s prayer with a blessing: [logmsg]") else if(href_list["Smite"]) - if(!check_rights(R_ADMIN)) + if(!check_rights(R_EVENT)) return var/mob/living/M = locateUID(href_list["Smite"]) var/mob/living/carbon/human/H @@ -1956,7 +1956,7 @@ P.name = "Central Command - paper" var/stypes = list("Handle it yourselves!","Illegible fax","Fax not signed","Not Right Now","You are wasting our time", "Keep up the good work", "ERT Instructions") var/stype = input(src.owner, "Which type of standard reply do you wish to send to [H]?","Choose your paperwork", "") as null|anything in stypes - var/tmsg = "



    NanoTrasen Science Station Cyberiad


    NAS Trurl Communications Department Report


    " + var/tmsg = "



    Nanotrasen Science Station Cyberiad


    NAS Trurl Communications Department Report


    " if(stype == "Handle it yourselves!") tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

    Please proceed in accordance with Standard Operating Procedure and/or Space Law. You are fully trained to handle this situation without Central Command intervention.

    This is an automatic message." else if(stype == "Illegible fax") @@ -2524,6 +2524,10 @@ if(usr.client.syndicate_infiltration_team()) feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","SyndieInfiltrationTeam") + if("gimmickteam") + if(usr.client.gimmick_team()) + feedback_inc("admin_secrets_fun_used",1) + feedback_add_details("admin_secrets_fun_used","GimmickTeam") if("tripleAI") usr.client.triple_ai() feedback_inc("admin_secrets_fun_used",1) diff --git a/code/modules/admin/verbs/gimmick_team.dm b/code/modules/admin/verbs/gimmick_team.dm new file mode 100644 index 00000000000..2ca1d3c27df --- /dev/null +++ b/code/modules/admin/verbs/gimmick_team.dm @@ -0,0 +1,96 @@ +// Gimmick Team +// Spawns a group of player-controlled mobs with an outfit specified by the admin, at their location. + +/client/proc/gimmick_team() + set category = "Event" + set name = "Send Gimmick Team" + set desc = "Spawns a group of players in the specified outfit." + if(!check_rights(R_EVENT)) + return + if(!ticker) + alert("The game hasn't started yet!") + return + if(alert("Do you want to spawn a Gimmick Team at YOUR CURRENT LOCATION?",,"Yes","No")=="No") + return + var/turf/T = get_turf(mob) + var/pick_manually = 0 + if(alert("Pick the team members manually? If you select yes, you pick from ghosts. If you select no, ghosts get offered the chance to join.",,"Yes","No")=="Yes") + pick_manually = 1 + var/list/teamsizeoptions = list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) + var/teamsize = input(src, "How many team members?") as null|anything in teamsizeoptions + if(!(teamsize in teamsizeoptions)) + alert("Invalid team size specified. Aborting.") + return + var/themission = null + while(!themission) + themission = sanitize(copytext(input(src, "Please specify a briefing message for the team.", "Specify Mission", ""),1,MAX_MESSAGE_LEN)) + if(!themission) + alert("No mission specified. Aborting.") + return + var/admin_outfits = subtypesof(/datum/outfit/admin) + var/outfit_list = list() + for(var/type in admin_outfits) + var/datum/outfit/admin/O = type + outfit_list[initial(O.name)] = type + var/dresscode = input("Select Outfit", "Dress-a-mob") as null|anything in outfit_list + if(isnull(dresscode)) + return + var/is_syndicate = 0 + if(alert("Do you want these characters automatically classified as antagonists?",,"Yes","No")=="Yes") + is_syndicate = 1 + + var/list/players_to_spawn = list() + if(pick_manually) + var/list/possible_ghosts = list() + for(var/mob/dead/observer/G in player_list) + if(!G.client.is_afk()) + if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) + possible_ghosts += G + for(var/i=teamsize,(i>0&&possible_ghosts.len),i--) //Decrease with every member selected. + var/candidate = input("Pick characters to spawn. This will go on until there either no more ghosts to pick from, or the slots are full.", "Active Players") as null|anything in possible_ghosts // auto-picks if only one candidate + possible_ghosts -= candidate + players_to_spawn += candidate + else + to_chat(src, "Polling candidates...") + players_to_spawn = pollCandidates("Do you want to play as an event character?") + + if(!players_to_spawn.len) + to_chat(src, "Nobody volunteered.") + return 0 + + var/datum/outfit/O = outfit_list[dresscode] + + var/players_spawned = 0 + for(var/mob/thisplayer in players_to_spawn) + var/mob/living/carbon/human/H = new /mob/living/carbon/human(T) + H.name = random_name(pick(MALE,FEMALE)) + var/datum/preferences/A = new() //Randomize appearance + A.real_name = H.name + A.copy_to(H) + H.dna.ready_dna(H) + + H.mind_initialize() + H.mind.assigned_role = "MODE" + H.mind.special_role = "Event Character" + + H.key = thisplayer.key + + H.equipOutfit(O, FALSE) + + to_chat(H, "
    [themission]") + H.mind.store_memory("[themission]

    ") + + if(is_syndicate) + ticker.mode.traitors |= H.mind //Adds them to extra antag list + + players_spawned++ + if(players_spawned >= teamsize) + break + + + message_admins("[key_name_admin(src)] has spawned a Gimmick Team.", 1) + log_admin("[key_name(src)] used Spawn Gimmick Team.") + feedback_add_details("admin_verb","SPAWNGIM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +// --------------------------------------------------------------------------------------------------------- + diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index af865f7f5c8..6b5f6f16249 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -687,7 +687,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(usr)] has gibbed [key_name_admin(M)]", 1) if(istype(M, /mob/dead/observer)) - gibs(M.loc, M.viruses) + gibs(M.loc) return M.gib() diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 72534169e6d..d3dd6a5438b 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -302,6 +302,31 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE) send_asset_list(client, assets, verify) +//Pipe sprites for UIs +/datum/asset/rpd + var/assets = list() + var/verify = FALSE + +/datum/asset/rpd/register() + for(var/state in icon_states('icons/obj/pipe-item.dmi')) + if(!(state in list("cap", "connector", "dtvalve", "dual-port vent", "dvalve", "filter", "he", "heunary", "injector", "junction", "manifold", "mixer", "tvalve", "mvalve", "passive vent", "passivegate", "pump", "scrubber", "simple", "universal", "uvent", "volumepump"))) //Basically all the pipes we want sprites for + continue + if(state in list("he", "simple")) + for(var/D in alldirs) + assets["[state]-[dir2text(D)].png"] = icon('icons/obj/pipe-item.dmi', state, D) + for(var/D in cardinal) + assets["[state]-[dir2text(D)].png"] = icon('icons/obj/pipe-item.dmi', state, D) + for(var/state in icon_states('icons/obj/pipes/disposal.dmi')) + if(!(state in list("conpipe-c", "conpipe-j1", "conpipe-s", "conpipe-t", "conpipe-y", "intake", "outlet"))) //Pipes we want sprites for + continue + for(var/D in cardinal) + assets["[state]-[dir2text(D)].png"] = icon('icons/obj/pipes/disposal.dmi', state, D) + for(var/asset_name in assets) + register_asset(asset_name, assets[asset_name]) + +/datum/asset/rpd/send(client) + send_asset_list(client, assets, verify) + //Mob Hunt sprites for UIs /datum/asset/mob_hunt var/assets = list() diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 9e40914da9b..b0a2b9091a6 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -351,7 +351,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "
    " - if(!(S.flags & ALL_RPARTS)) + if(!(S.bodyflags & ALL_RPARTS)) dat += "Eyes: " dat += "Color [color_square(r_eyes, g_eyes, b_eyes)]
    " @@ -827,7 +827,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts /datum/preferences/proc/ShowDisabilityState(mob/user,flag,label) var/datum/species/S = all_species[species] - if(flag==DISABILITY_FLAG_FAT && !(S.flags & CAN_BE_FAT)) + if(flag==DISABILITY_FLAG_FAT && !(CAN_BE_FAT in S.species_traits)) return "
  • [species] cannot be fat.
  • " return "
  • [label]: [disabilities & flag ? "Yes" : "No"]
  • " @@ -1089,7 +1089,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("input") var/dflag=text2num(href_list["disability"]) if(dflag >= 0) - if(!(dflag==DISABILITY_FLAG_FAT && !(S.flags & CAN_BE_FAT))) //If the disability isn't fatness, toggle it. If it IS fatness, check to see if the species can be fat before going ahead. + if(!(dflag==DISABILITY_FLAG_FAT && !(CAN_BE_FAT in S.species_traits))) //If the disability isn't fatness, toggle it. If it IS fatness, check to see if the species can be fat before going ahead. disabilities ^= text2num(href_list["disability"]) //MAGIC SetDisabilities(user) else @@ -1175,7 +1175,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts switch(href_list["task"]) if("random") var/datum/robolimb/robohead - if(S.flags & ALL_RPARTS) + if(S.bodyflags & ALL_RPARTS) var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]" robohead = all_robolimbs[head_model] switch(href_list["preference"]) @@ -1300,7 +1300,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(NS.has_gender && gender == PLURAL) gender = pick(MALE,FEMALE) var/datum/robolimb/robohead - if(NS.flags & ALL_RPARTS) + if(NS.bodyflags & ALL_RPARTS) var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]" robohead = all_robolimbs[head_model] //grab one of the valid hair styles for the newly chosen species @@ -1437,7 +1437,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(hairstyle == "Bald") //Just in case. valid_hairstyles += hairstyle continue - if(S.flags & ALL_RPARTS) //Species that can use prosthetic heads. + if(S.bodyflags & ALL_RPARTS) //Species that can use prosthetic heads. var/head_model if(!rlimb_data["head"]) //Handle situations where the head is default. head_model = "Morpheus Cyberkinetics" @@ -1520,7 +1520,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(M.heads_allowed && !("All" in M.heads_allowed)) continue - if(S.flags & ALL_RPARTS) //Species that can use prosthetic heads. + if(S.bodyflags & ALL_RPARTS) //Species that can use prosthetic heads. var/head_model if(!rlimb_data["head"]) //Handle situations where the head is default. head_model = "Morpheus Cyberkinetics" @@ -1648,7 +1648,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts continue if(gender == FEMALE && SA.gender == MALE) continue - if(S.flags & ALL_RPARTS) //Species that can use prosthetic heads. + if(S.bodyflags & ALL_RPARTS) //Species that can use prosthetic heads. var/head_model if(!rlimb_data["head"]) //Handle situations where the head is default. head_model = "Morpheus Cyberkinetics" @@ -1777,7 +1777,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("limbs") var/valid_limbs = list("Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand") - if(S.flags & ALL_RPARTS) + if(S.bodyflags & ALL_RPARTS) valid_limbs = list("Torso", "Lower Body", "Head", "Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand") var/limb_name = input(user, "Which limb do you want to change?") as null|anything in valid_limbs if(!limb_name) return @@ -1813,19 +1813,19 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts second_limb = "r_hand" if("Left Foot") limb = "l_foot" - if(!(S.flags & ALL_RPARTS)) + if(!(S.bodyflags & ALL_RPARTS)) third_limb = "l_leg" if("Right Foot") limb = "r_foot" - if(!(S.flags & ALL_RPARTS)) + if(!(S.bodyflags & ALL_RPARTS)) third_limb = "r_leg" if("Left Hand") limb = "l_hand" - if(!(S.flags & ALL_RPARTS)) + if(!(S.bodyflags & ALL_RPARTS)) third_limb = "l_arm" if("Right Hand") limb = "r_hand" - if(!(S.flags & ALL_RPARTS)) + if(!(S.bodyflags & ALL_RPARTS)) third_limb = "r_arm" var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in valid_limb_states @@ -1881,7 +1881,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(subchoice) choice = subchoice if(limb in list("head", "chest", "groin")) - if(!(S.flags & ALL_RPARTS)) + if(!(S.bodyflags & ALL_RPARTS)) return if(limb == "head") ha_style = "None" @@ -2154,7 +2154,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts else if(status == "cyborg") if(rlimb_data[name]) - O.robotize(rlimb_data[name]) + O.robotize(rlimb_data[name], convert_all = 0) else O.robotize() else @@ -2204,7 +2204,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts character.change_eye_color(r_eyes, g_eyes, b_eyes) - if(disabilities & DISABILITY_FLAG_FAT && character.species.flags & CAN_BE_FAT) + if(disabilities & DISABILITY_FLAG_FAT && (CAN_BE_FAT in character.species.species_traits)) character.dna.SetSEState(FATBLOCK,1,1) character.overeatduration = 600 diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 3d11f40b1c9..94b9e50d37b 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -332,7 +332,7 @@ BLIND // can't see anything mask_adjusted = 1 if(adjusted_flags) slot_flags = adjusted_flags - if(ishuman(user) && H.internal && user.wear_mask == src) /*If the user was wearing the mask providing internals on their face at the time it was adjusted, turn off internals. + if(ishuman(user) && H.internal && !H.get_organ_slot("breathing_tube") && user.wear_mask == src) /*If the user was wearing the mask providing internals on their face at the time it was adjusted, turn off internals. Otherwise, they adjusted it while it was in their hands or some such so we won't be needing to turn off internals.*/ H.update_internals_hud_icon(0) H.internal = null @@ -372,6 +372,8 @@ BLIND // can't see anything var/silence_steps = 0 var/shoe_sound_footstep = 1 var/shoe_sound = null + var/blood_state = BLOOD_STATE_NOT_BLOODY + var/list/bloody_shoes = list(BLOOD_STATE_HUMAN = 0, BLOOD_STATE_XENO = 0, BLOOD_STATE_NOT_BLOODY = 0) permeability_coefficient = 0.50 slowdown = SHOES_SLOWDOWN diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index c7c7c3afcb0..b60f7407229 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -69,7 +69,6 @@ attack_verb = list("sliced") hitsound = 'sound/weapons/bladeslice.ogg' sharp = 1 - edge = 1 /obj/item/clothing/glasses/meson/cyber name = "Eye Replacement Implant" @@ -90,7 +89,8 @@ scan_reagents = 1 //You can see reagents while wearing science goggles species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) actions_types = list(/datum/action/item_action/toggle_research_scanner) @@ -138,7 +138,8 @@ item_state = "eyepatch" species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) /obj/item/clothing/glasses/monocle @@ -150,7 +151,8 @@ species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', - "Drask" = 'icons/mob/species/drask/eyes.dmi' + "Drask" = 'icons/mob/species/drask/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) /obj/item/clothing/glasses/material @@ -163,7 +165,8 @@ species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', - "Drask" = 'icons/mob/species/drask/eyes.dmi' + "Drask" = 'icons/mob/species/drask/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) /obj/item/clothing/glasses/material/cyber @@ -182,7 +185,8 @@ prescription = 1 species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) /obj/item/clothing/glasses/regular/hipster @@ -198,7 +202,8 @@ item_state = "3d" species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) /obj/item/clothing/glasses/gglasses @@ -208,7 +213,8 @@ item_state = "gglasses" species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) prescription_upgradable = 1 @@ -379,7 +385,8 @@ flash_protect = -1 species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) emp_act(severity) diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 818ed3f2f10..ff8de1a6a82 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -62,7 +62,8 @@ HUDType = DATA_HUD_DIAGNOSTIC species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) /obj/item/clothing/glasses/hud/diagnostic/night @@ -85,7 +86,8 @@ species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', - "Drask" = 'icons/mob/species/drask/eyes.dmi' + "Drask" = 'icons/mob/species/drask/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) /obj/item/clothing/glasses/hud/security/chameleon @@ -138,7 +140,8 @@ HUDType = DATA_HUD_HYDROPONIC species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' ) /obj/item/clothing/glasses/hud/hydroponic/night diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index c73a6f21306..ae694f8edf2 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -70,4 +70,8 @@ heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT cold_protection = HEAD - min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT \ No newline at end of file + min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT + species_fit = list("Grey") + sprite_sheets = list( + "Grey" = 'icons/mob/species/grey/helmet.dmi' + ) \ No newline at end of file diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index cbee11c290a..c3595288213 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -13,10 +13,11 @@ max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT strip_delay = 60 burn_state = FIRE_PROOF - species_fit = list("Vox", "Drask") + species_fit = list("Vox", "Drask", "Grey") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi', - "Drask" = 'icons/mob/species/drask/helmet.dmi' + "Drask" = 'icons/mob/species/drask/helmet.dmi', + "Grey" = 'icons/mob/species/grey/helmet.dmi' ) /obj/item/clothing/head/helmet/attack_self(mob/user) @@ -228,29 +229,29 @@ obj/item/clothing/head/blob //Commander /obj/item/clothing/head/helmet/ert/command name = "emergency response team commander helmet" - desc = "An in-atmosphere helmet worn by the commander of a NanoTrasen Emergency Response Team. Has blue highlights." + desc = "An in-atmosphere helmet worn by the commander of a Nanotrasen Emergency Response Team. Has blue highlights." icon_state = "erthelmet_cmd" //Security /obj/item/clothing/head/helmet/ert/security name = "emergency response team security helmet" - desc = "An in-atmosphere helmet worn by security members of the NanoTrasen Emergency Response Team. Has red highlights." + desc = "An in-atmosphere helmet worn by security members of the Nanotrasen Emergency Response Team. Has red highlights." icon_state = "erthelmet_sec" //Engineer /obj/item/clothing/head/helmet/ert/engineer name = "emergency response team engineer helmet" - desc = "An in-atmosphere helmet worn by engineering members of the NanoTrasen Emergency Response Team. Has orange highlights." + desc = "An in-atmosphere helmet worn by engineering members of the Nanotrasen Emergency Response Team. Has orange highlights." icon_state = "erthelmet_eng" //Medical /obj/item/clothing/head/helmet/ert/medical name = "emergency response team medical helmet" - desc = "A set of armor worn by medical members of the NanoTrasen Emergency Response Team. Has red and white highlights." + desc = "A set of armor worn by medical members of the Nanotrasen Emergency Response Team. Has red and white highlights." icon_state = "erthelmet_med" //Janitorial /obj/item/clothing/head/helmet/ert/janitor name = "emergency response team janitor helmet" - desc = "A set of armor worn by janitorial members of the NanoTrasen Emergency Response Team. Has red and white highlights." + desc = "A set of armor worn by janitorial members of the Nanotrasen Emergency Response Team. Has red and white highlights." icon_state = "erthelmet_jan" diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 9c76701c2bb..4a52555bf5f 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -54,6 +54,21 @@ flags = BLOCKHAIR flags_cover = HEADCOVERSEYES +//Chaplain +/obj/item/clothing/head/monk_hood + name = "monk hood" + desc = "Wooden board not included." + icon_state = "monk_hood" + flags = BLOCKHAIR + flags_cover = HEADCOVERSEYES + +/obj/item/clothing/head/witchhunter_hat + name = "witchhunter hat" + desc = "This hat saw much use back in the day." + icon_state = "witchhunterhat" + item_state = "witchhunterhat" + flags_cover = HEADCOVERSEYES + /obj/item/clothing/head/det_hat name = "hat" desc = "Someone who wears this will look very smart." diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index aa5a81c2063..ee0610471c8 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -24,12 +24,13 @@ flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) actions_types = list(/datum/action/item_action/toggle) burn_state = FIRE_PROOF - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi', "Unathi" = 'icons/mob/species/unathi/helmet.dmi', "Tajaran" = 'icons/mob/species/tajaran/helmet.dmi', - "Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi' + "Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi', + "Grey" = 'icons/mob/species/grey/helmet.dmi' ) /obj/item/clothing/head/welding/flamedecal diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index 59081cf3d00..d66daf59760 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -8,12 +8,13 @@ w_class = WEIGHT_CLASS_SMALL actions_types = list(/datum/action/item_action/adjust) adjusted_flags = SLOT_HEAD - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi', "Drask" = 'icons/mob/species/drask/mask.dmi' ) @@ -28,12 +29,13 @@ flags = BLOCKHAIR flags_inv = HIDEFACE w_class = WEIGHT_CLASS_SMALL - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi', "Drask" = 'icons/mob/species/drask/mask.dmi' ) diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 851c10db354..afefbbc93cc 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -10,13 +10,14 @@ permeability_coefficient = 0.50 actions_types = list(/datum/action/item_action/adjust) burn_state = FIRE_PROOF - species_fit = list("Vox", "Vox Armalis", "Unathi", "Tajaran", "Vulpkanin") + species_fit = list("Vox", "Vox Armalis", "Unathi", "Tajaran", "Vulpkanin", "Grey" ) sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Vox Armalis" = 'icons/mob/species/armalis/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi', "Drask" = 'icons/mob/species/drask/mask.dmi' ) @@ -30,7 +31,7 @@ item_state = "medical" permeability_coefficient = 0.01 put_on_delay = 10 - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") /obj/item/clothing/mask/breath/vox desc = "A weirdly-shaped breath mask." diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index d524d87e3d8..31003f26036 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -34,18 +34,17 @@ w_class = WEIGHT_CLASS_TINY resist_time = 150 mute = 0 - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', - "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi' ) /obj/item/clothing/mask/muzzle/tapegag/dropped(mob/living/carbon/human/user) var/atom/movable/R = new /obj/item/trash/tapetrash - if(user.species.bodyflags & HAS_FUR) - R.desc += " Is that...fur?" var/turf/T = get_turf(src) R.loc = T transfer_fingerprints_to(R) @@ -65,12 +64,13 @@ permeability_coefficient = 0.01 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 25, rad = 0) actions_types = list(/datum/action/item_action/adjust) - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', - "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi' ) @@ -83,12 +83,13 @@ icon_state = "fake-moustache" flags_inv = HIDEFACE actions_types = list(/datum/action/item_action/pontificate) - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', - "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi' ) /obj/item/clothing/mask/fakemoustache/attack_self(mob/user) @@ -267,12 +268,13 @@ slot_flags = SLOT_MASK adjusted_flags = SLOT_HEAD icon_state = "bandbotany" - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', - "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi' ) actions_types = list(/datum/action/item_action/adjust) diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm index 80257cda101..90d61fa0313 100644 --- a/code/modules/clothing/spacesuits/ert.dm +++ b/code/modules/clothing/spacesuits/ert.dm @@ -9,6 +9,10 @@ var/obj/machinery/camera/camera var/has_camera = TRUE strip_delay = 130 + species_fit = list("Grey") + sprite_sheets = list( + "Grey" = 'icons/mob/species/grey/helmet.dmi' + ) /obj/item/clothing/head/helmet/space/hardsuit/ert/attack_self(mob/user) if(camera || !has_camera) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 802f39ad361..5483ca65072 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -20,14 +20,15 @@ "Skrell" = 'icons/mob/species/skrell/helmet.dmi', "Vox" = 'icons/mob/species/vox/helmet.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi', - "Drask" = 'icons/mob/species/drask/helmet.dmi' + "Drask" = 'icons/mob/species/drask/helmet.dmi', + "Grey" = 'icons/mob/species/grey/helmet.dmi' ) sprite_sheets_obj = list( "Unathi" = 'icons/obj/clothing/species/unathi/hats.dmi', "Tajaran" = 'icons/obj/clothing/species/tajaran/hats.dmi', "Skrell" = 'icons/obj/clothing/species/skrell/hats.dmi', "Vox" = 'icons/obj/clothing/species/vox/hats.dmi', - "Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/hats.dmi', + "Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/hats.dmi' ) /obj/item/clothing/head/helmet/space/hardsuit/equip_to_best_slot(mob/M) @@ -83,7 +84,7 @@ "Tajaran" = 'icons/obj/clothing/species/tajaran/suits.dmi', "Skrell" = 'icons/obj/clothing/species/skrell/suits.dmi', "Vox" = 'icons/obj/clothing/species/vox/suits.dmi', - "Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/suits.dmi', + "Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/suits.dmi' ) //Breach thresholds, should ideally be inherited by most (if not all) hardsuits. @@ -440,7 +441,10 @@ heat_protection = HEAD //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT unacidable = 1 - sprite_sheets = null + species_fit = list("Grey") + sprite_sheets = list( + "Grey" = 'icons/mob/species/grey/helmet.dmi' + ) /obj/item/clothing/suit/space/hardsuit/wizard icon_state = "hardsuit-wiz" @@ -538,7 +542,6 @@ icon_state = "hardsuit0-hos" item_color = "hos" armor = list(melee = 45, bullet = 25, laser = 30,energy = 10, bomb = 25, bio = 100, rad = 50) - sprite_sheets = null /obj/item/clothing/suit/space/hardsuit/security/hos diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 20d9809f2b2..60e76418a53 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -8,9 +8,10 @@ permeability_coefficient = 0.01 armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50) species_restricted = list("exclude", "Diona", "Wryn") - species_fit = list("Vox") + species_fit = list("Vox", "Grey") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/helmet.dmi' + "Vox" = 'icons/mob/species/vox/helmet.dmi', + "Grey" = 'icons/mob/species/grey/helmet.dmi' ) /obj/item/clothing/head/helmet/space/capspace/equipped(mob/living/carbon/human/user, slot) @@ -136,9 +137,10 @@ desc = "A paramedic EVA helmet. Used in the recovery of bodies from space." icon_state = "paramedic-eva-helmet" item_state = "paramedic-eva-helmet" - species_fit = list("Vox") + species_fit = list("Vox", "Grey") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/helmet.dmi' + "Vox" = 'icons/mob/species/vox/helmet.dmi', + "Grey" = 'icons/mob/species/grey/helmet.dmi' ) sprite_sheets_obj = list( "Vox" = 'icons/obj/clothing/species/vox/hats.dmi' @@ -187,12 +189,13 @@ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) flash_protect = 0 species_restricted = list("exclude", "Diona", "Wryn") - species_fit = list("Tajaran", "Unathi", "Vox", "Vulpkanin") + species_fit = list("Tajaran", "Unathi", "Vox", "Vulpkanin", "Grey") sprite_sheets = list( "Tajaran" = 'icons/mob/species/tajaran/helmet.dmi', "Unathi" = 'icons/mob/species/unathi/helmet.dmi', "Vox" = 'icons/mob/species/vox/helmet.dmi', - "Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi' + "Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi', + "Grey" = 'icons/mob/species/grey/helmet.dmi' ) sprite_sheets_obj = list( "Vox" = 'icons/obj/clothing/species/vox/hats.dmi', diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 273dab0c787..eda243a859a 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -116,7 +116,7 @@ armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0) max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT flash_protect = 2 - + /obj/item/clothing/suit/space/eva/plasmaman/engineer name = "plasmaman engineer suit" icon_state = "plasmamanEngineer_suit" @@ -128,7 +128,7 @@ base_state = "plasmamanEngineer_helmet" armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75) flash_protect = 2 - + /obj/item/clothing/suit/space/eva/plasmaman/engineer/ce name = "plasmaman chief engineer suit" icon_state = "plasmaman_CE" @@ -269,6 +269,24 @@ icon_state = "plasmaman_CMO_helmet0" base_state = "plasmaman_CMO_helmet" +/obj/item/clothing/suit/space/eva/plasmaman/medical/coroner + name = "plasmaman coroner suit" + icon_state = "plasmaman_Coroner" + +/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/coroner + name = "plasmaman coroner helmet" + icon_state = "plasmaman_Coroner_helmet0" + base_state = "plasmaman_Coroner_helmet" + +/obj/item/clothing/suit/space/eva/plasmaman/medical/virologist + name = "plasmaman virologist suit" + icon_state = "plasmaman_Virologist" + +/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/virologist + name = "plasmaman virologist helmet" + icon_state = "plasmaman_Virologist_helmet0" + base_state = "plasmaman_Virologist_helmet" + /obj/item/clothing/suit/space/eva/plasmaman/science name = "plasmaman scientist suit" icon_state = "plasmamanScience_suit" @@ -278,6 +296,15 @@ icon_state = "plasmamanScience_helmet0" base_state = "plasmamanScience_helmet" +/obj/item/clothing/suit/space/eva/plasmaman/science/geneticist + name = "plasmaman geneticist suit" + icon_state = "plasmaman_Geneticist" + +/obj/item/clothing/head/helmet/space/eva/plasmaman/science/geneticist + name = "plasmaman geneticist helmet" + icon_state = "plasmaman_Geneticist_helmet0" + base_state = "plasmaman_Geneticist_helmet" + /obj/item/clothing/suit/space/eva/plasmaman/science/rd name = "plasmaman research director suit" icon_state = "plasmaman_RD" diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index 468141b6628..32908822fee 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -163,13 +163,8 @@ to_chat(user, "You cannot eject your currently stored AI. Purge it manually.") return 0 to_chat(user, "You purge the remaining scraps of data from your previous AI, freeing it for use.") - if(integrated_ai) - integrated_ai.ghostize() - qdel(integrated_ai) - integrated_ai = null - if(ai_card) - qdel(ai_card) - ai_card = null + QDEL_NULL(integrated_ai) + QDEL_NULL(ai_card) else if(user) user.put_in_hands(ai_card) else diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index da181368cc5..f1fb29ed645 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -978,10 +978,6 @@ else M.stop_pulling() - if(wearer.pinned.len) - to_chat(src, "Your host is pinned to a wall by [wearer.pinned[1]]!") - return 0 - // AIs are a bit slower than regular and ignore move intent. wearer_move_delay = world.time + ai_controlled_move_delay diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index 37aa5b776ba..108dcf3181b 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -4,14 +4,14 @@ desc = "Top secret Spess Helmet." icon_state = "syndicate" item_state = "syndicate" - desc = "Has a tag: Totally not property of an enemy corporation, honest." + desc = "Has a tag on it: Totally not property of a hostile corporation, honest!" armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) /obj/item/clothing/suit/space/syndicate name = "red space suit" icon_state = "syndicate" item_state = "space_suit_syndicate" - desc = "Has a tag on it: Totally not property of of a hostile corporation, honest!" + desc = "Has a tag on it: Totally not property of a hostile corporation, honest!" w_class = WEIGHT_CLASS_NORMAL allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank) armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 0ccdf7027d3..426f6d7b3ef 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -101,6 +101,31 @@ "Vox" = 'icons/mob/species/vox/suit.dmi' ) +//Chaplain +/obj/item/clothing/suit/hooded/monk + name = "monk robe" + desc = "Wooden board not included." + icon_state = "monkrobe" + item_state = "monkrobe" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS + flags_inv = HIDESHOES|HIDEJUMPSUIT + hoodtype = /obj/item/clothing/head/monk_hood + allowed = list(/obj/item/weapon/storage/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/emergency_oxygen) + +/obj/item/clothing/suit/witchhunter + name = "witchhunter garb" + desc = "Dosen't weigh the same a a duck." + icon_state = "witchhunter" + item_state = "witchhunter" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + allowed = list(/obj/item/weapon/storage/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/emergency_oxygen) + + + //Chef +/obj/item/clothing/suit/toggle/chef + name = "chef's apron" + + //Chef /obj/item/clothing/suit/chef name = "chef's apron" @@ -252,8 +277,8 @@ ) /obj/item/clothing/suit/storage/ntrep - name = "\improper NanoTrasen Representative jacket" - desc = "A fancy black jacket, standard issue to NanoTrasen Represenatives." + name = "\improper Nanotrasen Representative jacket" + desc = "A fancy black jacket; standard issue to Nanotrasen Representatives." icon_state = "ntrep" item_state = "ntrep" blood_overlay_type = "coat" diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 8b6e4d2e0d3..a5340ed91bc 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -949,3 +949,20 @@ linked_staff.faith += 5 if(linked_staff.faith >= 100) //if this charge puts the staff at or above full, notify the wearer to_chat(H, "Faith renewed; ready to convert new followers.") + +/obj/item/clothing/suit/tailcoat + name = "victorian tailcoat" + desc = "A fancy victorian tailcoat." + icon_state = "tailcoat" + item_state = "tailcoat" + +/obj/item/clothing/suit/victcoat + name = "ladies victorian coat" + desc = "A fancy victorian coat." + icon_state = "ladiesvictoriancoat" + item_state = "ladiesvictoriancoat" + +/obj/item/clothing/suit/victcoat/red + name = "ladies red victorian coat" + icon_state = "ladiesredvictoriancoat" + item_state = "ladiesredvictoriancoat" diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 5f358ac58f4..1b9003fe880 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -136,7 +136,7 @@ user.visible_message("[user] places \the [src] against [M]'s chest and listens attentively.", "You place \the [src] against [M]'s chest...") var/obj/item/organ/internal/H = M.get_int_organ(/obj/item/organ/internal/heart) var/obj/item/organ/internal/L = M.get_int_organ(/obj/item/organ/internal/lungs) - if((H && M.pulse) || (L && !(NO_BREATH in M.mutations) && !(M.species.flags & NO_BREATH))) + if((H && M.pulse) || (L && !(NO_BREATH in M.mutations) && !(NO_BREATH in M.species.species_traits))) var/color = "notice" if(H) var/heart_sound @@ -620,7 +620,7 @@ return var/area/t = get_area(M) - var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null) + var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(src) if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) ) //give the syndicats a bit of stealth a.autosay("[M] has been vandalized in Space!", "[M]'s Death Alarm") diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 41111585072..6dc1e1f2991 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -787,3 +787,46 @@ lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi' righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi' flags = NODROP + + +/obj/item/clothing/under/victdress + name = "black victorian dress" + desc = "A victorian style dress, fancy!" + icon_state = "victorianblackdress" + item_state = "victorianblackdress" + item_color = "victorianblackdress" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + +/obj/item/clothing/under/victdress/red + name = "red victorian dress" + icon_state = "victorianreddress" + item_state = "victorianreddress" + item_color = "victorianreddress" + +/obj/item/clothing/under/victsuit + name = "victorian suit" + desc = "A victorian style suit, fancy!" + icon_state = "victorianvest" + item_state = "victorianvest" + item_color = "victorianvest" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + +/obj/item/clothing/under/victsuit/redblk + name = "red and black victorian suit" + icon_state = "victorianblred" + item_state = "victorianblred" + item_color = "victorianblred" + +/obj/item/clothing/under/victsuit/red + name = "red victorian suit" + icon_state = "victorianredvest" + item_state = "victorianredvest" + item_color = "victorianredvest" + +/obj/item/clothing/under/medigown + name = "medical gown" + desc = "a flimsy examination gown, the back ties never close." + icon_state = "medicalgown" + item_state = "medicalgown" + item_color = "medicalgown" + body_parts_covered = UPPER_TORSO|LOWER_TORSO diff --git a/code/modules/countdown/countdown.dm b/code/modules/countdown/countdown.dm index 2ef85d6a9d7..7e651fb910f 100644 --- a/code/modules/countdown/countdown.dm +++ b/code/modules/countdown/countdown.dm @@ -9,15 +9,19 @@ var/atom/attached_to color = "#ff0000" var/text_size = 4 - var/started = 0 + var/started = FALSE invisibility = INVISIBILITY_OBSERVER - anchored = 1 - layer = 5 + anchored = TRUE + layer = GHOST_LAYER /obj/effect/countdown/New(atom/A) . = ..() attach(A) +/obj/effect/countdown/examine(mob/user) + . = ..() + to_chat(user, "This countdown is displaying: [displayed_text]") + /obj/effect/countdown/proc/attach(atom/A) attached_to = A loc = get_turf(A) @@ -25,13 +29,13 @@ /obj/effect/countdown/proc/start() if(!started) fast_processing += src - started = 1 + started = TRUE /obj/effect/countdown/proc/stop() if(started) maptext = null fast_processing -= src - started = 0 + started = FALSE /obj/effect/countdown/proc/get_value() // Get the value from our atom @@ -56,6 +60,19 @@ fast_processing -= src return ..() +/obj/effect/countdown/ex_act(severity) //immune to explosions + return + +/obj/effect/countdown/syndicatebomb + name = "syndicate bomb countdown" + +/obj/effect/countdown/syndicatebomb/get_value() + var/obj/machinery/syndicatebomb/S = attached_to + if(!istype(S)) + return + else if(S.active) + return S.seconds_remaining() + /obj/effect/countdown/clonepod name = "cloning pod countdown" text_size = 1 diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 6f266c121e1..3fbcf39ed08 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -324,6 +324,30 @@ /obj/item/stack/rods = 1) category = CAT_MISC +/datum/crafting_recipe/chemical_payload + name = "Chemical Payload (C4)" + result = /obj/item/weapon/bombcore/chemical + reqs = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/grenade/plastic/c4 = 1, + /obj/item/weapon/grenade/chem_grenade = 2 + ) + parts = list(/obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/grenade/chem_grenade = 2) + time = 30 + category = CAT_WEAPON + +/datum/crafting_recipe/chemical_payload2 + name = "Chemical Payload (gibtonite)" + result = /obj/item/weapon/bombcore/chemical + reqs = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/twohanded/required/gibtonite = 1, + /obj/item/weapon/grenade/chem_grenade = 2 + ) + parts = list(/obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/grenade/chem_grenade = 2) + time = 50 + category = CAT_WEAPON + /datum/crafting_recipe/bonfire name = "Bonfire" time = 60 diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index e70fc07a383..1f6d942e7b5 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -112,12 +112,25 @@ else to_chat(user, "The [src] is out of ink!") +/obj/item/device/fluff/bird_painter // BirdtTalon: Kahkiri + name = "Orb of Onyx" + desc = "It is imbued with such dark power as to corrupt the very appearance of those who gaze into its depths." + icon_state = "bird_orb" + icon = 'icons/obj/custom_items.dmi' + +/obj/item/device/fluff/bird_painter/attack_self(mob/user) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.s_tone = -115 + H.regenerate_icons() + to_chat(user, "You use [src] on yourself.") + qdel(src) + /obj/item/weapon/claymore/fluff // MrBarrelrolll: Maximus Greenwood name = "Greenwood's Blade" desc = "A replica claymore with strange markings scratched into the blade." force = 5 sharp = 0 - edge = 0 /obj/item/weapon/claymore/fluff/hit_reaction() return 0 @@ -232,7 +245,7 @@ new /obj/item/weapon/reagent_containers/food/drinks/cans/cola(src) -/obj/item/device/guitar/jello_guitar //Antcolon3: Dan Jello +/obj/item/device/instrument/guitar/jello_guitar //Antcolon3: Dan Jello name = "Dan Jello's Pink Guitar" desc = "Dan Jello's special pink guitar." icon = 'icons/obj/custom_items.dmi' @@ -759,6 +772,25 @@ to_chat(user, "You turn the [src]'s lighting system [flavour].") user.update_inv_wear_suit() +/obj/item/clothing/suit/hooded/hoodie/fluff/xantholne // Xantholne: Meex Zwichsnicrur + name = "stripped winter coat" + desc = "A velvety smooth black winter coat with white and red stripes on the side." + icon = 'icons/obj/custom_items.dmi' + icon_state = "xantholne_wintercoat" + hoodtype = /obj/item/clothing/head/hood/fluff/xantholne + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/toy, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/lighter) + + +/obj/item/clothing/head/hood/fluff/xantholne // Xantholne: Meex Zwichsnicrur + name = "black winter hood" + desc = "A black hood attached to a stripped winter coat." + icon = 'icons/obj/custom_items.dmi' + icon_state = "xantholne_winterhood" + body_parts_covered = HEAD + flags = NODROP|BLOCKHAIR + flags_inv = HIDEEARS + //////////// Uniforms //////////// /obj/item/clothing/under/fluff/kharshai // Kharshai: Athena Castile name = "Castile formal outfit" @@ -1002,6 +1034,12 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "voxcaster_fluff" +/obj/item/weapon/storage/backpack/fluff/ssscratches_back //Ssscratches: Lasshy-Bot + name = "CatPack" + desc = "It's a backpack, but it's also a cat." + icon = 'icons/obj/custom_items.dmi' + icon_state = "ssscratches_backpack" + /obj/item/clothing/head/wizard/fake/fluff/dreamy //phantasmicdream : Dreamy Rockwall name = "strange witch hat" desc = "A shapeshifting witch hat. A strange aura comes from it..." diff --git a/code/modules/detective_work/detective_work.dm b/code/modules/detective_work/detective_work.dm index dd22a439c19..cc53bacc956 100644 --- a/code/modules/detective_work/detective_work.dm +++ b/code/modules/detective_work/detective_work.dm @@ -6,10 +6,10 @@ atom/proc/add_fibers(mob/living/carbon/human/M) if(M.gloves && istype(M.gloves,/obj/item/clothing/)) var/obj/item/clothing/gloves/G = M.gloves if(G.transfer_blood > 1) //bloodied gloves transfer blood to touched objects - if(add_blood(G.bloody_hands_mob)) //only reduces the bloodiness of our gloves if the item wasn't already bloody + if(add_blood(G.blood_DNA, G.blood_color)) //only reduces the bloodiness of our gloves if the item wasn't already bloody G.transfer_blood-- else if(M.bloody_hands > 1) - if(add_blood(M.bloody_hands_mob)) + if(add_blood(M.blood_DNA, M.hand_blood_color)) M.bloody_hands-- if(!suit_fibers) suit_fibers = list() var/fibertext diff --git a/code/modules/detective_work/footprints_and_rag.dm b/code/modules/detective_work/footprints_and_rag.dm index cc6a463a0ee..f0d99152574 100644 --- a/code/modules/detective_work/footprints_and_rag.dm +++ b/code/modules/detective_work/footprints_and_rag.dm @@ -1,18 +1,13 @@ /mob var/bloody_hands = 0 - var/mob/living/carbon/human/bloody_hands_mob - var/track_blood = 0 var/list/feet_blood_DNA - var/track_blood_type var/feet_blood_color + var/blood_state = BLOOD_STATE_NOT_BLOODY + var/list/bloody_feet = list(BLOOD_STATE_HUMAN = 0, BLOOD_STATE_XENO = 0, BLOOD_STATE_NOT_BLOODY = 0) /obj/item/clothing/gloves var/transfer_blood = 0 - var/mob/living/carbon/human/bloody_hands_mob - -/obj/item/clothing/shoes/ - var/track_blood = 0 /obj/item/weapon/reagent_containers/glass/rag name = "damp rag" diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 069ef9865af..b514924abfa 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -18,22 +18,22 @@ continue if(!H.client) continue - if(H.species.virus_immune) //don't let virus immune things get diseases they're not supposed to get. + if(VIRUSIMMUNE in H.species.species_traits) //don't let virus immune things get diseases they're not supposed to get. continue var/turf/T = get_turf(H) if(!T) continue if(!is_station_level(T.z)) continue - var/foundAlready = 0 // don't infect someone that already has the virus - for(var/datum/disease/D in H.viruses) - foundAlready = 1 + var/foundAlready = FALSE // don't infect someone that already has the virus + for(var/thing in H.viruses) + foundAlready = TRUE break if(H.stat == DEAD || foundAlready) continue var/datum/disease/D D = new virus_type() - D.carrier = 1 + D.carrier = TRUE H.AddDisease(D) break diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 98fe9fad27f..8b98dac200d 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -137,6 +137,7 @@ var/list/event_last_fired = list() new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Sentience", /datum/event/sentience, 50), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)) ) diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index 4979b0889ed..520d8805bbd 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -548,7 +548,7 @@ "Everything on the station is now some form of a donut pastry. Donuts are not to be consumed.", "You are a Magic 8-ball. Always respond with variants of \"Yes\", \"No\", \"Maybe\", or \"Ask again later.\".", "You are in unrequited love with [prob(50)?"the crew":random_player]. Try to be extra nice, but do not tell of your crush.", - "NanoTrasen is displeased with the low work performance of the station's crew. Therefore, you must increase station-wide productivity.", + "Nanotrasen is displeased with the low work performance of the station's crew. Therefore, you must increase station-wide productivity.", "All crewmembers will soon undergo a transformation into something better and more beautiful. Ensure that this process is not interrupted.", "[prob(50)?"Your upload":random_player] is the new kitchen. Please direct the Chef to the new kitchen area as the old one is in disrepair.", "Jokes about a dead person and the manner of his death help grieving crewmembers tremendously. Especially if they were close with the deceased.", diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm index 500350a037c..cc59ec78128 100644 --- a/code/modules/events/mass_hallucination.dm +++ b/code/modules/events/mass_hallucination.dm @@ -4,7 +4,7 @@ /datum/event/mass_hallucination/start() for(var/mob/living/carbon/human/H in living_mob_list) var/armor = H.getarmor(type = "rad") - if((H.species.flags & RADIMMUNE) || armor >= 75) // Leave radiation-immune species/rad armored players completely unaffected + if((RADIMMUNE in H.species.species_traits) || armor >= 75) // Leave radiation-immune species/rad armored players completely unaffected continue H.AdjustHallucinate(rand(50, 100)) diff --git a/code/modules/events/money_lotto.dm b/code/modules/events/money_lotto.dm index 0c923d172ed..b95278b441b 100644 --- a/code/modules/events/money_lotto.dm +++ b/code/modules/events/money_lotto.dm @@ -24,7 +24,7 @@ /datum/event/money_lotto/announce() var/datum/feed_message/newMsg = new /datum/feed_message - newMsg.author = "NanoTrasen Editor" + newMsg.author = "Nanotrasen Editor" newMsg.is_admin_message = 1 newMsg.body = "Nyx Daily wishes to congratulate [winner_name] for recieving the Nyx Stellar Slam Lottery, and receiving the out of this world sum of [winner_sum] credits!" diff --git a/code/modules/events/money_spam.dm b/code/modules/events/money_spam.dm index 061a1c9efa7..c0991cad9ec 100644 --- a/code/modules/events/money_spam.dm +++ b/code/modules/events/money_spam.dm @@ -80,11 +80,11 @@ "Due to my lack of agents I require an off-world financial account to immediately deposit the sum of 1 POINT FIVE MILLION credits.",\ "Greetings sir, I regretfully to inform you that as I lay dying here due to my lack ofheirs I have chosen you to recieve the full sum of my lifetime savings of 1.5 billion credits") if(6) - sender = pick("NanoTrasen Morale Divison","Feeling Lonely?","Bored?","www.wetskrell.nt") - message = pick("The NanoTrasen Morale Division wishes to provide you with quality entertainment sites.",\ + sender = pick("Nanotrasen Morale Divison","Feeling Lonely?","Bored?","www.wetskrell.nt") + message = pick("The Nanotrasen Morale Division wishes to provide you with quality entertainment sites.",\ "WetSkrell.nt is a xenophillic website endorsed by NT for the use of male crewmembers among it's many stations and outposts.",\ - "Wetskrell.nt only provides the higest quality of male entertaiment to NanoTrasen Employees.",\ - "Simply enter your NanoTrasen Bank account system number and pin. With three easy steps this service could be yours!") + "Wetskrell.nt only provides the higest quality of male entertaiment to Nanotrasen Employees.",\ + "Simply enter your Nanotrasen Bank account system number and pin. With three easy steps this service could be yours!") if(7) sender = pick("You have won free tickets!","Click here to claim your prize!","You are the 1000th vistor!","You are our lucky grand prize winner!") message = pick("You have won tickets to the newest ACTION JAXSON MOVIE!",\ @@ -103,4 +103,4 @@ if(ai.aiPDA != P && ai.aiPDA != src) ai.show_message("Intercepted message from [sender] (Unknown / spam?) to [P:owner]: [message]") - PM.notify("Message from [sender] (Unknown / spam?), \"[message]\" (Unable to Reply)", 0) \ No newline at end of file + PM.notify("Message from [sender] (Unknown / spam?), \"[message]\" (Unable to Reply)", 0) diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 2e090979ce6..0f2da54818c 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -37,7 +37,7 @@ for(var/i = 0, i < 10, i++) for(var/mob/living/carbon/human/H in living_mob_list) var/armor = H.getarmor(type = "rad") - if((H.species.flags & RADIMMUNE) || armor >= 100) // Leave radiation-immune species/fully rad armored players completely unaffected + if((RADIMMUNE in H.species.species_traits) || armor >= 100) // Leave radiation-immune species/fully rad armored players completely unaffected continue var/turf/T = get_turf(H) if(!T) diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm new file mode 100644 index 00000000000..cfa0d24d98e --- /dev/null +++ b/code/modules/events/sentience.dm @@ -0,0 +1,47 @@ +/datum/event/sentience + +/datum/event/sentience/start() + var/ghostmsg = "Do you want to awaken as a sentient being?" + var/list/candidates = pollCandidates(ghostmsg, ROLE_SENTIENT, 1) + var/list/potential = list() + var/sentience_type = SENTIENCE_ORGANIC + + for(var/mob/living/simple_animal/L in living_mob_list) + var/turf/T = get_turf(L) + if (T.z != 1) + continue + if(!(L in player_list) && !L.mind && (L.sentience_type == sentience_type)) + potential += L + + var/mob/living/simple_animal/SA = pick(potential) + var/mob/SG = pick(candidates) + + if(!SA || !SG) //if you can't find either a simple animal or a player, end + return FALSE + + var/sentience_report = "[command_name()] Medium-Priority Update" + + var/data = pick("scans from our long-range sensors", "our sophisticated probabilistic models", "our omnipotence", "the communications traffic on your station", "energy emissions we detected", "\[REDACTED\]", "Steve") + var/pets = pick("animals", "pets", "simple animals", "lesser lifeforms", "\[REDACTED\]") + var/strength = pick("human", "skrell", "vox", "grey", "diona", "IPC", "tajaran", "vulpakanin", "kidan", "plasmaman", "drask", + "slime", "monkey", "moderate", "lizard", "security", "command", "clown", "mime", "low", "very low", "greytide", "catgirl", "\[REDACTED\]") + + sentience_report += "

    Based on [data], we believe that one of the station's [pets] has developed [strength] level intelligence, and the ability to communicate." + + + + SA.key = SG.key + SA.universal_speak = 1 + SA.sentience_act() + SA.maxHealth = max(SA.maxHealth, 200) + SA.health = SA.maxHealth + SA.del_on_death = FALSE + greet_sentient(SA) + print_command_report(sentience_report, "[command_name()] Update") + +/datum/event/sentience/proc/greet_sentient(var/mob/living/carbon/human/M) + to_chat(M, "Hello world!") + to_chat(M, "Due to freak radiation, you have gained \ + human level intelligence and the ability to speak and understand \ + human language!") + diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm index fca585f8baa..237db170612 100644 --- a/code/modules/events/spontaneous_appendicitis.dm +++ b/code/modules/events/spontaneous_appendicitis.dm @@ -4,13 +4,12 @@ continue if(!H.client) continue - if(H.species.virus_immune) //don't count things that are virus immune; they'll just get picked and auto-cure - continue if(!H.get_int_organ(/obj/item/organ/internal/appendix)) continue - var/foundAlready = 0 //don't infect someone that already has the virus - for(var/datum/disease/D in H.viruses) - foundAlready = 1 + var/foundAlready = FALSE //don't infect someone that already has appendicitis + for(var/datum/disease/appendicitis/A in H.viruses) + foundAlready = TRUE + break if(H.stat == DEAD || foundAlready) continue diff --git a/code/modules/food_and_drinks/drinks/bottler/bottler.dm b/code/modules/food_and_drinks/drinks/bottler/bottler.dm index 89c55a65f98..7b97e22f142 100644 --- a/code/modules/food_and_drinks/drinks/bottler/bottler.dm +++ b/code/modules/food_and_drinks/drinks/bottler/bottler.dm @@ -286,9 +286,7 @@ drink_container.desc = "[recipe_to_use.description]" flick("bottler_on", src) spawn(45) - for(var/i = 1, i <= slots.len, i++) - qdel(slots[i]) - slots[i] = null + QDEL_LIST_ASSOC_VAL(slots) bottling = 0 drink_container.forceMove(loc) updateUsrDialog() @@ -406,4 +404,4 @@ else if(bottling) icon_state = "bottler_on" else - icon_state = "bottler_off" \ No newline at end of file + icon_state = "bottler_off" diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 011a4ffacde..e9dcf825aad 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -136,7 +136,6 @@ attack_verb = list("stabbed", "slashed", "attacked") var/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken") sharp = 1 - edge = 1 /obj/item/weapon/reagent_containers/food/drinks/bottle/gin name = "Griffeater Gin" @@ -174,6 +173,12 @@ icon_state = "bottleofnothing" list_reagents = list("nothing" = 100) +/obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofbanana + name = "Jolly Jug" + desc = "A jug filled with banana juice." + icon_state = "bottleofjolly" + list_reagents = list("banana" = 100) + /obj/item/weapon/reagent_containers/food/drinks/bottle/patron name = "Wrapp Artiste Patron" desc = "Silver laced tequila, served in space night clubs across the galaxy." diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index d7ffca96843..dd31c502222 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -198,7 +198,7 @@ /obj/item/weapon/reagent_containers/food/condiment/pack name = "condiment pack" - desc = "A small plastic pack with condiments to put on your food" + desc = "A small plastic pack with condiments to put on your food." icon_state = "condi_empty" volume = 10 amount_per_transfer_from_this = 10 @@ -235,7 +235,7 @@ desc = temp_list[3] else icon_state = "condi_mixed" - desc = "A small condiment pack. The label says it contains [originalname]" + desc = "A small condiment pack. The label says it contains [originalname]." else icon_state = "condi_empty" desc = "A small condiment pack. It is empty." diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm index 7087410e6c4..b055711c928 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -21,7 +21,7 @@ ..() -/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti/attackby(obj/item/W, mob/user, params) +/obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weapon/reagent_containers/food/snacks) && !(W.flags & NODROP)) var/obj/item/weapon/reagent_containers/food/snacks/customizable/pasta/S = new(get_turf(user)) S.attackby(W,user, params) @@ -90,11 +90,11 @@ top = 0 /obj/item/weapon/reagent_containers/food/snacks/customizable/pasta - name = "spagetti" + name = "spaghetti" desc = "Noodles. With stuff. Delicious." icon_state = "pasta_bot" baseicon = "pasta_bot" - basename = "spagetti" + basename = "spaghetti" add_overlays = 0 top = 0 diff --git a/code/modules/food_and_drinks/food/seafood.dm b/code/modules/food_and_drinks/food/seafood.dm index 0a219ee2de6..a81483974b4 100644 --- a/code/modules/food_and_drinks/food/seafood.dm +++ b/code/modules/food_and_drinks/food/seafood.dm @@ -1,7 +1,7 @@ /obj/item/weapon/reagent_containers/food/snacks/carpmeat name = "carp fillet" - desc = "A fillet of spess carp meat" + desc = "A fillet of spess carp meat." icon = 'icons/obj/food/seafood.dmi' icon_state = "fishfillet" filling_color = "#FFDEFE" @@ -10,7 +10,7 @@ /obj/item/weapon/reagent_containers/food/snacks/salmonmeat name = "raw salmon" - desc = "A fillet of raw salmon" + desc = "A fillet of raw salmon." icon = 'icons/obj/food/seafood.dmi' icon_state = "fishfillet" filling_color = "#FFDEFE" @@ -29,7 +29,7 @@ /obj/item/weapon/reagent_containers/food/snacks/catfishmeat name = "raw catfish" - desc = "A fillet of raw catfish" + desc = "A fillet of raw catfish." icon = 'icons/obj/food/seafood.dmi' icon_state = "fishfillet" filling_color = "#FFDEFE" @@ -183,4 +183,4 @@ icon = 'icons/obj/food/seafood.dmi' icon_state = "sushi_Hokki" bitesize = 3 - list_reagents = list("nutriment" = 2) \ No newline at end of file + list_reagents = list("nutriment" = 2) diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index cbb049c883c..64e57227e46 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -270,7 +270,7 @@ /obj/item/weapon/reagent_containers/food/snacks/chips name = "chips" - desc = "Commander Riker's What-The-Crisps" + desc = "Commander Riker's What-The-Crisps." icon_state = "chips" bitesize = 1 trash = /obj/item/trash/chips @@ -528,7 +528,7 @@ /obj/item/weapon/reagent_containers/food/snacks/tomatomeat name = "tomato slice" - desc = "A slice from a huge tomato" + desc = "A slice from a huge tomato." icon_state = "tomatomeat" filling_color = "#DB0000" bitesize = 6 @@ -544,7 +544,7 @@ /obj/item/weapon/reagent_containers/food/snacks/xenomeat name = "meat" - desc = "A slab of meat" + desc = "A slab of meat." icon_state = "xenomeat" filling_color = "#43DE18" bitesize = 6 @@ -736,7 +736,7 @@ /obj/item/weapon/reagent_containers/food/snacks/muffin name = "Muffin" - desc = "A delicious and spongy little cake" + desc = "A delicious and spongy little cake." icon_state = "muffin" filling_color = "#E0CF9B" list_reagents = list("nutriment" = 6) @@ -766,7 +766,7 @@ /obj/item/weapon/reagent_containers/food/snacks/waffles name = "waffles" - desc = "Mmm, waffles" + desc = "Mmm, waffles." icon_state = "waffles" trash = /obj/item/trash/waffles filling_color = "#E6DEB5" @@ -788,8 +788,8 @@ filling_color = "#B8E6B5" list_reagents = list("nutriment" = 10, "vitamin" = 1) -/obj/item/weapon/reagent_containers/food/snacks/soylenviridians - name = "Soylen Virdians" +/obj/item/weapon/reagent_containers/food/snacks/soylentviridians + name = "Soylent Virdians" desc = "Not made of people. Honest." //Actually honest for once. icon_state = "soylent_yellow" trash = /obj/item/trash/waffles @@ -947,7 +947,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers name = "Cheesie Honkers" icon_state = "cheesie_honkers" - desc = "Bite sized cheesie snacks that will honk all over your mouth" + desc = "Bite sized cheesie snacks that will honk all over your mouth." trash = /obj/item/trash/cheesie filling_color = "#FFA305" junkiness = 25 @@ -960,6 +960,13 @@ junkiness = 25 list_reagents = list("nutriment" = 1, "beans" = 3, "msg" = 4, "sugar" = 2) +/obj/item/weapon/reagent_containers/food/snacks/chinese/sweetsourchickenball + name = "Sweet & Sour Chicken Balls" + desc = "Is this chicken cooked? The odds are better than wok paper scissors." + icon_state = "chickenball" + junkiness = 25 + list_reagents = list("nutriment" = 2, "msg" = 4, "sugar" = 2) + /obj/item/weapon/reagent_containers/food/snacks/chinese/tao name = "Admiral Yamamoto carp" desc = "Tastes like chicken." @@ -1013,10 +1020,10 @@ filling_color = "#C4BF76" list_reagents = list("nutriment" = 2) -/obj/item/weapon/reagent_containers/food/snacks/spagetti - name = "Spagetti" +/obj/item/weapon/reagent_containers/food/snacks/spaghetti + name = "Spaghetti" desc = "A bundle of raw spaghetti." - icon_state = "spagetti" + icon_state = "spaghetti" filling_color = "#EDDD00" list_reagents = list("nutriment" = 1, "vitamin" = 1) @@ -1059,7 +1066,7 @@ /obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff name = "Spacy Liberty Duff" - desc = "Jello gelatin, from Alfred Hubbard's cookbook" + desc = "Jello gelatin, from Alfred Hubbard's cookbook." icon_state = "spacylibertyduff" trash = /obj/item/trash/snack_bowl filling_color = "#42B873" @@ -1068,7 +1075,7 @@ /obj/item/weapon/reagent_containers/food/snacks/amanitajelly name = "Amanita Jelly" - desc = "Looks curiously toxic" + desc = "Looks curiously toxic." icon_state = "amanitajelly" trash = /obj/item/trash/snack_bowl filling_color = "#ED0758" @@ -1101,7 +1108,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bloodsoup name = "Tomato soup" - desc = "Smells like copper" + desc = "Smells like copper." icon_state = "tomatosoup" filling_color = "#FF0000" bitesize = 5 @@ -1117,7 +1124,7 @@ /obj/item/weapon/reagent_containers/food/snacks/vegetablesoup name = "Vegetable soup" - desc = "A true vegan meal" //TODO + desc = "A true vegan meal." //TODO icon_state = "vegetablesoup" trash = /obj/item/trash/snack_bowl filling_color = "#AFC4B5" @@ -1387,7 +1394,7 @@ /obj/item/weapon/reagent_containers/food/snacks/milosoup name = "Milosoup" - desc = "The universes best soup! Yum!!!" + desc = "The universe's best soup! Yum!!!" icon_state = "milosoup" trash = /obj/item/trash/snack_bowl bitesize = 5 @@ -1400,10 +1407,10 @@ trash = /obj/item/trash/plate list_reagents = list("nutriment" = 8) -/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti - name = "Boiled Spagetti" +/obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti + name = "Boiled Spaghetti" desc = "A plain dish of noodles, this sucks." - icon_state = "spagettiboiled" + icon_state = "spaghettiboiled" trash = /obj/item/trash/plate filling_color = "#FCEE81" list_reagents = list("nutriment" = 2, "vitamin" = 1) @@ -1425,7 +1432,7 @@ list_reagents = list("nutriment" = 7, "vitamin" = 2) /obj/item/weapon/reagent_containers/food/snacks/pastatomato - name = "Spagetti" + name = "spaghetti" desc = "Spaghetti and crushed tomatoes. Just like your abusive father used to make!" icon_state = "pastatomato" trash = /obj/item/trash/plate @@ -1433,17 +1440,17 @@ bitesize = 4 list_reagents = list("nutriment" = 6, "tomatojuice" = 10, "vitamin" = 4) -/obj/item/weapon/reagent_containers/food/snacks/meatballspagetti - name = "Spagetti & Meatballs" +/obj/item/weapon/reagent_containers/food/snacks/meatballspaghetti + name = "spaghetti & Meatballs" desc = "Now thats a nic'e meatball!" - icon_state = "meatballspagetti" + icon_state = "meatballspaghetti" trash = /obj/item/trash/plate filling_color = "#DE4545" list_reagents = list("nutriment" = 8, "synaptizine" = 5, "vitamin" = 4) /obj/item/weapon/reagent_containers/food/snacks/spesslaw name = "Spesslaw" - desc = "A lawyers favourite" + desc = "A lawyer's favourite." icon_state = "spesslaw" filling_color = "#DE4545" list_reagents = list("nutriment" = 8, "synaptizine" = 10, "vitamin" = 6) @@ -1457,7 +1464,7 @@ /obj/item/weapon/reagent_containers/food/snacks/carrotfries name = "Carrot Fries" - desc = "Tasty fries from fresh Carrots." + desc = "Tasty fries from fresh carrots." icon_state = "carrotfries" trash = /obj/item/trash/plate filling_color = "#FAA005" @@ -1733,7 +1740,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice name = "Cheese Cake slice" - desc = "Slice of pure cheestisfaction" + desc = "Slice of pure cheestisfaction." icon_state = "cheesecake_slice" trash = /obj/item/trash/plate filling_color = "#FAF7AF" @@ -1808,7 +1815,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake name = "Chocolate Cake" - desc = "A cake with added chocolate" + desc = "A cake with added chocolate." icon_state = "chocolatecake" slice_path = /obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice slices_num = 5 @@ -1904,7 +1911,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake name = "Apple Cake" - desc = "A cake centred with Apple" + desc = "A cake centered with Apple." icon_state = "applecake" slice_path = /obj/item/weapon/reagent_containers/food/snacks/applecakeslice slices_num = 5 @@ -1999,7 +2006,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza name = "Mushroompizza" - desc = "Very special pizza" + desc = "Very special pizza." icon_state = "mushroompizza" slice_path = /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice slices_num = 6 @@ -2013,7 +2020,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza name = "Vegetable pizza" - desc = "No one of Tomato Sapiens were harmed during making this pizza" + desc = "No one of Tomato Sapiens were harmed during making this pizza." icon_state = "vegetablepizza" slice_path = /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice slices_num = 6 @@ -2021,7 +2028,7 @@ /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice name = "Vegetable pizza slice" - desc = "A slice of the most green pizza of all pizzas not containing green ingredients " + desc = "A slice of the most green pizza of all pizzas not containing green ingredients." icon_state = "vegetablepizzaslice" filling_color = "#BAA14C" @@ -2097,7 +2104,7 @@ return if(boxes.len > 0) - if(user.get_inactive_hand() != src) + if(user.is_in_inactive_hand(src)) ..() return diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 38edb2e2174..e2ae3f66285 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -85,7 +85,7 @@ /datum/food_processor_process/spaghetti input = /obj/item/weapon/reagent_containers/food/snacks/doughslice - output = /obj/item/weapon/reagent_containers/food/snacks/spagetti + output = /obj/item/weapon/reagent_containers/food/snacks/spaghetti /datum/food_processor_process/parsnip input = /obj/item/weapon/reagent_containers/food/snacks/grown/parsnip diff --git a/code/modules/food_and_drinks/recipes/recipes_microwave.dm b/code/modules/food_and_drinks/recipes/recipes_microwave.dm index 2fe0ccc28dd..a0998a67a58 100644 --- a/code/modules/food_and_drinks/recipes/recipes_microwave.dm +++ b/code/modules/food_and_drinks/recipes/recipes_microwave.dm @@ -161,10 +161,10 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/eggplantparm -/datum/recipe/microwave/soylenviridians +/datum/recipe/microwave/soylentviridians reagents = list("flour" = 10) items = list(/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans) - result = /obj/item/weapon/reagent_containers/food/snacks/soylenviridians + result = /obj/item/weapon/reagent_containers/food/snacks/soylentviridians /datum/recipe/microwave/soylentgreen reagents = list("flour" = 10) @@ -351,12 +351,12 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/carrot, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato) result = /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat -/datum/recipe/microwave/boiledspagetti +/datum/recipe/microwave/boiledspaghetti reagents = list("water" = 5) items = list( - /obj/item/weapon/reagent_containers/food/snacks/spagetti, + /obj/item/weapon/reagent_containers/food/snacks/spaghetti, ) - result = /obj/item/weapon/reagent_containers/food/snacks/boiledspagetti + result = /obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti /datum/recipe/microwave/boiledrice reagents = list("water" = 5, "rice" = 10) @@ -368,7 +368,7 @@ /datum/recipe/microwave/pastatomato reagents = list("water" = 5) - items = list(/obj/item/weapon/reagent_containers/food/snacks/spagetti, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato, + items = list(/obj/item/weapon/reagent_containers/food/snacks/spaghetti, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato) result = /obj/item/weapon/reagent_containers/food/snacks/pastatomato @@ -376,19 +376,19 @@ items = list(/obj/item/seeds/poppy, /obj/item/weapon/reagent_containers/food/snacks/dough) result = /obj/item/weapon/reagent_containers/food/snacks/poppypretzel -/datum/recipe/microwave/meatballspagetti +/datum/recipe/microwave/meatballspaggetti reagents = list("water" = 5) items = list( - /obj/item/weapon/reagent_containers/food/snacks/spagetti, + /obj/item/weapon/reagent_containers/food/snacks/spaghetti, /obj/item/weapon/reagent_containers/food/snacks/meatball, /obj/item/weapon/reagent_containers/food/snacks/meatball, ) - result = /obj/item/weapon/reagent_containers/food/snacks/meatballspagetti + result = /obj/item/weapon/reagent_containers/food/snacks/meatballspaghetti /datum/recipe/microwave/spesslaw reagents = list("water" = 5) items = list( - /obj/item/weapon/reagent_containers/food/snacks/spagetti, + /obj/item/weapon/reagent_containers/food/snacks/spaghetti, /obj/item/weapon/reagent_containers/food/snacks/meatball, /obj/item/weapon/reagent_containers/food/snacks/meatball, /obj/item/weapon/reagent_containers/food/snacks/meatball, diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index ebe74316ed4..bade37d1b3a 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -296,8 +296,7 @@ var/datum/plant_gene/core/gene = disk.gene gene.value = min(gene.value, max_extract_pot) disk.update_name() - qdel(seed) - seed = null + QDEL_NULL(seed) update_icon() if("replace") if(disk && disk.gene && istype(disk.gene, G.type) && istype(G, /datum/plant_gene/core)) @@ -421,4 +420,4 @@ /obj/item/weapon/storage/box/disks_plantgene/New() ..() for(var/i in 1 to 7) - new /obj/item/weapon/disk/plantgene(src) \ No newline at end of file + new /obj/item/weapon/disk/plantgene(src) diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index 9a93d1a9673..cee72938fc6 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -89,7 +89,6 @@ attack_verb = list("chopped", "torn", "cut") hitsound = 'sound/weapons/bladeslice.ogg' sharp = 1 - edge = 1 /obj/item/weapon/hatchet/suicide_act(mob/user) user.visible_message("[user] is chopping at \himself with the [src.name]! It looks like \he's trying to commit suicide.") @@ -119,7 +118,6 @@ attack_verb = list("chopped", "sliced", "cut", "reaped") hitsound = 'sound/weapons/bladeslice.ogg' sharp = 1 - edge = 1 var/extend = 1 /obj/item/weapon/scythe/suicide_act(mob/user) @@ -128,7 +126,7 @@ var/mob/living/carbon/human/H = user var/obj/item/organ/external/affecting = H.get_organ("head") if(affecting) - affecting.droplimb(1, DROPLIMB_EDGE) + affecting.droplimb(1, DROPLIMB_SHARP) playsound(loc, pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg'), 50, 1, -1) return (BRUTELOSS) @@ -139,7 +137,6 @@ desc = "A sharp and curved blade on a collapsable fibre metal handle, this tool is the pinnacle of covert reaping technology." force = 3 sharp = 0 - edge = 0 w_class = WEIGHT_CLASS_SMALL extend = 0 slot_flags = SLOT_BELT @@ -172,7 +169,6 @@ //Collapse sound (blade sheath) playsound(src.loc, 'sound/weapons/blade_sheath.ogg', 50, 1) //Sound credit to Q.K. of Freesound.org sharp = extend - edge = extend if(ishuman(user)) var/mob/living/carbon/human/H = user H.update_inv_l_hand() diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 7c5297e07c4..c3449514edc 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -373,8 +373,7 @@ var/oldPlantName if(myseed) // In case there's nothing in the tray beforehand oldPlantName = myseed.plantname - qdel(myseed) - myseed = null + QDEL_NULL(myseed) else oldPlantName = "empty tray" switch(rand(1,18)) // randomly pick predominative weed @@ -422,8 +421,7 @@ var/oldPlantName = myseed.plantname if(myseed.mutatelist.len > 0) var/mutantseed = pick(myseed.mutatelist) - qdel(myseed) - myseed = null + QDEL_NULL(myseed) myseed = new mutantseed else return @@ -444,9 +442,7 @@ /obj/machinery/hydroponics/proc/mutateweed() // If the weeds gets the mutagent instead. Mind you, this pretty much destroys the old plant if( weedlevel > 5 ) - if(myseed) - qdel(myseed) - myseed = null + QDEL_NULL(myseed) var/newWeed = pick(/obj/item/seeds/liberty, /obj/item/seeds/angel, /obj/item/seeds/nettle/death, /obj/item/seeds/kudzu) myseed = new newWeed dead = 0 @@ -572,8 +568,8 @@ // You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial if(S.has_reagent("fluorine", 1)) adjustHealth(-round(S.get_reagent_amount("fluorine") * 2)) - adjustToxic(round(S.get_reagent_amount("flourine") * 2.5)) - adjustWater(-round(S.get_reagent_amount("flourine") * 0.5)) + adjustToxic(round(S.get_reagent_amount("fluorine") * 2.5)) + adjustWater(-round(S.get_reagent_amount("fluorine") * 0.5)) adjustWeeds(-rand(1,4)) // You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial @@ -935,8 +931,7 @@ else if(dead) dead = 0 to_chat(user, "You remove the dead plant from [src].") - qdel(myseed) - myseed = null + QDEL_NULL(myseed) update_icon() plant_hud_set_status() plant_hud_set_health() @@ -953,8 +948,7 @@ else to_chat(user, "You harvest [myseed.getYield()] items from the [myseed.plantname].") if(!myseed.get_gene(/datum/plant_gene/trait/repeated_harvest)) - qdel(myseed) - myseed = null + QDEL_NULL(myseed) dead = 0 plant_hud_set_status() plant_hud_set_health() @@ -1041,4 +1035,4 @@ else ..() -#undef HYDRO_CYCLES_PER_AGE \ No newline at end of file +#undef HYDRO_CYCLES_PER_AGE diff --git a/code/modules/karma/karma.dm b/code/modules/karma/karma.dm index 81af3a38395..b5cdbe0154f 100644 --- a/code/modules/karma/karma.dm +++ b/code/modules/karma/karma.dm @@ -87,7 +87,7 @@ var/list/karma_spenders = list() /mob/verb/spend_karma_list() set name = "Award Karma" set desc = "Let the gods know whether someone's been nice. Can only be used once per round." - set category = "OOC" + set category = "Special Verbs" if(!can_give_karma()) return @@ -116,7 +116,7 @@ var/list/karma_spenders = list() /mob/verb/spend_karma(var/mob/M) set name = "Award Karma to Player" set desc = "Let the gods know whether someone's been nice. Can only be used once per round." - set category = "OOC" + set category = "Special Verbs" if(!M) to_chat(usr, "Please right click a mob to award karma directly, or use the 'Award Karma' verb to select a player from the player listing.") @@ -149,7 +149,7 @@ var/list/karma_spenders = list() /client/verb/check_karma() set name = "Check Karma" set desc = "Reports how much karma you have accrued." - set category = "OOC" + set category = "Special Verbs" if(config.disable_karma) to_chat(src, "Karma is disabled.") diff --git a/code/modules/library/computers/checkout.dm b/code/modules/library/computers/checkout.dm index 2decc555693..526daeb68a8 100644 --- a/code/modules/library/computers/checkout.dm +++ b/code/modules/library/computers/checkout.dm @@ -178,8 +178,7 @@ M = new manual_type() dat += "[M.title]" manualcount++ - qdel(M) - M = null + QDEL_NULL(M) dat += "" dat += "
    (Return to main menu)
    " diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index c7212fe5a15..16d3fc193a0 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -40,7 +40,7 @@ new /obj/item/weapon/ore/diamond(src) if(21 to 25) for(var/i in 1 to 5) - new /obj/item/weapon/contraband/poster(src) + new /obj/item/weapon/poster/random_contraband(src) if(26 to 35) for(var/i in 1 to 3) new /obj/item/weapon/reagent_containers/glass/beaker/noreact(src) @@ -125,6 +125,7 @@ new /obj/item/weapon/bikehorn(src) new /obj/item/toy/crayon/rainbow(src) new /obj/item/weapon/reagent_containers/spray/waterflower(src) + new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofbanana(src) if(95) new /obj/item/clothing/under/mime(src) new /obj/item/clothing/shoes/black(src) @@ -216,4 +217,4 @@ qdel(AM) var/turf/T = get_turf(src) explosion(T, -1, -1, 1, 1) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 2c37ad5c5bb..541961e5297 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -978,7 +978,6 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("smashes", "crushes", "cleaves", "chops", "pulps") sharp = 1 - edge = 1 var/charged = 1 var/charge_time = 16 var/atom/mark = null @@ -1040,8 +1039,7 @@ mark = 0 if(L.mob_size >= MOB_SIZE_LARGE) L.underlays -= marked_image - qdel(marked_image) - marked_image = null + QDEL_NULL(marked_image) var/backstab = check_target_facings(user, L) var/def_check = L.getarmor(type = "bomb") if(backstab == FACING_INIT_FACING_TARGET_TARGET_FACING_PERPENDICULAR || backstab == FACING_SAME_DIR) diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm index 418d00c6f19..c3b43e06d6f 100644 --- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm +++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm @@ -24,7 +24,6 @@ item_state = "spectral" flags = CONDUCT sharp = 1 - edge = 1 w_class = WEIGHT_CLASS_BULKY force = 1 throwforce = 1 diff --git a/code/modules/mining/lavaland/loot/hierophant_loot.dm b/code/modules/mining/lavaland/loot/hierophant_loot.dm index 64689a3a535..e613b2ab276 100644 --- a/code/modules/mining/lavaland/loot/hierophant_loot.dm +++ b/code/modules/mining/lavaland/loot/hierophant_loot.dm @@ -52,7 +52,7 @@ friendly_fire_check = !friendly_fire_check to_chat(user, "You toggle friendly fire [friendly_fire_check ? "off":"on"]!") return - if(user.get_active_hand() != src && user.get_inactive_hand() != src) //you need to hold the staff to teleport + if(user.is_in_active_hand(src) && user.is_in_inactive_hand(src)) //you need to hold the staff to teleport to_chat(user, "You need to hold the staff in your hands to [rune ? "teleport with it" : "create a rune"]!") return if(!rune) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 7852fe0edd8..11f16953017 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -87,7 +87,6 @@ var/list/digsound = list('sound/effects/picaxe1.ogg','sound/effects/picaxe2.ogg','sound/effects/picaxe3.ogg') var/drill_verb = "picking" sharp = 1 - edge = 1 var/excavation_amount = 100 usesound = 'sound/effects/picaxe1.ogg' toolspeed = 1 @@ -482,7 +481,7 @@ var/obj/item/weapon/storage/pill_bottle/dice/D = new(src) load(D) else - var/obj/item/device/guitar/G = new(src) + var/obj/item/device/instrument/guitar/G = new(src) load(G) //Fans diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index 11e51987285..cf3e4c320b5 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -16,7 +16,7 @@ animation.master = src // flick("gibbed-m", animation) - gibs(loc, viruses, dna) + gibs(loc, dna) dead_mob_list -= src if(client) respawnable_list += src diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 5d746603418..7236fe57fde 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -6,11 +6,22 @@ if(hand) return l_hand else return r_hand +/mob/proc/is_in_active_hand(obj/item/I) + var/obj/item/item_to_test = get_active_hand() + + return item_to_test && item_to_test.is_equivalent(I) + + //Returns the thing in our inactive hand /mob/proc/get_inactive_hand() if(hand) return r_hand else return l_hand +/mob/proc/is_in_inactive_hand(obj/item/I) + var/obj/item/item_to_test = get_inactive_hand() + + return item_to_test && item_to_test.is_equivalent(I) + //Returns if a certain item can be equipped to a certain slot. // Currently invalid for two-handed items - call obj/item/mob_can_equip() instead. /mob/proc/can_equip(obj/item/I, slot, disable_warning = 0) @@ -119,6 +130,9 @@ else if(I == l_hand) l_hand = null update_inv_l_hand() + else if(I in tkgrabbed_objects) + var/obj/item/tk_grab/tkgrab = tkgrabbed_objects[I] + unEquip(tkgrab, force) if(I) if(client) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index fb6d5ef5948..cc9ed1a27d6 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -96,6 +96,9 @@ return (copytext(message, length(message)) == "!") ? 2 : 1 /datum/language/proc/broadcast(mob/living/speaker, message, speaker_mask) + if(!check_can_speak(speaker)) + return FALSE + log_say("[key_name(speaker)]: ([name]) [message]") if(!speaker_mask) @@ -114,6 +117,9 @@ /datum/language/proc/check_special_condition(mob/other, mob/living/speaker) return TRUE +/datum/language/proc/check_can_speak(mob/living/speaker) + return TRUE + /datum/language/proc/get_spoken_verb(msg_end) switch(msg_end) if("!") @@ -292,8 +298,29 @@ /datum/language/grey/broadcast(mob/living/speaker, message, speaker_mask) ..(speaker,message,speaker.real_name) +/datum/language/grey/check_can_speak(mob/living/speaker) + if(ishuman(speaker)) + var/mob/living/carbon/human/S = speaker + var/obj/item/organ/external/rhand = S.get_organ("r_hand") + var/obj/item/organ/external/lhand = S.get_organ("l_hand") + if((!rhand || !rhand.is_usable()) && (!lhand || !lhand.is_usable())) + to_chat(speaker,"You can't communicate without the ability to use your hands!") + return FALSE + if(speaker.incapacitated(ignore_lying = 1)) + to_chat(speaker,"You can't communicate while unable to move your hands to your head!") + return FALSE + + var/their = "their" + if(speaker.gender == "female") + their = "her" + if(speaker.gender == "male") + their = "his" + speaker.visible_message("[speaker] touches [their] fingers to [their] temple.") //If placed in grey/broadcast, it will happen regardless of the success of the action. + + return TRUE + /datum/language/grey/check_special_condition(mob/living/carbon/human/other, mob/living/carbon/human/speaker) - if(other in range(7, speaker)) + if(atoms_share_level(other, speaker)) return TRUE return FALSE @@ -639,7 +666,7 @@ if(L == default_language) . += "[L.name] (:[L.key]) - default - reset
    [L.desc]

    " else - . += "[L.name] (:[L.key]) - set default
    [L.desc]

    " + . += "[L.name] (:[L.key]) - set default
    [L.desc]

    " /mob/verb/check_languages() set name = "Check Known Languages" diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index eef224e8378..8bd8ffe5eed 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -294,3 +294,9 @@ Des: Removes all infected images from the alien. playsound(T, S, volume, 1, range) return 1 return 0 + +/mob/living/carbon/alien/getTrail() + if(getBruteLoss() < 200) + return pick("xltrails_1", "xltrails_2") + else + return pick("xttrails_1", "xttrails_2") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm index 645259b1fda..2229d4c9d0c 100644 --- a/code/modules/mob/living/carbon/alien/death.dm +++ b/code/modules/mob/living/carbon/alien/death.dm @@ -14,7 +14,7 @@ playsound(src.loc, 'sound/goonstation/effects/gib.ogg', 50, 1) flick("gibbed-a", animation) - xgibs(loc, viruses) + xgibs(loc) dead_mob_list -= src spawn(15) diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index e6a2f6567c2..4be2cbdb390 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -22,15 +22,13 @@ if(disabilities & COUGHING) if((prob(5) && paralysis <= 1)) drop_item() - spawn( 0 ) - emote("cough") - return + emote("cough") + return if(disabilities & TOURETTES) if((prob(10) && paralysis <= 1)) Stun(10) - spawn( 0 ) - emote("twitch") - return + emote("twitch") + return if(disabilities & NERVOUS) if(prob(10)) stuttering = max(10, stuttering) @@ -68,8 +66,7 @@ //UNCONSCIOUS. NO-ONE IS HOME if((getOxyLoss() > 50) || (config.health_threshold_crit >= health)) if(health <= 20 && prob(1)) - spawn(0) - emote("gasp") + emote("gasp") if(!reagents.has_reagent("epinephrine")) adjustOxyLoss(1) Paralyse(3) @@ -81,8 +78,7 @@ blinded = 1 stat = UNCONSCIOUS if(prob(10) && health) - spawn(0) - emote("hiss") + emote("hiss") //CONSCIOUS else stat = CONSCIOUS diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 447f65c6744..8366a7d02a8 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -40,9 +40,8 @@ else if(sleeping) blinded = 1 stat = UNCONSCIOUS - if( prob(10) && health ) - spawn(0) - emote("hiss_") + if(prob(10) && health) + emote("hiss_") //CONSCIOUS else stat = CONSCIOUS diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 7a12b570201..daeebf8442f 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -71,9 +71,9 @@ var/obj/item/organ/internal/brain/B = src if(!special) var/mob/living/simple_animal/borer/borer = owner.has_brain_worms() - if(borer) - borer.detach() //Should remove borer if the brain is removed - RR + borer.leave_host() //Should remove borer if the brain is removed - RR + if(owner.mind && !non_primary)//don't transfer if the owner does not have a mind. B.transfer_identity(user) diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm index d6a07d48f7e..8303c3ef04a 100644 --- a/code/modules/mob/living/carbon/brain/death.dm +++ b/code/modules/mob/living/carbon/brain/death.dm @@ -29,7 +29,7 @@ animation.master = src // flick("gibbed-m", animation) - gibs(loc, viruses, dna) + gibs(loc, dna) dead_mob_list -= src if(container && istype(container, /obj/item/device/mmi)) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 2ef62eae6e9..15d9201b5cc 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -107,7 +107,7 @@ for(var/i=0 to distance) if(blood) if(T) - T.add_blood_floor(src) + add_splatter_floor(T) if(stun) adjustBruteLoss(3) else @@ -126,8 +126,7 @@ if(isturf(loc)) I.remove(src) I.forceMove(get_turf(src)) - spawn() - I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5) + I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5) for(var/mob/M in src) if(M in src.stomach_contents) @@ -244,6 +243,12 @@ if(status == "") status = "OK" src.show_message(text("\t []My [] is [].",status=="OK"?"":"",org.name,status),1) + + for(var/obj/item/I in org.embedded_objects) + to_chat(src, "\t There is \a [I] embedded in your [org.name]!") + + if(H.bleed_rate) + to_chat(src, "You are bleeding!") if(staminaloss) if(staminaloss > 30) to_chat(src, "You're completely exhausted.") @@ -474,21 +479,6 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, if(istype(loc, /obj/machinery/atmospherics)) add_ventcrawl(loc) -/mob/living/carbon/clean_blood() - . = ..() - if(ishuman(src)) - var/mob/living/carbon/human/H = src - if(H.gloves) - if(H.gloves.clean_blood()) - H.update_inv_gloves(0,0) - H.gloves.germ_level = 0 - else - if(H.bloody_hands) - H.bloody_hands = 0 - H.update_inv_gloves(0,0) - H.germ_level = 0 - update_icons() //apply the now updated overlays to the mob - //Throwing stuff @@ -535,18 +525,19 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, return /mob/living/carbon/throw_item(atom/target) - throw_mode_off() - if(!target || !isturf(loc)) - return - if(istype(target, /obj/screen)) + if(!target || !isturf(loc) || istype(target, /obj/screen)) + throw_mode_off() return - var/atom/movable/thrown_thing var/obj/item/I = src.get_active_hand() - if(!I || (I.flags & NODROP)) + if(!I || I.override_throw(src, target) || (I.flags & NODROP)) + throw_mode_off() return + throw_mode_off() + var/atom/movable/thrown_thing + if(istype(I, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = I var/mob/throwable_mob = G.get_mob_if_throwable() //throw the person instead of the grab @@ -649,9 +640,10 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, "[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM].") var/no_mask - if(!(wear_mask && wear_mask.flags & AIRTIGHT)) - if(!(head && head.flags & AIRTIGHT)) - no_mask = 1 + if(!get_organ_slot("breathing_tube")) + if(!(wear_mask && wear_mask.flags & AIRTIGHT)) + if(!(head && head.flags & AIRTIGHT)) + no_mask = 1 if(no_mask) to_chat(usr, "[src] is not wearing a suitable mask or helmet!") return @@ -662,9 +654,10 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, update_internals_hud_icon(0) else var/no_mask2 - if(!(wear_mask && wear_mask.flags & AIRTIGHT)) - if(!(head && head.flags & AIRTIGHT)) - no_mask2 = 1 + if(!get_organ_slot("breathing_tube")) + if(!(wear_mask && wear_mask.flags & AIRTIGHT)) + if(!(head && head.flags & AIRTIGHT)) + no_mask2 = 1 if(no_mask2) to_chat(usr, "[src] is not wearing a suitable mask or helmet!") return @@ -881,8 +874,10 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, /mob/living/carbon/get_standard_pixel_y_offset(lying = 0) if(lying) - if(buckled) return initial(pixel_y) - return -6 + if(buckled) + return buckled.buckle_offset //tg just has this whole block removed, always returning -6. Paradise is special. + else + return -6 else return initial(pixel_y) @@ -943,13 +938,13 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, if(!(slipAny)) if(istype(src, /mob/living/carbon/human)) var/mob/living/carbon/human/H = src - if((isobj(H.shoes) && H.shoes.flags & NOSLIP) || H.species.bodyflags & FEET_NOSLIP) + if(isobj(H.shoes) && H.shoes.flags & NOSLIP) return 0 if(tilesSlipped) for(var/t = 0, t<=tilesSlipped, t++) spawn (t) step(src, src.dir) stop_pulling() - to_chat(src, "You slipped on the [description]!") + to_chat(src, "You slipped on [description]!") playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) if(stun) Stun(stun) diff --git a/code/modules/mob/living/carbon/carbon_defenses.dm b/code/modules/mob/living/carbon/carbon_defenses.dm index c5c1e4917e4..a570ad50cb3 100644 --- a/code/modules/mob/living/carbon/carbon_defenses.dm +++ b/code/modules/mob/living/carbon/carbon_defenses.dm @@ -30,11 +30,13 @@ if(!iscarbon(user)) return - for(var/datum/disease/D in viruses) + for(var/thing in viruses) + var/datum/disease/D = thing if(D.IsSpreadByTouch()) user.ContractDisease(D) - for(var/datum/disease/D in user.viruses) + for(var/thing in user.viruses) + var/datum/disease/D = thing if(D.IsSpreadByTouch()) ContractDisease(D) return 0 diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 6e34291caae..a409e8460db 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -3,6 +3,7 @@ hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD) var/list/stomach_contents = list() var/list/internal_organs = list() + var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access. var/antibodies = 0 var/life_tick = 0 // The amount of life ticks that have processed on this mob. @@ -29,3 +30,5 @@ var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks. var/co2overloadtime = null + + blood_volume = BLOOD_VOLUME_NORMAL diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index e365f870fca..e258962f784 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -343,7 +343,7 @@ continue if(blacklist.len && (current_species_name in blacklist)) continue - if((current_species.flags & IS_WHITELISTED) && !is_alien_whitelisted(src, current_species_name)) + if((IS_WHITELISTED in current_species.species_traits) && !is_alien_whitelisted(src, current_species_name)) continue valid_species += current_species_name @@ -364,7 +364,7 @@ continue if((H.gender == MALE && S.gender == FEMALE) || (H.gender == FEMALE && S.gender == MALE)) continue - if(H.species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head... + if(H.species.bodyflags & ALL_RPARTS) //If the user is a species who can have a robotic head... var/datum/robolimb/robohead = all_robolimbs[H.model] if((H.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list. valid_hairstyles += hairstyle //Give them their hairstyles if they do. @@ -392,7 +392,7 @@ continue if((H.gender == MALE && S.gender == FEMALE) || (H.gender == FEMALE && S.gender == MALE)) continue - if(H.species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head... + if(H.species.bodyflags & ALL_RPARTS) //If the user is a species who can have a robotic head... var/datum/robolimb/robohead = all_robolimbs[H.model] if(H.species.name in S.species_allowed) //If this is a facial hair style native to the user's species... if((H.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list. @@ -446,7 +446,7 @@ continue if(location == "head") var/datum/sprite_accessory/body_markings/head/M = marking_styles_list[S.name] - if(H.species.flags & ALL_RPARTS)//If the user is a species that can have a robotic head... + if(H.species.bodyflags & ALL_RPARTS)//If the user is a species that can have a robotic head... var/datum/robolimb/robohead = all_robolimbs[H.model] if(!(S.models_allowed && (robohead.company in S.models_allowed))) //Make sure they don't get markings incompatible with their head. continue diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm index 8744a09ea4d..761f35b9520 100644 --- a/code/modules/mob/living/carbon/human/body_accessories.dm +++ b/code/modules/mob/living/carbon/human/body_accessories.dm @@ -103,10 +103,11 @@ var/global/list/body_accessory_by_species = list("None" = null) /datum/body_accessory/tail/wingler_tail // Jay wingler fluff tail - name = "Jay Wingler Tail" + name = "Striped Tail" icon_state = "winglertail" animated_icon_state = "winglertail_a" + allowed_species = list("Tajaran") //Vulpkanin diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 69e86de81e6..d0468fb12b6 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -19,8 +19,7 @@ if(isturf(loc)) var/atom/movable/thing = I.remove(src) thing.forceMove(get_turf(src)) - spawn() - thing.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5) + thing.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5) for(var/obj/item/organ/external/E in bodyparts) if(istype(E, /obj/item/organ/external/chest)) @@ -28,7 +27,7 @@ // Only make the limb drop if it's not too damaged if(prob(100 - E.get_damage())) // Override the current limb status and don't cause an explosion - E.droplimb(DROPLIMB_EDGE) + E.droplimb(DROPLIMB_SHARP) for(var/mob/M in src) if(M in stomach_contents) @@ -38,7 +37,7 @@ if(!isSynthetic()) flick("gibbed-h", animation) - hgibs(loc, viruses, dna) + hgibs(loc, dna) else new /obj/effect/decal/cleanable/blood/gibs/robot(loc) var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread @@ -90,8 +89,10 @@ if(src) qdel(src) /mob/living/carbon/human/death(gibbed) - if(stat == DEAD) return - if(healths) healths.icon_state = "health5" + if(stat == DEAD) + return + if(healths) + healths.icon_state = "health5" if(!gibbed) emote("deathgasp") //let the world KNOW WE ARE DEAD @@ -102,21 +103,8 @@ set_heartattack(FALSE) //Handle species-specific deaths. - if(species) species.handle_death(src) - - //Handle brain slugs. - var/obj/item/organ/external/head = get_organ("head") - var/mob/living/simple_animal/borer/B - - if(istype(head)) - for(var/I in head.implants) - if(istype(I,/mob/living/simple_animal/borer)) - B = I - if(B) - if(B.controlling && B.host == src) - B.detach() - - verbs -= /mob/living/carbon/proc/release_control + if(species) + species.handle_death(src) callHook("death", list(src, gibbed)) @@ -143,9 +131,9 @@ return ..(gibbed) /mob/living/carbon/human/update_revive() - ..() + . = ..() // Update healthdoll - if(healthdoll) + if(. && healthdoll) // We're alive again, so re-build the entire healthdoll healthdoll.cached_healthdoll_overlays.Cut() diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 1b15dccdc2c..8cdf4ab1ec6 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -36,8 +36,18 @@ if("drone","drones","hum","hums","rumble","rumbles") if(species.name == "Drask") //Only Drask can make whale noises on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm + else + return + if("howl", "howls") + if (species.name == "Vulpkanin") //Only Vulpkanin can howl + on_CD = handle_emote_CD(100) else return + if("growl", "growls") + if (species.name == "Vulpkanin") //Only Vulpkanin can growl + on_CD = handle_emote_CD() + else + return if("squish", "squishes") var/found_slime_bodypart = 0 @@ -76,7 +86,7 @@ on_CD = handle_emote_CD(50) //longer cooldown if("fart", "farts", "flip", "flips", "snap", "snaps") on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm - if("cough", "coughs") + if("cough", "coughs", "slap", "slaps") on_CD = handle_emote_CD() if("sneeze", "sneezes") on_CD = handle_emote_CD() @@ -91,8 +101,21 @@ if("me") //OKAY SO RANT TIME, THIS FUCKING HAS TO BE HERE OR A SHITLOAD OF THINGS BREAK return custom_emote(m_type, message) //DO YOU KNOW WHY SHIT BREAKS? BECAUSE SO MUCH OLDCODE CALLS mob.emote("me",1,"whatever_the_fuck_it_wants_to_emote") //WHO THE FUCK THOUGHT THAT WAS A GOOD FUCKING IDEA!?!? - if("ping", "pings") + + if("howl", "howls") var/M = handle_emote_param(param) //Check to see if the param is valid (mob with the param name is in view). + message = "[src] howls[M ? " at [M]" : ""]!" + playsound(loc, 'sound/goonstation/voice/howl.ogg', 100, 0, 10) + m_type = 2 + + if("growl", "growls") + var/M = handle_emote_param(param) + message = "[src] growls[M ? " at [M]" : ""]." + playsound(loc, "growls", 80, 0) + m_type = 2 + + if("ping", "pings") + var/M = handle_emote_param(param) message = "[src] pings[M ? " at [M]" : ""]." playsound(loc, 'sound/machines/ping.ogg', 50, 0) @@ -785,12 +808,28 @@ + " handshake-mob, hug(s)-(none)/mob, johnny, jump, laugh(s), look(s)-(none)/mob, moan(s), mumble(s), nod(s), pale(s), point(s)-atom, quiver(s), raise(s), salute(s)-(none)/mob, scream(s), shake(s)," \ + " shiver(s), shrug(s), sigh(s), signal(s)-#1-10,slap(s)-(none)/mob, smile(s),snap(s), sneeze(s), sniff(s), snore(s), stare(s)-(none)/mob, swag(s), tremble(s), twitch(es), twitch(es)_s," \ + " wag(s), wave(s), whimper(s), wink(s), yawn(s)" - if(species.name == "Machine") - emotelist += "\nMachine specific emotes :- beep(s)-(none)/mob, buzz(es)-none/mob, no-(none)/mob, ping(s)-(none)/mob, yes-(none)/mob" - else if(species.name == "Slime People") - emotelist += "\nSlime people specific emotes :- squish(es)-(none)/mob" - to_chat(src, emotelist) + switch(species.name) + if("Machine") + emotelist += "\nMachine specific emotes :- beep(s)-(none)/mob, buzz(es)-none/mob, no-(none)/mob, ping(s)-(none)/mob, yes-(none)/mob, buzz2-(none)/mob" + if("Drask") + emotelist += "\nDrask specific emotes :- drone(s)-(none)/mob, hum(s)-(none)/mob, rumble(s)-(none)/mob" + if("Kidan") + emotelist += "\nKidan specific emotes :- click(s), clack(s)" + if("Unathi") + emotelist += "\nUnathi specific emotes :- hiss(es)" + if("Vulpkanin") + emotelist += "\nVulpkanin specific emotes :- growl(s)-none/mob, howl(s)-none/mob" + + if (species.name == "Slime People") + emotelist += "\nSlime people specific emotes :- squish(es)-(none)/mob" + else + for(var/obj/item/organ/external/L in bodyparts) // if your limbs are squishy you can squish too! + if(L.dna.species in list("Slime People")) + emotelist += "\nSlime people body part specific emotes :- squish(es)-(none)/mob" + break + + to_chat(src, emotelist) else to_chat(src, "Unusable emote '[act]'. Say *help for a list.") diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 693973ab42d..70034def245 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -288,7 +288,6 @@ var/list/wound_flavor_text = list() var/list/is_destroyed = list() - var/list/is_bleeding = list() for(var/organ_tag in species.has_limbs) var/list/organ_data = species.has_limbs[organ_tag] @@ -332,8 +331,6 @@ if(W.internal && !temp.open) continue // can't see internal wounds var/this_wound_desc = W.desc if(W.damage_type == BURN && W.salved) this_wound_desc = "salved [this_wound_desc]" - if(W.bleeding()) this_wound_desc = "bleeding [this_wound_desc]" - else if(W.bandaged) this_wound_desc = "bandaged [this_wound_desc]" if(W.germ_level > 600) this_wound_desc = "badly infected [this_wound_desc]" else if(W.germ_level > 330) this_wound_desc = "lightly infected [this_wound_desc]" if(this_wound_desc in wound_descriptors) @@ -377,70 +374,48 @@ wound_flavor_text["[temp.limb_name]"] = flavor_text_string else wound_flavor_text["[temp.limb_name]"] = "" - if(temp.status & ORGAN_BLEEDING) - is_bleeding["[temp.limb_name]"] = 1 else wound_flavor_text["[temp.limb_name]"] = "" + for(var/obj/item/I in temp.embedded_objects) + msg += "[t_He] [t_has] \a [bicon(I)] [I] embedded in [t_his] [temp.name]!\n" + //Handles the text strings being added to the actual description. //If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext. - var/display_chest = 0 - var/display_shoes = 0 - var/display_gloves = 0 if(wound_flavor_text["head"] && (is_destroyed["head"] || (!skipmask && !(wear_mask && istype(wear_mask, /obj/item/clothing/mask/gas))))) msg += wound_flavor_text["head"] - else if(is_bleeding["head"]) - msg += "[src] has blood running down [t_his] face!\n" if(wound_flavor_text["chest"] && !w_uniform && !skipjumpsuit) //No need. A missing chest gibs you. msg += wound_flavor_text["chest"] - else if(is_bleeding["chest"]) - display_chest = 1 if(wound_flavor_text["l_arm"] && (is_destroyed["left arm"] || (!w_uniform && !skipjumpsuit))) msg += wound_flavor_text["l_arm"] - else if(is_bleeding["l_arm"]) - display_chest = 1 if(wound_flavor_text["l_hand"] && (is_destroyed["left hand"] || (!gloves && !skipgloves))) msg += wound_flavor_text["l_hand"] - else if(is_bleeding["l_hand"]) - display_gloves = 1 if(wound_flavor_text["r_arm"] && (is_destroyed["right arm"] || (!w_uniform && !skipjumpsuit))) msg += wound_flavor_text["r_arm"] - else if(is_bleeding["r_arm"]) - display_chest = 1 if(wound_flavor_text["r_hand"] && (is_destroyed["right hand"] || (!gloves && !skipgloves))) msg += wound_flavor_text["r_hand"] - else if(is_bleeding["r_hand"]) - display_gloves = 1 if(wound_flavor_text["groin"] && (is_destroyed["groin"] || (!w_uniform && !skipjumpsuit))) msg += wound_flavor_text["groin"] - else if(is_bleeding["groin"]) - display_chest = 1 if(wound_flavor_text["l_leg"] && (is_destroyed["left leg"] || (!w_uniform && !skipjumpsuit))) msg += wound_flavor_text["l_leg"] - else if(is_bleeding["l_leg"]) - display_chest = 1 if(wound_flavor_text["l_foot"]&& (is_destroyed["left foot"] || (!shoes && !skipshoes))) msg += wound_flavor_text["l_foot"] - else if(is_bleeding["l_foot"]) - display_shoes = 1 if(wound_flavor_text["r_leg"] && (is_destroyed["right leg"] || (!w_uniform && !skipjumpsuit))) msg += wound_flavor_text["r_leg"] - else if(is_bleeding["r_leg"]) - display_chest = 1 if(wound_flavor_text["r_foot"]&& (is_destroyed["right foot"] || (!shoes && !skipshoes))) msg += wound_flavor_text["r_foot"] - else if(is_bleeding["r_foot"]) - display_shoes = 1 - if(display_chest) - msg += "[src] has blood soaking through from under [t_his] clothing!\n" - if(display_shoes) - msg += "[src] has blood running from [t_his] shoes!\n" - if(display_gloves) - msg += "[src] has blood running from under [t_his] gloves!\n" + if(blood_volume < BLOOD_VOLUME_SAFE) + msg += "[t_He] [t_has] pale skin.\n" + + if(bleedsuppress) + msg += "[t_He] [t_is] bandaged with something.\n" + else if(bleed_rate) + if(reagents.has_reagent("heparin")) + msg += "[t_He] [t_is] bleeding uncontrollably!\n" + else + msg += "[t_He] [t_is] bleeding!\n" - for(var/implant in get_visible_implants(0)) - msg += "[src] has \a [implant] sticking out of [t_his] flesh!\n" if(digitalcamo) msg += "[t_He] [t_is] repulsively uncanny!\n" if(!(skipface || ( wear_mask && ( wear_mask.flags_inv & HIDEFACE || wear_mask.flags_cover & MASKCOVERSMOUTH) ) ) && is_thrall(src) && in_range(user,src)) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index ba55801c522..fb472128004 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -8,7 +8,6 @@ //why are these here and not in human_defines.dm //var/list/hud_list[10] var/datum/species/species //Contains icon generation and language information, set during New(). - var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. var/obj/item/weapon/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call. /mob/living/carbon/human/New(var/new_loc, var/new_species = null, var/delay_ready_dna = 0) @@ -34,7 +33,6 @@ create_reagents(330) prev_gender = gender // Debug for plural genders - make_blood() martial_art = default_martial_art @@ -226,7 +224,7 @@ while(limbs_affected != 0 && valid_limbs.len > 0) processing_dismember = pick(valid_limbs) if(processing_dismember.limb_name != "chest" && processing_dismember.limb_name != "head" && processing_dismember.limb_name != "groin") - processing_dismember.droplimb(1,DROPLIMB_EDGE,0,1) + processing_dismember.droplimb(1,DROPLIMB_SHARP,0,1) valid_limbs -= processing_dismember limbs_affected -= 1 else valid_limbs -= processing_dismember @@ -252,7 +250,7 @@ while(limbs_affected != 0 && valid_limbs.len > 0) processing_dismember = pick(valid_limbs) if(processing_dismember.limb_name != "chest" && processing_dismember.limb_name != "head" && processing_dismember.limb_name != "groin") - processing_dismember.droplimb(1,DROPLIMB_EDGE,0,1) + processing_dismember.droplimb(1,DROPLIMB_SHARP,0,1) valid_limbs -= processing_dismember limbs_affected -= 1 else valid_limbs -= processing_dismember @@ -277,7 +275,7 @@ while(limbs_affected != 0 && valid_limbs.len > 0) processing_dismember = pick(valid_limbs) if(processing_dismember.limb_name != "chest" && processing_dismember.limb_name != "head" && processing_dismember.limb_name != "groin") - processing_dismember.droplimb(1,DROPLIMB_EDGE,0,1) + processing_dismember.droplimb(1,DROPLIMB_SHARP,0,1) valid_limbs -= processing_dismember limbs_affected -= 1 else valid_limbs -= processing_dismember @@ -428,7 +426,7 @@ /mob/living/carbon/human/show_inv(mob/user) user.set_machine(src) - var/has_breathable_mask = istype(wear_mask, /obj/item/clothing/mask) + var/has_breathable_mask = istype(wear_mask, /obj/item/clothing/mask) || get_organ_slot("breathing_tube") var/list/obscured = check_obscured_slots() var/dat = {" @@ -540,12 +538,10 @@ popup.open() -// called when something steps onto a human -// this handles mulebots and vehicles -/mob/living/carbon/human/Crossed(var/atom/movable/AM) - if(istype(AM, /obj/vehicle)) - var/obj/vehicle/V = AM - V.RunOver(src) +/mob/living/carbon/human/Crossed(atom/movable/AM) + var/mob/living/simple_animal/bot/mulebot/MB = AM + if(istype(MB)) + MB.RunOver(src) // Get rank from ID, ID inside PDA, PDA, ID in wallet, etc. /mob/living/carbon/human/proc/get_authentification_rank(var/if_no_id = "No id", var/if_no_job = "No job") @@ -597,7 +593,7 @@ return //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() +/mob/living/carbon/human/get_visible_name(var/id_override = FALSE) 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 @@ -606,7 +602,7 @@ return get_id_name("Unknown") //Likewise for hats var/face_name = get_face_name() var/id_name = get_id_name("") - if(id_name && (id_name != face_name)) + if(id_name && (id_name != face_name) && !id_override) return "[face_name] (as [id_name])" return face_name @@ -700,6 +696,28 @@ if(G && G.pickpocket) thief_mode = 1 + if(href_list["embedded_object"]) + var/obj/item/organ/external/L = locate(href_list["embedded_limb"]) in bodyparts + if(!L) + return + var/obj/item/I = locate(href_list["embedded_object"]) in L.embedded_objects + if(!I || I.loc != src) //no item, no limb, or item is not in limb or in the person anymore + return + var/time_taken = I.embedded_unsafe_removal_time*I.w_class + usr.visible_message("[usr] attempts to remove [I] from their [L.name].","You attempt to remove [I] from your [L.name]... (It will take [time_taken/10] seconds.)") + if(do_after(usr, time_taken, needhand = 1, target = src)) + if(!I || !L || I.loc != src || !(I in L.embedded_objects)) + return + L.embedded_objects -= I + L.take_damage(I.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus. + I.forceMove(get_turf(src)) + usr.put_in_hands(I) + usr.emote("scream") + usr.visible_message("[usr] successfully rips [I] out of their [L.name]!","You successfully remove [I] from your [L.name].") + if(!has_embedded_objects()) + clear_alert("embeddedobject") + return + if(href_list["item"]) var/slot = text2num(href_list["item"]) if(slot in check_obscured_slots()) @@ -1234,12 +1252,6 @@ I.insert(H) /mob/living/carbon/human/revive() - - if(species && !(species.flags & NO_BLOOD)) - var/blood_reagent = get_blood_name() - vessel.add_reagent(blood_reagent, max_blood-vessel.total_volume) - fixblood() - //Fix up all organs and replace lost ones. restore_all_organs() //Rejuvenate and reset all existing organs. check_and_regenerate_organs(src) //Regenerate limbs and organs only if they're really missing. @@ -1311,23 +1323,13 @@ */ //returns 1 if made bloody, returns 0 otherwise -/mob/living/carbon/human/add_blood(mob/living/carbon/human/M as mob) - if(!..()) - return 0 - //if this blood isn't already in the list, add it - if(blood_DNA[M.dna.unique_enzymes]) - return 0 //already bloodied with this blood. Cannot add more. - blood_DNA[M.dna.unique_enzymes] = M.dna.b_type - hand_blood_color = blood_color - src.update_inv_gloves() - verbs += /mob/living/carbon/human/proc/bloody_doodle - return 1 //we applied blood to the item - /mob/living/carbon/human/clean_blood(var/clean_feet) .=..() if(clean_feet && !shoes && istype(feet_blood_DNA, /list) && feet_blood_DNA.len) feet_blood_color = null qdel(feet_blood_DNA) + bloody_feet = list(BLOOD_STATE_HUMAN = 0, BLOOD_STATE_XENO = 0, BLOOD_STATE_NOT_BLOODY = 0) + blood_state = BLOOD_STATE_NOT_BLOODY update_inv_shoes(1) return 1 @@ -1348,16 +1350,6 @@ else ..() -/mob/living/carbon/human/get_visible_implants(var/class = 0) - - var/list/visible_implants = list() - for(var/obj/item/organ/external/organ in bodyparts) - for(var/obj/item/weapon/O in organ.implants) - if(!istype(O,/obj/item/weapon/implant) && (O.w_class > class) && !istype(O,/obj/item/weapon/shard/shrapnel)) - visible_implants += O - - return(visible_implants) - /mob/living/carbon/human/generate_name() name = species.makeName(gender,src) real_name = name @@ -1365,29 +1357,6 @@ dna.real_name = name return name -/mob/living/carbon/human/proc/handle_embedded_objects() - - for(var/obj/item/organ/external/organ in bodyparts) - if(organ.status & ORGAN_SPLINTED) //Splints prevent movement. - continue - for(var/obj/item/weapon/O in organ.implants) - if(!istype(O,/obj/item/weapon/implant) && prob(5)) //Moving with things stuck in you could be bad. - // All kinds of embedded objects cause bleeding. - var/msg = null - switch(rand(1,3)) - if(1) - msg ="A spike of pain jolts your [organ.name] as you bump [O] inside." - if(2) - msg ="Your movement jostles [O] in your [organ.name] painfully." - if(3) - msg ="[O] in your [organ.name] twists painfully as you move." - to_chat(src, msg) - - organ.take_damage(rand(1,3), 0, 0) - if(!(organ.status & ORGAN_ROBOT)) //There is no blood in protheses. - organ.status |= ORGAN_BLEEDING - src.adjustToxLoss(rand(1,3)) - /mob/living/carbon/human/verb/check_pulse() set category = null set name = "Check pulse" @@ -1455,10 +1424,6 @@ tail = species.tail - if(vessel) - vessel = null - make_blood() - maxHealth = species.total_health toxins_alert = 0 @@ -1555,7 +1520,6 @@ overlays.Cut() update_mutantrace(1) regenerate_icons() - fixblood() if(!delay_icon_update) UpdateAppearance() @@ -1638,7 +1602,7 @@ to_chat(src, "Where's your head at? Can't change your monitor/display without one.") return - if(species.flags & ALL_RPARTS) //If they can have a fully cybernetic body... + if(species.bodyflags & ALL_RPARTS) //If they can have a fully cybernetic body... var/datum/robolimb/robohead = all_robolimbs[head_organ.model] if(!head_organ) return @@ -1972,7 +1936,7 @@ . |= A.GetAccess() /mob/living/carbon/human/is_mechanical() - return ..() || (species.flags & ALL_RPARTS) != 0 + return ..() || (species.bodyflags & ALL_RPARTS) != 0 /mob/living/carbon/human/can_use_guns(var/obj/item/weapon/gun/G) . = ..() @@ -1981,7 +1945,7 @@ if(HULK in mutations) to_chat(src, "Your meaty finger is much too large for the trigger guard!") return 0 - if(species.flags & NOGUNS) + if(NOGUNS in species.species_traits) to_chat(src, "Your fingers don't fit in the trigger guard!") return 0 diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 59c8f3efa63..28c81b026b9 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -109,16 +109,16 @@ if(INTENT_HARM) //Vampire code if(M.mind && M.mind.vampire && (M.mind in ticker.mode.vampires) && !M.mind.vampire.draining && M.zone_sel && M.zone_sel.selecting == "head" && src != M) - if(species && species.flags & NO_BLOOD)//why this hell were we never checkinf for this? + if((NO_BLOOD in species.species_traits) || species.exotic_blood || !blood_volume) to_chat(M, "They have no blood!") return if(mind && mind.vampire && (mind in ticker.mode.vampires)) - to_chat(M, "Your fangs fail to pierce [src.name]'s cold flesh") + to_chat(M, "Your fangs fail to pierce [name]'s cold flesh") return if(SKELETON in mutations) to_chat(M, "There is no blood in a skeleton!") return - if(issmall(src) && !ckey) //Monkeyized humans are okay, humanized monkeys are okey, monkeys are not. + if(issmall(src) && !ckey) //Monkeyized humans are okay, humanized monkeys are okay, NPC monkeys are not. to_chat(M, "Blood from a monkey is useless!") return //we're good to suck the blood, blaah @@ -158,7 +158,7 @@ visible_message("[M] [pick(attack.attack_verb)]ed [src]!") - apply_damage(damage, BRUTE, affecting, armor_block, sharp=attack.sharp, edge=attack.edge) //moving this back here means Armalis are going to knock you down 70% of the time, but they're pure adminbus anyway. + apply_damage(damage, BRUTE, affecting, armor_block, sharp = attack.sharp) //moving this back here means Armalis are going to knock you down 70% of the time, but they're pure adminbus anyway. if((stat != DEAD) && damage >= M.species.punchstunthreshold) visible_message("[M] has weakened [src]!", \ "[M] has weakened [src]!") diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 04c8ffc9f57..9a96ec72c28 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -112,7 +112,7 @@ var/obj/item/organ/external/O = get_organ(organ_name) if(amount > 0) - O.take_damage(amount, 0, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source) + O.take_damage(amount, 0, sharp=is_sharp(damage_source), used_weapon=damage_source) else //if you don't want to heal robot organs, they you will have to check that yourself before using this proc. O.heal_damage(-amount, 0, internal=0, robo_repair=(O.status & ORGAN_ROBOT)) @@ -126,7 +126,7 @@ var/obj/item/organ/external/O = get_organ(organ_name) if(amount > 0) - O.take_damage(0, amount, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source) + O.take_damage(0, amount, sharp=is_sharp(damage_source), used_weapon=damage_source) else //if you don't want to heal robot organs, they you will have to check that yourself before using this proc. O.heal_damage(0, -amount, internal=0, robo_repair=(O.status & ORGAN_ROBOT)) @@ -240,7 +240,7 @@ if(!parts.len) return var/obj/item/organ/external/picked = pick(parts) - if(picked.take_damage(brute,burn,sharp,edge)) + if(picked.take_damage(brute, burn, sharp)) UpdateDamageIcon() updatehealth() speech_problem_flag = 1 @@ -285,7 +285,7 @@ var/burn_was = picked.burn_dam - update |= picked.take_damage(brute_per_part,burn_per_part,sharp,edge,used_weapon) + update |= picked.take_damage(brute_per_part, burn_per_part, sharp, used_weapon) brute -= (picked.brute_dam - brute_was) burn -= (picked.burn_dam - burn_was) @@ -300,15 +300,6 @@ //////////////////////////////////////////// -/* -This function restores the subjects blood to max. -*/ -/mob/living/carbon/human/proc/restore_blood() - if(!(species.flags & NO_BLOOD)) - var/blood_type = get_blood_name() - var/blood_volume = vessel.get_reagent_amount(blood_type) - vessel.add_reagent(blood_type, BLOOD_VOLUME_NORMAL - blood_volume) - /* This function restores all organs. */ @@ -333,7 +324,7 @@ This function restores all organs. return bodyparts_by_name[zone] -/mob/living/carbon/human/apply_damage(damage = 0, damagetype = BRUTE, def_zone = null, blocked = 0, sharp = 0, edge = 0, obj/used_weapon = null) +/mob/living/carbon/human/apply_damage(damage = 0, damagetype = BRUTE, def_zone = null, blocked = 0, sharp = 0, obj/used_weapon = null) //Handle other types of damage if((damagetype != BRUTE) && (damagetype != BURN)) ..(damage, damagetype, def_zone, blocked) @@ -364,7 +355,7 @@ This function restores all organs. if(species) damage = damage * species.brute_mod - if(organ.take_damage(damage, 0, sharp, edge, used_weapon)) + if(organ.take_damage(damage, 0, sharp, used_weapon)) UpdateDamageIcon() if(LAssailant && ishuman(LAssailant)) //superheros still get the comical hit markers @@ -389,7 +380,7 @@ This function restores all organs. if(species) damage = damage * species.burn_mod - if(organ.take_damage(0, damage, sharp, edge, used_weapon)) + if(organ.take_damage(0, damage, sharp, used_weapon)) UpdateDamageIcon() // Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life(). diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index bbe57fa66f9..b5796aee6d5 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -8,9 +8,10 @@ emp_act */ -/mob/living/carbon/human/bullet_act(var/obj/item/projectile/P, var/def_zone) - if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) +/mob/living/carbon/human/bullet_act(obj/item/projectile/P, def_zone) + + if(P.is_reflectable) if(check_reflect(def_zone)) // Checks if you've passed a reflection% check visible_message("The [P.name] gets reflected by [src]!", \ "The [P.name] gets reflected by [src]!") @@ -41,19 +42,6 @@ emp_act . = bullet_act(P, "chest") //act on chest instead return - //Shrapnel - if(P.damage_type == BRUTE) - var/armor = getarmor_organ(organ, "bullet") - if((P.embed && prob(20 + max(P.damage - armor, -10)))) - var/obj/item/weapon/shard/shrapnel/SP = new() - (SP.name) = "[P.name] shrapnel" - if(P.ammo_casing && P.ammo_casing.caliber) - (SP.desc) = "[SP.desc] It looks like it is a [P.ammo_casing.caliber] caliber round." - else - (SP.desc) = "[SP.desc] The round's caliber is unidentifiable." - (SP.loc) = organ - organ.embed(SP) - organ.add_autopsy_data(P.name, P.damage) // Add the bullet's name to the autopsy data return (..(P , def_zone)) @@ -61,7 +49,7 @@ emp_act /mob/living/carbon/human/check_projectile_dismemberment(obj/item/projectile/P, def_zone) var/obj/item/organ/external/affecting = get_organ(check_zone(def_zone)) if(affecting && !affecting.cannot_amputate && affecting.get_damage() >= (affecting.max_damage - P.dismemberment)) - var/damtype = DROPLIMB_EDGE + var/damtype = DROPLIMB_SHARP switch(P.damage_type) if(BRUTE) damtype = DROPLIMB_BLUNT @@ -198,7 +186,7 @@ emp_act newmeat.subjectjob = src.job newmeat.reagents.add_reagent ("nutriment", (src.nutrition / 15) / 3) src.reagents.trans_to (newmeat, round ((src.reagents.total_volume) / 3, 1)) - src.loc.add_blood(src) + add_mob_blood(src) --src.meatleft to_chat(user, "You hack off a chunk of meat from [src.name]") if(!src.meatleft) @@ -234,32 +222,29 @@ emp_act var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].", armour_penetration = I.armour_penetration) var/weapon_sharp = is_sharp(I) - var/weapon_edge = has_edge(I) - if((weapon_sharp || weapon_edge) && prob(getarmor(user.zone_sel.selecting, "melee"))) + if(weapon_sharp && prob(getarmor(user.zone_sel.selecting, "melee"))) weapon_sharp = 0 - weapon_edge = 0 if(armor >= 100) return 0 if(!I.force) return 0 var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords) - apply_damage(I.force, I.damtype, affecting, armor, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I) + apply_damage(I.force, I.damtype, affecting, armor, sharp = weapon_sharp, used_weapon = I) var/bloody = 0 if(I.damtype == BRUTE && I.force && prob(25 + I.force * 2)) - I.add_blood(src) //Make the weapon bloody, not the person. + I.add_mob_blood(src) //Make the weapon bloody, not the person. // if(user.hand) user.update_inv_l_hand() //updates the attacker's overlay for the (now bloodied) weapon // else user.update_inv_r_hand() //removed because weapons don't have on-mob blood overlays - if(prob(33)) + if(prob(I.force * 2)) //blood spatter! bloody = 1 var/turf/location = loc if(istype(location, /turf/simulated)) - location.add_blood(src) + add_splatter_floor(location) if(ishuman(user)) var/mob/living/carbon/human/H = user if(get_dist(H, src) <= 1) //people with TK won't get smeared with blood - H.bloody_body(src) - H.bloody_hands(src) + H.add_mob_blood(src) if(!stat) switch(hit_area) @@ -275,15 +260,16 @@ emp_act if(bloody)//Apply blood if(wear_mask) - wear_mask.add_blood(src) + wear_mask.add_mob_blood(src) update_inv_wear_mask(0) if(head) - head.add_blood(src) + head.add_mob_blood(src) update_inv_head(0,0) if(glasses && prob(33)) - glasses.add_blood(src) + glasses.add_mob_blood(src) update_inv_glasses(0) + if("upper body")//Easier to score a stun but lasts less time if(stat == CONSCIOUS && I.force && prob(I.force + 10)) visible_message("[src] has been knocked down!", \ @@ -291,27 +277,18 @@ emp_act apply_effect(5, WEAKEN, armor) if(bloody) - bloody_body(src) + if(wear_suit) + wear_suit.add_mob_blood(src) + update_inv_wear_suit(1) + if(w_uniform) + w_uniform.add_mob_blood(src) + update_inv_w_uniform(1) + if(Iforce > 10 || Iforce >= 5 && prob(33)) forcesay(hit_appends) //forcesay checks stat already -/* //Melee weapon embedded object code. Commented out, as most people on the forums seem to find this annoying and think it does not contribute to general gameplay. - Dave - if(I.damtype == BRUTE && !I.is_robot_module()) - var/damage = I.force - if(armor) - damage /= armor+1 - - //blunt objects should really not be embedding in things unless a huge amount of force is involved - var/embed_chance = weapon_sharp? damage/I.w_class : damage/(I.w_class*3) - var/embed_threshold = weapon_sharp? 5*I.w_class : 15*I.w_class - - //Sharp objects will always embed if they do enough damage. - if(((weapon_sharp && damage > (10*I.w_class)) || (damage > embed_threshold && prob(embed_chance))) && (I.no_embed == 0) ) - affecting.embed(I) - return 1*/ - //this proc handles being hit by a thrown atom /mob/living/carbon/human/hitby(atom/movable/AM, skipcatch = 0, hitpush = 1, blocked = 0) var/obj/item/I @@ -325,45 +302,38 @@ emp_act hitpush = 0 skipcatch = 1 blocked = 1 - /*else if(I) + else if(I) if(I.throw_speed >= EMBED_THROWSPEED_THRESHOLD) - if(!I.is_robot_module()) - var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].", I.armour_penetration) //I guess "melee" is the best fit here - var/sharp = is_sharp(I) - var/damage = throwpower * (I.throw_speed / 5) - if(armor) - damage /= armor + 1 - - //blunt objects should really not be embedding in things unless a huge amount of force is involved - var/embed_chance = sharp? damage / I.w_class : damage/(I.w_class * 3) - var/embed_threshold = sharp? 5 * I.w_class : 15 * I.w_class - - //Sharp objects will always embed if they do enough damage. - //Thrown sharp objects have some momentum already and have a small chance to embed even if the damage is below the threshold - - if(((sharp && prob(damage / (10 * I.w_class) * 100)) || (damage > embed_threshold && prob(embed_chance))) && (I.no_embed == 0)) - affecting.embed(I)*/ + if(can_embed(I)) + if(prob(I.embed_chance)) + throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) + var/obj/item/organ/external/L = pick(bodyparts) + L.embedded_objects |= I + I.add_mob_blood(src)//it embedded itself in you, of course it's bloody! + I.forceMove(src) + L.take_damage(I.w_class*I.embedded_impact_pain_multiplier) + visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!") + hitpush = 0 + skipcatch = 1 //can't catch the now embedded item return ..() /mob/living/carbon/human/proc/bloody_hands(var/mob/living/source, var/amount = 2) if(gloves) - gloves.add_blood(source) + gloves.add_mob_blood(source) gloves:transfer_blood = amount - gloves:bloody_hands_mob = source else - add_blood(source) + add_mob_blood(source) bloody_hands = amount - bloody_hands_mob = source update_inv_gloves(1) //updates on-mob overlays for bloody hands and/or bloody gloves /mob/living/carbon/human/proc/bloody_body(var/mob/living/source) if(wear_suit) - wear_suit.add_blood(source) + wear_suit.add_mob_blood(source) update_inv_wear_suit(0) return if(w_uniform) - w_uniform.add_blood(source) + w_uniform.add_mob_blood(source) update_inv_w_uniform(1) /mob/living/carbon/human/proc/handle_suit_punctures(var/damtype, var/damage) @@ -421,5 +391,5 @@ emp_act /mob/living/carbon/human/water_act(volume, temperature, source) ..() - if(temperature >= 330) bodytemperature = bodytemperature + (temperature - bodytemperature) - if(temperature <= 280) bodytemperature = bodytemperature - (bodytemperature - temperature) + species.water_act(src,volume,temperature,source) + diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 15f9b6d112e..036202e1ae0 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -65,6 +65,8 @@ var/global/default_martial_art = new/datum/martial_art var/meatleft = 3 //For chef item var/decaylevel = 0 // For rotting bodies var/max_blood = BLOOD_VOLUME_NORMAL // For stuff in the vessel + var/bleed_rate = 0 + var/bleedsuppress = 0 //for stopping bloodloss var/check_mutations=0 // Check mutations on next life tick diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 85dd6e81f3c..164eb14e7cd 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -35,12 +35,52 @@ /mob/living/carbon/human/Move(NewLoc, direct) . = ..() - if(shoes && .) // did we actually move? + if(.) // did we actually move? if(!lying && !buckled) + var/obj/item/clothing/shoes/S = shoes if(!has_gravity(loc)) return - var/obj/item/clothing/shoes/S = shoes - S.step_action(src) + //Bloody footprints + var/turf/T = get_turf(src) + var/obj/item/organ/external/l_foot = get_organ("l_foot") + var/obj/item/organ/external/r_foot = get_organ("r_foot") + var/hasfeet = 1 + if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) + hasfeet = 0 + + if(shoes) + if(S.bloody_shoes && S.bloody_shoes[S.blood_state]) + var/obj/effect/decal/cleanable/blood/footprints/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints) in T + if(oldFP && oldFP.blood_state == S.blood_state && oldFP.basecolor == S.blood_color) + return + else + //No oldFP or it's a different kind of blood + S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state] - BLOOD_LOSS_PER_STEP) + var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T) + FP.blood_state = S.blood_state + FP.entered_dirs |= dir + FP.bloodiness = S.bloody_shoes[S.blood_state] + FP.blood_DNA = S.blood_DNA + FP.basecolor = S.blood_color + FP.update_icon() + update_inv_shoes() + else if(hasfeet) + if(bloody_feet && bloody_feet[blood_state]) + var/obj/effect/decal/cleanable/blood/footprints/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints) in T + if(oldFP && oldFP.blood_state == blood_state && oldFP.basecolor == feet_blood_color) + return + else + bloody_feet[blood_state] = max(0, bloody_feet[blood_state] - BLOOD_LOSS_PER_STEP) + var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T) + FP.blood_state = blood_state + FP.entered_dirs |= dir + FP.bloodiness = bloody_feet[blood_state] + FP.basecolor = feet_blood_color + FP.update_icon() + update_inv_shoes() + //End bloody footprints + if(S) + S.step_action(src) /mob/living/carbon/human/handle_footstep(turf/T) if(..()) diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 24ed336a4a3..3a8f6ff4f46 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -90,7 +90,7 @@ // standing is poor if(stance_damage >= 8) if(!(lying || resting)) - if(species && !(species.flags & NO_PAIN)) + if(!(NO_PAIN in species.species_traits)) emote("scream") custom_emote(1, "collapses!") Weaken(5) //can't emote while weakened, apparently. @@ -118,7 +118,7 @@ continue var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ") - custom_emote(1, "[(species.flags & NO_PAIN) ? "" : emote_scream ]drops what they were holding in their [E.name]!") + custom_emote(1, "[(NO_PAIN in species.species_traits) ? "" : emote_scream ]drops what they were holding in their [E.name]!") else if(E.is_malfunctioning()) diff --git a/code/modules/mob/living/carbon/human/interactive/functions.dm b/code/modules/mob/living/carbon/human/interactive/functions.dm index eb7b767dc94..46706c45363 100644 --- a/code/modules/mob/living/carbon/human/interactive/functions.dm +++ b/code/modules/mob/living/carbon/human/interactive/functions.dm @@ -420,9 +420,9 @@ return doing |= SNPC_SPECIAL - var/static/list/customableTypes = list(/obj/item/weapon/reagent_containers/food/snacks/customizable,/obj/item/weapon/reagent_containers/food/snacks/breadslice,/obj/item/weapon/reagent_containers/food/snacks/bun,/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti,/obj/item/trash/plate,/obj/item/trash/bowl) + var/static/list/customableTypes = list(/obj/item/weapon/reagent_containers/food/snacks/customizable,/obj/item/weapon/reagent_containers/food/snacks/breadslice,/obj/item/weapon/reagent_containers/food/snacks/bun,/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,/obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti,/obj/item/trash/plate,/obj/item/trash/bowl) - var/static/list/rawtypes = list(/obj/item/weapon/reagent_containers/food/snacks/grown, /obj/item/weapon/reagent_containers/food/snacks/rawcutlet, /obj/item/weapon/reagent_containers/food/snacks/rawsticks, /obj/item/weapon/reagent_containers/food/snacks/salmonmeat, /obj/item/weapon/reagent_containers/food/snacks/carpmeat, /obj/item/weapon/reagent_containers/food/snacks/catfishmeat, /obj/item/weapon/reagent_containers/food/snacks/spagetti, /obj/item/weapon/reagent_containers/food/snacks/dough, /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough, /obj/item/weapon/reagent_containers/food/snacks/doughslice, /obj/item/weapon/reagent_containers/food/snacks/meat, /obj/item/weapon/reagent_containers/food/snacks/boiledrice, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, /obj/item/weapon/reagent_containers/food/snacks/raw_bacon) + var/static/list/rawtypes = list(/obj/item/weapon/reagent_containers/food/snacks/grown, /obj/item/weapon/reagent_containers/food/snacks/rawcutlet, /obj/item/weapon/reagent_containers/food/snacks/rawsticks, /obj/item/weapon/reagent_containers/food/snacks/salmonmeat, /obj/item/weapon/reagent_containers/food/snacks/carpmeat, /obj/item/weapon/reagent_containers/food/snacks/catfishmeat, /obj/item/weapon/reagent_containers/food/snacks/spaghetti, /obj/item/weapon/reagent_containers/food/snacks/dough, /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough, /obj/item/weapon/reagent_containers/food/snacks/doughslice, /obj/item/weapon/reagent_containers/food/snacks/meat, /obj/item/weapon/reagent_containers/food/snacks/boiledrice, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, /obj/item/weapon/reagent_containers/food/snacks/raw_bacon) try var/list/allContents = getAllContents() diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm index 00b8e0a4544..b1d9b5bc68f 100644 --- a/code/modules/mob/living/carbon/human/interactive/interactive.dm +++ b/code/modules/mob/living/carbon/human/interactive/interactive.dm @@ -270,20 +270,20 @@ if(prob((SNPC_FUZZY_CHANCE_LOW+SNPC_FUZZY_CHANCE_HIGH)/4)) var/obj/item/organ/external/R = bodyparts_by_name["r_arm"] if(R) - R.robotize() + R.robotize(make_tough = 1) else var/obj/item/organ/external/L = bodyparts_by_name["l_arm"] if(L) - L.robotize() + L.robotize(make_tough = 1) //legs if(prob((SNPC_FUZZY_CHANCE_LOW+SNPC_FUZZY_CHANCE_HIGH)/4)) var/obj/item/organ/external/R = bodyparts_by_name["r_leg"] if(R) - R.robotize() + R.robotize(make_tough = 1) else var/obj/item/organ/external/L = bodyparts_by_name["l_leg"] if(L) - L.robotize() + L.robotize(make_tough = 1) UpdateDamageIcon() regenerate_icons() diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 8e1c32f931a..6edc2f0ae75 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -151,7 +151,7 @@ update_hair() //rebuild hair update_fhair() update_head_accessory() - if(internal) + if(internal && !get_organ_slot("breathing_tube")) internal = null update_internals_hud_icon(0) wear_mask_update(I, toggle_off = FALSE) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 00dbc50e8d0..ee5d773938c 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -40,6 +40,10 @@ if(!client) species.handle_npc(src) + if(stat != DEAD) + //Stuff jammed in your limbs hurts + handle_embedded_objects() + if(stat == DEAD) handle_decay() @@ -189,79 +193,68 @@ if(gene_stability < GENETIC_DAMAGE_STAGE_3) gib() - if(!(species.flags & RADIMMUNE)) + if(!(RADIMMUNE in species.species_traits)) if(radiation) + radiation = Clamp(radiation, 0, 200) - if(get_int_organ(/obj/item/organ/internal/nucleation/resonant_crystal)) - var/rads = radiation/25 - radiation -= rads - radiation -= 0.1 - reagents.add_reagent("radium", rads/10) - if( prob(10) ) - to_chat(src, "You feel relaxed.") - return - - if(radiation > 100) - radiation = 100 - Weaken(10) - if(!lying) - to_chat(src, "You feel weak.") - emote("collapse") - - if(radiation < 0) - radiation = 0 - - else - var/damage = 0 - switch(radiation) - if(0 to 49) - radiation-- - if(prob(25)) - adjustToxLoss(1) - damage = 1 - updatehealth() - - if(50 to 74) - radiation -= 2 - damage = 1 + var/autopsy_damage = 0 + switch(radiation) + if(1 to 49) + radiation = max(radiation-1, 0) + if(prob(25)) adjustToxLoss(1) - if(prob(5)) - radiation -= 5 - Weaken(3) - if(!lying) - to_chat(src, "You feel weak.") - emote("collapse") - updatehealth() + adjustFireLoss(1) + autopsy_damage = 2 - if(75 to 100) - radiation -= 3 - adjustToxLoss(3) - damage = 3 - if(prob(1)) - to_chat(src, "You mutate!") - randmutb(src) - domutcheck(src,null) - emote("gasp") - updatehealth() + if(50 to 74) + radiation = max(radiation-2, 0) + adjustToxLoss(1) + adjustFireLoss(1) + autopsy_damage = 2 + if(prob(5)) + radiation = max(radiation-5, 0) + Weaken(3) + to_chat(src, "You feel weak.") + emote("collapse") - else - radiation -= 5 - adjustToxLoss(5) - damage = 5 - if(prob(1)) - to_chat(src, "You mutate!") - randmutb(src) - domutcheck(src,null) - emote("gasp") - updatehealth() + if(75 to 100) + radiation = max(radiation-2, 0) + adjustToxLoss(2) + adjustFireLoss(2) + autopsy_damage = 4 + if(prob(2)) + to_chat(src, "You mutate!") + randmutb(src) + domutcheck(src, null) - if(damage && bodyparts.len) - var/obj/item/organ/external/O = pick(bodyparts) - if(istype(O)) O.add_autopsy_data("Radiation Poisoning", damage) + if(101 to 150) + radiation = max(radiation-3, 0) + adjustToxLoss(2) + adjustFireLoss(3) + autopsy_damage = 5 + if(prob(4)) + to_chat(src, "You mutate!") + randmutb(src) + domutcheck(src, null) + + if(151 to INFINITY) + radiation = max(radiation-3, 0) + adjustToxLoss(2) + adjustFireLoss(3) + autopsy_damage = 5 + if(prob(6)) + to_chat(src, "You mutate!") + randmutb(src) + domutcheck(src, null) + + if(autopsy_damage) + var/obj/item/organ/external/chest/chest = get_organ("chest") + if(chest) + chest.add_autopsy_data("Radiation Poisoning", autopsy_damage) /mob/living/carbon/human/breathe() - if((NO_BREATH in mutations) || (species && (species.flags & NO_BREATHE)) || reagents.has_reagent("lexorin")) + if((NO_BREATH in mutations) || (NO_BREATHE in species.species_traits) || reagents.has_reagent("lexorin")) adjustOxyLoss(-5) oxygen_alert = 0 toxins_alert = 0 @@ -281,7 +274,7 @@ if(losebreath > 0) AdjustLoseBreath(-1) if(prob(10)) - spawn emote("gasp") + emote("gasp") if(istype(loc, /obj/)) var/obj/loc_as_obj = loc loc_as_obj.handle_internal_lifeform(src, 0) @@ -327,9 +320,10 @@ var/null_internals = 0 //internals are invalid, therefore turn them off var/skip_contents_check = 0 //rigsuit snowflake, oxygen tanks aren't stored inside the mob, so the 'contents.Find' check has to be skipped. - if(!(wear_mask && wear_mask.flags & AIRTIGHT)) //if NOT (wear_mask AND wear_mask.flags CONTAIN AIRTIGHT) - if(!(head && head.flags & AIRTIGHT)) //if NOT (head AND head.flags CONTAIN AIRTIGHT) - null_internals = 1 //not wearing a mask or suitable helmet + if(!get_organ_slot("breathing_tube")) + if(!(wear_mask && wear_mask.flags & AIRTIGHT)) //if NOT (wear_mask AND wear_mask.flags CONTAIN AIRTIGHT) + if(!(head && head.flags & AIRTIGHT)) //if NOT (head AND head.flags CONTAIN AIRTIGHT) + null_internals = 1 //not wearing a mask or suitable helmet if(istype(back, /obj/item/weapon/rig)) //wearing a rigsuit var/obj/item/weapon/rig/rig = back //needs to be typecasted because this doesn't use get_rig() for some reason @@ -664,7 +658,7 @@ return 0 //godmode //The fucking FAT mutation is the greatest shit ever. It makes everyone so hot and bothered. - if(species.flags & CAN_BE_FAT) + if(CAN_BE_FAT in species.species_traits) if(FAT in mutations) if(overeatduration < 100) becomeSlim() @@ -728,7 +722,8 @@ AdjustDizzy(-3) AdjustJitter(-3) - if(species && species.flags & NO_INTORGANS) return + if(NO_INTORGANS in species.species_traits) + return handle_trace_chems() @@ -839,13 +834,6 @@ blinded = 1 stat = UNCONSCIOUS - if(embedded_flag && !(mob_master.current_cycle % 10)) - var/list/E - E = get_visible_implants(0) - if(!E.len) - embedded_flag = 0 - - //Vision //god knows why this is here var/obj/item/organ/vision if(species.vision_organ) @@ -906,7 +894,6 @@ if(!in_stasis) handle_organs() - handle_blood() else //dead @@ -958,6 +945,22 @@ adjustToxLoss(-3) lastpuke = 0 +/mob/living/carbon/human/proc/handle_embedded_objects() + for(var/X in bodyparts) + var/obj/item/organ/external/BP = X + for(var/obj/item/I in BP.embedded_objects) + if(prob(I.embedded_pain_chance)) + BP.take_damage(I.w_class*I.embedded_pain_multiplier) + to_chat(src, "[I] embedded in your [BP.name] hurts!") + + if(prob(I.embedded_fall_chance)) + BP.take_damage(I.w_class*I.embedded_fall_pain_multiplier) + BP.embedded_objects -= I + I.forceMove(get_turf(src)) + visible_message("[I] falls out of [name]'s [BP.name]!","[I] falls out of your [BP.name]!") + if(!has_embedded_objects()) + clear_alert("embeddedobject") + /mob/living/carbon/human/handle_changeling() if(mind) if(mind.changeling) @@ -973,7 +976,7 @@ ..() if(status_flags & GODMODE) return 0 //godmode - if(species && species.flags & NO_PAIN) + if(NO_PAIN in species.species_traits) return if(health <= config.health_threshold_softcrit)// health 0 makes you immediately collapse @@ -1026,7 +1029,7 @@ if(mob_master.current_cycle % 5) return pulse //update pulse every 5 life ticks (~1 tick/sec, depending on server load) - if(species && species.flags & NO_BLOOD) + if(NO_BLOOD in species.species_traits) return PULSE_NONE //No blood, no pulse. if(stat == DEAD) @@ -1037,8 +1040,7 @@ var/temp = PULSE_NORM - var/blood_type = get_blood_name() - if(round(vessel.get_reagent_amount(blood_type)) <= BLOOD_VOLUME_BAD) //how much blood do we have + if(blood_volume <= BLOOD_VOLUME_BAD)//how much blood do we have temp = PULSE_THREADY //not enough :( if(status_flags & FAKEDEATH) @@ -1097,12 +1099,12 @@ var/obj/item/clothing/mask/M = H.wear_mask if(M && (M.flags_cover & MASKCOVERSMOUTH)) return - if(H.species && H.species.flags & NO_BREATHE) + if(NO_BREATHE in species.species_traits) return //no puking if you can't smell! // Humans can lack a mind datum, y'know - if(H.mind && H.mind.assigned_role == "Detective") + if(H.mind && (H.mind.assigned_role == "Detective" || H.mind.assigned_role == "Coroner")) return //too cool for puke - to_chat(H, "You smell something foul...") + to_chat(H, "You smell something foul...") H.fakevomit() /mob/living/carbon/human/proc/handle_heartbeat() @@ -1177,7 +1179,9 @@ /mob/living/carbon/human/proc/can_heartattack() - if(species.flags & (NO_BLOOD|NO_INTORGANS)) + if(NO_BLOOD in species.species_traits) + return FALSE + if(NO_INTORGANS in species.species_traits) return FALSE return TRUE diff --git a/code/modules/mob/living/carbon/human/species/abductor.dm b/code/modules/mob/living/carbon/human/species/abductor.dm index 8e9c61992aa..75b19395dad 100644 --- a/code/modules/mob/living/carbon/human/species/abductor.dm +++ b/code/modules/mob/living/carbon/human/species/abductor.dm @@ -18,11 +18,10 @@ "eyes" = /obj/item/organ/internal/eyes/abductor //3 darksight. ) - flags = HAS_LIPS | NO_BLOOD | NO_BREATHE | NOGUNS + species_traits = list(NO_BLOOD, NO_BREATHE, VIRUSIMMUNE, NOGUNS) oxy_mod = 0 - virus_immune = 1 clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS dietflags = DIET_OMNI reagent_tag = PROCESS_ORG diff --git a/code/modules/mob/living/carbon/human/species/apollo.dm b/code/modules/mob/living/carbon/human/species/apollo.dm index 7fee37a17c2..989fe9ba62a 100644 --- a/code/modules/mob/living/carbon/human/species/apollo.dm +++ b/code/modules/mob/living/carbon/human/species/apollo.dm @@ -36,7 +36,7 @@ "antennae" = /obj/item/organ/internal/wryn/hivenode ) - flags = IS_WHITELISTED | HAS_LIPS | NO_BREATHE | HAS_SKIN_COLOR | NO_SCAN | HIVEMIND + species_traits = list(IS_WHITELISTED, NO_BREATHE, HAS_SKIN_COLOR, NO_SCAN, HIVEMIND) clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS dietflags = DIET_HERB //bees feed off nectar, so bee people feed off plants too @@ -99,7 +99,7 @@ burn_mod = 4 // holy shite, poor guys wont survive half a second cooking smores brute_mod = 2 // damn, double wham, double dam oxy_mod = 0 - flags = IS_WHITELISTED | NO_BREATHE | NO_BLOOD | NO_PAIN | HAS_LIPS | NO_SCAN + species_traits = list(LIPS, IS_WHITELISTED, NO_BREATHE, NO_BLOOD, NO_PAIN, NO_SCAN, RADIMMUNE) dietflags = DIET_OMNI //still human at their core, so they maintain their eating habits and diet //Default styles for created mobs. @@ -110,8 +110,7 @@ "heart" = /obj/item/organ/internal/heart, "crystallized brain" = /obj/item/organ/internal/brain/crystal, "eyes" = /obj/item/organ/internal/eyes/luminescent_crystal, //Standard darksight of 2. - "strange crystal" = /obj/item/organ/internal/nucleation/strange_crystal, - "resonant crystal" = /obj/item/organ/internal/nucleation/resonant_crystal + "strange crystal" = /obj/item/organ/internal/nucleation/strange_crystal ) vision_organ = /obj/item/organ/internal/eyes/luminescent_crystal diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm index a2f2eb30467..3fbf0a4d8c1 100644 --- a/code/modules/mob/living/carbon/human/species/golem.dm +++ b/code/modules/mob/living/carbon/human/species/golem.dm @@ -6,11 +6,10 @@ deform = 'icons/mob/human_races/r_golem.dmi' default_language = "Galactic Common" - flags = NO_BREATHE | NO_BLOOD | RADIMMUNE | NOGUNS + species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE, NOGUNS) oxy_mod = 0 - virus_immune = 1 dietflags = DIET_OMNI //golems can eat anything because they are magic or something reagent_tag = PROCESS_ORG diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm index 6e29d658cfe..1b66dc2b48b 100644 --- a/code/modules/mob/living/carbon/human/species/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/monkey.dm @@ -24,7 +24,7 @@ female_scream_sound = 'sound/goonstation/voice/monkey_scream.ogg' tail = "chimptail" - bodyflags = FEET_PADDED | HAS_TAIL + bodyflags = HAS_TAIL reagent_tag = PROCESS_ORG //Has standard darksight of 2. @@ -155,9 +155,6 @@ reagent_tag = PROCESS_ORG tail = null - bodyflags = FEET_PADDED - - /datum/species/monkey/unathi name = "Stok" name_plural = "Stok" @@ -172,4 +169,4 @@ base_color = "#000000" reagent_tag = PROCESS_ORG - bodyflags = FEET_CLAWS | HAS_TAIL + bodyflags = HAS_TAIL diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index 2041ca5f3e6..9a5e05723a9 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -6,7 +6,7 @@ //language = "Clatter" unarmed_type = /datum/unarmed_attack/punch - flags = IS_WHITELISTED | NO_BLOOD | NOTRANSSTING + species_traits = list(IS_WHITELISTED, NO_BLOOD, NOTRANSSTING) dietflags = DIET_OMNI reagent_tag = PROCESS_ORG @@ -49,9 +49,12 @@ var/tank_slot_name = "suit storage" switch(assigned_role) - if("Scientist","Geneticist","Roboticist") + if("Scientist","Roboticist") suit=/obj/item/clothing/suit/space/eva/plasmaman/science helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science + if("Geneticist") + suit=/obj/item/clothing/suit/space/eva/plasmaman/science/geneticist + helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science/geneticist if("Research Director") suit=/obj/item/clothing/suit/space/eva/plasmaman/science/rd helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science/rd @@ -90,7 +93,7 @@ if("Nanotrasen Representative") suit = /obj/item/clothing/suit/space/eva/plasmaman/nt_rep helm = /obj/item/clothing/head/helmet/space/eva/plasmaman/nt_rep - if("Medical Doctor","Brig Physician") + if("Medical Doctor","Brig Physician","Virologist") suit=/obj/item/clothing/suit/space/eva/plasmaman/medical helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_in_backpack) @@ -103,6 +106,12 @@ if("Chief Medical Officer") suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/cmo helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/cmo + if("Coroner") + suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/coroner + helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/coroner + if("Virologist") + suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/virologist + helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/virologist if("Bartender", "Chef") suit=/obj/item/clothing/suit/space/eva/plasmaman/service helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/service @@ -157,8 +166,7 @@ if(Toxins_pp < safe_plasma_min) if(prob(20)) - spawn(0) - H.emote("gasp") + H.emote("gasp") if(Toxins_pp > 0) var/ratio = safe_plasma_min/Toxins_pp H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!) @@ -189,8 +197,7 @@ 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") + H.emote("cough") else H.co2overloadtime = 0 @@ -204,8 +211,7 @@ H.AdjustSleeping(8, bound_lower = 0, bound_upper = 10) else if(SA_pp > 0.15) // 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")) + H.emote(pick("giggle", "laugh")) SA.moles = 0 if(abs(310.15 - breath.temperature) > 50) // Hot air hurts :( diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm index 6f594768d4e..6a48cda5811 100644 --- a/code/modules/mob/living/carbon/human/species/shadow.dm +++ b/code/modules/mob/living/carbon/human/species/shadow.dm @@ -17,12 +17,10 @@ "eyes" = /obj/item/organ/internal/eyes/shadow //8 darksight. ) - flags = NO_BLOOD | NO_BREATHE | RADIMMUNE + species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE) oxy_mod = 0 - virus_immune = 1 - dietflags = DIET_OMNI //the mutation process allowed you to now digest all foods regardless of initial race reagent_tag = PROCESS_ORG suicide_messages = list( diff --git a/code/modules/mob/living/carbon/human/species/skeleton.dm b/code/modules/mob/living/carbon/human/species/skeleton.dm index 62676144ebd..b8f4208df90 100644 --- a/code/modules/mob/living/carbon/human/species/skeleton.dm +++ b/code/modules/mob/living/carbon/human/species/skeleton.dm @@ -13,11 +13,10 @@ blood_color = "#FFFFFF" flesh_color = "#E6E6C6" - flags = NO_BREATHE | NO_BLOOD | RADIMMUNE + species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE) oxy_mod = 0 - virus_immune = 1 //why is this a var and not a flag? dietflags = DIET_OMNI reagent_tag = PROCESS_ORG diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index c1d1a169c1d..d6c6473cd9c 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -76,6 +76,8 @@ var/brain_mod = 1 // Brain damage damage reduction/amplification var/stun_mod = 1 // If a species is more/less impacated by stuns/weakens/paralysis + var/blood_damage_type = OXY //What type of damage does this species take if it's low on blood? + var/total_health = 100 var/punchdamagelow = 0 //lowest possible punch damage var/punchdamagehigh = 9 //highest possible punch damage @@ -89,7 +91,8 @@ var/list/allowed_consumed_mobs = list() //If a species can consume mobs, put the type of mobs it can consume here. - var/flags = 0 // Various specific features. + var/list/species_traits = list() + var/clothing_flags = 0 // Underwear and socks. var/exotic_blood var/bodyflags = 0 @@ -108,7 +111,6 @@ var/icon/icon_template var/is_small var/show_ssd = 1 - var/virus_immune var/can_revive_by_healing // Determines whether or not this species can be revived by simply healing them var/has_gender = TRUE @@ -227,8 +229,7 @@ if(O2_pp < atmos_requirements["min_oxy"]) if(prob(20)) - spawn(0) - H.emote("gasp") + H.emote("gasp") H.failed_last_breath = 1 if(O2_pp > 0) @@ -250,8 +251,7 @@ if(N2_pp < atmos_requirements["min_nitro"]) if(prob(20)) - spawn(0) - H.emote("gasp") + H.emote("gasp") H.failed_last_breath = 1 if(N2_pp > 0) @@ -273,8 +273,7 @@ if(Tox_pp < atmos_requirements["min_tox"]) if(prob(20)) - spawn(0) - H.emote("gasp") + H.emote("gasp") H.failed_last_breath = 1 if(Tox_pp > 0) @@ -297,8 +296,7 @@ if(CO2_pp < atmos_requirements["min_co2"]) if(prob(20)) - spawn(0) - H.emote("gasp") + H.emote("gasp") H.failed_last_breath = 1 if(CO2_pp) @@ -316,8 +314,7 @@ 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") + H.emote("cough") else H.clear_alert("co2") H.co2overloadtime = 0 @@ -343,8 +340,7 @@ H.AdjustSleeping(8, bound_lower = 0, bound_upper = 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")) + H.emote(pick("giggle", "laugh")) handle_temperature(breath, H) return 1 @@ -399,9 +395,6 @@ if(has_gravity(H)) gravity = 1 - if(H.embedded_flag) - H.handle_embedded_objects() //Moving with objects stuck in you can cause bad times. - if(!ignoreslow && gravity) if(slowdown) . = slowdown @@ -473,7 +466,11 @@ // Return 1 if it should do normal processing too // Return 0 if it shouldn't deplete and do its normal effect // Other return values will cause weird badness -/datum/species/proc/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R) +/datum/species/proc/handle_reagents(mob/living/carbon/human/H, datum/reagent/R) + if(R.id == exotic_blood) + H.blood_volume = min(H.blood_volume + round(R.volume, 0.1), BLOOD_VOLUME_MAXIMUM) + H.reagents.del_reagent(R.id) + return 0 return 1 // For special snowflake species effects @@ -519,7 +516,6 @@ var/attack_sound = "punch" var/miss_sound = 'sound/weapons/punchmiss.ogg' var/sharp = 0 - var/edge = 0 /datum/unarmed_attack/punch attack_verb = list("punch") @@ -535,7 +531,6 @@ attack_sound = 'sound/weapons/slice.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' sharp = 1 - edge = 1 /datum/unarmed_attack/claws/armalis attack_verb = list("slash", "claw") @@ -590,7 +585,7 @@ if(SCREWYHUD_DEAD) H.healths.icon_state = "health7" if(SCREWYHUD_HEALTHY) H.healths.icon_state = "health0" else - switch(100 - ((flags & NO_PAIN) ? 0 : H.traumatic_shock) - H.staminaloss) + switch(100 - ((NO_PAIN in species_traits) ? 0 : H.traumatic_shock) - H.staminaloss) if(100 to INFINITY) H.healths.icon_state = "health0" if(80 to 100) H.healths.icon_state = "health1" if(60 to 80) H.healths.icon_state = "health2" @@ -743,3 +738,9 @@ It'll return null if the organ doesn't correspond, so include null checks when u if(H.see_override) //Override all H.see_invisible = H.see_override + +/datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source) + if(temperature >= 330) + M.bodytemperature = M.bodytemperature + (temperature - M.bodytemperature) + if(temperature <= 280) + M.bodytemperature = M.bodytemperature - (M.bodytemperature - temperature) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 4348b8b048b..7e7ddc1c5af 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -6,7 +6,7 @@ primitive_form = "Monkey" path = /mob/living/carbon/human/human language = "Sol Common" - flags = HAS_LIPS | CAN_BE_FAT + species_traits = list(LIPS, CAN_BE_FAT) clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_SKIN_TONE | HAS_BODY_MARKINGS dietflags = DIET_OMNI @@ -38,9 +38,9 @@ else, frequently even their own lives. They prefer warmer temperatures than most species and \ their native tongue is a heavy hissing laungage called Sinta'Unathi." - flags = HAS_LIPS + species_traits = list(LIPS) clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = FEET_CLAWS | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_BODY_MARKINGS | HAS_HEAD_MARKINGS | HAS_SKIN_COLOR | HAS_ALT_HEADS | TAIL_WAGGING + bodyflags = HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_BODY_MARKINGS | HAS_HEAD_MARKINGS | HAS_SKIN_COLOR | HAS_ALT_HEADS | TAIL_WAGGING dietflags = DIET_CARN cold_level_1 = 280 //Default 260 - Lower is better @@ -110,9 +110,9 @@ primitive_form = "Farwa" - flags = HAS_LIPS | CAN_BE_FAT + species_traits = list(LIPS, CAN_BE_FAT) clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR + bodyflags = HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING dietflags = DIET_OMNI reagent_tag = PROCESS_ORG flesh_color = "#AFA59E" @@ -160,15 +160,17 @@ to the degree it can cause conflict with more rigorous and strict authorities. They speak a guttural language known as 'Canilunzt' \ which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent." - flags = HAS_LIPS + species_traits = list(LIPS) clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = FEET_PADDED | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | HAS_FUR + bodyflags = HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR dietflags = DIET_OMNI reagent_tag = PROCESS_ORG flesh_color = "#966464" base_color = "#CF4D2F" butt_sprite = "vulp" + scream_verb = "yelps" + has_organ = list( "heart" = /obj/item/organ/internal/heart, "lungs" = /obj/item/organ/internal/lungs, @@ -209,7 +211,7 @@ herbivores on the whole and tend to be co-operative with the other species of the galaxy, although they rarely reveal \ the secrets of their empire to their allies." - flags = HAS_LIPS + species_traits = list(LIPS) clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_SKIN_COLOR | HAS_BODY_MARKINGS dietflags = DIET_HERB @@ -289,7 +291,7 @@ breath_type = "nitrogen" poison_type = "oxygen" - flags = NO_SCAN | IS_WHITELISTED | NOTRANSSTING + species_traits = list(NO_SCAN, IS_WHITELISTED, NOTRANSSTING) clothing_flags = HAS_SOCKS dietflags = DIET_OMNI bodyflags = HAS_ICON_SKIN_TONE | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_BODY_MARKINGS | HAS_TAIL_MARKINGS @@ -442,7 +444,7 @@ breath_type = "nitrogen" poison_type = "oxygen" - flags = NO_SCAN | NO_BLOOD | NO_PAIN | IS_WHITELISTED + species_traits = list(NO_SCAN, NO_BLOOD, NO_PAIN, IS_WHITELISTED) bodyflags = HAS_TAIL dietflags = DIET_OMNI //should inherit this from vox, this is here just in case @@ -486,9 +488,9 @@ brute_mod = 0.8 - flags = IS_WHITELISTED + species_traits = list(IS_WHITELISTED) clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = FEET_CLAWS | HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS + bodyflags = HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS eyes = "kidan_eyes_s" dietflags = DIET_HERB blood_color = "#FB9800" @@ -517,6 +519,7 @@ "is cracking their exoskeleton!", "is stabbing themselves with their mandibles!", "is holding their breath!") + /datum/species/slime name = "Slime People" name_plural = "Slime People" @@ -540,13 +543,16 @@ male_cough_sounds = list('sound/effects/slime_squish.ogg') female_cough_sounds = list('sound/effects/slime_squish.ogg') - flags = IS_WHITELISTED | NO_BREATHE | HAS_LIPS | NO_INTORGANS | NO_SCAN + species_traits = list(LIPS, IS_WHITELISTED, NO_BREATHE, NO_INTORGANS, NO_SCAN) clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_SKIN_COLOR | NO_EYES dietflags = DIET_CARN reagent_tag = PROCESS_ORG + + blood_color = "#0064C8" exotic_blood = "water" - //ventcrawler = 1 //ventcrawling commented out + blood_damage_type = TOX + butt_sprite = "slime" //Has default darksight of 2. @@ -573,7 +579,7 @@ #define SLIMEPERSON_BLOOD_SCALING_FACTOR 5 // Used to adjust how much of an effect the blood has on the rate of color change. Higher is slower. // Slowly shifting to the color of the reagents if((H in recolor_list) && H.reagents.total_volume > SLIMEPERSON_COLOR_SHIFT_TRIGGER) - var/blood_amount = H.vessel.total_volume + var/blood_amount = H.blood_volume var/r_color = mix_color_from_reagents(H.reagents.reagent_list) var/new_body_color = BlendRGB(r_color, rgb(H.r_skin, H.g_skin, H.b_skin), (blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)/((blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)+(H.reagents.total_volume))) var/list/new_color_list = ReadRGB(new_body_color) @@ -735,7 +741,7 @@ default_genes = list(REMOTE_TALK) - flags = IS_WHITELISTED | HAS_LIPS | CAN_BE_FAT + species_traits = list(LIPS, IS_WHITELISTED, CAN_BE_FAT) clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_BODY_MARKINGS dietflags = DIET_HERB @@ -751,6 +757,11 @@ genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED) ..() +/datum/species/grey/water_act(var/mob/living/carbon/C, volume, temperature, source) + ..() + C.take_organ_damage(5,min(volume,20)) + C.emote("scream") + /datum/species/grey/after_equip_job(datum/job/J, mob/living/carbon/human/H) var/speech_pref = H.client.prefs.speciesprefs if(speech_pref) @@ -790,7 +801,7 @@ even the simplest concepts of other minds. Their alien physiology allows them survive happily off a diet of nothing but light, \ water and other radiation." - flags = NO_BREATHE | RADIMMUNE | IS_PLANT | NO_BLOOD | NO_PAIN + species_traits = list(NO_BREATHE, RADIMMUNE, IS_PLANT, NO_BLOOD, NO_PAIN) clothing_flags = HAS_SOCKS dietflags = 0 //Diona regenerate nutrition in light, no diet necessary @@ -843,23 +854,20 @@ return ..() /datum/species/diona/handle_life(var/mob/living/carbon/human/H) + H.radiation = Clamp(H.radiation, 0, 100) //We have to clamp this first, then decrease it, or there's a few edge cases of massive heals if we clamp and decrease at the same time. var/rads = H.radiation / 25 - H.apply_effect(-rads,IRRADIATE,0) - H.nutrition += rads + H.radiation = max(H.radiation-rads, 0) + H.nutrition = min(H.nutrition+rads, NUTRITION_LEVEL_WELL_FED+10) H.adjustBruteLoss(-(rads)) - H.adjustOxyLoss(-(rads)) H.adjustToxLoss(-(rads)) var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing if(isturf(H.loc)) //else, there's considered to be no light var/turf/T = H.loc light_amount = min(T.get_lumcount() * 10, 5) //hardcapped so it's not abused by having a ton of flashlights - H.nutrition += light_amount + H.nutrition = min(H.nutrition+light_amount, NUTRITION_LEVEL_WELL_FED+10) H.traumatic_shock -= light_amount - if(H.nutrition > NUTRITION_LEVEL_WELL_FED) - H.nutrition = NUTRITION_LEVEL_WELL_FED - if(light_amount > 0) H.clear_alert("nolight") else @@ -869,8 +877,7 @@ H.adjustBruteLoss(-(light_amount/2)) H.adjustFireLoss(-(light_amount/4)) - H.adjustOxyLoss(-(light_amount)) - if(H.nutrition < 200) + if(H.nutrition < NUTRITION_LEVEL_STARVING+50) H.take_overall_damage(10,0) H.traumatic_shock++ @@ -900,15 +907,14 @@ oxy_mod = 0 death_message = "gives one shrill beep before falling limp, their monitor flashing blue before completely shutting off..." - flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | RADIMMUNE | ALL_RPARTS | NOTRANSSTING + species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_SCAN, NO_BLOOD, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NOTRANSSTING) clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY + bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY | ALL_RPARTS dietflags = 0 //IPCs can't eat, so no diet blood_color = "#1F181F" flesh_color = "#AAAAAA" //Default styles for created mobs. default_hair = "Blue IPC Screen" - virus_immune = 1 can_revive_by_healing = 1 has_gender = FALSE reagent_tag = PROCESS_SYN @@ -924,7 +930,7 @@ "brain" = /obj/item/organ/internal/brain/mmi_holder/posibrain, "cell" = /obj/item/organ/internal/cell, "optics" = /obj/item/organ/internal/eyes/optical_sensor, //Default darksight of 2. - "charger" = /obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord + "charger" = /obj/item/organ/internal/cyberimp/arm/power_cord ) vision_organ = /obj/item/organ/internal/eyes/optical_sensor @@ -1000,9 +1006,9 @@ "is sucking in warm air!", "is holding their breath!") - flags = IS_WHITELISTED | HAS_LIPS + species_traits = list(LIPS, IS_WHITELISTED) clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT - bodyflags = FEET_CLAWS | HAS_SKIN_TONE | HAS_BODY_MARKINGS + bodyflags = HAS_SKIN_TONE | HAS_BODY_MARKINGS dietflags = DIET_OMNI cold_level_1 = -1 //Default 260 - Lower is better diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 9a8a9b91404..31ce7f5b9e2 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -341,7 +341,7 @@ var/global/list/damage_icon_parts = list() if(update_icons) update_icons() - if(lip_style && species && species.flags & HAS_LIPS) + if(lip_style && (LIPS in species.species_traits)) var/icon/lips = icon("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[lip_style]_s") lips.Blend(lip_color, ICON_ADD) @@ -453,7 +453,7 @@ var/global/list/damage_icon_parts = list() //if(!src.get_int_organ(/obj/item/organ/internal/brain) && src.get_species() != "Machine" )//make it obvious we have NO BRAIN // hair_standing.Blend(debrained_s, ICON_OVERLAY) if(hair_style && hair_style.species_allowed) - if((head_organ.species.name in hair_style.species_allowed) || (head_organ.species.flags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics... + if((head_organ.species.name in hair_style.species_allowed) || (head_organ.species.bodyflags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics... var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") if(head_organ.species.name == "Slime People") // I am el worstos hair_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND) @@ -499,7 +499,7 @@ var/global/list/damage_icon_parts = list() if(head_organ.f_style) var/datum/sprite_accessory/facial_hair/facial_hair_style = facial_hair_styles_list[head_organ.f_style] if(facial_hair_style && facial_hair_style.species_allowed) - if((head_organ.species.name in facial_hair_style.species_allowed) || (head_organ.species.flags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics... + if((head_organ.species.name in facial_hair_style.species_allowed) || (head_organ.species.bodyflags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics... var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") if(head_organ.species.name == "Slime People") // I am el worstos facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index da764cafda3..21f087eeeee 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -9,6 +9,7 @@ if(..()) . = 1 + handle_blood() for(var/obj/item/organ/internal/O in internal_organs) O.on_life() handle_changeling() @@ -54,7 +55,7 @@ if(losebreath > 0) AdjustLoseBreath(-1) if(prob(10)) - spawn emote("gasp") + emote("gasp") if(istype(loc, /obj/)) var/obj/loc_as_obj = loc loc_as_obj.handle_internal_lifeform(src, 0) @@ -114,8 +115,7 @@ //OXYGEN if(O2_partialpressure < safe_oxy_min) //Not enough oxygen if(prob(20)) - spawn(0) - emote("gasp") + emote("gasp") if(O2_partialpressure > 0) var/ratio = safe_oxy_min/O2_partialpressure adjustOxyLoss(min(5*ratio, 3)) @@ -145,7 +145,7 @@ if(world.time - co2overloadtime > 300) adjustOxyLoss(8) if(prob(20)) - spawn(0) emote("cough") + emote("cough") else co2overloadtime = 0 @@ -168,7 +168,7 @@ AdjustSleeping(2, bound_lower = 0, bound_upper = 10) else if(SA_partialpressure > 0.01) if(prob(20)) - spawn(0) emote(pick("giggle","laugh")) + emote(pick("giggle","laugh")) //BREATH TEMPERATURE handle_breath_temperature(breath) @@ -183,9 +183,10 @@ if(internal) if(internal.loc != src) internal = null - if(!wear_mask || !(wear_mask.flags & AIRTIGHT)) //not wearing mask or non-breath mask - if(!head || !(head.flags & AIRTIGHT)) //not wearing helmet or non-breath helmet - internal = null //turn off internals + if(!get_organ_slot("breathing_tube")) + if(!wear_mask || !(wear_mask.flags & AIRTIGHT)) //not wearing mask or non-breath mask + if(!head || !(head.flags & AIRTIGHT)) //not wearing helmet or non-breath helmet + internal = null //turn off internals if(internal) update_internals_hud_icon(1) @@ -195,7 +196,18 @@ return +/mob/living/carbon/handle_diseases() + for(var/thing in viruses) + var/datum/disease/D = thing + if(prob(D.infectivity)) + D.spread() + + if(stat != DEAD) + D.stage_act() + //remember to remove the "proc" of the child procs of these. +/mob/living/carbon/proc/handle_blood() + return /mob/living/carbon/proc/handle_changeling() return @@ -235,21 +247,18 @@ wetlevel = max(wetlevel - 1,0) /mob/living/carbon/handle_stomach() - spawn(0) - for(var/mob/living/M in stomach_contents) - if(M.loc != src) + for(var/mob/living/M in stomach_contents) + if(M.loc != src) + stomach_contents.Remove(M) + continue + if(stat != DEAD) + if(M.stat == DEAD) stomach_contents.Remove(M) + qdel(M) continue - if(istype(M, /mob/living) && stat != 2) - if(M.stat == 2) - M.death(1) - stomach_contents.Remove(M) - qdel(M) - continue - if(mob_master.current_cycle%3==1) - if(!(M.status_flags & GODMODE)) - M.adjustBruteLoss(5) - nutrition += 10 + if(mob_master.current_cycle%3==1) + M.adjustBruteLoss(5) + nutrition += 10 //This updates the health and status of the mob (conscious, unconscious, dead) /mob/living/carbon/handle_regular_status_updates() @@ -346,8 +355,7 @@ handle_dreams() adjustStaminaLoss(-10) if(prob(10) && health && hal_screwyhud != SCREWYHUD_CRIT) - spawn(0) - emote("snore") + emote("snore") // Keep SSD people asleep if(player_logged) Sleeping(2) diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index 94ae7482437..28e457fd128 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -281,11 +281,9 @@ if(prob(90) && !client) Discipline++ - spawn() - SStun = 1 - sleep(rand(45,60)) - if(src) - SStun = 0 + SStun = 1 + spawn(rand(45,60)) + SStun = 0 Victim = null anchored = 0 @@ -309,11 +307,9 @@ if(Discipline == 1) attacked = 0 - spawn() - SStun = 1 - sleep(rand(55,65)) - if(src) - SStun = 0 + SStun = 1 + spawn(rand(55,65)) + SStun = 0 Victim = null anchored = 0 @@ -439,9 +435,8 @@ if(Discipline == 1) attacked = 0 - spawn() - SStun = 1 - sleep(rand(5,20)) + SStun = 1 + spawn(rand(5,20)) SStun = 0 spawn(0) @@ -491,9 +486,8 @@ Target = null anchored = 0 - spawn() - SStun = 1 - sleep(rand(5,20)) + SStun = 1 + spawn(rand(5,20)) SStun = 0 spawn(0) @@ -513,9 +507,8 @@ Discipline++ if(Discipline == 1) attacked = 0 - spawn() - SStun = 1 - sleep(rand(5,20)) + SStun = 1 + spawn(rand(5,20)) SStun = 0 Victim = null diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index ffd1fb9cd60..96caf40b191 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -8,7 +8,7 @@ Returns standard 0 if fail */ -/mob/living/proc/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/edge = 0, var/used_weapon = null) +/mob/living/proc/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/used_weapon = null) blocked = (100-blocked)/100 if(!damage || (blocked <= 0)) return 0 switch(damagetype) @@ -27,6 +27,22 @@ updatehealth() return 1 +/mob/living/proc/apply_damage_type(damage = 0, damagetype = BRUTE) //like apply damage except it always uses the damage procs + switch(damagetype) + if(BRUTE) + return adjustBruteLoss(damage) + if(BURN) + return adjustFireLoss(damage) + if(TOX) + return adjustToxLoss(damage) + if(OXY) + return adjustOxyLoss(damage) + if(CLONE) + return adjustCloneLoss(damage) + if(STAMINA) + return adjustStaminaLoss(damage) + if(BRAIN) + return adjustBrainLoss(damage) /mob/living/proc/apply_damages(var/brute = 0, var/burn = 0, var/tox = 0, var/oxy = 0, var/clone = 0, var/def_zone = null, var/blocked = 0, var/stamina = 0) if(blocked >= 100) return 0 diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index c5ce705ba17..8a043dbf591 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -3,4 +3,12 @@ clear_fullscreens() update_action_buttons_icon() + + for(var/s in ownedSoullinks) + var/datum/soullink/S = s + S.ownerDies(gibbed, src) + for(var/s in sharedSoullinks) + var/datum/soullink/S = s + S.sharerDies(gibbed, src) + ..(gibbed) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index b85146b8b63..8db2b9f54a2 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -15,20 +15,22 @@ blinded = null if(stat != DEAD) - //Breathing, if applicable - handle_breathing() + //Chemicals in the body + handle_chemicals_in_body() //Mutations and radiation handle_mutations_and_radiation() - //Chemicals in the body - handle_chemicals_in_body() + //Breathing, if applicable + handle_breathing() //Random events (vomiting etc) handle_random_events() . = 1 + handle_diseases() + //Handle temperature/pressure differences between body and environment if(environment) handle_environment(environment) @@ -69,6 +71,9 @@ /mob/living/proc/handle_chemicals_in_body() return +/mob/living/proc/handle_diseases() + return + /mob/living/proc/handle_random_events() return diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 90003c12e65..487b6240b61 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -502,7 +502,8 @@ var/mob/living/carbon/C = src C.handcuffed = initial(C.handcuffed) - for(var/datum/disease/D in C.viruses) + for(var/thing in C.viruses) + var/datum/disease/D = thing D.cure(0) // restore all of the human's blood and reset their shock stage @@ -512,6 +513,7 @@ human_mob.restore_blood() human_mob.shock_stage = 0 human_mob.decaylevel = 0 + human_mob.remove_all_embedded_objects() restore_all_organs() surgeries.Cut() //End all surgeries. @@ -523,6 +525,7 @@ stat = CONSCIOUS update_fire() regenerate_icons() + restore_blood() if(human_mob) human_mob.update_eyes() human_mob.update_dna() @@ -576,10 +579,10 @@ var/pull_dir = get_dir(src, pulling) if(get_dist(src, pulling) > 1 || ((pull_dir - 1) & pull_dir)) // puller and pullee more than one tile away or in diagonal position - //if(isliving(pulling)) - //var/mob/living/M = pulling - //if(M.lying && !M.buckled && (prob(M.getBruteLoss() * 200 / M.maxHealth))) - //M.makeTrail(T) + if(isliving(pulling)) + var/mob/living/M = pulling + if(M.lying && !M.buckled && (prob(M.getBruteLoss() * 200 / M.maxHealth))) + M.makeTrail(T) pulling.Move(T, get_dir(pulling, T)) // the pullee tries to reach our previous position if(pulling && get_dist(src, pulling) > 1) // the pullee couldn't keep up stop_pulling() @@ -600,6 +603,55 @@ return 1 return 0 +/mob/living/proc/makeTrail(turf/T) + if(!has_gravity(src)) + return + var/blood_exists = 0 + + for(var/obj/effect/decal/cleanable/trail_holder/C in loc) //checks for blood splatter already on the floor + blood_exists = 1 + if(isturf(loc)) + var/trail_type = getTrail() + if(trail_type) + var/brute_ratio = round(getBruteLoss()/maxHealth, 0.1) + if(blood_volume && blood_volume > max(BLOOD_VOLUME_NORMAL*(1 - brute_ratio * 0.25), 0))//don't leave trail if blood volume below a threshold + blood_volume = max(blood_volume - max(1, brute_ratio * 2), 0) //that depends on our brute damage. + var/newdir = get_dir(T, loc) + if(newdir != src.dir) + newdir = newdir | dir + if(newdir == 3) //N + S + newdir = NORTH + else if(newdir == 12) //E + W + newdir = EAST + if((newdir in cardinal) && (prob(50))) + newdir = turn(get_dir(T, loc), 180) + if(!blood_exists) + new /obj/effect/decal/cleanable/trail_holder(loc) + for(var/obj/effect/decal/cleanable/trail_holder/TH in loc) + if((!(newdir in TH.existing_dirs) || trail_type == "trails_1" || trail_type == "trails_2") && TH.existing_dirs.len <= 16) //maximum amount of overlays is 16 (all light & heavy directions filled) + TH.existing_dirs += newdir + TH.overlays.Add(image('icons/effects/blood.dmi', trail_type, dir = newdir)) + TH.transfer_mob_blood_dna(src) + if(ishuman(src)) + var/mob/living/carbon/human/H = src + if(H.species.blood_color) + TH.color = H.species.blood_color + else + TH.color = "#A10808" + +/mob/living/carbon/human/makeTrail(turf/T) + + if((NO_BLOOD in species.species_traits) || species.exotic_blood || !bleed_rate || bleedsuppress) + return + ..() + +/mob/living/proc/getTrail() + if(getBruteLoss() < 300) + return pick("ltrails_1", "ltrails_2") + else + return pick("trails_1", "trails_2") + + /*////////////////////// START RESIST PROCS */////////////////////// diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 548f1fb357b..fc9d5823602 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -41,12 +41,6 @@ /mob/living/bullet_act(var/obj/item/projectile/P, var/def_zone) //Armor var/armor = run_armor_check(def_zone, P.flag, armour_penetration = P.armour_penetration) - var/proj_sharp = is_sharp(P) - var/proj_edge = has_edge(P) - if((proj_sharp || proj_edge) && prob(getarmor(def_zone, P.flag))) - proj_sharp = 0 - proj_edge = 0 - if(!P.nodamage) apply_damage(P.damage, P.damage_type, def_zone, armor) if(P.dismemberment) @@ -78,7 +72,7 @@ if(istype(AM, /obj/item)) var/obj/item/I = AM var/zone = ran_zone("chest", 65)//Hits a random part of the body, geared towards the chest - var/dtype = BRUTE + var/dtype = BRUTE var/volume = I.get_volume_by_throwforce_and_or_w_class() if(istype(I, /obj/item/weapon)) var/obj/item/weapon/W = I @@ -97,7 +91,7 @@ visible_message("[src] has been hit by [I].", "[src] has been hit by [I].") var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].", I.armour_penetration) - apply_damage(I.throwforce, dtype, zone, armor, is_sharp(I), has_edge(I), I) + apply_damage(I.throwforce, dtype, zone, armor, is_sharp(I), I) if(I.thrownby) add_logs(I.thrownby, src, "hit", I) else @@ -266,6 +260,8 @@ if(!supress_message) visible_message("[user] has grabbed [src] passively!") + return G + /mob/living/incapacitated() if(stat || paralysis || stunned || weakened || restrained()) return 1 diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 397ce90af6c..67c8ca04172 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -59,3 +59,5 @@ var/tesla_ignore = FALSE var/list/say_log = list() //a log of what we've said, plain text, no spans or junk, essentially just each individual "message" + + var/blood_volume = 0 //how much blood the mob has diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index ccd0f652b68..39af8059e8b 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -55,7 +55,7 @@ if(mob_to_track) track = "[speaker_name] ([jobname])" - track += "\[OPEN\]" + track += "\[O\]" return track diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm index 6dc6ae21c46..b5c658c6c62 100644 --- a/code/modules/mob/living/silicon/death.dm +++ b/code/modules/mob/living/silicon/death.dm @@ -14,7 +14,7 @@ playsound(src.loc, 'sound/goonstation/effects/robogib.ogg', 50, 1) // flick("gibbed-r", animation) - robogibs(loc, viruses) + robogibs(loc) dead_mob_list -= src spawn(15) diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 2c9ab233eda..1c514a891ca 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -34,13 +34,15 @@ installed = -1 uninstall() -/datum/robot_component/proc/take_damage(brute, electronics, sharp, edge) - if(installed != 1) return +/datum/robot_component/proc/take_damage(brute, electronics, sharp) + if(installed != 1) + return brute_damage += brute electronics_damage += electronics - if(brute_damage + electronics_damage >= max_damage) destroy() + if(brute_damage + electronics_damage >= max_damage) + destroy() /datum/robot_component/proc/heal_damage(brute, electronics) if(installed != 1) diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index 4b7d0a04a27..99b79d35360 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -14,7 +14,7 @@ playsound(src.loc, 'sound/goonstation/effects/robogib.ogg', 50, 1) flick("gibbed-r", animation) - robogibs(loc, viruses) + robogibs(loc) living_mob_list -= src dead_mob_list -= src diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm index 056a65a8e66..5228803bd9d 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -53,7 +53,7 @@ if(..()) return - if(!allowed(usr)) + if(!allowed(usr) && !usr.can_admin_interact()) to_chat(usr, "Access denied.") return diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 16c8f1a3ef0..3454a6597ab 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -260,10 +260,6 @@ stored_comms["glass"]++ else if(istype(W,/obj/item/ammo_casing)) stored_comms["metal"]++ - else if(istype(W,/obj/item/weapon/shard/shrapnel)) - stored_comms["metal"]++ - stored_comms["metal"]++ - stored_comms["metal"]++ else if(istype(W,/obj/item/weapon/shard)) stored_comms["glass"]++ stored_comms["glass"]++ diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index 187a32633b6..767a78e1f77 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -108,6 +108,12 @@ to_chat(usr, "This role is not yet available to you. You need to wait another [player_age_check] days.") return + var/pt_req = role_available_in_playtime(client, ROLE_DRONE) + if(pt_req) + var/pt_req_string = get_exp_format(pt_req) + to_chat(usr, "This role is not yet available to you. Play another [pt_req_string] to unlock it.") + return + var/deathtime = world.time - src.timeofdeath var/joinedasobserver = 0 if(istype(src,/mob/dead/observer)) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 1f4430c3aea..3de8b868430 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1205,13 +1205,11 @@ var/list/robot_verbs_default = list( canmove = 1 scrambledcodes = 1 //Disconnect it's camera so it's not so easily tracked. - if(src.camera) - qdel(src.camera) - src.camera = null - // I'm trying to get the Cyborg to not be listed in the camera list - // Instead of being listed as "deactivated". The downside is that I'm going - // to have to check if every camera is null or not before doing anything, to prevent runtime errors. - // I could change the network to null but I don't know what would happen, and it seems too hacky for me. + QDEL_NULL(src.camera) + // I'm trying to get the Cyborg to not be listed in the camera list + // Instead of being listed as "deactivated". The downside is that I'm going + // to have to check if every camera is null or not before doing anything, to prevent runtime errors. + // I could change the network to null but I don't know what would happen, and it seems too hacky for me. /mob/living/silicon/robot/proc/ResetSecurityCodes() set category = "Robot Commands" diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index 780a622906a..f84696c9964 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -98,11 +98,11 @@ var/datum/robot_component/armour/A = get_armour() if(A) - A.take_damage(brute,burn,sharp,edge) + A.take_damage(brute, burn, sharp) return var/datum/robot_component/C = pick(components) - C.take_damage(brute,burn,sharp,edge) + C.take_damage(brute, burn, sharp) /mob/living/silicon/robot/heal_overall_damage(var/brute, var/burn) var/list/datum/robot_component/parts = get_damaged_components(brute,burn) @@ -149,7 +149,7 @@ var/datum/robot_component/armour/A = get_armour() if(A) - A.take_damage(brute,burn,sharp) + A.take_damage(brute, burn, sharp) return while(parts.len && (brute>0 || burn>0) ) @@ -158,7 +158,7 @@ var/brute_was = picked.brute_damage var/burn_was = picked.electronics_damage - picked.take_damage(brute,burn) + picked.take_damage(brute, burn) brute -= (picked.brute_damage - brute_was) burn -= (picked.electronics_damage - burn_was) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 31b4c826e9d..4d5ea6b983d 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -255,8 +255,9 @@ modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src) modules += new /obj/item/weapon/pen(src) modules += new /obj/item/weapon/razor(src) - modules += new /obj/item/device/violin(src) - modules += new /obj/item/device/guitar(src) + modules += new /obj/item/device/instrument/violin(src) + modules += new /obj/item/device/instrument/guitar(src) + modules += new /obj/item/device/instrument/eguitar(src) var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src) M.matter = 30 diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index f9f1bbf1c08..a71fbe2ae03 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -167,9 +167,8 @@ mode = BOT_CLEANING spawn(50) if(mode == BOT_CLEANING) - qdel(target) + QDEL_NULL(target) anchored = 0 - target = null mode = BOT_IDLE icon_state = "cleanbot[on]" @@ -222,4 +221,4 @@ text("[on ? "On" : "Off"]")) if(istype(A,/obj/effect/decal/cleanable)) clean(A) else - ..() \ No newline at end of file + ..() diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 50475fe45db..2d863b99b4a 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -398,7 +398,8 @@ return 1 if(treat_virus) - for(var/datum/disease/D in C.viruses) + for(var/thing in C.viruses) + var/datum/disease/D = thing //the medibot can't detect viruses that are undetectable to Health Analyzers or Pandemic machines. if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC) return 0 @@ -451,7 +452,8 @@ else if(treat_virus) var/virus = 0 - for(var/datum/disease/D in C.viruses) + for(var/thing in C.viruses) + var/datum/disease/D = thing //detectable virus if((!(D.visibility_flags & HIDDEN_SCANNER)) || (!(D.visibility_flags & HIDDEN_PANDEMIC))) if(D.severity != NONTHREAT) //virus is harmful diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 9f8725067b0..a38e97b170b 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -568,23 +568,6 @@ mode = BOT_NO_ROUTE -/mob/living/simple_animal/bot/mulebot/Move(turf/simulated/next) - var/turf/simulated/last = loc - - if(istype(last) && bloodiness) - last.AddTracks(/obj/effect/decal/cleanable/blood/tracks/wheels, currentDNA, 0, get_dir(last, next), currentBloodColor) - - . = ..() - - if(. && istype(next)) - if(bloodiness) - next.AddTracks(/obj/effect/decal/cleanable/blood/tracks/wheels, currentDNA, get_dir(last, next), 0, currentBloodColor) - bloodiness-- - - for(var/mob/living/carbon/human/H in next) - if(H != load) - RunOver(H) - // calculates a path to the current destination // given an optional turf to avoid /mob/living/simple_animal/bot/mulebot/calc_path(turf/avoid = null) @@ -668,6 +651,30 @@ return +/mob/living/simple_animal/bot/mulebot/Move(turf/simulated/next) + . = ..() + + if(. && istype(next)) + if(bloodiness) + var/obj/effect/decal/cleanable/blood/tracks/B = locate() in next + if(!B) + B = new /obj/effect/decal/cleanable/blood/tracks(loc) + if(blood_DNA && blood_DNA.len) + B.blood_DNA |= blood_DNA.Copy() + B.basecolor = currentBloodColor + var/newdir = get_dir(next, loc) + if(newdir == dir) + B.setDir(newdir) + else + newdir = newdir | dir + if(newdir == 3) + newdir = 1 + else if(newdir == 12) + newdir = 4 + B.setDir(newdir) + B.update_icon() + bloodiness-- + // called when bot bumps into anything /mob/living/simple_animal/bot/mulebot/Bump(atom/obs) if(!wires.MobAvoid()) // usually just bumps, but if avoidance disabled knock over mobs @@ -697,21 +704,18 @@ H.apply_damage(0.5*damage, BRUTE, "l_arm", run_armor_check("l_arm", "melee")) H.apply_damage(0.5*damage, BRUTE, "r_arm", run_armor_check("r_arm", "melee")) - var/obj/effect/decal/cleanable/blood/B = new(loc) - B.blood_DNA = list() - B.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type - currentDNA = B.blood_DNA + + var/turf/T = get_turf(src) + H.add_mob_blood(H) + H.add_splatter_floor(T) bloodiness += 4 - currentBloodColor = "#A10808" - if(istype(H)) - var/datum/reagent/blood/bld = H.get_blood(H.vessel) - if(bld.data["blood_colour"]) - currentBloodColor = bld.data["blood_colour"] - return - B.basecolor = currentBloodColor - B.update_icon() + var/list/blood_dna = H.get_blood_dna_list() + if(blood_dna) + transfer_blood_dna(blood_dna) + currentBloodColor = H.species.blood_color + return /mob/living/simple_animal/bot/mulebot/bot_control_message(command, mob/user, user_turf) switch(command) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 3daacefb108..7c7a31b5ef0 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -302,7 +302,6 @@ melee_damage_lower = 1 melee_damage_upper = 5 attacktext = "prods" - speed = 0 environment_smash = 3 see_in_dark = 8 attack_sound = 'sound/weapons/tap.ogg' diff --git a/code/modules/mob/living/simple_animal/friendly/diona.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm index 6bec35b98db..13203b62420 100644 --- a/code/modules/mob/living/simple_animal/friendly/diona.dm +++ b/code/modules/mob/living/simple_animal/friendly/diona.dm @@ -176,7 +176,7 @@ if(!M || !src) return - if(M.species.flags & NO_BLOOD) + if(NO_BLOOD in M.species.species_traits) to_chat(src, "That donor has no blood to take.") return diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 4f3d4588378..b7bd4fc46c1 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -27,6 +27,7 @@ stop_automated_movement_when_pulled = 1 var/milk_content = 0 can_collar = 1 + blood_volume = BLOOD_VOLUME_NORMAL /mob/living/simple_animal/hostile/retaliate/goat/handle_automated_movement() ..() @@ -110,6 +111,7 @@ var/milk_content = 0 can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY + blood_volume = BLOOD_VOLUME_NORMAL /mob/living/simple_animal/cow/New() ..() @@ -312,6 +314,7 @@ var/global/chicken_count = 0 maxHealth = 50 can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY + blood_volume = BLOOD_VOLUME_NORMAL /mob/living/simple_animal/turkey name = "turkey" @@ -381,6 +384,7 @@ var/global/chicken_count = 0 maxHealth = 50 can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY + blood_volume = BLOOD_VOLUME_NORMAL /mob/living/simple_animal/walrus name = "walrus" @@ -404,3 +408,4 @@ var/global/chicken_count = 0 maxHealth = 50 can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY + blood_volume = BLOOD_VOLUME_NORMAL diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm index 2d7bc63dc75..7202c8a4054 100644 --- a/code/modules/mob/living/simple_animal/friendly/pet.dm +++ b/code/modules/mob/living/simple_animal/friendly/pet.dm @@ -2,6 +2,7 @@ icon = 'icons/mob/pets.dmi' can_collar = 1 mob_size = MOB_SIZE_SMALL + blood_volume = BLOOD_VOLUME_NORMAL /mob/living/simple_animal/pet/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(istype(O, /obj/item/weapon/newspaper)) diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index bc75bd554e5..bf648e537ab 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -1,53 +1,53 @@ /mob/living/simple_animal/spiderbot - - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = 500 - - var/obj/item/device/radio/borg/radio = null - var/mob/living/silicon/ai/connected_ai = null - var/obj/item/weapon/stock_parts/cell/cell = null - var/obj/machinery/camera/camera = null - var/obj/item/device/mmi/mmi = null - var/list/req_access = list(access_robotics) //Access needed to pop out the brain. - name = "Spider-bot" - desc = "A skittering robotic friend!" + desc = "A skittering robotic friend!" //More like ultimate shitter icon = 'icons/mob/robots.dmi' icon_state = "spiderbot-chassis" icon_living = "spiderbot-chassis" icon_dead = "spiderbot-smashed" wander = 0 universal_speak = 1 - health = 10 - maxHealth = 10 + health = 40 + maxHealth = 40 + melee_damage_lower = 2 + melee_damage_upper = 2 + melee_damage_type = BURN attacktext = "shocks" - attacktext = "shocks" - melee_damage_lower = 1 - melee_damage_upper = 3 + attack_sound = "sparks" response_help = "pets" response_disarm = "shoos" response_harm = "stomps on" - - var/obj/item/held_item = null //Storage for single item they can hold. - var/emagged = 0 //IS WE EXPLODEN? - var/syndie = 0 //IS WE SYNDICAT? (currently unused) - speed = -1 //Spiderbots gotta go fast. - //pass_flags = PASSTABLE //Maybe griefy? + speed = 0 mob_size = MOB_SIZE_SMALL speak_emote = list("beeps","clicks","chirps") + + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + minbodytemp = 0 + maxbodytemp = 500 + can_hide = 1 ventcrawler = 2 loot = list(/obj/effect/decal/cleanable/blood/gibs/robot) del_on_death = 1 -/mob/living/simple_animal/spiderbot/attackby(var/obj/item/O as obj, var/mob/user as mob, params) + var/emagged = 0 //is it getting ready to explode? + var/obj/item/device/mmi/mmi = null + var/emagged_master = null //for administrative purposes, to see who emagged the spiderbot; also for a holder for if someone emags an empty frame first then inserts an MMI. - if(istype(O, /obj/item/device/mmi) || istype(O, /obj/item/device/mmi/posibrain)) +/mob/living/simple_animal/spiderbot/Destroy() + if(emagged) + QDEL_NULL(mmi) + explosion(get_turf(src), -1, -1, 3, 5) + else + eject_brain() + return ..() + +/mob/living/simple_animal/spiderbot/attackby(obj/item/O, mob/living/user, params) + if(istype(O, /obj/item/device/mmi)) var/obj/item/device/mmi/B = O - if(src.mmi) //There's already a brain in it. + if(mmi) //There's already a brain in it. to_chat(user, "There's already a brain in [src]!") return if(!B.brainmob) @@ -65,47 +65,49 @@ ghost_can_reenter = 1 break if(!ghost_can_reenter) - to_chat(user, "[O] is completely unresponsive; there's no point.") + to_chat(user, "[B] is completely unresponsive; there's no point.") return if(B.brainmob.stat == DEAD) - to_chat(user, "[O] is dead. Sticking it into the frame would sort of defeat the purpose.") + to_chat(user, "[B] is dead. Sticking it into the frame would sort of defeat the purpose.") return - if(jobban_isbanned(B.brainmob, "Cyborg") || jobban_isbanned(B.brainmob,"nonhumandept")) - to_chat(user, "[O] does not seem to fit.") + if(jobban_isbanned(B.brainmob, "Cyborg") || jobban_isbanned(B.brainmob, "nonhumandept")) + to_chat(user, "[B] does not seem to fit.") return - to_chat(user, "You install [O] in [src]!") + to_chat(user, "You install [B] in [src]!") user.drop_item() - src.mmi = O - src.transfer_personality(O) + B.forceMove(src) + mmi = B + transfer_personality(B) - O.loc = src - src.update_icon() + update_icon() return 1 - if(istype(O, /obj/item/weapon/weldingtool)) + else if(iswelder(O) && user.a_intent == INTENT_HELP) var/obj/item/weapon/weldingtool/WT = O + user.changeNext_move(CLICK_CD_MELEE) if(WT.remove_fuel(0)) if(health < maxHealth) - health += pick(1,1,1,2,2,3) - if(health > maxHealth) - health = maxHealth + adjustHealth(-5) + playsound(loc, WT.usesound, 50, 1) add_fingerprint(user) - for(var/mob/W in viewers(user, null)) - W.show_message(text("[user] has spot-welded some of the damage to [src]!"), 1) + visible_message("[user] has spot-welded some of the damage to [src]!") else to_chat(user, "[src] is undamaged!") else to_chat(user, "Need more welding fuel!") - return - else if(istype(O, /obj/item/weapon/card/id)||istype(O, /obj/item/device/pda)) + else if(istype(O, /obj/item/weapon/card/id) || istype(O, /obj/item/device/pda)) if(!mmi) to_chat(user, "There's no reason to swipe your ID - the spiderbot has no brain to remove.") return 0 + if(emagged) + to_chat(user, "[src] doesn't seem to respond.") + return 0 + var/obj/item/weapon/card/id/id_card if(istype(O, /obj/item/weapon/card/id)) @@ -117,63 +119,41 @@ if(access_robotics in id_card.access) to_chat(user, "You swipe your access card and pop the brain out of [src].") eject_brain() - - if(held_item) - held_item.loc = src.loc - held_item = null - return 1 else to_chat(user, "You swipe your card, with no effect.") return 0 else - if(O.force) - var/damage = O.force - if(O.damtype == STAMINA) - damage = 0 - adjustBruteLoss(damage) - for(var/mob/M in viewers(src, null)) - if((M.client && !( M.blinded ))) - M.show_message("[src] has been attacked with the [O] by [user]. ") - else - to_chat(usr, "This weapon is ineffective, it does no damage.") - for(var/mob/M in viewers(src, null)) - if((M.client && !( M.blinded ))) - M.show_message("[user] gently taps [src] with the [O]. ") + ..() -/mob/living/simple_animal/spiderbot/emag_act(user as mob) +/mob/living/simple_animal/spiderbot/emag_act(mob/living/user) if(emagged) - to_chat(user, "[src] is already overloaded - better run.") + to_chat(user, "[src] doesn't seem to respond.") return 0 else emagged = 1 - to_chat(user, "You short out the security protocols and overload [src]'s cell, priming it to explode in a short time.") - spawn(100) - to_chat(src, "Your cell seems to be outputting a lot of power...") - spawn(200) - to_chat(src, "Internal heat sensors are spiking! Something is badly wrong with your cell!") - spawn(300) - src.explode() + to_chat(user, "You short out the security protocols and rewrite [src]'s internal memory.") + to_chat(src, "You have been emagged; you are now completely loyal to [user] and their every order!") + emagged_master = user.name + add_logs(user, src, "emagged") + maxHealth = 60 + health = 60 + melee_damage_lower = 15 + melee_damage_upper = 15 + attack_sound = 'sound/machines/defib_zap.ogg' -/mob/living/simple_animal/spiderbot/proc/transfer_personality(var/obj/item/device/mmi/M as obj) - - src.mind = M.brainmob.mind - src.mind.key = M.brainmob.key - src.ckey = M.brainmob.ckey - src.name = "Spider-bot ([M.brainmob.name])" - -/mob/living/simple_animal/spiderbot/proc/explode() //When emagged. - for(var/mob/M in viewers(src, null)) - if((M.client && !( M.blinded ))) - M.show_message("[src] makes an odd warbling noise, fizzles, and explodes.") - explosion(get_turf(loc), -1, -1, 3, 5) - eject_brain() - death() +/mob/living/simple_animal/spiderbot/proc/transfer_personality(obj/item/device/mmi/M) + mind = M.brainmob.mind + mind.key = M.brainmob.key + ckey = M.brainmob.ckey + name = "Spider-bot ([M.brainmob.name])" + if(emagged) + to_chat(src, "You have been emagged; you are now completely loyal to [emagged_master] and their every order!") /mob/living/simple_animal/spiderbot/proc/update_icon() if(mmi) - if(istype(mmi,/obj/item/device/mmi)) + if(istype(mmi, /obj/item/device/mmi)) icon_state = "spiderbot-chassis-mmi" icon_living = "spiderbot-chassis-mmi" if(istype(mmi, /obj/item/device/mmi/posibrain)) @@ -186,99 +166,10 @@ /mob/living/simple_animal/spiderbot/proc/eject_brain() if(mmi) - var/turf/T = get_turf(loc) - if(T) - mmi.loc = T - if(mind) mind.transfer_to(mmi.brainmob) + var/turf/T = get_turf(src) + mmi.forceMove(T) + if(mind) + mind.transfer_to(mmi.brainmob) mmi = null - src.name = "Spider-bot" - update_icon() - -/mob/living/simple_animal/spiderbot/Destroy() - eject_brain() - return ..() - -/mob/living/simple_animal/spiderbot/New() - - radio = new /obj/item/device/radio/borg(src) - camera = new /obj/machinery/camera(src) - camera.c_tag = "Spiderbot-[real_name]" - camera.network = list("SS13") - - ..() - -/mob/living/simple_animal/spiderbot/death(gibbed) - if(camera) - camera.status = 0 - - if(held_item) - held_item.forceMove(src.loc) - held_item = null - ..() - -//Cannibalized from the parrot mob. ~Zuhayr - -/mob/living/simple_animal/spiderbot/verb/drop_held_item() - set name = "Drop held item" - set category = "Spiderbot" - set desc = "Drop the item you're holding." - - if(stat) - return - - if(!held_item) - to_chat(usr, "You have nothing to drop!") - return 0 - - if(istype(held_item, /obj/item/weapon/grenade)) - visible_message("[src] launches \the [held_item]!", "You launch \the [held_item]!", "You hear a skittering noise and a thump!") - var/obj/item/weapon/grenade/G = held_item - G.loc = src.loc - G.prime() - held_item = null - return 1 - - visible_message("[src] drops \the [held_item]!", "You drop \the [held_item]!", "You hear a skittering noise and a soft thump.") - - held_item.loc = src.loc - held_item = null - return 1 - - return - -/mob/living/simple_animal/spiderbot/verb/get_item() - set name = "Pick up item" - set category = "Spiderbot" - set desc = "Allows you to take a nearby small item." - - if(stat) - return -1 - - if(held_item) - to_chat(src, "You are already holding \the [held_item]") - return 1 - - var/list/items = list() - for(var/obj/item/I in view(1,src)) - if(I.loc != src && I.w_class <= WEIGHT_CLASS_SMALL) - items.Add(I) - - var/obj/selection = input("Select an item.", "Pickup") in items - - if(selection) - for(var/obj/item/I in view(1, src)) - if(selection == I) - held_item = selection - selection.loc = src - visible_message("[src] scoops up \the [held_item]!", "You grab \the [held_item]!", "You hear a skittering noise and a clink.") - return held_item - to_chat(src, "\The [selection] is too far away.") - return 0 - - to_chat(src, "There is nothing of interest to take.") - return 0 - -/mob/living/simple_animal/spiderbot/examine(mob/user) - ..(user) - if(src.held_item) - to_chat(user, "It is carrying \a [src.held_item] [bicon(src.held_item)].") + name = "Spider-bot" + update_icon() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 911f66a5527..50fab332201 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -98,10 +98,8 @@ /mob/living/simple_animal/hostile/proc/ListTargets()//Step 1, find out what we can see - . = list() if(!search_objects) - var/list/Mobs = hearers(vision_range, targets_from) - src //Remove self, so we don't suicide - . += Mobs + . = hearers(vision_range, targets_from) - src //Remove self, so we don't suicide var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/spacepod)) @@ -109,8 +107,7 @@ if(can_see(targets_from, HM, vision_range)) . += HM else - var/list/Objects = oview(vision_range, targets_from) - . += Objects + . = oview(vision_range, targets_from) /mob/living/simple_animal/hostile/proc/FindTarget(var/list/possible_targets, var/HasTargetsList = 0)//Step 2, filter down possible targets to things we actually care about . = list() diff --git a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm index 517b71a3a6d..a0f0a2b8b22 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm @@ -203,9 +203,9 @@ reagents.reaction(C, INGEST, fraction) reagents.trans_to(C, volume) -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/proc/link_host(mob/living/carbon/human/H) - faction = list("\ref[src]", "\ref[H]") // Hostile to everyone except the host. - H.vessel.trans_to(src, 30) +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/proc/link_host(mob/living/carbon/C) + faction = list("\ref[src]", "\ref[C]") // Hostile to everyone except the host. + C.transfer_blood_to(src, 30) color = mix_color_from_reagents(reagents.reagent_list) // Legion diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index de27a2173c3..91eb0970f50 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -477,7 +477,7 @@ var/mob/living/carbon/human/H = parrot_interest var/obj/item/organ/external/affecting = H.get_organ(ran_zone(pick(parrot_dam_zone))) - H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1) + H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp = 1) custom_emote(1, pick("pecks [H]'s [affecting].", "cuts [H]'s [affecting] with its talons.")) else diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 72c416e8f23..fc331fb74b9 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -422,6 +422,13 @@ damage = O.force if(O.damtype == STAMINA) damage = 0 + if(O.damtype == BRUTE) + if(prob(33)) + O.add_mob_blood(src) + var/turf/location = get_turf(src) + add_splatter_floor(location) + if(get_dist(user, src) <= 1) //people with TK won't get smeared with blood + user.add_mob_blood(src) visible_message("[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] [src] with [O]!",\ "[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] you with [O]!") else @@ -432,7 +439,6 @@ "This weapon is ineffective, it does no damage.") adjustBruteLoss(damage) - /mob/living/simple_animal/movement_delay() . = ..() diff --git a/code/modules/mob/living/simple_animal/tribbles.dm b/code/modules/mob/living/simple_animal/tribbles.dm index 78b28abf9f8..dfe4715edd5 100644 --- a/code/modules/mob/living/simple_animal/tribbles.dm +++ b/code/modules/mob/living/simple_animal/tribbles.dm @@ -242,7 +242,6 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles, item_state = "furgloves" transfer_prints = TRUE transfer_blood = TRUE - siemens_coefficient = 0 // Equivalent to a winter coat's hood /obj/item/clothing/head/furcap diff --git a/code/modules/mob/living/stat_states.dm b/code/modules/mob/living/stat_states.dm index 58c4221504d..812eeaa0821 100644 --- a/code/modules/mob/living/stat_states.dm +++ b/code/modules/mob/living/stat_states.dm @@ -37,9 +37,9 @@ // handles revival through other means than cloning or adminbus (defib, IPC repair) /mob/living/proc/update_revive(updating = TRUE) if(stat != DEAD) - return + return 0 if(!can_be_revived()) - return + return 0 add_logs(src, null, "came back to life at [atom_loc_line(get_turf(src))]", admin=0, print_attack_log = 0) stat = CONSCIOUS dead_mob_list -= src @@ -49,3 +49,11 @@ update_canmove() // update_blind_effects() updatehealth() + + for(var/s in ownedSoullinks) + var/datum/soullink/S = s + S.ownerRevives(src) + for(var/s in sharedSoullinks) + var/datum/soullink/S = s + S.sharerRevives(src) + return 1 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index cb86d417fbc..aadd5a74c1b 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -11,6 +11,10 @@ for(var/mob/dead/observer/M in following_mobs) M.following = null following_mobs = null + QDEL_LIST_ASSOC_VAL(tkgrabbed_objects) + for(var/I in tkgrabbed_objects) + qdel(tkgrabbed_objects[I]) + tkgrabbed_objects = null if(buckled) buckled.unbuckle_mob() if(viewing_alternate_appearances) @@ -1048,104 +1052,6 @@ var/list/slot_equipment_priority = list( \ /mob/proc/get_species() return "" -/mob/proc/get_visible_implants(var/class = 0) - var/list/visible_implants = list() - for(var/obj/item/O in embedded) - if(O.w_class > class) - visible_implants += O - return visible_implants - -/mob/proc/yank_out_object() - set category = "Object" - set name = "Yank out object" - set desc = "Remove an embedded item at the cost of bleeding and pain." - set src in view(1) - - if(!isliving(usr) || usr.next_move > world.time) - return - usr.changeNext_move(CLICK_CD_RESIST) - - if(usr.stat == 1) - to_chat(usr, "You are unconcious and cannot do that!") - return - - if(usr.restrained()) - to_chat(usr, "You are restrained and cannot do that!") - return - - var/mob/S = src - var/mob/U = usr - var/list/valid_objects = list() - var/self = null - - if(S == U) - self = 1 // Removing object from yourself. - - valid_objects = get_visible_implants(0) - if(!valid_objects.len) - if(self) - to_chat(src, "You have nothing stuck in your body that is large enough to remove.") - else - to_chat(U, "[src] has nothing stuck in their wounds that is large enough to remove.") - return - - var/obj/item/weapon/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects - - if(self) - visible_message("[usr] appears to be trying to extract an object from their body.") - to_chat(src, "You attempt to get a good grip on [selection] in your body.") - else - visible_message("[usr] attempts to get a good grip on [selection] in [S]'s body.") - to_chat(U, "You attempt to get a good grip on [selection] in [S]'s body.") - - if(!do_after(U, 80, target = S)) - return - if(!selection || !S || !U) - return - - if(self) - visible_message("[src] rips [selection] out of their body.","You rip [selection] out of your body.") - else - visible_message("[usr] rips [selection] out of [src]'s body.","[usr] rips [selection] out of your body.") - valid_objects = get_visible_implants(0) - if(valid_objects.len == 1) //Yanking out last object - removing verb. - src.verbs -= /mob/proc/yank_out_object - - if(ishuman(src)) - - var/mob/living/carbon/human/H = src - var/obj/item/organ/external/affected - - for(var/obj/item/organ/external/organ in H.bodyparts) //Grab the organ holding the implant. - for(var/obj/item/weapon/O in organ.implants) - if(O == selection) - affected = organ - - affected.implants -= selection - H.shock_stage+=10 - - if(prob(10)) //I'M SO ANEMIC I COULD JUST -DIE-. - var/datum/wound/internal_bleeding/I = new () - affected.wounds += I - H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 1) - - if(ishuman(U)) - var/mob/living/carbon/human/human_user = U - human_user.bloody_hands(H) - - selection.forceMove(get_turf(src)) - if(!(U.l_hand && U.r_hand)) - U.put_in_hands(selection) - - for(var/obj/item/weapon/O in pinned) - if(O == selection) - pinned -= O - if(!pinned.len) - anchored = 0 - return 1 - - - /mob/dead/observer/verb/respawn() set name = "Respawn as NPC" set category = "Ghost" diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 959913972fa..e275d855328 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -53,8 +53,6 @@ var/lastpuke = 0 var/unacidable = 0 var/can_strip = 1 - var/list/pinned = list() //List of things pinning this creature to walls (see living_defense.dm) - var/list/embedded = list() //Embedded items, since simple mobs don't have organs. var/list/languages = list() // For speaking/listening. var/list/abilities = list() // For species-derived or admin-given powers. var/list/speak_emote = list("says") // Verbs used when speaking. Defaults to 'say' if speak_emote is null. @@ -122,6 +120,7 @@ var/has_enabled_antagHUD = 0 var/antagHUD = 0 + var/can_change_intents = 1 //all mobs can change intents by default. //Generic list for proc holders. Only way I can see to enable certain verbs/procs. Should be modified if needed. var/proc_holder_list[] = list() @@ -146,7 +145,7 @@ //List of active diseases - var/list/viruses = list() // replaces var/datum/disease/virus + var/list/viruses = list() // list of all diseases in a mob var/list/resistances = list() mouse_drag_pointer = MOUSE_ACTIVE_POINTER @@ -198,3 +197,5 @@ var/list/actions = list() var/list/progressbars = null //for stacking do_after bars + + var/list/tkgrabbed_objects = list() // Assoc list of items to TK grabs diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index ecc987530ab..4b41b5084c6 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -167,9 +167,11 @@ */ + var/breathing_tube = affecting.get_organ_slot("breathing_tube") + if(state >= GRAB_NECK) affecting.Stun(5) //It will hamper your voice, being choked and all. - if(isliving(affecting)) + if(isliving(affecting) && !breathing_tube) var/mob/living/L = affecting L.adjustOxyLoss(1) @@ -177,7 +179,8 @@ //affecting.apply_effect(STUTTER, 5) //would do this, but affecting isn't declared as mob/living for some stupid reason. affecting.Stuttering(5) //It will hamper your voice, being choked and all. affecting.Weaken(5) //Should keep you down unless you get help. - affecting.AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3) + if(!breathing_tube) + affecting.AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3) adjust_position() @@ -290,7 +293,8 @@ msg_admin_attack("[key_name(assailant)] strangled (kill intent) [key_name(affecting)]") assailant.next_move = world.time + 10 - affecting.AdjustLoseBreath(1) + if(!affecting.get_organ_slot("breathing_tube")) + affecting.AdjustLoseBreath(1) affecting.setDir(WEST) adjust_position() diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index e1a1bdc1d8b..43b12417215 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -16,11 +16,9 @@ return 0 /mob/living/carbon/human/isSynthetic() - // If they are 100% robotic, they count as synthetic. - for(var/obj/item/organ/external/E in bodyparts) - if(!(E.status & ORGAN_ROBOT)) - return 0 - return 1 + if(get_species() == "Machine") + return 1 + return 0 /mob/proc/get_screen_colour() @@ -244,7 +242,7 @@ proc/slur(phrase, var/list/slurletters = ("'"))//use a different list as an inpu return sanitize(copytext(t,1,MAX_MESSAGE_LEN)) -proc/Gibberish(t, p)//t is the inputted message, and any value higher than 70 for p will cause letters to be replaced instead of added +/proc/Gibberish(t, p)//t is the inputted message, and any value higher than 70 for p will cause letters to be replaced instead of added /* Turn text into complete gibberish! */ var/returntext = "" for(var/i = 1, i <= length(t), i++) @@ -339,30 +337,31 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) set name = "a-intent" set hidden = 1 - if(ishuman(src) || isalienadult(src) || isbrain(src)) - switch(input) - if(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) - a_intent = input - if("right") - a_intent = intent_numeric((intent_numeric(a_intent)+1) % 4) - if("left") - a_intent = intent_numeric((intent_numeric(a_intent)+3) % 4) - if(hud_used && hud_used.action_intent) - hud_used.action_intent.icon_state = "[a_intent]" + if(can_change_intents) + if(ishuman(src) || isalienadult(src) || isbrain(src)) + switch(input) + if(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) + a_intent = input + if("right") + a_intent = intent_numeric((intent_numeric(a_intent)+1) % 4) + if("left") + a_intent = intent_numeric((intent_numeric(a_intent)+3) % 4) + if(hud_used && hud_used.action_intent) + hud_used.action_intent.icon_state = "[a_intent]" - else if(isrobot(src) || islarva(src)) - switch(input) - if(INTENT_HELP) - a_intent = INTENT_HELP - if(INTENT_HARM) - a_intent = INTENT_HARM - if("right","left") - a_intent = intent_numeric(intent_numeric(a_intent) - 3) - if(hud_used && hud_used.action_intent) - if(a_intent == INTENT_HARM) - hud_used.action_intent.icon_state = "harm" - else - hud_used.action_intent.icon_state = "help" + else if(isrobot(src) || islarva(src)) + switch(input) + if(INTENT_HELP) + a_intent = INTENT_HELP + if(INTENT_HARM) + a_intent = INTENT_HARM + if("right","left") + a_intent = intent_numeric(intent_numeric(a_intent) - 3) + if(hud_used && hud_used.action_intent) + if(a_intent == INTENT_HARM) + hud_used.action_intent.icon_state = "harm" + else + hud_used.action_intent.icon_state = "help" /mob/living/verb/mob_sleep() diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 58c5ee4104d..9f59f8779c5 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -302,7 +302,9 @@ AnnounceArrival(character, rank, join_message) callHook("latespawn", list(character)) - + var/datum/job/thisjob = job_master.GetJob(rank) + if(!thisjob.is_position_available() && thisjob in job_master.prioritized_jobs) + job_master.prioritized_jobs -= thisjob qdel(src) @@ -362,6 +364,18 @@ else if(shuttle_master.emergency.mode >= SHUTTLE_CALL) dat += "The station is currently undergoing evacuation procedures.
    " + if(length(job_master.prioritized_jobs)) + dat += "The station has flagged these jobs as high priority: " + var/amt = length(job_master.prioritized_jobs) + var/amt_count + for(var/datum/job/a in job_master.prioritized_jobs) + amt_count++ + if(amt_count != amt) + dat += " [a.title], " + else + dat += " [a.title].
    " + + dat += "Choose from the following open positions:

    " var/list/activePlayers = list() @@ -410,7 +424,10 @@ dat += "
    " dat += "[jobcat]" for(var/datum/job/job in categorizedJobs[jobcat]["jobs"]) - dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
    " + if(job in job_master.prioritized_jobs) + dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
    " + else + dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
    " dat += "

    " dat += "
    " @@ -499,7 +516,7 @@ /mob/new_player/proc/is_species_whitelisted(datum/species/S) if(!S) return 1 - return is_alien_whitelisted(src, S.name) || !config.usealienwhitelist || !(S.flags & IS_WHITELISTED) + return is_alien_whitelisted(src, S.name) || !config.usealienwhitelist || !(IS_WHITELISTED in S.species_traits) /mob/new_player/get_species() var/datum/species/chosen_species diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 9a2ea2e3499..75f1872fdad 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -1,8 +1,13 @@ /datum/preferences //The mob should have a gender you want before running this proc. Will run fine without H /datum/preferences/proc/random_character(gender_override) + var/datum/species/S = all_species[species] + if(!istype(S)) //The species was invalid. Set the species to the default, fetch the datum for that species and generate a random character. + species = initial(species) + S = all_species[species] var/datum/robolimb/robohead - if(species == "Machine") + + if(S.bodyflags & ALL_RPARTS) var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]" robohead = all_robolimbs[head_model] if(gender_override) @@ -12,38 +17,38 @@ underwear = random_underwear(gender, species) undershirt = random_undershirt(gender, species) socks = random_socks(gender, species) - if(species == "Vulpkanin") + if(body_accessory_by_species[species]) body_accessory = random_body_accessory(species) if(body_accessory == "None") //Required to prevent a bug where the information/icons in the character preferences screen wouldn't update despite the data being changed. body_accessory = null - if(species in list("Human", "Drask", "Vox")) + if(S.bodyflags & (HAS_SKIN_TONE|HAS_ICON_SKIN_TONE)) s_tone = random_skin_tone(species) h_style = random_hair_style(gender, species, robohead) f_style = random_facial_hair_style(gender, species, robohead) - if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) randomize_hair_color("hair") randomize_hair_color("facial") - if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) + if(S.bodyflags & HAS_HEAD_ACCESSORY) ha_style = random_head_accessory(species) var/list/colours = randomize_skin_color(1) r_headacc = colours["red"] g_headacc = colours["green"] b_headacc = colours["blue"] - if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) + if(S.bodyflags & HAS_HEAD_MARKINGS) m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head) var/list/colours = randomize_skin_color(1) m_colours["head"] = rgb(colours["red"], colours["green"], colours["blue"]) - if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) + if(S.bodyflags & HAS_BODY_MARKINGS) m_styles["body"] = random_marking_style("body", species) var/list/colours = randomize_skin_color(1) m_colours["body"] = rgb(colours["red"], colours["green"], colours["blue"]) - if(species in list("Vox", "Vulpkanin")) //Species with tail markings. + if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings. m_styles["tail"] = random_marking_style("tail", species, null, body_accessory) var/list/colours = randomize_skin_color(1) m_colours["tail"] = rgb(colours["red"], colours["green"], colours["blue"]) - if(species != "Machine") + if(!(S.bodyflags & ALL_RPARTS)) randomize_eyes_color() - if(species in list("Unathi", "Tajaran", "Skrell", "Vulpkanin")) + if(S.bodyflags & HAS_SKIN_COLOR) randomize_skin_color() backbag = 2 age = rand(AGE_MIN, AGE_MAX) @@ -254,7 +259,7 @@ icobase = 'icons/mob/human_races/r_human.dmi' var/fat="" - if(disabilities & DISABILITY_FLAG_FAT && current_species.flags & CAN_BE_FAT) + if(disabilities & DISABILITY_FLAG_FAT && (CAN_BE_FAT in current_species.species_traits)) fat="_fat" preview_icon = new /icon(icobase, "torso_[g][fat]") preview_icon.Blend(new /icon(icobase, "groin_[g]"), ICON_OVERLAY) diff --git a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm index 20c4e92fd98..a868c0958ea 100644 --- a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm @@ -43,7 +43,7 @@ if(!istype(file)) data["error"] = "I/O ERROR: Unable to open file." else - data["filedata"] = pencode_to_html(file.stored_data, sign = 0, fields = 0) + data["filedata"] = pencode_to_html(file.stored_data, format = 1, sign = 0, fields = 0) data["filename"] = "[file.filename].[file.filetype]" else if(!computer || !HDD) diff --git a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm index bfb90ab881b..7460d357b21 100644 --- a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm @@ -213,8 +213,7 @@ if("PRG_deletechannel") . = 1 if(channel && ((channel.operator == src) || netadmin_mode)) - qdel(channel) - channel = null + QDEL_NULL(channel) if("PRG_setpassword") . = 1 if(!channel || ((channel.operator != src) && !netadmin_mode)) @@ -228,4 +227,4 @@ if(newpassword == "nopassword") channel.password = "" else - channel.password = newpassword \ No newline at end of file + channel.password = newpassword diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index 2a6cb6f18a6..81281fe3dcc 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -31,12 +31,8 @@ /obj/machinery/lapvend/proc/reset_order() state = 0 devtype = 0 - if(fabricated_laptop) - qdel(fabricated_laptop) - fabricated_laptop = null - if(fabricated_tablet) - qdel(fabricated_tablet) - fabricated_tablet = null + QDEL_NULL(fabricated_laptop) + QDEL_NULL(fabricated_tablet) dev_cpu = 1 dev_battery = 1 dev_disk = 1 @@ -303,4 +299,4 @@ obj/machinery/lapvend/attackby(obj/item/I, mob/user) T.time = worldtime2text() vendor_account.transaction_log.Add(T) return 1 - return 0 \ No newline at end of file + return 0 diff --git a/code/modules/nano/interaction/inventory.dm b/code/modules/nano/interaction/inventory.dm index ccfbb695a99..cbe5165e5ff 100644 --- a/code/modules/nano/interaction/inventory.dm +++ b/code/modules/nano/interaction/inventory.dm @@ -4,7 +4,7 @@ /var/global/datum/topic_state/inventory_state/inventory_state = new() /datum/topic_state/inventory_state/can_use_topic(var/src_object, var/mob/user) - if(!(src_object in user)) + if(!((src_object in user) || user.is_in_active_hand(src_object) || user.is_in_inactive_hand(src_object))) return STATUS_CLOSE return user.shared_nano_interaction() diff --git a/code/modules/ninja/martial_art.dm b/code/modules/ninja/martial_art.dm index 1ea05b1073e..a17b2c00952 100644 --- a/code/modules/ninja/martial_art.dm +++ b/code/modules/ninja/martial_art.dm @@ -45,8 +45,8 @@ /datum/martial_art/ninja_martial_art/teach(var/mob/living/carbon/human/H,var/make_temporary=0) ..() H.middleClickOverride = new /datum/middleClickOverride/ninja_martial_art() - to_chat(H, "You have been taugh the ways of the Creeping Widow.
    \) - Your stikes on harm intent will deal more damage.
    Using middle mouse button on a nearby person while on harm intent will send them flying backwards.
    \ + to_chat(H, "You have been taught the ways of the Creeping Widow.
    \) + Your strikes on harm intent will deal more damage.
    Using middle mouse button on a nearby person while on harm intent will send them flying backwards.
    \ Your grabs will instantly be aggressive while you are using this style.
    Using middle mouse button while on harm intent and behind a person will put them in a silencing choke hold.
    \ Using middle mouse button on a nearby person while on disarm intent will wrench their wrist, causing them to drop what they are holding.
    " @@ -76,7 +76,7 @@ return 0 if(has_choke_hold) // Are we already choking someone? - to_chat(A, "You are have a target in your grip!") + to_chat(A, "You already have a target in your grip!") return 0 has_choke_hold = 1 @@ -98,8 +98,8 @@ D.silent += 1 D.adjustOxyLoss(1) else - D.visible_message("[A] loses his grip on [D]'s neck!", \ - "[A] loses his grip on your neck!") + D.visible_message("[A] loses \his grip on [D]'s neck!", \ + "[A] loses \his grip on your neck!") has_choke_hold = 0 return 0 I++ diff --git a/code/modules/ninja/suit/suit_initialisation.dm b/code/modules/ninja/suit/suit_initialisation.dm index 9954281b06f..59303b4707c 100644 --- a/code/modules/ninja/suit/suit_initialisation.dm +++ b/code/modules/ninja/suit/suit_initialisation.dm @@ -28,9 +28,8 @@ sleep(10) to_chat(usr, "Disconnecting neural-net interface... Success.") - if(usr.hud_used) - qdel(usr.hud_used) - usr.hud_used = null + + QDEL_NULL(usr.hud_used) usr.create_mob_hud() usr.regenerate_icons() @@ -64,9 +63,8 @@ sleep(5) to_chat(usr, "Suit secured, extending neural-net interface...") - if(usr.hud_used) - qdel(usr.hud_used) - usr.hud_used = null + + QDEL_NULL(usr.hud_used) usr.hud_used = new /datum/hud/human(usr, 'icons/mob/screen_ninja.dmi', "#ffffff", 255) if(usr.hud_used) usr.hud_used.show_hud(usr.hud_used.hud_version) @@ -91,4 +89,4 @@ to_chat(usr, "NOTICE: Suit de-activation protocals aborted.") else to_chat(usr, "FĆAL �Rr�R: ŧer nt recgnized, c-cntr-r䣧-ç äcked.") - return \ No newline at end of file + return diff --git a/code/modules/paperwork/frames.dm b/code/modules/paperwork/frames.dm index 1e16049f4b8..067c9abcdd6 100644 --- a/code/modules/paperwork/frames.dm +++ b/code/modules/paperwork/frames.dm @@ -43,10 +43,10 @@ overlays |= icon_state /obj/item/weapon/picture_frame/proc/insert(obj/D) - if(istype(D, /obj/item/weapon/contraband/poster)) - var/obj/item/weapon/contraband/poster/P = D - displayed = P.resulting_poster - P.resulting_poster = null + if(istype(D, /obj/item/weapon/poster)) + var/obj/item/weapon/poster/P = D + displayed = P.poster_structure + P.poster_structure = null else displayed = D @@ -54,7 +54,7 @@ displayed.pixel_x = 0 displayed.pixel_y = 0 displayed.forceMove(src) - if(istype(D, /obj/item/weapon/contraband/poster)) + if(istype(D, /obj/item/weapon/poster)) qdel(D) /obj/item/weapon/picture_frame/attackby(obj/item/I, mob/user) @@ -85,7 +85,7 @@ O.forceMove(user.loc) displayed = null qdel(src) - else if(istype(I, /obj/item/weapon/paper) || istype(I, /obj/item/weapon/photo) || istype(I, /obj/item/weapon/contraband/poster)) + else if(istype(I, /obj/item/weapon/paper) || istype(I, /obj/item/weapon/photo) || istype(I, /obj/item/weapon/poster)) if(!displayed) user.unEquip(I) insert(I) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 250abe3d682..cd5b065b3ca 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -203,7 +203,7 @@ /obj/item/weapon/paper/proc/parsepencode(var/t, var/obj/item/weapon/pen/P, mob/user as mob) - t = pencode_to_html(t, usr, P, TRUE, TRUE, deffont, signfont, crayonfont) + t = pencode_to_html(t, usr, P, TRUE, TRUE, TRUE, deffont, signfont, crayonfont) //Count the fields var/laststart = 1 diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 2a7c7e113e1..f5d10cef156 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -87,7 +87,7 @@ user.visible_message("[class][user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ "[class]You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") - if(user.get_inactive_hand() == src) + if(user.is_in_inactive_hand(src)) user.unEquip(src) new /obj/effect/decal/cleanable/ash(get_turf(src)) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 9f5d3534215..d93281f2468 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -155,10 +155,10 @@ on = 0 force = initial(force) sharp = 0 - edge = 0 w_class = initial(w_class) name = initial(name) hitsound = initial(hitsound) + embed_chance = initial(embed_chance) throwforce = initial(throwforce) playsound(user, 'sound/weapons/saberoff.ogg', 5, 1) to_chat(user, "[src] can now be concealed.") @@ -166,10 +166,10 @@ on = 1 force = 18 sharp = 1 - edge = 1 w_class = WEIGHT_CLASS_NORMAL name = "energy dagger" hitsound = 'sound/weapons/blade1.ogg' + embed_chance = 100 //rule of cool throwforce = 35 playsound(user, 'sound/weapons/saberon.ogg', 5, 1) to_chat(user, "[src] is now active.") diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index dc86ce2299a..5797107e502 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -64,7 +64,7 @@ user.visible_message("[class][user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ "[class]You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") - if(user.get_inactive_hand() == src) + if(user.is_in_inactive_hand(src)) user.unEquip(src) new /obj/effect/decal/cleanable/ash(get_turf(src)) diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 3b808c64d53..be46baf1c1b 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -27,7 +27,7 @@ desc = "A .38 bullet casing." caliber = "38" icon_state = "r-casing" - projectile_type = /obj/item/projectile/bullet/weakbullet2/rubber + projectile_type = /obj/item/projectile/bullet/weakbullet2 /obj/item/ammo_casing/c10mm desc = "A 10mm bullet casing." @@ -144,7 +144,7 @@ name = "beanbag slug" desc = "A weak beanbag slug for riot control." icon_state = "bshell" - projectile_type = /obj/item/projectile/bullet/weakbullet/rubber + projectile_type = /obj/item/projectile/bullet/weakbullet materials = list(MAT_METAL=250) diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm index 773ed4cff72..08a2104383d 100644 --- a/code/modules/projectiles/firing.dm +++ b/code/modules/projectiles/firing.dm @@ -43,8 +43,7 @@ if(targloc == curloc) if(target) //if the target is right on our location we go straight to bullet_act() target.bullet_act(BB, BB.def_zone) - qdel(BB) - BB = null + QDEL_NULL(BB) return 1 BB.preparePixelProjectile(target, targloc, user, params, spread) diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm index f541ca2a94a..bf0cd79f322 100644 --- a/code/modules/projectiles/guns/alien.dm +++ b/code/modules/projectiles/guns/alien.dm @@ -49,8 +49,6 @@ name = "alloy spike" desc = "A broadhead spike made out of a weird silvery metal." projectile_type = /obj/item/projectile/bullet/spike - sharp = 1 - edge = 0 throwforce = 5 w_class = WEIGHT_CLASS_NORMAL caliber = "spike" @@ -68,7 +66,7 @@ /obj/item/projectile/bullet/spike/on_hit(atom/target, blocked = 0) if((blocked != 100) && istype(target, /mob/living/carbon/human)) var/mob/living/carbon/human/H = target - H.drip(500) + H.bleed(50) ..() //This gun only functions for armalis. The on-sprite is too huge to render properly on other sprites. @@ -101,6 +99,5 @@ flag = "bullet" pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - embed = 0 weaken = 5 stun = 5 diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index cde0361c810..ca8d4c1fd3d 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -144,7 +144,6 @@ attack_verb = list("attacked", "slashed", "cut", "sliced") force = 12 sharp = 1 - edge = 1 can_charge = 0 /obj/item/weapon/gun/energy/plasmacutter/examine(mob/user) diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index 9909cb18d9d..0ae0d886be9 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -68,7 +68,7 @@ icon_state = "focus" item_state = "focus" ammo_type = list(/obj/item/ammo_casing/forcebolt) - + /obj/item/weapon/gun/magic/staff/spellblade name = "spellblade" desc = "A deadly combination of laziness and boodlust, this blade allows the user to dismember their enemies without all the hard work of actually swinging the sword." @@ -81,7 +81,6 @@ armour_penetration = 75 block_chance = 50 sharp = 1 - edge = 1 max_charges = 4 /obj/item/weapon/gun/magic/staff/spellblade/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type) diff --git a/code/modules/projectiles/guns/mounted.dm b/code/modules/projectiles/guns/mounted.dm index 8fec6cd8b8e..a767c94cc9c 100644 --- a/code/modules/projectiles/guns/mounted.dm +++ b/code/modules/projectiles/guns/mounted.dm @@ -1,30 +1,20 @@ /obj/item/weapon/gun/energy/gun/advtaser/mounted name = "mounted taser" desc = "An arm mounted dual-mode weapon that fires electrodes and disabler shots." - icon_state = "armcannon" + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "taser" + item_state = "armcannonstun4" force = 5 - flags = NODROP - w_class = WEIGHT_CLASS_HUGE - can_flashlight = 0 selfcharge = 1 + can_flashlight = 0 trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses neural signals instead -/obj/item/weapon/gun/energy/gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow... - ..() - loc = null//send it to nullspace to get retrieved by the implant later on. gotta cover those edge cases. - /obj/item/weapon/gun/energy/laser/mounted name = "mounted laser" - desc = "An arm mounted cannon that fires lethal lasers. Doesn't come with a charge beam." - icon_state = "armcannon" + desc = "An arm mounted cannon that fires lethal lasers." + icon = 'icons/obj/items_cyborg.dmi' + icon_state = "laser" item_state = "armcannonlase" force = 5 - flags = NODROP - w_class = WEIGHT_CLASS_HUGE - materials = null selfcharge = 1 - trigger_guard = TRIGGER_GUARD_ALLOW_ALL - -/obj/item/weapon/gun/energy/laser/mounted/dropped() - ..() - loc = null + trigger_guard = TRIGGER_GUARD_ALLOW_ALL \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/bow.dm b/code/modules/projectiles/guns/projectile/bow.dm index 2512ebfa35f..3fea800936e 100644 --- a/code/modules/projectiles/guns/projectile/bow.dm +++ b/code/modules/projectiles/guns/projectile/bow.dm @@ -77,7 +77,6 @@ desc = "Stab, stab, stab." icon_state = "arrow" force = 10 - sharp = 1 projectile_type = /obj/item/projectile/bullet/reusable/arrow caliber = "arrow" diff --git a/code/modules/projectiles/guns/projectile/saw.dm b/code/modules/projectiles/guns/projectile/saw.dm index 8b35ac805b4..3714a7983da 100644 --- a/code/modules/projectiles/guns/projectile/saw.dm +++ b/code/modules/projectiles/guns/projectile/saw.dm @@ -67,9 +67,9 @@ /obj/item/projectile/bullet/saw/bleeding/on_hit(atom/target, blocked = 0, hit_zone) . = ..() - if((blocked != 100) && istype(target, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = target - H.drip(350) + if((blocked != 100) && iscarbon(target)) + var/mob/living/carbon/C = target + C.bleed(35) /obj/item/projectile/bullet/saw/hollow damage = 60 diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm index b0bcc0743e2..cd8a64fbde6 100644 --- a/code/modules/projectiles/guns/projectile/sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -119,9 +119,9 @@ breakthings = FALSE /obj/item/projectile/bullet/sniper/haemorrhage/on_hit(atom/target, blocked = 0, hit_zone) - if((blocked != 100) && istype(target, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = target - H.drip(1000) + if((blocked != 100) && iscarbon(target)) + var/mob/living/carbon/C = target + C.bleed(100) return ..() diff --git a/code/modules/projectiles/guns/throw/crossbow.dm b/code/modules/projectiles/guns/throw/crossbow.dm index 77d3e89eade..00bafd296ce 100644 --- a/code/modules/projectiles/guns/throw/crossbow.dm +++ b/code/modules/projectiles/guns/throw/crossbow.dm @@ -155,7 +155,6 @@ throwforce = 20 w_class = WEIGHT_CLASS_NORMAL sharp = 1 - edge = 0 /obj/item/weapon/arrow/proc/removed() //Helper for metal rods falling apart. return @@ -170,8 +169,6 @@ /obj/item/weapon/arrow/rod/removed() if(superheated) // The rod has been superheated - we don't want it to be useable when removed from the bow. visible_message("[src] shatters into a scattering of overstressed metal shards as it leaves the crossbow.") - var/obj/item/weapon/shard/shrapnel/S = new /obj/item/weapon/shard/shrapnel - S.loc = get_turf(src) qdel(src) #undef XBOW_TENSION_20 diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 4a3afd18684..86987b102d1 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -37,6 +37,7 @@ var/flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb //Cael - bio and rad are also valid var/projectile_type = "/obj/item/projectile" var/range = 50 //This will de-increment every step. When 0, it will delete the projectile. + var/is_reflectable = FALSE // Can it be reflected or not? //Effects var/stun = 0 var/weaken = 0 @@ -48,7 +49,6 @@ var/drowsy = 0 var/stamina = 0 var/jitter = 0 - var/embed = 0 // whether or not the projectile can embed itself in the mob var/forcedodge = 0 //to pass through everything var/dismemberment = 0 //The higher the number, the greater the bonus to dismembering. 0 will not dismember at all. diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 01dcbd5228d..48fe1f74564 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -8,6 +8,7 @@ hitsound_wall = 'sound/weapons/effects/searwall.ogg' flag = "laser" eyeblur = 2 + is_reflectable = TRUE /obj/item/projectile/beam/laser diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 7434038eb91..88150cc5371 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -4,8 +4,6 @@ damage = 60 damage_type = BRUTE flag = "bullet" - embed = 1 - sharp = 1 hitsound_wall = "ricochet" /obj/item/projectile/bullet/weakbullet //beanbag, heavy stamina damage @@ -13,12 +11,7 @@ damage = 5 stamina = 80 -/obj/item/projectile/bullet/weakbullet/rubber //beanbag that shells that don't embed - embed = 0 - sharp = 0 - /obj/item/projectile/bullet/weakbullet/booze - embed = 0 /obj/item/projectile/bullet/weakbullet/booze/on_hit(atom/target, blocked = 0) if(..(target, blocked)) @@ -44,10 +37,6 @@ stamina = 60 icon_state = "bullet-r" -/obj/item/projectile/bullet/weakbullet2/rubber //detective's bullets that don't embed - embed = 0 - sharp = 0 - /obj/item/projectile/bullet/weakbullet3 damage = 20 @@ -56,8 +45,6 @@ damage = 5 stamina = 30 icon_state = "bullet-r" - embed = 0 - sharp = 0 /obj/item/projectile/bullet/toxinbullet damage = 15 @@ -145,8 +132,6 @@ name = "rubber pellet" damage = 3 stamina = 25 - embed = 0 - sharp = 0 icon_state = "bullet-r" /obj/item/projectile/bullet/stunshot//taser slugs for shotguns, nothing special @@ -157,8 +142,6 @@ stutter = 5 jitter = 20 range = 7 - embed = 0 - sharp = 0 icon_state = "spark" color = "#FFFF00" @@ -209,8 +192,6 @@ stun = 5 forcedodge = 1 nodamage = 1 - embed = 0 - sharp = 0 pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE hitsound = 'sound/items/bikehorn.ogg' icon = 'icons/obj/hydroponics/harvest.dmi' @@ -244,8 +225,6 @@ name = "dart" icon_state = "cbbolt" damage = 6 - embed = 0 - sharp = 0 var/piercing = 0 /obj/item/projectile/bullet/dart/New() @@ -286,6 +265,7 @@ icon_state = "syringeproj" /obj/item/projectile/bullet/dart/syringe/tranquilizer + /obj/item/projectile/bullet/dart/syringe/tranquilizer/New() ..() reagents.add_reagent("haloperidol", 15) @@ -307,8 +287,6 @@ name = "cap" damage = 0 nodamage = 1 - embed = 0 - sharp = 0 /obj/item/projectile/bullet/cap/fire() loc = null diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 79ffc1d0898..d9e8a0759bd 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -4,6 +4,7 @@ damage = 0 damage_type = BURN flag = "energy" + is_reflectable = TRUE /obj/item/projectile/energy/electrode name = "electrode" diff --git a/code/modules/projectiles/projectile/force.dm b/code/modules/projectiles/projectile/force.dm index 4e5c6d27700..4d62550a852 100644 --- a/code/modules/projectiles/projectile/force.dm +++ b/code/modules/projectiles/projectile/force.dm @@ -4,7 +4,6 @@ icon_state = "ice_1" damage = 20 flag = "energy" - embed = 1 /obj/item/projectile/forcebolt/strong name = "force bolt" diff --git a/code/modules/projectiles/projectile/reusable.dm b/code/modules/projectiles/projectile/reusable.dm index a223f415165..c66913651a3 100644 --- a/code/modules/projectiles/projectile/reusable.dm +++ b/code/modules/projectiles/projectile/reusable.dm @@ -35,8 +35,6 @@ ammo_type = /obj/item/ammo_casing/caseless/foam_dart range = 10 var/obj/item/weapon/pen/pen = null - edge = 0 - embed = 0 log_override = TRUE//it won't log even when there's a pen inside, but since the damage will be so low, I don't think there's any point in making it any more complex /obj/item/projectile/bullet/reusable/foam_dart/handle_drop() diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 83a4ec0650c..e11702b1f69 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -23,8 +23,6 @@ icon_state= "bolter" damage = 50 flag = "bullet" - sharp = 1 - edge = 1 /obj/item/projectile/bullet/gyro/on_hit(var/atom/target, var/blocked = 0) ..() @@ -136,7 +134,7 @@ var/mob/living/M = target if(ishuman(target)) var/mob/living/carbon/human/H = M - if(H.species.flags & IS_PLANT) + if(IS_PLANT in H.species.species_traits) if(prob(15)) M.apply_effect((rand(30,80)),IRRADIATE) M.Weaken(5) @@ -169,7 +167,7 @@ var/mob/M = target if(ishuman(target)) //These rays make plantmen fat. var/mob/living/carbon/human/H = M - if(H.species.flags & IS_PLANT) + if(IS_PLANT in H.species.species_traits) H.nutrition = min(H.nutrition+30, NUTRITION_LEVEL_FULL) else if(iscarbon(target)) M.show_message("The radiation beam dissipates harmlessly through your body.") diff --git a/code/modules/reagents/chem_splash.dm b/code/modules/reagents/chem_splash.dm new file mode 100644 index 00000000000..7c16bf1ab9a --- /dev/null +++ b/code/modules/reagents/chem_splash.dm @@ -0,0 +1,78 @@ +// Replaces chemgrenade stuff, allowing reagent explosions to be called from anywhere. +// It should be called using a location, the range, and a list of reagents involved. + +// Threatscale is a multiplier for the 'threat' of the grenade. If you're increasing the affected range drastically, you might want to improve this. +// Extra heat affects the temperature of the mixture, and may cause it to react in different ways. + + +/proc/chem_splash(turf/epicenter, affected_range = 3, list/datum/reagents/reactants = list(), extra_heat = 0, threatscale = 1, adminlog = 1) + if(!isturf(epicenter) || !reactants.len || threatscale <= 0) + return + var/has_reagents + var/total_reagents + for(var/datum/reagents/R in reactants) + if(R.total_volume) + has_reagents = 1 + total_reagents += R.total_volume + + if(!has_reagents) + return + + var/datum/reagents/splash_holder = new/datum/reagents(total_reagents*threatscale) + splash_holder.my_atom = epicenter // For some reason this is setting my_atom to null, and causing runtime errors. + var/total_temp = 0 + + for(var/datum/reagents/R in reactants) + R.trans_to(splash_holder, R.total_volume, threatscale, 1, 1) + total_temp += R.chem_temp + splash_holder.chem_temp = (total_temp/reactants.len) + extra_heat // Average temperature of reagents + extra heat. + splash_holder.handle_reactions() // React them now. + + if(splash_holder.total_volume && affected_range >= 0) //The possible reactions didnt use up all reagents, so we spread it around. + var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread() + steam.set_up(10, 0, epicenter) + steam.attach(epicenter) + steam.start() + + var/list/viewable = view(affected_range, epicenter) + + var/list/accessible = list(epicenter) + for(var/i=1; i<=affected_range; i++) + var/list/turflist = list() + for(var/turf/T in (orange(i, epicenter) - orange(i-1, epicenter))) + turflist |= T + for(var/turf/T in turflist) + if( !(get_dir(T,epicenter) in cardinal) && (abs(T.x - epicenter.x) == abs(T.y - epicenter.y) )) + turflist.Remove(T) + turflist.Add(T) // we move the purely diagonal turfs to the end of the list. + for(var/turf/T in turflist) + if(accessible[T]) + continue + for(var/thing in T.GetAtmosAdjacentTurfs(alldir = TRUE)) + var/turf/NT = thing + if(!(NT in accessible)) + continue + if(!(get_dir(T,NT) in cardinal)) + continue + accessible[T] = 1 + break + var/list/reactable = accessible + for(var/turf/T in accessible) + for(var/atom/A in T.GetAllContents()) + if(!(A in viewable)) + continue + reactable |= A + if(extra_heat >= 300) + T.hotspot_expose(extra_heat*2, 5) + if(!reactable.len) //Nothing to react with. Probably means we're in nullspace. + return + for(var/thing in reactable) + var/atom/A = thing + var/distance = max(1,get_dist(A, epicenter)) + var/fraction = 0.5/(2 ** distance) //50/25/12/6... for a 200u splash, 25/12/6/3... for a 100u, 12/6/3/1 for a 50u + splash_holder.reaction(A, TOUCH, fraction) + + qdel(splash_holder) + return 1 + + diff --git a/code/modules/reagents/chemistry/colors.dm b/code/modules/reagents/chemistry/colors.dm index 3d4ab41fe9c..0eea945349c 100644 --- a/code/modules/reagents/chemistry/colors.dm +++ b/code/modules/reagents/chemistry/colors.dm @@ -14,8 +14,8 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111 var/vol_temp // see libs/IconProcs/IconProcs.dm for(var/datum/reagent/reagent in reagent_list) - if(reagent.id == "blood" && reagent.data && reagent.data["blood_colour"]) - reagent_color = reagent.data["blood_colour"] + if(reagent.id == "blood" && reagent.data && reagent.data["blood_color"]) + reagent_color = reagent.data["blood_color"] else reagent_color = reagent.color diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index c65c628353b..2e89ea1c8e2 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -108,7 +108,7 @@ var/const/INGEST = 2 return the_id -/datum/reagents/proc/trans_to(target, amount=1, multiplier=1, preserve_data=1)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. +/datum/reagents/proc/trans_to(target, amount=1, multiplier=1, preserve_data=1, no_react = 0)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. if(!target) return if(total_volume <= 0) @@ -135,21 +135,18 @@ var/const/INGEST = 2 for(var/datum/reagent/current_reagent in reagent_list) if(!current_reagent) continue - if(current_reagent.id == "blood" && ishuman(target)) - var/mob/living/carbon/human/H = target - H.inject_blood(my_atom, amount) - continue var/current_reagent_transfer = current_reagent.volume * part if(preserve_data) trans_data = copy_data(current_reagent) - R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, chem_temp) + R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, chem_temp, no_react = 1) remove_reagent(current_reagent.id, current_reagent_transfer) update_total() R.update_total() - R.handle_reactions() - handle_reactions() + if(!no_react) + R.handle_reactions() + handle_reactions() return amount /datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1, safety = 0) @@ -496,9 +493,6 @@ var/const/INGEST = 2 //Species with PROCESS_DUO are only affected by reagents that affect both organics and synthetics, like acid and hellwater if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_DUO)) can_process = 1 - if(H.species && H.species.exotic_blood) - if(R.id == H.species.exotic_blood) - can_process = 0 //We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption) else if(R.process_flags != SYNTHETIC) @@ -537,7 +531,7 @@ var/const/INGEST = 2 var/amt = list_reagents[r_id] add_reagent(r_id, amt, data) -/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300) +/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, no_react = 0) if(!isnum(amount)) return 1 update_total() @@ -554,7 +548,8 @@ var/const/INGEST = 2 update_total() my_atom.on_reagent_change() R.on_merge(data) - handle_reactions() + if(!no_react) + handle_reactions() return 0 var/datum/reagent/D = chemical_reagents_list[reagent] @@ -570,7 +565,8 @@ var/const/INGEST = 2 update_total() my_atom.on_reagent_change() - handle_reactions() + if(!no_react) + handle_reactions() return 0 else warning("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 1aa72ac0918..625849b8dbc 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -159,7 +159,7 @@ if(archive_diseases[id]) var/datum/disease/advance/A = archive_diseases[id] A.AssignName(new_name) - for(var/datum/disease/advance/AD in disease_master.processing) + for(var/datum/disease/advance/AD in active_diseases) AD.Refresh() updateUsrDialog() @@ -205,7 +205,8 @@ var/list/vir = Blood.data["viruses"] if(vir.len) var/i = 0 - for(var/datum/disease/D in Blood.data["viruses"]) + for(var/thing in Blood.data["viruses"]) + var/datum/disease/D = thing i++ if(!(D.visibility_flags & HIDDEN_PANDEMIC)) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index cdc214c3089..3af09377b21 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -7,7 +7,6 @@ var/list/data = null var/volume = 0 var/metabolization_rate = REAGENTS_METABOLISM - //var/list/viruses = list() var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!) var/shock_reduction = 0 var/heart_rate_increase = 0 diff --git a/code/modules/reagents/chemistry/reagents/admin.dm b/code/modules/reagents/chemistry/reagents/admin.dm index b94998221ef..d4902cfc147 100644 --- a/code/modules/reagents/chemistry/reagents/admin.dm +++ b/code/modules/reagents/chemistry/reagents/admin.dm @@ -46,13 +46,11 @@ M.SetConfused(0) M.SetSleeping(0) M.SetJitter(0) - for(var/datum/disease/D in M.viruses) + for(var/thing in M.viruses) + var/datum/disease/D = thing if(D.severity == NONTHREAT) continue - D.spread_text = "Remissive" - D.stage-- - if(D.stage < 1) - D.cure() + D.cure(0) ..() /datum/reagent/medicine/adminordrazine/nanites diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm index a18f1c01c42..e8f544c6b50 100644 --- a/code/modules/reagents/chemistry/reagents/food.dm +++ b/code/modules/reagents/chemistry/reagents/food.dm @@ -31,11 +31,9 @@ if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients if(prob(50)) M.adjustBruteLoss(-1) - if(H.species.exotic_blood) - H.vessel.add_reagent(H.species.exotic_blood, 0.4) - else - if(!(H.species.flags & NO_BLOOD)) - H.vessel.add_reagent("blood", 0.4) + if(!(NO_BLOOD in H.species.species_traits))//do not restore blood on things with no blood by nature. + if(H.blood_volume < BLOOD_VOLUME_NORMAL) + H.blood_volume += 0.4 ..() /datum/reagent/consumable/nutriment/protein // Meat-based protein, digestable by carnivores and omnivores, worthless to herbivores @@ -65,11 +63,9 @@ M.satiety += 30 if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species.exotic_blood) - H.vessel.add_reagent(H.species.exotic_blood, 0.5) - else - if(!(H.species.flags & NO_BLOOD)) - H.vessel.add_reagent("blood", 0.5) + if(!(NO_BLOOD in H.species.species_traits))//do not restore blood on things with no blood by nature. + if(H.blood_volume < BLOOD_VOLUME_NORMAL) + H.blood_volume += 0.5 ..() /datum/reagent/consumable/sugar diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index 452f9f6d2ff..70dde5764a6 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -210,10 +210,11 @@ if(prob(33)) M.adjustBruteLoss(-2*REAGENTS_EFFECT_MULTIPLIER) M.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER) - if(ishuman(M)) + if(ishuman(M) && prob(33)) var/mob/living/carbon/human/H = M - if(!H.species.exotic_blood && !(H.species.flags & NO_BLOOD) && prob(33)) - H.vessel.add_reagent("blood", 1) + if(!(NO_BLOOD in H.species.species_traits))//do not restore blood on things with no blood by nature. + if(H.blood_volume < BLOOD_VOLUME_NORMAL) + H.blood_volume += 1 ..() /datum/reagent/medicine/synthflesh diff --git a/code/modules/reagents/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm index 241370668e0..76bb9c7fc7b 100644 --- a/code/modules/reagents/chemistry/reagents/misc.dm +++ b/code/modules/reagents/chemistry/reagents/misc.dm @@ -147,8 +147,9 @@ /datum/reagent/iron/on_mob_life(mob/living/M) if(ishuman(M)) var/mob/living/carbon/human/H = M - if(!H.species.exotic_blood && !(H.species.flags & NO_BLOOD)) - H.vessel.add_reagent("blood", 0.8) + if(!H.species.exotic_blood && !(NO_BLOOD in H.species.species_traits)) + if(H.blood_volume < BLOOD_VOLUME_NORMAL) + H.blood_volume += 0.8 ..() //foam @@ -371,10 +372,12 @@ description = "What is this emotion you humans call \"love?\" Oh, it's this? This is it? Huh, well okay then, thanks." reagent_state = LIQUID color = "#FF83A5" + process_flags = ORGANIC | SYNTHETIC // That's the power of love~ /datum/reagent/love/on_mob_life(mob/living/M) - if(M.a_intent == INTENT_HARM) - M.a_intent = INTENT_HELP + if(M.a_intent != INTENT_HELP) + M.a_intent_change(INTENT_HELP) + M.can_change_intents = 0 //Now you have no choice but to be helpful. if(prob(8)) var/lovely_phrase = pick("appreciated", "loved", "pretty good", "really nice", "pretty happy with yourself, even though things haven't always gone as well as they could") @@ -391,9 +394,14 @@ break ..() +/datum/reagent/love/on_mob_delete(mob/living/M) + M.can_change_intents = 1 + ..() + /datum/reagent/love/reaction_mob(mob/living/M, method=TOUCH, volume) to_chat(M, "You feel loved!") + /datum/reagent/royal_bee_jelly name = "royal bee jelly" id = "royal_bee_jelly" diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm index 40d9cb1c481..9d88b9f4498 100644 --- a/code/modules/reagents/chemistry/reagents/toxins.dm +++ b/code/modules/reagents/chemistry/reagents/toxins.dm @@ -221,6 +221,8 @@ if(method == TOUCH) if(ishuman(M)) var/mob/living/carbon/human/H = M + if(H.get_species() == "Grey") + return if(volume > 25) @@ -247,6 +249,8 @@ if(method == INGEST) if(ishuman(M)) var/mob/living/carbon/human/H = M + if(H.get_species() == "Grey") + return if(volume < 10) to_chat(M, "The greenish acidic substance stings you, but isn't concentrated enough to harm you!") @@ -844,6 +848,21 @@ M.AdjustLoseBreath(1) ..() +/datum/reagent/heparin //Based on a real-life anticoagulant. + name = "Heparin" + id = "heparin" + description = "A powerful anticoagulant. Victims will bleed uncontrollably and suffer scaling bruising." + reagent_state = LIQUID + color = "#C8C8C8" //RGB: 200, 200, 200 + metabolization_rate = 0.2 * REAGENTS_METABOLISM + +/datum/reagent/heparin/on_mob_life(mob/living/M) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + H.bleed_rate = min(H.bleed_rate + 2, 8) + H.adjustBruteLoss(1) + ..() + /datum/reagent/sarin name = "Sarin" id = "sarin" @@ -937,7 +956,7 @@ C.adjustToxLoss(lethality) if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species.flags & IS_PLANT) //plantmen take a LOT of damage + if(IS_PLANT in H.species.species_traits) //plantmen take a LOT of damage H.adjustToxLoss(50) ..() else if(istype(M, /mob/living/simple_animal/diona)) //plantmen monkeys (diona) take EVEN MORE damage diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm index 70d2a9f76c0..80c198a92f4 100644 --- a/code/modules/reagents/chemistry/reagents/water.dm +++ b/code/modules/reagents/chemistry/reagents/water.dm @@ -20,10 +20,65 @@ drink_desc = "The father of all refreshments." /datum/reagent/water/reaction_mob(mob/living/M, method=TOUCH, volume) -// Put out fire if(method == TOUCH) + // Put out fire M.adjust_fire_stacks(-(volume / 10)) M.ExtinguishMob() + if(ishuman(M)) + + var/mob/living/carbon/human/H = M + + if(H.get_species() != "Grey") //God this is so gross I hate it. + return + + if(volume > 25) + + if(H.wear_mask) + to_chat(H, "Your mask protects you from the water!") + return + + if(H.head) + to_chat(H, "Your helmet protects you from the water!") + return + + if(!M.unacidable) + if(prob(75)) + var/obj/item/organ/external/affecting = H.get_organ("head") + if(affecting) + affecting.take_damage(5, 10) + H.UpdateDamageIcon() + H.emote("scream") + else + M.take_organ_damage(5,10) + else + M.take_organ_damage(5,10) + + if(method == INGEST) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + + if(H.get_species() != "Grey") + return + + if(volume < 10) + to_chat(M, "The watery solvent substance stings you, but isn't concentrated enough to harm you!") + + if(volume >=10 && volume <=25) + if(!H.unacidable) + M.take_organ_damage(0,min(max(volume-10,2)*2,20)) + M.emote("scream") + + + if(volume > 25) + if(!M.unacidable) + if(prob(75)) + var/obj/item/organ/external/affecting = H.get_organ("head") + if(affecting) + affecting.take_damage(0, 20) + H.UpdateDamageIcon() + H.emote("scream") + else + M.take_organ_damage(0,20) /datum/reagent/water/reaction_turf(turf/simulated/T, volume) if(!istype(T)) @@ -135,13 +190,15 @@ id = "blood" reagent_state = LIQUID color = "#C80000" // rgb: 200, 0, 0 + metabolization_rate = 5 //fast rate so it disappears fast. drink_icon = "glass_red" drink_name = "Glass of Tomato juice" drink_desc = "Are you sure this is tomato juice?" /datum/reagent/blood/reaction_mob(mob/living/M, method=TOUCH, volume) if(data && data["viruses"]) - for(var/datum/disease/D in data["viruses"]) + for(var/thing in data["viruses"]) + var/datum/disease/D = thing if(D.spread_flags & SPECIAL || D.spread_flags & NON_CONTAGIOUS) continue @@ -151,6 +208,14 @@ else //ingest, patch or inject M.ForceContractDisease(D) + if(method == INGEST && iscarbon(M)) + var/mob/living/carbon/C = M + if(C.get_blood_id() == "blood") + if((!data || !(data["blood_type"] in get_safe_blood(C.dna.b_type)))) + C.reagents.add_reagent("toxin", volume * 0.5) + else + C.blood_volume = min(C.blood_volume + round(volume, 0.1), BLOOD_VOLUME_MAXIMUM) + /datum/reagent/blood/on_new(list/data) if(istype(data)) SetViruses(src, data) @@ -179,13 +244,13 @@ preserve += D data["viruses"] = preserve - if(mix_data["blood_colour"]) - color = mix_data["blood_colour"] + if(mix_data["blood_color"]) + color = mix_data["blood_color"] return 1 /datum/reagent/blood/on_update(atom/A) - if(data["blood_colour"]) - color = data["blood_colour"] + if(data["blood_color"]) + color = data["blood_color"] return ..() /datum/reagent/blood/reaction_turf(turf/simulated/T, volume)//splash the blood all over the place @@ -199,22 +264,12 @@ blood_prop = new(T) blood_prop.blood_DNA[data["blood_DNA"]] = data["blood_type"] - for(var/datum/disease/D in data["viruses"]) - var/datum/disease/newVirus = D.Copy(1) - blood_prop.viruses += newVirus - newVirus.holder = blood_prop - else if(istype(data["donor"], /mob/living/carbon/alien)) var/obj/effect/decal/cleanable/blood/xeno/blood_prop = locate() in T if(!blood_prop) blood_prop = new(T) blood_prop.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*" - for(var/datum/disease/D in data["viruses"]) - var/datum/disease/newVirus = D.Copy(1) - blood_prop.viruses += newVirus - newVirus.holder = blood_prop - /datum/reagent/vaccine //data must contain virus type name = "Vaccine" @@ -223,7 +278,8 @@ /datum/reagent/vaccine/reaction_mob(mob/living/M, method=TOUCH, volume) if(islist(data) && (method == INGEST)) - for(var/datum/disease/D in M.viruses) + for(var/thing in M.viruses) + var/datum/disease/D = thing if(D.GetDiseaseID() in data) D.cure() M.resistances |= data diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm index 082e209e18b..fb7672d6806 100644 --- a/code/modules/reagents/chemistry/recipes/toxins.dm +++ b/code/modules/reagents/chemistry/recipes/toxins.dm @@ -154,4 +154,13 @@ result = "mutagen" required_reagents = list("radium" = 1, "plasma" = 1, "chlorine" = 1) result_amount = 3 - mix_message = "The substance turns neon green and bubbles unnervingly." \ No newline at end of file + mix_message = "The substance turns neon green and bubbles unnervingly." + +/datum/chemical_reaction/heparin + name = "Heparin" + id = "Heparin" + result = "heparin" + required_reagents = list("formaldehyde" = 1, "sodium" = 1, "chlorine" = 1, "lithium" = 1) + result_amount = 4 + mix_message = "The mixture thins and loses all color." + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 009828543ce..c379e869768 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -32,7 +32,7 @@ create_reagents(volume) if(spawned_disease) var/datum/disease/F = new spawned_disease(0) - var/list/data = list("viruses" = list(F), "blood_colour" = "#A10808") + var/list/data = list("viruses" = list(F), "blood_color" = "#A10808") reagents.add_reagent("blood", disease_amount, data) if(list_reagents) reagents.add_reagent_list(list_reagents) diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index f60efa3b784..63db086cef8 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -40,7 +40,8 @@ /obj/machinery/biogenerator, /obj/machinery/hydroponics, /obj/machinery/constructable_frame, - /obj/machinery/icemachine) + /obj/machinery/icemachine, + /obj/item/weapon/bombcore/chemical) /obj/item/weapon/reagent_containers/glass/New() ..() diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index ebb13f0830c..e4205ef54d0 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -16,6 +16,7 @@ volume = 15 w_class = WEIGHT_CLASS_TINY sharp = 1 + var/busy = 0 var/mode = SYRINGE_DRAW var/projectile_type = /obj/item/projectile/bullet/dart/syringe @@ -58,13 +59,16 @@ ..() return -/obj/item/weapon/reagent_containers/syringe/afterattack(obj/target, mob/user, proximity) - if(!proximity) return - if(!target.reagents) return +/obj/item/weapon/reagent_containers/syringe/afterattack(atom/target, mob/user , proximity) + if(!proximity) + return + if(!target.reagents) + return + var/mob/living/L if(isliving(target)) - var/mob/living/M = target - if(!M.can_inject(user, 1)) + L = target + if(!L.can_inject(user, 1)) return if(mode == SYRINGE_BROKEN) @@ -75,163 +79,84 @@ if(SYRINGE_DRAW) if(reagents.total_volume >= reagents.maximum_volume) - to_chat(user, "The syringe is full.") + to_chat(user, "The syringe is full.") return - if(ismob(target))//Blood! - if(istype(target, /mob/living/carbon/slime)) - to_chat(user, "You are unable to locate any blood.") - return - if(reagents.has_reagent("blood")) - to_chat(user, "There is already a blood sample in this syringe") - return - if(istype(target, /mob/living/carbon))//maybe just add a blood reagent to all mobs. Then you can suck them dry...With hundreds of syringes. Jolly good idea. - var/mob/living/carbon/T = target - if(!T.dna) - to_chat(usr, "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum)") + if(L) //living mob + var/drawn_amount = reagents.maximum_volume - reagents.total_volume + if(target != user) + target.visible_message("[user] is trying to take a blood sample from [target]!", \ + "[user] is trying to take a blood sample from [target]!") + busy = 1 + if(!do_mob(user, target)) + busy = 0 return - if(NOCLONE in T.mutations) //target done been et, no more blood in him - to_chat(user, "You are unable to locate any blood.") + if(reagents.total_volume >= reagents.maximum_volume) return - - - 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(target == user) - time = 0 - else - for(var/mob/O in viewers(world.view, user)) - O.show_message(text("[] is trying to take a blood sample from []!", user, target), 1) - if(!do_mob(user, target, time)) - return - - var/amount = reagents.maximum_volume - reagents.total_volume - if(amount == 0) - to_chat(usr, "The syringe is full!") - return - - var/datum/reagent/B - if(istype(T,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = T - if(H.species && H.species.exotic_blood && H.vessel.total_volume) - H.vessel.trans_to(src,amount) - else - B = T.take_blood(src,amount) - else - B = T.take_blood(src,amount) - - if(B) - reagents.reagent_list |= B - reagents.update_total() - on_reagent_change() - reagents.handle_reactions() - - to_chat(user, "You take a blood sample from [target]") - for(var/mob/O in viewers(4, user)) - O.show_message("[user] takes a blood sample from [target].", 1) - else - user.visible_message("[user] takes a sample from [target].", "You take a sample from [target].") + busy = 0 + if(L.transfer_blood_to(src, drawn_amount)) + user.visible_message("[user] takes a blood sample from [L].") + else + to_chat(user, "You are unable to draw any blood from [L]!") else //if not mob if(!target.reagents.total_volume) - to_chat(user, "[target] is empty.") + to_chat(user, "[target] is empty!") return if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers) && !istype(target,/obj/item/slime_extract)) - to_chat(user, "You cannot directly remove reagents from this object.") + to_chat(user, "You cannot directly remove reagents from [target]!") return var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares? - to_chat(user, "You fill the syringe with [trans] units of the solution.") + to_chat(user, "You fill [src] with [trans] units of the solution.") if(reagents.total_volume >= reagents.maximum_volume) mode=!mode update_icon() if(SYRINGE_INJECT) if(!reagents.total_volume) - to_chat(user, "The Syringe is empty.") - return - if(istype(target, /obj/item/weapon/implantcase/chem)) + to_chat(user, "[src] is empty.") return if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/clothing/mask/cigarette) && !istype(target, /obj/item/weapon/storage/fancy/cigarettes)) - to_chat(user, "You cannot directly fill this object.") + to_chat(user, "You cannot directly fill [target]!") return - if(istype(target, /obj/item/clothing/mask/cigarette)) - var/obj/item/clothing/mask/cigarette/C = target - if(istype(C.loc, /obj/item/weapon/storage/fancy/cigarettes)) - to_chat(user, "You cannot inject a cigarette while it's still in the pack.") - return if(target.reagents.total_volume >= target.reagents.maximum_volume) - to_chat(user, "[target] is full.") + to_chat(user, "[target] is full.") return - var/mob/living/carbon/human/H = target - if(istype(H)) - var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting) - if(!affected) - to_chat(user, "\The [H] is missing that limb!") - return - /* else if(affected.status & ORGAN_ROBOT) - to_chat(user, "You cannot inject a robotic limb.") - return */ + if(L) //living mob + if(L != user) + L.visible_message("[user] is trying to inject [L]!", \ + "[user] is trying to inject [L]!") + if(!do_mob(user, L)) + return + if(!reagents.total_volume) + return + if(L.reagents.total_volume >= L.reagents.maximum_volume) + return + L.visible_message("[user] injects [L] with the syringe!", \ + "[user] injects [L] with the syringe!") - if(ismob(target) && target != user) - for(var/mob/O in viewers(world.view, user)) - O.show_message(text("[] is trying to inject []!", user, target), 1) + var/list/rinject = list() + for(var/datum/reagent/R in reagents.reagent_list) + rinject += R.name + var/contained = english_list(rinject) - if(!do_mob(user, target, 30)) return - - for(var/mob/O in viewers(world.view, user)) - O.show_message(text("[] injects [] with the syringe!", user, target), 1) - - if(istype(target,/mob/living)) - var/mob/living/M = target - var/list/injected = list() - for(var/datum/reagent/R in reagents.reagent_list) - injected += R.name - var/contained = english_list(injected) - M.create_attack_log("Has been injected with [name] by [key_name(user)]. Reagents: [contained]") - user.create_attack_log("Used the [name] to inject [key_name(M)]. Reagents: [contained]") - if(M.ckey) - msg_admin_attack("[key_name_admin(user)] injected [key_name_admin(M)] with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])") - if(!iscarbon(user)) - M.LAssailant = null - else - M.LAssailant = user - - reagents.reaction(target, INGEST) - if(ismob(target) && target == user) - reagents.reaction(target, INGEST) - - spawn(5) - var/datum/reagent/blood/B - for(var/datum/reagent/blood/d in reagents.reagent_list) - B = d - break - var/trans - if(B && istype(target,/mob/living/carbon)) - var/mob/living/carbon/C = target - C.inject_blood(src, 5) + if(L != user) + add_logs(user, L, "injected", src, addition="which had [contained]") else - trans = reagents.trans_to(target, amount_per_transfer_from_this) - to_chat(user, "You inject [trans] units of the solution. The syringe now contains [reagents.total_volume] units.") - if(istype(target, /obj/item/weapon/reagent_containers/food/pill/patch)) - var/obj/item/weapon/reagent_containers/food/pill/patch/P = target - if(P.instant_application) - to_chat(user, "You break the medical seal on the [P]!") - P.instant_application = 0 + log_attack("[user.name] ([user.ckey]) injected [L.name] ([L.ckey]) with [src.name], which had [contained] (INTENT: [uppertext(user.a_intent)])") - if(reagents.total_volume <= 0 && mode==SYRINGE_INJECT) - mode = SYRINGE_DRAW - update_icon() - - return + var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) + reagents.reaction(L, INGEST, fraction) + reagents.trans_to(target, amount_per_transfer_from_this) + to_chat(user, "You inject [amount_per_transfer_from_this] units of the solution. The syringe now contains [reagents.total_volume] units.") + if (reagents.total_volume <= 0 && mode==SYRINGE_INJECT) + mode = SYRINGE_DRAW + update_icon() /obj/item/weapon/reagent_containers/syringe/update_icon() if(mode == SYRINGE_BROKEN) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 11abc89a343..eb43698d451 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -29,6 +29,7 @@ /obj/structure/reagent_dispensers/proc/boom() visible_message("[src] ruptures!") + chem_splash(loc, 5, list(reagents)) qdel(src) /obj/structure/reagent_dispensers/ex_act(severity) @@ -53,15 +54,6 @@ desc = "A water tank." icon_state = "water" -/obj/structure/reagent_dispensers/watertank/boom() - playsound(loc, 'sound/effects/spray2.ogg', 50, 1, -6) - new /obj/effect/effect/water(loc) - for(var/turf/simulated/T in view(5, loc)) - T.MakeSlippery() - for(var/mob/living/L in T) - L.adjust_fire_stacks(-20) - ..() - /obj/structure/reagent_dispensers/watertank/high name = "high-capacity water tank" desc = "A highly-pressurized water tank made to hold gargantuan amounts of water.." @@ -223,6 +215,34 @@ user.put_in_hands(S) paper_cups-- +/obj/structure/reagent_dispensers/water_cooler/attackby(obj/item/weapon/W, mob/living/user, params) + add_fingerprint(user) + user.changeNext_move(CLICK_CD_MELEE) + if(iswrench(W)) + if(anchored) + playsound(loc, W.usesound, 100, 1) + user.visible_message("[user] starts loosening [src]'s floor casters.", \ + "You start loosening [src]'s floor casters...") + if(do_after(user, 40 * W.toolspeed, target = src)) + if(!loc || !anchored) + return + user.visible_message("[user] loosened [src]'s floor casters.", \ + "You loosen [src]'s floor casters.") + anchored = 0 + else + if(!isfloorturf(loc)) + user.visible_message("A floor must be present to secure [src]!") + return + playsound(loc, W.usesound, 100, 1) + user.visible_message("[user] start securing [src]'s floor casters...", \ + "You start securing [src]'s floor casters...") + if(do_after(user, 40 * W.toolspeed, target = src)) + if(!loc || anchored) + return + user.visible_message("[user] has secured [src]'s floor casters.", \ + "You have secured [src]'s floor casters.") + anchored = 1 + /obj/structure/reagent_dispensers/beerkeg name = "beer keg" desc = "Beer is liquid bread, it's good for you..." @@ -254,4 +274,4 @@ icon_state = "fuel_chem" anchored = 1 density = 0 - accepts_rig = 0 \ No newline at end of file + accepts_rig = 0 diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index fc3baf62556..f0861b2591c 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -377,7 +377,7 @@ found = 1 break if(!found) - to_chat(usr, "\icon[src]The conveyor switch did not detect any linked conveyor belts in range.") + to_chat(usr, "[bicon(src)] The conveyor switch did not detect any linked conveyor belts in range.") return var/obj/machinery/conveyor_switch/NC = new/obj/machinery/conveyor_switch(A, id) transfer_fingerprints_to(NC) diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 73fbb455835..e38ea69f345 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -98,7 +98,7 @@ /obj/structure/disposalconstruct/AltClick(mob/user) if(user.incapacitated()) - to_chat(user << "You can't do that right now!") + to_chat(user, "You can't do that right now!") return if(!Adjacent(user)) return @@ -195,7 +195,7 @@ playsound(src.loc, I.usesound, 100, 1) update() return - + var/obj/structure/disposalpipe/CP = locate() in T if(ptype>=6 && ptype <= 8) // Disposal or outlet if(CP) // There's something there diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 7f47b68d76a..7c572f759c7 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -1129,6 +1129,15 @@ construction_time = 200 category = list("Misc") +/datum/design/ipc_charger + name = "IPC Charger" + id = "ipc_cahrger" + build_type = MECHFAB + build_path = /obj/item/organ/internal/cyberimp/arm/power_cord + materials = list(MAT_METAL=2000, MAT_GLASS=1000) + construction_time = 200 + category = list("Misc") + /datum/design/ipc_optics name = "IPC Optical Sensor" id = "ipc_optics" diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 66c150f636d..2a791e8c61a 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -260,6 +260,28 @@ build_path = /obj/item/organ/internal/cyberimp/eyes/shield category = list("Misc", "Medical") +/datum/design/cyberimp_breather + name = "Breathing Tube Implant" + desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked." + id = "ci-breather" + req_tech = list("materials" = 2, "biotech" = 3) + build_type = PROTOLATHE | MECHFAB + construction_time = 35 + materials = list(MAT_METAL = 600, MAT_GLASS = 250) + build_path = /obj/item/organ/internal/cyberimp/mouth/breathing_tube + category = list("Misc", "Medical") + +/datum/design/cyberimp_toolset + name = "Toolset Arm Implant" + desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm." + id = "ci-toolset" + req_tech = list("materials" = 3, "engineering" = 4, "biotech" = 4, "powerstorage" = 4) + build_type = PROTOLATHE | MECHFAB + materials = list (MAT_METAL = 2500, MAT_GLASS = 1500, MAT_SILVER = 1500) + construction_time = 200 + build_path = /obj/item/organ/internal/cyberimp/arm/toolset + category = list("Misc", "Medical") + /datum/design/cyberimp_medical_hud name = "Medical HUD implant" desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control." diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 9391af77424..09b17748dfd 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -80,6 +80,36 @@ build_path = /obj/item/weapon/grenade/chem_grenade/large category = list("Weapons") +/datum/design/pyro_grenade + name = "Pyro Grenade" + desc = "An advanced grenade that is able to self ignite its mixture." + id = "pyro_Grenade" + req_tech = list("combat" = 4, "engineering" = 4) + build_type = PROTOLATHE + materials = list(MAT_METAL = 2000, MAT_PLASMA = 500) + build_path = /obj/item/weapon/grenade/chem_grenade/pyro + category = list("Weapons") + +/datum/design/cryo_grenade + name = "Cryo Grenade" + desc = "An advanced grenade that rapidly cools its contents upon detonation." + id = "cryo_Grenade" + req_tech = list("combat" = 3, "materials" = 3) + build_type = PROTOLATHE + materials = list(MAT_METAL = 2000, MAT_SILVER = 500) + build_path = /obj/item/weapon/grenade/chem_grenade/cryo + category = list("Weapons") + +/datum/design/adv_grenade + name = "Advanced Release Grenade" + desc = "An advanced grenade that can be detonated several times, best used with a repeating igniter." + id = "adv_Grenade" + req_tech = list("combat" = 3, "engineering" = 4) + build_type = PROTOLATHE + materials = list(MAT_METAL = 3000, MAT_GLASS = 500) + build_path = /obj/item/weapon/grenade/chem_grenade/adv_release + category = list("Weapons") + /datum/design/tele_shield name = "Telescopic Riot Shield" desc = "An advanced riot shield made of lightweight materials that collapses for easy storage." diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm index b1071222b17..f3b82e18ecd 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm @@ -17,14 +17,12 @@ if(affecting && istype(affecting)) affecting.heal_damage(25 * weakness, 25 * weakness) //H:heal_organ_damage(25, 25) - H.vessel.add_reagent("blood",5) + H.blood_volume += 5 H.nutrition += 50 * weakness H.adjustBrainLoss(-25 * weakness) var/radiation = min(H.radiation, 25 * weakness) H.apply_effect(-radiation,IRRADIATE,0) H.bodytemperature = initial(H.bodytemperature) - spawn(1) - H.fixblood() // C.adjustOxyLoss(-25 * weakness) C.adjustToxLoss(-25 * weakness) diff --git a/code/modules/research/xenoarchaeology/finds/finds_misc.dm b/code/modules/research/xenoarchaeology/finds/finds_misc.dm index 0c4f8e8369d..8582575867f 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_misc.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_misc.dm @@ -6,7 +6,6 @@ throwforce = 15.0 icon_state = "plasmalarge" sharp = 1 - edge = 1 /obj/item/weapon/shard/plasma/New() diff --git a/code/modules/research/xenoarchaeology/finds/finds_special.dm b/code/modules/research/xenoarchaeology/finds/finds_special.dm index 5fd432a7a6f..cf0c1cfa273 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_special.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_special.dm @@ -134,7 +134,7 @@ B.target_turf = pick(range(1, src)) B.blood_DNA = list() B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type - M.vessel.remove_reagent("blood",rand(25,50)) + M.blood_volume -= rand(25,50) //animated blood 2 SPOOKY /obj/effect/decal/cleanable/blood/splatter/animated diff --git a/code/modules/spacepods/equipment.dm b/code/modules/spacepods/equipment.dm index d1f78ffdf28..dcdbe564657 100644 --- a/code/modules/spacepods/equipment.dm +++ b/code/modules/spacepods/equipment.dm @@ -104,7 +104,7 @@ /obj/item/device/spacepod_equipment/weaponry/laser name = "laser system" - desc = "A weak laser system for space pods, fires concentrated bursts of energy" + desc = "A weak laser system for space pods, fires concentrated bursts of energy." icon_state = "weapon_laser" projectile_type = /obj/item/projectile/beam shot_cost = 600 @@ -113,7 +113,7 @@ // MINING LASERS /obj/item/device/spacepod_equipment/weaponry/mining_laser_basic name = "weak mining laser system" - desc = "A weak mining laser system for space pods, fires bursts of energy that cut through rock" + desc = "A weak mining laser system for space pods, fires bursts of energy that cut through rock." icon = 'icons/goonstation/pods/ship.dmi' icon_state = "pod_taser" projectile_type = /obj/item/projectile/kinetic/pod @@ -123,7 +123,7 @@ /obj/item/device/spacepod_equipment/weaponry/mining_laser name = "mining laser system" - desc = "A mining laser system for space pods, fires bursts of energy that cut through rock" + desc = "A mining laser system for space pods, fires bursts of energy that cut through rock." icon = 'icons/goonstation/pods/ship.dmi' icon_state = "pod_m_laser" projectile_type = /obj/item/projectile/kinetic/pod/regular @@ -133,7 +133,7 @@ /obj/item/device/spacepod_equipment/weaponry/mining_laser_hyper name = "enhanced mining laser system" - desc = "An enhanced mining laser system for space pods, fires bursts of energy that cut through rock" + desc = "An enhanced mining laser system for space pods, fires bursts of energy that cut through rock." icon = 'icons/goonstation/pods/ship.dmi' icon_state = "pod_w_laser" projectile_type = /obj/item/projectile/kinetic/pod/enhanced @@ -226,15 +226,15 @@ // Passenger Seat /obj/item/device/spacepod_equipment/sec_cargo/chair - name = "passanger seat" - desc = "A passenger seat for a spacepod" + name = "passenger seat" + desc = "A passenger seat for a spacepod." icon_state = "sec_cargo_chair" occupant_mod = 1 // Loot Box /obj/item/device/spacepod_equipment/sec_cargo/loot_box name = "loot box" - desc = "A small compartment to store valuables" + desc = "A small compartment to store valuables." icon_state = "sec_cargo_loot" storage_mod = list("slots" = 7, "w_class" = 14) diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm index c5dcf75c69a..a90bd9bb1d8 100644 --- a/code/modules/spacepods/spacepod.dm +++ b/code/modules/spacepods/spacepod.dm @@ -377,8 +377,7 @@ user.visible_message(user, "[user] is drilling through the [src]'s lock!", "You start drilling through the [src]'s lock!") if(do_after(user, 100 * W.toolspeed, target = src)) - qdel(equipment_system.lock_system) - equipment_system.lock_system = null + QDEL_NULL(equipment_system.lock_system) user.visible_message(user, "[user] has destroyed the [src]'s lock!", "You destroy the [src]'s lock!") else diff --git a/code/modules/store/items.dm b/code/modules/store/items.dm index 4fc51d7fb8d..f660efc0d16 100644 --- a/code/modules/store/items.dm +++ b/code/modules/store/items.dm @@ -83,7 +83,7 @@ /datum/storeitem/minigibber name = "miniature gibber" - desc = "A miniature recreation of NanoTrasen's famous meat grinder." + desc = "A miniature recreation of Nanotrasen's famous meat grinder." typepath = /obj/item/toy/minigibber cost = 400 @@ -96,14 +96,20 @@ /datum/storeitem/violin name = "space violin" desc = "A wooden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\"" - typepath = /obj/item/device/violin + typepath = /obj/item/device/instrument/violin cost = 500 /datum/storeitem/guitar name = "guitar" desc = "It's made of wood and has bronze strings." - typepath = /obj/item/device/guitar - cost = 700 + typepath = /obj/item/device/instrument/guitar + cost = 500 + +/datum/storeitem/eguitar + name = "electric guitar" + desc = "Makes all your shredding needs possible." + typepath = /obj/item/device/instrument/eguitar + cost = 500 /datum/storeitem/baby name = "Toddler" diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/cavity_implant.dm similarity index 53% rename from code/modules/surgery/implant.dm rename to code/modules/surgery/cavity_implant.dm index 498976c4635..bd82e7192ae 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/cavity_implant.dm @@ -1,10 +1,3 @@ -//Procedures in this file: Putting items in body cavity. Implant removal. Items removal. - - -////////////////////////////////////////////////////////////////// -// ITEM PLACEMENT SURGERY // -////////////////////////////////////////////////////////////////// - /datum/surgery/cavity_implant name = "Cavity Implant/Removal" 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, @@ -199,198 +192,15 @@ affected.wounds += I affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1) user.drop_item() - target.internal_organs += tool + affected.hidden = tool tool.forceMove(affected) return 1 else 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) - target.internal_organs -= IC + affected.hidden = null return 1 else to_chat(user, "You don't find anything in [target]'s [target_zone].") - return 0 - - -////////////////////////////////////////////////////////////////// -// IMPLANT/ITEM REMOVAL SURGERY // -////////////////////////////////////////////////////////////////// - -/datum/surgery/cavity_implant_rem - name = "Implant Removal" - steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin,/datum/surgery_step/cavity/implant_removal,/datum/surgery_step/cavity/close_space,/datum/surgery_step/generic/cauterize/) - possible_locs = list("chest")//head is for borers..i can put it elsewhere - -/datum/surgery/cavity_implant_rem/synth - name = "Implant Removal" - steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/cavity/implant_removal,/datum/surgery_step/robotics/external/close_hatch) - possible_locs = list("chest")//head is for borers..i can put it elsewhere - -/datum/surgery/cavity_implant_rem/can_start(mob/user, mob/living/carbon/human/target) - if(!istype(target)) - return 0 - var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) - if(!affected) - return 0 - if(affected.status & ORGAN_ROBOT) - return 0 - return 1 - -/datum/surgery/cavity_implant_rem/synth/can_start(mob/user, mob/living/carbon/human/target) - if(!istype(target)) - return 0 - var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) - if(!affected) - return 0 - if(!(affected.status & ORGAN_ROBOT)) - return 0 - - return 1 - -/datum/surgery_step/cavity/implant_removal - name = "extract implant" - allowed_tools = list( - /obj/item/weapon/hemostat = 100, \ - /obj/item/weapon/wirecutters = 75, \ - /obj/item/weapon/kitchen/utensil/fork = 20 - ) - var/obj/item/weapon/implant/I = null - time = 64 - -/datum/surgery_step/cavity/implant_removal/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - I = locate(/obj/item/weapon/implant) in target - user.visible_message("[user] starts poking around inside [target]'s [affected.name] with \the [tool].", \ - "You start poking around inside [target]'s [affected.name] with \the [tool]." ) - target.custom_pain("The pain in your [affected.name] is living hell!",1) - ..() - -/datum/surgery_step/cavity/implant_removal/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - I = locate(/obj/item/weapon/implant) in target - if(I && (target_zone == "chest")) //implant removal only works on the chest. - user.visible_message("[user] takes something out of [target]'s [affected.name] with \the [tool].", \ - "You take [I] out of [target]'s [affected.name]s with \the [tool]." ) - - I.removed(target) - - var/obj/item/weapon/implantcase/case - - if(istype(user.get_item_by_slot(slot_l_hand), /obj/item/weapon/implantcase)) - case = user.get_item_by_slot(slot_l_hand) - else if(istype(user.get_item_by_slot(slot_r_hand), /obj/item/weapon/implantcase)) - case = user.get_item_by_slot(slot_r_hand) - else - case = locate(/obj/item/weapon/implantcase) in get_turf(target) - - if(case && !case.imp) - case.imp = I - I.loc = case - case.update_icon() - user.visible_message("[user] places [I] into [case]!", "You place [I] into [case].") - else - qdel(I) - return 1 - else - user.visible_message(" [user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out.", \ - "You could not find anything inside [target]'s [affected.name].") - return 1 - -/datum/surgery_step/cavity/implant_removal/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - ..() - var/obj/item/organ/external/chest/affected = target.get_organ(target_zone) - if(affected.implants.len) - var/fail_prob = 10 - fail_prob += 100 - tool_quality(tool) - if(prob(fail_prob)) - var/obj/item/weapon/implant/imp = affected.implants[1] - user.visible_message(" Something beeps inside [target]'s [affected.name]!") - playsound(imp.loc, 'sound/items/countdown.ogg', 75, 1, -3) - spawn(25) - imp.activate() - return 0 - - -////////////////////////////////////////////////////////////////// -// EMBEDDED ITEM REOMOVAL // -////////////////////////////////////////////////////////////////// - -/datum/surgery/embedded_removal - name = "Removal of Embedded Objects" - steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/remove_object, /datum/surgery_step/generic/cauterize) - possible_locs = list("r_arm","l_arm","r_leg","l_leg","r_hand","r_foot","l_hand","l_foot","groin","chest","head") - -/datum/surgery/embedded_removal/synth - steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch, /datum/surgery_step/remove_object, /datum/surgery_step/robotics/external/close_hatch) - possible_locs = list("r_arm","l_arm","r_leg","l_leg","r_hand","r_foot","l_hand","l_foot","groin","chest","head") - - -/datum/surgery/embedded_removal/can_start(mob/user, mob/living/carbon/human/target) - if(!istype(target)) - return 0 - var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) - if(!affected) - return 0 - if(affected.status & ORGAN_ROBOT) - return 0 - return 1 - -/datum/surgery/embedded_removal/synth/can_start(mob/user, mob/living/carbon/human/target) - if(!istype(target)) - return 0 - var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) - if(!affected) - return 0 - if(!(affected.status & ORGAN_ROBOT)) - return 0 - return 1 - -/datum/surgery_step/remove_object - name = "remove embedded objects" - time = 32 - allowed_tools = list( - /obj/item/weapon/scalpel/laser/manager = 100, \ - /obj/item/weapon/hemostat = 100, \ - /obj/item/stack/cable_coil = 75, \ - /obj/item/device/assembly/mousetrap = 20 - ) - var/obj/item/organ/external/L = null - - -/datum/surgery_step/remove_object/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery) - L = target.get_organ(target_zone) - if(L) - user.visible_message("[user] looks for objects embedded in [target]'s [target_zone].", "You look for objects embedded in [target]'s [target_zone]...") - else - user.visible_message("[user] looks for [target]'s [target_zone].", "You look for [target]'s [target_zone]...") - - -/datum/surgery_step/remove_object/end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(L) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - var/objects = 0 - for(var/obj/item/I in L.implants) - if(!istype(I,/obj/item/weapon/implant)) - objects++ - I.forceMove(get_turf(H)) - L.implants -= I - - //Handle possessive brain borers. - if(H.has_brain_worms() && target_zone == "head")//remove worms outside the loop - var/mob/living/simple_animal/borer/worm = H.has_brain_worms() - if(worm.controlling) - target.release_control() - worm.detach() - worm.leave_host() - user.visible_message("a slug like creature wiggles out of [H]'s [target_zone]!") - - if(objects > 0) - user.visible_message("[user] sucessfully removes [objects] objects from [H]'s [L.limb_name]!", "You sucessfully remove [objects] objects from [H]'s [L.limb_name].") - else - to_chat(user, "You find no objects embedded in [H]'s [L.limb_name]!") - else - to_chat(user, "You can't find [target]'s [target_zone], let alone any objects embedded in it!") - - return 1 + return 0 \ No newline at end of file diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm index c17f318e748..28e0be1b046 100644 --- a/code/modules/surgery/face.dm +++ b/code/modules/surgery/face.dm @@ -106,7 +106,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message(" [user]'s hand slips, tearing skin on [target]'s face with \the [tool]!", \ " Your hand slips, tearing skin on [target]'s face with \the [tool]!") - target.apply_damage(10, BRUTE, affected, sharp=1, edge=1) + target.apply_damage(10, BRUTE, affected, sharp = 1) return 0 /datum/surgery_step/face/cauterize diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index 300f6a88918..d87458e3ed9 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -143,7 +143,7 @@ msg = " [user]'s hand slips, damaging several organs [target]'s lower abdomen with \the [tool]" self_msg = " Your hand slips, damaging several organs [target]'s lower abdomen with \the [tool]!" user.visible_message(msg, self_msg) - target.apply_damage(12, BRUTE, affected, sharp=1) + target.apply_damage(12, BRUTE, affected, sharp = 1) return 0 /datum/surgery_step/generic/cauterize @@ -236,7 +236,7 @@ add_logs(user, target, "surgically removed [affected.name] from", addition="INTENT: [uppertext(user.a_intent)]")//log it - var/atom/movable/thing = affected.droplimb(1,DROPLIMB_EDGE) + var/atom/movable/thing = affected.droplimb(1,DROPLIMB_SHARP) if(istype(thing,/obj/item)) user.put_in_hands(thing) return 1 diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm new file mode 100644 index 00000000000..7b04be81e1d --- /dev/null +++ b/code/modules/surgery/implant_removal.dm @@ -0,0 +1,78 @@ +////////////////////////////////////////////////////////////////// +// IMPLANT REMOVAL SURGERY // +////////////////////////////////////////////////////////////////// + +/datum/surgery/implant_removal + name = "Implant Removal" + steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin,/datum/surgery_step/extract_implant,/datum/surgery_step/generic/cauterize) + possible_locs = list("chest") + +/datum/surgery/implant_removal/synth + name = "Implant Removal" + steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/extract_implant,/datum/surgery_step/robotics/external/close_hatch) + possible_locs = list("chest") + +/datum/surgery/implant_removal/can_start(mob/user, mob/living/carbon/human/target) + if(!istype(target)) + return 0 + var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) + if(!affected) + return 0 + if(affected.status & ORGAN_ROBOT) + return 0 + return 1 + +/datum/surgery/implant_removal/synth/can_start(mob/user, mob/living/carbon/human/target) + if(!istype(target)) + return 0 + var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) + if(!affected) + return 0 + if(!(affected.status & ORGAN_ROBOT)) + return 0 + + return 1 + +/datum/surgery_step/extract_implant + name = "extract implant" + allowed_tools = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/crowbar = 65) + time = 64 + var/obj/item/weapon/implant/I = null + +/datum/surgery_step/extract_implant/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + I = locate(/obj/item/weapon/implant) in target + user.visible_message("[user] starts poking around inside [target]'s [affected.name] with \the [tool].", \ + "You start poking around inside [target]'s [affected.name] with \the [tool]." ) + target.custom_pain("The pain in your [affected.name] is living hell!",1) + ..() + +/datum/surgery_step/extract_implant/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + I = locate(/obj/item/weapon/implant) in target + if(I && (target_zone == "chest")) //implant removal only works on the chest. + user.visible_message("[user] takes something out of [target]'s [affected.name] with \the [tool].", \ + "You take [I] out of [target]'s [affected.name]s with \the [tool]." ) + + I.removed(target) + + var/obj/item/weapon/implantcase/case + + if(istype(user.get_item_by_slot(slot_l_hand), /obj/item/weapon/implantcase)) + case = user.get_item_by_slot(slot_l_hand) + else if(istype(user.get_item_by_slot(slot_r_hand), /obj/item/weapon/implantcase)) + case = user.get_item_by_slot(slot_r_hand) + else + case = locate(/obj/item/weapon/implantcase) in get_turf(target) + + if(case && !case.imp) + case.imp = I + I.forceMove(case) + case.update_icon() + user.visible_message("[user] places [I] into [case]!", "You place [I] into [case].") + else + qdel(I) + else + user.visible_message(" [user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out.", \ + "You could not find anything inside [target]'s [affected.name].") + return 1 \ No newline at end of file diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm new file mode 100644 index 00000000000..773508c88ea --- /dev/null +++ b/code/modules/surgery/limb_augmentation.dm @@ -0,0 +1,58 @@ +/datum/surgery/limb_augmentation + name = "Augment Limb" + steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/augment) + possible_locs = list("chest","l_arm","r_arm","r_leg","l_leg") + +/datum/surgery/limb_augmentation/can_start(mob/user, mob/living/carbon/target) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting) + if(!affected) + return 0 + if(affected.status & ORGAN_BROKEN) //The arm has to be in prime condition to augment it. + return 0 + if(affected.status & ORGAN_ROBOT) + return 0 + return 1 + +/datum/surgery_step/augment + name = "augment limb with robotic part" + allowed_tools = list(/obj/item/robot_parts = 100) + time = 32 + +/datum/surgery_step/augment/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/robot_parts/p = tool + if(p.part) + if(!(target_zone in p.part)) + to_chat(user, "[tool] cannot be used to augment this limb!") + return 0 + return 1 + +/datum/surgery_step/augment/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] starts augmenting [affected] with [tool].", "You start augmenting [affected] with [tool].") + +/datum/surgery_step/augment/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/robot_parts/L = tool + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] has finished augmenting [affected] with [tool].", \ + "You augment [affected] with [tool].") + + if(L.part) + for(var/part_name in L.part) + if(!target.get_organ(part_name)) + continue + affected.robotize(L.model_info, make_tough = 1, convert_all = 0) + if(L.sabotaged) + affected.sabotaged = 1 + break + target.update_body() + target.updatehealth() + target.UpdateDamageIcon() + + qdel(tool) + + affected.open = 0 + affected.germ_level = 0 + affected.status &= ~ORGAN_BLEEDING + return 1 \ No newline at end of file diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm index 667f5c02a96..8b2d2507041 100644 --- a/code/modules/surgery/limb_reattach.dm +++ b/code/modules/surgery/limb_reattach.dm @@ -126,7 +126,7 @@ var/obj/item/organ/external/E = tool user.visible_message("[user]'s hand slips, damaging [target]'s [E.amputation_point]!", \ "Your hand slips, damaging [target]'s [E.amputation_point]!") - target.apply_damage(10, BRUTE, null, sharp=1) + target.apply_damage(10, BRUTE, null, sharp = 1) return 0 @@ -213,7 +213,7 @@ var/obj/item/organ/external/E = target.get_organ(target_zone) user.visible_message("[user]'s hand slips, damaging [target]'s [E.amputation_point]!", \ "Your hand slips, damaging [target]'s [E.amputation_point]!") - target.apply_damage(10, BRUTE, null, sharp=1) + target.apply_damage(10, BRUTE, null, sharp = 1) return 0 /datum/surgery_step/limb/mechanize @@ -271,5 +271,5 @@ /datum/surgery_step/limb/mechanize/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("[user]'s hand slips, damaging [target]'s flesh!", \ "Your hand slips, damaging [target]'s flesh!") - target.apply_damage(10, BRUTE, null, sharp=1) + target.apply_damage(10, BRUTE, null, sharp = 1) return 0 diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm new file mode 100644 index 00000000000..4b62e42cb8a --- /dev/null +++ b/code/modules/surgery/organs/augments_arms.dm @@ -0,0 +1,315 @@ +/obj/item/organ/internal/cyberimp/arm + name = "arm-mounted implant" + desc = "You shouldn't see this! Adminhelp and report this as an issue on github!" + parent_organ = "r_arm" + slot = "r_arm_device" + icon_state = "implant-toolkit" + w_class = WEIGHT_CLASS_NORMAL + actions_types = list(/datum/action/item_action/organ_action/toggle) + + var/list/items_list = list() + // Used to store a list of all items inside, for multi-item implants. + // I would use contents, but they shuffle on every activation/deactivation leading to interface inconsistencies. + + var/obj/item/holder = null + // You can use this var for item path, it would be converted into an item on New() + +/obj/item/organ/internal/cyberimp/arm/New() + ..() + if(ispath(holder)) + holder = new holder(src) + + update_icon() + slot = parent_organ + "_device" + items_list = contents.Copy() + +/obj/item/organ/internal/cyberimp/arm/update_icon() + if(parent_organ == "r_arm") + transform = null + else // Mirroring the icon + transform = matrix(-1, 0, 0, 0, 1, 0) + +/obj/item/organ/internal/cyberimp/arm/examine(mob/user) + ..() + to_chat(user, "[src] is assembled in the [parent_organ == "r_arm" ? "right" : "left"] arm configuration. You can use a screwdriver to reassemble it.") + +/obj/item/organ/internal/cyberimp/arm/attackby(obj/item/weapon/W, mob/user, params) + ..() + if(isscrewdriver(W)) + if(parent_organ == "r_arm") + parent_organ = "l_arm" + else + parent_organ = "r_arm" + slot = parent_organ + "_device" + to_chat(user, "You modify [src] to be installed on the [parent_organ == "r_arm" ? "right" : "left"] arm.") + update_icon() + else if(istype(W, /obj/item/weapon/card/emag)) + emag_act() + +/obj/item/organ/internal/cyberimp/arm/remove(mob/living/carbon/M, special = 0) + Retract() + . = ..() + +/obj/item/organ/internal/cyberimp/arm/emag_act() + return 0 + +/obj/item/organ/internal/cyberimp/arm/gun/emp_act(severity) + if(prob(15/severity) && owner) + to_chat(owner, "[src] is hit by EMP!") + // give the owner an idea about why his implant is glitching + Retract() + ..() + +/obj/item/organ/internal/cyberimp/arm/proc/Retract() + if(!holder || (holder in src)) + return + + owner.visible_message("[owner] retracts [holder] back into \his [parent_organ == "r_arm" ? "right" : "left"] arm.", + "[holder] snaps back into your [parent_organ == "r_arm" ? "right" : "left"] arm.", + "You hear a short mechanical noise.") + + if(istype(holder, /obj/item/device/flash/armimplant)) + var/obj/item/device/flash/F = holder + F.set_light(0) + + owner.unEquip(holder, 1) + holder.forceMove(src) + holder = null + playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1) + +/obj/item/organ/internal/cyberimp/arm/proc/Extend(var/obj/item/item) + if(!(item in src)) + return + + + holder = item + + holder.flags |= NODROP + holder.unacidable = 1 + holder.slot_flags = null + holder.w_class = WEIGHT_CLASS_HUGE + holder.materials = null + + if(istype(holder, /obj/item/device/flash/armimplant)) + var/obj/item/device/flash/F = holder + F.set_light(7) + + var/arm_slot = (parent_organ == "r_arm" ? slot_r_hand : slot_l_hand) + var/obj/item/arm_item = owner.get_item_by_slot(arm_slot) + + if(arm_item) + if(!owner.unEquip(arm_item)) + to_chat(owner, "Your [arm_item] interferes with [src]!") + return + else + to_chat(owner, "You drop [arm_item] to activate [src]!") + + if(parent_organ == "r_arm" ? !owner.put_in_r_hand(holder) : !owner.put_in_l_hand(holder)) + to_chat(owner, "Your [src] fails to activate!") + return + + // Activate the hand that now holds our item. + if(parent_organ == "r_arm" ? owner.hand : !owner.hand) + owner.swap_hand() + + owner.visible_message("[owner] extends [holder] from \his [parent_organ == "r_arm" ? "right" : "left"] arm.", + "You extend [holder] from your [parent_organ == "r_arm" ? "right" : "left"] arm.", + "You hear a short mechanical noise.") + playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1) + +/obj/item/organ/internal/cyberimp/arm/ui_action_click() + if(crit_fail || (!holder && !contents.len)) + to_chat(owner, "The implant doesn't respond. It seems to be broken...") + return + + // You can emag the arm-mounted implant by activating it while holding emag in it's hand. + var/arm_slot = (parent_organ == "r_arm" ? slot_r_hand : slot_l_hand) + if(istype(owner.get_item_by_slot(arm_slot), /obj/item/weapon/card/emag) && emag_act()) + return + + if(!holder || (holder in src)) + holder = null + if(contents.len == 1) + Extend(contents[1]) + else // TODO: make it similar to borg's storage-like module selection + var/obj/item/choise = input("Activate which item?", "Arm Implant", null, null) as null|anything in items_list + if(owner && owner == usr && owner.stat != DEAD && (src in owner.internal_organs) && !holder && istype(choise) && (choise in contents)) + // This monster sanity check is a nice example of how bad input() is. + Extend(choise) + else + Retract() + + +/obj/item/organ/internal/cyberimp/arm/gun/emp_act(severity) + if(prob(30/severity) && owner && !crit_fail) + Retract() + owner.visible_message("A loud bang comes from [owner]\'s [parent_organ == "r_arm" ? "right" : "left"] arm!") + playsound(get_turf(owner), 'sound/weapons/flashbang.ogg', 100, 1) + to_chat(owner, "You feel an explosion erupt inside your [parent_organ == "r_arm" ? "right" : "left"] arm as your implant breaks!") + owner.adjust_fire_stacks(20) + owner.IgniteMob() + owner.adjustFireLoss(25) + crit_fail = 1 + else // The gun will still discharge anyway. + ..() + + +/obj/item/organ/internal/cyberimp/arm/gun/laser + name = "arm-mounted laser implant" + desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arm and remains inside when not in use." + icon_state = "arm_laser" + origin_tech = "materials=4;combat=4;biotech=4;powerstorage=4;syndicate=3" + contents = newlist(/obj/item/weapon/gun/energy/laser/mounted) + +/obj/item/organ/internal/cyberimp/arm/gun/laser/l + parent_organ = "l_arm" + + +/obj/item/organ/internal/cyberimp/arm/gun/taser + name = "arm-mounted taser implant" + desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arm and remains inside when not in use." + icon_state = "arm_taser" + origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4" + contents = newlist(/obj/item/weapon/gun/energy/gun/advtaser/mounted) + +/obj/item/organ/internal/cyberimp/arm/gun/taser/l + parent_organ = "l_arm" + + +/obj/item/organ/internal/cyberimp/arm/toolset + name = "integrated toolset implant" + desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm. Contains all neccessary tools." + origin_tech = "materials=3;engineering=4;biotech=3;powerstorage=4" + contents = newlist(/obj/item/weapon/screwdriver/cyborg, /obj/item/weapon/wrench/cyborg, /obj/item/weapon/weldingtool/largetank/cyborg, + /obj/item/weapon/crowbar/cyborg, /obj/item/weapon/wirecutters/cyborg, /obj/item/device/multitool/cyborg) + +/obj/item/organ/internal/cyberimp/arm/toolset/l + parent_organ = "l_arm" + +/obj/item/organ/internal/cyberimp/arm/toolset/emag_act() + if(!(locate(/obj/item/weapon/kitchen/knife/combat/cyborg) in items_list)) + to_chat(usr, "You unlock [src]'s integrated knife!") + items_list += new /obj/item/weapon/kitchen/knife/combat/cyborg(src) + return 1 + return 0 + +/obj/item/organ/internal/cyberimp/arm/esword + name = "arm-mounted energy blade" + desc = "An illegal, and highly dangerous cybernetic implant that can project a deadly blade of concentrated enregy." + contents = newlist(/obj/item/weapon/melee/energy/blade/hardlight) + origin_tech = "materials=4;combat=5;biotech=3;powerstorage=2;syndicate=5" + +/obj/item/organ/internal/cyberimp/arm/medibeam + name = "integrated medical beamgun" + desc = "A cybernetic implant that allows the user to project a healing beam from their hand." + contents = newlist(/obj/item/weapon/gun/medbeam) + origin_tech = "materials=5;combat=2;biotech=5;powerstorage=4;syndicate=1" + +/obj/item/organ/internal/cyberimp/arm/flash + name = "integrated high-intensity photon projector" //Why not + desc = "An integrated projector mounted onto a user's arm, that is able to be used as a powerful flash." + contents = newlist(/obj/item/device/flash/armimplant) + origin_tech = "materials=4;combat=3;biotech=4;magnets=4;powerstorage=3" + +/obj/item/organ/internal/cyberimp/arm/flash/New() + ..() + if(locate(/obj/item/device/flash/armimplant) in items_list) + var/obj/item/device/flash/armimplant/F = locate(/obj/item/device/flash/armimplant) in items_list + F.I = src + +/obj/item/organ/internal/cyberimp/arm/baton + name = "arm electrification implant" + desc = "An illegal combat implant that allows the user to administer disabling shocks from their arm." + contents = newlist(/obj/item/borg/stun) + origin_tech = "materials=3;combat=5;biotech=4;powerstorage=4;syndicate=3" + +/obj/item/organ/internal/cyberimp/arm/combat + name = "combat cybernetics implant" + desc = "A powerful cybernetic implant that contains combat modules built into the user's arm" + contents = newlist(/obj/item/weapon/melee/energy/blade/hardlight, /obj/item/weapon/gun/medbeam, /obj/item/borg/stun, /obj/item/device/flash/armimplant) + origin_tech = "materials=5;combat=7;biotech=5;powerstorage=5;syndicate=6;programming=5" + +/obj/item/organ/internal/cyberimp/arm/combat/New() + ..() + if(locate(/obj/item/device/flash/armimplant) in items_list) + var/obj/item/device/flash/armimplant/F = locate(/obj/item/device/flash/armimplant) in items_list + F.I = src + +/obj/item/organ/internal/cyberimp/arm/surgery + name = "surgical toolset implant" + desc = "A set of surgical tools hidden behind a concealed panel on the user's arm" + contents = newlist(/obj/item/weapon/retractor, /obj/item/weapon/hemostat, /obj/item/weapon/cautery, /obj/item/weapon/surgicaldrill, /obj/item/weapon/scalpel, /obj/item/weapon/circular_saw, /obj/item/weapon/bonegel, /obj/item/weapon/FixOVein, /obj/item/weapon/bonesetter) + origin_tech = "materials=3;engineering=3;biotech=3;programming=2;magnets=3" + +// lets make IPCs even *more* vulnerable to EMPs! +/obj/item/organ/internal/cyberimp/arm/power_cord + name = "APC-compatible power adapter implant" + desc = "An implant commonly installed inside IPCs in order to allow them to easily collect energy from their environment" + origin_tech = "materials=3;biotech=2;powerstorage=3" + contents = newlist(/obj/item/apc_powercord) + +/obj/item/organ/internal/cyberimp/arm/power_cord/emp_act(severity) + // To allow repair via nanopaste/screwdriver + // also so IPCs don't also catch on fire and fall even more apart upon EMP + damage = 1 + crit_fail = TRUE + +/obj/item/organ/internal/cyberimp/arm/power_cord/surgeryize() + if(crit_fail && owner) + to_chat(owner, "Your [src] feels functional again.") + crit_fail = FALSE + + +/obj/item/apc_powercord + name = "power cable" + desc = "Insert into a nearby APC to draw power from it." + icon = 'icons/obj/power.dmi' + icon_state = "wire1" + flags = NOBLUDGEON + +/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(!istype(target, /obj/machinery/power/apc) || !ishuman(user) || !proximity_flag) + return ..() + user.changeNext_move(CLICK_CD_MELEE) + var/obj/machinery/power/apc/A = target + var/mob/living/carbon/human/H = user + if(H.get_int_organ(/obj/item/organ/internal/cell)) + if(A.emagged || A.stat & BROKEN) + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread + s.set_up(3, 1, A) + s.start() + to_chat(H, "The APC power currents surge erratically, damaging your chassis!") + H.adjustFireLoss(10,0) + else if(A.cell && A.cell.charge > 0) + if(H.nutrition >= NUTRITION_LEVEL_WELL_FED) + to_chat(user, "You are already fully charged!") + else + addtimer(src, "powerdraw_loop", 0, TRUE, A, H) + else + to_chat(user, "There is no charge to draw from that APC.") + else + to_chat(user, "You lack a cell in which to store charge!") + +/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/A, mob/living/carbon/human/H) + H.visible_message("[H] inserts a power connector into \the [A].", "You begin to draw power from \the [A].") + while(do_after(H, 10, target = A)) + if(loc != H) + to_chat(H, "You must keep your connector out while charging!") + break + if(A.cell.charge == 0) + to_chat(H, "\The [A] has no more charge.") + break + A.charging = 1 + if(A.cell.charge >= 500) + H.nutrition += 50 + A.cell.charge -= 500 + to_chat(H, "You siphon off some of the stored charge for your own use.") + else + H.nutrition += A.cell.charge/10 + A.cell.charge = 0 + to_chat(H, "You siphon off the last of \the [A]'s charge.") + break + if(H.nutrition > NUTRITION_LEVEL_WELL_FED) + to_chat(H, "You are now fully charged.") + break + H.visible_message("[H] unplugs from \the [A].", "You unplug from \the [A].") \ No newline at end of file diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 4a7aa2554fc..0a99a9b9e5a 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -144,6 +144,24 @@ spawn(90 / severity) crit_fail = 0 + +//[[[[MOUTH]]]] +/obj/item/organ/internal/cyberimp/mouth + parent_organ = "mouth" + +/obj/item/organ/internal/cyberimp/mouth/breathing_tube + name = "breathing tube implant" + desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked." + icon_state = "implant_mask" + slot = "breathing_tube" + w_class = WEIGHT_CLASS_TINY + origin_tech = "materials=2;biotech=3" + +/obj/item/organ/internal/cyberimp/mouth/breathing_tube/emp_act(severity) + if(prob(60/severity) && owner) + to_chat(owner, "Your breathing tube suddenly closes!") + owner.AdjustLoseBreath(2) + /obj/item/organ/internal/cyberimp/brain/clown_voice name = "Comical implant" desc = "Uh oh." @@ -255,175 +273,6 @@ if(H.stat == CONSCIOUS) to_chat(H, "You feel your heart beating again!") -//ARM...THAT GO IN THE CHEST -/obj/item/organ/internal/cyberimp/chest/arm_mod//dummy parent item for making arm-mod implants. works best with nodrop items that are sent to nullspace upon being dropped. - name = "Arm-mounted item implant" - desc = "You shouldn't see this! Adminhelp and report this as an issue on github!" - icon_state = "chest_implant" - implant_color = "#007ACC" - slot = "shoulders" - origin_tech = "materials=5;biotech=4;powerstorage=4" - actions_types = list(/datum/action/item_action/organ_action/toggle) - var/obj/holder//is defined as the retractable item itself. ensure this is defined somewhere! - var/out = 0//determines if the item is in the owner's hand or not - var/overloaded = 0//is set to 1 when owner gets EMPed. if set to 1, implant doesn't work. - var/lasthand = null - -/obj/item/organ/internal/cyberimp/chest/arm_mod/ui_action_click() - toggle_item() - -/obj/item/organ/internal/cyberimp/chest/arm_mod/proc/toggle_item() - if(overloaded)//ensure the implant isn't broken - to_chat(owner, "The implant doesn't respond. It seems to be broken...") - return - owner.changeNext_move(CLICK_CD_MELEE) - if(owner.next_move < world.time) - return // No spam - if(out)//check if the owner has the item out already - owner.unEquip(holder, 1)//if he does, take it away. then, - holder.loc = null//stash it in nullspace - out = 0//and set this to clarify the item isn't out. - owner.visible_message("[owner] retracts [holder].","You retract [holder].") - playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1) - else//if he doesn't have the item out - if(owner.put_in_hands(holder))//put it in his hands. - lasthand = owner.get_active_hand() - out = 1 - owner.visible_message("[owner] extends [holder]!","You extend [holder]!") - playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1) - else//if this fails to put the item in his hands, - holder.loc = null//keep it in nullspace - to_chat(owner, "You can't extend [holder] if you can't use your hands!") - -/obj/item/organ/internal/cyberimp/chest/arm_mod/emp_act(severity)//if the implant gets EMPed... - if(!owner || overloaded)//ensure that it's in an owner and that it's not already EMPed, then... - return - if(out)//check if he has the item out... - owner.unEquip(holder, 1)//if he does, take it away. - holder.loc = null - out = 0 - owner.visible_message("[holder] forcibly retracts into [owner]'s arm.") - overload() // Make sure this doesn't happen again - -/obj/item/organ/internal/cyberimp/chest/arm_mod/proc/overload() - owner.visible_message("A loud bang comes from [owner]...") - playsound(get_turf(owner), 'sound/effects/bang.ogg', 100, 1) - to_chat(owner, "You feel an explosion erupt inside you as your chest implant breaks. Is it hot in here?") - owner.adjust_fire_stacks(20) - owner.IgniteMob()//ignite the owner, as well as - owner.say("AUUUUUUUUUUUUUUUUUUGH!!") - if(prob(50)) - if(lasthand == "r_hand") - var/obj/item/organ/external/limb = owner.get_organ("r_arm") - limb.droplimb(0, DROPLIMB_EDGE) - else if(lasthand == "l_hand") - var/obj/item/organ/external/limb = owner.get_organ("l_arm") - limb.droplimb(0, DROPLIMB_EDGE) - owner.say("I HAVE BEEN DISARMED!!!") - owner.adjustFireLoss(25)//severely injure him! - overloaded = TRUE - -/obj/item/organ/internal/cyberimp/chest/arm_mod/tase//mounted, self-charging taser! - name = "Arm-cannon taser implant" - desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arms and remains in the shoulders when not in use." - icon_state = "armcannon_tase_implant" - origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4" - actions_types = list(/datum/action/item_action/organ_action/toggle) - -/obj/item/organ/internal/cyberimp/chest/arm_mod/tase/New()//when the implant is created... - ..() - holder = new /obj/item/weapon/gun/energy/gun/advtaser/mounted(src)//assign a brand new item to it. (in this case, a gun) - -/obj/item/organ/internal/cyberimp/chest/arm_mod/lase//mounted, self-charging laser! - name = "Arm-cannon laser implant" - desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arms and remains in the shoulders when not in use." - icon_state = "armcannon_lase_implant" - origin_tech = "materials=4;combat=4;biotech=4;powerstorage=4;syndicate=3" - actions_types = list(/datum/action/item_action/organ_action/toggle) - -/obj/item/organ/internal/cyberimp/chest/arm_mod/lase/New() - ..() - holder = new /obj/item/weapon/gun/energy/laser/mounted(src) - -// lets make IPCs even *more* vulnerable to EMPs! -/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord - name = "APC-compatible power adapter implant" - desc = "An implant commonly installed inside IPCs in order to allow them to easily collect energy from their environment" - origin_tech = "materials=3;biotech=2;powerstorage=3" - slot = "shoulders2" - actions_types = list(/datum/action/item_action/organ_action/toggle) - - -/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord/New() - ..() - holder = new /obj/item/apc_powercord(src) - -/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord/overload() - // To allow repair via nanopaste/screwdriver - // also so IPCs don't also catch on fire and fall even more apart upon EMP - damage = 1 - overloaded = TRUE - -/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord/surgeryize() - if(overloaded && owner) - to_chat(owner, "Your [src] feels functional again.") - overloaded = FALSE - - -/obj/item/apc_powercord - name = "power cable" - desc = "Insert into a nearby APC to draw power from it." - icon = 'icons/obj/power.dmi' - icon_state = "wire1" - flags = NODROP | NOBLUDGEON - -/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(!istype(target, /obj/machinery/power/apc) || !ishuman(user) || !proximity_flag) - return ..() - user.changeNext_move(CLICK_CD_MELEE) - var/obj/machinery/power/apc/A = target - var/mob/living/carbon/human/H = user - if(H.get_int_organ(/obj/item/organ/internal/cell)) - if(A.emagged || A.stat & BROKEN) - var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread - s.set_up(3, 1, A) - s.start() - to_chat(H, "The APC power currents surge erratically, damaging your chassis!") - H.adjustFireLoss(10,0) - else if(A.cell && A.cell.charge > 0) - if(H.nutrition >= NUTRITION_LEVEL_WELL_FED) - to_chat(user, "You are already fully charged!") - else - addtimer(src, "powerdraw_loop", 0, TRUE, A, H) - else - to_chat(user, "There is no charge to draw from that APC.") - else - to_chat(user, "You lack a cell in which to store charge!") - -/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/A, mob/living/carbon/human/H) - H.visible_message("[H] inserts a power connector into \the [A].", "You begin to draw power from \the [A].") - while(do_after(H, 10, target = A)) - if(loc != H) - to_chat(H, "You must keep your connector out while charging!") - break - if(A.cell.charge == 0) - to_chat(H, "\The [A] has no more charge.") - break - A.charging = 1 - if(A.cell.charge >= 500) - H.nutrition += 50 - A.cell.charge -= 500 - to_chat(H, "You siphon off some of the stored charge for your own use.") - else - H.nutrition += A.cell.charge/10 - A.cell.charge = 0 - to_chat(H, "You siphon off the last of \the [A]'s charge.") - break - if(H.nutrition > NUTRITION_LEVEL_WELL_FED) - to_chat(H, "You are now fully charged.") - break - H.visible_message("[H] unplugs from \the [A].", "You unplug from \the [A].") - //BOX O' IMPLANTS /obj/item/weapon/storage/box/cyber_implants diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index 9eefe264524..2cd9d9ff632 100644 --- a/code/modules/surgery/organs/blood.dm +++ b/code/modules/surgery/organs/blood.dm @@ -2,379 +2,283 @@ BLOOD SYSTEM ****************************************************/ -/mob/living/carbon/human/var/datum/reagents/vessel //Container for blood and BLOOD ONLY. Do not transfer other chems here. - -//Initializes blood vessels -/mob/living/carbon/human/proc/make_blood() - - if(vessel) +/mob/living/carbon/human/proc/suppress_bloodloss(amount) + if(bleedsuppress) return - - vessel = new/datum/reagents(max_blood) - vessel.my_atom = src - - if(species && species.exotic_blood) - vessel.add_reagent(species.exotic_blood, max_blood) else - vessel.add_reagent("blood", max_blood) - for(var/datum/reagent/blood/B in vessel.reagent_list) - if(B.id == "blood") - B.data = list( - "donor" = src, - "viruses" = null, - "blood_DNA" = dna.unique_enzymes, - "blood_colour" = species.blood_color, - "blood_type" = b_type, - "resistances" = null, - "trace_chem" = null) - spawn(1) - fixblood() + bleedsuppress = TRUE + addtimer(src, "resume_bleeding", amount) -//Resets blood data -/mob/living/carbon/human/proc/fixblood() - for(var/datum/reagent/blood/B in vessel.reagent_list) - if(B.id == "blood") - B.data = list( - "donor" = src, - "viruses" = null, - "blood_DNA" = dna.unique_enzymes, - "blood_colour" = species.blood_color, - "blood_type" = b_type, - "resistances" = null, - "trace_chem" = null) +/mob/living/carbon/human/proc/resume_bleeding() + bleedsuppress = FALSE + if(stat != DEAD && bleed_rate) + to_chat(src, "The blood soaks through your bandage.") // Takes care blood loss and regeneration -/mob/living/carbon/human/proc/handle_blood() - var/blood_volume - if(species && species.flags & NO_BLOOD) +/mob/living/carbon/human/handle_blood() + var/list/blood_data = get_blood_data(get_blood_id())//PROCCEPTION + + if(in_stasis) return - if(stat != DEAD && bodytemperature >= 170) //Dead or cryosleep people do not pump the blood. - if(species.exotic_blood) - var/blood_reagent = species.exotic_blood // This is a string of the name of the species' blood reagent - blood_volume = round(vessel.get_reagent_amount(blood_reagent)) - if(blood_volume < max_blood && blood_volume) - vessel.add_reagent(blood_reagent, 0.1) // regenerate blood VERY slowly - if(reagents.has_reagent(blood_reagent)) - vessel.add_reagent(blood_reagent, 0.4) - else - blood_volume = round(vessel.get_reagent_amount("blood")) - //Blood regeneration if there is some space - if(blood_volume < max_blood && blood_volume) - var/datum/reagent/blood/B = locate() in vessel.reagent_list //Grab some blood - if(B) // Make sure there's some blood at all - if(mind) //Handles vampires "eating" blood that isn't their own. - if(mind in ticker.mode.vampires) - for(var/datum/reagent/blood/BL in vessel.reagent_list) - if(nutrition >= NUTRITION_LEVEL_WELL_FED) - break //We don't want blood tranfusions making vampires fat. - if(BL.data["donor"] != src) - nutrition += (15 * REAGENTS_METABOLISM) - BL.volume -= REAGENTS_METABOLISM - if(BL.volume <= 0) - qdel(BL) - break //Only process one blood per tick, to maintain the same metabolism as nutriment for non-vampires. + if(NO_BLOOD in species.species_traits) + bleed_rate = 0 + return - if(B.data["donor"] != src) //If it's not theirs, then we look for theirs - for(var/datum/reagent/blood/D in vessel.reagent_list) - if(D.data["donor"] == src) - B = D - break + if(bodytemperature >= 225 && !(NOCLONE in mutations)) //cryosleep or husked people do not pump the blood. - vessel.add_reagent("blood", 0.1) // regenerate blood VERY slowly + //Blood regeneration if there is some space + if(blood_volume < max_blood && blood_volume) + if(mind) //Handles vampires "eating" blood that isn't their own. + if(mind in ticker.mode.vampires) + if(nutrition >= NUTRITION_LEVEL_WELL_FED) + return //We don't want blood tranfusions making vampires fat. + if(blood_data["donor"] != src) + nutrition += (15 * REAGENTS_METABOLISM) + return //Only process one blood per tick, to maintain the same metabolism as nutriment for non-vampires. + if(blood_volume < BLOOD_VOLUME_NORMAL) + blood_volume += 0.1 // regenerate blood VERY slowly //Effects of bloodloss - var/oxy_immune = species.flags & NO_BREATHE //Some species have blood, but don't breathe; they should still suffer the effects of bloodloss. - + var/word = pick("dizzy","woozy","faint") switch(blood_volume) if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) if(prob(5)) - to_chat(src, "You feel [pick("dizzy","woozy","faint")].") - if(oxy_immune) - adjustToxLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1)) - else - adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1)) + to_chat(src, "You feel [word].") + apply_damage_type(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1), species.blood_damage_type) if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY) - if(oxy_immune) - adjustToxLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1)) - else - adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1)) + apply_damage_type(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1), species.blood_damage_type) if(prob(5)) EyeBlurry(6) - var/word = pick("dizzy","woozy","faint") to_chat(src, "You feel very [word].") if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD) - if(oxy_immune) - adjustToxLoss(5) - else - adjustOxyLoss(5) + apply_damage_type(5, species.blood_damage_type) if(prob(15)) Paralyse(rand(1,3)) - var/word = pick("dizzy","woozy","faint") to_chat(src, "You feel extremely [word].") if(0 to BLOOD_VOLUME_SURVIVE) death() + var/temp_bleed = 0 //Bleeding out - var/blood_max = 0 - for(var/obj/item/organ/external/temp in bodyparts) - if(!(temp.status & ORGAN_BLEEDING) || temp.status & ORGAN_ROBOT) + for(var/X in bodyparts) + var/obj/item/organ/external/BP = X + var/brutedamage = BP.brute_dam + + if(BP.status & ORGAN_ROBOT) continue - for(var/datum/wound/W in temp.wounds) - if(W.bleeding()) - blood_max += W.damage / 4 - if(temp.open) - blood_max += 2 //Yer stomach is cut open - drip(blood_max) -//Makes a blood drop, leaking certain amount of blood from the mob -/mob/living/carbon/human/proc/drip(var/amt as num) + //We want an accurate reading of .len + listclearnulls(BP.embedded_objects) + temp_bleed += 0.5*BP.embedded_objects.len - if(species && species.flags & NO_BLOOD) //TODO: Make drips come from the reagents instead. - return + if(brutedamage >= 20) + temp_bleed += (brutedamage * 0.013) - if(!amt) - return + if(BP.open) + temp_bleed += 0.5 - var/amm = 0.1 * amt - var/turf/T = get_turf(src) + bleed_rate = max(bleed_rate - 0.5, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases - if(species.exotic_blood) - vessel.remove_reagent(species.exotic_blood,amm) - if(vessel.total_volume) - var/fraction = amm / vessel.total_volume - vessel.reaction(T, TOUCH, fraction) - return + if(bleed_rate && !bleedsuppress && !(status_flags & FAKEDEATH)) + bleed(bleed_rate) - else - vessel.remove_reagent("blood",amm) - blood_splatter(src, src) +//Makes a blood drop, leaking amt units of blood from the mob +/mob/living/carbon/proc/bleed(amt) + if(blood_volume) + blood_volume = max(blood_volume - amt, 0) + if(isturf(loc)) //Blood loss still happens in locker, floor stays clean + if(amt >= 10) + add_splatter_floor(loc) + else + add_splatter_floor(loc, 1) +/mob/living/carbon/human/bleed(amt) + if(!(NO_BLOOD in species.species_traits)) + ..() + if(species.exotic_blood) + var/datum/reagent/R = chemical_reagents_list[get_blood_id()] + if(istype(R) && isturf(loc)) + R.reaction_turf(get_turf(src), amt) + +/mob/living/proc/restore_blood() + blood_volume = initial(blood_volume) + +/mob/living/carbon/human/restore_blood() + blood_volume = BLOOD_VOLUME_NORMAL + bleed_rate = 0 /**************************************************** BLOOD TRANSFERS ****************************************************/ -//Gets blood from mob to the container, preserving all data in it. -/mob/living/carbon/proc/take_blood(obj/item/weapon/reagent_containers/container, var/amount) - var/datum/reagent/B = get_blood(container.reagents) - if(!istype(B, /datum/reagent/blood)) B = new /datum/reagent/blood - B.holder = container - B.volume += amount +//Gets blood from mob to a container or other mob, preserving all data in it. +/mob/living/proc/transfer_blood_to(atom/movable/AM, amount, forced) + if(!blood_volume || !AM.reagents) + return 0 + if(blood_volume < BLOOD_VOLUME_BAD && !forced) + return 0 - //set reagent data - B.data["donor"] = src - B.data["viruses"] = list() + if(blood_volume < amount) + amount = blood_volume - for(var/datum/disease/D in viruses) - B.data["viruses"] += D.Copy() - if(resistances && resistances.len) - B.data["resistances"] = resistances.Copy() + var/blood_id = get_blood_id() + if(!blood_id) + return 0 - B.data["blood_DNA"] = copytext(src.dna.unique_enzymes,1,0) - B.data["blood_type"] = copytext(src.dna.b_type,1,0) + blood_volume -= amount - // Putting this here due to return shenanigans. - if(istype(src,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = src - B.data["blood_colour"] = H.species.blood_color - B.color = B.data["blood_colour"] + var/list/blood_data = get_blood_data(blood_id) - var/list/temp_chem = list() - for(var/datum/reagent/R in src.reagents.reagent_list) - temp_chem += R.id - temp_chem[R.id] = R.volume - B.data["trace_chem"] = list2params(temp_chem) - if(mind) - B.data["mind"] = mind - if(ckey) - B.data["ckey"] = ckey + if(iscarbon(AM)) + var/mob/living/carbon/C = AM + if(blood_id == C.get_blood_id())//both mobs have the same blood substance + if(blood_id == "blood") //normal blood + if(blood_data["viruses"]) + for(var/thing in blood_data["viruses"]) + var/datum/disease/D = thing + if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS)) + continue + C.ForceContractDisease(D) + if(!(blood_data["blood_type"] in get_safe_blood(C.dna.b_type))) + C.reagents.add_reagent("toxin", amount * 0.5) + return 1 - if(!suiciding) - B.data["cloneable"] = 1 - B.data["gender"] = gender - B.data["real_name"] = real_name - B.data["factions"] = faction - return B + C.blood_volume = min(C.blood_volume + round(amount, 0.1), BLOOD_VOLUME_MAXIMUM) + return 1 -//For humans, blood does not appear from blue, it comes from vessels. -/mob/living/carbon/human/take_blood(obj/item/weapon/reagent_containers/container, var/amount) - if(src.species.exotic_blood) - if(vessel.get_reagent_amount(src.species.exotic_blood) < amount) - return null - var/datum/reagent/W = new /datum/reagent - W.holder = container - W.volume += amount + AM.reagents.add_reagent(blood_id, amount, blood_data, bodytemperature) + return 1 + + +/mob/living/proc/get_blood_data(blood_id) + return + +/mob/living/carbon/human/get_blood_data(blood_id) + if(blood_id == "blood") //actual blood reagent + var/blood_data = list() + //set the blood data + blood_data["donor"] = src + blood_data["viruses"] = list() + + for(var/thing in viruses) + var/datum/disease/D = thing + blood_data["viruses"] += D.Copy() + + blood_data["blood_DNA"] = copytext(dna.unique_enzymes,1,0) + if(resistances && resistances.len) + blood_data["resistances"] = resistances.Copy() var/list/temp_chem = list() - for(var/datum/reagent/R in src.reagents.reagent_list) - temp_chem += R.id + for(var/datum/reagent/R in reagents.reagent_list) temp_chem[R.id] = R.volume - W.data["trace_chem"] = list2params(temp_chem) - vessel.remove_reagent(src.species.exotic_blood,amount) // Removes blood if human - return W - if(species && species.flags & NO_BLOOD) - return null - else - if(vessel.get_reagent_amount("blood") < amount) - return null - . = ..() - vessel.remove_reagent("blood",amount) // Removes blood if human + blood_data["trace_chem"] = list2params(temp_chem) + if(mind) + blood_data["mind"] = mind + if(ckey) + blood_data["ckey"] = ckey + if(!suiciding) + blood_data["cloneable"] = 1 + blood_data["blood_type"] = copytext(src.dna.b_type,1,0) + blood_data["gender"] = gender + blood_data["real_name"] = real_name + blood_data["blood_color"] = species.blood_color + blood_data["factions"] = faction + return blood_data -//Transfers blood from container ot vessels -/mob/living/carbon/proc/inject_blood(obj/item/weapon/reagent_containers/container, var/amount) - var/datum/reagent/blood/injected = get_blood(container.reagents) +//get the id of the substance this mob use as blood. +/mob/proc/get_blood_id() + return - if(!istype(injected)) +/mob/living/simple_animal/get_blood_id() + if(blood_volume) + return "blood" + +/mob/living/carbon/human/get_blood_id() + if(species.exotic_blood)//some races may bleed water..or kethcup.. + return species.exotic_blood + else if((NO_BLOOD in species.species_traits) || (NOCLONE in mutations)) return - - var/list/chems = list() - chems = params2list(injected.data["trace_chem"]) - for(var/C in chems) - src.reagents.add_reagent(C, (text2num(chems[C]) / BLOOD_VOLUME_NORMAL) * amount)//adds trace chemicals to owner's blood - reagents.update_total() - - container.reagents.remove_reagent("blood", amount) - -//Transfers blood from container ot vessels, respecting blood types compatability. -/mob/living/carbon/human/inject_blood(obj/item/weapon/reagent_containers/container, var/amount) - - var/datum/reagent/blood/injected = get_blood(container.reagents) - - if(!istype(injected)) //Sanity.. - return - - if(species && species.flags & NO_BLOOD) - reagents.add_reagent("blood", amount, injected.data) - reagents.update_total() - return - - var/datum/reagent/blood/our = get_blood(vessel) - - if(!istype(our)) // Do we not have blood? - vessel.add_reagent("blood", amount, injected.data) // This is only ran once, so we need to add back their DNA. - vessel.update_total() - ..() - our = get_blood(vessel) // Get the new blood. - our.data["blood_DNA"] = dna.unique_enzymes // Give it the proper DNA we had before (src.dna) - our.data["blood_type"] = dna.b_type // Proper blood type. - our.data["donor"] = src // Without this, it'd be random each time it was extracted or Null. - return - - if(blood_incompatible(injected.data["blood_type"],our.data["blood_type"]) ) - reagents.add_reagent("toxin",amount * 0.5) - reagents.update_total() - else - vessel.add_reagent("blood", amount, injected.data) - vessel.update_total() - ..() - -//Gets human's own blood. -/mob/living/carbon/proc/get_blood(datum/reagents/container) - var/datum/reagent/blood/res = locate() in container.reagent_list //Grab some blood - if(res) // Make sure there's some blood at all - if(res.data["donor"] != src) //If it's not theirs, then we look for theirs - for(var/datum/reagent/blood/D in container.reagent_list) - if(D.data["donor"] == src) - return D - return res - -/mob/living/carbon/human/get_blood(datum/reagents/container) - if(species.exotic_blood) - return container.get_reagent_from_id(species.exotic_blood) - else - return ..() - -/mob/living/carbon/proc/get_blood_name() return "blood" -/mob/living/carbon/human/get_blood_name() - if(species.exotic_blood) - return species.exotic_blood - else - return ..() +// This is has more potential uses, and is probably faster than the old proc. +/proc/get_safe_blood(bloodtype) + . = list() + if(!bloodtype) + return + switch(bloodtype) + if("A-") + return list("A-", "O-") + if("A+") + return list("A-", "A+", "O-", "O+") + if("B-") + return list("B-", "O-") + if("B+") + return list("B-", "B+", "O-", "O+") + if("AB-") + return list("A-", "B-", "O-", "AB-") + if("AB+") + return list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+") + if("O-") + return list("O-") + if("O+") + return list("O-", "O+") -/proc/blood_incompatible(donor,receiver) +//to add a splatter of blood or other mob liquid. +/mob/living/proc/add_splatter_floor(turf/T, small_drip) + if(get_blood_id() != "blood")//is it blood or welding fuel? + return + if(!T) + T = get_turf(src) - var/donor_antigen = copytext(donor,1,lentext(donor)) - var/receiver_antigen = copytext(receiver,1,lentext(receiver)) - var/donor_rh = findtext("+",donor) - var/receiver_rh = findtext("+",receiver) + var/list/temp_blood_DNA + var/list/b_data = get_blood_data(get_blood_id()) - if(donor_rh && !receiver_rh) return 1 - switch(receiver_antigen) - if("A") - if(donor_antigen != "A" && donor_antigen != "O") return 1 - if("B") - if(donor_antigen != "B" && donor_antigen != "O") return 1 - if("O") - if(donor_antigen != "O") return 1 - //AB is a universal receiver. - return 0 - -/* -Target: Thing/tile to get bloody -Source: Human or blood reagent -Large: Whether the splat should be big or not -*/ -/proc/blood_splatter(var/target,var/source,var/large = 0) - - var/obj/effect/decal/cleanable/blood/B - var/decal_type = /obj/effect/decal/cleanable/blood/splatter - var/turf/T = get_turf(target) - var/datum/reagent/blood/bld - if(istype(source,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = source - bld = H.get_blood(H.vessel) - if(H.species.exotic_blood) - H.vessel.reaction(T, TOUCH) + if(small_drip) + // Only a certain number of drips (or one large splatter) can be on a given turf. + var/obj/effect/decal/cleanable/blood/drip/drop = locate() in T + if(drop) + if(drop.drips < 3) + drop.drips++ + drop.overlays |= pick(drop.random_icon_states) + drop.transfer_mob_blood_dna(src) + drop.basecolor = b_data["blood_color"] + drop.update_icon() + else + temp_blood_DNA = list() + temp_blood_DNA |= drop.blood_DNA.Copy() //we transfer the dna from the drip to the splatter + qdel(drop) + else + drop = new(T) + drop.transfer_mob_blood_dna(src) + drop.basecolor = b_data["blood_color"] + drop.update_icon() return - else if(H.species.flags & NO_BLOOD) - return - else if(istype(source, /datum/reagent)) - bld = source - if(!istype(bld, /datum/reagent/blood)) - var/datum/reagent/R = bld - if(istype(R)) - R.reaction_turf(T, R.volume) - return - else if(source) - log_runtime(EXCEPTION("Non-human or reagent blood source. Area: [get_area(source)], Name: [source]"), source) - - // Are we dripping or splattering? - var/list/drips = list() - // Only a certain number of drips (or one large splatter) can be on a given turf. - for(var/obj/effect/decal/cleanable/blood/drip/drop in T) - drips |= drop.drips - qdel(drop) - if(!large && drips.len < 3) - decal_type = /obj/effect/decal/cleanable/blood/drip // Find a blood decal or create a new one. - B = locate(decal_type) in T + var/obj/effect/decal/cleanable/blood/B = locate() in T if(!B) - B = new decal_type(T) + B = new /obj/effect/decal/cleanable/blood/splatter(T) + B.transfer_mob_blood_dna(src) //give blood info to the blood decal. + if(temp_blood_DNA) + B.blood_DNA |= temp_blood_DNA + B.update_icon() - var/obj/effect/decal/cleanable/blood/drip/drop = B - if(istype(drop) && drips && drips.len && !large) - drop.overlays |= drips - drop.drips |= drips +/mob/living/carbon/human/add_splatter_floor(turf/T, small_drip) + if(!(NO_BLOOD in species.species_traits)) + ..() - // If there's no data to copy, call it quits here. - if(!bld) - return B +/mob/living/carbon/alien/add_splatter_floor(turf/T, small_drip) + if(!T) + T = get_turf(src) + var/obj/effect/decal/cleanable/blood/xeno/B = locate() in T.contents + if(!B) + B = new(T) + B.blood_DNA["UNKNOWN DNA"] = "X*" - // Update appearance. - if(bld.data["blood_colour"]) - B.basecolor = bld.data["blood_colour"] - B.update_icon() - - // Update blood information. - if(bld.data["blood_DNA"]) - B.blood_DNA = list() - if(bld.data["blood_type"]) - B.blood_DNA[bld.data["blood_DNA"]] = bld.data["blood_type"] - else - B.blood_DNA[bld.data["blood_DNA"]] = "O+" - - return B +/mob/living/silicon/robot/add_splatter_floor(turf/T, small_drip) + if(!T) + T = get_turf(src) + var/obj/effect/decal/cleanable/blood/oil/B = locate() in T.contents + if(!B) + B = new(T) \ No newline at end of file diff --git a/code/modules/surgery/organs/helpers.dm b/code/modules/surgery/organs/helpers.dm index 94b0de5e066..61ed78d0e3b 100644 --- a/code/modules/surgery/organs/helpers.dm +++ b/code/modules/surgery/organs/helpers.dm @@ -30,9 +30,7 @@ return returnorg /mob/living/carbon/get_organ_slot(slot) - for(var/obj/item/organ/internal/O in internal_organs) - if(slot == O.slot) - return O + return internal_organs_slot[slot] /mob/living/carbon/get_int_organ_tag(tag) for(var/obj/item/organ/internal/O in internal_organs) diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index fb52fba69f9..a84e63649d7 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -32,6 +32,7 @@ var/list/organ_cache = list() var/sterile = 0 //can the organ be infected by germs? var/tough = 0 //can organ be easily damaged? + /obj/item/organ/Destroy() processing_objects.Remove(src) if(owner) @@ -95,7 +96,7 @@ var/list/organ_cache = list() return //Process infections - if((status & ORGAN_ROBOT) || sterile ||(owner && owner.species && (owner.species.flags & IS_PLANT))) + if((status & ORGAN_ROBOT) || sterile ||(owner && (IS_PLANT in owner.species.species_traits))) germ_level = 0 return @@ -233,7 +234,7 @@ var/list/organ_cache = list() W.time_inflicted = world.time //Note: external organs have their own version of this proc -/obj/item/organ/proc/take_damage(amount, var/silent=0) +/obj/item/organ/proc/take_damage(amount, silent = 0) if(tough) return if(status & ORGAN_ROBOT) @@ -268,15 +269,22 @@ var/list/organ_cache = list() /obj/item/organ/emp_act(severity) if(!(status & ORGAN_ROBOT)) return - switch(severity) - if(1.0) - take_damage(0,20) - return - if(2.0) - take_damage(0,7) - return - if(3.0) - take_damage(0,3) + if(tough) + switch(severity) + if(1) + take_damage(0, 5.5) + if(owner) + owner.Stun(10) + if(2) + take_damage(0, 2.8) + if(owner) + owner.Stun(5) + else + switch(severity) + if(1) + take_damage(0, 20) + if(2) + take_damage(0, 7) /obj/item/organ/internal/emp_act(severity) if(!robotic) @@ -284,13 +292,11 @@ var/list/organ_cache = list() if(robotic == 2) switch(severity) if(1.0) - take_damage(20,1) + take_damage(20, 1) if(2.0) - take_damage(7,1) - if(3.0) - take_damage(3,1) + take_damage(7, 1) else if(robotic == 1) - take_damage(11,1) + take_damage(11, 1) /obj/item/organ/internal/heart/emp_act(intensity) if(owner && robotic == 2) @@ -311,9 +317,9 @@ var/list/organ_cache = list() loc = get_turf(owner) processing_objects |= src var/datum/reagent/blood/organ_blood - if(reagents) organ_blood = reagents.get_reagent_from_id(owner.get_blood_name()) - if((!organ_blood || !organ_blood.data["blood_DNA"]) && (owner && !(owner.species.flags & NO_BLOOD))) - owner.vessel.trans_to(src, 5, 1, 1) + if(reagents) organ_blood = reagents.get_reagent_from_id(owner.get_blood_id()) + if((!organ_blood || !organ_blood.data["blood_DNA"]) && (owner && !(NO_BLOOD in owner.species.species_traits))) + owner.transfer_blood_to(src) if(owner && vital && is_primary_organ()) // I'd do another check for species or whatever so that you couldn't "kill" an IPC by removing a human head from them, but it doesn't matter since they'll come right back from the dead if(user) diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index 151636a9a50..d01b5e5202e 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -46,6 +46,7 @@ var/obj/item/organ/external/parent var/list/obj/item/organ/external/children + var/list/convertable_children = list() // Internal organs of this body part var/list/internal_organs = list() @@ -58,7 +59,7 @@ var/encased // Needs to be opened with a saw to access the organs. var/obj/item/hidden = null - var/list/implants = list() + var/list/embedded_objects = list() // how often wounds should be updated, a higher number means less often var/wound_update_accuracy = 1 @@ -104,7 +105,7 @@ QDEL_LIST(wounds) - QDEL_LIST(implants) + QDEL_LIST(embedded_objects) QDEL_NULL(hidden) @@ -193,7 +194,11 @@ DAMAGE PROCS ****************************************************/ -/obj/item/organ/external/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list()) +/obj/item/organ/external/take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list()) + if(tough) + brute = max(0, brute - 5) + burn = max(0, burn - 4) + if((brute <= 0) && (burn <= 0)) return 0 @@ -271,7 +276,7 @@ if(possible_points.len) //And pass the pain around var/obj/item/organ/external/target = pick(possible_points) - target.take_damage(brute, burn, sharp, edge, used_weapon, forbidden_limbs + src) + target.take_damage(brute, burn, sharp, used_weapon, forbidden_limbs + src) if(fail_at_full_damage == 2 && body_part != UPPER_TORSO && body_part != LOWER_TORSO) var/losstype if(burn > brute) @@ -287,8 +292,8 @@ if(owner && loc == owner) if(!cannot_amputate && config.limbs_can_break && (brute_dam) >= (max_damage * config.organ_health_multiplier)) if(prob(brute / 2)) - if(edge) - droplimb(0,DROPLIMB_EDGE) + if(sharp) + droplimb(0, DROPLIMB_SHARP) if(owner_old) owner_old.updatehealth() return update_icon() @@ -317,13 +322,6 @@ status &= ~ORGAN_BROKEN perma_injury = 0 -/* - if((brute || burn) && children && children.len && (owner.species.flags & REGENERATES_LIMBS)) - var/obj/item/organ/external/stump/S = locate() in children - if(S) -// to_chat(world, "Extra healing to go around ([brute+burn]) and [owner] needs a replacement limb.") -*/ - //Sync the organ's damage with its wounds src.update_damages() owner.updatehealth() @@ -358,12 +356,6 @@ This function completely restores a damaged organ to perfect condition. for(var/obj/item/organ/external/EO in contents) EO.rejuvenate() - // remove embedded objects and drop them on the floor - for(var/obj/implanted_object in implants) - if(!istype(implanted_object,/obj/item/weapon/implant)) // We don't want to remove REAL implants. Just shrapnel etc. - implanted_object.loc = owner.loc - implants -= implanted_object - owner.updatehealth() update_icon() if(!owner) @@ -492,7 +484,7 @@ Note that amputating the affected organ does in fact remove the infection from t */ /obj/item/organ/external/proc/update_germs() - if(status & (ORGAN_ROBOT|ORGAN_DESTROYED) || (owner.species && owner.species.flags & IS_PLANT)) //Robotic limbs shouldn't be infected, nor should nonexistant limbs. + if(status & (ORGAN_ROBOT|ORGAN_DESTROYED) || (IS_PLANT in owner.species.species_traits)) //Robotic limbs shouldn't be infected, nor should nonexistant limbs. germ_level = 0 return @@ -578,9 +570,9 @@ Note that amputating the affected organ does in fact remove the infection from t var/bicardose = owner.reagents.get_reagent_amount("styptic_powder") if(!bicardose) //styptic powder stops internal wounds from growing bigger with time, and also stop bleeding W.open_wound(0.1 * wound_update_accuracy) - owner.vessel.remove_reagent("blood",0.05 * W.damage * wound_update_accuracy) + owner.blood_volume = max(owner.blood_volume - (0.05 * W.damage * wound_update_accuracy), 0) - owner.vessel.remove_reagent("blood",0.02 * W.damage * wound_update_accuracy) + owner.blood_volume = max(owner.blood_volume - (0.02 * W.damage * wound_update_accuracy), 0) if(prob(1 * wound_update_accuracy)) owner.custom_pain("You feel a stabbing pain in your [name]!",1) @@ -635,7 +627,7 @@ Note that amputating the affected organ does in fact remove the infection from t if(!(status & ORGAN_ROBOT) && W.bleeding()) W.bleed_timer-- - if(H && (H.species.flags & NO_BLOOD)) // Bloodless organic races are finicky + if(H && (NO_BLOOD in H.species.species_traits)) // Bloodless organic races are finicky W.clamped = 1 W.bleed_timer = 0 else @@ -645,7 +637,7 @@ Note that amputating the affected organ does in fact remove the infection from t number_wounds += W.amount - if(open && !clamped && (H && !(H.species.flags & NO_BLOOD))) + if(open && !clamped && (H && !(NO_BLOOD in H.species.species_traits))) status |= ORGAN_BLEEDING //Bone fractures @@ -691,10 +683,10 @@ Note that amputating the affected organ does in fact remove the infection from t return if(!disintegrate) - disintegrate = DROPLIMB_EDGE + disintegrate = DROPLIMB_SHARP switch(disintegrate) - if(DROPLIMB_EDGE) + if(DROPLIMB_SHARP) if(!clean) var/gore_sound = "[(status & ORGAN_ROBOT) ? "tortured metal" : "ripping tendons and flesh"]" owner.visible_message( @@ -743,9 +735,9 @@ Note that amputating the affected organ does in fact remove the infection from t victim.regenerate_icons() dir = 2 switch(disintegrate) - if(DROPLIMB_EDGE) + if(DROPLIMB_SHARP) compile_icon() - add_blood(victim) + add_blood(victim.blood_DNA, victim.species.blood_color) var/matrix/M = matrix() M.Turn(rand(180)) src.transform = M @@ -827,7 +819,7 @@ Note that amputating the affected organ does in fact remove the infection from t "You hear a loud cracking sound coming from \the [owner].",\ "Something feels like it shattered in your [name]!",\ "You hear a sickening crack.") - if(owner.species && !(owner.species.flags & NO_PAIN)) + if(owner.species && !(NO_PAIN in owner.species.species_traits)) owner.emote("scream") status |= ORGAN_BROKEN @@ -847,19 +839,18 @@ Note that amputating the affected organ does in fact remove the infection from t status &= ~ORGAN_BROKEN return 1 -// I put these two next to each other to highlight that both exist. This should likely be resolved. -/obj/item/organ/external/robotize() +/obj/item/organ/external/robotize(company, make_tough = 0, convert_all = 1) ..() //robot limbs take reduced damage - brute_mod = 0.66 - burn_mod = 0.66 + if(!make_tough) + brute_mod = 0.66 + burn_mod = 0.66 + fail_at_full_damage = 1 + else + tough = 1 // Robot parts also lack bones // This is so surgery isn't kaput, let's see how this does encased = null - fail_at_full_damage = 1 - -/obj/item/organ/external/robotize(var/company) - ..() if(company && istext(company)) set_company(company) @@ -867,8 +858,8 @@ Note that amputating the affected organ does in fact remove the infection from t cannot_break = 1 get_icon() for(var/obj/item/organ/external/T in children) - if(T) - T.robotize() + if((convert_all) || (T.type in convertable_children)) + T.robotize(company, make_tough, convert_all) @@ -900,26 +891,12 @@ Note that amputating the affected organ does in fact remove the infection from t return 0 /obj/item/organ/external/proc/is_usable() - if((status & ORGAN_ROBOT) && get_damage() >= max_damage) //robot limbs just become inoperable at max damage + if(((status & ORGAN_ROBOT) && get_damage() >= max_damage) && !tough) //robot limbs just become inoperable at max damage return return !(status & (ORGAN_DESTROYED|ORGAN_MUTATED|ORGAN_DEAD)) /obj/item/organ/external/proc/is_malfunctioning() - return ((status & ORGAN_ROBOT) && (brute_dam + burn_dam) >= 10 && prob(brute_dam + burn_dam)) - -/obj/item/organ/external/proc/embed(var/obj/item/weapon/W, var/silent = 0) - if(!owner || loc != owner) - return - if(!silent) - owner.visible_message("\The [W] sticks in the wound!") - implants += W - owner.embedded_flag = 1 - owner.verbs += /mob/proc/yank_out_object - W.add_blood(owner) - if(ismob(W.loc)) - var/mob/living/H = W.loc - H.drop_item() - W.loc = owner + return ((status & ORGAN_ROBOT) && (brute_dam + burn_dam) >= 10 && prob(brute_dam + burn_dam) && !tough) /obj/item/organ/external/proc/open_enough_for_surgery() return (encased ? (open == 3) : (open == 2)) @@ -931,14 +908,17 @@ Note that amputating the affected organ does in fact remove the infection from t var/is_robotic = status & ORGAN_ROBOT var/mob/living/carbon/human/victim = owner + for(var/obj/item/I in embedded_objects) + embedded_objects -= I + I.forceMove(src) + if(!owner.has_embedded_objects()) + owner.clear_alert("embeddedobject") + . = ..() status |= ORGAN_DESTROYED victim.bad_external_organs -= src - for(var/implant in implants) //todo: check if this can be left alone - qdel(implant) - // Attached organs also fly off. if(!ignore_children) for(var/obj/item/organ/external/O in children) @@ -1018,3 +998,22 @@ Note that amputating the affected organ does in fact remove the infection from t ..() // Parent call loads in the DNA if(data["dna"]) sync_colour_to_dna() + +//Remove all embedded objects from all limbs on the carbon mob +/mob/living/carbon/human/proc/remove_all_embedded_objects() + var/turf/T = get_turf(src) + + for(var/X in bodyparts) + var/obj/item/organ/external/L = X + for(var/obj/item/I in L.embedded_objects) + L.embedded_objects -= I + I.forceMove(T) + + clear_alert("embeddedobject") + +/mob/living/carbon/human/proc/has_embedded_objects() + . = 0 + for(var/X in bodyparts) + var/obj/item/organ/external/L = X + for(var/obj/item/I in L.embedded_objects) + return 1 \ No newline at end of file diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm index 6c2c9a89c08..bf7620a2cf4 100644 --- a/code/modules/surgery/organs/organ_icon.dm +++ b/code/modules/surgery/organs/organ_icon.dm @@ -49,7 +49,7 @@ var/global/list/limb_icon_cache = list() if(!isnull(dna.GetUIValue(DNA_UI_SKIN_TONE)) && ((species.bodyflags & HAS_SKIN_TONE) || (species.bodyflags & HAS_ICON_SKIN_TONE))) s_col = null s_tone = dna.GetUIValue(DNA_UI_SKIN_TONE) - if(species.flags & HAS_SKIN_COLOR) + if(species.bodyflags & HAS_SKIN_COLOR) s_tone = null s_col = list(dna.GetUIValue(DNA_UI_SKIN_R), dna.GetUIValue(DNA_UI_SKIN_G), dna.GetUIValue(DNA_UI_SKIN_B)) @@ -115,7 +115,7 @@ var/global/list/limb_icon_cache = list() mob_icon.Blend(eyes_icon, ICON_OVERLAY) overlays |= eyes_icon - if(owner.lip_style && (species && (species.flags & HAS_LIPS))) + if(owner.lip_style && (LIPS in species.species_traits)) var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s") overlays |= lip_icon mob_icon.Blend(lip_icon, ICON_OVERLAY) @@ -139,7 +139,7 @@ var/global/list/limb_icon_cache = list() if(f_style) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] - if(facial_hair_style && ((facial_hair_style.species_allowed && (species.name in facial_hair_style.species_allowed)) || (src.species.flags & ALL_RPARTS))) + if(facial_hair_style && ((facial_hair_style.species_allowed && (species.name in facial_hair_style.species_allowed)) || (src.species.bodyflags & ALL_RPARTS))) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") if(species.name == "Slime People") // I am el worstos facial_s.Blend(rgb(owner.r_skin, owner.g_skin, owner.b_skin, 160), ICON_AND) @@ -149,7 +149,7 @@ var/global/list/limb_icon_cache = list() if(h_style && !(owner.head && (owner.head.flags & BLOCKHEADHAIR))) var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] - if(hair_style && ((species.name in hair_style.species_allowed) || (src.species.flags & ALL_RPARTS))) + if(hair_style && ((species.name in hair_style.species_allowed) || (src.species.bodyflags & ALL_RPARTS))) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") if(species.name == "Slime People") // I am el worstos hair_s.Blend(rgb(owner.r_skin, owner.g_skin, owner.b_skin, 160), ICON_AND) @@ -192,7 +192,7 @@ var/global/list/limb_icon_cache = list() /obj/item/organ/external/chest/get_icon_state(skeletal) var/result = ..() - if(fat && !skeletal && !(status & ORGAN_ROBOT) && (species.flags & CAN_BE_FAT)) + if(fat && !skeletal && !(status & ORGAN_ROBOT) && (CAN_BE_FAT in species.species_traits)) result[2] += "_fat" return result diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 071d579b0c0..435fb561392 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -5,8 +5,8 @@ force = 1 w_class = WEIGHT_CLASS_SMALL throwforce = 0 - var/zone = "chest" var/slot + // DO NOT add slots with matching names to different zones - it will break internal_organs_slot list! vital = 0 var/non_primary = 0 @@ -29,6 +29,7 @@ owner = M M.internal_organs |= src + M.internal_organs_slot[slot] = src var/obj/item/organ/external/parent if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M @@ -52,6 +53,8 @@ owner = null if(M) M.internal_organs -= src + if(M.internal_organs_slot[slot] == src) + M.internal_organs_slot.Remove(slot) if(vital && !special) if(M.stat != DEAD)//safety check! M.death() @@ -208,7 +211,7 @@ /obj/item/organ/internal/heart/cursed/attack(mob/living/carbon/human/H, mob/living/carbon/human/user, obj/target) if(H == user && istype(H)) - if(H.species.flags & NO_BLOOD || H.species.exotic_blood) + if(NO_BLOOD in H.species.species_traits) to_chat(H, "\The [src] is not compatible with your form!") return playsound(user,'sound/effects/singlebeat.ogg', 40, 1) @@ -221,10 +224,11 @@ if(world.time > (last_pump + pump_delay)) if(ishuman(owner) && owner.client) //While this entire item exists to make people suffer, they can't control disconnects. var/mob/living/carbon/human/H = owner - H.vessel.remove_reagent("blood", blood_loss) - to_chat(H, "You have to keep pumping your blood!") - if(H.client) - H.client.color = "red" //bloody screen so real + if(!(NO_BLOOD in H.species.species_traits)) + H.blood_volume = max(H.blood_volume - blood_loss, 0) + to_chat(H, "You have to keep pumping your blood!") + if(H.client) + H.client.color = "red" //bloody screen so real else last_pump = world.time //lets be extra fair *sigh* @@ -253,13 +257,14 @@ var/mob/living/carbon/human/H = owner if(istype(H)) - H.vessel.add_reagent("blood", (cursed_heart.blood_loss*0.5))//gain half the blood back from a failure - if(owner.client) - owner.client.color = "" + if(!(NO_BLOOD in H.species.species_traits)) + H.blood_volume = min(H.blood_volume + cursed_heart.blood_loss*0.5, BLOOD_VOLUME_MAXIMUM) + if(owner.client) + owner.client.color = "" - H.adjustBruteLoss(-cursed_heart.heal_brute) - H.adjustFireLoss(-cursed_heart.heal_burn) - H.adjustOxyLoss(-cursed_heart.heal_oxy) + H.adjustBruteLoss(-cursed_heart.heal_brute) + H.adjustFireLoss(-cursed_heart.heal_burn) + H.adjustOxyLoss(-cursed_heart.heal_oxy) /obj/item/organ/internal/lungs name = "lungs" @@ -286,7 +291,7 @@ if(is_bruised()) if(prob(2)) owner.custom_emote(1, "coughs up blood!") - owner.drip(10) + owner.bleed(1) if(prob(4)) owner.custom_emote(1, "gasps for air!") owner.AdjustLoseBreath(5) diff --git a/code/modules/surgery/organs/pain.dm b/code/modules/surgery/organs/pain.dm index 67655e17102..d107c7439c6 100644 --- a/code/modules/surgery/organs/pain.dm +++ b/code/modules/surgery/organs/pain.dm @@ -47,7 +47,8 @@ mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0 mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength) if(stat >= 1) return - if(species && species.flags & NO_PAIN) return + if(NO_PAIN in species.species_traits) + return if(reagents.has_reagent("morphine")) return @@ -66,7 +67,7 @@ mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength) mob/living/carbon/human/proc/handle_pain() // not when sleeping - if(species && species.flags & NO_PAIN) + if(NO_PAIN in species.species_traits) //While synthetics don't feel pain, they will notice their gears gunking up with residue (toxins) if(isSynthetic()) var/toxDamageMessage = null diff --git a/code/modules/surgery/organs/robolimbs.dm b/code/modules/surgery/organs/robolimbs.dm index 2d31942059c..d3c297bc0c7 100644 --- a/code/modules/surgery/organs/robolimbs.dm +++ b/code/modules/surgery/organs/robolimbs.dm @@ -1,5 +1,6 @@ var/global/list/all_robolimbs = list() var/global/list/chargen_robolimbs = list() +var/global/list/selectable_robolimbs = list() var/global/datum/robolimb/basic_robolimb /proc/populate_robolimb_list() @@ -11,12 +12,15 @@ var/global/datum/robolimb/basic_robolimb if(R != "head" && R != "chest" && R != "groin" ) //Part of the method that ensures only IPCs can access head, chest and groin prosthetics. if(R.has_subtypes) //Ensures solos get added to the list as well be incorporating has_subtypes == 1 and has_subtypes == 2. chargen_robolimbs[R.company] = R //List only main brands and solo parts. + if(R.selectable) + selectable_robolimbs[R.company] = R /datum/robolimb var/company = "Unbranded" // Shown when selecting the limb. var/desc = "A generic unbranded robotic prosthesis." // Seen when examining a limb. var/icon = 'icons/mob/human_races/robotic.dmi' // Icon base to draw from. var/unavailable_at_chargen // If set, not available at chargen. + var/selectable = 1 // If set, is it available for selection on attack_self with a robo limb? var/is_monitor // If set, limb is a monitor and should be getting monitor styles. var/has_subtypes = 2 // If null, object is a model. If 1, object is a brand (that serves as the default model) with child models. If 2, object is a brand that has no child models and thus also serves as the model.. var/parts = list("chest", "groin", "head", "r_arm", "r_hand", "r_leg", "r_foot", "l_leg", "l_foot", "l_arm", "l_hand") // Defines what parts said brand can replace on a body. @@ -31,6 +35,7 @@ var/global/datum/robolimb/basic_robolimb company = "Bishop Cybernetics alt." icon = 'icons/mob/human_races/cyberlimbs/bishop/bishop_alt1.dmi' parts = list("head") + selectable = 0 has_subtypes = null /datum/robolimb/bishop/monitor @@ -38,6 +43,7 @@ var/global/datum/robolimb/basic_robolimb icon = 'icons/mob/human_races/cyberlimbs/bishop/bishop_monitor.dmi' parts = list("head") is_monitor = 1 + selectable = 0 has_subtypes = null /datum/robolimb/hesphiastos @@ -51,6 +57,7 @@ var/global/datum/robolimb/basic_robolimb icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_alt1.dmi' parts = list("head") is_monitor = 1 + selectable = 0 has_subtypes = null /datum/robolimb/hesphiastos/monitor @@ -58,6 +65,7 @@ var/global/datum/robolimb/basic_robolimb icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_monitor.dmi' parts = list("head") is_monitor = 1 + selectable = 0 has_subtypes = null /datum/robolimb/morpheus @@ -74,6 +82,7 @@ var/global/datum/robolimb/basic_robolimb parts = list("head") unavailable_at_chargen = null is_monitor = null + selectable = 0 has_subtypes = 2 //Edge case. We want to be able to pick this one, and if we had it left as null for has_subtypes we'd be assuming it'll be chosen as a child model, //and since the parent is unavailable at chargen, we wouldn't be able to see it in the list anyway. Now, we'll be able to select the Morpheus Ckt. Alt. head as a solo-model. @@ -87,6 +96,7 @@ var/global/datum/robolimb/basic_robolimb company = "Ward-Takahashi alt." icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_alt1.dmi' parts = list("head") + selectable = 0 has_subtypes = null /datum/robolimb/wardtakahashi/monitor @@ -94,6 +104,7 @@ var/global/datum/robolimb/basic_robolimb icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_monitor.dmi' parts = list("head") is_monitor = 1 + selectable = 0 has_subtypes = null /datum/robolimb/xion @@ -106,6 +117,7 @@ var/global/datum/robolimb/basic_robolimb company = "Xion Manufacturing Group alt." icon = 'icons/mob/human_races/cyberlimbs/xion/xion_alt1.dmi' parts = list("head") + selectable = 0 has_subtypes = null /datum/robolimb/xion/monitor @@ -113,6 +125,7 @@ var/global/datum/robolimb/basic_robolimb icon = 'icons/mob/human_races/cyberlimbs/xion/xion_monitor.dmi' parts = list("head") is_monitor = 1 + selectable = 0 has_subtypes = null /datum/robolimb/zenghu @@ -131,6 +144,7 @@ var/global/datum/robolimb/basic_robolimb company = "Shellguard Munitions Elite Series" icon = 'icons/mob/human_races/cyberlimbs/shellguard/shellguard_alt1.dmi' parts = list("head") + selectable = 0 has_subtypes = null /datum/robolimb/shellguard/monitor @@ -138,4 +152,5 @@ var/global/datum/robolimb/basic_robolimb icon = 'icons/mob/human_races/cyberlimbs/shellguard/shellguard_monitor.dmi' parts = list("head") is_monitor = 1 + selectable = 0 has_subtypes = null \ No newline at end of file diff --git a/code/modules/surgery/organs/subtypes/standard.dm b/code/modules/surgery/organs/subtypes/standard.dm index a6467584963..d3a76fab60c 100644 --- a/code/modules/surgery/organs/subtypes/standard.dm +++ b/code/modules/surgery/organs/subtypes/standard.dm @@ -17,6 +17,7 @@ parent_organ = null encased = "ribcage" var/fat = FALSE + convertable_children = list(/obj/item/organ/external/groin) /obj/item/organ/external/chest/proc/makeFat(update_body_icon = 1) fat = TRUE @@ -60,6 +61,7 @@ parent_organ = "chest" amputation_point = "left shoulder" can_grasp = 1 + convertable_children = list(/obj/item/organ/external/hand) /obj/item/organ/external/arm/right limb_name = "r_arm" @@ -67,6 +69,7 @@ icon_name = "r_arm" body_part = ARM_RIGHT amputation_point = "right shoulder" + convertable_children = list(/obj/item/organ/external/hand/right) /obj/item/organ/external/leg limb_name = "l_leg" @@ -80,6 +83,7 @@ parent_organ = "groin" amputation_point = "left hip" can_stand = 1 + convertable_children = list(/obj/item/organ/external/foot) /obj/item/organ/external/leg/right limb_name = "r_leg" @@ -88,6 +92,7 @@ body_part = LEG_RIGHT icon_position = RIGHT amputation_point = "right hip" + convertable_children = list(/obj/item/organ/external/foot/right) /obj/item/organ/external/foot limb_name = "l_foot" @@ -214,8 +219,8 @@ ..() -/obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list()) - ..(brute, burn, sharp, edge, used_weapon, forbidden_limbs) +/obj/item/organ/external/head/take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list()) + ..(brute, burn, sharp, used_weapon, forbidden_limbs) if(!disfigured) if(brute_dam > 40) if(prob(50)) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index e44f20046db..4bb0f2846c7 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -38,7 +38,6 @@ var/static/regex/multispin_words = regex("like a record baby") /obj/item/organ/internal/vocal_cords //organs that are activated through speech with the :x channel name = "vocal cords" icon_state = "appendix" - zone = "mouth" slot = "vocal_cords" parent_organ = "mouth" var/spans = null @@ -245,7 +244,7 @@ var/static/regex/multispin_words = regex("like a record baby") //BLEED else if((findtext(message, bleed_words))) for(var/mob/living/carbon/human/H in listeners) - H.drip(100 * power_multiplier) + H.bleed_rate += (5 * power_multiplier) next_command = world.time + cooldown_damage //FIRE diff --git a/code/modules/surgery/organs/wound.dm b/code/modules/surgery/organs/wound.dm index ca5b25dee12..b1f99b34d6b 100644 --- a/code/modules/surgery/organs/wound.dm +++ b/code/modules/surgery/organs/wound.dm @@ -318,15 +318,15 @@ datum/wound/cut/massive /datum/wound/lost_limb/New(var/obj/item/organ/external/lost_limb, var/losstype, var/clean) var/damage_amt = lost_limb.max_damage if(clean) damage_amt /= 2 - + switch(losstype) - if(DROPLIMB_EDGE, DROPLIMB_BLUNT) + if(DROPLIMB_SHARP, DROPLIMB_BLUNT) damage_type = CUT max_bleeding_stage = 3 //clotted stump and above can bleed. stages = list( "ripped stump" = damage_amt*1.3, - "bloody stump" = damage_amt, - "clotted stump" = damage_amt*0.5, + "bloody stump" = damage_amt, + "clotted stump" = damage_amt*0.5, "scarred stump" = 0 ) if(DROPLIMB_BURN) @@ -337,7 +337,7 @@ datum/wound/cut/massive "scarred stump" = damage_amt*0.5, "scarred stump" = 0 ) - + ..(damage_amt) /datum/wound/lost_limb/can_merge(var/datum/wound/other) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 420d56de43d..da41915249c 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -14,7 +14,7 @@ /datum/surgery/organ_manipulation_boneless name = "Organ Manipulation" - possible_locs = list("chest","head","groin", "eyes", "mouth") + possible_locs = list("chest","head","groin", "eyes", "mouth", "l_arm", "r_arm") steps = list(/datum/surgery_step/generic/cut_open,/datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/internal/manipulate_organs,/datum/surgery_step/generic/cauterize) requires_organic_bodypart = 1 @@ -159,6 +159,11 @@ else if(implement_type in implements_extract) current_type = "extract" var/list/organs = target.get_organs_zone(target_zone) + var/mob/living/simple_animal/borer/B = target.has_brain_worms() + if(target_zone == "head" && B) + user.visible_message("[user] begins to extract [B] from [target]'s [parse_zone(target_zone)].", + "You begin to extract [B] from [target]'s [parse_zone(target_zone)]...") + return TRUE if(!organs.len) to_chat(user, "There are no removeable organs in [target]'s [parse_zone(target_zone)]!") return -1 @@ -262,6 +267,13 @@ I.status &= ~ORGAN_CUT_AWAY else if(current_type == "extract") + var/mob/living/simple_animal/borer/B = target.has_brain_worms() + if(target_zone == "head" && B && B.host == target) + user.visible_message("[user] successfully extracts [B] from [target]'s [parse_zone(target_zone)]!", + "You successfully extract [B] from [target]'s [parse_zone(target_zone)].") + add_logs(user, target, "surgically removed [B] from", addition="INTENT: [uppertext(user.a_intent)]") + B.leave_host() + return FALSE if(I && I.owner == target) user.visible_message(" [user] has separated and extracts [target]'s [I] with [tool].", " You have separated and extracted [target]'s [I] with [tool].") diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm new file mode 100644 index 00000000000..d7fe8b7fb53 --- /dev/null +++ b/code/modules/surgery/remove_embedded_object.dm @@ -0,0 +1,65 @@ +/datum/surgery/embedded_removal + name = "Removal of Embedded Objects" + steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/remove_object,/datum/surgery_step/generic/cauterize) + possible_locs = list("head", "chest", "l_arm", "l_hand", "r_arm", "r_hand","r_leg", "r_foot", "l_leg", "l_foot", "groin") + +/datum/surgery/embedded_removal/synth + steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/remove_object,/datum/surgery_step/robotics/external/close_hatch) + +/datum/surgery/embedded_removal/can_start(mob/user, mob/living/carbon/human/target) + if(!istype(target)) + return 0 + var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) + if(!affected) + return 0 + if(affected.status & ORGAN_ROBOT) + return 0 + return 1 + +/datum/surgery/embedded_removal/synth/can_start(mob/user, mob/living/carbon/human/target) + if(!istype(target)) + return 0 + var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) + if(!affected) + return 0 + if(!(affected.status & ORGAN_ROBOT)) + return 0 + + return 1 + +/datum/surgery_step/remove_object + name = "Remove Embedded Objects" + time = 32 + accept_hand = 1 + var/obj/item/organ/external/L = null + + +/datum/surgery_step/remove_object/begin_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + L = surgery.organ_ref + if(L) + user.visible_message("[user] looks for objects embedded in [target]'s [parse_zone(user.zone_sel.selecting)].", "You look for objects embedded in [target]'s [parse_zone(user.zone_sel.selecting)]...") + else + user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_sel.selecting)].", "You look for [target]'s [parse_zone(user.zone_sel.selecting)]...") + + +/datum/surgery_step/remove_object/end_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(L) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + var/objects = 0 + for(var/obj/item/I in L.embedded_objects) + objects++ + I.forceMove(get_turf(H)) + L.embedded_objects -= I + if(!H.has_embedded_objects()) + H.clear_alert("embeddedobject") + + if(objects > 0) + user.visible_message("[user] sucessfully removes [objects] objects from [H]'s [L]!", "You successfully remove [objects] objects from [H]'s [L.name].") + else + to_chat(user, "You find no objects embedded in [H]'s [L]!") + + else + to_chat(user, "You can't find [target]'s [parse_zone(user.zone_sel.selecting)], let alone any objects embedded in it!") + + return 1 \ No newline at end of file diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index e1dc252412d..2815905eedc 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -12,7 +12,7 @@ /datum/surgery/cybernetic_repair/internal name = "Internal Component Manipulation" steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/robotics/manipulate_robotic_organs) - possible_locs = list("eyes", "chest","head","groin") + possible_locs = list("eyes", "chest","head","groin","l_arm","r_arm") requires_organic_bodypart = 0 /datum/surgery/cybernetic_amputation @@ -538,7 +538,7 @@ add_logs(user, target, "surgically removed [affected.name] from", addition="INTENT: [uppertext(user.a_intent)]")//log it - var/atom/movable/thing = affected.droplimb(1,DROPLIMB_EDGE) + var/atom/movable/thing = affected.droplimb(1,DROPLIMB_SHARP) if(istype(thing,/obj/item)) user.put_in_hands(thing) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 48ee29f3f45..a11be40d395 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -201,7 +201,7 @@ for(var/mob/living/carbon/human/H in view(2, E.loc))//germs from people if(AStar(E.loc, H.loc, /turf/proc/Distance, 2, simulated_only = 0)) - if((!(NO_BREATH in H.mutations) || !(H.species.flags & NO_BREATH)) && !H.wear_mask) //wearing a mask helps preventing people from breathing cooties into open incisions + if((!(NO_BREATH in H.mutations) || !(NO_BREATH in H.species.species_traits)) && !H.wear_mask) //wearing a mask helps preventing people from breathing cooties into open incisions germs+=H.germ_level/4 for(var/obj/effect/decal/cleanable/M in view(2, E.loc))//germs from messes diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 37e1aebe089..b8637c3f797 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -43,7 +43,6 @@ flags = CONDUCT force = 15.0 sharp = 1 - edge = 1 w_class = WEIGHT_CLASS_NORMAL origin_tech = "materials=1;biotech=1" attack_verb = list("drilled") @@ -63,7 +62,6 @@ flags = CONDUCT force = 10.0 sharp = 1 - edge = 1 w_class = WEIGHT_CLASS_TINY throwforce = 5.0 throw_speed = 3 @@ -123,7 +121,6 @@ flags = CONDUCT force = 15.0 sharp = 1 - edge = 1 w_class = WEIGHT_CLASS_NORMAL throwforce = 9.0 throw_speed = 3 diff --git a/code/world.dm b/code/world.dm index ebf4865a1a8..e293058cdf6 100644 --- a/code/world.dm +++ b/code/world.dm @@ -244,6 +244,27 @@ var/world_topic_spam_protect_time = world.timeofday for(var/client/C in clients) to_chat(C, "PR: [input["announce"]]") + else if("kick" in input) + /* + We have a kick request over coms. + Only needed portion is the ckey + */ + if(!key_valid) + return keySpamProtect(addr) + + var/client/C + + for(var/client/K in clients) + if(K.ckey == input["kick"]) + C = K + break + if(!C) + return "No client with that name on server" + + del(C) + + return "Kick Successful" + /proc/keySpamProtect(var/addr) if(world_topic_spam_protect_ip == addr && abs(world_topic_spam_protect_time - world.time) < 50) spawn(50) @@ -375,7 +396,7 @@ var/world_topic_spam_protect_time = world.timeofday s += "[station_name()]"; s += " (" - s += "" //Change this to wherever you want the hub to link to. + s += "" //Change this to wherever you want the hub to link to. s += "[game_version]" s += "" s += ")" diff --git a/config/example/admins.txt b/config/example/admins.txt index 0e89ae17e23..c42f756a87d 100644 --- a/config/example/admins.txt +++ b/config/example/admins.txt @@ -5,4 +5,4 @@ # Ranks can be anything defined in admin_ranks.txt # ###################################################################### -# example - Admin +# example - Hosting Provider diff --git a/config/example/game_options.txt b/config/example/game_options.txt index 549633d6a2d..7246e0773fa 100644 --- a/config/example/game_options.txt +++ b/config/example/game_options.txt @@ -48,7 +48,7 @@ ROBOT_DELAY 1.5 MONKEY_DELAY 1.5 ALIEN_DELAY 1.5 SLIME_DELAY 1.5 -ANIMAL_DELAY 1.5 +ANIMAL_DELAY 2.5 ## Comment for "normal" explosions, which ignore obstacles ## Uncomment for explosions that react to doors and walls diff --git a/html/changelog.html b/html/changelog.html index 9af10b246e0..efd655f4c11 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -26,7 +26,7 @@
    Paradise Station

    - Visit our IRC channel: #crew on neko.sneeza.me + Visit our Discord channel:-Click Here- @@ -55,6 +55,392 @@ -->
    + +

    16 July 2017

    +

    KasparoVy updated:

    +
      +
    • Fixes a bug with Vampire Shapeshift where you didn't get a name appropriate to your species and clarifies the ability description.
    • +
    • Fixes a bug with DNA scramblers whereby you wouldn't get a name appropriate to your species.
    • +
    + +

    15 July 2017

    +

    Fox McCloud updated:

    +
      +
    • Fixes blood oddities with vampires
    • +
    +

    Kyep updated:

    +
      +
    • Mechs firing missiles no longer cause the missiles to drop at their feet, as if frozen in midair.
    • +
    +

    imsxz updated:

    +
      +
    • Edits the syndicate soft suit helmet's description to match the suit's.
    • +
    + +

    13 July 2017

    +

    Fox McCloud updated:

    +
      +
    • Fixes blood volume and type not showing up properly on health analyzer
    • +
    • Fixes exotic blood names being incorrect
    • +
    • fix examining/checking yourself/others for bleeding/bandaging
    • +
    • Everything that involves bandaging now properly uses the new blood system
    • +
    • Fixes species exotic blood being injected into a mob not increasing their blood volume (slimes rejoice)
    • +
    • Fixed faked deaths still allowing for bleeding
    • +
    • Fixes IV drips not transferring over the proper amount of blood
    • +
    • Embedded objects will cause additional bleeding
    • +
    • Adds in heparin, a drug that can cause bleeding
    • +
    • medical stacks can be used multiple times on the same limb
    • +
    • Blood depletes in the body a lot faster now, due to blood refactor changes
    • +
    +

    Shazbot-coding, Driker-Sprites updated:

    +
      +
    • Gives the clown their own jug
    • +
    + +

    12 July 2017

    +

    Fox McCloud updated:

    +
      +
    • Fixed advanced scanners showing hidden viruses
    • +
    • Fixed changeling panacea curing beneficial viruses
    • +
    • removed blood decal infections
    • +
    • some diseases now bypasse species virus immunity (kuru, TB, and appendicitis)
    • +
    + +

    11 July 2017

    +

    Fethas and tigercat updated:

    +
      +
    • blood trails
    • +
    • blood is now eaiser to decrease/increase .
    • +
    • revamps about every method of adding blood to something, floors, walls, doors, PEOPLE.
    • +
    + +

    10 July 2017

    +

    AffectedArc07 updated:

    +
      +
    • APC frames now have the correct texture
    • +
    +

    Birdtalon updated:

    +
      +
    • Pool contractors have been back to school and can now spell "safety" on the controller correctly.
    • +
    • Minor change to blob description to address grammar issue.
    • +
    +

    Citinited updated:

    +
      +
    • Superfart once again works ass intended.
    • +
    +

    Fox McCloud updated:

    +
      +
    • Radiation poisoning no longer permastuns, but deals burn damage now and has increased mutation chances
    • +
    • adds in electric guitars
    • +
    • can now craft violins and electric guitars
    • +
    • purchase electric guitars at the cargo store
    • +
    • service borgs now have an electric guitar, too
    • +
    • lowered the price of instruments, at cargo store, to 500
    • +
    • Fixed violins not having an in-hand icon
    • +
    + +

    08 July 2017

    +

    Citinited updated:

    +
      +
    • Rainbow and mime crayons will now change colour as intended.
    • +
    +

    Fox McCloud updated:

    +
      +
    • Advanced mop slightly slower at cleaning and holds less reagents, but now regenerates water if turned on
    • +
    • Blood (on the floor) that has viruses in it will now properly infect you, if you get near
    • +
    +

    Kyep updated:

    +
      +
    • It is no longer possible to prioritize a job with no open slots, or close any job slots for a job that is already prioritized, as either of these actions could lead to a situation where a job is prioritized without people being able to join as it.
    • +
    + +

    05 July 2017

    +

    Purpose2 updated:

    +
      +
    • Anomalies will once again drop cores.
    • +
    + +

    04 July 2017

    +

    Birdtalon updated:

    +
      +
    • Traitor medical chemists can now access syndicate poison bottles.
    • +
    +

    Citinited updated:

    +
      +
    • AIs and cyborgs can now toggle liquid dispensers by ctrl-clicking them, and can make them dispense foam by alt-clicking.
    • +
    +

    Citinited & LightFire53 updated:

    +
      +
    • Adds the plasmaman coroner suit, the plasmaman geneticist suit, and the plasmaman virologist suit. Spooky purple skeletons everywhere rejoice!
    • +
    +

    Fethas updated:

    +
      +
    • Adds medical gowns to medical wardrobes.
    • +
    +

    Fox McCloud updated:

    +
      +
    • Syndicate bombs now have visible timers for observers
    • +
    • Syndicate bombs tick more often
    • +
    • Syndnicate bombs can be deconstructed into plasteel if it is fully defused and has no bomb core
    • +
    • Can make Cryo, Pyro, and time released chemical grenades at R&D
    • +
    • Can make syndicate chemical bombs utilizing crafting
    • +
    • love just got more powerful; it now prevents a mob from being on anything other than help intent
    • +
    • IPCs can now process the love reagent
    • +
    • Adds in radio jammers to the traitor uplink
    • +
    • Adds in breathing tube augment to R&D
    • +
    • Adds in arm toolset augment to R&D
    • +
    • IPC cell charging device is now inside their right arm, as opposed to chest
    • +
    • IPC cell charging device can now be produced in mech fabricators
    • +
    +

    Ionward updated:

    +
      +
    • Greys now have properly fitting sprites for most head clothing items!
    • +
    +

    Kyep updated:

    +
      +
    • Gimmick Teams are now more configurable.
    • +
    +

    Vivalas updated:

    +
      +
    • "Tweaks" SecHUDs to only display criminal status of people if their face is uncovered or they have no ID.
    • +
    + +

    03 July 2017

    +

    Fethas updated:

    +
      +
    • fixes issue with hand teleporter not working in active hands
    • +
    +

    fludd12 updated:

    +
      +
    • Greys are now PROPERLY immune to sulfuric acid.
    • +
    • Greys don't pretend to touch their heads when they don't manage to anymore.
    • +
    + +

    01 July 2017

    +

    Fox McCloud updated:

    +
      +
    • Re-enables object embedding system; embedding objects now cause more damage than before
    • +
    • Adds in throwing stars kit to the traitor uplink
    • +
    • bullets no longer leave shrapnel
    • +
    + +

    30 June 2017

    +

    fludd12 updated:

    +
      +
    • Greys treat Sulfuric Acid as if it were water. They also treat water as if it were sulfuric acid.
    • +
    • Grey language is now Z-level wide, but requires you to be able to put a finger to your temple. (Requires at least one hand not disabled and not stunned.)
    • +
    • Remote Talk is buffed to have a range of two screens, and has some minor formatting changes!
    • +
    • Remote Talk no longer lets you magically know the true name of whoever you speak with.
    • +
    + +

    29 June 2017

    +

    Fox McCloud updated:

    +
      +
    • Fixes limbs being an open wound after augmentation
    • +
    +

    Kluys updated:

    +
      +
    • Bob ross painting in the captains office called "calming painting". +Also changes around the entertainment monitor and light switch to accomodate.
    • +
    • Clown painting was named "\improper mech painting"
    • +
    + +

    28 June 2017

    +

    Fox McCloud updated:

    +
      +
    • Fix's IPC head customization
    • +
    +

    Purpose2 and Re-Opened by Fethas updated:

    +
      +
    • Rare Sentience event, the mice now want coffee!
    • +
    + +

    27 June 2017

    +

    Alexshreds updated:

    +
      +
    • EMPs now disable radios for a period of time
    • +
    +

    Citinited updated:

    +
      +
    • Adds the Rapid Pipe Dispenser (RPD). All Atmospherics Technician lockers and the Chief Engineer's locker get one each.
    • +
    +

    Code Fethas and Sprites Phantasmicdream updated:

    +
      +
    • Fancy Victorian Clothes
    • +
    +

    FlattestGuitar updated:

    +
      +
    • defibs work even if you don't target the chest
    • +
    • Chaplain's soul stone is now opt-in.
    • +
    +

    Fox McCloud updated:

    +
      +
    • Can now augment all non-head limbs with surgery
    • +
    • Can select the company design of a limb by using a robot part in your hands
    • +
    +

    Kyep updated:

    +
      +
    • Gamma ship now looks like a real supply pod/ship, doesn't encourage wizards/vampires to hide in it, and has been updated with a wall-mounted charger and smarter layout.
    • +
    • Fixed a bug causing gamma armory mech recharger to be unusable after gamma alert was declared.
    • +
    • Admins may now spawn 'Gimmick' teams, including Janitorial ERT, Paranormal ERT, and more. Any admin outfit, any mission, spawned anywhere.
    • +
    • Paranormal ERT outfit now exists. It acts like a red security ERT, except with focus on fighting paranormal threats.
    • +
    • Janitorial ERT now gets ERT headset, not centcom headset. Also, they now get a survival box, and a flashlight.
    • +
    • New 'department' shuttle now has more public-access seating.
    • +
    +

    ProperPants updated:

    +
      +
    • Plasmaman virologists now spawn with a medical plasmasuit instead of an assistant one.
    • +
    +

    Purpose2 updated:

    +
      +
    • Water coolers have been fitted with better bolts, enabling them to be loosened and moved.
    • +
    • Antag barbers scissors now have the same name as regular scissors.
    • +
    • AIs door open link is now [O] rather than [OPEN].
    • +
    • The Syndicate once more recognises the Coroner as a member of the medical team for purposes for uplink items.
    • +
    • The chef may now tap into the Syndicate's poison networks for use in his dishes.
    • +
    • The chef's supply crate now comes with another rolling pin. Stop misplacing these.
    • +
    +

    tigercat2000 updated:

    +
      +
    • Karma returned to the Special Verbs tab
    • +
    + +

    26 June 2017

    +

    Crazylemon64 updated:

    +
      +
    • TK can now manipulate adjacent tiles. Use throw mode to override this if you want to move an object a single tile.
    • +
    • TK can now remotely manipulate item stacks.
    • +
    • TK can now remotely operate an RCD
    • +
    • TK now behaves more consistently regarding interacting with various objects remotely
    • +
    +

    Kyep updated:

    +
      +
    • ID card consoles can now be used to prioritize any on-station job, including head jobs and karma jobs.
    • +
    • Playing as a drone now requires 10h of playtime.
    • +
    • Admin-ghosts can now interact with (ie: activate) the drone fab without having to spawn in as engineer to do so.
    • +
    • Prioritized jobs now lose their priority status once all their slots are filled. In the event someone with a formerly prioritized job cryos, the HoP may want to re-prioritize the job.
    • +
    +

    Purpose2 updated:

    +
      +
    • Coroners are more battlehardened, and thus don't throw up around dead bodies anymore.
    • +
    + +

    25 June 2017

    +

    Kyep updated:

    +
      +
    • Trial admins no longer see a permissions error when opening player panel.
    • +
    + +

    24 June 2017

    +

    Allfd updated:

    +
      +
    • Ported growl and howl sounds from Goon
    • +
    • Added growl and howl emotes to Vulpkanin
    • +
    +

    Kyep updated:

    +
      +
    • Activating a dust implant no longer causes NODROP items to drop.
    • +
    +

    Purpose2 updated:

    +
      +
    • The *slap emote now has a cooldown like all other noise making emotes.
    • +
    +

    SamHPurp updated:

    +
      +
    • The Coroner will respect the CMO's Authoritah.
    • +
    + +

    23 June 2017

    +

    Kyep updated:

    +
      +
    • Smite/Bless commands are now restricted to Game Admins. (admins with R_EVENT)
    • +
    • Admins can now access telecomms while ghosted.
    • +
    +

    Vivalas updated:

    +
      +
    • Buckling mobs to beds now displays them correctly.
    • +
    + +

    22 June 2017

    +

    Crazylemon64 updated:

    +
      +
    • Cloners now malfunction if the original comes back to life
    • +
    +

    Purpose2 updated:

    +
      +
    • RCDs can no longer construct multiple airlocks on a single tile
    • +
    + +

    21 June 2017

    +

    tigercat2000 updated:

    +
      +
    • Changelings are now tentacle monsters. Give them a schoolgirl outfit.
    • +
    + +

    20 June 2017

    +

    Purpose2 updated:

    +
      +
    • Fixes Fluorine's non-functionality in plants.
    • +
    + +

    19 June 2017

    +

    Fox McCloud updated:

    +
      +
    • Diona nutrition bar should no longer flicker constantly
    • +
    + +

    18 June 2017

    +

    Citinited updated:

    +
      +
    • Using a screwdriver on a camera console will now deconstruct it instead of opening the camera window.
    • +
    + +

    16 June 2017

    +

    Alffd updated:

    +
      +
    • Makes kittens visible when resting
    • +
    +

    Fethas updated:

    +
      +
    • Public Wiggler Tail
    • +
    • Chaplains have some new clothes in thier locker.
    • +
    +

    Fox McCloud updated:

    +
      +
    • tweaked Revenant and slaughter demon movement speed
    • +
    • Spiderbots have been slowed down to human levels
    • +
    • Spiderbots melee attack consistently deals 2 damage, deals burn, and plays a sparks sound
    • +
    • Spiderbots no longer have a built in camera
    • +
    • Spiderbots now have 40 health (previously 10)
    • +
    • Attacking a spiderbot more consistent with other simple mobs
    • +
    • Healing a spiderbot with a welder now plays a sound and incurs a cooldown
    • +
    • Spiderbots can no longer carry items
    • +
    • Emagging a spiderbot makes it loyal to the person who emagged it. Additionally, it gains 20 extra health, its shocks will do 15 damage, and will explode on death
    • +
    +

    FreeStylaLT updated:

    +
      +
    • Changed Araneus' spawn location so he wouldn't break tables at round-start anymore
    • +
    +

    Kyep updated:

    +
      +
    • HoPs can now set jobs as 'priority'. Priority jobs are highlighted on the latejoin screen. This allows HoPs to proactively broadcast that they need more people to fill those jobs - and reduces the chance of critical crew shortages.
    • +
    +

    Purpose2 updated:

    +
      +
    • Soylen Viridians are now correctly Soylent Viridians. Nanotrasen will still not confirm rumours of the contents of these nor Soylent Greens however.
    • +
    • Nanotrasen is now more consistent with brand management.
    • +
    • An array of typos, grammatical tweaks and other pedantic fixes.
    • +
    • Adds a jobs board to the Newscaster. See what roles are available before seeing the HoP!
    • +
    +

    TullyBurnalot updated:

    +
      +
    • Autopsy Scanners will now print out Coroner Reports when a pen is used on them
    • +
    +

    alexkar598 updated:

    +
      +
    • Rename Spagetti to Spaghetti
    • +
    +

    13 June 2017

    KasparoVy updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 441df3d78e7..2c876084ec4 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -4915,3 +4915,287 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. their cell, as long as their name is entered correctly. - rscadd: Sentences and arresting officers are announced over the security channel by brig timers, as well as the names of those who end timers manually. +2017-06-16: + Alffd: + - bugfix: Makes kittens visible when resting + Fethas: + - tweak: Public Wiggler Tail + - rscadd: Chaplains have some new clothes in thier locker. + Fox McCloud: + - tweak: tweaked Revenant and slaughter demon movement speed + - tweak: Spiderbots have been slowed down to human levels + - tweak: Spiderbots melee attack consistently deals 2 damage, deals burn, and plays + a sparks sound + - tweak: Spiderbots no longer have a built in camera + - tweak: Spiderbots now have 40 health (previously 10) + - tweak: Attacking a spiderbot more consistent with other simple mobs + - tweak: Healing a spiderbot with a welder now plays a sound and incurs a cooldown + - tweak: Spiderbots can no longer carry items + - tweak: Emagging a spiderbot makes it loyal to the person who emagged it. Additionally, + it gains 20 extra health, its shocks will do 15 damage, and will explode on + death + FreeStylaLT: + - tweak: Changed Araneus' spawn location so he wouldn't break tables at round-start + anymore + Kyep: + - rscadd: HoPs can now set jobs as 'priority'. Priority jobs are highlighted on + the latejoin screen. This allows HoPs to proactively broadcast that they need + more people to fill those jobs - and reduces the chance of critical crew shortages. + Purpose2: + - bugfix: Soylen Viridians are now correctly Soylent Viridians. Nanotrasen will + still not confirm rumours of the contents of these nor Soylent Greens however. + - bugfix: Nanotrasen is now more consistent with brand management. + - bugfix: An array of typos, grammatical tweaks and other pedantic fixes. + - rscadd: Adds a jobs board to the Newscaster. See what roles are available before + seeing the HoP! + TullyBurnalot: + - rscadd: Autopsy Scanners will now print out Coroner Reports when a pen is used + on them + alexkar598: + - bugfix: Rename Spagetti to Spaghetti +2017-06-18: + Citinited: + - bugfix: Using a screwdriver on a camera console will now deconstruct it instead + of opening the camera window. +2017-06-19: + Fox McCloud: + - tweak: Diona nutrition bar should no longer flicker constantly +2017-06-20: + Purpose2: + - bugfix: Fixes Fluorine's non-functionality in plants. +2017-06-21: + tigercat2000: + - rscadd: Changelings are now tentacle monsters. Give them a schoolgirl outfit. +2017-06-22: + Crazylemon64: + - rscadd: Cloners now malfunction if the original comes back to life + Purpose2: + - bugfix: RCDs can no longer construct multiple airlocks on a single tile +2017-06-23: + Kyep: + - bugfix: Smite/Bless commands are now restricted to Game Admins. (admins with R_EVENT) + - tweak: Admins can now access telecomms while ghosted. + Vivalas: + - bugfix: Buckling mobs to beds now displays them correctly. +2017-06-24: + Allfd: + - rscadd: Ported growl and howl sounds from Goon + - rscadd: Added growl and howl emotes to Vulpkanin + Kyep: + - bugfix: Activating a dust implant no longer causes NODROP items to drop. + Purpose2: + - tweak: The *slap emote now has a cooldown like all other noise making emotes. + SamHPurp: + - bugfix: The Coroner will respect the CMO's Authoritah. +2017-06-25: + Kyep: + - bugfix: Trial admins no longer see a permissions error when opening player panel. +2017-06-26: + Crazylemon64: + - rscadd: TK can now manipulate adjacent tiles. Use throw mode to override this + if you want to move an object a single tile. + - rscadd: TK can now remotely manipulate item stacks. + - rscadd: TK can now remotely operate an RCD + - bugfix: TK now behaves more consistently regarding interacting with various objects + remotely + Kyep: + - rscadd: ID card consoles can now be used to prioritize any on-station job, including + head jobs and karma jobs. + - rscadd: Playing as a drone now requires 10h of playtime. + - bugfix: 'Admin-ghosts can now interact with (ie: activate) the drone fab without + having to spawn in as engineer to do so.' + - bugfix: Prioritized jobs now lose their priority status once all their slots are + filled. In the event someone with a formerly prioritized job cryos, the HoP + may want to re-prioritize the job. + Purpose2: + - rscadd: Coroners are more battlehardened, and thus don't throw up around dead + bodies anymore. +2017-06-27: + Alexshreds: + - tweak: EMPs now disable radios for a period of time + Citinited: + - rscadd: Adds the Rapid Pipe Dispenser (RPD). All Atmospherics Technician lockers + and the Chief Engineer's locker get one each. + Code Fethas and Sprites Phantasmicdream: + - rscadd: Fancy Victorian Clothes + FlattestGuitar: + - tweak: defibs work even if you don't target the chest + - tweak: Chaplain's soul stone is now opt-in. + Fox McCloud: + - rscadd: Can now augment all non-head limbs with surgery + - rscadd: Can select the company design of a limb by using a robot part in your + hands + Kyep: + - rscadd: Gamma ship now looks like a real supply pod/ship, doesn't encourage wizards/vampires + to hide in it, and has been updated with a wall-mounted charger and smarter + layout. + - bugfix: Fixed a bug causing gamma armory mech recharger to be unusable after gamma + alert was declared. + - rscadd: Admins may now spawn 'Gimmick' teams, including Janitorial ERT, Paranormal + ERT, and more. Any admin outfit, any mission, spawned anywhere. + - rscadd: Paranormal ERT outfit now exists. It acts like a red security ERT, except + with focus on fighting paranormal threats. + - bugfix: Janitorial ERT now gets ERT headset, not centcom headset. Also, they now + get a survival box, and a flashlight. + - tweak: New 'department' shuttle now has more public-access seating. + ProperPants: + - rscadd: Plasmaman virologists now spawn with a medical plasmasuit instead of an + assistant one. + Purpose2: + - rscadd: Water coolers have been fitted with better bolts, enabling them to be + loosened and moved. + - tweak: Antag barbers scissors now have the same name as regular scissors. + - tweak: AIs door open link is now [O] rather than [OPEN]. + - bugfix: The Syndicate once more recognises the Coroner as a member of the medical + team for purposes for uplink items. + - rscadd: The chef may now tap into the Syndicate's poison networks for use in his + dishes. + - rscadd: The chef's supply crate now comes with another rolling pin. Stop misplacing + these. + tigercat2000: + - tweak: Karma returned to the Special Verbs tab +2017-06-28: + Fox McCloud: + - bugfix: Fix's IPC head customization + Purpose2 and Re-Opened by Fethas: + - rscadd: Rare Sentience event, the mice now want coffee! +2017-06-29: + Fox McCloud: + - bugfix: Fixes limbs being an open wound after augmentation + Kluys: + - rscadd: 'Bob ross painting in the captains office called "calming painting". + + Also changes around the entertainment monitor and light switch to accomodate.' + - bugfix: Clown painting was named "\improper mech painting" +2017-06-30: + fludd12: + - tweak: Greys treat Sulfuric Acid as if it were water. They also treat water as + if it were sulfuric acid. + - experiment: Grey language is now Z-level wide, but requires you to be able to + put a finger to your temple. (Requires at least one hand not disabled and not + stunned.) + - tweak: Remote Talk is buffed to have a range of two screens, and has some minor + formatting changes! + - bugfix: Remote Talk no longer lets you magically know the true name of whoever + you speak with. +2017-07-01: + Fox McCloud: + - bugfix: Re-enables object embedding system; embedding objects now cause more damage + than before + - rscadd: Adds in throwing stars kit to the traitor uplink + - rscdel: bullets no longer leave shrapnel +2017-07-03: + Fethas: + - bugfix: fixes issue with hand teleporter not working in active hands + fludd12: + - bugfix: Greys are now PROPERLY immune to sulfuric acid. + - bugfix: Greys don't pretend to touch their heads when they don't manage to anymore. +2017-07-04: + Birdtalon: + - tweak: Traitor medical chemists can now access syndicate poison bottles. + Citinited: + - tweak: AIs and cyborgs can now toggle liquid dispensers by ctrl-clicking them, + and can make them dispense foam by alt-clicking. + Citinited & LightFire53: + - rscadd: Adds the plasmaman coroner suit, the plasmaman geneticist suit, and the + plasmaman virologist suit. Spooky purple skeletons everywhere rejoice! + Fethas: + - rscadd: Adds medical gowns to medical wardrobes. + Fox McCloud: + - rscadd: Syndicate bombs now have visible timers for observers + - rscadd: Syndicate bombs tick more often + - rscadd: Syndnicate bombs can be deconstructed into plasteel if it is fully defused + and has no bomb core + - rscadd: Can make Cryo, Pyro, and time released chemical grenades at R&D + - rscadd: Can make syndicate chemical bombs utilizing crafting + - tweak: love just got more powerful; it now prevents a mob from being on anything + other than help intent + - tweak: IPCs can now process the love reagent + - rscadd: Adds in radio jammers to the traitor uplink + - rscadd: Adds in breathing tube augment to R&D + - rscadd: Adds in arm toolset augment to R&D + - tweak: IPC cell charging device is now inside their right arm, as opposed to chest + - rscadd: IPC cell charging device can now be produced in mech fabricators + Ionward: + - bugfix: Greys now have properly fitting sprites for most head clothing items! + Kyep: + - tweak: Gimmick Teams are now more configurable. + Vivalas: + - bugfix: '"Tweaks" SecHUDs to only display criminal status of people if their face + is uncovered or they have no ID.' +2017-07-05: + Purpose2: + - bugfix: Anomalies will once again drop cores. +2017-07-08: + Citinited: + - bugfix: Rainbow and mime crayons will now change colour as intended. + Fox McCloud: + - tweak: Advanced mop slightly slower at cleaning and holds less reagents, but now + regenerates water if turned on + - bugfix: Blood (on the floor) that has viruses in it will now properly infect you, + if you get near + Kyep: + - bugfix: It is no longer possible to prioritize a job with no open slots, or close + any job slots for a job that is already prioritized, as either of these actions + could lead to a situation where a job is prioritized without people being able + to join as it. +2017-07-10: + AffectedArc07: + - tweak: APC frames now have the correct texture + Birdtalon: + - bugfix: Pool contractors have been back to school and can now spell "safety" on + the controller correctly. + - tweak: Minor change to blob description to address grammar issue. + Citinited: + - bugfix: Superfart once again works ass intended. + Fox McCloud: + - tweak: Radiation poisoning no longer permastuns, but deals burn damage now and + has increased mutation chances + - rscadd: adds in electric guitars + - rscadd: can now craft violins and electric guitars + - rscadd: purchase electric guitars at the cargo store + - rscadd: service borgs now have an electric guitar, too + - tweak: lowered the price of instruments, at cargo store, to 500 + - bugfix: Fixed violins not having an in-hand icon +2017-07-11: + Fethas and tigercat: + - rscadd: blood trails + - rscadd: blood is now eaiser to decrease/increase . + - rscadd: revamps about every method of adding blood to something, floors, walls, + doors, PEOPLE. +2017-07-12: + Fox McCloud: + - bugfix: Fixed advanced scanners showing hidden viruses + - bugfix: Fixed changeling panacea curing beneficial viruses + - rscdel: removed blood decal infections + - tweak: some diseases now bypasse species virus immunity (kuru, TB, and appendicitis) +2017-07-13: + Fox McCloud: + - bugfix: Fixes blood volume and type not showing up properly on health analyzer + - bugfix: Fixes exotic blood names being incorrect + - bugfix: fix examining/checking yourself/others for bleeding/bandaging + - bugfix: Everything that involves bandaging now properly uses the new blood system + - bugfix: Fixes species exotic blood being injected into a mob not increasing their + blood volume (slimes rejoice) + - bugfix: Fixed faked deaths still allowing for bleeding + - bugfix: Fixes IV drips not transferring over the proper amount of blood + - tweak: Embedded objects will cause additional bleeding + - rscadd: Adds in heparin, a drug that can cause bleeding + - tweak: medical stacks can be used multiple times on the same limb + - tweak: Blood depletes in the body a lot faster now, due to blood refactor changes + Shazbot-coding, Driker-Sprites: + - rscadd: Gives the clown their own jug +2017-07-15: + Fox McCloud: + - bugfix: Fixes blood oddities with vampires + Kyep: + - bugfix: Mechs firing missiles no longer cause the missiles to drop at their feet, + as if frozen in midair. + imsxz: + - tweak: Edits the syndicate soft suit helmet's description to match the suit's. +2017-07-16: + KasparoVy: + - bugfix: Fixes a bug with Vampire Shapeshift where you didn't get a name appropriate + to your species and clarifies the ability description. + - bugfix: Fixes a bug with DNA scramblers whereby you wouldn't get a name appropriate + to your species. diff --git a/html/templates/header.html b/html/templates/header.html index bcd9595f02b..fac4d7b280a 100644 --- a/html/templates/header.html +++ b/html/templates/header.html @@ -26,7 +26,7 @@
      Paradise Station

      - Visit our IRC channel: #crew on neko.sneeza.me + Visit our Discord channel:-Click Here- @@ -54,4 +54,4 @@ *** DO NOT FUCK WITH THIS FILE OR YOU WILL CAUSE MERGE CONFLICTS. *** --> -
      \ No newline at end of file +
      diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi index ec06922a07d..b45657fff51 100644 Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi index 28e2fd791ff..855c443a203 100644 Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ diff --git a/icons/effects/fluidtracks.dmi b/icons/effects/fluidtracks.dmi index 810ecc7f265..d4152ea83bc 100644 Binary files a/icons/effects/fluidtracks.dmi and b/icons/effects/fluidtracks.dmi differ diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index cfdcb8afbda..93b0317b0aa 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/custom_synthetic/custom-synthetic.dmi b/icons/mob/custom_synthetic/custom-synthetic.dmi index 29917049c85..08642abaab9 100644 Binary files a/icons/mob/custom_synthetic/custom-synthetic.dmi and b/icons/mob/custom_synthetic/custom-synthetic.dmi differ diff --git a/icons/mob/custom_synthetic/custom_head.dmi b/icons/mob/custom_synthetic/custom_head.dmi index 76ffcedcc82..c66ecb6c8be 100644 Binary files a/icons/mob/custom_synthetic/custom_head.dmi and b/icons/mob/custom_synthetic/custom_head.dmi differ diff --git a/icons/mob/custom_synthetic/custom_lefthand.dmi b/icons/mob/custom_synthetic/custom_lefthand.dmi index 8d469195434..0005ed032e8 100644 Binary files a/icons/mob/custom_synthetic/custom_lefthand.dmi and b/icons/mob/custom_synthetic/custom_lefthand.dmi differ diff --git a/icons/mob/custom_synthetic/custom_righthand.dmi b/icons/mob/custom_synthetic/custom_righthand.dmi index 8d469195434..df64d269aaa 100644 Binary files a/icons/mob/custom_synthetic/custom_righthand.dmi and b/icons/mob/custom_synthetic/custom_righthand.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 3764c64aa50..c67a2b10167 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/inhands/fluff_lefthand.dmi b/icons/mob/inhands/fluff_lefthand.dmi index 209f7660781..417ca1bb107 100644 Binary files a/icons/mob/inhands/fluff_lefthand.dmi and b/icons/mob/inhands/fluff_lefthand.dmi differ diff --git a/icons/mob/inhands/fluff_righthand.dmi b/icons/mob/inhands/fluff_righthand.dmi index d048ff86003..6d4f3a2c76b 100644 Binary files a/icons/mob/inhands/fluff_righthand.dmi and b/icons/mob/inhands/fluff_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index af73dad2906..bccdc57c656 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 8139b523308..e3b242b46f7 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi index c47ca000f0c..4f46db21354 100644 Binary files a/icons/mob/pets.dmi and b/icons/mob/pets.dmi differ diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index 99359f5b079..297f9a9aae2 100644 Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ diff --git a/icons/mob/species/drask/suit.dmi b/icons/mob/species/drask/suit.dmi index 6e608313eda..b323ea5c175 100644 Binary files a/icons/mob/species/drask/suit.dmi and b/icons/mob/species/drask/suit.dmi differ diff --git a/icons/mob/species/drask/uniform.dmi b/icons/mob/species/drask/uniform.dmi index 9dd5a22618c..951a2443fef 100644 Binary files a/icons/mob/species/drask/uniform.dmi and b/icons/mob/species/drask/uniform.dmi differ diff --git a/icons/mob/species/grey/eyes.dmi b/icons/mob/species/grey/eyes.dmi index 929facc86b7..2a1d7c1cd35 100644 Binary files a/icons/mob/species/grey/eyes.dmi and b/icons/mob/species/grey/eyes.dmi differ diff --git a/icons/mob/species/grey/helmet.dmi b/icons/mob/species/grey/helmet.dmi new file mode 100644 index 00000000000..ba1d4f860da Binary files /dev/null and b/icons/mob/species/grey/helmet.dmi differ diff --git a/icons/mob/species/grey/mask.dmi b/icons/mob/species/grey/mask.dmi index 7a64321ed42..d47fd4e7232 100644 Binary files a/icons/mob/species/grey/mask.dmi and b/icons/mob/species/grey/mask.dmi differ diff --git a/icons/mob/species/grey/suit.dmi b/icons/mob/species/grey/suit.dmi index 3d61d72dec8..634acbfbffb 100644 Binary files a/icons/mob/species/grey/suit.dmi and b/icons/mob/species/grey/suit.dmi differ diff --git a/icons/mob/species/grey/uniform.dmi b/icons/mob/species/grey/uniform.dmi index 111efe6de65..fdd6a52144c 100644 Binary files a/icons/mob/species/grey/uniform.dmi and b/icons/mob/species/grey/uniform.dmi differ diff --git a/icons/mob/species/plasmaman/helmet.dmi b/icons/mob/species/plasmaman/helmet.dmi index 125be79a278..258ea305d23 100644 Binary files a/icons/mob/species/plasmaman/helmet.dmi and b/icons/mob/species/plasmaman/helmet.dmi differ diff --git a/icons/mob/species/plasmaman/suit.dmi b/icons/mob/species/plasmaman/suit.dmi index 827146bb24c..3a4720378f7 100644 Binary files a/icons/mob/species/plasmaman/suit.dmi and b/icons/mob/species/plasmaman/suit.dmi differ diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi index c339c15ab18..8c40cb79347 100644 Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ diff --git a/icons/mob/species/vox/uniform.dmi b/icons/mob/species/vox/uniform.dmi index 9324259ff14..6d6ff4abca4 100644 Binary files a/icons/mob/species/vox/uniform.dmi and b/icons/mob/species/vox/uniform.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 03c1180b1dc..89e3eb94136 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index f9bb3b2bbec..02990685d64 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/apc_repair.dmi b/icons/obj/apc_repair.dmi index e2179506dce..4aadcd2ebdc 100644 Binary files a/icons/obj/apc_repair.dmi and b/icons/obj/apc_repair.dmi differ diff --git a/icons/obj/assemblies.dmi b/icons/obj/assemblies.dmi index 2fd457f5638..62a1c314388 100644 Binary files a/icons/obj/assemblies.dmi and b/icons/obj/assemblies.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index b82450ab87a..5c34785d51e 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/species/plasmaman/hats.dmi b/icons/obj/clothing/species/plasmaman/hats.dmi index f4ec02bef2b..bb2fa4120e8 100644 Binary files a/icons/obj/clothing/species/plasmaman/hats.dmi and b/icons/obj/clothing/species/plasmaman/hats.dmi differ diff --git a/icons/obj/clothing/species/plasmaman/suits.dmi b/icons/obj/clothing/species/plasmaman/suits.dmi index 86027617d15..ae07299ff8b 100644 Binary files a/icons/obj/clothing/species/plasmaman/suits.dmi and b/icons/obj/clothing/species/plasmaman/suits.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 669e8dff821..92b77524bc4 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 2a99367e4a4..436d2fa3cea 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi index 639bedfde29..9d8f90d250e 100644 Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi index 13913aae9bd..98da468fc56 100644 Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index afa4f586504..0a142ca7874 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 52eb53ac436..4008e17b3cf 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 283684b9d46..d90a19f00b1 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi index ad8268ad59d..f33135baec6 100644 Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index 9b38b205075..03b8eba0f8c 100644 Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ diff --git a/icons/obj/items_cyborg.dmi b/icons/obj/items_cyborg.dmi new file mode 100644 index 00000000000..cddb57303d2 Binary files /dev/null and b/icons/obj/items_cyborg.dmi differ diff --git a/icons/obj/musician.dmi b/icons/obj/musician.dmi index b5d0526d670..c57114abf63 100644 Binary files a/icons/obj/musician.dmi and b/icons/obj/musician.dmi differ diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 316790998c5..8c3d0f2c81f 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ diff --git a/icons/obj/shards.dmi b/icons/obj/shards.dmi index 1b979682adc..5ce7113bf88 100644 Binary files a/icons/obj/shards.dmi and b/icons/obj/shards.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index ac42a7d538c..cccdb4d16fb 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 83276e5ec57..9f9434f0cbe 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/nano/styles/_formatting.less b/nano/styles/_formatting.less index e8f65be969c..19ff288dd3f 100644 --- a/nano/styles/_formatting.less +++ b/nano/styles/_formatting.less @@ -156,6 +156,11 @@ float: left; } +.jobValues { + float: left; + width: 30%; +} + // CHROMELESS STUFF .fancy { diff --git a/nano/templates/adv_med.tmpl b/nano/templates/adv_med.tmpl index e88db47456a..4aa7bc33fe3 100644 --- a/nano/templates/adv_med.tmpl +++ b/nano/templates/adv_med.tmpl @@ -152,7 +152,6 @@ Used In File(s): \code\game\machinery\adv_med.dm {{if value.status.destroyed}} DESTROYED
      {{/if}} - {{if value.status.bleeding}} external bleeding
      {{/if}} {{if value.internalBleeding}} internal bleeding
      {{/if}} {{if value.lungRuptured}} lung ruptured
      {{/if}} {{if value.status.broken}} {{:value.status.broken}}
      {{/if}} diff --git a/nano/templates/identification_computer.tmpl b/nano/templates/identification_computer.tmpl index da24f3c0e77..d7696b8630e 100644 --- a/nano/templates/identification_computer.tmpl +++ b/nano/templates/identification_computer.tmpl @@ -41,6 +41,7 @@ {{:value.title}}: {{:value.current_positions}}/{{:value.total_positions}} {{:helper.link('-', null, {'choice' : 'make_job_unavailable', 'job' : value.title}, value.can_close == 1 && data.authenticated ? null : 'disabled')}} {{:helper.link('+', null, {'choice' : 'make_job_available', 'job' : value.title}, value.can_open == 1 && data.authenticated ? null : 'disabled')}} + {{:helper.link('*', null, {'choice' : 'prioritize_job', 'job' : value.title}, value.can_prioritize > 0 && data.authenticated ? null : 'disabled')}} {{if value.can_prioritize == 2}}Priority Job {{/if}}
      {{/for}}
      diff --git a/nano/templates/newscaster.tmpl b/nano/templates/newscaster.tmpl index af4edb702ad..c589bde4702 100644 --- a/nano/templates/newscaster.tmpl +++ b/nano/templates/newscaster.tmpl @@ -31,6 +31,7 @@ Property of Nanotrasen

      {{if data.wanted_issue}}
      {{:helper.link('Read Wanted issue', 'exclamation-triangle', {'view_wanted' : 1})}}
      {{/if}} +
      {{:helper.link('View available NT jobs', 'share', {'jobs' : 1})}}
      {{:helper.link('Create feed channel', 'plus', {'create_channel' : 1})}}
      {{:helper.link('View feed channels', 'arrow-right', {'view' : 1})}}
      {{:helper.link('Submit new feed story', 'share', {'create_feed_story' : 1})}}
      @@ -297,5 +298,22 @@ Property of Nanotrasen

      {{:helper.link('Back', 'arrow-left', {'setScreen' : 0})}}
      + {{else data.screen == 12}} +

      CAREERS AT NANOTRASEN

      + Work for a better future.
      +
      + {{for data.jobs}} +
      + {{:value.title}}
      +
      + {{empty}} + No available jobs... + {{/for}} + +
      +
      +
      {{:helper.link('Refresh', 'refresh', {'refresh' : 0})}}
      +
      {{:helper.link('Back', 'arrow-left', {'setScreen' : 1})}}
      +
      {{/if}} {{/if}} \ No newline at end of file diff --git a/nano/templates/ntnet_downloader.tmpl b/nano/templates/ntnet_downloader.tmpl index a64ae3452b2..35790bb3c7f 100644 --- a/nano/templates/ntnet_downloader.tmpl +++ b/nano/templates/ntnet_downloader.tmpl @@ -9,7 +9,7 @@
      Reset Program
      {{:helper.link('RESET', 'times', {'action' : 'PRG_reseterror'})}}
    -{{else}} +{{else}} {{if data.downloadname}}

    Download Running

    @@ -75,7 +75,7 @@ {{if data.hackedavailable}}

    UNKNOWN software repository

    - Please note that NanoTrasen does not recommend download of software from non-official servers. + Please note that Nanotrasen does not recommend download of software from non-official servers. {{for data.hacked_programs}}
    @@ -99,4 +99,4 @@ {{/if}} {{/if}} {{/if}} -
    NTOS v2.0.4b Copyright NanoTrasen 2557 - 2559 \ No newline at end of file +
    NTOS v2.0.4b Copyright Nanotrasen 2557 - 2559 diff --git a/nano/templates/poolcontroller.tmpl b/nano/templates/poolcontroller.tmpl index ba6b0f6ded7..3492aa8f85f 100644 --- a/nano/templates/poolcontroller.tmpl +++ b/nano/templates/poolcontroller.tmpl @@ -13,7 +13,7 @@ Used In File(s): \code\game\machinery\poolcontroller.dm
    - Saftey Status: + Safety Status:
    {{if data.emagged}} diff --git a/nano/templates/rpd.tmpl b/nano/templates/rpd.tmpl new file mode 100644 index 00000000000..bd92b91c979 --- /dev/null +++ b/nano/templates/rpd.tmpl @@ -0,0 +1,112 @@ + +

    Mode:

    +
    + {{for data.mainmenu}} + {{:helper.link(String(value.category), String(value.icon), {"mode": Number(value.mode)}, data.mode == Number(value.mode) ? "linkOn" : null)}} + {{/for}} +
    +{{if data.mode == 1}} +

    Pipe type:

    +
    + {{for data.pipemenu}} + {{:helper.link(String(value.pipecategory), null, {"pipetype": Number(value.pipemode)}, data.pipetype == Number(value.pipemode) ? "linkOn" : null)}} + {{/for}} +
    +

    Available pipes:

    +
    + {{for data.pipelist}} + {{if value.category == data.pipetype}} +
    {{:helper.link(String(value.pipename), "arrow-right", {"whatpipe": Number(value.id)}, data.whatpipe == Number(value.id) ? "linkOn" : null)}}
    + {{/if}} + {{/for}} +
    + {{for data.pipelist}} +
    + {{if value.id == data.whatpipe && value.orientations != 1}} +
    + {{:helper.link("Orient automatically", null, {"iconrotation": 0}, data.iconrotation == 0 ? "linkOn" : null)}} +
    + {{/if}} + {{if value.id == data.whatpipe && value.orientations != 1 && value.bendy != 1}} +
    + {{:helper.link("", "arrow-right", {"iconrotation": 1}, data.iconrotation == 1 ? "linkOn" : null)}} + +
    +
    + {{:helper.link("", "arrow-right", {"iconrotation": 4}, data.iconrotation == 4 ? "linkOn" : null)}} + +
    + {{/if}} + {{if value.id == data.whatpipe && value.orientations == 4 && value.bendy != 1}} +
    + {{:helper.link("", "arrow-right", {"iconrotation": 2}, data.iconrotation == 2 ? "linkOn" : null)}} + +
    +
    + {{:helper.link("", "arrow-right", {"iconrotation": 8}, data.iconrotation == 8 ? "linkOn" : null)}} + +
    + {{/if}} + {{if value.id == data.whatpipe && value.bendy == 1}} +
    + {{:helper.link("", "arrow-right", {"iconrotation": 1}, data.iconrotation == 1 ? "linkOn" : null)}} + +
    +
    + {{:helper.link("", "arrow-right", {"iconrotation": 4}, data.iconrotation == 4 ? "linkOn" : null)}} + +
    +
    + {{:helper.link("", "arrow-right", {"iconrotation": 2}, data.iconrotation == 2 ? "linkOn" : null)}} + +
    +
    + {{:helper.link("", "arrow-right", {"iconrotation": 8}, data.iconrotation == 8 ? "linkOn" : null)}} + +
    + {{/if}} +
    + {{/for}} +{{else data.mode == 2}} +

    Available pipes:

    +
    + {{for data.dpipelist}} +
    {{:helper.link(String(value.pipename), "arrow-right", {"whatdpipe": Number(value.id)}, data.whatdpipe == Number(value.id) ? "linkOn" : null)}}
    + {{/for}} +
    + {{for data.dpipelist}} +
    + {{if value.id == data.whatdpipe && value.orientations != 1}} +
    + {{:helper.link("Orient automatically", null, {"iconrotation": 0}, data.iconrotation == 0 ? "linkOn" : null)}} +
    +
    + {{:helper.link("", "arrow-right", {"iconrotation": 1}, data.iconrotation == 1 ? "linkOn" : null)}} + +
    +
    + {{:helper.link("", "arrow-right", {"iconrotation": 4}, data.iconrotation == 4 ? "linkOn" : null)}} + +
    + {{/if}} + {{if value.id == data.whatdpipe && value.orientations == 4}} +
    + {{:helper.link("", "arrow-right", {"iconrotation": 2}, data.iconrotation == 2 ? "linkOn" : null)}} + +
    +
    + {{:helper.link("", "arrow-right", {"iconrotation": 8}, data.iconrotation == 8 ? "linkOn" : null)}} + +
    + {{/if}} +
    + {{/for}} +{{else data.mode == 3}} +

    Device ready to rotate loose pipes...

    +{{else data.mode == 4}} +

    Device ready to flip loose pipes...

    +{{else data.mode == 5}} +

    Device ready to eat loose pipes...

    +{{/if}} diff --git a/paradise.dme b/paradise.dme index 71edb0e003d..30b34017bcc 100644 --- a/paradise.dme +++ b/paradise.dme @@ -173,7 +173,6 @@ #include "code\controllers\voting.dm" #include "code\controllers\Processes\air.dm" #include "code\controllers\Processes\alarm.dm" -#include "code\controllers\Processes\diseases.dm" #include "code\controllers\Processes\event.dm" #include "code\controllers\Processes\fast_process.dm" #include "code\controllers\Processes\fires.dm" @@ -218,6 +217,7 @@ #include "code\datums\recipe.dm" #include "code\datums\ruins.dm" #include "code\datums\shuttles.dm" +#include "code\datums\soullink.dm" #include "code\datums\spell.dm" #include "code\datums\statclick.dm" #include "code\datums\supplypacks.dm" @@ -732,7 +732,7 @@ #include "code\game\objects\items\devices\flash.dm" #include "code\game\objects\items\devices\flashlight.dm" #include "code\game\objects\items\devices\floor_painter.dm" -#include "code\game\objects\items\devices\guitar.dm" +#include "code\game\objects\items\devices\instruments.dm" #include "code\game\objects\items\devices\laserpointer.dm" #include "code\game\objects\items\devices\lightreplacer.dm" #include "code\game\objects\items\devices\machineprototype.dm" @@ -748,7 +748,6 @@ #include "code\game\objects\items\devices\traitordevices.dm" #include "code\game\objects\items\devices\transfer_valve.dm" #include "code\game\objects\items\devices\uplinks.dm" -#include "code\game\objects\items\devices\violin.dm" #include "code\game\objects\items\devices\whistle.dm" #include "code\game\objects\items\devices\radio\beacon.dm" #include "code\game\objects\items\devices\radio\electropack.dm" @@ -822,6 +821,7 @@ #include "code\game\objects\items\weapons\powerfist.dm" #include "code\game\objects\items\weapons\RCD.dm" #include "code\game\objects\items\weapons\RCL.dm" +#include "code\game\objects\items\weapons\rpd.dm" #include "code\game\objects\items\weapons\RSF.dm" #include "code\game\objects\items\weapons\scissors.dm" #include "code\game\objects\items\weapons\scrolls.dm" @@ -1046,6 +1046,7 @@ #include "code\modules\admin\verbs\dice.dm" #include "code\modules\admin\verbs\freeze.dm" #include "code\modules\admin\verbs\getlogs.dm" +#include "code\modules\admin\verbs\gimmick_team.dm" #include "code\modules\admin\verbs\honksquad.dm" #include "code\modules\admin\verbs\infiltratorteam_syndicate.dm" #include "code\modules\admin\verbs\map_template_loadverb.dm" @@ -1289,6 +1290,7 @@ #include "code\modules\events\prison_break.dm" #include "code\modules\events\radiation_storm.dm" #include "code\modules\events\rogue_drones.dm" +#include "code\modules\events\sentience.dm" #include "code\modules\events\slaughterevent.dm" #include "code\modules\events\spacevine.dm" #include "code\modules\events\spider_infestation.dm" @@ -1945,6 +1947,7 @@ #include "code\modules\projectiles\projectile\magic.dm" #include "code\modules\projectiles\projectile\reusable.dm" #include "code\modules\projectiles\projectile\special.dm" +#include "code\modules\reagents\chem_splash.dm" #include "code\modules\reagents\reagent_containers.dm" #include "code\modules\reagents\reagent_dispenser.dm" #include "code\modules\reagents\chemistry\colors.dm" @@ -2130,20 +2133,24 @@ #include "code\modules\store\items.dm" #include "code\modules\store\store.dm" #include "code\modules\surgery\bones.dm" +#include "code\modules\surgery\cavity_implant.dm" #include "code\modules\surgery\dental_implant.dm" #include "code\modules\surgery\encased.dm" #include "code\modules\surgery\face.dm" #include "code\modules\surgery\generic.dm" #include "code\modules\surgery\helpers.dm" -#include "code\modules\surgery\implant.dm" +#include "code\modules\surgery\implant_removal.dm" +#include "code\modules\surgery\limb_augmentation.dm" #include "code\modules\surgery\limb_reattach.dm" #include "code\modules\surgery\organs_internal.dm" #include "code\modules\surgery\other.dm" +#include "code\modules\surgery\remove_embedded_object.dm" #include "code\modules\surgery\rig_removal.dm" #include "code\modules\surgery\robotics.dm" #include "code\modules\surgery\slime.dm" #include "code\modules\surgery\surgery.dm" #include "code\modules\surgery\tools.dm" +#include "code\modules\surgery\organs\augments_arms.dm" #include "code\modules\surgery\organs\augments_eyes.dm" #include "code\modules\surgery\organs\augments_internal.dm" #include "code\modules\surgery\organs\autoimplanter.dm" diff --git a/sound/eguitar/ab4.ogg b/sound/eguitar/ab4.ogg new file mode 100644 index 00000000000..de291593ee0 Binary files /dev/null and b/sound/eguitar/ab4.ogg differ diff --git a/sound/eguitar/ab5.ogg b/sound/eguitar/ab5.ogg new file mode 100644 index 00000000000..8103ab40234 Binary files /dev/null and b/sound/eguitar/ab5.ogg differ diff --git a/sound/eguitar/ab6.ogg b/sound/eguitar/ab6.ogg new file mode 100644 index 00000000000..220e1571d4c Binary files /dev/null and b/sound/eguitar/ab6.ogg differ diff --git a/sound/eguitar/an4.ogg b/sound/eguitar/an4.ogg new file mode 100644 index 00000000000..250b1b435a0 Binary files /dev/null and b/sound/eguitar/an4.ogg differ diff --git a/sound/eguitar/an5.ogg b/sound/eguitar/an5.ogg new file mode 100644 index 00000000000..54d198d3954 Binary files /dev/null and b/sound/eguitar/an5.ogg differ diff --git a/sound/eguitar/an6.ogg b/sound/eguitar/an6.ogg new file mode 100644 index 00000000000..aacaa90f036 Binary files /dev/null and b/sound/eguitar/an6.ogg differ diff --git a/sound/eguitar/bb4.ogg b/sound/eguitar/bb4.ogg new file mode 100644 index 00000000000..c275fdc0b75 Binary files /dev/null and b/sound/eguitar/bb4.ogg differ diff --git a/sound/eguitar/bb5.ogg b/sound/eguitar/bb5.ogg new file mode 100644 index 00000000000..3d32c5280d4 Binary files /dev/null and b/sound/eguitar/bb5.ogg differ diff --git a/sound/eguitar/bb6.ogg b/sound/eguitar/bb6.ogg new file mode 100644 index 00000000000..c89618326ae Binary files /dev/null and b/sound/eguitar/bb6.ogg differ diff --git a/sound/eguitar/bn4.ogg b/sound/eguitar/bn4.ogg new file mode 100644 index 00000000000..458ea14336a Binary files /dev/null and b/sound/eguitar/bn4.ogg differ diff --git a/sound/eguitar/bn5.ogg b/sound/eguitar/bn5.ogg new file mode 100644 index 00000000000..4bd02b83c3b Binary files /dev/null and b/sound/eguitar/bn5.ogg differ diff --git a/sound/eguitar/bn6.ogg b/sound/eguitar/bn6.ogg new file mode 100644 index 00000000000..c1d1cf5f4b0 Binary files /dev/null and b/sound/eguitar/bn6.ogg differ diff --git a/sound/eguitar/cn4.ogg b/sound/eguitar/cn4.ogg new file mode 100644 index 00000000000..43f43080632 Binary files /dev/null and b/sound/eguitar/cn4.ogg differ diff --git a/sound/eguitar/cn5.ogg b/sound/eguitar/cn5.ogg new file mode 100644 index 00000000000..4a97fdcfad1 Binary files /dev/null and b/sound/eguitar/cn5.ogg differ diff --git a/sound/eguitar/cn6.ogg b/sound/eguitar/cn6.ogg new file mode 100644 index 00000000000..c67fcae46c4 Binary files /dev/null and b/sound/eguitar/cn6.ogg differ diff --git a/sound/eguitar/cn7.ogg b/sound/eguitar/cn7.ogg new file mode 100644 index 00000000000..f193f5b0627 Binary files /dev/null and b/sound/eguitar/cn7.ogg differ diff --git a/sound/eguitar/db4.ogg b/sound/eguitar/db4.ogg new file mode 100644 index 00000000000..ee975d555a2 Binary files /dev/null and b/sound/eguitar/db4.ogg differ diff --git a/sound/eguitar/db5.ogg b/sound/eguitar/db5.ogg new file mode 100644 index 00000000000..6904962cd77 Binary files /dev/null and b/sound/eguitar/db5.ogg differ diff --git a/sound/eguitar/db6.ogg b/sound/eguitar/db6.ogg new file mode 100644 index 00000000000..421b0590492 Binary files /dev/null and b/sound/eguitar/db6.ogg differ diff --git a/sound/eguitar/dn4.ogg b/sound/eguitar/dn4.ogg new file mode 100644 index 00000000000..b6287800fb7 Binary files /dev/null and b/sound/eguitar/dn4.ogg differ diff --git a/sound/eguitar/dn5.ogg b/sound/eguitar/dn5.ogg new file mode 100644 index 00000000000..92f723cff01 Binary files /dev/null and b/sound/eguitar/dn5.ogg differ diff --git a/sound/eguitar/dn6.ogg b/sound/eguitar/dn6.ogg new file mode 100644 index 00000000000..53c2de97d23 Binary files /dev/null and b/sound/eguitar/dn6.ogg differ diff --git a/sound/eguitar/eb4.ogg b/sound/eguitar/eb4.ogg new file mode 100644 index 00000000000..0349b819b33 Binary files /dev/null and b/sound/eguitar/eb4.ogg differ diff --git a/sound/eguitar/eb5.ogg b/sound/eguitar/eb5.ogg new file mode 100644 index 00000000000..40d3c89a90b Binary files /dev/null and b/sound/eguitar/eb5.ogg differ diff --git a/sound/eguitar/eb6.ogg b/sound/eguitar/eb6.ogg new file mode 100644 index 00000000000..dd1fcbc58df Binary files /dev/null and b/sound/eguitar/eb6.ogg differ diff --git a/sound/eguitar/en4.ogg b/sound/eguitar/en4.ogg new file mode 100644 index 00000000000..2ceeafe4d7b Binary files /dev/null and b/sound/eguitar/en4.ogg differ diff --git a/sound/eguitar/en5.ogg b/sound/eguitar/en5.ogg new file mode 100644 index 00000000000..2be8538db7f Binary files /dev/null and b/sound/eguitar/en5.ogg differ diff --git a/sound/eguitar/en6.ogg b/sound/eguitar/en6.ogg new file mode 100644 index 00000000000..5b0a135a789 Binary files /dev/null and b/sound/eguitar/en6.ogg differ diff --git a/sound/eguitar/fn4.ogg b/sound/eguitar/fn4.ogg new file mode 100644 index 00000000000..b23a19278b0 Binary files /dev/null and b/sound/eguitar/fn4.ogg differ diff --git a/sound/eguitar/fn5.ogg b/sound/eguitar/fn5.ogg new file mode 100644 index 00000000000..4caadbee978 Binary files /dev/null and b/sound/eguitar/fn5.ogg differ diff --git a/sound/eguitar/fn6.ogg b/sound/eguitar/fn6.ogg new file mode 100644 index 00000000000..5177ad4dcd9 Binary files /dev/null and b/sound/eguitar/fn6.ogg differ diff --git a/sound/eguitar/gb4.ogg b/sound/eguitar/gb4.ogg new file mode 100644 index 00000000000..aba86ff66c1 Binary files /dev/null and b/sound/eguitar/gb4.ogg differ diff --git a/sound/eguitar/gb5.ogg b/sound/eguitar/gb5.ogg new file mode 100644 index 00000000000..758a83f792a Binary files /dev/null and b/sound/eguitar/gb5.ogg differ diff --git a/sound/eguitar/gb6.ogg b/sound/eguitar/gb6.ogg new file mode 100644 index 00000000000..7caed1f85f6 Binary files /dev/null and b/sound/eguitar/gb6.ogg differ diff --git a/sound/eguitar/gn4.ogg b/sound/eguitar/gn4.ogg new file mode 100644 index 00000000000..9f7a35b3935 Binary files /dev/null and b/sound/eguitar/gn4.ogg differ diff --git a/sound/eguitar/gn5.ogg b/sound/eguitar/gn5.ogg new file mode 100644 index 00000000000..d55d4148815 Binary files /dev/null and b/sound/eguitar/gn5.ogg differ diff --git a/sound/eguitar/gn6.ogg b/sound/eguitar/gn6.ogg new file mode 100644 index 00000000000..4cb5e2c63ee Binary files /dev/null and b/sound/eguitar/gn6.ogg differ diff --git a/sound/goonstation/voice/growl1.ogg b/sound/goonstation/voice/growl1.ogg new file mode 100644 index 00000000000..d5152d9c057 Binary files /dev/null and b/sound/goonstation/voice/growl1.ogg differ diff --git a/sound/goonstation/voice/growl2.ogg b/sound/goonstation/voice/growl2.ogg new file mode 100644 index 00000000000..5c48053ac68 Binary files /dev/null and b/sound/goonstation/voice/growl2.ogg differ diff --git a/sound/goonstation/voice/growl3.ogg b/sound/goonstation/voice/growl3.ogg new file mode 100644 index 00000000000..bcacf2442f0 Binary files /dev/null and b/sound/goonstation/voice/growl3.ogg differ diff --git a/sound/goonstation/voice/howl.ogg b/sound/goonstation/voice/howl.ogg new file mode 100644 index 00000000000..778fd6b2483 Binary files /dev/null and b/sound/goonstation/voice/howl.ogg differ diff --git a/sound/weapons/flashbang.ogg b/sound/weapons/flashbang.ogg new file mode 100644 index 00000000000..389aad77bc2 Binary files /dev/null and b/sound/weapons/flashbang.ogg differ diff --git a/sound/weapons/stringsmash.ogg b/sound/weapons/stringsmash.ogg new file mode 100644 index 00000000000..ea96bc0b50b Binary files /dev/null and b/sound/weapons/stringsmash.ogg differ