diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index c4bcd7b34d2..5a07eb647ca 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -1724,7 +1724,7 @@ "aHh" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/electrical) "aHi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/electrical) "aHj" = (/obj/structure/table,/obj/item/clothing/gloves/color/fyellow,/obj/item/weapon/storage/toolbox/electrical,/obj/item/device/multitool,/obj/item/device/radio/intercom{pixel_x = 25},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/electrical) -"aHk" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/space) +"aHk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "aHl" = (/obj/structure/sign/pods,/turf/simulated/wall,/area/hallway/secondary/entry) "aHm" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plating,/area/engine/engineering) "aHn" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) @@ -3551,7 +3551,6 @@ "bqo" = (/obj/machinery/camera{c_tag = "Starboard Primary Hallway 1"; dir = 2; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west) "bqp" = (/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west) "bqq" = (/obj/machinery/atm{pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west) -"bqr" = (/turf/simulated/floor/plasteel,/area/hallway/primary/starboard) "bqs" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west) "bqt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/engine/gravitygenerator) "bqu" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "green"},/area/hallway/primary/starboard/west) @@ -3559,7 +3558,6 @@ "bqw" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "green"},/area/hallway/primary/starboard/west) "bqx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "bqy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) -"bqz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard) "bqA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "bqB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) "bqC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atm{pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east) @@ -4004,9 +4002,9 @@ "byZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bza" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bzb" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/se) -"bzc" = (/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) +"bzc" = (/obj/machinery/chem_heater,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "bzd" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) -"bze" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) +"bze" = (/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/structure/table/glass,/obj/structure/reagent_dispensers/fueltank/chem{pixel_x = -32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "bzf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "bzg" = (/obj/item/weapon/hand_labeler,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; name = "Chemistry Cleaner"},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "bzh" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/reception) @@ -7722,6 +7720,7 @@ "cSz" = (/obj/machinery/camera{c_tag = "Atmospherics South-East"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/binary/valve/digital/open{name = "Mixed Air Outlet Valve"},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 6},/area/atmos) "cSA" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/atmos) "cSB" = (/turf/simulated/floor/plating/airless,/obj/structure/cable,/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk1"; icon_state = "catwalk1"},/area/solar/starboard) +"cSC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "cSD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering) "cSE" = (/turf/simulated/floor/plating/airless,/area/engine/engineering) "cSF" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 6},/turf/simulated/floor/plating,/area/atmos) @@ -8813,7 +8812,7 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaDEaDGcUCaEDaDEaEFddzaEGaEJaEKazHaELaEMaENaDKaEOazHaxVaxVaxVaxVaxVaxVaxVaCLaxVaEPaEQaERaxVaESaETaEUazHaEOaxVaENaEVaBEaBFaEWbikbikbikbikbikaEXaEYaEZaFaaFbaFcaFdaDMaabaCMaFeaFfaFgaCMaFhazOaFiaFjaFkaFlaABaFnaBPaFoaFpaFqaFraFsaFtaFuaFvaydaFwaFxaFyaFzaFAaCZaDaaDbaFBaEhaFCaFCaFCaEhaEhaFDaFEaFEaFFaEiaFGaFHaFIaFIaFJaFKaFLaFMaChaChaChaChaChaFNaFOaFPaFQbikbikazvayHayHaFRayHaEsaFSayHaFTaFUaFUaFUaFUaFVaFUaFWayHayHayHayHayHayHayHayHayJayIaDCaFXaFYaFYaDCaFZaGaaGbaDCbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaDEaGcaGdaGeaDEaGcaGdaGeaEJaBzazHaGfazHazHazHazHazHaxVaGgaGhaGiaGjaGkaxVaCLaxVaEQaGlaEPaGmaGnaGoaxVaGpaxVaxVaxVaxVaGpaCLaEWbikazyazyazyazyaGqaEYaGraGsaGtaGuaGvaGwaDMaCMaBHaGxaGxaGxaGyaGzaGAaGzaGzaGzaGBaGCaGDaGEaGFaGFaGFaGFaGGaGHaGIaxqaGJazIatsaGKaGLaCZaDaaDbaEgaFCaGMaGMaGNaFCaEhaGOaGPaGPaGQaGRaFGaGSaGTaGUaGVaEhaGWaFQaChaChaChaChaChaFQaGXaGYaFQaabaabayGayHayHayJayJaEsaGZaGZaAiaAiaAiaEsaEsaEsayGaHaaHbayGayJayJayGayJayJayGayGaHcaHdaHeaHfaHgaHhaHiaFXaHjaDCbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaCuaDEaEIaHlaCuaDEaEIaHlaCuaxVaCBaxVaxVaxVaxVaxVazHaxVazHaHnaHoazHazHaxVaCLaxVaHpaabaHpaxVaBvaGoaxVaHqaHraxVaENaBzaxVaAwaDMaDMaHsaHsaHsaHsaHsaHsaHsaHsaHsaGvaGvaGwaHtaHuaHvaHwaHxaHyaHzaHAaHBaHBaHBaHBaHCaHDaHEaHFaHGaHBaHBaHHaHHaHIaHJaHKaHLaHMaHNaGKaHOaHPaHPaDbaEgaFCaHQaHRaHSaFCaEhaGOaGPaGPaGQaHTaFGaGSaGUaGUaGVaEhaGWaFQaChaChaChaChaChaFQaHUaGYaFQbikbikayGaHVayHayHaHWayJaHXazwaHYaHZayKayGaFSayKayGaIaayHayGaIbayHayGaIcaIdaIeaFUaIfaFUaIgaIhaIiaIjaIkaIlaImaDCaDDaDDaacaacaDDaDDaDDaDDaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaIoaHkaIoaIqaIoaIoaIoaIsaItaIuaIuaIuaIuaIvaxVazHaxVaIwaIxaIyazHaIzaGpaCLaxVaxVaxVaxVaxVaxVaGpaxVazHaIyaCBazHazHaGvaIAaIBaICaIDaIDaIDaIDaIEaIDaIDaIFaIGaICaIHaIIaIIaIIaIIaIIaIIaIIaIJaIKaIKaIKaIKaILaIMaIKaINaIKaIOaILaIKaIKaIKaIKaIPaIQaIRaISaITaFzaIUaIVaHPaIWaEgaFCaIXaIYaGMaFCaEhaIZaJaaJaaJbaEiaFGaJcaJdaJdaJeaEhaJfaJgaChaChaChaChaChaJhaJiaJjaFQbikbikayGayHayHayHayHayHayHaIeaFUaFUaFUaFUaFUaFUaFUaCmayHayHayHayHaDzayHayHaDxayHaJkaJlaJmaJnaJoaFYaFYaFYaJpaDCaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaIoaIoaIoaIqaIoaIoaIoaIsaItaIuaIuaIuaIuaIvaxVazHaxVaIwaIxaIyazHaIzaGpaCLaxVaxVaxVaxVaxVaxVaGpaxVazHaIyaCBazHazHaGvaIAaIBaICaIDaIDaIDaIDaIEaIDaIDaIFaIGaICaIHaIIaIIaIIaIIaIIaIIaIIaIJaIKaIKaIKaIKaILaIMaIKaINaIKaIOaILaIKaIKaIKaIKaIPaIQaIRaISaITaFzaIUaIVaHPaIWaEgaFCaIXaIYaGMaFCaEhaIZaJaaJaaJbaEiaFGaJcaJdaJdaJeaEhaJfaJgaChaChaChaChaChaJhaJiaJjaFQbikbikayGayHayHayHayHayHayHaIeaFUaFUaFUaFUaFUaFUaFUaCmayHayHayHayHaDzayHayHaDxayHaJkaJlaJmaJnaJoaFYaFYaFYaJpaDCaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaJqaJraJsaJtaJuaJvaJwaJxaJvaJyaJzaJvaJvaJAaxVazHaxVaJBazHazHaJCaJDaxVaEVaBFazHazHazHazHazHazHaGpaJEazHaxVaEKaEKaDMaJFaDMaJGaJHaJIaJIaJIaJJaJIaJIaJIaJKaJGaJLaJMaJMaJMaJMaJMaJMaJMaGvaIKaJNaJOaJPaJQaJRawxaJTaJUaJVaJWaJXaJOaJYaIKaJZaxqaKaazIaKbaGKaKcaKdaKdaKeaKfaKgaKhaKiaKiaKjaKkaKlaKjaKkaKkaKmaKnaKoaEhaEhaKpaEhaKqaKraChaChaChaChaChaKraCfaCfaCfayGayGayGayKayJayJaAkayGayGaDxayJayGaKsayJayGaAkayGaDxaHVayJayGaAkayGayHaHVaDxayHaKtaDCaKuaIhaKvaKwaKxaIhaKyaDCaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaDEaKzaKAaKzaKBaJraJraKCaKzaKAaKzaKDaKEaKFaKGaxVazHaGpaGpaxVaxVaxVaKHaKHaKHazNaKHaKHaKHaKHaKHaGvaDMaDMaDMaDMaDMaDMaDMaJFaKIaJGbikaabbikaabbikaabbikaabbikaJGaJLaJMaKJaKKaKLaKMaKNaJMaGvaIKaKOaKOaKPaKQaKRaKSaKTaKSaKUaKVaKWaKOaKOaIKaJZaxqaKXazIaKbaGKaGLaCZaDaaDbaEgaKYaKZaLaaLbaLcaLcaLdaLeaLcaLeaLfaLgaLhaLiaLjaLkaLlaCfaKraChaChaChaChaChaKrayGaCtayHaLmaLnayJayGayJaCtayHayGaCtaDxayGaLoayHayGaLpayHayJaLqaLrayGaLsayHayJaAkaAkaDxaAkaLtaDCaLuaIhaLvaLwaLvaIhaLxaDCaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaLyaCuaLzaGdaKzaLAaLBaLCaLDaKzaGdaLEaInaCuaLFaLGaxVazHazHazHazHazHazHaKHaLHaLIaLJaLKaLLaLMaLHaKHaLNaLOaIDaIDaIDaIDaIDaIDaLPaLQaJGaabaLRaLRaLRaLRaLRaLRaLRaabaJGaJLaJMaLSaLTaLUaLVaLSaJMaGvaIKaIKaIKaIKaLWaLXaJOaLYaJOaLXaLZaIKaIKaIKaIKaJZaxqaMaazIaKbaGKaFAaCZaDaaDbaFBaMbaMcaMcaMcaMcaMcaMcaMcaMdaMcaMeaMeaMeaMeaMeaMfayGaCfaKraChaChaChaChaChaKrayGayGayHaMgaLnayJaMhayGayHayHayGayHaDxayJayHayHayGayHayHayJaDxayIayGayHayHayJaMiayHaDxayHaMjaMkaMkaDCaDCaDCaDCaDCaDCaDCaDDaDDaDDaDDaDDaabbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -8836,13 +8835,13 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbqYbqXbqXbqXbqXbqXbqXbqXbqXbqXbqXbqZbraaGdbraaJrbfqbgNblwbimblxblxblxblybimblzbgNblAblBbjWblCblCblCblCblDblCblEbecblFblGblHblHblIblJbcoblKblLblMblNblOblPblQblRblSblRblTblTblTblTblTblUberbeublVblWblXblYblZbmabmbbmcbmdbkBbmebmfbmgbmgbmgbmgbmhbmgbmibmjbmkbmlbmebmmbmnbcEbmobmpbmqbkNbmsbmtaYiaYibjfbmwbnCbmwbmwbmwaRebmwbmwbmvbmvbmwbmwbmxbeMbeMbmybmzbeMbeMbeMbmAbmBbmCaVbbgxbhNbeXbeXbeXbeXbhPbmDaVbbmEbmFbmFbmGbmFbmHbbPbbPbbPbbPbmIbbPbbPbbPbmJblobfgbfgbfgbfgbfgbfgbfgblnbloblpbgHbatbfjbfjbfkbfjbatddEbaAbmLbmMbmNbaAbBQbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbBQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbrcbrbbrebrdbrfbrfbrgbrfbrfbrfbrgbluaInaInaKzbrVbcjbmQbimbmRblxblxblxblybmRbimbgNbmSbmTbjWblCbmUbmVbmWbmXblCbmYbmZbnabcobnbbncbndbnebcobejbnfbngbngbnhbngbngbngbngbnibnjbnjbnjbnkbnjbnlbnmbnnbnobnpbnqbnqbnqbnqbnqbnqbnrbnsbnrbmgbmgbntbnubnvbnwbnxbnybntbnzbmgbnAbnBbnAbnAbnAbnAbnAbnAbnAbmtaYiaYiaMebnEbnDbmwbnGbmwbnFbmwbnIbnHbnJbmwbpjaUTbnKbnLaUTaUTczObnNddybnNaUTaUTaVbbnObnPbnQbnQbnQbnQbnPbnRaVbbnSbmFbmFbmGbnTaRDbnUbnVbnWbnXbnYbnZboabobbocaQbbodaRSboebfgbfgboeaRSbofaQbbogbgHbatbgIbgIbgJbgIbatddDbgKblrblrblrbaAbGVbtmbmKbutbGVbtmbmKbutbGVbtmbmKbutbGVbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbrcbltbltblubltbltbltblvbltbltbtnaabaInboibdFbokbgNbjObjObjObimbolbombonboobgNbopboqbjWblCborblCbosbotblCboubovbowbcobnbbncbndbiCbcobejbnfbngboxboybozboAboBbngboCboDboEboFbnmbnmbnmbnmboGboHboIbnqboJboKboLboMboNboOboPboQbmgboRbnvboSboTboUboTboSbnvboVbmgboWboXboYboZbpabpbbpcbpdbnAbpebpfbpfbpgaMeaMeaMeaMebphbjfbphbpiaMeaURaMeaMeaUTaUTaUTaUTbplbpkbpkbpkbpkbpmbpJaVbbakbpnbakbpobpobakbpnbakaVbbnSbmFbmFbppbnTaRDaRDaRDaRDaRDbjvaRDaRDaRDaRDaQbbpqaQcaQcaQcaQcaQcaQcaQbaQbbprbpsbatbatbatbavbatbatddAbaAbaAbaAbaAbgKbqUddFbmKbmKbmKbmKbmKbmKbmKbmKbmKddGbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaLyaCuaKzaKzaKzaDEaDEaDEaDEaDEaDEbtobpubgNbgNbgNbgNbgNbgNbpvbgNbgNbgNbejbejbpxblCbpybpzbosbpAblCdlEbpCbpBbcobnbbncbndbecbcobejbnfbngbpDbpEbpFboAbpFbngboCbpGbpHbpIbmubpKbpLbnmbpMbpNboIbpObpPbpQbpRbpSbpSbpRbpTbpUbmgbpVbnvbnvbpWbpXboTboSbnvbpYbmkbpZbqabqbbqcbqdbqebqbbqfbnAbqgbqhbqibqjbqkbqlbqmbqnbqnbqnbqnbqnbqnbqobqpbqqbqrbqnbqsbqnbqnbqnbqnbqnbqnbqnbqndcZbqubqvbqvbqvbqvbqvbqvbqwbqlbqxbqybqybqzbqAbqBbqAbqCbqAbqDbqEbqFbqAbqGbqHbqIbqJbqKbqKbqKbqKbqKbqKbqKbqLbqMbqNbqNbqNbqNbqObqNbqPbKnddHbPfddIbiibPfdlbbmKbmKbmKbmKddKbmKddKbmKbmKbmKddGbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaLyaCuaKzaKzaKzaDEaDEaDEaDEaDEaDEbtobpubgNbgNbgNbgNbgNbgNbpvbgNbgNbgNbejbejbpxblCbpybpzbosbpAblCdlEbpCbpBbcobnbbncbndbecbcobejbnfbngbpDbpEbpFboAbpFbngboCbpGbpHbpIbmubpKbpLbnmbpMbpNboIbpObpPbpQbpRbpSbpSbpRbpTbpUbmgbpVbnvbnvbpWbpXboTboSbnvbpYbmkbpZbqabqbbqcbqdbqebqbbqfbnAbqgbqhbqibqjbqkbqlbqmbqnbqnbqnbqnbqnbqnbqobqpbqqbqnbqnbqsbqnbqnbqnbqnbqnbqnbqnbqndcZbqubqvbqvbqvbqvbqvbqvbqwbqlbqxbqybqyaHkbqAbqBbqAbqCbqAbqDbqEbqFbqAbqGbqHbqIbqJbqKbqKbqKbqKbqKbqKbqKbqLbqMbqNbqNbqNbqNbqObqNbqPbKnddHbPfddIbiibPfdlbbmKbmKbmKbmKddKbmKddKbmKbmKbmKddGbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbtpbtqbtqbtqbtqbwpbwpbtqbtqbxZbikaabaInaLAaJtbzPbzObzRbzQbzQbzQbzQbzSbzUbzTbcsbdVbBFbrhblCblCblCbribotblCbcobcobcobcobnbbrjbrkbrlbcobrmbrnbngbrobrpboAbpFbrqbngboCbrrbpHbpIbpIbrsbrtbnmbrubpNboIbpObrvbrwbrxbrybrzbrAbpTbrBbmgbrCbpWbnvbrDbrEbrDbnvbpWbrFbnzbrGbqbbqbbqcbrHbqebqbbrIbnAbrJbqibqibqjbqkbqlbqnbqnbqnbqnbqnbqnbqnbrKbqnbqnbqnbqnbqnbqnbrLbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrNbrObrPbqKbqKbrQbmFbmFbmFbmFbmFbmGbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbrRbmFbrSbrTbatbatbatbatbatbatbatddLbaAbgKbaAbaAbaAbqUddMddOddNbdBddPbdBddPbdBddQddMddObqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCbBHdjhbDDdjidjidjkdjjbtqbxZbjNaInaInaKBbrWbrXbrYbrXbrXbrXbrXbrZbsabsbbcsbcsbscbsdblCbmUbsebsfbpAblCbsgbshbsgbcobcobcobcobsibcobsjbskbngbslbsmbpFbsnbsobngboCbnmbspbpIbpIbpIbsqbnmbsrbpNboIbpObssbrwbrxbstbsubrAbpTbsvbmgbswbsxbnvbsybszbsAboSbsBbsCbsDbsEbsFbsGbsHbsIbsJbqbbsKbnAbsLbsMbqibqjbqkbqlbqnbsNbqnbqnbqnbqnbsObsPbsPbsPbsPbsQbqnbqnbqnbqnbsRbqnbsNbsSbqnbsTbsUbsVbqnbsWbsXbsXbsYbsZbtabtbbmFbmFbmFbmFbmFbmFbmFbtcbtdbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbtebtfbtfbtgddSddRddUddTddTddTddTddVddWbaAaabbikbikaabbqUddXddZddYdeabqUbikbqUdecdebdecdecbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCdjldjidjidjidjidjidjidjideHdjnaGddjnaJrbtrbrXbtsbttbtubtvbtwbrZbtxbtybtzbtzbtAbtBblCblCblCbosbtCborbcsbcsbcsbcsbtDbejbejbskbejbsjbskbngbtEbtFbtGbtHboAbngbtIbnmbtJbpIbpIbpIbtKbtLbtMbpNbtNbnqbtObtPbpRbpRbpRbpRbpTbtQbmgbtRbtSbmgbmgbmgbmgbmgbmgbmgbnzbnAbtTbtUbtVbtWbtXbtYbtZbnAbvubuabuabucbucbucbucbucbucbucbudbudbuebufbugbugbufbuebudbudbuhbuhbuhbuhbuhbuhbuibuibujbuibuibuibuibuibukafkbumbunbmFbmFbuobuobupbupbupbupbupbuqbtfbtfbtebtfbmFbtfbtfbtfbtfburbusbusbusbusdedbuubuubuubuubuubuubuubuubuubikbikbikbikbdBddYddYddYdeebqUbikbqUdefdebdebdegbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCdjodjpdjpdjidjpdjpdjpbtqdjqaInaInaInaKBbuvbrXbuwbuxbuxbuxbuybrZbejbuzbuAbuBbuCbuDblCbmUbuEbosbuFborbuGbuHbuIbuJbuKbuLbuLbuMbuLbuNbuObngbuPbuQbuRbuSbuTbuUbuVbnmbuWbpIbpIbuXbuYbuZbtMbpNbvabnqbvbbvcbvdbvebvfbvgbvhbnqbnqbvibvjbvkbvlbvmbvlbvnbvjbikbvobnAbvpbvqbvrbvsbtXbqbbvtbnAbxebvwbxfbucbvxbvybvzbvAbvBbvCbvDbvEbvFbvGbvHbvHbvGbvIbvJbvKbuhbvLbvMbvNbvObuhbvPbvQbvRbvSbvTbvUbvUbvVbukafNbvXbvYbvZbvYbwabwabupbwbbwcbwdbupbwebwfbwebupbwgbtfburbusbwhbwibwhbusbwjbwkbusdeicngbxXbwobikbikbikbikbikbikbikbikbikbikbqUddXddZddYdejbqUbikbqUdekdekdekdekbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCdjodjpdjpdjidjpdjpdjpbtqdjqaInaInaInaKBbuvbrXbuwbuxbuxbuxbuybrZbejbuzbuAbuBbuCbuDblCbmUbuEbosbuFborbuGbuHbuIbuJbuKbuLbuLbuMbuLbuNbuObngbuPbuQbuRbuSbuTbuUbuVbnmbuWbpIbpIbuXbuYbuZbtMbpNbvabnqbvbbvcbvdbvebvfbvgbvhbnqbnqbvibvjbvkbvlbvmbvlbvnbvjbikbvobnAbvpbvqbvrbvsbtXbqbbvtbnAbxebvwbxfbucbzcbvybvzbvAbvBbvCbvDbvEbvFbvGbvHbvHbvGbvIbvJbvKbuhbvLbvMbvNbvObuhbvPbvQbvRbvSbvTbvUbvUbvVbukafNbvXbvYbvZbvYbwabwabupbwbbwcbwdbupbwebwfbwebupbwgbtfburbusbwhbwibwhbusbwjbwkbusdeicngbxXbwobikbikbikbikbikbikbikbikbikbikbqUddXddZddYdejbqUbikbqUdekdekdekdekbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjrbtqbtqbtqbtqbtqbtqbtqbtqdjqbikbikaInbwqbdFbwrbrXbwsbrXbwtbuxbwubwvbrZbwwbwxbwybwzbuDblCblCblCblCblCblCbwAbwBbwCbwDbwEbngbngbngbngbngbngbngbwFbngbngbngbwGbngbwHbwIbwJbpIbpIbpIbwKbtLbwLbpNbwMbnqbwNbvcbnrbnrbnrbnqbwObnqbwPbwQbwRbwSbwTbwUbwVbwWbwXbwYbwZbnAbxabqbbxbbxcbtXbxdbqbbnAbzbbxgbANbucbxhbxibxjbxkbxlbxmbxnbvHbvHbvHbvHbvHbvHbvHbvHbxobxpbxqbxrbxsbxtbuhbxubxvbxwbxxbxybxzbxvbxAbukbDdbvXbxCbxDbxEbxFbxFbxGbxHbxIbxJbxKbxLbxMbxNbupbxObxPbxQbusbxRbxSbxTbxUbxUbxVbusbxWbxXbxYbwobikbikbikbikbikbikbikbikbikbikbDybtldemdemdemdenbikdeodepdepdepbtlbDzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaLyaCuaKzaKzaInaInaInaInaInaInaInaKBaJrbyabrXbybbycbydbyebyebyfbygbyhbyibyibyjbykbtzbtzbtzbtzbtzbtzbylbymbymbynbyobngbypbyqbyrbysbytbyubyvbywbngbyxbyybyzbuVbtLbwJbpIbpIbyAbnmbnmbyBbyCbyDbyEbyFbyGbyHbyIbyJbyKbyLbyMbyNbyObwXbyPbyQbyPbyQbyRbwXbwYbySbyTbyUbyVbyWbyXbyYbyZbzabyTbAObvwbvwbucbzcbzdbzebzfbzgbucbxnbvHbvHbvHbvHbvHbvHbvHbzhbzibzjbzkbzlbxqbzmbuhbznbzobzpbxxbxAbxzbzqbzrbukbIbbztbzubzvbzvbzwbzxbzybzzbzAbzAbzAbzBbzAbzCbzDbzEbzFbzGbzHbzIbzJbzKbzKbzKbzLbusbzMbxXbzNbwobikbikbikbikbikbikbikbikbikbikbikbDyderderderbDzbikbDyderderderbDzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaLyaCuaKzaKzaInaInaInaInaInaInaInaKBaJrbyabrXbybbycbydbyebyebyfbygbyhbyibyibyjbykbtzbtzbtzbtzbtzbtzbylbymbymbynbyobngbypbyqbyrbysbytbyubyvbywbngbyxbyybyzbuVbtLbwJbpIbpIbyAbnmbnmbyBbyCbyDbyEbyFbyGbyHbyIbyJbyKbyLbyMbyNbyObwXbyPbyQbyPbyQbyRbwXbwYbySbyTbyUbyVbyWbyXbyYbyZbzabyTbAObvwbvwbucbzebzdcSCbzfbzgbucbxnbvHbvHbvHbvHbvHbvHbvHbzhbzibzjbzkbzlbxqbzmbuhbznbzobzpbxxbxAbxzbzqbzrbukbIbbztbzubzvbzvbzwbzxbzybzzbzAbzAbzAbzBbzAbzCbzDbzEbzFbzGbzHbzIbzJbzKbzKbzKbzLbusbzMbxXbzNbwobikbikbikbikbikbikbikbikbikbikbikbDyderderderbDzbikbDyderderderbDzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjtdjsdjuaIoaIoaIobdFaJraJrbrXbzVbrXbzWbzXbzYbzZbrXbcsbAabAabAbbAcbAbbAbbAbbAcbAbbcsbcsbngbngbngbAdbngbAebAebAebAebAebAebyvbAfbAgbAhbAibAjbAkbAlbAmbAnbAobApbAqbArbAsbAtbAubAvbAwbAwbAxbAybAzbAAbABbACbADbAEbvjbAFbwVbAGbwTbAHbvjbikbAIbAJbAKbALbAJbAJbAJbAJbAMbnAbCBbvwbCCbAPbAQbARbASbATbAUbucbAVbAWbAXbAYbAZbBabBbbBcbvHbBdbuhbBebzlbBfbBgbuhbBhbBibxwbxxbxAbxzbxvbxAbukbDdbvXbBjbBkbBlbBmbBnbBobBpbBqbBrbBsbBtbBubBvbupbBwbBxbBybusbBzbBAbBBbxUbBCbBDbusbzMbxXbBEbwobikbikbikbikaabaabaabaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjwdjvdjuaJqaJqbBIbBJaJqbBKbrXbBLbycbBMbBNbBObBPbrXbikaabaabdetdesdesdesdesdesdeubikbikbBRbBSbBTbBUbBVbAebAebAebAebAebAebBWbBXbBYbBZbCabCbbCcbCdbnmbnmbCebCfbnmbnmbCgbChbCibCjbCkbClbClbCmbClbCnbCobCpbCqbAEbvjbCrbvlbvlbvlbCsbvjbikbAIbAJbCtbCubCvbCwbCxbCybCzbCAbEsbvwbEtbucbvxbCDbCEbCFbCGbCHbCIbCJbCKbCLbCMbCNbCObCPbCQbCRbCSbCTbzlbCUbCVbuhbCWbCXbCYbCZbDabDbbDcbvVbukbIcbDebDfbDgbDgbDhbDibDjbDkbDlbDmbDnbDobDpbDqbupbDrbBxbDsbusbDtbDubDvbxUbxUbDwbusbxWbxXbDxbwobikbikbikbikaabbDAbFfbDBbFfbDBbFfbFgaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjudjubDEaInaInaLyaCubDFbDGbrXbDHbycbycbycbrXbrXbrXbikbikbikdewdevdevdexdevdevdewbikbikbBRbDIbAebDJbDKbDKbDKbDKbDKbDLbDMbDKbDNbDObDPbDQbDRbDSbDTbnmbDUbpIbDVbDWbtLbDXbDYbDZbCjbCjbCpbEabEbbEcbEdbEebCpbvibAEbvjbEfbEgbEhbqtbEjbvjbikbEkbAJbElbEmbEnbEobEpbEobEqbErbFWbvwbHBbucbEubEubEvbEwbExbEybEzbEAbEBbECbEDbEDbEEbEFbEGbEHbuhbCTbEIaJSbuhbuhbuibEKbELbEMbuibukbukbukbENbIdbvXbEPbBkbBlbEQbDgbDjbERbESbESbETbxJbEUbEVbEWbEXbxPbEYbusbEZbFabxUbFbbFcbFdbusbzMbFebwobwobikbikbikbikaabbFhbFjbFibGSbFkbGTbFhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index 020f1c9bfbb..562e99420c0 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -184,7 +184,11 @@ "dB" = (/obj/structure/table/holotable,/obj/item/clothing/suit/armor/riot/knight/blue,/obj/item/clothing/head/helmet/knight/blue,/obj/item/weapon/holo/claymore/blue,/turf/simulated/floor/holofloor{dir = 2; icon_state = "blue"},/area/holodeck/source_knightarena) "dC" = (/obj/structure/table/holotable,/turf/simulated/floor/holofloor{dir = 10; icon_state = "blue"},/area/holodeck/source_knightarena) "dD" = (/obj/structure/table/holotable,/obj/machinery/readybutton{pixel_y = 0},/turf/simulated/floor/holofloor{dir = 6; icon_state = "blue"},/area/holodeck/source_knightarena) +"dE" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/restraints/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source) +"dF" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/restraints/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source) "dG" = (/turf/simulated/floor/holofloor{tag = "icon-asteroid1 (EAST)"; icon_state = "asteroid1"; dir = 4},/area/holodeck/source_desert) +"dH" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/restraints/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) +"dI" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/restraints/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) "dK" = (/obj/structure/stool/bed,/turf/unsimulated/floor{icon_state = "panelscorched"},/area/prison/solitary) "dL" = (/obj/structure/stool/bed,/obj/effect/decal/cleanable/cobweb,/turf/unsimulated/floor{name = "plating"},/area/prison/solitary) "dN" = (/turf/simulated/floor/holofloor{tag = "icon-asteroid3 (EAST)"; icon_state = "asteroid3"; dir = 4},/area/holodeck/source_desert) @@ -391,8 +395,6 @@ "iC" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (NORTH)"; icon_state = "propulsion"; dir = 1},/turf/space,/area/shuttle/syndicate_elite/mothership) "iD" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l (NORTH)"; icon_state = "propulsion_l"; dir = 1},/turf/space,/area/shuttle/syndicate_elite/mothership) "iE" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/syndicate_elite/mothership) -"iJ" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source) -"iK" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source) "iL" = (/obj/structure/bookcase{name = "bookcase (Tactics)"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "iM" = (/obj/item/device/radio/intercom/syndicate{pixel_x = 28},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "iN" = (/obj/structure/table/woodentable,/obj/item/trash/tray,/obj/item/weapon/paper/spells,/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/wizard_station) @@ -1167,11 +1169,9 @@ "HZ" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "white"},/area/tdome) "Ia" = (/obj/item/device/camera,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) "Ib" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"Ic" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) "Id" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (WEST)"; icon_state = "fakewindows"; dir = 8},/area/tdome) "Ie" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (WEST)"; icon_state = "fakewindows2"; dir = 8},/area/tdome) "If" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (EAST)"; icon_state = "fakewindows"; dir = 4},/area/tdome) -"Ig" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) "Ih" = (/obj/machinery/door/poddoor{id_tag = "thunderdomeaxe"; name = "Axe Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) "Ii" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/energy/sword/saber/red,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) "Ij" = (/obj/machinery/door/poddoor{id_tag = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) @@ -1248,7 +1248,7 @@ ckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckck ckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbZhzhzhzhzhzbZhzhzhzhzhzbZhzhzhzhzhzbZ ckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihihihihihihihihihihihihaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNatatatatataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN ckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihiiijikiliminihioipiqihaNaNirisisisisisitaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNatauauauataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbZbZbZbZbZbZbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbZbZbZbZbZbZbZaNaNaNaNaN -ckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihikikikikikikikixiyizihaNaNisiAiBiCiDiEitaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNatauayauataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbZiJiJiJiJiJbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZiKiKiKiKiKbZaNaNaNaNaN +ckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihikikikikikikikixiyizihaNaNisiAiBiCiDiEitaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNatauayauataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbZdEdEdEdEdEbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZdFdFdFdFdFbZaNaNaNaNaN ckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihiLiLikikikiMihiNiOiPihaNaNisiQiRiRiRiQititititaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNatauauauataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbZbZbZiZiZiZiZiZjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaiZiZiZiZiZbZbZbZaNaNaN ckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihikikikikjdjdihihjeihihaNaNisiQjfjfjfiQitjgjhitaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNatatatatataFaGaGaGaGaGaGaGaHatataIatataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbZjljmbZbZbZbZbZjnjojpjpjpjpjpjpjpjpjpjpjpjpjpjqjnbZbZbZbZbZjmjrbZaNaNaN ckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihjAjAikjBjCjDihjEjejFihaNaNisiQjGjHjIiQititititititititititititaNaNaNaNaNaNaNaNaNaNaNataJaJaJaKauauauauauauauauaKaKaKauaJataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbZjljmbZbZbZbZbZjnjojpjpjpjpjpjpjpjpjpjpjpjpjpjqjnbZbZbZbZbZjmjrbZaNaNaN @@ -1455,7 +1455,7 @@ aNaNaNaNaNHjHxHyHyHyHyHzHjHEHFHGHFHHHIHJHJHJHIHHHJHHHJHKHjaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNHjHRHyHyHyHyHSHjHJHTHTHTHTHTHJHJHJHTHTHTHTHTHUHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDwDwGZHVHWDADwDwDwDwEnaNDIDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNHjHRHXHYHYHyHyHZHJHJHJIaHJHJHJHJHJHJHJIaHJHJHJHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNEMDAGXIbDAEnaNaNaNaNaNEfDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNHjHjHjHjHjHjHjHjHJHTHTHTHTHTHJHJHJHTHTHTHTHTHJHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwEnaNDtDxDyDyDzGaDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNHjIcIcIcIcIcHjIdIeIeIeIeIeIeIeIeIeIeIeIeIeIfHjIgIgIgIgIgHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNHjdHdHdHdHdHHjIdIeIeIeIeIeIeIeIeIeIeIeIeIeIfHjdIdIdIdIdIHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNHjHjHjIhIhIhIhIhjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaIhIhIhIhIhHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfDKDKDKDKDKDKFkDAEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNHjIiIjIkIkIkIkIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIoIoIoIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDMIqDMDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNHjIiIjIkIrIkIrIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIsIoIsIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAItDKDKDKIuDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 47ed53749bc..09e205a3316 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -7,8 +7,8 @@ reenter_corpse() // (cloning scanner, body bag, closet, mech, etc) return // seems legit. - // Things you might plausibly want to follow - if((ismob(A) && A != src) || istype(A,/obj/machinery/bot) || istype(A,/obj/singularity)) + // Follow !!ALL OF THE THINGS!! + if(istype(A, /atom/movable) && A != src) ManualFollow(A) // Otherwise jump diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 2c4273b2c23..a70875a7090 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -164,14 +164,22 @@ proc/get_id_photo(var/mob/living/carbon/human/H) if(H.species.bodyflags & HAS_SKIN_COLOR) preview_icon.Blend(rgb(H.r_skin, H.g_skin, H.b_skin), ICON_ADD) - var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = H.species ? H.species.eyes : "eyes_s") - eyes_s.Blend(rgb(H.r_eyes, H.g_eyes, H.b_eyes), ICON_ADD) + var/icon/face_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "bald_s") + if(!(H.species.bodyflags & NO_EYES)) + var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = H.species ? H.species.eyes : "eyes_s") + eyes_s.Blend(rgb(H.r_eyes, H.g_eyes, H.b_eyes), ICON_ADD) + face_s.Blend(eyes_s, ICON_OVERLAY) var/datum/sprite_accessory/hair_style = hair_styles_list[H.h_style] if(hair_style) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") - hair_s.Blend(rgb(H.r_hair, H.g_hair, H.b_hair), ICON_ADD) - eyes_s.Blend(hair_s, ICON_OVERLAY) + // I'll want to make a species-specific proc for this sooner or later + // But this'll do for now + if(H.get_species() == "Slime People") + hair_s.Blend(rgb(H.r_skin, H.g_skin, H.b_skin, 160), ICON_ADD) + else + hair_s.Blend(rgb(H.r_hair, H.g_hair, H.b_hair), ICON_ADD) + face_s.Blend(hair_s, ICON_OVERLAY) //Head Accessory if(H.species.bodyflags & HAS_HEAD_ACCESSORY) @@ -179,13 +187,16 @@ proc/get_id_photo(var/mob/living/carbon/human/H) if(head_accessory_style && head_accessory_style.species_allowed) var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s") head_accessory_s.Blend(rgb(H.r_headacc, H.g_headacc, H.b_headacc), ICON_ADD) - eyes_s.Blend(head_accessory_s, ICON_OVERLAY) + face_s.Blend(head_accessory_s, ICON_OVERLAY) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[H.f_style] if(facial_hair_style && facial_hair_style.species_allowed) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") - facial_s.Blend(rgb(H.r_facial, H.g_facial, H.b_facial), ICON_ADD) - eyes_s.Blend(facial_s, ICON_OVERLAY) + if(H.get_species() == "Slime People") + facial_s.Blend(rgb(H.r_skin, H.g_skin, H.b_skin, 160), ICON_ADD) + else + facial_s.Blend(rgb(H.r_facial, H.g_facial, H.b_facial), ICON_ADD) + face_s.Blend(facial_s, ICON_OVERLAY) //Markings if(H.species.bodyflags & HAS_MARKINGS) @@ -193,9 +204,9 @@ proc/get_id_photo(var/mob/living/carbon/human/H) if(marking_style && marking_style.species_allowed) var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s") markings_s.Blend(rgb(H.r_markings, H.g_markings, H.b_markings), ICON_ADD) - eyes_s.Blend(markings_s, ICON_OVERLAY) + face_s.Blend(markings_s, ICON_OVERLAY) - preview_icon.Blend(eyes_s, ICON_OVERLAY) + preview_icon.Blend(face_s, ICON_OVERLAY) var/icon/clothes_s = null @@ -330,11 +341,10 @@ proc/get_id_photo(var/mob/living/carbon/human/H) else clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s") clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if(!H.species.bodyflags & NO_EYES) - preview_icon.Blend(eyes_s, ICON_OVERLAY) + preview_icon.Blend(face_s, ICON_OVERLAY) // Why do we do this twice if(clothes_s) preview_icon.Blend(clothes_s, ICON_OVERLAY) - qdel(eyes_s) + qdel(face_s) qdel(clothes_s) return preview_icon diff --git a/code/datums/spells/mind_transfer.dm b/code/datums/spells/mind_transfer.dm index 90b6f25ab4d..6d7b0539fb1 100644 --- a/code/datums/spells/mind_transfer.dm +++ b/code/datums/spells/mind_transfer.dm @@ -42,6 +42,10 @@ Also, you never added distance checking after target is selected. I've went ahea user << "They appear to be catatonic. Not even magic can affect their vacant mind." return + if(user.suiciding) + user << "You're killing yourself! You can't concentrate enough to do this!" + return + if(target.mind.special_role in protected_roles) user << "Their mind is resisting your spell." return diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 3523a69bf9c..b9311f76992 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -524,6 +524,27 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine cost = 10 containername = "singularity generator crate" +/datum/supply_packs/engineering/engine/tesla + name = "Energy Ball Generator Crate" + contains = list(/obj/machinery/the_singularitygen/tesla) + cost = 10 + containername = "energy ball generator crate" + +/datum/supply_packs/engineering/engine/coil + name = "Tesla Coil Crate" + contains = list(/obj/machinery/power/tesla_coil, + /obj/machinery/power/tesla_coil, + /obj/machinery/power/tesla_coil) + cost = 10 + containername = "tesla coil crate" + +/datum/supply_packs/engineering/engine/grounding + name = "Grounding Rod Crate" + contains = list(/obj/machinery/power/grounding_rod, + /obj/machinery/power/grounding_rod) + cost = 10 + containername = "grounding rod crate" + /datum/supply_packs/engineering/engine/collector name = "Collector Crate" contains = list(/obj/machinery/power/rad_collector, diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index a1a5d646544..d96e3376b53 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -16,8 +16,6 @@ return 0 if(iscultist(mind.current)) return 1 //If they're already in the cult, assume they are convertable - if(jobban_isbanned(mind.current, "cultist") || jobban_isbanned(mind.current, "Syndicate")) - return 0 if(ishuman(mind.current) && (mind.assigned_role in list("Captain", "Chaplain"))) return 0 if(ishuman(mind.current)) @@ -186,6 +184,9 @@ cult += cult_mind add_cult_viewpoint(cult_mind.current) update_cult_icons_added(cult_mind) + cult_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the cult!" + if(jobban_isbanned(cult_mind.current, ROLE_CULTIST)) + replace_jobbaned_player(cult_mind.current, ROLE_CULTIST, ROLE_CULTIST) return 1 diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index b9c678c74f7..08e8f74b312 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -445,4 +445,17 @@ proc/get_nt_opposed() for(var/obj/machinery/nuclearbomb/bomb in world) if(bomb && bomb.r_code && bomb.z == ZLEVEL_STATION) nukecode = bomb.r_code - return nukecode \ No newline at end of file + return nukecode + +/datum/game_mode/proc/replace_jobbaned_player(mob/living/M, role_type, pref) + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as a [role_type]?", "[role_type]", null, pref, 100) + var/mob/dead/observer/theghost = null + if(candidates.len) + theghost = pick(candidates) + M << "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!" + message_admins("[key_name_admin(theghost)] has taken control of ([key_name_admin(M)]) to replace a jobbanned player.") + M.ghostize() + M.key = theghost.key + else + message_admins("[M] ([M.key] has been converted into [role_type] with an active antagonist jobban for said role since no ghost has volunteered to take their place.") + M << "You have been converted into [role_type] with an active jobban. Any further violations of the rules on your part are likely to result in a permanent ban." \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index 6926c7f6067..a1ee69ac9b7 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -26,6 +26,13 @@ if(M.mind && (istype(M, /mob/dead/observer))) M << "Thought-speech, [src] -> [B.truename]: [message]" +/mob/living/captive_brain/say_understands(var/mob/other, var/datum/language/speaking = null) + var/mob/living/simple_animal/borer/B = src.loc + if(!istype(B)) + log_to_dd("Trapped mind found without a borer!") + return 0 + return B.host.say_understands(other, speaking) + /mob/living/captive_brain/emote(var/message) return @@ -243,6 +250,8 @@ set name = "Secrete Chemicals (30)" set desc = "Push some chemicals into your host's bloodstream." + var/injection_amount = 9 + var/chem_cost = 30 if(!host) src << "You are not inside a host body." return @@ -254,17 +263,24 @@ src << "\blue You are feeling far too docile to do that." return - if(chemicals < 30) + if(chemicals < chem_cost) src << "You don't have enough chemicals!" - var/chem = input("Select a chemical to secrete.", "Chemicals") as null|anything in list("mannitol","styptic_powder","methamphetamine","sal_acid") - if(!chem || chemicals < 30 || !host || controlling || !src || stat) //Sanity check. + var/chem = input("Select a chemical to secrete.", "Chemicals") as null|anything in list("mannitol","salglu_solution","methamphetamine", "hydrocodone", "spaceacillin", "mitocholide", "charcoal", "salbutamol", "capulettium_plus") + + if(!chem || chemicals < chem_cost || !host || controlling || !src || stat) //Sanity check. return - src << "\red You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream." - host.reagents.add_reagent(chem, 9) - chemicals -= 30 + var/chem_amount = host.reagents.get_reagent_amount(chem) + var/datum/reagent/R = chemical_reagents_list[chem] + if(R.overdose_threshold && chem_amount + injection_amount > R.overdose_threshold) + src << "Doing so would cause grievous harm to your host, reducing ability to reproduce. Aborting." + return + + src << "You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream." + host.reagents.add_reagent(chem, injection_amount) + chemicals -= chem_cost /mob/living/simple_animal/borer/verb/release_host() set category = "Alien" diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 74e81484c97..7d3176a7348 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -225,6 +225,8 @@ rev_mind.current << "\red You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!" rev_mind.special_role = "Revolutionary" update_rev_icons_added(rev_mind) + if(jobban_isbanned(rev_mind.current, ROLE_REV)) + replace_jobbaned_player(rev_mind.current, ROLE_REV, ROLE_REV) return 1 ////////////////////////////////////////////////////////////////////////////// //Deals with players being converted from the revolution (Not a rev anymore)// // Modified to handle borged MMIs. Accepts another var if the target is being borged at the time -- Polymorph. diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 551fb869839..a11fd4a5fa6 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -155,6 +155,8 @@ Made by Xhuis new_thrall_mind.current << "Your body has been irreversibly altered. The attentive can see this - you may conceal it by wearing a mask." new_thrall_mind.current << "Though not nearly as powerful as your masters, you possess some weak powers. These can be found in the Thrall Abilities tab." new_thrall_mind.current << "You may communicate with your allies by speaking in the Shadowling Hivemind (:8)." + if(jobban_isbanned(new_thrall_mind.current, ROLE_SHADOWLING)) + replace_jobbaned_player(new_thrall_mind.current, ROLE_SHADOWLING, ROLE_SHADOWLING) return 1 diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 40da7a5bca3..7d304204613 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -203,6 +203,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha var/list/powers = list() // list of available powers and passives, see defines in setup.dm var/mob/living/carbon/human/draining // who the vampire is draining of blood var/nullified = 0 //Nullrod makes them useless for a short while. + var/upgradedRegen = 0 /datum/vampire/New(gend = FEMALE) gender = gend @@ -324,8 +325,9 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha vamp.powers.Add(VAMP_BATS) if(!(VAMP_SCREAM in vamp.powers)) vamp.powers.Add(VAMP_SCREAM) - // Commented out until we can figured out a way to stop this from spamming. - //src << "\blue Your rejuvination abilities have improved and will now heal you over time when used." + if(!(vamp.upgradedRegen)) // to prevent spamming + src << "Your rejuvination abilities have improved and will now heal you over time when used." + vamp.upgradedRegen = 1 // TIER 3.5 (/vg/) if(vamp.bloodtotal >= 250) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 83c23311297..f168ca5f35a 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -413,6 +413,8 @@ log_name = "SG" /datum/spellbook_entry/summon/guns/IsAvailible() + if(!ticker.mode) // In case spellbook is placed on map + return 0 if(ticker.mode.name == "ragin' mages") return 0 else @@ -434,6 +436,8 @@ log_name = "SU" /datum/spellbook_entry/summon/magic/IsAvailible() + if(!ticker.mode) // In case spellbook is placed on map + return 0 if(ticker.mode.name == "ragin' mages") return 0 else @@ -463,8 +467,7 @@ var/list/datum/spellbook_entry/entries = list() var/list/categories = list() -/obj/item/weapon/spellbook/New() - ..() +/obj/item/weapon/spellbook/proc/Initialize() var/entry_types = subtypesof(/datum/spellbook_entry) - /datum/spellbook_entry/item - /datum/spellbook_entry/summon for(var/T in entry_types) var/datum/spellbook_entry/E = new T @@ -475,6 +478,10 @@ qdel(E) tab = categories[1] +/obj/item/weapon/spellbook/New() + ..() + Initialize() + /obj/item/weapon/spellbook/attackby(obj/item/O as obj, mob/user as mob, params) if(istype(O, /obj/item/weapon/contract)) var/obj/item/weapon/contract/contract = O @@ -640,6 +647,9 @@ ..() name += spellname +/obj/item/weapon/spellbook/oneuse/Initialize() //No need to init + return + /obj/item/weapon/spellbook/oneuse/attack_self(mob/user as mob) var/obj/effect/proc_holder/spell/S = new spell for(var/obj/effect/proc_holder/spell/knownspell in user.spell_list) diff --git a/code/game/jobs/job/support_chaplain.dm b/code/game/jobs/job/support_chaplain.dm index 25ca290b0ab..d9de164d5de 100644 --- a/code/game/jobs/job/support_chaplain.dm +++ b/code/game/jobs/job/support_chaplain.dm @@ -19,6 +19,7 @@ if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back) if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back) if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/under/rank/chaplain(H), slot_w_uniform) H.equip_or_collect(new /obj/item/device/pda/chaplain(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes) diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index c466a3890a4..b6fd5a66e1c 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -215,10 +215,10 @@ FIRE ALARM data["sec_level"] = get_security_level() - var/second = round(time) % 60 - var/minute = (round(time) - second) / 60 + var/second = round(time % 60) + var/minute = round(time / 60) - data["time_left"] = "[minute ? minute + ":" : null][second]" + data["time_left"] = "[minute ? "[minute]:" : ""][add_zero(num2text(second), 2)]" ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 9548eea30ee..ee383613a68 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -985,16 +985,8 @@ steam.start() -- spawns the effect return if (istype(AM, /mob/living/carbon)) - var/mob/M = AM - if (istype(M, /mob/living/carbon/human) && (istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP) || M.buckled) - return - if (istype (M, /mob/living/carbon/human) && M:species.bodyflags & FEET_NOSLIP) - return - M.stop_pulling() - M << "\blue You slipped on the foam!" - playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) - M.Stun(5) - M.Weaken(2) + var/mob/living/carbon/M = AM + M.slip("foam", 5, 2) /datum/effect/system/foam_spread diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index a9e94d6077b..697e2c9e867 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -1214,19 +1214,8 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/clown/Crossed(AM as mob|obj) //Clown PDA is slippery. if (istype(AM, /mob/living/carbon)) - var/mob/M = AM - if ((istype(M, /mob/living/carbon/human) && (istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP)) || M.m_intent == "walk") - return - - if ((istype(M, /mob/living/carbon/human) && (M.real_name != src.owner) && (istype(src.cartridge, /obj/item/weapon/cartridge/clown)))) - if (src.cartridge.charges < 5) - src.cartridge.charges++ - - M.stop_pulling() - M << "\blue You slipped on the PDA!" - playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) - M.Stun(8) - M.Weaken(5) + var/mob/living/carbon/M = AM + M.slip("pda", 8, 5, 0, 1) /obj/item/device/pda/proc/available_pdas() var/list/names = list() diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index c08c79da86f..c9b6a6d7563 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -12,13 +12,14 @@ throw_range = 2 materials = list(MAT_METAL=750) origin_tech = "powerstorage=3;syndicate=5" - var/drain_rate = 1500000 // amount of power to drain per tick + var/drain_rate = 1600000 // amount of power to drain per tick var/apc_drain_rate = 5000 // Max. amount drained from single APC. In Watts. var/dissipation_rate = 20000 // Passive dissipation of drained power. In Watts. var/power_drained = 0 // Amount of power drained. - var/max_power = 5e9 // Detonation point. + var/max_power = 1e10 // Detonation point. var/mode = 0 // 0 = off, 1=clamped (off), 2=operating var/drained_this_tick = 0 // This is unfortunately necessary to ensure we process powersinks BEFORE other machinery such as APCs. + var/admins_warned = 0 // stop spam, only warn the admins once that we are about to go boom var/datum/powernet/PN // Our powernet var/obj/structure/cable/attached // the attached cable @@ -120,10 +121,13 @@ /obj/item/device/powersink/process() drained_this_tick = 0 power_drained -= min(dissipation_rate, power_drained) - if(power_drained > max_power * 0.95) + if(power_drained > max_power * 0.98) + if(!admins_warned) + admins_warned = 1 + message_admins("Power sink at ([x],[y],[z] - JMP) is 95% full. Explosion imminent.") playsound(src, 'sound/effects/screech.ogg', 100, 1, 1) if(power_drained >= max_power) - explosion(src.loc, 3,6,9,12) + explosion(src.loc, 4,8,16,32) qdel(src) return if(attached && attached.powernet) diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index d58fe73b587..a655efa125c 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -22,36 +22,16 @@ /obj/item/weapon/bananapeel/Crossed(AM as mob|obj) if (istype(AM, /mob/living/carbon)) - var/mob/M = AM - if (istype(M, /mob/living/carbon/human) && (isobj(M:shoes) && M:shoes.flags&NOSLIP) || M.buckled) - return - if(istype(M, /mob/living/carbon/human) && M:species.bodyflags & FEET_NOSLIP) - return - if(M.flying) - return - - M.stop_pulling() - M << "\blue You slipped on the [name]!" - playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) - M.Stun(4) - M.Weaken(2) + var/mob/living/carbon/M = AM + M.slip("banana peel", 4, 2) /* * Soap */ /obj/item/weapon/soap/Crossed(AM as mob|obj) //EXACTLY the same as bananapeel for now, so it makes sense to put it in the same dm -- Urist if (istype(AM, /mob/living/carbon)) - var/mob/M = AM - if (istype(M, /mob/living/carbon/human) && (isobj(M:shoes) && M:shoes.flags&NOSLIP) || M.buckled) - return - if(M.flying) - return - - M.stop_pulling() - M << "\blue You slipped on the [name]!" - playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) - M.Stun(4) - M.Weaken(2) + var/mob/living/carbon/M = AM + M.slip("soap", 4, 2) /obj/item/weapon/soap/afterattack(atom/target, mob/user as mob, proximity) if(!proximity) return diff --git a/code/game/objects/items/weapons/grenades/clowngrenade.dm b/code/game/objects/items/weapons/grenades/clowngrenade.dm index 3066c762cd3..8525a27378c 100644 --- a/code/game/objects/items/weapons/grenades/clowngrenade.dm +++ b/code/game/objects/items/weapons/grenades/clowngrenade.dm @@ -62,8 +62,8 @@ Crossed(AM as mob|obj) var/burned = rand(2,5) - if(istype(AM, /mob/living)) - var/mob/living/M = AM + if(istype(AM, /mob/living/carbon)) + var/mob/living/carbon/M = AM if(ishuman(M)) if(isobj(M:shoes)) if((M:shoes.flags&NOSLIP) || (M:species.bodyflags & FEET_NOSLIP)) @@ -73,16 +73,8 @@ M.take_overall_damage(0, max(0, (burned - 2))) if(!istype(M, /mob/living/carbon/slime) && !isrobot(M)) - M.stop_pulling() - step(M, M.dir) - spawn(1) step(M, M.dir) - spawn(2) step(M, M.dir) - spawn(3) step(M, M.dir) - spawn(4) step(M, M.dir) + M.slip("banana peel!", 0, 7, 4) M.take_organ_damage(2) // Was 5 -- TLE - M << "\blue You slipped on \the [name]!" - playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) - M.Weaken(7) M.take_overall_damage(0, burned) throw_impact(atom/hit_atom) diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 6c057f3cda8..5f93c6a095c 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -155,6 +155,13 @@ icon_state = "beartrap0" desc = "A trap used to catch bears and other legged creatures." var/armed = 0 + var/obj/item/weapon/grenade/iedcasing/IED = null + +/obj/item/weapon/restraints/legcuffs/beartrap/Destroy() + if(IED) + qdel(IED) + IED = null + return ..() /obj/item/weapon/restraints/legcuffs/beartrap/suicide_act(mob/user) user.visible_message("[user] is sticking \his head in the [src.name]! It looks like \he's trying to commit suicide.") @@ -168,6 +175,36 @@ icon_state = "beartrap[armed]" user << "[src] is now [armed ? "armed" : "disarmed"]" +/obj/item/weapon/restraints/legcuffs/beartrap/attackby(var/obj/item/I, mob/user as mob) //Let's get explosive. + if(istype(I, /obj/item/weapon/grenade/iedcasing)) + if(IED) + user << "This beartrap already has an IED hooked up to it!" + return + IED = I + switch(IED.assembled) + if(0,1) //if it's not fueled/hooked up + user << "You haven't prepared this IED yet!" + IED = null + return + if(2,3) + user.drop_item(src) + I.forceMove(src) + message_admins("[key_name_admin(user)] has rigged a beartrap with an IED.") + log_game("[key_name(user)] has rigged a beartrap with an IED.") + user << "You sneak the [IED] underneath the pressure plate and connect the trigger wire." + desc = "A trap used to catch bears and other legged creatures. There is an IED hooked up to it." + else + user << "You shouldn't be reading this message! Contact a coder or someone, something broke!" + IED = null + return + if(istype(I, /obj/item/weapon/screwdriver)) + if(IED) + IED.forceMove(get_turf(src)) + IED = null + user << "You remove the IED from the [src]." + return + ..() + /obj/item/weapon/restraints/legcuffs/beartrap/Crossed(AM as mob|obj) if(armed && isturf(src.loc)) if( (iscarbon(AM) || isanimal(AM)) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator)) @@ -178,6 +215,16 @@ L.visible_message("[L] triggers \the [src].", \ "You trigger \the [src]!") + if(IED && isturf(src.loc)) + IED.active = 1 + IED.overlays -= image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") + IED.icon_state = initial(icon_state) + "_active" + IED.assembled = 3 + message_admins("[key_name_admin(usr)] has triggered an IED-rigged [name].") + log_game("[key_name(usr)] has triggered an IED-rigged [name].") + spawn(IED.det_time) + IED.prime() + if(ishuman(AM)) var/mob/living/carbon/H = AM if(H.lying) diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index 240decbfdcb..16fc9f046bd 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -10,101 +10,6 @@ origin_tech = "materials=1" var/breakouttime = 300 //Deciseconds = 30s = 0.5 minute -/obj/item/weapon/legcuffs/beartrap - name = "bear trap" - throw_speed = 1 - throw_range = 1 - icon_state = "beartrap0" - desc = "A trap used to catch bears and other legged creatures." - var/armed = 0 - var/obj/item/weapon/grenade/iedcasing/IED = null - - suicide_act(mob/user) - viewers(user) << "[user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide." - return (BRUTELOSS) - -/obj/item/weapon/legcuffs/beartrap/attack_self(mob/user as mob) - ..() - if(ishuman(user) && !user.stat && !user.restrained()) - armed = !armed - icon_state = "beartrap[armed]" - user << "[src] is now [armed ? "armed" : "disarmed"]" - -/obj/item/weapon/legcuffs/beartrap/attackby(var/obj/item/I, mob/user as mob) //Let's get explosive. - if(istype(I, /obj/item/weapon/grenade/iedcasing)) - if(IED) - user << "This beartrap already has an IED hooked up to it!" - return - IED = I - switch(IED.assembled) - if(0,1) //if it's not fueled/hooked up - user << "You haven't prepared this IED yet!" - IED = null - return - if(2,3) - user.drop_item(src) - I.loc = src - message_admins("[key_name_admin(user)] has rigged a beartrap with an IED.") - log_game("[key_name(user)] has rigged a beartrap with an IED.") - user << "You sneak the [IED] underneath the pressure plate and connect the trigger wire." - desc = "A trap used to catch bears and other legged creatures. There is an IED hooked up to it." - else - user << "You shouldn't be reading this message! Contact a coder or someone, something broke!" - IED = null - return - if(istype(I, /obj/item/weapon/screwdriver)) - if(IED) - IED.loc = get_turf(src.loc) - IED = null - user << "You remove the IED from the [src]." - return - ..() - -/obj/item/weapon/legcuffs/beartrap/Crossed(AM as mob|obj) - if(armed) - if(IED && isturf(src.loc)) - IED.active = 1 - IED.overlays -= image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") - IED.icon_state = initial(icon_state) + "_active" - IED.assembled = 3 - message_admins("[key_name_admin(usr)] has triggered an IED-rigged [name].") - log_game("[key_name(usr)] has triggered an IED-rigged [name].") - spawn(IED.det_time) - IED.prime() - if(ishuman(AM)) - if(isturf(src.loc)) - var/mob/living/carbon/H = AM - if(H.m_intent == "run") - if(H.lying) - H.apply_damage(20,BRUTE,"chest") - else - H.apply_damage(20,BRUTE,(pick("l_leg", "r_leg"))) - armed = 0 - icon_state = "beartrap0" - playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) - H.visible_message("[H] triggers \the [src].", \ - "You trigger \the [src]!") - H.legcuffed = src - src.loc = H - H.update_inv_legcuffed() - H << "You step on \the [src]!" - if(IED && IED.active) - H << "\The [src]'s IED has been activated!" - feedback_add_details("handcuffs","B") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart. - for(var/mob/O in viewers(H, null)) - if(O == H) - continue - O.show_message("\red [H] steps on \the [src].", 1) - if(isanimal(AM) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator)) - armed = 0 - icon_state = "beartrap0" - var/mob/living/simple_animal/SA = AM - playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) - SA.visible_message("[SA] triggers \the [src].", \ - "You trigger \the [src]!") - SA.health -= 20 - ..() - /obj/item/weapon/legcuffs/bolas name = "bolas" desc = "An entangling bolas. Throw at your foes to trip them and prevent them from running." @@ -167,26 +72,19 @@ var/mob/living/M = hit_atom if(ishuman(M)) //if they're a human species var/mob/living/carbon/human/H = M - if(H.m_intent == "run") //if they're set to run (though not necessarily running at that moment) - if(prob(trip_prob)) //this probability is up for change and mostly a placeholder - Comic - step(H, H.dir) - H.visible_message("[H] was tripped by the bolas!","Your legs have been tangled!"); - H.Stun(2) //used instead of setting damage in vars to avoid non-human targets being affected - H.Weaken(4) - H.legcuffed = src //applies legcuff properties inherited through legcuffs - src.loc = H - H.update_inv_legcuffed() - if(!H.legcuffed) //in case it didn't happen, we need a safety net - throw_failed() - else if(H.legcuffed) //if the target is already legcuffed (has to be walking) + if(H.legcuffed) //if the target is already legcuffed (has to be walking) throw_failed() return - else //walking, but uncuffed, or the running prob() failed - H << "You stumble over the thrown bolas" + if(prob(trip_prob)) //this probability is up for change and mostly a placeholder - Comic step(H, H.dir) - H.Stun(1) - throw_failed() - return + H.visible_message("[H] was tripped by the bolas!","Your legs have been tangled!"); + H.Stun(2) //used instead of setting damage in vars to avoid non-human targets being affected + H.Weaken(4) + H.legcuffed = src //applies legcuff properties inherited through legcuffs + src.loc = H + H.update_inv_legcuffed() + if(!H.legcuffed) //in case it didn't happen, we need a safety net + throw_failed() else M.Stun(2) //minor stun damage to anything not human throw_failed() diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index f727326b3f1..44b1a21f73d 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -248,6 +248,37 @@ new /obj/item/weapon/grenade/chem_grenade/cleaner(src) new /obj/item/weapon/grenade/chem_grenade/cleaner(src) +/obj/item/weapon/storage/belt/lazarus + name = "trainer's belt" + desc = "For the mining master, holds your lazarus capsules." + icon_state = "lazarusbelt" + item_state = "lazbelt" + w_class = 4 + max_w_class = 1 + max_combined_w_class = 6 + storage_slots = 6 + can_hold = list("/obj/item/device/mobcapsule") + +/obj/item/weapon/storage/belt/lazarus/New() + ..() + update_icon() + + +/obj/item/weapon/storage/belt/lazarus/update_icon() + ..() + icon_state = "[initial(icon_state)]_[contents.len]" + +/obj/item/weapon/storage/belt/lazarus/attackby(obj/item/W, mob/user) + var/amount = contents.len + . = ..() + if(amount != contents.len) + update_icon() + +/obj/item/weapon/storage/belt/lazarus/remove_from_storage(obj/item/W as obj, atom/new_location) + ..() + update_icon() + + /obj/item/weapon/storage/belt/bandolier name = "bandolier" desc = "A bandolier for holding shotgun ammunition." diff --git a/code/game/structure/structure.dm b/code/game/objects/structures/statue.dm similarity index 100% rename from code/game/structure/structure.dm rename to code/game/objects/structures/statue.dm diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index fabaf4c63f0..6a921a014a3 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -42,7 +42,7 @@ /obj/structure/table/update_icon() if(smooth && !flipped) - icon_state = initial(icon_state) + icon_state = "" smooth_icon(src) smooth_icon_neighbors(src) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 3262ac5ece2..ef25216b560 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -12,14 +12,18 @@ var/w_items = 0 //the combined w_class of all the items in the cistern var/mob/living/swirlie = null //the mob being given a swirlie + /obj/structure/toilet/New() open = round(rand(0, 1)) update_icon() -/obj/structure/toilet/attack_hand(mob/living/user as mob) + +/obj/structure/toilet/attack_hand(mob/living/user) if(swirlie) - usr.visible_message("[user] slams the toilet seat onto [swirlie.name]'s head!", "You slam the toilet seat onto [swirlie.name]'s head!", "You hear reverberating porcelain.") - swirlie.adjustBruteLoss(8) + user.changeNext_move(CLICK_CD_MELEE) + playsound(src.loc, "swing_hit", 25, 1) + swirlie.visible_message("[user] slams the toilet seat onto [swirlie]'s head!", "[user] slams the toilet seat onto [swirlie]'s head!", "You hear reverberating porcelain.") + swirlie.adjustBruteLoss(5) return if(cistern && !open) @@ -32,61 +36,81 @@ user.put_in_hands(I) else I.loc = get_turf(src) - user << "You find \an [I] in the cistern." + user << "You find [I] in the cistern." w_items -= I.w_class return open = !open update_icon() + /obj/structure/toilet/update_icon() icon_state = "toilet[open][cistern]" -/obj/structure/toilet/attackby(obj/item/I as obj, mob/living/user as mob, params) + +/obj/structure/toilet/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/weapon/crowbar)) - user << "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]." + user << "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]..." playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1) if(do_after(user, 30, target = src)) - user.visible_message("[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!", "You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]!", "You hear grinding porcelain.") + user.visible_message("[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!", "You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]!", "You hear grinding porcelain.") cistern = !cistern update_icon() return - if(istype(I, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = I + if(istype(I, /obj/item/weapon/reagent_containers)) + if(!open) + return + var/obj/item/weapon/reagent_containers/RG = I + if(RG.is_open_container()) + RG.reagents.add_reagent("toiletwater", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this)) + user << "You fill [RG] from [src]. Gross." + return + if(istype(I, /obj/item/weapon/grab)) + user.changeNext_move(CLICK_CD_MELEE) + var/obj/item/weapon/grab/G = I + if(!G.confirm()) + return if(isliving(G.affecting)) var/mob/living/GM = G.affecting - - if(G.state>1) - if(!GM.loc == get_turf(src)) - user << "[GM.name] needs to be on the toilet." + if(G.state >= GRAB_AGGRESSIVE) + if(GM.loc != get_turf(src)) + user << "[GM] needs to be on [src]!" return - if(open && !swirlie) - user.visible_message("[user] starts to give [GM.name] a swirlie!", "You start to give [GM.name] a swirlie!") - swirlie = GM - if(do_after(user, 30, 5, 0, target = src)) - user.visible_message("[user] gives [GM.name] a swirlie!", "You give [GM.name] a swirlie!", "You hear a toilet flushing.") - if(!GM.internal) - GM.adjustOxyLoss(5) - swirlie = null - else - user.visible_message("[user] slams [GM.name] into the [src]!", "You slam [GM.name] into the [src]!") - GM.adjustBruteLoss(8) + if(!swirlie) + if(open) + GM.visible_message("[user] starts to give [GM] a swirlie!", "[user] starts to give [GM] a swirlie...") + swirlie = GM + if(do_after(user, 30, 5, 0, target = src)) + GM.visible_message("[user] gives [GM] a swirlie!", "[user] gives [GM] a swirlie!", "You hear a toilet flushing.") + if(iscarbon(GM)) + var/mob/living/carbon/C = GM + if(!C.internal) + C.adjustOxyLoss(5) + else + GM.adjustOxyLoss(5) + swirlie = null + else + playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) + GM.visible_message("[user] slams [GM.name] into [src]!", "[user] slams [GM.name] into [src]!") + GM.adjustBruteLoss(5) else - user << "You need a tighter grip." + user << "You need a tighter grip!" if(cistern) if(I.w_class > 3) - user << "\The [I] does not fit." + user << "[I] does not fit!" return if(w_items + I.w_class > 5) - user << "The cistern is full." + user << "The cistern is full!" + return + if(!user.drop_item()) + user << "\The [I] is stuck to your hand, you cannot put it in the cistern!" return - user.drop_item() I.loc = src w_items += I.w_class - user << "You carefully place \the [I] into the cistern." + user << "You carefully place [I] into the cistern." return @@ -99,20 +123,24 @@ density = 0 anchored = 1 -/obj/structure/urinal/attackby(obj/item/I as obj, mob/user as mob, params) + +/obj/structure/urinal/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = I + if(!G.confirm()) + return if(isliving(G.affecting)) var/mob/living/GM = G.affecting - if(G.state>1) - if(!GM.loc == get_turf(src)) - user << "[GM.name] needs to be on the urinal." + if(G.state >= GRAB_AGGRESSIVE) + if(GM.loc != get_turf(src)) + user << "[GM.name] needs to be on [src]." return - user.visible_message("[user] slams [GM.name] into the [src]!", "You slam [GM.name] into the [src]!") + user.changeNext_move(CLICK_CD_MELEE) + playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) + user.visible_message("[user] slams [GM] into [src]!", "You slam [GM] into [src]!") GM.adjustBruteLoss(8) else - user << "You need a tighter grip." - + user << "You need a tighter grip!" /obj/machinery/shower @@ -344,6 +372,13 @@ var/busy = 0 //Something's being washed at the moment /obj/structure/sink/attack_hand(mob/user as mob) + if(!user || !istype(user)) + return + if(!iscarbon(user)) + return + if(!Adjacent(user)) + return + if (ishuman(user)) var/mob/living/carbon/human/H = user var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] @@ -353,81 +388,86 @@ user << "You try to move your [temp.name], but cannot!" return - if(isrobot(user) || isAI(user)) - return - - if(!Adjacent(user)) - return - if(busy) - user << "\red Someone's already washing here." + user << "Someone's already washing here." + return + var/selected_area = parse_zone(user.zone_sel.selecting) + var/washing_face = 0 + if(selected_area in list("head", "mouth", "eyes")) + washing_face = 1 + user.visible_message("[user] start washing their [washing_face ? "face" : "hands"]...", \ + "You start washing your [washing_face ? "face" : "hands"]...") + busy = 1 + + if(!do_after(user, 40, target = src)) + busy = 0 return - usr << "\blue You start washing your hands." - - busy = 1 - sleep(40) busy = 0 - if(!Adjacent(user)) return //Person has moved away from the sink - - user.clean_blood() - if(ishuman(user)) - user:update_inv_gloves() - for(var/mob/V in viewers(src, null)) - V.show_message("\blue [user] washes their hands using \the [src].") + user.visible_message("[user] washes their [washing_face ? "face" : "hands"] using [src].", \ + "You wash your [washing_face ? "face" : "hands"] using [src].") + if(washing_face) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.lip_style = null //Washes off lipstick + H.lip_color = initial(H.lip_color) + H.regenerate_icons() + user.drowsyness -= rand(2,3) //Washing your face wakes you up if you're falling asleep + user.drowsyness = Clamp(user.drowsyness, 0, INFINITY) + else + user.clean_blood() -/obj/structure/sink/attackby(obj/item/O as obj, mob/user as mob, params) +/obj/structure/sink/attackby(obj/item/O, mob/user, params) if(busy) - user << "\red Someone's already washing here." + user << "Someone's already washing here!" return - if (istype(O, /obj/item/weapon/reagent_containers)) + if(istype(O, /obj/item/weapon/reagent_containers)) var/obj/item/weapon/reagent_containers/RG = O - RG.reagents.add_reagent("water", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this)) - user.visible_message("\blue [user] fills the [RG] using \the [src].","\blue You fill the [RG] using \the [src].") - return + if(RG.is_open_container()) + RG.reagents.add_reagent("water", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this)) + user << "You fill [RG] from [src]." + return O.water_act(20,310.15,src) - if (istype(O, /obj/item/weapon/melee/baton)) + if(istype(O, /obj/item/weapon/melee/baton)) var/obj/item/weapon/melee/baton/B = O - if (B.bcell.charge > 0 && B.status == 1) - flick("baton_active", src) - user.Stun(10) - user.stuttering = 10 - user.Weaken(10) - if(isrobot(user)) - var/mob/living/silicon/robot/R = user - R.cell.charge -= 20 - else + if(B.bcell) + if(B.bcell.charge > 0 && B.status == 1) + flick("baton_active", src) + var/stunforce = B.stunforce + user.Stun(stunforce) + user.Weaken(stunforce) + user.stuttering = stunforce B.deductcharge(B.hitcost) - user.visible_message( \ - "[user] was stunned by his wet [O].", \ - "\red You have wet \the [O], it shocks you!") - return + user.visible_message("[user] shocks themself while attempting to wash the active [B.name]!", \ + "You unwisely attempt to wash [B] while it's still on.") + playsound(src, "sparks", 50, 1) + return - var/turf/location = user.loc - if(!isturf(location)) return + if(istype(O, /obj/item/weapon/mop)) + O.reagents.add_reagent("water", 5) + user << "You wet [O] in [src]." + playsound(loc, 'sound/effects/slosh.ogg', 25, 1) var/obj/item/I = O - if(!I || !istype(I,/obj/item)) return - - usr << "\blue You start washing \the [I]." + if(!I || !istype(I)) + return + if(I.flags & ABSTRACT) //Abstract items like grabs won't wash. No-drop items will though because it's still technically an item in your hand. + return + user << "You start washing [I]..." busy = 1 - sleep(40) + if(!do_after(user, 40, target = src)) + busy = 0 + return busy = 0 - - if(user.loc != location) return //User has moved - if(!I) return //Item's been destroyed while washing - if(user.get_active_hand() != I) return //Person has switched hands or the item in their hands - O.clean_blood() - user.visible_message( \ - "\blue [user] washes \a [I] using \the [src].", \ - "\blue You wash \a [I] using \the [src].") + user.visible_message("[user] washes [I] using [src].", \ + "You wash [I] using [src].") /obj/structure/sink/kitchen diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index f3fd7b38dd1..15751f0a9d8 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -95,50 +95,21 @@ bloodDNA = null - var/noslip = 0 - for (var/obj/structure/stool/bed/chair/C in contents) - if (C.buckled_mob == M) - noslip = 1 - if (noslip) - return // no slipping while sitting in a chair, plz switch (src.wet) if(TURF_WET_WATER) - if ((M.m_intent == "run") && !(istype(M:shoes, /obj/item/clothing/shoes) && M.shoes.flags&NOSLIP)) - M.stop_pulling() - step(M, M.dir) - M << "\blue You slipped on the wet floor!" - playsound(src, 'sound/misc/slip.ogg', 50, 1, -3) - M.Stun(4) - M.Weaken(2) - else + if (!(M.slip("wet floor", 4, 2, 1))) M.inertia_dir = 0 return - - if(TURF_WET_LUBE) //lube //can cause infinite loops - needs work - if(!M.buckled) - M.stop_pulling() - step(M, M.dir) - spawn(1) step(M, M.dir) - spawn(2) step(M, M.dir) - spawn(3) step(M, M.dir) - spawn(4) step(M, M.dir) + if(TURF_WET_LUBE) //lube + if(M.slip("floor", 0, 7, 4, 0, 1)) M.take_organ_damage(2) // Was 5 -- TLE - M << "\blue You slipped on the floor!" - playsound(src, 'sound/misc/slip.ogg', 50, 1, -3) - M.Weaken(7) + if(TURF_WET_ICE) // Ice - if ((M.m_intent == "run") && !(istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP) && prob(30)) - M.stop_pulling() - step(M, M.dir) - M << "\blue You slipped on the icy floor!" - playsound(src, 'sound/misc/slip.ogg', 50, 1, -3) - M.Stun(4) - M.Weaken(2) - else + if (!(prob(30) && M.slip("icy floor", 4, 2, 1, 1))) M.inertia_dir = 0 - return + //returns 1 if made bloody, returns 0 otherwise /turf/simulated/add_blood(mob/living/carbon/human/M as mob) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index d311d94d7e6..c6534203db3 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -64,8 +64,10 @@ if(!damage_overlays[1]) //list hasn't been populated generate_overlays() + smooth_icon(src) if(!damage) - overlays.Cut() + overlays -= damage_overlays[damage_overlay] + damage_overlay = 0 return var/overlay = round(damage / damage_cap * damage_overlays.len) + 1 @@ -74,8 +76,7 @@ if(damage_overlay && overlay == damage_overlay) //No need to update. return - - overlays.Cut() + overlays -= damage_overlays[damage_overlay] overlays += damage_overlays[overlay] damage_overlay = overlay diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index cca76f4b42b..dab208d415f 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -60,6 +60,10 @@ src << "You can't commit suicide before the game starts!" return + // No more borergrief, one way or the other + if(has_brain_worms()) + src << "You try to bring yourself to commit suicide, but - something prevents you!" + return if (suiciding) src << "You're already committing suicide! Be patient!" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index f263515d986..26813c0ba91 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -680,6 +680,12 @@ else jobs += "[replacetext("Cultist", " ", " ")]" + //Shadowling + if(jobban_isbanned(M, "shadowling") || isbanned_dept) + jobs += "[replacetext("Shadowling", " ", " ")]" + else + jobs += "[replacetext("Shadowling", " ", " ")]" + //Wizard if(jobban_isbanned(M, "wizard") || isbanned_dept) jobs += "[replacetext("Wizard", " ", " ")]" diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 902257ae2db..81e4fd17681 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -15,13 +15,13 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," adminhelped = 1 //Determines if they get the message to reply by clicking the name. var/msg - var/list/type = list("Question","Player Complaint") + var/list/type = list("Mentorhelp","Adminhelp") var/selected_type = input("Pick a category.", "Admin Help", null, null) as null|anything in type if(selected_type) msg = input("Please enter your message.", "Admin Help", null, null) as text|null - //clean the input msg - if(!msg) + //clean the input msg + if(!msg) return if(src.handle_spam_prevention(msg,MUTE_ADMINHELP)) @@ -88,7 +88,6 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," var/ref_mob = "\ref[mob]" var/ref_client = "\ref[src]" - msg = "\blue [selected_type]: [key_name(src, 1, 1, selected_type)] (?) (PP) (VV) (SM) ([admin_jump_link(mob, "holder")]) (CA) (REJT) [ai_found ? " (CL)" : ""]: [msg]" //send this msg to all admins var/admin_number_afk = 0 @@ -109,19 +108,21 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," continue switch(selected_type) - if("Question") + if("Mentorhelp") + msg = "[selected_type]: [key_name(src, 1, 1, selected_type)] (?) (PP) (VV) (SM) ([admin_jump_link(mob, "holder")]) (CA) (REJT) [ai_found ? " (CL)" : ""]: [msg]" for(var/client/X in mentorholders + modholders + adminholders) if(X.prefs.sound & SOUND_ADMINHELP) X << 'sound/effects/adminhelp.ogg' X << msg - if("Player Complaint") + if("Adminhelp") + msg = "[selected_type]: [key_name(src, 1, 1, selected_type)] (?) (PP) (VV) (SM) ([admin_jump_link(mob, "holder")]) (CA) (REJT) [ai_found ? " (CL)" : ""]: [msg]" for(var/client/X in modholders + adminholders) if(X.prefs.sound & SOUND_ADMINHELP) X << 'sound/effects/adminhelp.ogg' X << msg //show it to the person adminhelping too - src << "[selected_type]: [original_msg]" + src << "[selected_type]: [original_msg]" var/admin_number_present = adminholders.len - admin_number_afk log_admin("[selected_type]: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins.") @@ -161,4 +162,3 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," else send2irc(source, "[msg] - All admins AFK ([admin_number_afk]/[admin_number_total]) or skipped ([admin_number_ignored]/[admin_number_total])") return admin_number_present - \ No newline at end of file diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 93cff752e0b..0c8fec79572 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -67,17 +67,17 @@ if(istext(whom)) if(cmptext(copytext(whom,1,2),"@")) whom = findStealthKey(whom) - C = directory[C] + C = directory[C] else if(istype(whom,/client)) C = whom - + if(!C) - if(holder) + if(holder) src << "Error: Private-Message: Client not found." - else + else adminhelp(msg) //admin we are replying to left. adminhelp instead return - + /*if(C && C.last_pm_recieved + config.simultaneous_pm_warning_timeout > world.time && holder) //send a warning to admins, but have a delay popup for mods if(holder.rights & R_ADMIN) @@ -90,12 +90,12 @@ if(!msg) msg = input(src,"Message:", "Private message to [key_name(C, 0, 0)]") as text|null - if(!msg) + if(!msg) return if(!C) - if(holder) + if(holder) src << "Error: Admin-PM: Client not found." - else + else adminhelp(msg) //admin we are replying to has vanished, adminhelp instead return @@ -105,10 +105,10 @@ //clean the message if it's not sent by a high-rank admin if(!check_rights(R_SERVER|R_DEBUG,0)) msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN)) - if(!msg) + if(!msg) return - var/recieve_color = "purple" + var/recieve_span = "playerreply" var/send_pm_type = " " var/recieve_pm_type = "Player" @@ -118,9 +118,9 @@ //PMs sent from admins and mods display their rank if(holder) if(check_rights(R_MOD|R_MENTOR,0) && !check_rights(R_ADMIN,0)) - recieve_color = "maroon" + recieve_span = "mentorhelp" else - recieve_color = "red" + recieve_span = "danger" send_pm_type = holder.rank + " " recieve_pm_type = holder.rank @@ -131,7 +131,7 @@ var/recieve_message = "" if(holder && !C.holder) - recieve_message = "-- Click the [recieve_pm_type]'s name to reply --\n" + recieve_message = "-- Click the [recieve_pm_type]'s name to reply --\n" if(C.adminhelped) C << recieve_message C.adminhelped = 0 @@ -149,7 +149,7 @@ adminhelp(reply) //sender has left, adminhelp instead return - recieve_message = "[type] from-[recieve_pm_type][key_name(src, C, C.holder ? 1 : 0, type)]: [msg]" + recieve_message = "[type] from-[recieve_pm_type][key_name(src, C, C.holder ? 1 : 0, type)]: [msg]" C << recieve_message src << "[send_pm_type][type] to-[key_name(C, src, holder ? 1 : 0, type)]: [msg]" @@ -162,57 +162,6 @@ if(C.prefs.sound & SOUND_ADMINHELP) C << 'sound/effects/adminhelp.ogg' - /* - if(C.holder) - if(holder) //both are admins - if(holder.rank == "Moderator") //If moderator - C << "Mod PM from-[key_name(src, C, 1)]: [msg]" - src << "Mod PM to-[key_name(C, src, 1)]: [msg]" - else - C << "Admin PM from-[key_name(src, C, 1)]: [msg]" - src << "Admin PM to-[key_name(C, src, 1)]: [msg]" - - else //recipient is an admin but sender is not - C << "Reply PM from-[key_name(src, C, 1)]: [msg]" - src << "PM to-Admins: [msg]" - - //play the recieving admin the adminhelp sound (if they have them enabled) - if(C.prefs.toggles & SOUND_ADMINHELP) - C << 'sound/effects/adminhelp.ogg' - - else - if(holder) //sender is an admin but recipient is not. Do BIG RED TEXT - if(holder.rank == "Moderator") - C << "Mod PM from-[key_name(src, C, 0)]: [msg]" - C << "Click on the moderators's name to reply." - src << "Mod PM to-[key_name(C, src, 1)]: [msg]" - else - C << "-- Administrator private message --" - C << "Admin PM from-[key_name(src, C, 0)]: [msg]" - C << "Click on the administrator's name to reply." - src << "Admin PM to-[key_name(C, src, 1)]: [msg]" - - //always play non-admin recipients the adminhelp sound - C << 'sound/effects/adminhelp.ogg' - - //AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn - if(config.popup_admin_pm) - spawn() //so we don't hold the caller proc up - var/sender = src - var/sendername = key - var/reply = input(C, msg,"Admin PM from-[sendername]", "") as text|null //show message and await a reply - if(C && reply) - if(sender) - C.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them - else - adminhelp(reply) //sender has left, adminhelp instead - return - - else //neither are admins - src << "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden." - return - */ - log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]") //we don't use message_admins here because the sender/receiver might get it too for(var/client/X in admins) @@ -221,15 +170,15 @@ continue if(X.key != key && X.key != C.key) switch(type) - if("Question") + if("Mentorhelp") if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob)) - X << "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: \blue [msg]" - if("Player Complaint") + X << "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg]" + if("Adminhelp") if(check_rights(R_ADMIN|R_MOD, 0, X.mob)) - X << "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: \blue [msg]" + X << "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg]" else if(check_rights(R_ADMIN|R_MOD, 0, X.mob)) - X << "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: \blue [msg]" + X << "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg]" /client/proc/cmd_admin_irc_pm() if(prefs.muted & MUTE_ADMINHELP) diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index 1fde42aac94..c1d1a4fb4fc 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -311,7 +311,7 @@ user << "You switch your helmet to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor." name = "blood-red hardsuit helmet" desc = "A dual-mode advanced helmet designed for work in special operations. It is in travel mode. Property of Gorlex Marauders." - flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL + flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE cold_protection = HEAD set_light(brightness_on) @@ -319,7 +319,7 @@ user << "You switch your helmet to combat mode. You will take damage in zero pressure environments, but you are more suited for a fight." name = "blood-red hardsuit helmet (combat)" desc = "A dual-mode advanced helmet designed for work in special operations. It is in combat mode. Property of Gorlex Marauders." - flags = BLOCKHAIR | THICKMATERIAL + flags = BLOCKHAIR | THICKMATERIAL | NODROP flags_inv = HIDEEARS cold_protection = null set_light(0) @@ -348,7 +348,7 @@ on = !on if(on) user << "You switch your hardsuit to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor." - name = "blood-red hardsuit helmet" + name = "blood-red hardsuit" desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders." slowdown = 1 flags = STOPSPRESSUREDMAGE | THICKMATERIAL @@ -356,7 +356,7 @@ cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS else user << "You switch your hardsuit to combat mode. You will take damage in zero pressure environments, but you are more suited for a fight." - name = "blood-red hardsuit helmet (combat)" + name = "blood-red hardsuit (combat)" desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in combat mode. Property of Gorlex Marauders." slowdown = 0 flags = THICKMATERIAL @@ -379,6 +379,15 @@ max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT sprite_sheets = null +/obj/item/clothing/head/helmet/space/rig/syndi/elite/attack_self(mob/user) + ..() + if(on) + name = "elite syndicate hardsuit helmet" + desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in travel mode. Property of Gorlex Marauders." + else + name = "elite syndicate hardsuit helmet (combat)" + desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in combat mode. Property of Gorlex Marauders." + /obj/item/clothing/suit/space/rig/syndi/elite name = "elite syndicate hardsuit" desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in travel mode." @@ -389,6 +398,15 @@ max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT sprite_sheets = null +/obj/item/clothing/suit/space/rig/syndi/elite/attack_self(mob/user) + ..() + if(on) + name = "elite syndicate hardsuit" + desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in travel mode. Property of Gorlex Marauders." + else + name = "elite syndicate hardsuit (combat)" + desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in combat mode. Property of Gorlex Marauders." + //Wizard Rig /obj/item/clothing/head/helmet/space/rig/wizard name = "gem-encrusted hardsuit helmet" diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index fcf786745a6..c29d8add45d 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -154,7 +154,7 @@ var/list/event_last_fired = list() new /datum/event_meta(EVENT_LEVEL_MODERATE, "Viral Infection", /datum/event/viral_infection, 0, list(ASSIGNMENT_MEDICAL = 150)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 30), 1), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ion_storm, 0, list(ASSIGNMENT_AI = 50, ASSIGNMENT_CYBORG = 50, ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_SCIENTIST = 5)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Borer Infestation", /datum/event/borer_infestation, 20, list(ASSIGNMENT_SECURITY = 20), 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Borer Infestation", /datum/event/borer_infestation, 40, list(ASSIGNMENT_SECURITY = 30), 1), //new /datum/event_meta/ninja(EVENT_LEVEL_MODERATE, "Space Ninja", /datum/event/space_ninja, 0, list(ASSIGNMENT_SECURITY = 15), 1), // NON-BAY EVENTS new /datum/event_meta(EVENT_LEVEL_MODERATE, "Mass Hallucination", /datum/event/mass_hallucination, 300), diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 0e6779683da..43a3c4ba4c5 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -332,6 +332,8 @@ new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 800), new /datum/data/mining_equipment("Lazarus Injector", /obj/item/weapon/lazarus_injector, 1000), new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/weapon/pickaxe/silver, 1000), + new /datum/data/mining_equipment("Lazarus Capsule", /obj/item/device/mobcapsule, 800), + new /datum/data/mining_equipment("Lazarus Capsule belt",/obj/item/weapon/storage/belt/lazarus, 200), new /datum/data/mining_equipment("Jetpack", /obj/item/weapon/tank/jetpack/carbondioxide/mining, 2000), new /datum/data/mining_equipment("Space Cash", /obj/item/weapon/spacecash/c1000, 2000), new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000), diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 9c52dc7751f..3e5cdd0bb51 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -192,3 +192,61 @@ icon_opened = "miningcaropen" icon_closed = "miningcar" +/*********************Mob Capsule*************************/ + +/obj/item/device/mobcapsule + name = "lazarus capsule" + desc = "It allows you to store and deploy lazarus-injected creatures easier." + icon = 'icons/obj/mobcap.dmi' + icon_state = "mobcap0" + w_class = 1.0 + throw_range = 20 + var/mob/living/simple_animal/captured = null + var/colorindex = 0 + +/obj/item/device/mobcapsule/Destroy() + if(captured) + qdel(captured) + captured = null + return ..() + +/obj/item/device/mobcapsule/attack(var/atom/A, mob/user, prox_flag) + if(!istype(A, /mob/living/simple_animal)) + return ..() + capture(A, user) + return 1 + +/obj/item/device/mobcapsule/proc/capture(var/mob/target, var/mob/U as mob) + var/mob/living/simple_animal/T = target + if(captured) + U << "Capture failed!: The capsule already has a mob registered to it!" + else + if(istype(T) && "neutral" in T.faction) + T.forceMove(src) + T.name = "[U.name]'s [initial(T.name)]" + T.cancel_camera() + name = "Lazarus Capsule: [initial(T.name)]" + U << "You placed a [T.name] inside the Lazarus Capsule!" + captured = T + else + U << "You can't capture that mob!" + +/obj/item/device/mobcapsule/throw_impact(atom/A, mob/user) + ..() + if(captured) + dump_contents(user) + +/obj/item/device/mobcapsule/proc/dump_contents(mob/user) + if(captured) + captured.forceMove(get_turf(src)) + if(captured.client) + captured.client.eye = captured.client.mob + captured.client.perspective = MOB_PERSPECTIVE + captured = null + +/obj/item/device/mobcapsule/attack_self(mob/user) + colorindex += 1 + if(colorindex >= 6) + colorindex = 0 + icon_state = "mobcap[colorindex]" + update_icon() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index edf31db3577..8fdde351e16 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -264,19 +264,27 @@ playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) if(!player_logged) M.visible_message( \ - "\blue [M] shakes [src] trying to wake [t_him] up!", \ - "\blue You shake [src] trying to wake [t_him] up!", \ + "[M] shakes [src] trying to wake [t_him] up!",\ + "You shake [src] trying to wake [t_him] up!",\ ) // BEGIN HUGCODE - N3X else - if (istype(src,/mob/living/carbon/human) && src:w_uniform) - var/mob/living/carbon/human/H = src - H.w_uniform.add_fingerprint(M) playsound(get_turf(src), 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - M.visible_message( \ - "\blue [M] gives [src] a [pick("hug","warm embrace")].", \ - "\blue You hug [src].", \ + if(M.zone_sel.selecting == "head") + M.visible_message(\ + "[M] pats [src] on the head.",\ + "You pat [src] on the head.",\ ) + else + + M.visible_message(\ + "[M] gives [src] a [pick("hug","warm embrace")].",\ + "You hug [src].",\ + ) + if(istype(src,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = src + if(H.w_uniform) + H.w_uniform.add_fingerprint(M) /mob/living/carbon/proc/eyecheck() @@ -771,4 +779,24 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, W.loc = loc W.dropped(src) if (W) - W.layer = initial(W.layer) \ No newline at end of file + W.layer = initial(W.layer) + + +/mob/living/carbon/proc/slip(var/description, var/stun, var/weaken, var/tilesSlipped, var/walkSafely, var/slipAny) + if (flying || buckled || (walkSafely && m_intent == "walk")) + return + 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) + return + if (tilesSlipped) + for(var/t = 0, t<=tilesSlipped, t++) + spawn (t) step(src, src.dir) + stop_pulling() + src << "You slipped on the [description]!" + playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) + if (stun) + Stun(stun) + Weaken(weaken) + return 1 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5da1d072d4a..4d6b2b7cb6c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -441,8 +441,7 @@ /mob/living/carbon/human/attack_slime(mob/living/carbon/slime/M as mob) if(M.Victim) return // can't attack while eating! - if (health > -100) - + if(stat != DEAD) M.do_attack_animation(src) visible_message("The [M.name] glomps [src]!", \ "The [M.name] glomps [src]!") diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 293a4fe2903..d0fa66b93ed 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -1,7 +1,7 @@ //Updates the mob's health from organs and mob damage variables /mob/living/carbon/human/updatehealth() if(status_flags & GODMODE) - health = 100 + health = maxHealth stat = CONSCIOUS return @@ -12,15 +12,15 @@ total_brute += O.brute_dam //calculates health based on organ brute and burn total_burn += O.burn_dam - health = 100 - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute + health = maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute //TODO: fix husking - if(((100 - total_burn) < config.health_threshold_dead) && stat == DEAD) //100 is the magic human max health number - ChangeToHusk() //BECAUSE NO ONE THOUGHT TO USE LIVING/VAR/MAXHEALTH I GUESS + if(((maxHealth - total_burn) < config.health_threshold_dead) && stat == DEAD) + ChangeToHusk() if(species.can_revive_by_healing) var/obj/item/organ/internal/brain/B = get_int_organ(/obj/item/organ/internal/brain) if(B) - if((health >= (config.health_threshold_dead / 100 * 75)) && stat == DEAD) + if((health >= (config.health_threshold_dead + config.health_threshold_crit) * 0.5) && stat == DEAD) update_revive() if(stat == CONSCIOUS && (src in dead_mob_list)) //Defib fix update_revive() diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 4442d59fe85..5278f0cc723 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -13,7 +13,7 @@ handle_embedded_objects() //Moving with objects stuck in you can cause bad times. - var/health_deficiency = (100 - health + staminaloss) + var/health_deficiency = (maxHealth - health + staminaloss) if(reagents) for(var/datum/reagent/R in reagents.reagent_list) if(R.shock_reduction) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index d52ad9665c0..0aeb3b0e8b2 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -295,14 +295,14 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if(istype(O)) O.add_autopsy_data("Radiation Poisoning", damage) /mob/living/carbon/human/breathe() - if(reagents.has_reagent("lexorin")) + + if((NO_BREATH in mutations) || (species && (species.flags & NO_BREATHE)) || reagents.has_reagent("lexorin")) + adjustOxyLoss(-5) + oxygen_alert = 0 + toxins_alert = 0 return - if(NO_BREATH in mutations) - return // No breath mutation means no breathing. //DID YOU REALLY NEED TO FUCKING STATE THIS? if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return - if(species && (species.flags & NO_BREATHE)) - return var/datum/gas_mixture/environment if(loc) diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index 9cf7a9ed428..6f95a8696ce 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -18,6 +18,12 @@ heat_level_2 = 400 // Heat damage level 2 above this point. heat_level_3 = 500 // Heat damage level 3 above this point. + suicide_messages = list( + "is twisting their own neck!", + "is letting some O2 in!", + "realizes the existential problem of being made out of plasma!", + "shows their true colors, which happens to be the color of plasma!") + /datum/species/plasmaman/say_filter(mob/M, message, datum/language/speaking) if(copytext(message, 1, 2) != "*") message = replacetext(message, "s", stutter("ss")) diff --git a/code/modules/mob/living/carbon/human/species/skeleton.dm b/code/modules/mob/living/carbon/human/species/skeleton.dm index 7c813b4b1be..713a83d1180 100644 --- a/code/modules/mob/living/carbon/human/species/skeleton.dm +++ b/code/modules/mob/living/carbon/human/species/skeleton.dm @@ -31,8 +31,31 @@ heat_level_2 = 999999999 heat_level_3 = 999999999 heat_level_3_breathe = 999999999 - + suicide_messages = list( "is snapping their own bones!", "is collapsing into a pile!", - "is twisting their skull off!") \ No newline at end of file + "is twisting their skull off!") + has_organ = list( + "brain" = /obj/item/organ/brain/golem, + ) + +/datum/species/skeleton/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R) + // Crazylemon is still silly + if(R.id == "milk") + H.heal_overall_damage(4,4) + if(prob(5)) // 5% chance per proc to find a random limb, and mend it + var/list/our_organs = H.organs.Copy() + shuffle(our_organs) + for(var/obj/item/organ/external/L in our_organs) + if(istype(L)) + if(L.brute_dam < L.min_broken_damage) + L.status &= ~ORGAN_BROKEN + L.status &= ~ORGAN_SPLINTED + L.perma_injury = 0 + break // We're only checking one limb here, bucko + if(prob(3)) + H.say(pick("Thanks Mr Skeltal", "Thank for strong bones", "Doot doot!")) + return 1 + + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index decbf8975a5..1151175ccb2 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -392,7 +392,7 @@ H.see_invisible = SEE_INVISIBLE_LIVING if(H.mind && H.mind.vampire) - if(VAMP_VISION in H.mind.vampire.powers && !(VAMP_FULL in H.mind.vampire.powers)) + if((VAMP_VISION in H.mind.vampire.powers) && (!(VAMP_FULL in H.mind.vampire.powers))) H.sight |= SEE_MOBS else if(VAMP_FULL in H.mind.vampire.powers) @@ -619,4 +619,11 @@ It'll return null if the organ doesn't correspond, so include null checks when u /datum/species/proc/return_organ(var/organ_slot) if(!(organ_slot in has_organ)) return null - return has_organ[organ_slot] \ No newline at end of file + return has_organ[organ_slot] + +// Do species-specific reagent handling here +// 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) + return 1 \ 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 43afd4e1e77..a87a28804a1 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -182,6 +182,13 @@ blood_color = "#1D2CBF" reagent_tag = PROCESS_ORG + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their thumbs into their eye sockets!", + "is twisting their own neck!", + "makes like a fish and suffocates!", + "is strangling themselves with their own tendrils!") + /datum/species/vox name = "Vox" name_plural = "Vox" @@ -374,7 +381,8 @@ suicide_messages = list( "is melting into a puddle!", - "is turning a dull, brown color and melting into a puddle!") + "is turning a dull, brown color and melting into a puddle!", + "is ripping out their own core!") /datum/species/grey name = "Grey" @@ -478,7 +486,8 @@ suicide_messages = list( "is losing branches!", - "is pulling themselves apart!") + "is pulling themselves apart!", + "pulls out a secret stash of herbicide and takes a hearty swig!") /datum/species/diona/can_understand(var/mob/other) var/mob/living/simple_animal/diona/D = other @@ -577,7 +586,9 @@ "is powering down!", "is smashing their own monitor!", "is twisting their own neck!", - "is blocking their ventilation port!") + "is blocking their ventilation port!", + "is downloading extra RAM!", + "is frying their own circuits!") /datum/species/machine/handle_death(var/mob/living/carbon/human/H) H.h_style = "" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 58c6cb3b650..a3878647b44 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -462,7 +462,9 @@ var/global/list/damage_icon_parts = list() if(hair_style && hair_style.species_allowed) if(src.species.name in hair_style.species_allowed) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") - if(hair_style.do_colouration) + if(src.get_species() == "Slime People") // I am el worstos + hair_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND) + else if(hair_style.do_colouration) hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) hair_standing.Blend(hair_s, ICON_OVERLAY) @@ -497,7 +499,9 @@ var/global/list/damage_icon_parts = list() if(facial_hair_style && facial_hair_style.species_allowed) if(src.species.name in facial_hair_style.species_allowed) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") - if(facial_hair_style.do_colouration) + if(src.get_species() == "Slime People") // I am el worstos + facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND) + else if(facial_hair_style.do_colouration) facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) face_standing.Blend(facial_s, ICON_OVERLAY) else diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index a1e9496080d..9db076569fc 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -2,7 +2,7 @@ /mob/living/Destroy() ..() return QDEL_HINT_HARDDEL_NOW - + /mob/living/Stat() . = ..() if(. && get_rig_stats) @@ -34,11 +34,17 @@ /mob/living/verb/succumb() set hidden = 1 if (InCritical()) - src.attack_log += "[src] has ["succumbed to death"] with [round(health, 0.1)] points of health!" - src.adjustOxyLoss(src.health - config.health_threshold_dead) + attack_log += "[src] has ["succumbed to death"] with [round(health, 0.1)] points of health!" + adjustOxyLoss(health - config.health_threshold_dead) updatehealth() + // super check for weird mobs, including ones that adjust hp + // we don't want to go overboard and gib them, though + for(var/i = 1 to 5) + if(health < config.health_threshold_dead) + break + take_overall_damage(max(5, health - config.health_threshold_dead), 0) + updatehealth() src << "You have given up life and succumbed to death." - death() /mob/living/proc/InCritical() return (src.health < 0 && src.health > -95.0 && stat == UNCONSCIOUS) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index c870c742573..a9e4703a8ad 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -71,7 +71,6 @@ var/list/ai_verbs_default = list( var/mob/living/silicon/ai/parent = null - var/apc_override = 0 //hack for letting the AI use its APC even when visionless var/camera_light_on = 0 //Defines if the AI toggled the light on the camera it's looking through. var/datum/trackable/track = null var/last_paper_seen = null diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 934cdb393c1..93ee8a54a2b 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -135,10 +135,8 @@ src << "Receiving control information from APC." sleep(2) //bring up APC dialog - apc_override = 1 - theAPC.attack_ai(src) - apc_override = 0 aiRestorePowerRoutine = 3 + theAPC.attack_ai(src) src << "Here are your current laws:" src.show_laws() //WHY THE FUCK IS THIS HERE sleep(50) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 21f88b5913b..da3283355f3 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -78,21 +78,6 @@ var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) adjustBruteLoss(damage) -/mob/living/simple_animal/construct/attackby(var/obj/item/O as obj, var/mob/user as mob, params) - 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("\red \b [src] has been attacked with [O] by [user]. ") - else - usr << "\red This weapon is ineffective, it does no damage." - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red [user] gently taps [src] with [O]. ") - /mob/living/simple_animal/construct/narsie_act() return @@ -120,26 +105,7 @@ attack_sound = 'sound/weapons/punch3.ogg' status_flags = 0 construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall) - -/mob/living/simple_animal/construct/armoured/attackby(var/obj/item/O as obj, var/mob/user as mob, params) - if(O.force) - if(O.force >= 11) - 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("\red \b [src] has been attacked with [O] by [user]. ") - else - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red \b [O] bounces harmlessly off of [src]. ") - else - usr << "\red This weapon is ineffective, it does no damage." - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red [user] gently taps [src] with [O]. ") + force_threshold = 11 /mob/living/simple_animal/construct/armoured/Life() @@ -245,30 +211,10 @@ speed = 5 environment_smash = 2 attack_sound = 'sound/weapons/punch4.ogg' + force_threshold = 11 var/energy = 0 var/max_energy = 1000 -/mob/living/simple_animal/construct/behemoth/attackby(var/obj/item/O as obj, var/mob/user as mob, params) - if(O.force) - if(O.force >= 11) - 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("\red \b [src] has been attacked with [O] by [user]. ") - else - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red \b [O] bounces harmlessly off of [src]. ") - else - usr << "\red This weapon is ineffective, it does no damage." - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red [user] gently taps [src] with [O]. ") - - /////////////////////////////Harvester///////////////////////// diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm index 88c8980a75e..a6c5effdde3 100644 --- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm +++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm @@ -17,6 +17,8 @@ density = 0 pass_flags = PASSTABLE | PASSGRILLE | PASSMOB ventcrawler = 2 + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + meat_amount = 0 /mob/living/simple_animal/butterfly/New() ..() diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index a805d06a1e4..c2118b19bc1 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -20,3 +20,5 @@ density = 0 pass_flags = PASSTABLE | PASSMOB can_hide = 1 + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + meat_amount = 1 diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 61a94e883c3..0738bb17e6a 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -414,7 +414,7 @@ else if(meat_type && (stat == DEAD)) //if the animal has a meat, and if it is dead. if(istype(O, /obj/item/weapon/kitchen/knife)) harvest() - else + else if(istype(O) && istype(user) && !O.attack(src, user)) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) var/damage = 0 diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index c6105863622..e8b9f948ee7 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -257,15 +257,21 @@ datum/preferences preview_icon.Blend(markings_s, ICON_OVERLAY) - var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = current_species ? current_species.eyes : "eyes_s") - eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) + var/icon/face_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "bald_s") + if(!(current_species.bodyflags & NO_EYES)) + var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = current_species ? current_species.eyes : "eyes_s") + eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) + face_s.Blend(eyes_s, ICON_OVERLAY) var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] if(hair_style) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") - hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) - eyes_s.Blend(hair_s, ICON_OVERLAY) + if(current_species.name == "Slime People") // whee I am part of the problem + hair_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_ADD) + else + hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) + face_s.Blend(hair_s, ICON_OVERLAY) //Head Accessory if(current_species && (current_species.bodyflags & HAS_HEAD_ACCESSORY)) @@ -273,13 +279,16 @@ datum/preferences if(head_accessory_style && head_accessory_style.species_allowed) var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s") head_accessory_s.Blend(rgb(r_headacc, g_headacc, b_headacc), ICON_ADD) - eyes_s.Blend(head_accessory_s, ICON_OVERLAY) + face_s.Blend(head_accessory_s, ICON_OVERLAY) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] if(facial_hair_style && facial_hair_style.species_allowed) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") - facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) - eyes_s.Blend(facial_s, ICON_OVERLAY) + if(current_species.name == "Slime People") // whee I am part of the problem + facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_ADD) + else + facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) + face_s.Blend(facial_s, ICON_OVERLAY) var/icon/underwear_s = null if(underwear && (current_species.clothing_flags & HAS_UNDERWEAR)) @@ -829,12 +838,11 @@ datum/preferences preview_icon.Blend(socks_s, ICON_OVERLAY) if(clothes_s) preview_icon.Blend(clothes_s, ICON_OVERLAY) - if(!(current_species.bodyflags & NO_EYES)) - preview_icon.Blend(eyes_s, ICON_OVERLAY) + preview_icon.Blend(face_s, ICON_OVERLAY) preview_icon_front = new(preview_icon, dir = SOUTH) preview_icon_side = new(preview_icon, dir = WEST) - qdel(eyes_s) + qdel(face_s) qdel(underwear_s) qdel(undershirt_s) qdel(socks_s) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 4643974d0eb..72d35aef201 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -42,7 +42,7 @@ var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations // Restrict some styles to specific species - var/list/species_allowed = list("Human") + var/list/species_allowed = list("Human", "Slime People") // Whether or not the accessory can be affected by colouration var/do_colouration = 1 @@ -485,7 +485,7 @@ name = "Shaved" icon_state = "bald" gender = NEUTER - species_allowed = list("Human","Unathi","Tajaran","Skrell","Vox","Diona","Kidan","Greys","Machine", "Vulpkanin") + species_allowed = list("Human","Unathi","Tajaran","Skrell","Vox","Diona","Kidan","Greys","Machine", "Vulpkanin", "Slime People") watson @@ -631,6 +631,11 @@ species_allowed = list("Skrell") gender = FEMALE + taj_ears + name = "Tajaran Ears" + icon_state = "ears_plain" + species_allowed = list("Tajaran") + taj_ears_clean name = "Tajara Clean" icon_state = "hair_clean" diff --git a/code/modules/nano/interaction/default.dm b/code/modules/nano/interaction/default.dm index bd5ba3ee0c8..e0e7c3a98f6 100644 --- a/code/modules/nano/interaction/default.dm +++ b/code/modules/nano/interaction/default.dm @@ -32,6 +32,9 @@ /mob/living/silicon/ai/default_can_use_topic(var/src_object) . = shared_nano_interaction() + // Fix the weird hacking blurb to actually let them restore power + if(aiRestorePowerRoutine == 3 && istype(src_object, /obj/machinery/power/apc)) + return STATUS_INTERACTIVE if(. != STATUS_INTERACTIVE) return diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index e063a6b3bdf..ffb075c8c34 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -47,7 +47,7 @@ var/mob/living/silicon/robot/R = src.loc if(R && R.cell) R.cell.use(charge_cost) - in_chamber = new/obj/item/projectile/beam(src) + in_chamber = new projectile_type(src) return 1 return 0 diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index d88e540adf3..9bb7d479de5 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -203,16 +203,13 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. charge_cost = 5000 cell_type = "/obj/item/weapon/stock_parts/cell/emproof" fire_delay = 16 //Because guncode is bad and you can bug the reload for rapid fire otherwise. - var/overheat = 0 - var/overheat_time = 16 - var/recent_reload = 1 + var/recently_fired = 0 /obj/item/weapon/gun/energy/kinetic_accelerator/super name = "super-kinetic accelerator" desc = "An upgraded, superior version of the proto-kinetic accelerator." icon_state = "kineticgun_u" projectile_type = "/obj/item/projectile/kinetic/super" - overheat_time = 15 fire_delay = 15 origin_tech = "combat=3;powerstorage=2" @@ -221,7 +218,6 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. desc = "An upgraded, even more superior version of the proto-kinetic accelerator." icon_state = "kineticgun_h" projectile_type = "/obj/item/projectile/kinetic/hyper" - overheat_time = 13 fire_delay = 13 origin_tech = "combat=4;powerstorage=3" @@ -229,26 +225,23 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. flags = NODROP /obj/item/weapon/gun/energy/kinetic_accelerator/Fire() - overheat = 1 - spawn(overheat_time) - overheat = 0 - recent_reload = 0 + if(!recently_fired) + recently_fired = 1 + spawn(fire_delay) + reload(usr) ..() /obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity) return -/obj/item/weapon/gun/energy/kinetic_accelerator/attack_self(var/mob/living/user/L) - if(overheat || recent_reload) - return +/obj/item/weapon/gun/energy/kinetic_accelerator/proc/reload(mob/living/user) power_supply.give(5000) if(!silenced) playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) - else + else if(user) usr << "You silently charge [src]." - recent_reload = 1 + recently_fired = 0 update_icon() - return /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow name = "mini energy crossbow" @@ -261,7 +254,6 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. silenced = 1 projectile_type = "/obj/item/projectile/energy/bolt" fire_sound = 'sound/weapons/Genhit.ogg' - overheat_time = 20 fire_delay = 20 /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/large diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index f9c8dead1b8..5fe33d73b03 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -578,7 +578,7 @@ if (count <= 0) return var/amount_per_pill = reagents.total_volume/count if (amount_per_pill > 50) amount_per_pill = 50 - var/name = input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill] units)") as text|null + var/name = input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill]u)") as text|null if(!name) return name = reject_bad_text(name) @@ -618,7 +618,7 @@ if (count > 20) count = 20 //Pevent people from creating huge stacks of patches easily. Maybe move the number to defines? var/amount_per_patch = reagents.total_volume/count if (amount_per_patch > 40) amount_per_patch = 40 - var/name = input(usr,"Name:","Name your patch!","[reagents.get_master_reagent_name()] ([amount_per_patch] units)") as text|null + var/name = input(usr,"Name:","Name your patch!","[reagents.get_master_reagent_name()] ([amount_per_patch]u)") as text|null if(!name) return name = reject_bad_text(name) diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm index 69679560ef8..aac5157403e 100644 --- a/code/modules/reagents/newchem/drugs.dm +++ b/code/modules/reagents/newchem/drugs.dm @@ -165,6 +165,10 @@ addiction_threshold = 10 metabolization_rate = 0.6 +/datum/reagent/methamphetamine/meth2 //for donk pockets + id = "methamphetamine2" + addiction_threshold = 20 + /datum/reagent/methamphetamine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom var/high_message = pick("You feel hyper.", "You feel like you need to go faster.", "You feel like you can run the world.") diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm index 92aa05c0280..40a4905e0ef 100644 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -32,9 +32,14 @@ datum/reagents/proc/metabolize(var/mob/M) //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 handle_reagents returns 0, it's doing the reagent removal on its own + var/species_handled = !(H.species.handle_reagents(H, R)) + can_process = can_process && !species_handled //If the mob can't process it, remove the reagent at it's normal rate without doing any addictions, overdoses, or on_mob_life() for the reagent if(can_process == 0) - R.holder.remove_reagent(R.id, R.metabolization_rate) + if(!species_handled) + R.holder.remove_reagent(R.id, R.metabolization_rate) continue //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 diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm index eea7dfad6c4..b7c296443b5 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_water.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm @@ -223,9 +223,18 @@ M.fakevomit(1) else M.fakevomit(0) - ..() + ..() return +/datum/reagent/fishwater/toiletwater + name = "Toilet Water" + id = "toiletwater" + description = "Filthy water scoured from a nasty toilet bowl. Absolutely disgusting." + reagent_state = LIQUID + color = "#757547" + +/datum/reagent/fishwater/toiletwater/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) //For shennanigans + return /datum/reagent/holywater name = "Water" diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 3fa08e42a03..20eaf7dbd79 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -12,9 +12,13 @@ set name = "Set transfer amount" set category = "Object" set src in range(0) + if(usr.stat || !usr.canmove || usr.restrained()) return - var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts + var/default = null + if(amount_per_transfer_from_this in possible_transfer_amounts) + default = amount_per_transfer_from_this + var/N = input("Amount per transfer from this:", "[src]", default) as null|anything in possible_transfer_amounts if (N) amount_per_transfer_from_this = N diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index f9d0f1136a8..21636735093 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -834,7 +834,7 @@ reagents.add_reagent("synaptizine", 15) reagents.add_reagent("salglu_solution", 15) reagents.add_reagent("salbutamol", 15) - reagents.add_reagent("methamphetamine", 15) + reagents.add_reagent("methamphetamine2", 15) /obj/item/weapon/reagent_containers/food/snacks/brainburger name = "brainburger" diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index a10e265fecf..b7c891370b0 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -23,6 +23,7 @@ /obj/structure/table, /obj/structure/closet, /obj/structure/sink, + /obj/structure/toilet, /obj/item/weapon/storage, /obj/machinery/atmospherics/unary/cryo_cell, /obj/machinery/dna_scannernew, @@ -336,7 +337,7 @@ materials = list(MAT_METAL=200) w_class = 3.0 amount_per_transfer_from_this = 20 - possible_transfer_amounts = list(5,10,15,25,30,50,80,100,120) + possible_transfer_amounts = list(5,10,15,20,25,30,50,80,100,120) volume = 120 flags = OPENCONTAINER diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 802c2a5f25d..ed2809896c7 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -92,6 +92,7 @@ icon_state = "weldtank" amount_per_transfer_from_this = 10 var/obj/item/device/assembly_holder/rig = null + var/accepts_rig = 1 /obj/structure/reagent_dispensers/fueltank/New() ..() @@ -126,7 +127,7 @@ overlays = new/list() /obj/structure/reagent_dispensers/fueltank/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if (istype(W,/obj/item/device/assembly_holder)) + if (istype(W,/obj/item/device/assembly_holder) && accepts_rig) if (rig) user << "\red There is another device in the way." return ..() @@ -254,3 +255,9 @@ /obj/structure/reagent_dispensers/spacecleanertank/New() ..() reagents.add_reagent("cleaner",5000) + +/obj/structure/reagent_dispensers/fueltank/chem + icon_state = "weldingtank_chem" + anchored = 1 + density = 0 + accepts_rig = 0 \ No newline at end of file diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 6112d6f5a9b..017bf478bd4 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -177,6 +177,7 @@ proc/CallMaterialName(ID) /obj/machinery/computer/rdconsole/emag_act(user as mob) if(!emagged) playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + req_access = list() emagged = 1 user << "You disable the security protocols" diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index 531e49526b1..502b2a4b16c 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -571,7 +571,11 @@ Note that amputating the affected organ does in fact remove the infection from t if(!(status & ORGAN_ROBOT) && W.bleeding()) W.bleed_timer-- - status |= ORGAN_BLEEDING + if(H && (H.species.flags & NO_BLOOD)) // Bloodless organic races are finicky + W.clamped = 1 + W.bleed_timer = 0 + else + status |= ORGAN_BLEEDING clamped |= W.clamped diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm index 96de3ea89ac..193e86fbb76 100644 --- a/code/modules/surgery/organs/organ_icon.dm +++ b/code/modules/surgery/organs/organ_icon.dm @@ -67,7 +67,9 @@ var/global/list/limb_icon_cache = list() var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style] if(facial_hair_style && facial_hair_style.species_allowed && (species.name in facial_hair_style.species_allowed)) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") - if(facial_hair_style.do_colouration) + 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) + else if(facial_hair_style.do_colouration) facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD) overlays |= facial_s @@ -75,7 +77,9 @@ var/global/list/limb_icon_cache = list() var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style] if(hair_style && (species.name in hair_style.species_allowed)) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") - if(hair_style.do_colouration) + 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) + else if(hair_style.do_colouration) hair_s.Blend(rgb(owner.r_hair, owner.g_hair, owner.b_hair), ICON_ADD) overlays |= hair_s diff --git a/html/changelog.html b/html/changelog.html index 56172c88974..1ee52cfb38c 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,95 @@ -->
+

10 February 2016

+

Crazylemon64 updated:

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

Fox McCloud updated:

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

Glorken updated:

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

KasparoVy updated:

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

PPI updated:

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

Regen updated:

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

Spacemanspark updated:

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

Tastyfish updated:

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

TheDZD updated:

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

31 January 2016

Crazylemon64 updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 70cedd14768..b296bd4a74f 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -379,3 +379,97 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: Adds NanoUI to the operating computer - rscadd: Adds health announcing, critical and oxygen damage aural alerts to the computer, with a menu to selectively turn them on and off +2016-02-10: + Crazylemon64: + - tweak: The cloner now checks for NO_SCAN on the brain when scanning - unclonable + species are now truly unclonable. You are still able to revive them with a brain + transplant and a defib, however. + - rscadd: A tier-4 DNA scanner linked to a cloning system will now be able to reproduce + a body from a brain's DNA, in event of the original corpse being gibbed or similar. + - bugfix: Species with organic limbs and NO_BLOOD will no longer bleed (though still + on hit - write that off as "bone powder") + - tweak: Skeletons now lack internal organs, except for the runic mind which exists + in their head - an analogue for the brain + - rscadd: Skeletons that drink milk will be regenerated at a moderate pace, have + a small chance of mending bones, and will praise the great name of mr skeltal + - tweak: Adds a reagent system for species reacting to specific reagents + - rscadd: Slime People can now select from all human hairstyles, and their "hair" + will be tinted a shade of their body. + - tweak: Increases the frequency of the cortical borer event. + - tweak: People with borers cannot commit suicide - this applies to a controlling + borer, too. + - tweak: Borers can no longer overdose their hosts. + - tweak: Borers can now inject Saline-Glucose, Spaceacillin, Hydrocodone, Mitocholide, + Salbutamol, Capulettium+, and Charcoal. Styptic was removed, as it's pathetic + at healing when directly injected. Salicyclic acid was removed too, as its functionality + is duplicated by both hydrocodone and saline-glucose. + - bugfix: A mind trapped by a cortical borer can now understand things it could + understand when normally in its body. + - rscadd: Changes chemistry's welding tank to a wall-mounted version, to increase + the room available. + - rscadd: You can now gib butterflies and lizards with a knife + - rscadd: Ghosts can now follow mecha + - bugfix: You can now access an R&D console by emagging it - it did nothing before. + - bugfix: Walls will now properly smooth and show damage. + - bugfix: Fixes the dialog that occurs when the AI shuts off to actually do what + it says it does + Fox McCloud: + - bugfix: Fixes not being able to attach IEDs to beartraps + - bugfix: Can no longer spamclick someone to death using headslamming on a toilet/urimal + - tweak: Toilet/urinal headslamming now plays a sound + - tweak: Toilet headslamming damage reduced slightly + - rscadd: Can now fill open reagent containers in a toilet to receive "toilet water". + - tweak: No more message spam when someone fills a container using a sink + - rscadd: Can now wash your face using a sink, which washes away lipstick and wakes + you up slightly + - tweak: Washing things will now use progress bars + - tweak: Ensures consuming a single syndicate donk pocket won't get you addicted + to meth + - tweak: Kinetic Accelerators and E-bows automatically reload + Glorken: + - rscadd: Added a Knight Arena for Holodeck. + - imageadd: Added red and blue claymore sprites. + - spellcheck: Changed overrided to overrode when emagging Holodeck computer. + KasparoVy: + - rscadd: Vox versions of the Officer SWAT sechailer + HOS SWAT sechailer + Warden + SWAT sechailer. + - rscadd: Resprited versions of most Human masks to fit Unathi, Tajara and Vulpkanin. + - rscadd: Warden now gets their own version of the SWAT sechailer in their locker. + - tweak: HOS now gets the appropriate version of the SWAT sechailer in their locker. + - tweak: Repositioned smokeables now available for Vox, Unathi, Tajara and Vulpkanin. + - tweak: Properly shades Vox bandana down-state sprites. + - rscadd: Readds Tajaran bald hairstyle. + - rscadd: Alternate style of non-Human breath mask (incl. surgical/sterile mask) + down-state positioning. + - tweak: Corrects all non-Human species' breath mask (incl. surgical/sterile mask) + down-state icons to use the right position style. + - tweak: Minor adjustments to Tajaran breath mask up-state sprites. + PPI: + - rscadd: Adds a reconnect button to the File menu in the client. + - rscadd: Adds head patting + Regen: + - tweak: Powersink can now drain a lot more power before going boom + - tweak: Buffed the powersinks drain rate + - tweak: Buffed explosion from an overloaded powersink, try to find it instead of + overloading the grid. + - rscadd: Admin log warning before the powersink explodes + Spacemanspark: + - rscadd: Miners can now utilize the power of mob capsules to take along their lazarus + injected mining creatures! + - rscadd: Store your Pokemo- er, sorry, I mean mining mobs that you've captured + in the lazarus capsule belt. + Tastyfish: + - bugfix: Species that don't breathe can kill themselves now! + - rscadd: Suicide messages are now catered to your species. + - tweak: Shortened the default pill & patch name when using the ChemMaster. + - rscadd: The chaplain now has a service radio headset, as Space Jesus intended. + TheDZD: + - tweak: When Ahelping, "Question" is now "Mentorhelp" and "Player Complaint" is + now "Adminhelp." + - tweak: Mentorhelps and PM replies from mentors appear in a bold aqua blue color. + - tweak: Adminhelps and PM replies from admins appear in a bold bright red color. + - tweak: PM replies from players appear in a dull/dark purple color. + - rscadd: Adds admin attack log to players being converted to cult. + - rscadd: Adds shadowling thrall jobbans. + - rscadd: Jobbanned players who are converted to shadowling thrall, revolutionary, + or cultist will have the control of their body offered up to eligible ghosts. diff --git a/html/changelogs/AutoChangeLog-pr-3455.yml b/html/changelogs/AutoChangeLog-pr-3455.yml deleted file mode 100644 index 404b0cc887f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3455.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Glorken -delete-after: True -changes: - - rscadd: "Added a Knight Arena for Holodeck." - - imageadd: "Added red and blue claymore sprites." - - spellcheck: "Changed overrided to overrode when emagging Holodeck computer." diff --git a/html/changelogs/AutoChangeLog-pr-3461.yml b/html/changelogs/AutoChangeLog-pr-3461.yml deleted file mode 100644 index ca27ae1f755..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3461.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Tastyfish -delete-after: True -changes: - - bugfix: "Species that don't breathe can kill themselves now!" - - rscadd: "Suicide messages are now catered to your species." diff --git a/html/changelogs/AutoChangeLog-pr-3462.yml b/html/changelogs/AutoChangeLog-pr-3462.yml deleted file mode 100644 index be27197c72a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3462.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: KasparoVy -delete-after: True -changes: - - rscadd: "Vox versions of the Officer SWAT sechailer + HOS SWAT sechailer + Warden SWAT sechailer." - - rscadd: "Resprited versions of most Human masks to fit Unathi, Tajara and Vulpkanin." - - rscadd: "Warden now gets their own version of the SWAT sechailer in their locker." - - tweak: "HOS now gets the appropriate version of the SWAT sechailer in their locker." - - tweak: "Repositioned smokeables now available for Vox, Unathi, Tajara and Vulpkanin." - - tweak: "Properly shades Vox bandana down-state sprites." diff --git a/html/changelogs/AutoChangeLog-pr-3556.yml b/html/changelogs/AutoChangeLog-pr-3556.yml new file mode 100644 index 00000000000..b7aedebe4fe --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3556.yml @@ -0,0 +1,4 @@ +author: Crazylemon64 +delete-after: True +changes: + - tweak: "Relaxes the check on what atoms you can follow to any movable atom" diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index 38b7f17c679..70aa813cbb8 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/human_races/r_slime.dmi b/icons/mob/human_races/r_slime.dmi index 56e1d63d371..21729a5c367 100644 Binary files a/icons/mob/human_races/r_slime.dmi and b/icons/mob/human_races/r_slime.dmi differ diff --git a/icons/mob/species/tajaran/mask.dmi b/icons/mob/species/tajaran/mask.dmi index 0b046910f48..a54464d1f2d 100644 Binary files a/icons/mob/species/tajaran/mask.dmi and b/icons/mob/species/tajaran/mask.dmi differ diff --git a/icons/mob/species/unathi/mask.dmi b/icons/mob/species/unathi/mask.dmi index 80b212e9008..e1b2f430e02 100644 Binary files a/icons/mob/species/unathi/mask.dmi and b/icons/mob/species/unathi/mask.dmi differ diff --git a/icons/mob/species/vox/mask.dmi b/icons/mob/species/vox/mask.dmi index 632ffe24c6f..fd7fb656620 100644 Binary files a/icons/mob/species/vox/mask.dmi and b/icons/mob/species/vox/mask.dmi differ diff --git a/icons/mob/species/vulpkanin/mask.dmi b/icons/mob/species/vulpkanin/mask.dmi index 86c84471a08..fb17cd483a4 100644 Binary files a/icons/mob/species/vulpkanin/mask.dmi and b/icons/mob/species/vulpkanin/mask.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 85d9cffdbfc..7427f32fd3e 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/mobcap.dmi b/icons/obj/mobcap.dmi new file mode 100644 index 00000000000..829593a2849 Binary files /dev/null and b/icons/obj/mobcap.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index af2b1274097..3ec5db973f5 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/interface/skin.dmf b/interface/skin.dmf index b227491cf6a..c3d9f693726 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1374,6 +1374,15 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" + elem + name = "&Reconnect" + command = ".reconnect" + category = "&File" + is-checked = false + can-check = false + group = "" + is-disabled = false + saved-params = "is-checked" elem name = "" command = "" diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index caa1f6950af..db264270f2c 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -19,10 +19,13 @@ em {font-style: normal; font-weight: bold;} .looc {color: #6699CC;} .adminobserverooc {color: #0099cc; font-weight: bold;} .adminooc {color: #b82e00; font-weight: bold;} +.mentorhelp {color: #0077bb; font-weight: bold;} .adminobserver {color: #996600; font-weight: bold;} .admin {color: #386aff; font-weight: bold;} +.playerreply {color: #8800bb; font-weight: bold;} + .name { font-weight: bold;} .say {} @@ -54,6 +57,7 @@ h1.alert, h2.alert {color: #000000;} .disarm {color: #990000;} .passive {color: #660000;} +.biggerdanger {color: #ff0000; font-weight: bold; font-size: 5;} .userdanger {color: #ff0000; font-weight: bold; font-size: 3;} .danger {color: #ff0000; font-weight: bold;} .warning {color: #ff0000; font-style: italic;} diff --git a/nano/templates/cloning_console.tmpl b/nano/templates/cloning_console.tmpl index ffb9502d181..c541ca6d6b4 100644 --- a/nano/templates/cloning_console.tmpl +++ b/nano/templates/cloning_console.tmpl @@ -56,11 +56,19 @@ Used In File(s): \code\game\machinery\computer\cloning.dm
    Scan Occupant
    {{:helper.link('Scan', 'search', {'scan' : 1}, !data.occupant ? 'disabled' : '')}}
    -
    +
Scanner Lock
{{if data.occupant}}{{:helper.link('Engaged', 'lock', {'lock' : 1}, data.locked ? 'selected' : '')}}{{else}} {{:helper.link('Engaged', 'lock', null, 'disabled')}}{{/if}}{{:helper.link('Disengaged', 'unlock', {'lock' : 1}, !data.locked ? 'selected' : '')}}
-
+ + {{if data.can_brainscan}} +
+
Scan Mode
+
+ {{:helper.link('Brain', null, {'toggle_mode' : 1}, !data.scan_mode ? '' : 'selected')}}{{:helper.link('Body', null, {'toggle_mode' : 1}, data.scan_mode ? '' : 'selected')}} +
+
+ {{/if}} {{/if}} {{if data.numberofpods}}

Pods

diff --git a/paradise.dme b/paradise.dme index 915019f91ef..21a15e95ada 100644 --- a/paradise.dme +++ b/paradise.dme @@ -840,6 +840,7 @@ #include "code\game\objects\structures\safe.dm" #include "code\game\objects\structures\signs.dm" #include "code\game\objects\structures\spirit_board.dm" +#include "code\game\objects\structures\statue.dm" #include "code\game\objects\structures\tables_racks.dm" #include "code\game\objects\structures\tank_dispenser.dm" #include "code\game\objects\structures\target_stake.dm" @@ -884,7 +885,6 @@ #include "code\game\objects\structures\transit_tubes\station.dm" #include "code\game\objects\structures\transit_tubes\transit_tube.dm" #include "code\game\objects\structures\transit_tubes\transit_tube_pod.dm" -#include "code\game\structure\structure.dm" #include "code\game\turfs\simulated.dm" #include "code\game\turfs\turf.dm" #include "code\game\turfs\unsimulated.dm"