diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index d1d713fcf26..86d179f0923 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -7265,7 +7265,7 @@ "cJK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/virology) "cJL" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/medical/virology) "cJM" = (/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Virology APC"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitegreen"},/area/medical/virology) -"cJN" = (/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/table/glass,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 9},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreen"},/area/medical/virology) +"cJN" = (/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreen"},/area/medical/virology) "cJO" = (/obj/machinery/smartfridge/medbay,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "whitegreenfull"},/area/medical/virology) "cJP" = (/obj/machinery/reagentgrinder{pixel_y = 8},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitegreen"},/area/medical/virology) "cJQ" = (/obj/item/clothing/gloves/color/latex,/obj/item/device/healthanalyzer,/obj/item/clothing/glasses/hud/health,/obj/structure/reagent_dispensers/virusfood{density = 0; pixel_x = 0; pixel_y = 30},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreen"},/area/medical/virology) @@ -7320,7 +7320,7 @@ "cKN" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/medical/virology) "cKO" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Test Subject Cell"; req_access_txt = "39"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/virology) "cKP" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/medical/virology) -"cKQ" = (/obj/item/device/radio/intercom{pixel_x = -28; pixel_y = 0},/obj/machinery/light/small{dir = 8},/obj/machinery/computer/centrifuge,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/virology) +"cKQ" = (/obj/item/device/radio/intercom{pixel_x = -28; pixel_y = 0},/obj/machinery/light/small{dir = 8},/obj/structure/table/glass,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 9},/obj/structure/sign/deathsposal{pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/virology) "cKR" = (/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology) "cKS" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology) "cKT" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Virologist"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/medical/virology) @@ -7363,16 +7363,16 @@ "cLE" = (/obj/item/device/flashlight/lamp,/turf/simulated/floor/plating/airless{dir = 2; icon_state = "warnplate"},/area/toxins/test_area) "cLF" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plating/airless{dir = 6; icon_state = "warnplate"},/area/toxins/test_area) "cLG" = (/obj/item/device/radio/intercom{pixel_x = -28; pixel_y = 0},/obj/structure/table/glass,/obj/item/weapon/hand_labeler,/obj/item/device/radio/headset/headset_med,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/camera{c_tag = "Virology - Cells"; dir = 4; network = list("SS13","Medbay")},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitegreen"},/area/medical/virology) -"cLH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/computer/diseasesplicer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology) +"cLH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology) "cLI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology) -"cLJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/obj/machinery/disease2/diseaseanalyser,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology) +"cLJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology) "cLK" = (/obj/structure/rack,/obj/item/weapon/crowbar/red,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 26},/obj/item/weapon/wrench,/obj/item/weapon/restraints/handcuffs,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreen"},/area/medical/virology) "cLL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/window{useFull = 1; tag = "fullWin"},/turf/simulated/floor/plating,/area/medical/virology) -"cLM" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty{pixel_x = -3; pixel_y = -3},/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/BMinus{pixel_x = -4; pixel_y = 4},/obj/item/weapon/reagent_containers/blood/BPlus{pixel_x = 1; pixel_y = 2},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OPlus{pixel_x = -2; pixel_y = -1},/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/virology) +"cLM" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/virology) "cLN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cLO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cLP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) -"cLQ" = (/obj/machinery/light_switch{pixel_x = 26; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/disease2/isolator,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreen"},/area/medical/virology) +"cLQ" = (/obj/machinery/light_switch{pixel_x = 26; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/computer/pandemic,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreen"},/area/medical/virology) "cLR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/medical/virology) "cLS" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/medical/virology) "cLT" = (/obj/structure/sign/biohazard{pixel_y = 32},/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology) @@ -7413,7 +7413,7 @@ "cMC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cMD" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreen"},/area/medical/virology) "cME" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Containment Cells"; req_access_txt = "39"},/turf/simulated/floor/plasteel{icon_state = "whitegreenfull"},/area/medical/virology) -"cMF" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/virology) +"cMF" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/virology) "cMG" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cMH" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/landmark{name = "lightsout"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cMI" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) @@ -7460,7 +7460,7 @@ "cNx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/plasteel{icon_state = "whitegreen"},/area/medical/virology) "cNy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitegreen"},/area/medical/virology) "cNz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11},/obj/effect/spawner/window{useFull = 1; tag = "fullWin"},/turf/simulated/floor/plating,/area/medical/virology) -"cNA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/disease2/incubator,/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitegreen"},/area/medical/virology) +"cNA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitegreen"},/area/medical/virology) "cNB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "whitegreen"},/area/medical/virology) "cNC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "whitegreen"},/area/medical/virology) "cND" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "whitegreen"},/area/medical/virology) @@ -7514,8 +7514,8 @@ "cOz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Isolation B"; req_access_txt = "39"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/virology) "cOA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Isolation A"; req_access_txt = "39"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/virology) "cOB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/wall,/area/medical/virology) -"cOC" = (/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_x = -30; pixel_y = 0},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/virology) -"cOD" = (/obj/structure/closet/wardrobe/virology_white,/obj/item/weapon/storage/backpack/satchel_vir,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/virology) +"cOC" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty{pixel_x = -3; pixel_y = -3},/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/BMinus{pixel_x = -4; pixel_y = 4},/obj/item/weapon/reagent_containers/blood/BPlus{pixel_x = 1; pixel_y = 2},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OPlus{pixel_x = -2; pixel_y = -1},/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/virology) +"cOD" = (/obj/structure/closet/wardrobe/virology_white,/obj/item/weapon/storage/backpack/satchel_vir,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/virology) "cOE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/virology) "cOF" = (/obj/structure/closet/secure_closet/medical1,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/virology) "cOG" = (/obj/structure/closet/l3closet/virology,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/virology) @@ -8642,7 +8642,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaacKLaaaaaaaaaaaaabqaaaaaaaupaaaaaaaaaarBabqcHZcLGcLHcLIcLJcLKcLLcLMcLNcLOcLPcLQcLRcLScLScLScLRcLTcLUcLVcHZcLWcLXcDUcLYcLZcMacSBcRUcRUcRUcRUcImcIncIocIncMccIncMdcMecMfcImcMgcMhcgxcmmcIxcMicMjcMkcLocLocMlcMmcMncJpcMocMpcMqcEKcKxcKycLvcMrcKBcMscKBcMtcMucMvcEKcMwchyceNchycMxbZUabqaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcFOcFNcMycFNcFOabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabearBarBarBaaaaaaaaacKLaaaaaaaaaarBarBarBauparBabqabqaaaarBaaacIacMzcMAcMBcMCcMDcMEcMFcMGcMHcMIcMJcMKcMLcMMcMNcMOcMPcMBcMQcMRcMScMTcMUcMScMVcMWcWGcSCcWIcWHcYocRUcImcImcImcImcImcImcNccImcImbZUcNdcgxcmmcIxcNecMjcLocLpcLocNfcNgcNhcNicNjcNkcNlcNmcNncNncNncNncNncNocNncNpcNqcNrcEKchychycNschybZUbZUbZUabqabqaaaaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqcFNcFOcFNabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaarBabqcNtabqarBaaaaaaabqaaaaaaabqaaaabqabqabqaaacHZcNucNvcNwcNxcNycNzcNAcNBcNCcNDcNEcHZcIacIacIacHZcNFcNGcNHcHZcNIcNJcDUcNKcNLcNMcNNdegdeidehdejcRUcNRcmVcNScmWcmVcNTcNUcDJcmZcNVcNWcNXcBIcIxcNYcNZcOacOacOacObcOccOdcOecOfcOgcOhcOicOjcOkcOlcOmcOncOocOpcOqcOrcOscOtcmYcmYcOucOvcOwcOxbZUbZUbZUcksaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaarBaaaabqaaaarBaaaaaaabqabqabqabqaaaaaaaaaabqabqcHZcOycOzcKMcOAcOycOBcOCcODcOEcOFcOGcHZcOHaaaaaacrUcrUcrUcrUcrUbZUcOIcDUcDUcDUcDUcDUcRUdeldekdemcRUcOMbZUbZUbZUbZUbZUbZUbZUbZUczIcONcOOcOPcOQcORcOScOTcOUcOVcOWcLpcOXcOYcOZcPacPbcPccPdcPecPfcPgcPhcPicOpclNcPjbZUbZUbZUbZUbZUdencPlcPmclJcPnclJcPoabqabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaarBaaaabqaaaarBaaaaaaabqabqabqabqaaaaaaaaaabqabqcHZcOycOzcKMcOAcOycOBcODcOCcOEcOFcOGcHZcOHaaaaaacrUcrUcrUcrUcrUbZUcOIcDUcDUcDUcDUcDUcRUdeldekdemcRUcOMbZUbZUbZUbZUbZUbZUbZUbZUczIcONcOOcOPcOQcORcOScOTcOUcOVcOWcLpcOXcOYcOZcPacPbcPccPdcPecPfcPgcPhcPicOpclNcPjbZUbZUbZUbZUbZUdencPlcPmclJcPnclJcPoabqabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBarBarBarBarBaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaacHZcPpcPqcKMcPqcPrcPscKMcKMcPtcKMcKMcHZabqabqabqbZUcjncfZcPucPvcPwcPxcmYcPycPzcPAcPBcRUdepdeodeqcRUcOMbZUcPHcPIcPJbZUcPKcPLcPMbZUcPNcPOcPPcIxcPQcPRcPScPTcPUcPVcLpcPWcIxcPXcPYciccPccPZcQacQbcQccQdcQecOpchycQfbZUcQgcQhcQibZUcQjcQkcQlbZUbZUbZUcksaaaabqaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaacHZcQmcQncKMcQocQpcPscQqcQrcQscQtcQucHZaaaabqaaabZUcQvcQwcQxcQycQzcQAcQBcQAcQAcQCcQfcRUcRUdercRUcRUcOMbZUcQDcQEcQFcQGcQHcQIcQJdescQLcQMcQNcIxcIxcIxcIxcIxcQOcIxcQPcrUcrUcfwcQQcfwcOpcOpcOpcOpcOpcOpcOpcOpchycQRcQScQTcQUcQVcQWcQWcQXcQYcQWaaaaaaaaaaaaabqabqaaaaaaabqaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaaacHZcQZcRacKMcRacQZcRbcRccRdcRecRfcRgcIaaaaaaacRhbZUcRibZUbZUbZUcRjbZUbZUbZUbZUcRkcRlcRmcRndetcRmcRpcRqcRrcRscRtcRucRvcRwcRxcRycRycRzcRAcRBcRCcRDcREcmYcmYcRFcmYcRGcmZcRHcRIcRJcRIcRKcjNcjNcRLcRMcOtcmYcmYcmYcRNbZUcnOcROcRPcQWcRQcRRcRScQWabqabqabqabqabqabqabqabqabqabqabqabqaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index a4bdd72dbe3..45c434b5448 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -6096,7 +6096,7 @@ "cnl" = (/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},/obj/machinery/light{dir = 1; in_use = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cnm" = (/obj/structure/rack,/obj/item/clothing/suit/radiation,/obj/item/clothing/head/radiation,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/biostorage) "cnn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/medical/biostorage) -"cno" = (/obj/structure/table,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/device/antibody_scanner,/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/biostorage) +"cno" = (/obj/structure/table,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/biostorage) "cnp" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cnq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cnr" = (/obj/structure/rack,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -7018,13 +7018,13 @@ "cEX" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) "cEY" = (/obj/structure/stool/bed,/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/medical/patient_b) "cEZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/wall/r_wall,/area/medical/virology) -"cFa" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/effect/decal/warning_stripes/northwest,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cFa" = (/obj/machinery/smartfridge/secure/chemistry/virology,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology) "cFb" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/equipmentstorage) "cFc" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cFd" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cFe" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/effect/decal/warning_stripes/south,/obj/effect/decal/warning_stripes/northwestcorner,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cFe" = (/obj/machinery/computer/pandemic,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology) "cFf" = (/turf/simulated/wall,/area/medical/virology) -"cFg" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/obj/item/weapon/wrench,/obj/effect/decal/warning_stripes/northwestsouth,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cFg" = (/obj/structure/table/glass,/obj/machinery/requests_console{department = "Virology"; departmentType = 3; name = "Virology Requests Console"; pixel_x = -30},/obj/item/weapon/storage/belt/medical,/obj/item/clothing/gloves/color/latex,/obj/item/device/healthanalyzer{pixel_x = 2; pixel_y = 2},/obj/item/clothing/glasses/hud/health,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology) "cFh" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cFi" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cFj" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio1"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology) @@ -7463,8 +7463,8 @@ "cNA" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.8; name = "Singularity Shutters"; opacity = 0},/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engine/engineering) "cNB" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.7; name = "Singularity Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_engineering{name = "Engine Room"; req_access_txt = "10"; req_one_access_txt = null},/turf/simulated/floor/plating,/area/engine/engineering) "cNC" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.8; name = "Singularity Shutters"; opacity = 0},/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/engine/engineering) -"cND" = (/obj/machinery/smartfridge/secure/virology,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology) -"cNE" = (/obj/machinery/disease2/isolator,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology) +"cND" = (/obj/structure/table,/obj/item/weapon/hand_labeler{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology) +"cNE" = (/obj/structure/table/glass,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology) "cNF" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/smes/engineering,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/engine/engineering) "cNG" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/wall/r_wall,/area/engine/engineering) "cNH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/engine/engineering) @@ -7505,7 +7505,7 @@ "cOq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/engine/engineering) "cOr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/engine/engineering) "cOs" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/engine/engineering) -"cOt" = (/obj/structure/table/glass,/obj/machinery/requests_console{department = "Virology"; departmentType = 3; name = "Virology Requests Console"; pixel_x = -30},/obj/item/weapon/storage/belt/medical,/obj/item/clothing/gloves/color/latex,/obj/item/device/healthanalyzer{pixel_x = 2; pixel_y = 2},/obj/item/device/antibody_scanner,/obj/item/clothing/glasses/hud/health,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology) +"cOt" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/red,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology) "cOu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/engine/engineering) "cOv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/engine/engineering) "cOw" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101; on = 1; pressure_checks = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering) @@ -7513,7 +7513,7 @@ "cOy" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/camera{c_tag = "Engineering Particle Accelerator"; dir = 2; pixel_x = 23; network = list("Singularity","SS13")},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering) "cOz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/engine/engineering) "cOA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/engine/engineering) -"cOB" = (/obj/machinery/computer/centrifuge,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology) +"cOB" = (/obj/structure/table/glass,/obj/structure/reagent_dispensers/virusfood{pixel_x = -30},/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper/precision,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology) "cOC" = (/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/engine/engineering) "cOD" = (/obj/machinery/camera{c_tag = "Engineering SMES"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/engineering) "cOE" = (/obj/machinery/light/small{dir = 1},/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/engine/engineering) @@ -7588,7 +7588,7 @@ "cPV" = (/obj/structure/stool/bed,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/virology) "cPW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering) "cPX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/engineering) -"cPY" = (/obj/structure/table/glass,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/obj/item/weapon/virusdish/random,/obj/item/weapon/virusdish/random,/obj/item/weapon/virusdish/random,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology) +"cPY" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/sign/deathsposal{pixel_y = -32},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology) "cPZ" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/engineering) "cQa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering) "cQb" = (/obj/machinery/space_heater,/turf/simulated/floor/plasteel,/area/atmos) @@ -7596,7 +7596,7 @@ "cQd" = (/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor/plasteel,/area/atmos) "cQe" = (/obj/machinery/atmospherics/unary/heat_reservoir/heater{dir = 8; icon_state = "freezer_0"; tag = ""},/turf/simulated/floor/plasteel,/area/atmos) "cQf" = (/obj/machinery/atmospherics/pipe/simple/visible/green{level = 2},/obj/machinery/atmospherics/binary/pump{dir = 8; name = "CO2 to Pure"; on = 0},/turf/simulated/floor/plasteel,/area/atmos) -"cQg" = (/obj/machinery/disease2/incubator{name = "Pathogenic incubator"},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology) +"cQg" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cQh" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4; level = 2},/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area/space) "cQi" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "co2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos) "cQj" = (/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos) @@ -8173,7 +8173,7 @@ "dbi" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "sci_outer"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "dbj" = (/turf/space,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk0"; icon_state = "catwalk0"},/area/space) "dbk" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/virology) -"dbl" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/wall/r_wall,/area/medical/virology) +"dbl" = (/obj/machinery/camera{c_tag = "Virology Module South"; dir = 1; network = list("SS13")},/obj/structure/closet/l3closet,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) "dbm" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "medprivacyb"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/patient_b) "dbn" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitered"},/area/medical/patient_b) "dbo" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/patient_b) @@ -8236,8 +8236,8 @@ "dct" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1},/turf/simulated/floor/plating/airless,/area/maintenance/asmaint) "dcu" = (/obj/machinery/light{dir = 4},/obj/structure/dresser,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber) "dcv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/warning_stripes/southwestcorner,/turf/simulated/floor/plasteel,/area/engine/engineering) -"dcw" = (/obj/structure/table/glass,/obj/structure/reagent_dispensers/virusfood{pixel_x = -30},/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper/precision,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/weapon/storage/fancy/vials,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology) -"dcx" = (/obj/structure/table,/obj/item/weapon/storage/lockbox/vials,/obj/item/weapon/hand_labeler{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology) +"dcw" = (/obj/structure/disposalpipe/segment,/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) +"dcx" = (/obj/effect/spawner/lootdrop/maintenance,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/medical/virology) "dcy" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/medical/virology) "dcz" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreencorner"},/area/medical/virology) "dcA" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology) @@ -8246,10 +8246,10 @@ "dcD" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Singularity"; layer = 2.8; name = "Singularity Shutters"; opacity = 0},/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating,/area/engine/engineering) "dcE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/engine/engineering) "dcF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/engine/engineering) -"dcG" = (/obj/machinery/computer/diseasesplicer,/obj/machinery/camera{c_tag = "Virology Module South"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) -"dcH" = (/obj/machinery/computer/med_data/laptop,/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (SOUTHWEST)"; icon_state = "whitegreen"; dir = 10},/area/medical/virology) -"dcI" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/sign/deathsposal{pixel_y = -32},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (SOUTHEAST)"; icon_state = "whitegreen"; dir = 6},/area/medical/virology) -"dcJ" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/disease2/diseaseanalyser,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) +"dcG" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"dcH" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/obj/effect/decal/warning_stripes/northwest,/turf/simulated/floor/plating,/area/medical/virology) +"dcI" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"dcJ" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/obj/item/weapon/wrench,/obj/machinery/light/small{dir = 8},/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plating,/area/maintenance/asmaint) "dcK" = (/obj/structure/closet/radiation,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel,/area/engine/engineering) "dcL" = (/obj/structure/closet/radiation,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/machinery/light/small{dir = 8},/obj/effect/decal/warning_stripes/southwestcorner,/turf/simulated/floor/plasteel{dir = 9; icon_state = "yellow"},/area/engine/engineering) "dcM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/engine/engineering) @@ -8898,13 +8898,13 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabcFscFtcFtcFucFvcFwcFwcFwcFvcFwcFwcFwcFvcFwcFwcFxcFtcFtcFtcFtcFtcFycFzcFAcFBcFCcFDcFEcFFcFGcfRcwWcFHcDfcvKcvKcvKcFIcEBcECcFJcFKcFLcyrcFNcDucFPcFOcFQcFScFTcSpcFVcFWcFXcFScFYcFZcDwcGacDzcDzcDzcGbcBCcGccGccDFcGdcGecGfcGgcGhcGicGjcGkcGlcGmcGncDOcGocDQcGpcDTcDTcCKcHBcoDcEhclUcyMcyLcyNcFfclUcnkclTcFfclUcyQcyScyRcyTcyTclUcusbGycJOcoAbikckPcxOcxPcxOcGAcxRcqUcGBcJPcGCcqUcqUcGDcwAcwAcwAckPbikbikaabaabbikbikbikbikbikbwocyKcvzbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabaabcGFaabbikaabcGFaabbikaabcGFaabbikbikbikbikbikbikbikbikcDccDccDccGGcGHcFMcDdcGJcfRcGKcExcExcExcExcGLcExcFGcECcGMcGNcGOcGPcGQcGRcGScGTcGUcGVcGWcGXcGYcGZcHacHbcFYcELcDwcHccHdcDzcDzcHecBCcHfcHgcDFcHhcCAcHicHjcHkcHlcHmcHncHocHpcHocHqaabcCKcCKcCKcCKcCKcHBcoAcEhclUcIJcyVcyYcyXcEecEccEgcEfcHwcGucHZczVcIRcIQclUcusbGycJRcoAbikckPcxOcxOcxOcFjcHEcHFcHGcJScHIcCZcCZcCZcHJcHKcHLcHMbikbikbikaabaabbikbikbikbikbwobwocvzbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxaabaabczocHOczqbikczocHOczqbikczocHOczqaabbikbikbikbikbikbikbikaabaabcDccDdcDdcDdcDdcHPcHQcHRcfRcHScfRcfRcEBcHTcfRcECcHUcHVcGOcHWcFNcHXcHYcIacIacIbcIccIdcIecIfbRFcIbcIhcIicIjcIkcIlcImcIncIocIpcIqcGfcIrcIscItcIucIvcIwcIxcIycIzcIAcIBcICcIDcDPcDQcIEcIFcIFcCKcHBcoAcEhclUclUclUclUclUcJhcANcBRcJQcMccBScMecMdcMCcBVclUcuscGqcGrcGrcGrcJTcJTcJTcJTcJTcJUcKTcKbcKUcIUczbcIVczbcIWczbcIXcHMbikbikbikbikaabaabbikbikbikbikbwocvzbwoaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikczocHOczqaabczocHOczqbikczocHOczqbikbikbikaabbikbikbikbikaabaabaabbikbikaabaabcJbcJbcJbcJbcJbcJbcJbcJccJbcJbcECcJdcJecGOcHWcFNcJfcFNcJgcLhcDtcJicJjcFWcJkcFRcDtcJmcDzcDwcJncJocJpcIncJqcJrcJscJtcJucJvcJwcJtcJxcJycJzcJAcDFcJBcJCcJDcJEaabcEVcJFcJGcJHcCKcHBcoDcKWcKVcKVcKVcKXclUcNDcyLcCLcNEcyScCMcyTcyTcyScCNclUcuscGvbVibGycKYcKZcoAbikbikckPcJVcJWcJXcJYcJVcJWcJZcKacJVcJWcLackPaabaabaabaabaabaabaabaabaabaabbwocvzbwobwobwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjcbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabczocHOczqbikczocHOczqbikczocHOczqaabbikbikbikbikbikbikbikaabaabbikbikaabaabaabcJbcKjcKjcKkcGIcKmcKmcKncKocKocKpcKqcKrcGOcHWcGOcKscGOcGOcGOcDtcKtcKucKvcKwcKxcKycKzcKAcKBcKCcKCcKCcKDcKEcKFcKGcKHcKIcHhcCAcKJcKKcKLcKMcKNcDFcJBcKOcKPcKQcKRcDQcKScIFcIFcCKcHBcoDcEhbVibVibVibYDclUcOtcCOczVcOBcyScPocPMcyTcPVcPQclUcuscGvbVibGycyHbGycoAbikbikckPcLicLjcLkcwAcLlcLmcLncwAcLocLpcLqckPaabaabbikbikbikbikbikbikbikbikbwocvzbxXbxXbwoaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabczocHOczqbikczocHOczqaabczocHOczqaabaabaabbikaabbikbikaabaabbikbikbikaabbikbikcJbcKjcKjcKkcLscLscLscLtcLucLvcECcLwcLxcLycLzcLAcLBcLCcLDcLDcLEcLFcLGcGOcGOcGOcLHcLIcLJcLKcLLcLMcLNcLOcLPcECcLQcLQcLRcHhcCAcLScLTcLUcLVcLWcDFcLXcLYcLZcMacMbcCKcCKcCKcCKcCKcHBcoDcEhcLbbGybGybYDclUcPYczVcDXcQgcDZcQMcRwcyTdbkcYuclUcuscGvczhbGychCcITcoAbikbikckPcMpcxOcxOcwAcMpcxOcxOcwAcMpcxOcxOckPbikaabaabbikbikbikbikbikbikbikbwocLccyJbxXbwobwobwocJNcJNaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagiaabczocMqczqbikczocMqczqbikczocMqczqaabafxaabaabaabaabaabaabbikbikbikbikbikbikaabcJbcMrcMscLscLscLscMtcMucMucMucMucMucMucMucMvcMwcMxcMycMzcMzcMzcMAcMBdcpdcodcvcMzcMBcMDcMEcMFcLMcMGcLOcLPcMHcMIcMJcMKcMLcMMcMNcMOcKNcMPcMQcMRcMScMTcMUcIDcMVcDQcMWcMXcMXcCKcHBcoAcEhbVicozcLdbYDclUdcwczVczVdcxcySdcydczcyTdcBdcAclUcuscGvbVibGybVibVicoAaabaabckPcNncBZcxOcwAcNncBZcxOcwAcNncBZcxOckPbikbikaabaabbikbikbikbikbikbikbwocvzcyJcLecyJcLfbwoaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxbikaabbikbikbikaabaabaabbikbikaabaabbikafxaabaabaabaabaabbikbikbikbikbikbikbikaabcJbcNocLscLscLscLscLscMubhGcNpcHscNrcNtcMucNucNvcNwcJecGOcGOcNxdcCcNzcNAcNBdcDcNCdcEcECdcFcMFcLMcNFcLOcNGcECcNHcLQcNIcNJcDFcMNcMOcNKcDFcMQcMRcJBcJCcNLcJEcNMcEVcNNcNOcNPcCKcHBcoAcEhbVicLgcLgbYDclUdcHdcGdcJdcIcEZclUclUclUclUclUclUcuscGvbVibGybGycMfcoAbikbikckPcOacxOcxOcwAcOacxOcxOcwAcOacxOcxOckPbikbikbikaabaabbikbikbikbikbikbwocvzcyJbxXbxXbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxacGacGagiafxafxafxafxacGafxafxacGcOcaabbikbikbikbikbikbikbikbikbikbikbikbikcJbcOdcLucLscLscLscOecMucNpcNqcOkcOlcOmcOncOocOpcOqcOrcGOcOsdcKcOucOvcOwcOxcOycOzcOAdcLcNwcJecOCcODcLKcOEcECcOFcLQcOGcOHcDFcMNcMOcKNcDFcOIcMRcJBcOJcOKcKQcOLcDQcOMcMXcMXcCKcHBcoDcEhcMgchCbJGbYDclUclUclUcMhclUdblcFacFcbVicMjcMibGycuscGvbVibGycMkcITcoAbikbikckPckPckPckPckPckPckPckPckPckPckPckPckPbikbikbikbikaabaabbikbikbwobwobwocvzcyJcMmcMlbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcJbcJbcJbdeBcOXcOXcOXcMucOYcOZcPacPacPbcPccMzcPdcPecPfcPgcPhdcMcPicPjcPkcPlcPmcPncPidcNcPpcPqcPrcPscPtcPucPvcNHcLQcPwcPxcDFcMNcDFcPycDFcMQcMRcJBcJCcPzcJEcNMcCKcCKcCKcCKcCKcHBcoDcMncKXchCcITcMYcMocMocMocMZbVicFgcFecFhbVicNacKVcKVcNbcHrczhbGybGycoAcoAbikbikcONaabbikbikbikbikaabbikbikbikbikbikaabbikbikbikbikbikaabaabbikbwocyKcNccNdcyJcNfcNebxXcxHbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikczocHOczqaabczocHOczqbikczocHOczqbikbikbikaabbikbikbikbikaabaabaabbikbikaabaabcJbcJbcJbcJbcJbcJbcJbcJccJbcJbcECcJdcJecGOcHWcFNcJfcFNcJgcLhcDtcJicJjcFWcJkcFRcDtcJmcDzcDwcJncJocJpcIncJqcJrcJscJtcJucJvcJwcJtcJxcJycJzcJAcDFcJBcJCcJDcJEaabcEVcJFcJGcJHcCKcHBcoDcKWcKVcKVcKVcKXclUcFacyLcCLcFecyScCMcyTcyTcyScCNclUcuscGvbVibGycKYcKZcoAbikbikckPcJVcJWcJXcJYcJVcJWcJZcKacJVcJWcLackPaabaabaabaabaabaabaabaabaabaabbwocvzbwobwobwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjcbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabczocHOczqbikczocHOczqbikczocHOczqaabbikbikbikbikbikbikbikaabaabbikbikaabaabaabcJbcKjcKjcKkcGIcKmcKmcKncKocKocKpcKqcKrcGOcHWcGOcKscGOcGOcGOcDtcKtcKucKvcKwcKxcKycKzcKAcKBcKCcKCcKCcKDcKEcKFcKGcKHcKIcHhcCAcKJcKKcKLcKMcKNcDFcJBcKOcKPcKQcKRcDQcKScIFcIFcCKcHBcoDcEhbVibVibVibYDclUcFgcCOcDXcNDcyScPocPMcyTcPVcPQclUcuscGvbVibGycyHbGycoAbikbikckPcLicLjcLkcwAcLlcLmcLncwAcLocLpcLqckPaabaabbikbikbikbikbikbikbikbikbwocvzbxXbxXbwoaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabczocHOczqbikczocHOczqaabczocHOczqaabaabaabbikaabbikbikaabaabbikbikbikaabbikbikcJbcKjcKjcKkcLscLscLscLtcLucLvcECcLwcLxcLycLzcLAcLBcLCcLDcLDcLEcLFcLGcGOcGOcGOcLHcLIcLJcLKcLLcLMcLNcLOcLPcECcLQcLQcLRcHhcCAcLScLTcLUcLVcLWcDFcLXcLYcLZcMacMbcCKcCKcCKcCKcCKcHBcoDcEhcLbbGybGybYDclUcNEczVczVcOtcDZcQMcRwcyTdbkcYuclUcuscGvczhbGychCcITcoAbikbikckPcMpcxOcxOcwAcMpcxOcxOcwAcMpcxOcxOckPbikaabaabbikbikbikbikbikbikbikbwocLccyJbxXbwobwobwocJNcJNaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagiaabczocMqczqbikczocMqczqbikczocMqczqaabafxaabaabaabaabaabaabbikbikbikbikbikbikaabcJbcMrcMscLscLscLscMtcMucMucMucMucMucMucMucMvcMwcMxcMycMzcMzcMzcMAcMBdcpdcodcvcMzcMBcMDcMEcMFcLMcMGcLOcLPcMHcMIcMJcMKcMLcMMcMNcMOcKNcMPcMQcMRcMScMTcMUcIDcMVcDQcMWcMXcMXcCKcHBcoAcEhbVicozcLdbYDclUcOBczVcQgcPYcySdcydczcyTdcBdcAclUcuscGvbVibGybVibVicoAaabaabckPcNncBZcxOcwAcNncBZcxOcwAcNncBZcxOckPbikbikaabaabbikbikbikbikbikbikbwocvzcyJcLecyJcLfbwoaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxbikaabbikbikbikaabaabaabbikbikaabaabbikafxaabaabaabaabaabbikbikbikbikbikbikbikaabcJbcNocLscLscLscLscLscMubhGcNpcHscNrcNtcMucNucNvcNwcJecGOcGOcNxdcCcNzcNAcNBdcDcNCdcEcECdcFcMFcLMcNFcLOcNGcECcNHcLQcNIcNJcDFcMNcMOcNKcDFcMQcMRcJBcJCcNLcJEcNMcEVcNNcNOcNPcCKcHBcoAcEhbVicLgcLgbYDclUclUdbldcwclUcEZclUclUclUclUclUclUcuscGvbVibGybGycMfcoAbikbikckPcOacxOcxOcwAcOacxOcxOcwAcOacxOcxOckPbikbikbikaabaabbikbikbikbikbikbwocvzcyJbxXbxXbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxacGacGagiafxafxafxafxacGafxafxacGcOcaabbikbikbikbikbikbikbikbikbikbikbikbikcJbcOdcLucLscLscLscOecMucNpcNqcOkcOlcOmcOncOocOpcOqcOrcGOcOsdcKcOucOvcOwcOxcOycOzcOAdcLcNwcJecOCcODcLKcOEcECcOFcLQcOGcOHcDFcMNcMOcKNcDFcOIcMRcJBcOJcOKcKQcOLcDQcOMcMXcMXcCKcHBcoDcEhcMgchCbJGbYDdcxclUclUcMhclUdcHdcGcFcbVicMjcMibGycuscGvbVibGycMkcITcoAbikbikckPckPckPckPckPckPckPckPckPckPckPckPckPbikbikbikbikaabaabbikbikbwobwobwocvzcyJcMmcMlbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcJbcJbcJbdeBcOXcOXcOXcMucOYcOZcPacPacPbcPccMzcPdcPecPfcPgcPhdcMcPicPjcPkcPlcPmcPncPidcNcPpcPqcPrcPscPtcPucPvcNHcLQcPwcPxcDFcMNcDFcPycDFcMQcMRcJBcJCcPzcJEcNMcCKcCKcCKcCKcCKcHBcoDcMncKXchCcITcMYcMocMocMocMZbVidcJdcIcFhbVicNacKVcKVcNbcHrczhbGybGycoAcoAbikbikcONaabbikbikbikbikaabbikbikbikbikbikaabbikbikbikbikbikaabaabbikbwocyKcNccNdcyJcNfcNebxXcxHbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabcPEcLscLscOXaabaabcMucPHcPIcPacPacPJcMucPKcPLdcOcPNcPOcPPdcPcECcPRcPScPTcGOcPUcECdcQcPWcPXcPNcPNdcRcPZcECcQacLQcQbcQccDFcMNcDFcLScLTcQdcQecMScQfdcScIDcQhcDQcQicQjcQjcCKcHBcoDcNhcNgbVibVicEhbVibVibGycNibVibVicGwbVibVicNkcNjcNmcNlcNQcoAcoAcoAcoAbikbikbikbikaabbikbikbikbikaabbikbikbikbikbikaabbikbikbikbikbikbikaabaabbwocNRcunbOMcyJcyJcyJbxXbwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikaabaabcPEcLscLscOXaabbikcMucQscPIcPacPacQtcMucQucQvcECcQwcQxcQxdcTcECcQycQzcQAcQBdcUcECcQxcQxcQxcQwcECcQCcQucECcNHcLQcJlcQEcQFcQGcQHcQIcQJcQKcIAcQLcJCdcVcJEcNMcEVcQNcQOcQPcCKcHBcoAcoAcEhcdbcNScEhcNTbVibGycNVcNUcNXcNWcMocMocNYcGvbVicNZcoAcoAbikbikaabbikbikbikbikaabbikbikbikbikaabbikbikbikbikbikaabbikbikbikbikbikbwobwobwobwobwocOObOMcyJcOQcOPbxXbwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcPEcOXdeBcPEbikbikcMucQVcQWcPacPacQXcMucQYcQZdcWcRacRbcRccRdcRecRfcRgcRhcRicPucRecRbcRbcRbcRjdcWcRkcRlcECcNHcRmcMNcRncRocQJcRpcRqcRrcRscRtcRucRvdcXcKQcOLcDQcRxcQjcQjcCKcHBcoAbGycORcOTcOScNYcgmbVibGybGybGycGvcOUbGycGqcFicHrbVicEhbwobikbikbikaabbikbikbikbikaabbikbikbikbikaabbikbikbikbikbikaabbikbikbikbikbikbwobxXbxXbxXcyKcOOcOVcyJcPAbxXbxXbwoaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm index 757c51a23ab..3be0682c727 100644 --- a/code/__DEFINES/genetics.dm +++ b/code/__DEFINES/genetics.dm @@ -112,3 +112,12 @@ #define BLIND 1 #define MUTE 2 #define DEAF 4 + +//Nutrition levels for humans. No idea where else to put it +#define NUTRITION_LEVEL_FAT 600 +#define NUTRITION_LEVEL_FULL 550 +#define NUTRITION_LEVEL_WELL_FED 450 +#define NUTRITION_LEVEL_FED 350 +#define NUTRITION_LEVEL_HUNGRY 250 +#define NUTRITION_LEVEL_STARVING 150 + diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 436e542dfda..26469903558 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -32,6 +32,21 @@ return A return 0 +/proc/get_areas_in_range(dist=0, atom/center=usr) + if(!dist) + var/turf/T = get_turf(center) + return T ? list(T.loc) : list() + if(!center) + return list() + + var/list/turfs = RANGE_TURFS(dist, center) + var/list/areas = list() + for(var/V in turfs) + var/turf/T = V + areas |= T.loc + return areas + + /proc/in_range(source, user) if(get_dist(source, user) <= 1) return 1 diff --git a/code/controllers/Processes/diseases.dm b/code/controllers/Processes/diseases.dm new file mode 100644 index 00000000000..a263551a4e0 --- /dev/null +++ b/code/controllers/Processes/diseases.dm @@ -0,0 +1,44 @@ +var/datum/controller/process/diseases/disease_master + +/datum/controller/process/diseases + var/list/currentrun = list() + var/list/processing_diseases = list() + +/datum/controller/process/diseases/setup() + name = "disease" + schedule_interval = 20 // every 2 seconds + start_delay = 7 + log_startup_progress("Disease controller starting.") + if(disease_master) + qdel(disease_master) //only one mob master + disease_master = src + + register_diseases() //register all pre-round diseases created + +/datum/controller/process/diseases/statProcess() + ..() + stat(null, "[processing_diseases.len] diseases") + + +/datum/controller/process/diseases/doWork() + src.currentrun = processing_diseases.Copy() + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + + while(currentrun.len) + var/datum/disease/thing = currentrun[1] + currentrun.Cut(1, 2) + if(thing) + try + thing.process() + catch(var/exception/e) + catchException(e, thing) + SCHECK + else + catchBadType(thing) + processing_diseases.Remove(thing) + +/datum/controller/process/diseases/proc/register_diseases() + for(var/datum/disease/D in world) + if(!processing_diseases.Find(D)) + D.register() diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 01963850559..ceb33b71959 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -241,7 +241,7 @@ if(ismob(D)) body += "" - body += "" + body += "" body += "" body += "" @@ -515,15 +515,15 @@ body href_list["datumrefresh"] = href_list["give_spell"] - else if(href_list["give_disease2"]) + else if(href_list["give_disease"]) if(!check_rights(R_SERVER|R_EVENT)) return - var/mob/M = locate(href_list["give_disease2"]) + var/mob/M = locate(href_list["give_disease"]) if(!istype(M)) usr << "This can only be used on instances of type /mob" return - src.give_disease2(M) + src.give_disease(M) href_list["datumrefresh"] = href_list["give_spell"] else if(href_list["godmode"]) diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm new file mode 100644 index 00000000000..894e88e3a08 --- /dev/null +++ b/code/datums/diseases/_MobProcs.dm @@ -0,0 +1,144 @@ + +/mob/proc/HasDisease(datum/disease/D) + for(var/datum/disease/DD in viruses) + if(D.IsSame(DD)) + return 1 + return 0 + + +/mob/proc/CanContractDisease(datum/disease/D) + if(stat == DEAD) + return 0 + + if(D.GetDiseaseID() in resistances) + return 0 + + if(HasDisease(D)) + return 0 + + if(count_by_type(viruses, /datum/disease/advance) >= 3) + return 0 + + if(!(type in D.viable_mobtypes)) + return -1 //for stupid fucking monkies + + return 1 + + +/mob/proc/ContractDisease(datum/disease/D) + if(!CanContractDisease(D)) + return 0 + AddDisease(D) + + +/mob/proc/AddDisease(datum/disease/D) + var/datum/disease/DD = new D.type(1, D, 0) + viruses += DD + DD.affected_mob = src + DD.holder = src + + //Copy properties over. This is so edited diseases persist. + var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed") + for(var/V in DD.vars) + if(V in skipped) + continue + if(istype(DD.vars[V],/list)) + var/list/L = D.vars[V] + DD.vars[V] = L.Copy() + else + DD.vars[V] = D.vars[V] + + DD.affected_mob.med_hud_set_status() + + +/mob/living/carbon/ContractDisease(datum/disease/D) + if(!CanContractDisease(D)) + return 0 + + var/obj/item/clothing/Cl = null + var/passed = 1 + + var/head_ch = 100 + var/body_ch = 100 + var/hands_ch = 25 + var/feet_ch = 25 + + if(D.spread_flags & CONTACT_HANDS) + head_ch = 0 + body_ch = 0 + hands_ch = 100 + feet_ch = 0 + if(D.spread_flags & CONTACT_FEET) + head_ch = 0 + body_ch = 0 + hands_ch = 0 + feet_ch = 100 + + if(prob(15/D.permeability_mod)) + return + +/* if(satiety>0 && prob(satiety/10)) // positive satiety makes it harder to contract the disease. + return*/ + + var/target_zone = pick(head_ch;1,body_ch;2,hands_ch;3,feet_ch;4) + + if(istype(src, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = src + + switch(target_zone) + if(1) + if(isobj(H.head) && !istype(H.head, /obj/item/weapon/paper)) + Cl = H.head + passed = prob((Cl.permeability_coefficient*100) - 1) + if(passed && isobj(H.wear_mask)) + Cl = H.wear_mask + passed = prob((Cl.permeability_coefficient*100) - 1) + if(2) + if(isobj(H.wear_suit)) + Cl = H.wear_suit + passed = prob((Cl.permeability_coefficient*100) - 1) + if(passed && isobj(slot_w_uniform)) + Cl = slot_w_uniform + passed = prob((Cl.permeability_coefficient*100) - 1) + if(3) + if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&HANDS) + Cl = H.wear_suit + passed = prob((Cl.permeability_coefficient*100) - 1) + + if(passed && isobj(H.gloves)) + Cl = H.gloves + passed = prob((Cl.permeability_coefficient*100) - 1) + if(4) + if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&FEET) + Cl = H.wear_suit + passed = prob((Cl.permeability_coefficient*100) - 1) + + if(passed && isobj(H.shoes)) + Cl = H.shoes + passed = prob((Cl.permeability_coefficient*100) - 1) + + + if(!passed && (D.spread_flags & AIRBORNE) && !internal) + passed = (prob((50*D.permeability_mod) - 1)) + + if(passed) + AddDisease(D) + + +//Same as ContractDisease, except never overidden clothes checks +/mob/proc/ForceContractDisease(datum/disease/D) + if(!CanContractDisease(D)) + return 0 + AddDisease(D) + + +/mob/living/carbon/human/CanContractDisease(datum/disease/D) + if(species.virus_immune) + return 0 + return ..() + +/mob/living/carbon/human/monkey/CanContractDisease(datum/disease/D) + . = ..() + if(. == -1) + if(D.viable_mobtypes.Find(/mob/living/carbon/human)) + return 1 //this is stupid as fuck but because monkeys are only half the time actually subtypes of humans they need this diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm new file mode 100644 index 00000000000..4d903a1e048 --- /dev/null +++ b/code/datums/diseases/_disease.dm @@ -0,0 +1,209 @@ + +//Visibility Flags +#define HIDDEN_SCANNER 1 +#define HIDDEN_PANDEMIC 2 + +//Disease Flags +#define CURABLE 1 +#define CAN_CARRY 2 +#define CAN_RESIST 4 + +//Spread Flags +#define SPECIAL 1 +#define NON_CONTAGIOUS 2 +#define BLOOD 4 +#define CONTACT_FEET 8 +#define CONTACT_HANDS 16 +#define CONTACT_GENERAL 32 +#define AIRBORNE 64 + + +//Severity Defines +#define NONTHREAT "No threat" +#define MINOR "Minor" +#define MEDIUM "Medium" +#define HARMFUL "Harmful" +#define DANGEROUS "Dangerous!" +#define BIOHAZARD "BIOHAZARD THREAT!" + + +var/list/diseases = subtypesof(/datum/disease) + + +/datum/disease + //Flags + var/visibility_flags = 0 + var/disease_flags = CURABLE|CAN_CARRY|CAN_RESIST + var/spread_flags = AIRBORNE + + //Fluff + var/form = "Virus" + var/name = "No disease" + var/desc = "" + var/agent = "some microbes" + var/spread_text = "" + var/cure_text = "" + + //Stages + var/stage = 1 + var/max_stages = 0 + var/stage_prob = 4 + + //Other + var/longevity = 150 //Time in ticks disease stays in objects, Syringes and such are infinite. + var/list/viable_mobtypes = list() //typepaths of viable mobs + var/mob/living/carbon/affected_mob = null + var/atom/movable/holder = null + var/list/cures = list() //list of cures if the disease has the CURABLE flag, these are reagent ids + var/infectivity = 65 + var/cure_chance = 8 + var/carrier = 0 //If our host is only a carrier + var/permeability_mod = 1 + var/severity = NONTHREAT + var/list/required_organs = list() + var/needs_all_cures = TRUE + var/list/strain_data = list() //dna_spread special bullshit + + + +/datum/disease/proc/stage_act() + var/cure = has_cure() + + if(carrier && !cure) + return + + stage = min(stage, max_stages) + + if(!cure) + if(prob(stage_prob)) + stage = min(stage + 1,max_stages) + else + if(prob(cure_chance)) + stage = max(stage - 1, 1) + + if(disease_flags & CURABLE) + if(cure && prob(cure_chance)) + cure() + + +/datum/disease/proc/has_cure() + if(!(disease_flags & CURABLE)) + return 0 + + . = cures.len + for(var/C_id in cures) + if(!affected_mob.reagents.has_reagent(C_id)) + .-- + if(!. || (needs_all_cures && . < cures.len)) + return 0 + +/datum/disease/proc/spread(atom/source, force_spread = 0) + if((spread_flags & SPECIAL || spread_flags & NON_CONTAGIOUS || spread_flags & BLOOD) && !force_spread) + return + + if(affected_mob) + if(affected_mob.reagents.has_reagent("spaceacillin")) + return + + var/spread_range = 1 + + if(force_spread) + spread_range = force_spread + + if(spread_flags & AIRBORNE) + spread_range++ + + if(!source) + if(affected_mob) + source = affected_mob + else + return + + if(isturf(source.loc)) + for(var/mob/living/carbon/C in oview(spread_range, source)) + if(isturf(C.loc)) + if(AStar(source, C.loc, source, /turf/proc/Distance, spread_range, adjacent = (spread_flags & AIRBORNE) ? /turf/proc/reachableAdjacentAtmosTurfs : /turf/proc/reachableAdjacentTurfs)) + C.ContractDisease(src) + + +/datum/disease/proc/process() + if(!holder) + disease_master.processing_diseases -= src + return + + if(prob(infectivity)) + spread(holder) + + if(affected_mob) + for(var/datum/disease/D in affected_mob.viruses) + if(D != src) + if(IsSame(D)) + qdel(D) + + if(holder == affected_mob) + if(affected_mob.stat != DEAD) + stage_act() + + if(!affected_mob) + if(prob(70)) + if(--longevity<=0) + cure() + + +/datum/disease/proc/cure() + if(affected_mob) + if(disease_flags & CAN_RESIST) + if(!(type in affected_mob.resistances)) + affected_mob.resistances += type + remove_virus() + qdel(src) + + +/datum/disease/New() + if(required_organs && required_organs.len) + if(ishuman(affected_mob)) + var/mob/living/carbon/human/H = affected_mob + for(var/obj/item/organ/O in required_organs) + if(!locate(O) in H.organs) + if(!locate(O) in H.internal_organs) + cure() + return + + if(disease_master) + register() + +/datum/disease/proc/register() + disease_master.processing_diseases += src + + +/datum/disease/proc/IsSame(datum/disease/D) + if(istype(src, D.type)) + return 1 + return 0 + + +/datum/disease/proc/Copy() + var/datum/disease/D = new type() + D.strain_data = strain_data.Copy() + return D + + +/datum/disease/proc/GetDiseaseID() + return type + + +/datum/disease/Destroy() + if(disease_master && disease_master.processing_diseases.Find(src)) + disease_master.processing_diseases.Remove(src) + return ..() + + +/datum/disease/proc/IsSpreadByTouch() + if(spread_flags & CONTACT_FEET || spread_flags & CONTACT_HANDS || spread_flags & CONTACT_GENERAL) + return 1 + return 0 + +//don't use this proc directly. this should only ever be called by cure() +/datum/disease/proc/remove_virus() + affected_mob.viruses -= src //remove the datum from the list + affected_mob.med_hud_set_status() diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm new file mode 100644 index 00000000000..905f604ec02 --- /dev/null +++ b/code/datums/diseases/advance/advance.dm @@ -0,0 +1,456 @@ +/* + + Advance Disease is a system for Virologist to Engineer their own disease with symptoms that have effects and properties + which add onto the overall disease. + + If you need help with creating new symptoms or expanding the advance disease, ask for Giacom on #coderbus. + +*/ + +var/list/archive_diseases = list() + +// The order goes from easy to cure to hard to cure. +var/list/advance_cures = list( + "sodiumchloride", "sugar", "orangejuice", + "spaceacillin", "salglu_solution", "ethanol", + "teporone", "diphenhydramine", "lipolicide", + "silver", "gold" + ) + +/* + + PROPERTIES + + */ + +/datum/disease/advance + + name = "Unknown" // We will always let our Virologist name our disease. + desc = "An engineered disease which can contain a multitude of symptoms." + form = "Advance Disease" // Will let med-scanners know that this disease was engineered. + agent = "advance microbes" + max_stages = 5 + spread_text = "Unknown" + viable_mobtypes = list(/mob/living/carbon/human) + + // NEW VARS + + var/list/symptoms = list() // The symptoms of the disease. + var/id = "" + var/processing = 0 + +/* + + OLD PROCS + + */ + +/datum/disease/advance/New(var/process = 1, var/datum/disease/advance/D) + + // Setup our dictionary if it hasn't already. + if(!dictionary_symptoms.len) + for(var/symp in list_symptoms) + var/datum/symptom/S = new symp + dictionary_symptoms[S.id] = symp + + if(!istype(D)) + D = null + // Generate symptoms if we weren't given any. + + if(!symptoms || !symptoms.len) + + if(!D || !D.symptoms || !D.symptoms.len) + symptoms = GenerateSymptoms(0, 2) + else + for(var/datum/symptom/S in D.symptoms) + symptoms += new S.type + + Refresh() + ..(process, D) + return + +/datum/disease/advance/Destroy() + if(processing) + for(var/datum/symptom/S in symptoms) + S.End(src) + return ..() + +// Randomly pick a symptom to activate. +/datum/disease/advance/stage_act() + ..() + if(symptoms && symptoms.len) + + if(!processing) + processing = 1 + for(var/datum/symptom/S in symptoms) + S.Start(src) + + for(var/datum/symptom/S in symptoms) + S.Activate(src) + else + CRASH("We do not have any symptoms during stage_act()!") + +// Compares type then ID. +/datum/disease/advance/IsSame(datum/disease/advance/D) + + if(!(istype(D, /datum/disease/advance))) + return 0 + + if(src.GetDiseaseID() != D.GetDiseaseID()) + return 0 + return 1 + +// To add special resistances. +/datum/disease/advance/cure(resistance=1) + if(affected_mob) + var/id = "[GetDiseaseID()]" + if(resistance && !(id in affected_mob.resistances)) + affected_mob.resistances[id] = id + remove_virus() + qdel(src) //delete the datum to stop it processing + +// Returns the advance disease with a different reference memory. +/datum/disease/advance/Copy(process = 0) + return new /datum/disease/advance(process, src, 1) + +/* + + NEW PROCS + + */ + +// Mix the symptoms of two diseases (the src and the argument) +/datum/disease/advance/proc/Mix(datum/disease/advance/D) + if(!(src.IsSame(D))) + var/list/possible_symptoms = shuffle(D.symptoms) + for(var/datum/symptom/S in possible_symptoms) + AddSymptom(new S.type) + +/datum/disease/advance/proc/HasSymptom(datum/symptom/S) + for(var/datum/symptom/symp in symptoms) + if(symp.id == S.id) + return 1 + return 0 + +// Will generate new unique symptoms, use this if there are none. Returns a list of symptoms that were generated. +/datum/disease/advance/proc/GenerateSymptoms(level_min, level_max, amount_get = 0) + + var/list/generated = list() // Symptoms we generated. + + // Generate symptoms. By default, we only choose non-deadly symptoms. + var/list/possible_symptoms = list() + for(var/symp in list_symptoms) + var/datum/symptom/S = new symp + if(S.level >= level_min && S.level <= level_max) + if(!HasSymptom(S)) + possible_symptoms += S + + if(!possible_symptoms.len) + return generated + + // Random chance to get more than one symptom + var/number_of = amount_get + if(!amount_get) + number_of = 1 + while(prob(20)) + number_of += 1 + + for(var/i = 1; number_of >= i && possible_symptoms.len; i++) + generated += pick_n_take(possible_symptoms) + + return generated + +/datum/disease/advance/proc/Refresh(new_name = 0) + //world << "[src.name] \ref[src] - REFRESH!" + var/list/properties = GenerateProperties() + AssignProperties(properties) + id = null + + if(!archive_diseases[GetDiseaseID()]) + if(new_name) + AssignName() + archive_diseases[GetDiseaseID()] = src // So we don't infinite loop + archive_diseases[GetDiseaseID()] = new /datum/disease/advance(0, src, 1) + + var/datum/disease/advance/A = archive_diseases[GetDiseaseID()] + AssignName(A.name) + +//Generate disease properties based on the effects. Returns an associated list. +/datum/disease/advance/proc/GenerateProperties() + + if(!symptoms || !symptoms.len) + CRASH("We did not have any symptoms before generating properties.") + return + + var/list/properties = list("resistance" = 1, "stealth" = 1, "stage_rate" = 1, "transmittable" = 1, "severity" = 0) + + for(var/datum/symptom/S in symptoms) + + properties["resistance"] += S.resistance + properties["stealth"] += S.stealth + properties["stage_rate"] += S.stage_speed + properties["transmittable"] += S.transmittable + properties["severity"] = max(properties["severity"], S.severity) // severity is based on the highest severity symptom + + return properties + +// Assign the properties that are in the list. +/datum/disease/advance/proc/AssignProperties(list/properties = list()) + + if(properties && properties.len) + switch(properties["stealth"]) + if(2 to 3) + visibility_flags = HIDDEN_SCANNER + if(3 to INFINITY) + visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC + + // The more symptoms we have, the less transmittable it is but some symptoms can make up for it. + SetSpread(Clamp(2 ** (properties["transmittable"] - symptoms.len), BLOOD, AIRBORNE)) + permeability_mod = max(Ceiling(0.4 * properties["transmittable"]), 1) + cure_chance = 15 - Clamp(properties["resistance"], -5, 5) // can be between 10 and 20 + stage_prob = max(properties["stage_rate"], 2) + SetSeverity(properties["severity"]) + GenerateCure(properties) + else + CRASH("Our properties were empty or null!") + + +// Assign the spread type and give it the correct description. +/datum/disease/advance/proc/SetSpread(spread_id) + switch(spread_id) + if(NON_CONTAGIOUS) + spread_text = "None" + if(SPECIAL) + spread_text = "None" + if(CONTACT_GENERAL, CONTACT_HANDS, CONTACT_FEET) + spread_text = "On contact" + if(AIRBORNE) + spread_text = "Airborne" + if(BLOOD) + spread_text = "Blood" + + spread_flags = spread_id + +/datum/disease/advance/proc/SetSeverity(level_sev) + + switch(level_sev) + + if(-INFINITY to 0) + severity = NONTHREAT + if(1) + severity = MINOR + if(2) + severity = MEDIUM + if(3) + severity = HARMFUL + if(4) + severity = DANGEROUS + if(5 to INFINITY) + severity = BIOHAZARD + else + severity = "Unknown" + + +// Will generate a random cure, the less resistance the symptoms have, the harder the cure. +/datum/disease/advance/proc/GenerateCure(list/properties = list()) + if(properties && properties.len) + var/res = Clamp(properties["resistance"] - (symptoms.len / 2), 1, advance_cures.len) + //world << "Res = [res]" + cures = list(advance_cures[res]) + + // Get the cure name from the cure_id + var/datum/reagent/D = chemical_reagents_list[cures[1]] + cure_text = D.name + + + return + +// Randomly generate a symptom, has a chance to lose or gain a symptom. +/datum/disease/advance/proc/Evolve(min_level, max_level) + var/s = safepick(GenerateSymptoms(min_level, max_level, 1)) + if(s) + AddSymptom(s) + Refresh(1) + return + +// Randomly remove a symptom. +/datum/disease/advance/proc/Devolve() + if(symptoms.len > 1) + var/s = safepick(symptoms) + if(s) + RemoveSymptom(s) + Refresh(1) + return + +// Name the disease. +/datum/disease/advance/proc/AssignName(name = "Unknown") + src.name = name + return + +// Return a unique ID of the disease. +/datum/disease/advance/GetDiseaseID() + if(!id) + var/list/L = list() + for(var/datum/symptom/S in symptoms) + L += S.id + L = sortList(L) // Sort the list so it doesn't matter which order the symptoms are in. + var/result = list2text(L, ":") + id = result + return id + + +// Add a symptom, if it is over the limit (with a small chance to be able to go over) +// we take a random symptom away and add the new one. +/datum/disease/advance/proc/AddSymptom(datum/symptom/S) + + if(HasSymptom(S)) + return + + if(symptoms.len < 5 + rand(-1, 1)) + symptoms += S + else + RemoveSymptom(pick(symptoms)) + symptoms += S + return + +// Simply removes the symptom. +/datum/disease/advance/proc/RemoveSymptom(datum/symptom/S) + symptoms -= S + return + +/* + + Static Procs + +*/ + +// Mix a list of advance diseases and return the mixed result. +/proc/Advance_Mix(var/list/D_list) + + //world << "Mixing!!!!" + + var/list/diseases = list() + + for(var/datum/disease/advance/A in D_list) + diseases += A.Copy() + + if(!diseases.len) + return null + if(diseases.len <= 1) + return pick(diseases) // Just return the only entry. + + var/i = 0 + // Mix our diseases until we are left with only one result. + while(i < 20 && diseases.len > 1) + + i++ + + var/datum/disease/advance/D1 = pick(diseases) + diseases -= D1 + + var/datum/disease/advance/D2 = pick(diseases) + D2.Mix(D1) + + // Should be only 1 entry left, but if not let's only return a single entry + //world << "END MIXING!!!!!" + var/datum/disease/advance/to_return = pick(diseases) + to_return.Refresh(1) + return to_return + +/proc/SetViruses(datum/reagent/R, list/data) + if(data) + var/list/preserve = list() + if(istype(data) && data["viruses"]) + for(var/datum/disease/A in data["viruses"]) + preserve += A.Copy() + R.data = data.Copy() + if(preserve.len) + R.data["viruses"] = preserve + +/proc/AdminCreateVirus(client/user) + + if(!user) + return + + var/i = 5 + + var/datum/disease/advance/D = new(0, null) + D.symptoms = list() + + var/list/symptoms = list() + symptoms += "Done" + symptoms += list_symptoms.Copy() + do + if(user) + var/symptom = input(user, "Choose a symptom to add ([i] remaining)", "Choose a Symptom") in symptoms + if(isnull(symptom)) + return + else if(istext(symptom)) + i = 0 + else if(ispath(symptom)) + var/datum/symptom/S = new symptom + if(!D.HasSymptom(S)) + D.symptoms += S + i -= 1 + while(i > 0) + + if(D.symptoms.len > 0) + + var/new_name = stripped_input(user, "Name your new disease.", "New Name") + if(!new_name) + return + D.AssignName(new_name) + D.Refresh() + + for(var/datum/disease/advance/AD in disease_master.processing) + AD.Refresh() + + for(var/mob/living/carbon/human/H in shuffle(living_mob_list)) + if(H.z != 1) + continue + if(!H.HasDisease(D)) + H.ForceContractDisease(D) + break + + var/list/name_symptoms = list() + for(var/datum/symptom/S in D.symptoms) + name_symptoms += S.name + message_admins("[key_name_admin(user)] has triggered a custom virus outbreak of [D.name]! It has these symptoms: [english_list(name_symptoms)]") + +/* +/mob/verb/test() + + for(var/datum/disease/D in disease_master.processing) + src << "[D.name] - [D.holder]" +*/ + + +/datum/disease/advance/proc/totalStageSpeed() + var/total_stage_speed = 0 + for(var/i in symptoms) + var/datum/symptom/S = i + total_stage_speed += S.stage_speed + return total_stage_speed + +/datum/disease/advance/proc/totalStealth() + var/total_stealth = 0 + for(var/i in symptoms) + var/datum/symptom/S = i + total_stealth += S.stealth + return total_stealth + +/datum/disease/advance/proc/totalResistance() + var/total_resistance = 0 + for(var/i in symptoms) + var/datum/symptom/S = i + total_resistance += S.resistance + return total_resistance + +/datum/disease/advance/proc/totalTransmittable() + var/total_transmittable = 0 + for(var/i in symptoms) + var/datum/symptom/S = i + total_transmittable += S.transmittable + return total_transmittable + +#undef RANDOM_STARTING_LEVEL diff --git a/code/datums/diseases/advance/presets.dm b/code/datums/diseases/advance/presets.dm new file mode 100644 index 00000000000..15172016127 --- /dev/null +++ b/code/datums/diseases/advance/presets.dm @@ -0,0 +1,59 @@ +// Cold + +/datum/disease/advance/cold/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0) + if(!D) + name = "Cold" + symptoms = list(new/datum/symptom/sneeze) + ..(process, D, copy) + + +// Flu + +/datum/disease/advance/flu/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0) + if(!D) + name = "Flu" + symptoms = list(new/datum/symptom/cough) + ..(process, D, copy) + + +// Voice Changing + +/datum/disease/advance/voice_change/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0) + if(!D) + name = "Epiglottis Mutation" + symptoms = list(new/datum/symptom/voice_change) + ..(process, D, copy) + + +// Toxin Filter + +/datum/disease/advance/heal/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0) + if(!D) + name = "Liver Enhancer" + symptoms = list(new/datum/symptom/heal) + ..(process, D, copy) + + +// Hullucigen + +/datum/disease/advance/hullucigen/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0) + if(!D) + name = "Reality Impairment" + symptoms = list(new/datum/symptom/hallucigen) + ..(process, D, copy) + +// Sensory Restoration + +/datum/disease/advance/sensory_restoration/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0) + if(!D) + name = "Reality Enhancer" + symptoms = list(new/datum/symptom/sensory_restoration) + ..(process, D, copy) + +// Sensory Destruction + +/datum/disease/advance/sensory_destruction/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0) + if(!D) + name = "Reality Destruction" + symptoms = list(new/datum/symptom/sensory_destruction) + ..(process, D, copy) \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/beard.dm b/code/datums/diseases/advance/symptoms/beard.dm new file mode 100644 index 00000000000..40295257b68 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/beard.dm @@ -0,0 +1,49 @@ +/* +////////////////////////////////////// +Facial Hypertrichosis + + Very very Noticable. + Decreases resistance slightly. + Decreases stage speed. + Reduced transmittability + Intense Level. + +BONUS + Makes the mob grow a massive beard, regardless of gender. + +////////////////////////////////////// +*/ + +/datum/symptom/beard + + name = "Facial Hypertrichosis" + stealth = -3 + resistance = -1 + stage_speed = -3 + transmittable = -1 + level = 4 + severity = 1 + +/datum/symptom/beard/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + switch(A.stage) + if(1, 2) + H << "Your chin itches." + if(H.f_style == "Shaved") + H.f_style = "Jensen Beard" + H.update_hair() + if(3, 4) + H << "You feel tough." + if(!(H.f_style == "Dwarf Beard") && !(H.f_style == "Very Long Beard") && !(H.f_style == "Full Beard")) + H.f_style = "Full Beard" + H.update_hair() + else + H << "You feel manly!" + if(!(H.f_style == "Dwarf Beard") && !(H.f_style == "Very Long Beard")) + H.f_style = pick("Dwarf Beard", "Very Long Beard") + H.update_hair() + return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm new file mode 100644 index 00000000000..e0ce1a7bda2 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -0,0 +1,53 @@ +/* +////////////////////////////////////// + +Choking + + Very very noticable. + Lowers resistance. + Decreases stage speed. + Decreases transmittablity tremendously. + Moderate Level. + +Bonus + Inflicts spikes of oxyloss + +////////////////////////////////////// +*/ + +/datum/symptom/choking + + name = "Choking" + stealth = -3 + resistance = -2 + stage_speed = -2 + transmittable = -4 + level = 3 + severity = 3 + +/datum/symptom/choking/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2) + M << "[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]" + if(3, 4) + M << "[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]" + Choke_stage_3_4(M, A) + M.emote("gasp") + else + M << "[pick("You're choking!", "You can't breathe!")]" + Choke(M, A) + M.emote("gasp") + return + +/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A) + var/get_damage = (sqrt(20+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth())*1) + M.adjustOxyLoss(get_damage) + return 1 + +/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A) + var/get_damage = (sqrt(20+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth()*5)) + M.adjustOxyLoss(get_damage) + return 1 \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm new file mode 100644 index 00000000000..c9de75d877f --- /dev/null +++ b/code/datums/diseases/advance/symptoms/confusion.dm @@ -0,0 +1,40 @@ +/* +////////////////////////////////////// + +Confusion + + Little bit hidden. + Lowers resistance. + Decreases stage speed. + Not very transmittable. + Intense Level. + +Bonus + Makes the affected mob be confused for short periods of time. + +////////////////////////////////////// +*/ + +/datum/symptom/confusion + + name = "Confusion" + stealth = 1 + resistance = -1 + stage_speed = -3 + transmittable = 0 + level = 4 + severity = 2 + + +/datum/symptom/confusion/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/carbon/M = A.affected_mob + switch(A.stage) + if(1, 2, 3, 4) + M << "[pick("Your head hurts.", "Your mind blanks for a moment.")]" + else + M << "You can't think straight!" + M.confused = min(100, M.confused + 8) + + return diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm new file mode 100644 index 00000000000..716ef2cb6fd --- /dev/null +++ b/code/datums/diseases/advance/symptoms/cough.dm @@ -0,0 +1,40 @@ +/* +////////////////////////////////////// + +Coughing + + Noticable. + Little Resistance. + Doesn't increase stage speed much. + Transmittable. + Low Level. + +BONUS + Will force the affected mob to drop small items! + +////////////////////////////////////// +*/ + +/datum/symptom/cough + + name = "Cough" + stealth = -1 + resistance = 3 + stage_speed = 1 + transmittable = 2 + level = 1 + severity = 1 + +/datum/symptom/cough/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2, 3) + M << "[pick("You swallow excess mucus.", "You lightly cough.")]" + else + M.emote("cough") + var/obj/item/I = M.get_active_hand() + if(I && I.w_class == 1) + M.drop_item() + return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/damage_converter.dm b/code/datums/diseases/advance/symptoms/damage_converter.dm new file mode 100644 index 00000000000..bf0d5aaf8b3 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/damage_converter.dm @@ -0,0 +1,63 @@ +/* +////////////////////////////////////// + +Damage Converter + + Little bit hidden. + Lowers resistance tremendously. + Decreases stage speed tremendously. + Reduced transmittablity + Intense Level. + +Bonus + Slowly converts brute/fire damage to toxin. + +////////////////////////////////////// +*/ + +/datum/symptom/damage_converter + + name = "Toxic Compensation" + stealth = 1 + resistance = -4 + stage_speed = -4 + transmittable = -2 + level = 4 + +/datum/symptom/damage_converter/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB * 10)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(4, 5) + Convert(M) + return + +/datum/symptom/damage_converter/proc/Convert(mob/living/M) + + var/get_damage = rand(1, 2) + + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + + var/list/parts = H.get_damaged_organs(1,1) //1,1 because it needs inputs. + + if(!parts.len) + return + + M.heal_overall_damage(get_damage, get_damage) + M.adjustToxLoss(get_damage*parts.len) + + else + if(M.getFireLoss() > 0 || M.getBruteLoss() > 0) + M.adjustFireLoss(-get_damage) + M.adjustBruteLoss(-get_damage) + M.adjustToxLoss(get_damage) + else + return + + return 1 + + + + diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm new file mode 100644 index 00000000000..08a66b6c144 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -0,0 +1,43 @@ +/* +////////////////////////////////////// + +Deafness + + Slightly noticable. + Lowers resistance. + Decreases stage speed slightly. + Decreases transmittablity. + Intense Level. + +Bonus + Causes intermittent loss of hearing. + +////////////////////////////////////// +*/ + +/datum/symptom/deafness + + name = "Deafness" + stealth = -1 + resistance = -2 + stage_speed = -1 + transmittable = -3 + level = 4 + severity = 3 + +/datum/symptom/deafness/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(3, 4) + M << "[pick("You hear a ringing in your ear.", "Your ears pop.")]" + if(5) + if(!(M.ear_deaf)) + M << "Your ears pop and begin ringing loudly!" + M.setEarDamage(-1,INFINITY) //Shall be enough + spawn(200) + if(M) + M << "The ringing in your ears fades..." + M.setEarDamage(-1,0) + return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/dizzy.dm b/code/datums/diseases/advance/symptoms/dizzy.dm new file mode 100644 index 00000000000..b81b9b8a4ec --- /dev/null +++ b/code/datums/diseases/advance/symptoms/dizzy.dm @@ -0,0 +1,38 @@ +/* +////////////////////////////////////// + +Dizziness + + Hidden. + Lowers resistance considerably. + Decreases stage speed. + Reduced transmittability + Intense Level. + +Bonus + Shakes the affected mob's screen for short periods. + +////////////////////////////////////// +*/ + +/datum/symptom/dizzy // Not the egg + + name = "Dizziness" + stealth = 2 + resistance = -2 + stage_speed = -3 + transmittable = -1 + level = 4 + severity = 2 + +/datum/symptom/dizzy/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2, 3, 4) + M << "[pick("You feel dizzy.", "Your head spins.")]" + else + M << "A wave of dizziness washes over you!" + M.Dizzy(5) + return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/advance/symptoms/fever.dm new file mode 100644 index 00000000000..8f2beacd29d --- /dev/null +++ b/code/datums/diseases/advance/symptoms/fever.dm @@ -0,0 +1,41 @@ +/* +////////////////////////////////////// + +Fever + + No change to hidden. + Increases resistance. + Increases stage speed. + Little transmittable. + Low level. + +Bonus + Heats up your body. + +////////////////////////////////////// +*/ + +/datum/symptom/fever + + name = "Fever" + stealth = 0 + resistance = 3 + stage_speed = 3 + transmittable = 2 + level = 2 + severity = 2 + +/datum/symptom/fever/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/carbon/M = A.affected_mob + M << "[pick("You feel hot.", "You feel like you're burning.")]" + if(M.bodytemperature < BODYTEMP_HEAT_DAMAGE_LIMIT) + Heat(M, A) + + return + +/datum/symptom/fever/proc/Heat(mob/living/M, datum/disease/advance/A) + var/get_heat = (sqrt(21+A.totalTransmittable()*2))+(sqrt(20+A.totalStageSpeed()*3)) + M.bodytemperature = min(M.bodytemperature + (get_heat * A.stage), BODYTEMP_HEAT_DAMAGE_LIMIT - 1) + return 1 \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm new file mode 100644 index 00000000000..ea805861082 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/fire.dm @@ -0,0 +1,57 @@ +/* +////////////////////////////////////// + +Spontaneous Combustion + + Slightly hidden. + Lowers resistance tremendously. + Decreases stage tremendously. + Decreases transmittablity tremendously. + Fatal Level. + +Bonus + Ignites infected mob. + +////////////////////////////////////// +*/ + +/datum/symptom/fire + + name = "Spontaneous Combustion" + stealth = 1 + resistance = -4 + stage_speed = -4 + transmittable = -4 + level = 6 + severity = 5 + +/datum/symptom/fire/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(3) + M << "[pick("You feel hot.", "You hear a crackling noise.", "You smell smoke.")]" + if(4) + Firestacks_stage_4(M, A) + M.IgniteMob() + M << "Your skin bursts into flames!" + M.emote("scream") + if(5) + Firestacks_stage_5(M, A) + M.IgniteMob() + M << "Your skin erupts into an inferno!" + M.emote("scream") + return + +/datum/symptom/fire/proc/Firestacks_stage_4(mob/living/M, datum/disease/advance/A) + var/get_stacks = (sqrt(20+A.totalStageSpeed()*2))-(sqrt(16+A.totalStealth())) + M.adjust_fire_stacks(get_stacks) + M.adjustFireLoss(get_stacks/2) + return 1 + +/datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A) + var/get_stacks = (sqrt(20+A.totalStageSpeed()*3))-(sqrt(16+A.totalStealth())) + M.adjust_fire_stacks(get_stacks) + M.adjustFireLoss(get_stacks) + return 1 \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm new file mode 100644 index 00000000000..0d3cfc95ce3 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -0,0 +1,43 @@ +/* +////////////////////////////////////// + +Necrotizing Fasciitis (AKA Flesh-Eating Disease) + + Very very noticable. + Lowers resistance tremendously. + No changes to stage speed. + Decreases transmittablity temrendously. + Fatal Level. + +Bonus + Deals brute damage over time. + +////////////////////////////////////// +*/ + +/datum/symptom/flesh_eating + + name = "Necrotizing Fasciitis" + stealth = -3 + resistance = -4 + stage_speed = 0 + transmittable = -4 + level = 6 + severity = 5 + +/datum/symptom/flesh_eating/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(2,3) + M << "[pick("You feel a sudden pain across your body.", "Drops of blood appear suddenly on your skin.")]" + if(4,5) + M << "[pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS.")]" + Flesheat(M, A) + return + +/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A) + var/get_damage = ((sqrt(16-A.totalStealth()))*5) + M.adjustBruteLoss(get_damage) + return 1 \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/genetics.dm b/code/datums/diseases/advance/symptoms/genetics.dm new file mode 100644 index 00000000000..21ee88e7cc0 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/genetics.dm @@ -0,0 +1,59 @@ +/* +////////////////////////////////////// + +DNA Saboteur + + Very noticable. + Lowers resistance tremendously. + No changes to stage speed. + Decreases transmittablity tremendously. + Fatal Level. + +Bonus + Cleans the DNA of a person and then randomly gives them a disability. + +////////////////////////////////////// +*/ + +/datum/symptom/genetic_mutation + + name = "Deoxyribonucleic Acid Saboteur" + stealth = -2 + resistance = -3 + stage_speed = 0 + transmittable = -3 + level = 6 + severity = 3 + var/list/possible_mutations + var/archived_dna = null + +/datum/symptom/genetic_mutation/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB * 5)) // 15% chance + var/mob/living/carbon/M = A.affected_mob + if(!M.has_dna()) + return + switch(A.stage) + if(4, 5) + M << "[pick("Your skin feels itchy.", "You feel light headed.")]" + M.dna.remove_mutation_group(possible_mutations) + randmut(M, possible_mutations) + return + +// Archive their DNA before they were infected. +/datum/symptom/genetic_mutation/Start(datum/disease/advance/A) + possible_mutations = (bad_mutations | not_good_mutations) - mutations_list[RACEMUT] + var/mob/living/carbon/M = A.affected_mob + if(M) + if(!M.has_dna()) + return + archived_dna = M.dna.struc_enzymes + +// Give them back their old DNA when cured. +/datum/symptom/genetic_mutation/End(datum/disease/advance/A) + var/mob/living/carbon/M = A.affected_mob + if(M && archived_dna) + if(!M.has_dna()) + return + M.dna.struc_enzymes = archived_dna + M.domutcheck() diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/advance/symptoms/hallucigen.dm new file mode 100644 index 00000000000..5400de88585 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/hallucigen.dm @@ -0,0 +1,41 @@ +/* +////////////////////////////////////// + +Hallucigen + + Very noticable. + Lowers resistance considerably. + Decreases stage speed. + Reduced transmittable. + Critical Level. + +Bonus + Makes the affected mob be hallucinated for short periods of time. + +////////////////////////////////////// +*/ + +/datum/symptom/hallucigen + + name = "Hallucigen" + stealth = -2 + resistance = -3 + stage_speed = -3 + transmittable = -1 + level = 5 + severity = 3 + +/datum/symptom/hallucigen/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/carbon/M = A.affected_mob + switch(A.stage) + if(1, 2) + M << "[pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whispher with no source.", "Your head aches.")]" + if(3, 4) + M << "[pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere.")]" + else + M << "[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]" + M.hallucination += 5 + + return diff --git a/code/datums/diseases/advance/symptoms/headache.dm b/code/datums/diseases/advance/symptoms/headache.dm new file mode 100644 index 00000000000..38ac066fa0b --- /dev/null +++ b/code/datums/diseases/advance/symptoms/headache.dm @@ -0,0 +1,34 @@ +/* +////////////////////////////////////// + +Headache + + Noticable. + Highly resistant. + Increases stage speed. + Not transmittable. + Low Level. + +BONUS + Displays an annoying message! + Should be used for buffing your disease. + +////////////////////////////////////// +*/ + +/datum/symptom/headache + + name = "Headache" + stealth = -1 + resistance = 4 + stage_speed = 2 + transmittable = 0 + level = 1 + severity = 1 + +/datum/symptom/headache/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + M << "[pick("Your head hurts.", "Your head starts pounding.")]" + return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm new file mode 100644 index 00000000000..11f0d21ff37 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -0,0 +1,158 @@ +/* +////////////////////////////////////// + +Healing + + Little bit hidden. + Lowers resistance tremendously. + Decreases stage speed tremendously. + Decreases transmittablity temrendously. + Fatal Level. + +Bonus + Heals toxins in the affected mob's blood stream. + +////////////////////////////////////// +*/ + +/datum/symptom/heal + + name = "Toxic Filter" + stealth = 1 + resistance = -4 + stage_speed = -4 + transmittable = -4 + level = 6 + +/datum/symptom/heal/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB * 10)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(4, 5) + Heal(M, A) + return + +/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A) + var/get_damage = (sqrt(20+A.totalStageSpeed())*(1+rand())) + M.adjustToxLoss(-get_damage) + return 1 + +/* +////////////////////////////////////// + +Metabolism + + Little bit hidden. + Lowers resistance. + Decreases stage speed. + Decreases transmittablity temrendously. + High Level. + +Bonus + Cures all diseases (except itself) and creates anti-bodies for them until the symptom dies. + +////////////////////////////////////// +*/ + +/datum/symptom/heal/metabolism + + name = "Anti-Bodies Metabolism" + stealth = -1 + resistance = -1 + stage_speed = -1 + transmittable = -4 + level = 3 + var/list/cured_diseases = list() + +/datum/symptom/heal/metabolism/Heal(mob/living/M, datum/disease/advance/A) + var/cured = 0 + for(var/datum/disease/D in M.viruses) + if(D != A) + cured = 1 + cured_diseases += D.GetDiseaseID() + D.cure() + if(cured) + M << "You feel much better." + +/datum/symptom/heal/metabolism/End(datum/disease/advance/A) + // Remove all the diseases we cured. + var/mob/living/M = A.affected_mob + if(istype(M)) + if(cured_diseases.len) + for(var/res in M.resistances) + if(res in cured_diseases) + M.resistances -= res + M << "You feel weaker." + +/* +////////////////////////////////////// + +Longevity + + Medium hidden boost. + Large resistance boost. + Large stage speed boost. + Large transmittablity boost. + High Level. + +Bonus + After a certain amount of time the symptom will cure itself. + +////////////////////////////////////// +*/ + +/datum/symptom/heal/longevity + + name = "Longevity" + stealth = 3 + resistance = 4 + stage_speed = 4 + transmittable = 4 + level = 3 + var/longevity = 30 + +/datum/symptom/heal/longevity/Heal(mob/living/M, datum/disease/advance/A) + longevity -= 1 + if(!longevity) + A.cure() + +/datum/symptom/heal/longevity/Start(datum/disease/advance/A) + longevity = rand(initial(longevity) - 5, initial(longevity) + 5) + +/* +/* +////////////////////////////////////// + + DNA Restoration + + Not well hidden. + Lowers resistance minorly. + Does not affect stage speed. + Decreases transmittablity greatly. + Very high level. + +Bonus + Heals brain damage, treats radiation, cleans SE of non-power mutations. + +////////////////////////////////////// +*/ + +/datum/symptom/heal/dna + + name = "Deoxyribonucleic Acid Restoration" + stealth = -1 + resistance = -1 + stage_speed = 0 + transmittable = -3 + level = 5 + +/datum/symptom/heal/dna/Heal(mob/living/carbon/M, datum/disease/advance/A) + var/amt_healed = (sqrt(20+A.totalStageSpeed()*(3+rand())))-(sqrt(16+A.totalStealth()*rand())) + M.adjustBrainLoss(-amt_healed) + //Non-power mutations, excluding race, so the virus does not force monkey -> human transformations. + var/list/unclean_mutations = (not_good_mutations|bad_mutations) - mutations_list[RACEMUT] + M.dna.remove_mutation_group(unclean_mutations) + M.radiation = max(M.radiation - 3, 0) + return 1 +*/ diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/advance/symptoms/itching.dm new file mode 100644 index 00000000000..e6f08f0882f --- /dev/null +++ b/code/datums/diseases/advance/symptoms/itching.dm @@ -0,0 +1,34 @@ +/* +////////////////////////////////////// + +Itching + + Not noticable or unnoticable. + Resistant. + Increases stage speed. + Little transmittable. + Low Level. + +BONUS + Displays an annoying message! + Should be used for buffing your disease. + +////////////////////////////////////// +*/ + +/datum/symptom/itching + + name = "Itching" + stealth = 0 + resistance = 3 + stage_speed = 3 + transmittable = 1 + level = 1 + severity = 1 + +/datum/symptom/itching/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + M << "Your [pick("back", "arm", "leg", "elbow", "head")] itches." + return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm new file mode 100644 index 00000000000..785b1cd8d7e --- /dev/null +++ b/code/datums/diseases/advance/symptoms/oxygen.dm @@ -0,0 +1,38 @@ +/* +////////////////////////////////////// + +Self-Respiration + + Slightly hidden. + Lowers resistance significantly. + Decreases stage speed significantly. + Decreases transmittablity tremendously. + Fatal Level. + +Bonus + The body generates salbutamol. + +////////////////////////////////////// +*/ + +/datum/symptom/oxygen + + name = "Self-Respiration" + stealth = 1 + resistance = -3 + stage_speed = -3 + transmittable = -4 + level = 6 + +/datum/symptom/oxygen/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB * 5)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(4, 5) + if (M.reagents.get_reagent_amount("salbutamol") < 20) + M.reagents.add_reagent("salbutamol", 20) + else + if(prob(SYMPTOM_ACTIVATION_PROB * 5)) + M << "[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]" + return diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm new file mode 100644 index 00000000000..d45a58b4621 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -0,0 +1,103 @@ +/* +////////////////////////////////////// +Sensory-Restoration + Very very very very noticable. + Lowers resistance tremendously. + Decreases stage speed tremendously. + Decreases transmittablity tremendously. + Fatal. +Bonus + The body generates Sensory restorational chemicals. + oculine for ears + antihol for removal of alcohol + synaptizine to purge sensory hallucigens + mannitol to kickstart the mind + +////////////////////////////////////// +*/ +/datum/symptom/sensory_restoration + name = "Sensory Restoration" + stealth = -1 + resistance = -4 + stage_speed = -4 + transmittable = -3 + level = 6 + severity = 0 + +/datum/symptom/sensory_restoration/Activate(var/datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB * 3)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(2) + if(M.reagents.get_reagent_amount("oculine")<10) + M.reagents.add_reagent("oculine"=10) + M << "Your hearing feels clearer and crisp." + if(3) + if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 ) + M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10)) + M << "You feel sober." + if(4) + if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaptizine") < 10) + M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10, "synaptizine"=5)) + M << "You feel focused." + if(5) + if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaptizine") < 10 && M.reagents.get_reagent_amount("mannitol") < 10) + M.reagents.add_reagent_list(list("mannitol"=10, "antihol"=10, "oculine"=10, "synaptizine"=10)) + M << "Your mind feels relaxed." + return + +/* +////////////////////////////////////// +Sensory-Destruction + noticable. + Lowers resistance + Decreases stage speed tremendously. + Decreases transmittablity tremendously. + the drugs hit them so hard they have to focus on not dying + +Bonus + The body generates Sensory destructive chemicals. + You cannot taste anything anymore. + ethanol for extremely drunk victim + lsd to break the mind + impedrezene to ruin the brain + +////////////////////////////////////// +*/ +/datum/symptom/sensory_destruction + name = "Sensory destruction" + stealth = -1 + resistance = -2 + stage_speed = -3 + transmittable = -4 + level = 6 + severity = 5 + +/datum/symptom/sensory_destruction/Activate(var/datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1) + M << "You can't taste a thing." + if(2) + M << "You can't feel anything." + if(prob(10)) + M.reagents.add_reagent("morphine",rand(5,7)) + if(3) + M.reagents.add_reagent("ethanol",rand(5,7)) + M << "You feel absolutely hammered." + if(prob(15)) + M.reagents.add_reagent("morphine",rand(5,7)) + if(4) + M.reagents.add_reagent_list(list("ethanol",rand(7,15),"lsd",rand(5,10))) + M << "You try to focus on not dying." + if(prob(20)) + M.reagents.add_reagent("morphine",rand(5,7)) + if(5) + M.reagents.add_reagent_list(list("haloperidol",rand(5,15),"ethanol",rand(7,20),"lsd",rand(5,15))) + M << "u can count 2 potato!" + if(prob(25)) + M.reagents.add_reagent("morphine",rand(5,7)) + return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/shedding.dm b/code/datums/diseases/advance/symptoms/shedding.dm new file mode 100644 index 00000000000..e07bfe29afa --- /dev/null +++ b/code/datums/diseases/advance/symptoms/shedding.dm @@ -0,0 +1,48 @@ +/* +////////////////////////////////////// +Alopecia + + Noticable. + Decreases resistance slightly. + Reduces stage speed slightly. + Transmittable. + Intense Level. + +BONUS + Makes the mob lose hair. + +////////////////////////////////////// +*/ + +/datum/symptom/shedding + + name = "Alopecia" + stealth = -1 + resistance = -1 + stage_speed = -1 + transmittable = 2 + level = 4 + severity = 1 + +/datum/symptom/shedding/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + M << "[pick("Your scalp itches.", "Your skin feels flakey.")]" + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + switch(A.stage) + if(3, 4) + if(!(H.h_style == "Bald") && !(H.h_style == "Balding Hair")) + H << "Your hair starts to fall out in clumps..." + spawn(50) + H.h_style = "Balding Hair" + H.update_hair() + if(5) + if(!(H.f_style == "Shaved") || !(H.h_style == "Bald")) + H << "Your hair starts to fall out in clumps..." + spawn(50) + H.f_style = "Shaved" + H.h_style = "Bald" + H.update_hair() + return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/advance/symptoms/shivering.dm new file mode 100644 index 00000000000..6925b1fb5b0 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/shivering.dm @@ -0,0 +1,40 @@ +/* +////////////////////////////////////// + +Shivering + + No change to hidden. + Increases resistance. + Increases stage speed. + Little transmittable. + Low level. + +Bonus + Cools down your body. + +////////////////////////////////////// +*/ + +/datum/symptom/shivering + + name = "Shivering" + stealth = 0 + resistance = 2 + stage_speed = 2 + transmittable = 2 + level = 2 + severity = 2 + +/datum/symptom/shivering/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/carbon/M = A.affected_mob + M << "[pick("You feel cold.", "You start shivering.")]" + if(M.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT) + Chill(M, A) + return + +/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A) + var/get_cold = (sqrt(16+A.totalStealth()*2))+(sqrt(21+A.totalResistance()*2)) + M.bodytemperature = min(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1) + return 1 \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/skin.dm b/code/datums/diseases/advance/symptoms/skin.dm new file mode 100644 index 00000000000..6916a46994a --- /dev/null +++ b/code/datums/diseases/advance/symptoms/skin.dm @@ -0,0 +1,86 @@ +/* +////////////////////////////////////// +Vitiligo + + Extremely Noticable. + Decreases resistance slightly. + Reduces stage speed slightly. + Reduces transmission. + Critical Level. + +BONUS + Makes the mob lose skin pigmentation. + +////////////////////////////////////// +*/ + +/datum/symptom/vitiligo + + name = "Vitiligo" + stealth = -3 + resistance = -1 + stage_speed = -1 + transmittable = -2 + level = 4 + severity = 1 + +/datum/symptom/vitiligo/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if(H.s_tone == -85) + return + switch(A.stage) + if(5) + H.s_tone = -85 + H.update_body(0) + else + H.visible_message("[H] looks a bit pale...", "Your skin suddenly appears lighter...") + + return + + +/* +////////////////////////////////////// +Revitiligo + + Extremely Noticable. + Decreases resistance slightly. + Reduces stage speed slightly. + Reduces transmission. + Critical Level. + +BONUS + Makes the mob gain skin pigmentation. + +////////////////////////////////////// +*/ + +/datum/symptom/revitiligo + + name = "Revitiligo" + stealth = -3 + resistance = -1 + stage_speed = -1 + transmittable = -2 + level = 4 + severity = 1 + +/datum/symptom/revitiligo/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if(H.s_tone == 85) + return + switch(A.stage) + if(5) + H.s_tone = 85 + H.update_body(0) + else + H.visible_message("[H] looks a bit dark...", "Your skin suddenly appears darker...") + + return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm new file mode 100644 index 00000000000..9413eea5db5 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/sneeze.dm @@ -0,0 +1,39 @@ +/* +////////////////////////////////////// + +Sneezing + + Very Noticable. + Increases resistance. + Doesn't increase stage speed. + Very transmittable. + Low Level. + +Bonus + Forces a spread type of AIRBORNE + with extra range! + +////////////////////////////////////// +*/ + +/datum/symptom/sneeze + + name = "Sneezing" + stealth = -2 + resistance = 3 + stage_speed = 0 + transmittable = 4 + level = 1 + severity = 1 + +/datum/symptom/sneeze/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2, 3) + M.emote("sniff") + else + M.emote("sneeze") + A.spread(A.holder, 5) + return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/stimulant.dm b/code/datums/diseases/advance/symptoms/stimulant.dm new file mode 100644 index 00000000000..2823035bf39 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/stimulant.dm @@ -0,0 +1,38 @@ +/* +////////////////////////////////////// + +Stimulant //gotta go fast + + Noticable. + Lowers resistance significantly. + Decreases stage speed moderately.. + Decreases transmittablity tremendously. + Moderate Level. + +Bonus + The body generates Ephedrine. + +////////////////////////////////////// +*/ + +/datum/symptom/stimulant + + name = "Stimulant" + stealth = -1 + resistance = -3 + stage_speed = -2 + transmittable = -4 + level = 3 + +/datum/symptom/stimulant/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB * 10)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(5) + if (M.reagents.get_reagent_amount("ephedrine") < 10) + M.reagents.add_reagent("ephedrine", 10) + else + if(prob(SYMPTOM_ACTIVATION_PROB * 5)) + M << "[pick("You feel restless.", "You feel like running laps around the station.")]" + return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm new file mode 100644 index 00000000000..1246b68fd0f --- /dev/null +++ b/code/datums/diseases/advance/symptoms/symptoms.dm @@ -0,0 +1,40 @@ +// Symptoms are the effects that engineered advanced diseases do. + +var/list/list_symptoms = subtypesof(/datum/symptom) +var/list/dictionary_symptoms = list() + +var/global/const/SYMPTOM_ACTIVATION_PROB = 3 + +/datum/symptom + // Buffs/Debuffs the symptom has to the overall engineered disease. + var/name = "" + var/stealth = 0 + var/resistance = 0 + var/stage_speed = 0 + var/transmittable = 0 + // The type level of the symptom. Higher is harder to generate. + var/level = 0 + // The severity level of the symptom. Higher is more dangerous. + var/severity = 0 + // The hash tag for our diseases, we will add it up with our other symptoms to get a unique id! ID MUST BE UNIQUE!!! + var/id = "" + +/datum/symptom/New() + var/list/S = list_symptoms + for(var/i = 1; i <= S.len; i++) + if(src.type == S[i]) + id = "[i]" + return + CRASH("We couldn't assign an ID!") + +// Called when processing of the advance disease, which holds this symptom, starts. +/datum/symptom/proc/Start(datum/disease/advance/A) + return + +// Called when the advance disease is going to be deleted or when the advance disease stops processing. +/datum/symptom/proc/End(datum/disease/advance/A) + return + +/datum/symptom/proc/Activate(datum/disease/advance/A) + return + diff --git a/code/datums/diseases/advance/symptoms/viral.dm b/code/datums/diseases/advance/symptoms/viral.dm new file mode 100644 index 00000000000..fafac33b2c8 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/viral.dm @@ -0,0 +1,65 @@ +/* +////////////////////////////////////// +Viral adaptation + + Moderate stealth boost. + Major Increases to resistance. + Reduces stage speed. + No change to transmission + Critical Level. + +BONUS + Extremely useful for buffing viruses + +////////////////////////////////////// +*/ +/datum/symptom/viraladaptation + name = "Viral self-adaptation" + stealth = 3 + resistance = 5 + stage_speed = -3 + transmittable = 0 + level = 3 + +/datum/symptom/viraladaptation/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1) + M << "You feel off, but no different from before." + if(5) + M << "You feel better, but nothing interesting happens." + +/* +////////////////////////////////////// +Viral evolution + + Moderate stealth reductopn. + Major decreases to resistance. + increases stage speed. + increase to transmission + Critical Level. + +BONUS + Extremely useful for buffing viruses + +////////////////////////////////////// +*/ +/datum/symptom/viralevolution + name = "Viral evolutionary acceleration" + stealth = -2 + resistance = -3 + stage_speed = 5 + transmittable = 3 + level = 3 + +/datum/symptom/viraladaptation/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1) + M << "You feel better, but no different from before." + if(5) + M << "You feel off, but nothing interesting happens." \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm new file mode 100644 index 00000000000..9d348506dcf --- /dev/null +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -0,0 +1,87 @@ +/* +////////////////////////////////////// + +Hyphema (Eye bleeding) + + Slightly noticable. + Lowers resistance tremendously. + Decreases stage speed tremendously. + Decreases transmittablity. + Critical Level. + +Bonus + Causes blindness. + +////////////////////////////////////// +*/ + +/datum/symptom/visionloss + + name = "Hyphema" + stealth = -1 + resistance = -4 + stage_speed = -4 + transmittable = -3 + level = 5 + severity = 4 + +/datum/symptom/visionloss/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2) + M << "Your eyes itch." + if(3, 4) + M << "Your eyes burn!" + M.blur_eyes(10) + M.adjust_eye_damage(1) + else + M << "Your eyes burn horrificly!" + M.blur_eyes(20) + M.adjust_eye_damage(5) + if(M.eye_damage >= 10) + M.become_nearsighted() + if(prob(M.eye_damage - 10 + 1)) + if(M.become_blind()) + M << "You go blind!" + + +/* +////////////////////////////////////// + +Ocular Restoration + + Noticable. + Lowers resistance significantly. + Decreases stage speed moderately.. + Decreases transmittablity tremendously. + High level. + +Bonus + Restores eyesight. + +////////////////////////////////////// +*/ + +/datum/symptom/visionaid + + name = "Ocular Restoration" + stealth = -1 + resistance = -3 + stage_speed = -2 + transmittable = -4 + level = 4 + +/datum/symptom/visionaid/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB * 5)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(4, 5) + if (M.reagents.get_reagent_amount("oculine") < 20) + M.reagents.add_reagent("oculine", 20) + else + if(prob(SYMPTOM_ACTIVATION_PROB * 5)) + M << "[pick("Your eyes feel great.", "You are now blinking manually.", "You don't feel the need to blink.")]" + return diff --git a/code/datums/diseases/advance/symptoms/voice_change.dm b/code/datums/diseases/advance/symptoms/voice_change.dm new file mode 100644 index 00000000000..847324a9e0b --- /dev/null +++ b/code/datums/diseases/advance/symptoms/voice_change.dm @@ -0,0 +1,48 @@ +/* +////////////////////////////////////// + +Voice Change + + Very Very noticable. + Lowers resistance considerably. + Decreases stage speed. + Reduced transmittable. + Fatal Level. + +Bonus + Changes the voice of the affected mob. Causing confusion in communication. + +////////////////////////////////////// +*/ + +/datum/symptom/voice_change + + name = "Voice Change" + stealth = -2 + resistance = -3 + stage_speed = -3 + transmittable = -1 + level = 6 + severity = 2 + +/datum/symptom/voice_change/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + + var/mob/living/carbon/M = A.affected_mob + switch(A.stage) + if(1, 2, 3, 4) + M << "[pick("Your throat hurts.", "You clear your throat.")]" + else + if(ishuman(M)) + var/mob/living/carbon/human/H = M + H.SetSpecialVoice(H.species.get_random_name(H.gender)) + + return + +/datum/symptom/voice_change/End(datum/disease/advance/A) + ..() + if(ishuman(A.affected_mob)) + var/mob/living/carbon/human/H = A.affected_mob + H.UnsetSpecialVoice() + return diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm new file mode 100644 index 00000000000..abd5df571ac --- /dev/null +++ b/code/datums/diseases/advance/symptoms/vomit.dm @@ -0,0 +1,106 @@ +/* +////////////////////////////////////// + +Vomiting + + Very Very Noticable. + Decreases resistance. + Doesn't increase stage speed. + Little transmittable. + Medium Level. + +Bonus + Forces the affected mob to vomit! + Meaning your disease can spread via + people walking on vomit. + Makes the affected mob lose nutrition and + heal toxin damage. + +////////////////////////////////////// +*/ + +/datum/symptom/vomit + + name = "Vomiting" + stealth = -2 + resistance = -1 + stage_speed = 0 + transmittable = 1 + level = 3 + severity = 4 + +/datum/symptom/vomit/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB / 2)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2, 3, 4) + M << "[pick("You feel nauseous.", "You feel like you're going to throw up!")]" + else + Vomit(M) + + return + +/datum/symptom/vomit/proc/Vomit(mob/living/carbon/M) + M.vomit(20) + +/* +////////////////////////////////////// + +Vomiting Blood + + Very Very Noticable. + Decreases resistance. + Decreases stage speed. + Little transmittable. + Intense level. + +Bonus + Forces the affected mob to vomit blood! + Meaning your disease can spread via + people walking on the blood. + Makes the affected mob lose health. + +////////////////////////////////////// +*/ + +/datum/symptom/vomit/blood + + name = "Blood Vomiting" + stealth = -2 + resistance = -1 + stage_speed = -1 + transmittable = 1 + level = 4 + severity = 5 + +/datum/symptom/vomit/blood/Vomit(mob/living/carbon/M) + M.vomit(0, 1) + + +/* +////////////////////////////////////// + +Projectile Vomiting + + Very Very Noticable. + Decreases resistance. + Doesn't increase stage speed. + Little transmittable. + Medium Level. + +Bonus + As normal vomiting, except it will spread further, + likely causing more to walk across the vomit. + +////////////////////////////////////// +*/ + +/datum/symptom/vomit/projectile + + name = "Projectile Vomiting" + stealth = -2 + level = 4 + +/datum/symptom/vomit/projectile/Vomit(mob/living/carbon/M) + M.vomit(6,0,1,5,1) diff --git a/code/datums/diseases/advance/symptoms/weakness.dm b/code/datums/diseases/advance/symptoms/weakness.dm new file mode 100644 index 00000000000..b0769680dc9 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/weakness.dm @@ -0,0 +1,44 @@ +/* +////////////////////////////////////// + +Weakness + + Slightly noticeable. + Lowers resistance slightly. + Decreases stage speed moderately. + Decreases transmittablity moderately. + Moderate Level. + +Bonus + Deals stamina damage to the host + +////////////////////////////////////// +*/ + +/datum/symptom/weakness + + name = "Weakness" + stealth = -1 + resistance = -1 + stage_speed = -2 + transmittable = -2 + level = 3 + severity = 3 + +/datum/symptom/weakness/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2) + M << "[pick("You feel weak.", "You feel lazy.")]" + if(3, 4) + M << "[pick("You feel very frail.", "You think you might faint.")]" + M.adjustStaminaLoss(15) + else + M << "[pick("You feel tremendously weak!", "Your body trembles as exhaustion creeps over you.")]" + M.adjustStaminaLoss(30) + if(M.getStaminaLoss() > 60 && !M.stat) + M.visible_message("[M] faints!", "You swoon and faint...") + M.AdjustSleeping(5) + return diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm new file mode 100644 index 00000000000..8a5e3b2dd75 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/weight.dm @@ -0,0 +1,121 @@ +/* +////////////////////////////////////// + +Weight Gain + + Very Very Noticable. + Decreases resistance. + Decreases stage speed. + Reduced transmittable. + Intense Level. + +Bonus + Increases the weight gain of the mob, + forcing it to eventually turn fat. +////////////////////////////////////// +*/ + +/datum/symptom/weight_gain + + name = "Weight Gain" + stealth = -3 + resistance = -3 + stage_speed = -2 + transmittable = -2 + level = 4 + severity = 1 + +/datum/symptom/weight_gain/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2, 3, 4) + M << "[pick("You feel blubbery.", "Your stomach hurts.")]" + else + M.overeatduration = min(M.overeatduration + 100, 600) + M.nutrition = min(M.nutrition + 100, NUTRITION_LEVEL_FULL) + + return + + +/* +////////////////////////////////////// + +Weight Loss + + Very Very Noticable. + Decreases resistance. + Decreases stage speed. + Reduced Transmittable. + High level. + +Bonus + Decreases the weight of the mob, + forcing it to be skinny. + +////////////////////////////////////// +*/ + +/datum/symptom/weight_loss + + name = "Weight Loss" + stealth = -3 + resistance = -2 + stage_speed = -2 + transmittable = -2 + level = 3 + severity = 1 + +/datum/symptom/weight_loss/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2, 3, 4) + M << "[pick("You feel hungry.", "You crave for food.")]" + else + M << "[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]" + M.overeatduration = max(M.overeatduration - 100, 0) + M.nutrition = max(M.nutrition - 100, 0) + + return + +/* +////////////////////////////////////// + +Weight Even + + Very Noticable. + Decreases resistance. + Decreases stage speed. + Reduced transmittable. + High level. + +Bonus + Causes the weight of the mob to + be even, meaning eating isn't + required anymore. + +////////////////////////////////////// +*/ + +/datum/symptom/weight_even + + name = "Weight Even" + stealth = -3 + resistance = -2 + stage_speed = -2 + transmittable = -2 + level = 4 + +/datum/symptom/weight_even/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(4, 5) + M.overeatduration = 0 + M.nutrition = NUTRITION_LEVEL_WELL_FED + 50 + + return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/youth.dm b/code/datums/diseases/advance/symptoms/youth.dm new file mode 100644 index 00000000000..0a3d110b037 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/youth.dm @@ -0,0 +1,55 @@ +/* +////////////////////////////////////// +Eternal Youth + + Moderate stealth boost. + Increases resistance tremendously. + Increases stage speed tremendously. + Reduces transmission tremendously. + Critical Level. + +BONUS + Gives you immortality and eternal youth!!! + Can be used to buff your virus + +////////////////////////////////////// +*/ + +/datum/symptom/youth + + name = "Eternal Youth" + stealth = 3 + resistance = 4 + stage_speed = 4 + transmittable = -4 + level = 5 + +/datum/symptom/youth/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB * 2)) + var/mob/living/M = A.affected_mob + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + switch(A.stage) + if(1) + if(H.age > 41) + H.age = 41 + H << "You haven't had this much energy in years!" + if(2) + if(H.age > 36) + H.age = 36 + H << "You're suddenly in a good mood." + if(3) + if(H.age > 31) + H.age = 31 + H << "You begin to feel more lithe." + if(4) + if(H.age > 26) + H.age = 26 + H << "You feel reinvigorated." + if(5) + if(H.age > 21) + H.age = 21 + H << "You feel like you can take on the world!" + + return \ No newline at end of file diff --git a/code/datums/diseases/anxiety.dm b/code/datums/diseases/anxiety.dm new file mode 100644 index 00000000000..4cfd0268625 --- /dev/null +++ b/code/datums/diseases/anxiety.dm @@ -0,0 +1,41 @@ +/datum/disease/anxiety + name = "Severe Anxiety" + form = "Infection" + max_stages = 4 + spread_text = "On contact" + spread_flags = CONTACT_GENERAL + cure_text = "Ethanol" + cures = list("ethanol") + agent = "Excess Lepidopticides" + viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey) + desc = "If left untreated subject will regurgitate butterflies." + severity = MEDIUM + +/datum/disease/anxiety/stage_act() + ..() + switch(stage) + if(2) //also changes say, see say.dm + if(prob(5)) + affected_mob << "You feel anxious." + if(3) + if(prob(10)) + affected_mob << "Your stomach flutters." + if(prob(5)) + affected_mob << "You feel panicky." + if(prob(2)) + affected_mob << "You're overtaken with panic!" + affected_mob.confused += (rand(2,3)) + if(4) + if(prob(10)) + affected_mob << "You feel butterflies in your stomach." + if(prob(5)) + affected_mob.visible_message("[affected_mob] stumbles around in a panic.", \ + "You have a panic attack!") + affected_mob.confused += (rand(6,8)) + affected_mob.jitteriness += (rand(6,8)) + if(prob(2)) + affected_mob.visible_message("[affected_mob] coughs up butterflies!", \ + "You cough up butterflies!") + new /mob/living/simple_animal/butterfly(affected_mob.loc) + new /mob/living/simple_animal/butterfly(affected_mob.loc) + return \ No newline at end of file diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm new file mode 100644 index 00000000000..f6055e775ba --- /dev/null +++ b/code/datums/diseases/appendicitis.dm @@ -0,0 +1,34 @@ +/datum/disease/appendicitis + form = "Condition" + name = "Appendicitis" + max_stages = 3 + cure_text = "Surgery" + agent = "Shitty Appendix" + viable_mobtypes = list(/mob/living/carbon/human) + permeability_mod = 1 + desc = "If left untreated the subject will become very weak, and may vomit often." + severity = "Dangerous!" + longevity = 1000 + disease_flags = CAN_CARRY|CAN_RESIST + spread_flags = NON_CONTAGIOUS + visibility_flags = HIDDEN_PANDEMIC + required_organs = list(/obj/item/organ/internal/appendix) + +/datum/disease/appendicitis/stage_act() + ..() + switch(stage) + if(1) + if(prob(5)) + affected_mob.emote("cough") + if(2) + var/obj/item/organ/internal/appendix/A = affected_mob.get_int_organ(/obj/item/organ/internal/appendix) + if(A) + A.inflamed = 1 + A.update_icon() + if(prob(3)) + affected_mob << "You feel a stabbing pain in your abdomen!" + affected_mob.Stun(rand(2,3)) + affected_mob.adjustToxLoss(1) + if(3) + if(prob(1)) + affected_mob.vomit(95) diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm new file mode 100644 index 00000000000..8e7331cbab8 --- /dev/null +++ b/code/datums/diseases/beesease.dm @@ -0,0 +1,40 @@ +/datum/disease/beesease + name = "Beesease" + form = "Infection" + max_stages = 4 + spread_text = "On contact" + spread_flags = CONTACT_GENERAL + cure_text = "Sugar" + cures = list("sugar") + agent = "Apidae Infection" + viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey) + desc = "If left untreated subject will regurgitate bees." + severity = DANGEROUS + +/datum/disease/beesease/stage_act() + ..() + switch(stage) + if(2) //also changes say, see say.dm // no it doesn't, that's horrifyingly snowflakey + if(prob(2)) + affected_mob << "You taste honey in your mouth." + if(3) + if(prob(10)) + affected_mob << "Your stomach rumbles." + if(prob(2)) + affected_mob << "Your stomach stings painfully." + if(prob(20)) + affected_mob.adjustToxLoss(2) + affected_mob.updatehealth() + if(4) + if(prob(10)) + affected_mob.visible_message("[affected_mob] buzzes.", \ + "Your stomach buzzes violently!") + if(prob(5)) + affected_mob << "You feel something moving in your throat." + if(prob(1)) + affected_mob.visible_message("[affected_mob] coughs up a swarm of bees!", \ + "You cough up a swarm of bees!") + new /mob/living/simple_animal/hostile/poison/bees(affected_mob.loc) + //if(5) + //Plus if you die, you explode into bees + return \ No newline at end of file diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm new file mode 100644 index 00000000000..d29e860a38b --- /dev/null +++ b/code/datums/diseases/brainrot.dm @@ -0,0 +1,59 @@ +/datum/disease/brainrot + name = "Brainrot" + max_stages = 4 + spread_text = "On contact" + spread_flags = CONTACT_GENERAL + cure_text = "Mannitol" + cures = list("mannitol") + agent = "Cryptococcus Cosmosis" + viable_mobtypes = list(/mob/living/carbon/human) + cure_chance = 15//higher chance to cure, since two reagents are required + desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication." + required_organs = list(/obj/item/organ/external/head) + severity = DANGEROUS + +/datum/disease/brainrot/stage_act() //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist -ACTUALLY Removed rather than commented out, I don't see it returning - RR + ..() + + switch(stage) + if(2) + if(prob(2)) + affected_mob.emote("blink") + if(prob(2)) + affected_mob.emote("yawn") + if(prob(2)) + affected_mob << "You don't feel like yourself." + if(prob(5)) + affected_mob.adjustBrainLoss(1) + affected_mob.updatehealth() + if(3) + if(prob(2)) + affected_mob.emote("stare") + if(prob(2)) + affected_mob.emote("drool") + if(prob(10) && affected_mob.getBrainLoss()<=98)//shouldn't retard you to death now + affected_mob.adjustBrainLoss(2) + affected_mob.updatehealth() + if(prob(2)) + affected_mob << "Your try to remember something important...but can't." + + if(4) + if(prob(2)) + affected_mob.emote("stare") + if(prob(2)) + affected_mob.emote("drool") + if(prob(15) && affected_mob.getBrainLoss()<=98) //shouldn't retard you to death now + affected_mob.adjustBrainLoss(3) + affected_mob.updatehealth() + if(prob(2)) + affected_mob << "Strange buzzing fills your head, removing all thoughts." + if(prob(3)) + affected_mob << "You lose consciousness..." + affected_mob.visible_message("[affected_mob] suddenly collapses") + affected_mob.Paralyse(rand(5,10)) + if(prob(1)) + affected_mob.emote("snore") + if(prob(15)) + affected_mob.stuttering += 3 + + return diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm new file mode 100644 index 00000000000..f9dca46a0aa --- /dev/null +++ b/code/datums/diseases/cold.dm @@ -0,0 +1,66 @@ +/datum/disease/cold + name = "The Cold" + max_stages = 3 + spread_flags = AIRBORNE + cure_text = "Rest & Spaceacillin" + cures = list("spaceacillin") + agent = "XY-rhinovirus" + viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey) + permeability_mod = 0.5 + desc = "If left untreated the subject will contract the flu." + severity = MINOR + +/datum/disease/cold/stage_act() + ..() + switch(stage) + if(2) +/* + if(affected_mob.sleeping && prob(40)) //removed until sleeping is fixed + affected_mob << "\blue You feel better." + cure() + return +*/ + if(affected_mob.lying && prob(40)) //changed FROM prob(10) until sleeping is fixed + affected_mob << "You feel better." + cure() + return + if(prob(1) && prob(5)) + affected_mob << "You feel better." + cure() + return + if(prob(1)) + affected_mob.emote("sneeze") + if(prob(1)) + affected_mob.emote("cough") + if(prob(1)) + affected_mob << "Your throat feels sore." + if(prob(1)) + affected_mob << "Mucous runs down the back of your throat." + if(3) +/* + if(affected_mob.sleeping && prob(25)) //removed until sleeping is fixed + affected_mob << "\blue You feel better." + cure() + return +*/ + if(affected_mob.lying && prob(25)) //changed FROM prob(5) until sleeping is fixed + affected_mob << "You feel better." + cure() + return + if(prob(1) && prob(1)) + affected_mob << "You feel better." + cure() + return + if(prob(1)) + affected_mob.emote("sneeze") + if(prob(1)) + affected_mob.emote("cough") + if(prob(1)) + affected_mob << "Your throat feels sore." + if(prob(1)) + affected_mob << "Mucous runs down the back of your throat." + if(prob(1) && prob(50)) + if(!affected_mob.resistances.Find(/datum/disease/flu)) + var/datum/disease/Flu = new /datum/disease/flu(0) + affected_mob.ContractDisease(Flu) + cure() \ No newline at end of file diff --git a/code/datums/diseases/cold9.dm b/code/datums/diseases/cold9.dm new file mode 100644 index 00000000000..f77065a5ed2 --- /dev/null +++ b/code/datums/diseases/cold9.dm @@ -0,0 +1,39 @@ +/datum/disease/cold9 + name = "The Cold" + max_stages = 3 + spread_text = "On contact" + spread_flags = CONTACT_GENERAL + cure_text = "Common Cold Anti-bodies & Spaceacillin" + cures = list("spaceacillin") + agent = "ICE9-rhinovirus" + viable_mobtypes = list(/mob/living/carbon/human) + desc = "If left untreated the subject will slow, as if partly frozen." + severity = MEDIUM + +/datum/disease/cold9/stage_act() + ..() + switch(stage) + if(2) + affected_mob.bodytemperature -= 10 + if(prob(1) && prob(10)) + affected_mob << "You feel better." + cure() + return + if(prob(1)) + affected_mob.emote("sneeze") + if(prob(1)) + affected_mob.emote("cough") + if(prob(1)) + affected_mob << "Your throat feels sore." + if(prob(5)) + affected_mob << "You feel stiff." + if(3) + affected_mob.bodytemperature -= 20 + if(prob(1)) + affected_mob.emote("sneeze") + if(prob(1)) + affected_mob.emote("cough") + if(prob(1)) + affected_mob << "Your throat feels sore." + if(prob(10)) + affected_mob << "You feel stiff." \ No newline at end of file diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm new file mode 100644 index 00000000000..a1c4d7471c4 --- /dev/null +++ b/code/datums/diseases/dna_spread.dm @@ -0,0 +1,72 @@ +/datum/disease/dnaspread + name = "Space Retrovirus" + max_stages = 4 + spread_text = "On contact" + spread_flags = CONTACT_GENERAL + cure_text = "Mutadone" + cures = list("mutadone") + disease_flags = CAN_CARRY|CAN_RESIST|CURABLE + agent = "S4E1 retrovirus" + viable_mobtypes = list(/mob/living/carbon/human) + var/datum/dna/original_dna = null + var/transformed = 0 + desc = "This disease transplants the genetic code of the initial vector into new hosts." + severity = MEDIUM + + +/datum/disease/dnaspread/stage_act() + ..() + if(!affected_mob.dna) + cure() + + if(!strain_data["dna"]) + //Absorbs the target DNA. + strain_data["dna"] = new affected_mob.dna.type + affected_mob.dna.copy_dna(strain_data["dna"]) + src.carrier = 1 + src.stage = 4 + return + + switch(stage) + if(2 || 3) //Pretend to be a cold and give time to spread. + if(prob(8)) + affected_mob.emote("sneeze") + if(prob(8)) + affected_mob.emote("cough") + if(prob(1)) + affected_mob << "Your muscles ache." + if(prob(20)) + affected_mob.take_organ_damage(1) + if(prob(1)) + affected_mob << "Your stomach hurts." + if(prob(20)) + affected_mob.adjustToxLoss(2) + affected_mob.updatehealth() + if(4) + if(!transformed && !carrier) + //Save original dna for when the disease is cured. + original_dna = new affected_mob.dna.type + affected_mob.dna.copy_dna(original_dna) + + affected_mob << "You don't feel like yourself.." + var/datum/dna/transform_dna = strain_data["dna"] + + transform_dna.transfer_identity(affected_mob, transfer_SE = 1) + affected_mob.real_name = affected_mob.dna.real_name + affected_mob.updateappearance(mutcolor_update=1) + affected_mob.domutcheck() + + transformed = 1 + carrier = 1 //Just chill out at stage 4 + + return + +/datum/disease/dnaspread/Destroy() + if (original_dna && transformed && affected_mob) + original_dna.transfer_identity(affected_mob, transfer_SE = 1) + affected_mob.real_name = affected_mob.dna.real_name + affected_mob.updateappearance(mutcolor_update=1) + affected_mob.domutcheck() + + affected_mob << "You feel more like yourself." + return ..() \ No newline at end of file diff --git a/code/datums/diseases/fake_gbs.dm b/code/datums/diseases/fake_gbs.dm new file mode 100644 index 00000000000..6a300f733ff --- /dev/null +++ b/code/datums/diseases/fake_gbs.dm @@ -0,0 +1,32 @@ +/datum/disease/fake_gbs + name = "GBS" + max_stages = 5 + spread_text = "On contact" + spread_flags = CONTACT_GENERAL + cure_text = "Diphenhydramine & Sulfur" + cures = list("diphenhydramine","sulfur") + agent = "Gravitokinetic Bipotential SADS-" + viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey) + desc = "If left untreated death will occur." + severity = BIOHAZARD + +/datum/disease/fake_gbs/stage_act() + ..() + switch(stage) + if(2) + if(prob(1)) + affected_mob.emote("sneeze") + if(3) + if(prob(5)) + affected_mob.emote("cough") + else if(prob(5)) + affected_mob.emote("gasp") + if(prob(10)) + affected_mob << "You're starting to feel very weak..." + if(4) + if(prob(10)) + affected_mob.emote("cough") + + if(5) + if(prob(10)) + affected_mob.emote("cough") diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm new file mode 100644 index 00000000000..58b7f247132 --- /dev/null +++ b/code/datums/diseases/flu.dm @@ -0,0 +1,54 @@ +/datum/disease/flu + name = "The Flu" + max_stages = 3 + spread_text = "Airborne" + cure_text = "Spaceacillin" + cures = list("spaceacillin") + cure_chance = 10 + agent = "H13N1 flu virion" + viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey) + permeability_mod = 0.75 + desc = "If left untreated the subject will feel quite unwell." + severity = MEDIUM + +/datum/disease/flu/stage_act() + ..() + switch(stage) + if(2) + if(affected_mob.lying && prob(20)) + affected_mob << "You feel better." + stage-- + return + if(prob(1)) + affected_mob.emote("sneeze") + if(prob(1)) + affected_mob.emote("cough") + if(prob(1)) + affected_mob << "Your muscles ache." + if(prob(20)) + affected_mob.take_organ_damage(1) + if(prob(1)) + affected_mob << "Your stomach hurts." + if(prob(20)) + affected_mob.adjustToxLoss(1) + affected_mob.updatehealth() + + if(3) + if(affected_mob.lying && prob(15)) + affected_mob << "You feel better." + stage-- + return + if(prob(1)) + affected_mob.emote("sneeze") + if(prob(1)) + affected_mob.emote("cough") + if(prob(1)) + affected_mob << "Your muscles ache." + if(prob(20)) + affected_mob.take_organ_damage(1) + if(prob(1)) + affected_mob << "Your stomach hurts." + if(prob(20)) + affected_mob.adjustToxLoss(1) + affected_mob.updatehealth() + return diff --git a/code/datums/diseases/fluspanish.dm b/code/datums/diseases/fluspanish.dm new file mode 100644 index 00000000000..49137ce2d62 --- /dev/null +++ b/code/datums/diseases/fluspanish.dm @@ -0,0 +1,36 @@ +/datum/disease/fluspanish + name = "Spanish inquisition Flu" + max_stages = 3 + spread_text = "Airborne" + cure_text = "Spaceacillin & Anti-bodies to the common flu" + cures = list("spaceacillin") + cure_chance = 10 + agent = "1nqu1s1t10n flu virion" + viable_mobtypes = list(/mob/living/carbon/human) + permeability_mod = 0.75 + desc = "If left untreated the subject will burn to death for being a heretic." + severity = DANGEROUS + +/datum/disease/fluspanish/stage_act() + ..() + switch(stage) + if(2) + affected_mob.bodytemperature += 10 + if(prob(5)) + affected_mob.emote("sneeze") + if(prob(5)) + affected_mob.emote("cough") + if(prob(1)) + affected_mob << "You're burning in your own skin!" + affected_mob.take_organ_damage(0,5) + + if(3) + affected_mob.bodytemperature += 20 + if(prob(5)) + affected_mob.emote("sneeze") + if(prob(5)) + affected_mob.emote("cough") + if(prob(5)) + affected_mob << "You're burning in your own skin!" + affected_mob.take_organ_damage(0,5) + return diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm new file mode 100644 index 00000000000..a2f4cc88112 --- /dev/null +++ b/code/datums/diseases/gbs.dm @@ -0,0 +1,41 @@ +/datum/disease/gbs + name = "GBS" + max_stages = 5 + spread_text = "On contact" + spread_flags = CONTACT_GENERAL + cure_text = "Diphenhydramine & Sulfur" + cures = list("diphenhydramine","sulfur") + cure_chance = 15//higher chance to cure, since two reagents are required + agent = "Gravitokinetic Bipotential SADS+" + viable_mobtypes = list(/mob/living/carbon/human) + disease_flags = CAN_CARRY|CAN_RESIST|CURABLE + permeability_mod = 1 + severity = BIOHAZARD + +/datum/disease/gbs/stage_act() + ..() + switch(stage) + if(2) + if(prob(45)) + affected_mob.adjustToxLoss(5) + affected_mob.updatehealth() + if(prob(1)) + affected_mob.emote("sneeze") + if(3) + if(prob(5)) + affected_mob.emote("cough") + else if(prob(5)) + affected_mob.emote("gasp") + if(prob(10)) + affected_mob << "You're starting to feel very weak..." + if(4) + if(prob(10)) + affected_mob.emote("cough") + affected_mob.adjustToxLoss(5) + affected_mob.updatehealth() + if(5) + affected_mob << "Your body feels as if it's trying to rip itself open..." + if(prob(50)) + affected_mob.gib() + else + return \ No newline at end of file diff --git a/code/datums/diseases/magnitis.dm b/code/datums/diseases/magnitis.dm new file mode 100644 index 00000000000..f24ae10c347 --- /dev/null +++ b/code/datums/diseases/magnitis.dm @@ -0,0 +1,63 @@ +/datum/disease/magnitis + name = "Magnitis" + max_stages = 4 + spread_text = "Airborne" + cure_text = "Iron" + cures = list("iron") + agent = "Fukkos Miracos" + viable_mobtypes = list(/mob/living/carbon/human) + disease_flags = CAN_CARRY|CAN_RESIST|CURABLE + permeability_mod = 0.75 + desc = "This disease disrupts the magnetic field of your body, making it act as if a powerful magnet. Injections of iron help stabilize the field." + severity = MEDIUM + +/datum/disease/magnitis/stage_act() + ..() + switch(stage) + if(2) + if(prob(2)) + affected_mob << "You feel a slight shock course through your body." + if(prob(2)) + for(var/obj/M in orange(2,affected_mob)) + if(!M.anchored && (M.flags & CONDUCT)) + step_towards(M,affected_mob) + for(var/mob/living/silicon/S in orange(2,affected_mob)) + if(istype(S, /mob/living/silicon/ai)) continue + step_towards(S,affected_mob) + if(3) + if(prob(2)) + affected_mob << "You feel a strong shock course through your body." + if(prob(2)) + affected_mob << "You feel like clowning around." + if(prob(4)) + for(var/obj/M in orange(4,affected_mob)) + if(!M.anchored && (M.flags & CONDUCT)) + var/i + var/iter = rand(1,2) + for(i=0,iYou feel a powerful shock course through your body." + if(prob(2)) + affected_mob << "You query upon the nature of miracles." + if(prob(8)) + for(var/obj/M in orange(6,affected_mob)) + if(!M.anchored && (M.flags & CONDUCT)) + var/i + var/iter = rand(1,3) + for(i=0,iYou feel a little silly." + if(2) + if(prob(10)) affected_mob << "You start seeing rainbows." + if(3) + if(prob(10)) affected_mob << "Your thoughts are interrupted by a loud HONK!" + if(4) + if(prob(5)) affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) ) diff --git a/code/datums/diseases/retrovirus.dm b/code/datums/diseases/retrovirus.dm new file mode 100644 index 00000000000..516dea907f0 --- /dev/null +++ b/code/datums/diseases/retrovirus.dm @@ -0,0 +1,83 @@ +/datum/disease/dna_retrovirus + name = "Retrovirus" + max_stages = 4 + spread_text = "Contact" + spread_flags = CONTACT_GENERAL + cure_text = "Rest or an injection of mutadone" + cure_chance = 6 + agent = "" + viable_mobtypes = list(/mob/living/carbon/human) + desc = "A DNA-altering retrovirus that scrambles the structural and unique enzymes of a host constantly." + severity = DANGEROUS + permeability_mod = 0.4 + stage_prob = 2 + var/SE + var/UI + var/restcure = 0 + + +/datum/disease/dna_retrovirus/New() + ..() + agent = "Virus class [pick("A","B","C","D","E","F")][pick("A","B","C","D","E","F")]-[rand(50,300)]" + if(prob(40)) + cures = list("mutadone") + else + restcure = 1 + + +/datum/disease/dna_retrovirus/stage_act() + ..() + switch(stage) + if(1) + if(restcure) + if(affected_mob.lying && prob(30)) + affected_mob << "You feel better." + cure() + return + if (prob(8)) + affected_mob << "Your head hurts." + if (prob(9)) + affected_mob << "You feel a tingling sensation in your chest." + if (prob(9)) + affected_mob << "You feel angry." + if(2) + if(restcure) + if(affected_mob.lying && prob(20)) + affected_mob << "You feel better." + cure() + return + if (prob(8)) + affected_mob << "Your skin feels loose." + if (prob(10)) + affected_mob << "You feel very strange." + if (prob(4)) + affected_mob << "You feel a stabbing pain in your head!" + affected_mob.Paralyse(2) + if (prob(4)) + affected_mob << "Your stomach churns." + if(3) + if(restcure) + if(affected_mob.lying && prob(20)) + affected_mob << "You feel better." + cure() + return + if (prob(10)) + affected_mob << "Your entire body vibrates." + + if (prob(35)) + if(prob(50)) + scramble(1, affected_mob, rand(15, 45)) + else + scramble(0, affected_mob, rand(15, 45)) + + if(4) + if(restcure) + if(affected_mob.lying && prob(5)) + affected_mob << "You feel better." + cure() + return + if (prob(60)) + if(prob(50)) + scramble(1, affected_mob, rand(15, 45)) + else + scramble(0, affected_mob, rand(15, 45)) \ No newline at end of file diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm new file mode 100644 index 00000000000..3a8600c61af --- /dev/null +++ b/code/datums/diseases/rhumba_beat.dm @@ -0,0 +1,52 @@ +/datum/disease/rhumba_beat + name = "The Rhumba Beat" + max_stages = 5 + spread_text = "On contact" + spread_flags = CONTACT_GENERAL + cure_text = "Chick Chicky Boom!" + cures = list("plasma") + agent = "Unknown" + viable_mobtypes = list(/mob/living/carbon/human) + permeability_mod = 1 + severity = BIOHAZARD + +/datum/disease/rhumba_beat/stage_act() + ..() + switch(stage) + if(1) + if(affected_mob.ckey == "rosham") + src.cure() + if(2) + if(affected_mob.ckey == "rosham") + src.cure() + if(prob(45)) + affected_mob.adjustToxLoss(5) + affected_mob.updatehealth() + if(prob(1)) + affected_mob << "You feel strange..." + if(3) + if(affected_mob.ckey == "rosham") + src.cure() + if(prob(5)) + affected_mob << "You feel the urge to dance..." + else if(prob(5)) + affected_mob.emote("gasp") + else if(prob(10)) + affected_mob << "You feel the need to chick chicky boom..." + if(4) + if(affected_mob.ckey == "rosham") + src.cure() + if(prob(10)) + affected_mob.emote("gasp") + affected_mob << "You feel a burning beat inside..." + if(prob(20)) + affected_mob.adjustToxLoss(5) + affected_mob.updatehealth() + if(5) + if(affected_mob.ckey == "rosham") + src.cure() + affected_mob << "Your body is unable to contain the Rhumba Beat..." + if(prob(50)) + affected_mob.gib() + else + return \ No newline at end of file diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm new file mode 100644 index 00000000000..e8ca3fa5f85 --- /dev/null +++ b/code/datums/diseases/transformation.dm @@ -0,0 +1,243 @@ +/datum/disease/transformation + name = "Transformation" + max_stages = 5 + spread_text = "Acute" + spread_flags = SPECIAL + cure_text = "A coder's love (theoretical)." + agent = "Shenanigans" + viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/alien) + severity = HARMFUL + stage_prob = 10 + visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC + disease_flags = CURABLE + var/list/stage1 = list("You feel unremarkable.") + var/list/stage2 = list("You feel boring.") + var/list/stage3 = list("You feel utterly plain.") + var/list/stage4 = list("You feel white bread.") + var/list/stage5 = list("Oh the humanity!") + var/new_form = /mob/living/carbon/human + +/datum/disease/transformation/stage_act() + ..() + switch(stage) + if(1) + if (prob(stage_prob) && stage1) + affected_mob << pick(stage1) + if(2) + if (prob(stage_prob) && stage2) + affected_mob << pick(stage2) + if(3) + if (prob(stage_prob*2) && stage3) + affected_mob << pick(stage3) + if(4) + if (prob(stage_prob*2) && stage4) + affected_mob << pick(stage4) + if(5) + do_disease_transformation(affected_mob) + +/datum/disease/transformation/proc/do_disease_transformation(mob/living/affected_mob) + if(istype(affected_mob, /mob/living/carbon) && affected_mob.stat != DEAD) + if(stage5) + affected_mob << pick(stage5) + if(jobban_isbanned(affected_mob, new_form)) + affected_mob.death(1) + return + if(affected_mob.notransform) + return + affected_mob.notransform = 1 + affected_mob.canmove = 0 + affected_mob.icon = null + affected_mob.overlays.Cut() + affected_mob.invisibility = 101 + for(var/obj/item/W in affected_mob) + if(istype(W, /obj/item/weapon/implant)) + qdel(W) + continue + W.layer = initial(W.layer) + W.loc = affected_mob.loc + W.dropped(affected_mob) + var/mob/living/new_mob = new new_form(affected_mob.loc) + if(istype(new_mob)) + new_mob.a_intent = "harm" + if(affected_mob.mind) + affected_mob.mind.transfer_to(new_mob) + else + new_mob.key = affected_mob.key + qdel(affected_mob) + + + +/datum/disease/transformation/jungle_fever + name = "Jungle Fever" + cure_text = "Bananas" + cures = list("banana") + spread_text = "Monkey Bites" + spread_flags = SPECIAL + viable_mobtypes = list(/mob/living/carbon/human) + permeability_mod = 1 + cure_chance = 1 + disease_flags = CAN_CARRY|CAN_RESIST + longevity = 30 + desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey." + severity = BIOHAZARD + stage_prob = 4 + visibility_flags = 0 + agent = "Kongey Vibrion M-909" + new_form = /mob/living/carbon/human/monkey + + stage1 = null + stage2 = null + stage3 = null + stage4 = list("Your back hurts.", "You breathe through your mouth.", + "You have a craving for bananas.", "Your mind feels clouded.") + stage5 = list("You feel like monkeying around.") + +/datum/disease/transformation/jungle_fever/do_disease_transformation(mob/living/carbon/human/affected_mob) + if(!issmall(affected_mob)) + affected_mob.monkeyize() + +/datum/disease/transformation/jungle_fever/stage_act() + ..() + switch(stage) + if(2) + if(prob(2)) + affected_mob << "Your [pick("back", "arm", "leg", "elbow", "head")] itches." + if(3) + if(prob(4)) + affected_mob << "You feel a stabbing pain in your head." + affected_mob.confused += 10 + if(4) + if(prob(3)) + affected_mob.say(pick("Eeek, ook ook!", "Eee-eeek!", "Eeee!", "Ungh, ungh.")) + + +/datum/disease/transformation/robot + + name = "Robotic Transformation" + cure_text = "An injection of copper." + cures = list("copper") + cure_chance = 5 + agent = "R2D2 Nanomachines" + desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg." + severity = DANGEROUS + visibility_flags = 0 + stage1 = null + stage2 = list("Your joints feel stiff.", "Beep...boop..") + stage3 = list("Your joints feel very stiff.", "Your skin feels loose.", "You can feel something move...inside.") + stage4 = list("Your skin feels very loose.", "You can feel... something...inside you.") + stage5 = list("Your skin feels as if it's about to burst off!") + new_form = /mob/living/silicon/robot + + +/datum/disease/transformation/robot/stage_act() + ..() + switch(stage) + if(3) + if (prob(8)) + affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop")) + if (prob(4)) + affected_mob << "You feel a stabbing pain in your head." + affected_mob.Paralyse(2) + if(4) + if (prob(20)) + affected_mob.say(pick("beep, beep!", "Boop bop boop beep.", "kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee...")) + + +/datum/disease/transformation/xeno + + name = "Xenomorph Transformation" + cure_text = "Spaceacillin & Glycerol" + cures = list("spaceacillin", "glycerol") + cure_chance = 5 + agent = "Rip-LEY Alien Microbes" + desc = "This disease changes the victim into a xenomorph." + severity = BIOHAZARD + visibility_flags = 0 + stage1 = null + stage2 = list("Your throat feels scratchy.", "Kill...") + stage3 = list("Your throat feels very scratchy.", "Your skin feels tight.", "You can feel something move...inside.") + stage4 = list("Your skin feels very tight.", "Your blood boils!", "You can feel... something...inside you.") + stage5 = list("Your skin feels as if it's about to burst off!") + new_form = /mob/living/carbon/alien/humanoid/hunter + +/datum/disease/transformation/xeno/stage_act() + ..() + switch(stage) + if(3) + if (prob(4)) + affected_mob << "You feel a stabbing pain in your head." + affected_mob.Paralyse(2) + if(4) + if (prob(20)) + affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!")) + + +/datum/disease/transformation/slime + name = "Advanced Mutation Transformation" + cure_text = "frost oil" + cures = list("frostoil") + cure_chance = 80 + agent = "Advanced Mutation Toxin" + desc = "This highly concentrated extract converts anything into more of itself." + severity = BIOHAZARD + visibility_flags = 0 + stage1 = list("You don't feel very well.") + stage2 = list("Your skin feels a little slimy.") + stage3 = list("Your appendages are melting away.", "Your limbs begin to lose their shape.") + stage4 = list("You are turning into a slime.") + stage5 = list("You have become a slime.") + new_form = /mob/living/simple_animal/slime + +/datum/disease/transformation/slime/stage_act() + ..() + switch(stage) + if(1) + if(ishuman(affected_mob)) + var/mob/living/carbon/human/H = affected_mob + if(H.species.name == "Slime People") + stage = 5 + if(3) + if(ishuman(affected_mob)) + var/mob/living/carbon/human/human = affected_mob + if(human.species.name != "Slime People") + human.set_species("Slime People") + +/datum/disease/transformation/corgi + name = "The Barkening" + cure_text = "Death" + cures = list("adminordrazine") + agent = "Fell Doge Majicks" + desc = "This disease transforms the victim into a corgi." + visibility_flags = 0 + stage1 = list("BARK.") + stage2 = list("You feel the need to wear silly hats.") + stage3 = list("Must... eat... chocolate....", "YAP") + stage4 = list("Visions of washing machines assail your mind!") + stage5 = list("AUUUUUU!!!") + new_form = /mob/living/simple_animal/pet/corgi + +/datum/disease/transformation/corgi/stage_act() + ..() + switch(stage) + if(3) + if (prob(8)) + affected_mob.say(pick("YAP", "Woof!")) + if(4) + if (prob(20)) + affected_mob.say(pick("Bark!", "AUUUUUU")) + +/datum/disease/transformation/morph + name = "Gluttony's Blessing" + cure_text = "nothing" + cures = list("adminordrazine") + agent = "Gluttony's Blessing" + desc = "A 'gift' from somewhere terrible." + stage_prob = 20 + severity = BIOHAZARD + visibility_flags = 0 + stage1 = list("Your stomach rumbles.") + stage2 = list("Your skin feels saggy.") + stage3 = list("Your appendages are melting away.", "Your limbs begin to lose their shape.") + stage4 = list("You're ravenous.") + stage5 = list("You have become a morph.") + new_form = /mob/living/simple_animal/hostile/morph \ No newline at end of file diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm new file mode 100644 index 00000000000..d0fa2f610a2 --- /dev/null +++ b/code/datums/diseases/tuberculosis.dm @@ -0,0 +1,58 @@ +/datum/disease/tuberculosis + name = "Fungal tuberculosis" + max_stages = 5 + spread_text = "Airborne" + cure_text = "Spaceacillin & salbutamol" + cures = list("spaceacillin", "salbutamol") + agent = "Fungal Tubercle bacillus Cosmosis" + viable_mobtypes = list(/mob/living/carbon/human) + cure_chance = 5//like hell are you getting out of hell + desc = "A rare highly transmittable virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue." + required_organs = list(/obj/item/organ/external/head) + severity = DANGEROUS + +/datum/disease/tuberculosis/stage_act() //it begins + ..() + switch(stage) + if(2) + if(prob(2)) + affected_mob.emote("cough") + affected_mob << "Your chest hurts." + if(prob(2)) + affected_mob << "Your stomach violently rumbles!" + if(prob(5)) + affected_mob << "You feel a cold sweat form." + if(4) + if(prob(2)) + affected_mob << "You see four of everything" + affected_mob.Dizzy(5) + if(prob(2)) + affected_mob << "You feel a sharp pain from your lower chest!" + affected_mob.adjustOxyLoss(5) + affected_mob.emote("gasp") + if(prob(10)) + affected_mob << "You feel air escape from your lungs painfully." + affected_mob.adjustOxyLoss(25) + affected_mob.emote("gasp") + if(5) + if(prob(2)) + affected_mob << "[pick("You feel your heart slowing...", "You relax and slow your heartbeat.")]" + affected_mob.adjustStaminaLoss(70) + if(prob(10)) + affected_mob.adjustStaminaLoss(100) + affected_mob.visible_message("[affected_mob] faints!", "You surrender yourself and feel at peace...") + affected_mob.AdjustSleeping(5) + if(prob(2)) + affected_mob << "You feel your mind relax and your thoughts drift!" + affected_mob.confused = min(100, affected_mob.confused + 8) + if(prob(10)) + affected_mob.vomit(20) + if(prob(3)) + affected_mob << "[pick("Your stomach silently rumbles...", "Your stomach seizes up and falls limp, muscles dead and lifeless.", "You could eat a crayon")]" + affected_mob.overeatduration = max(affected_mob.overeatduration - 100, 0) + affected_mob.nutrition = max(affected_mob.nutrition - 100, 0) + if(prob(15)) + affected_mob << "[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit", "You feel like taking off some clothes...")]" + affected_mob.bodytemperature += 40 + return + diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm new file mode 100644 index 00000000000..33a1ddc47b8 --- /dev/null +++ b/code/datums/diseases/wizarditis.dm @@ -0,0 +1,118 @@ +/datum/disease/wizarditis + name = "Wizarditis" + max_stages = 4 + spread_text = "Airborne" + cure_text = "The Manly Dorf" + cures = list("manlydorf") + cure_chance = 100 + agent = "Rincewindus Vulgaris" + viable_mobtypes = list(/mob/living/carbon/human) + disease_flags = CAN_CARRY|CAN_RESIST|CURABLE + permeability_mod = 0.75 + desc = "Some speculate, that this virus is the cause of Wizard Federation existance. Subjects affected show the signs of mental retardation, yelling obscure sentences or total gibberish. On late stages subjects sometime express the feelings of inner power, and, cite, 'the ability to control the forces of cosmos themselves!' A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition." + severity = HARMFUL + required_organs = list(/obj/item/organ/external/head) + +/* +BIRUZ BENNAR +SCYAR NILA - teleport +NEC CANTIO - dis techno +EI NATH - shocking grasp +AULIE OXIN FIERA - knock +TARCOL MINTI ZHERI - forcewall +STI KALY - blind +*/ + +/datum/disease/wizarditis/stage_act() + ..() + + switch(stage) + if(2) + if(prob(1)&&prob(50)) + affected_mob.say(pick("You shall not pass!", "Expeliarmus!", "By Merlins beard!", "Feel the power of the Dark Side!")) + if(prob(1)&&prob(50)) + affected_mob << "You feel [pick("that you don't have enough mana", "that the winds of magic are gone", "an urge to summon familiar")]." + + + if(3) + if(prob(1)&&prob(50)) + affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!", "STI KALY!", "TARCOL MINTI ZHERI!")) + if(prob(1)&&prob(50)) + affected_mob << "You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar")]." + + if(4) + + if(prob(1)) + affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!","STI KALY!","EI NATH!")) + return + if(prob(1)&&prob(50)) + affected_mob << "You feel [pick("the tidal wave of raw power building inside","that this location gives you a +2 to INT and +1 to WIS","an urge to teleport")]." + spawn_wizard_clothes(50) + if(prob(1)&&prob(1)) + teleport() + return + + + +/datum/disease/wizarditis/proc/spawn_wizard_clothes(chance = 0) + if(istype(affected_mob, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = affected_mob + if(prob(chance)) + if(!istype(H.head, /obj/item/clothing/head/wizard)) + if(!H.unEquip(H.head)) + qdel(H.head) + H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(H), slot_head) + return + if(prob(chance)) + if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe)) + if(!H.unEquip(H.wear_suit)) + qdel(H.wear_suit) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(H), slot_wear_suit) + return + if(prob(chance)) + if(!istype(H.shoes, /obj/item/clothing/shoes/sandal)) + if(!H.unEquip(H.shoes)) + qdel(H.shoes) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), slot_shoes) + return + else + var/mob/living/carbon/H = affected_mob + if(prob(chance)) + if(!istype(H.r_hand, /obj/item/weapon/twohanded/staff)) + H.drop_r_hand() + H.put_in_r_hand( new /obj/item/weapon/twohanded/staff(H) ) + return + return + + + +/datum/disease/wizarditis/proc/teleport() + var/list/theareas = get_areas_in_range(80, affected_mob) + for(var/area/space/S in theareas) + theareas -= S + + if(!theareas||!theareas.len) + return + + var/area/thearea = pick(theareas) + + var/list/L = list() + for(var/turf/T in get_area_turfs(thearea.type)) + if(T.z != affected_mob.z) continue + if(T.name == "space") continue + if(!T.density) + var/clear = 1 + for(var/obj/O in T) + if(O.density) + clear = 0 + break + if(clear) + L+=T + + if(!L) + return + + affected_mob.say("SCYAR NILA [uppertext(thearea.name)]!") + affected_mob.loc = pick(L) + + return diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index c94c78fa29f..888d84b4d2c 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -699,10 +699,20 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/medical/virus name = "Virus Crate" - contains = list(/obj/item/weapon/virusdish/random, - /obj/item/weapon/virusdish/random, - /obj/item/weapon/virusdish/random, - /obj/item/weapon/virusdish/random) + contains = list(/obj/item/weapon/reagent_containers/glass/bottle/flu_virion, + /obj/item/weapon/reagent_containers/glass/bottle/cold, + /obj/item/weapon/reagent_containers/glass/bottle/epiglottis_virion, + /obj/item/weapon/reagent_containers/glass/bottle/liver_enhance_virion, + /obj/item/weapon/reagent_containers/glass/bottle/fake_gbs, + /obj/item/weapon/reagent_containers/glass/bottle/magnitis, + /obj/item/weapon/reagent_containers/glass/bottle/pierrot_throat, + /obj/item/weapon/reagent_containers/glass/bottle/brainrot, + /obj/item/weapon/reagent_containers/glass/bottle/hullucigen_virion, + /obj/item/weapon/reagent_containers/glass/bottle/anxiety, + /obj/item/weapon/reagent_containers/glass/bottle/beesease, + /obj/item/weapon/storage/box/syringes, + /obj/item/weapon/storage/box/beakers, + /obj/item/weapon/reagent_containers/glass/bottle/mutagen) cost = 25 containertype = /obj/structure/closet/crate/secure/plasma containername = "virus crate" diff --git a/code/defines/procs/AStar.dm b/code/defines/procs/AStar.dm index 1479db76e5d..a8f2199265d 100644 --- a/code/defines/procs/AStar.dm +++ b/code/defines/procs/AStar.dm @@ -70,6 +70,10 @@ Actual Adjacent procs : //the actual algorithm /proc/AStar(start, end, atom, dist, maxnodes, maxnodedepth = 30, mintargetdist, adjacent = /turf/proc/reachableAdjacentTurfs, id=null, turf/exclude=null, simulated_only = 1) + //sanitation + start = get_turf(start) //IF YOU WANT A FUCKING TURF TRY CASTING IT BEFORE THE FUCKING FIRST CALL + if(!start) + return 0 if(maxnodes) //if start turf is farther than maxnodes from end turf, no need to do anything @@ -82,10 +86,6 @@ Actual Adjacent procs : var/list/path = null //the returned path, if any var/PathNode/cur //current processed turf - //sanitation - start = get_turf(start) - if(!start) - return 0 //initialization open.Insert(new /PathNode(start,null,0,call(start,dist)(end),0)) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index f7ee79f2619..aa555a75b82 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -362,6 +362,23 @@ . = 1 return 1 +/atom/proc/add_blood_list(mob/living/carbon/M) + // Returns 0 if we have that blood already + if(!istype(blood_DNA, /list)) //if our list of DNA doesn't exist yet (or isn't a list) initialise it. + blood_DNA = list() + //if this blood isn't already in the list, add it + if(blood_DNA[M.dna.unique_enzymes]) + return 0 //already bloodied with this blood. Cannot add more. + var/blood_type = "X*" + if(ishuman(M)) + var/mob/living/carbon/human/H = M + blood_type = H.b_type + blood_DNA[M.dna.unique_enzymes] = blood_type + return 1 + +// Only adds blood on the floor -- Skie +/atom/proc/add_blood_floor(mob/living/carbon/M) + return //why the fuck this is at an atom level but only works on simulated turfs I don't know /atom/proc/clean_blood() src.germ_level = 0 @@ -377,10 +394,6 @@ if(toxvomit) this.icon_state = "vomittox_[pick(1,4)]" -/atom/proc/add_poop_floor(mob/living/carbon/M as mob) - if( istype(src, /turf/simulated) ) - new /obj/effect/decal/cleanable/poop(src) - /atom/proc/get_global_map_pos() if(!islist(global_map) || isemptylist(global_map)) return diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index ce96bca33e0..6116f60c30a 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -60,10 +60,11 @@ //called when a carbon changes virus /mob/living/carbon/proc/check_virus() - for (var/ID in virus2) - if (ID in virusDB) + for(var/datum/disease/D in viruses) + if((!(D.visibility_flags & HIDDEN_SCANNER)) && (D.severity != NONTHREAT)) return 1 return 0 + //helper for getting the appropriate health status /proc/RoundHealth(health) switch(health) diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index d9e4263ebcd..a074a299301 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -668,8 +668,6 @@ shake_camera(M, 10, 5) if (M == usr) continue - if(!airborne_can_reach(UT, T)) - continue M << "You are sent flying!" M.Weaken(5) step_away(M, UT, 15) diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm index c2d12e6a9a8..e8d42efcc1f 100644 --- a/code/game/gamemodes/changeling/powers/panacea.dm +++ b/code/game/gamemodes/changeling/powers/panacea.dm @@ -23,12 +23,8 @@ user.reagents.add_reagent("potass_iodide", 10) user.reagents.add_reagent("charcoal", 20) - if(istype(user, /mob/living/carbon)) - var/mob/living/carbon/C = user - if(C.virus2.len) - for (var/ID in C.virus2) - var/datum/disease2/disease/V = C.virus2[ID] - C.antibodies |= V.antigen + for(var/datum/disease/D in user.viruses) + D.cure() feedback_add_details("changeling_powers","AP") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm index 0ca28de0aa7..87c24e90371 100644 --- a/code/game/gamemodes/scoreboard.dm +++ b/code/game/gamemodes/scoreboard.dm @@ -95,9 +95,6 @@ if(istype(M, /obj/effect/decal/cleanable/blood)) score_mess += 1 - if(istype(M, /obj/effect/decal/cleanable/poop)) - score_mess += 1 - if(istype(M, /obj/effect/decal/cleanable/vomit)) score_mess += 1 diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 0c69bd5b2a7..cac9a31ba7e 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -192,8 +192,8 @@ /obj/effect/proc_holder/spell/vampire/targetted/disease name = "Diseased Touch (100)" - desc = "Touches your victim with infected blood giving them the Shutdown Syndrome which quickly shutsdown their major organs resulting in a quick painful death." - gain_desc = "You have gained the Diseased Touch ability which causes those you touch to die shortly after unless treated medically." + desc = "Touches your victim with infected blood giving them appendicitis, which will, left untreated, cause a slow death by poison." + gain_desc = "You have gained the Diseased Touch ability which causes those you touch to die unless treated medically." action_icon_state = "vampire_disease" required_blood = 100 @@ -204,21 +204,8 @@ if(!affects(target)) usr << "They seem to be unaffected." continue - var/datum/disease2/disease/shutdown = new /datum/disease2/disease - var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder - var/datum/disease2/effect/organs/vampire/O = new /datum/disease2/effect/organs/vampire - holder.effect += O - holder.chance = 10 - shutdown.infectionchance = 100 - shutdown.antigen |= text2num(pick(ANTIGENS)) - shutdown.antigen |= text2num(pick(ANTIGENS)) - shutdown.spreadtype = "None" - shutdown.uniqueID = rand(0,10000) - shutdown.effects += holder - shutdown.speed = 1 - shutdown.stage = 2 - shutdown.clicks = 185 - infect_virus2(target, shutdown, 0) + var/datum/disease/D = new /datum/disease/appendicitis //someone should probably make a better virus for this + target.ForceContractDisease(D) /obj/effect/proc_holder/spell/vampire/mob_aoe/glare name = "Glare" diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index cbfb8549923..9afc26351f4 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -173,7 +173,7 @@ selection_color = "#ffeef0" idtype = /obj/item/weapon/card/id/medical access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics) - minimal_access = list(access_medical, access_virology, access_maint_tunnels) + minimal_access = list(access_medical, access_virology, access_maint_tunnels, access_mineral_storeroom) alt_titles = list("Pathologist","Microbiologist") minimal_player_age = 7 diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index fe4c1088885..21f66a0a148 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -317,7 +317,7 @@ occupantData["health"] = H.health occupantData["maxHealth"] = H.maxHealth - occupantData["hasVirus"] = H.virus2.len + occupantData["hasVirus"] = H.viruses.len occupantData["bruteLoss"] = H.getBruteLoss() occupantData["oxyLoss"] = H.getOxyLoss() @@ -476,7 +476,7 @@ t1 = "*dead*" dat += "[occupant.health > 50 ? "" : ""]\tHealth %: [occupant.health], ([t1])
" - if(occupant.virus2.len) + if(occupant.viruses.len) dat += "Viral pathogen detected in blood stream.
" var/extra_font = null diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm index 902ee0becde..1a8a37e3451 100644 --- a/code/game/machinery/bots/cleanbot.dm +++ b/code/game/machinery/bots/cleanbot.dm @@ -208,7 +208,6 @@ text("[on ? "On" : "Off"]")) target_types += /obj/effect/decal/cleanable/blood/oil target_types += /obj/effect/decal/cleanable/vomit - target_types += /obj/effect/decal/cleanable/poop target_types += /obj/effect/decal/cleanable/blood/gibs/robot target_types += /obj/effect/decal/cleanable/crayon target_types += /obj/effect/decal/cleanable/liquid_fuel @@ -220,7 +219,6 @@ text("[on ? "On" : "Off"]")) target_types += /obj/effect/decal/cleanable/ash target_types += /obj/effect/decal/cleanable/greenglow target_types += /obj/effect/decal/cleanable/dirt - target_types += /obj/effect/decal/cleanable/mucus if(blood) target_types += /obj/effect/decal/cleanable/blood/xeno/ diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm index 95dcf14267f..641b6821e55 100644 --- a/code/game/machinery/bots/medbot.dm +++ b/code/game/machinery/bots/medbot.dm @@ -424,10 +424,17 @@ if((C.getToxLoss() >= heal_threshold) && (!C.reagents.has_reagent(treatment_tox))) return 1 - if((C.virus2.len) && (!C.reagents.has_reagent(treatment_virus))) - for (var/ID in C.virus2) - if (ID in virusDB) // If the virus is known, the medbot is aware of it - return 1 + if(treat_virus) + for(var/datum/disease/D in C.viruses) + //the medibot can't detect viruses that are undetectable to Health Analyzers or Pandemic machines. + if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC) + return 0 + if(D.severity == NONTHREAT) // medibot doesn't try to heal truly harmless viruses + return 0 + if((D.stage > 1) || (D.spread_flags & AIRBORNE)) // medibot can't detect a virus in its initial stage unless it spreads airborne. + + if(!C.reagents.has_reagent(treatment_virus)) + return 1 //STOP DISEASE FOREVER return 0 /obj/machinery/bot/medbot/proc/medicate_patient(mob/living/carbon/C as mob) @@ -458,12 +465,14 @@ else if(treat_virus) var/virus = 0 - if(C:virus2.len) - for (var/ID in C.virus2) - if (ID in virusDB) // If the virus is known, the medbot is aware of it and will try to cure it - virus = 1 + for(var/datum/disease/D in C.viruses) + //detectable virus + if((!(D.visibility_flags & HIDDEN_SCANNER)) || (!(D.visibility_flags & HIDDEN_PANDEMIC))) + if(D.severity != NONTHREAT) //virus is harmful + if((D.stage > 1) || (D.spread_flags & AIRBORNE)) + virus = 1 - if (!reagent_id && (virus)) + if(!reagent_id && (virus)) if(!C.reagents.has_reagent(treatment_virus)) reagent_id = treatment_virus diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index c80298283bc..8045ed2b9fa 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -54,6 +54,10 @@ /obj/item/weapon/circuitboard/med_data name = "Circuit board (Medical Records)" build_path = /obj/machinery/computer/med_data +/obj/item/weapon/circuitboard/pandemic + name = "circuit board (PanD.E.M.I.C. 2200)" + build_path = /obj/machinery/computer/pandemic + origin_tech = "programming=2;biotech=2" /obj/item/weapon/circuitboard/scan_consolenew name = "Circuit board (DNA Machine)" build_path = /obj/machinery/computer/scan_consolenew @@ -243,12 +247,6 @@ build_path = /obj/machinery/computer/shuttle/white_ship -/obj/item/weapon/circuitboard/curefab - name = "Circuit board (Cure Fabricator)" - build_path = /obj/machinery/computer/curer -/obj/item/weapon/circuitboard/splicer - name = "Circuit board (Disease Splicer)" - build_path = /obj/machinery/computer/diseasesplicer /obj/item/weapon/circuitboard/HolodeckControl name = "Circuit board (Holodeck Control)" build_path = /obj/machinery/computer/HolodeckControl diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index ddcff089b81..7fa351e72be 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -84,7 +84,6 @@ dat += text("\nPrint Record
\nBack
", src, src) if(5.0) dat += "
Virus Database
" - /* Advanced diseases is weak! Feeble! Glory to virus2! for(var/Dt in typesof(/datum/disease/)) var/datum/disease/Dis = new Dt(0) if(istype(Dis, /datum/disease/advance)) @@ -92,11 +91,6 @@ if(!Dis.desc) continue dat += "
[Dis.name]" - */ - for (var/ID in virusDB) - var/datum/data/record/v = virusDB[ID] - dat += "
[v.fields["name"]]" - dat += "
Back" if(6.0) dat += "
Medical Robot Monitor
" @@ -206,12 +200,20 @@ src.active2 = null if(href_list["vir"]) - var/datum/data/record/v = locate(href_list["vir"]) - src.temp = "
GNAv2 based virus lifeform V-[v.fields["id"]]
" - src.temp += "
Name: [v.fields["name"]]" - src.temp += "
Antigen: [v.fields["antigen"]]" - src.temp += "
Spread: [v.fields["spread type"]] " - src.temp += "
Details:
[v.fields["description"]]" + var/type = href_list["vir"] + var/datum/disease/Dis = new type(0) + var/AfS = "" + for(var/mob/M in Dis.viable_mobtypes) + AfS += " [initial(M.name)];" + src.temp = {"Name: [Dis.name] +
Number of stages: [Dis.max_stages] +
Spread: [Dis.spread_text] Transmission +
Possible Cure: [(Dis.cure_text||"none")] +
Affected Lifeforms:[AfS] +
+
Notes: [Dis.desc] +
+
Severity: [Dis.severity]"} if (href_list["del_all"]) src.temp = text("Are you sure you wish to delete all records?
\n\tYes
\n\tNo
", src, src) diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index bca954ac593..822b32b0226 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -108,37 +108,54 @@ return 1 return 0 -/obj/machinery/smartfridge/secure/virology - name = "\improper Refrigerated Virus Storage" - desc = "A refrigerated storage unit for storing viral material." - req_access_txt = "39" - icon_state = "smartfridge_virology" - icon_on = "smartfridge_virology" - icon_off = "smartfridge_virology-off" - -/obj/machinery/smartfridge/secure/virology/accept_check(var/obj/item/O as obj) - if(istype(O,/obj/item/weapon/reagent_containers/glass/beaker/vial/)) - return 1 - if(istype(O,/obj/item/weapon/virusdish/)) - return 1 - return 0 - /obj/machinery/smartfridge/secure/chemistry name = "\improper Smart Chemical Storage" desc = "A refrigerated storage unit for medicine and chemical storage." icon_state = "smartfridge" //To fix the icon in the map editor. icon_on = "smartfridge_chem" req_access_txt = "33" + var/list/spawn_meds = list() + +/obj/machinery/smartfridge/secure/chemistry/New() + ..() + for(var/typekey in spawn_meds) + var/amount = spawn_meds[typekey] + if(isnull(amount)) amount = 1 + while(amount) + var/obj/item/I = new typekey(src) + if(item_quants[I.name]) + item_quants[I.name]++ + else + item_quants[I.name] = 1 + nanomanager.update_uis(src) + amount-- /obj/machinery/smartfridge/chemistry/accept_check(var/obj/item/O as obj) if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers)) return 1 return 0 + +// ---------------------------- +// Virology Medical Smartfridge +// ---------------------------- /obj/machinery/smartfridge/secure/chemistry/virology - name = "\improper Smart Virus Storage" + name = "smart virus storage" desc = "A refrigerated storage unit for volatile sample storage." req_access_txt = "39" + spawn_meds = list(/obj/item/weapon/reagent_containers/syringe/antiviral = 4, + /obj/item/weapon/reagent_containers/glass/bottle/cold = 1, + /obj/item/weapon/reagent_containers/glass/bottle/flu_virion = 1, + /obj/item/weapon/reagent_containers/glass/bottle/mutagen = 1, + /obj/item/weapon/reagent_containers/glass/bottle/plasma = 1, + /obj/item/weapon/reagent_containers/glass/bottle/diphenhydramine = 1) + +/obj/machinery/smartfridge/secure/chemistry/virology/accept_check(obj/item/O) + if(..(O)) + return 1 + if(istype(O, /obj/item/weapon/reagent_containers/syringe)) + return 1 + return 0 /obj/machinery/smartfridge/drinks name = "\improper Drink Showcase" diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 9a6b551a843..4a40906dc7b 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1008,7 +1008,13 @@ vend_delay = 15 vend_reply = "Have an enchanted evening!" product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!" - products = list(/obj/item/clothing/head/wizard = 1,/obj/item/clothing/suit/wizrobe = 1,/obj/item/clothing/head/wizard/red = 1,/obj/item/clothing/suit/wizrobe/red = 1,/obj/item/clothing/shoes/sandal = 1,/obj/item/weapon/twohanded/staff = 2) + products = list(/obj/item/clothing/head/wizard = 1, + /obj/item/clothing/suit/wizrobe = 1, + /obj/item/clothing/head/wizard/red = 1, + /obj/item/clothing/suit/wizrobe/red = 1, + /obj/item/clothing/shoes/sandal = 1, + /obj/item/weapon/twohanded/staff = 2) + contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/wizarditis = 1) /obj/machinery/vending/autodrobe name = "\improper AutoDrobe" diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 3f75bca668c..2fd1fbdcd34 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -18,7 +18,6 @@ var/global/list/image/splatter_cache=list() var/list/viruses = list() blood_DNA = list() var/basecolor="#A10808" // Color when wet. - var/list/datum/disease2/disease/virus2 = list() var/amount = 5 appearance_flags = NO_CLIENT_COLOR @@ -198,20 +197,20 @@ var/global/list/image/splatter_cache=list() /obj/effect/decal/cleanable/blood/gibs/proc/streak(var/list/directions) - spawn (0) - var/direction = pick(directions) - for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++) - sleep(3) - if (i > 0) - var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc) - b.basecolor = src.basecolor - b.update_icon() - for(var/datum/disease2/disease/D in src.viruses) - var/datum/disease2/disease/ND = D.getcopy() - b.viruses += ND - - if (step_to(src, get_step(src, direction), 0)) - break + set waitfor = 0 + var/direction = pick(directions) + for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++) + sleep(3) + if (i > 0) + var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc) + b.basecolor = src.basecolor + b.update_icon() + for(var/datum/disease/D in src.viruses) + var/datum/disease/ND = D.Copy(1) + b.viruses += ND + ND.holder = b + if (step_to(src, get_step(src, direction), 0)) + break /obj/effect/decal/cleanable/blood/old/New() @@ -221,29 +220,3 @@ var/global/list/image/splatter_cache=list() /obj/effect/decal/cleanable/blood/gibs/old/New() ..() dry() - -/obj/effect/decal/cleanable/mucus - name = "mucus" - desc = "Disgusting mucus." - gender = PLURAL - density = 0 - anchored = 1 - layer = 2 - icon = 'icons/effects/blood.dmi' - icon_state = "mucus" - random_icon_states = list("mucus") - - var/list/datum/disease2/disease/virus2 = list() - var/dry=0 // Keeps the lag down - -/obj/effect/decal/cleanable/mucus/New() - spawn(DRYING_TIME * 2) - dry=1 - -/obj/effect/decal/cleanable/blood/viralsputum - name = "viral sputum" - desc = "It's black and nasty." -// basecolor="#030303" - icon = 'icons/mob/robots.dmi' - icon_state = "floor1" - random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7") \ No newline at end of file diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index 89ad3048242..2aa7a997834 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -114,7 +114,6 @@ icon = 'icons/effects/blood.dmi' icon_state = "vomit_1" random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4") - var/list/datum/disease2/disease/virus2 = list() noclear = 1 /obj/effect/decal/cleanable/vomit/New() @@ -133,17 +132,6 @@ reagents.remove_reagent("vomit", 5) reagents.add_reagent("green_vomit", 5) -/obj/effect/decal/cleanable/poop - name = "poop" - desc = "Gosh, how unpleasant." - gender = PLURAL - density = 0 - anchored = 1 - layer = 2 - icon = 'icons/effects/poop.dmi' - random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7") - var/list/datum/disease2/disease/virus2 = list() - /obj/effect/decal/cleanable/tomato_smudge name = "tomato smudge" desc = "It's red." diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 5213a32b78d..0a8842921ec 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -187,19 +187,13 @@ REAGENT SCANNER if (istype(M, /mob/living/carbon)) if(upgraded) chemscan(user, M) - if(M:virus2.len) // WHAT IS TYPECASTING - var/mob/living/carbon/C = M - for (var/ID in C.virus2) - if (ID in virusDB) - var/datum/data/record/V = virusDB[ID] - user.show_message(text("\red Warning: Pathogen [V.fields["name"]] detected in subject's blood. Known antigen : [V.fields["antigen"]]")) -// user.show_message(text("\red Warning: Unknown pathogen detected in subject's blood.")) + for(var/datum/disease/D in M.viruses) + if(!(D.visibility_flags & HIDDEN_SCANNER)) + user << "Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]" if(M.getStaminaLoss()) user.show_message("Subject appears to be suffering from fatigue.") if (M.getCloneLoss()) user.show_message("Subject appears to have [M.getCloneLoss() > 30 ? "severe" : "minor"] cellular damage.") -// if (M.reagents && M.reagents.get_reagent_amount("epinephrine")) -// user.show_message("\blue Bloodstream Analysis located [M.reagents:get_reagent_amount("epinephrine")] units of rejuvenation chemicals.") if (M.has_brain_worms()) user.show_message("\red Subject suffering from aberrant brain activity. Recommend further scanning.") else if (M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && !M.get_int_organ(/obj/item/organ/internal/brain)) diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 8bcf3b8a5b8..9023edcda55 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -113,22 +113,19 @@ //returns 1 if made bloody, returns 0 otherwise -/turf/simulated/add_blood(mob/living/carbon/human/M as mob) +/turf/simulated/add_blood(mob/living/carbon/human/M) if (!..()) return 0 - if(istype(M)) - for(var/obj/effect/decal/cleanable/blood/B in contents) - if(!B.blood_DNA[M.dna.unique_enzymes]) - B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type - B.virus2 = virus_copylist(M.virus2) - return 1 //we bloodied the floor + var/obj/effect/decal/cleanable/blood/B = locate() in contents //check for existing blood splatter + if(!B) blood_splatter(src,M.get_blood(M.vessel),1) - return 1 //we bloodied the floor - return 0 + B = locate(/obj/effect/decal/cleanable/blood) in contents + B.add_blood_list(M) + return 1 //we bloodied the floor // Only adds blood on the floor -- Skie -/turf/simulated/proc/add_blood_floor(mob/living/carbon/M as mob) +/turf/simulated/add_blood_floor(mob/living/carbon/M as mob) if(ishuman(M)) blood_splatter(src,M,1) if( istype(M, /mob/living/carbon/alien )) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index f6a903ac10e..c33bc85061c 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -70,7 +70,6 @@ var/list/admin_verbs_admin = list( /client/proc/secrets, /client/proc/change_human_appearance_admin, /* Allows an admin to change the basic appearance of human-based mobs */ /client/proc/change_human_appearance_self, /* Allows the human-based mob itself change its basic appearance */ - /client/proc/virus_2_creator, /client/proc/debug_variables ) var/list/admin_verbs_ban = list( @@ -576,43 +575,16 @@ var/list/admin_verbs_proccall = list ( log_admin("[key_name(usr)] gave [key_name(T)] the spell [S].") message_admins("[key_name_admin(usr)] gave [key_name(T)] the spell [S].", 1) - -/client/proc/give_disease2(mob/T as mob in mob_list) // -- Giacom +/client/proc/give_disease(mob/T in mob_list) set category = "Event" set name = "Give Disease" set desc = "Gives a Disease to a mob." - - if(!check_rights(R_EVENT)) - return - - var/datum/disease2/disease/D = new /datum/disease2/disease() - - var/severity = 1 - var/greater = input("Is this a lesser, greater, or badmin disease?", "Give Disease") in list("Lesser", "Greater", "Badmin") - switch(greater) - if ("Lesser") severity = 1 - if ("Greater") severity = 2 - if ("Badmin") severity = 99 - - D.makerandom(severity) - - D.spreadtype = input("What method of contagion should the disease have?", "Give Disease") in list("Airborne","Contact","Injection") - - D.infectionchance = input("How virulent is this disease? (1-100)", "Give Disease", D.infectionchance) as num - - if(istype(T,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = T - if (H.species) - D.affected_species = list(H.species.name) - if(H.species.primitive_form) - D.affected_species |= H.species.primitive_form - if(H.species.greater_form) - D.affected_species |= H.species.greater_form - infect_virus2(T,D,1) - - feedback_add_details("admin_verb","GD2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].") - message_admins("[key_name_admin(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].") + var/datum/disease/D = input("Choose the disease to give to that guy", "ACHOO") as null|anything in diseases + if(!D) return + T.ForceContractDisease(new D) + feedback_add_details("admin_verb","GD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + log_admin("[key_name(usr)] gave [key_name(T)] the disease [D].") + message_admins("[key_name_admin(usr)] gave [key_name(T)] the disease [D].") /client/proc/make_sound(var/obj/O in view()) // -- TLE set category = "Event" @@ -860,19 +832,6 @@ var/list/admin_verbs_proccall = list ( H.change_appearance(APPEARANCE_ALL, H.loc, check_species_whitelist = 1) feedback_add_details("admin_verb","CMAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/virus_2_creator() - set name = "Virus2 Creator" - set desc = "Allows you to create and spread custom viruses." - set category = "Admin" - - if(!check_rights(R_ADMIN)) - return - - var/datum/nano_module/virus2/virus2 = new() - virus2.ui_interact(usr, state = admin_state) - log_and_message_admins("has opened the virus2 creator.") - feedback_add_details("admin_verb","VS2C") - /client/proc/free_slot() set name = "Free Job Slot" set category = "Admin" diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 6bd40d8029d..f9ce0cd4593 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -8,7 +8,7 @@ icon_state = "paramedic-vest" item_state = "paramedic-vest" allowed = list(/obj/item/stack/medical, /obj/item/weapon/reagent_containers/dropper, /obj/item/weapon/reagent_containers/hypospray, /obj/item/weapon/reagent_containers/syringe, \ - /obj/item/device/healthanalyzer, /obj/item/device/antibody_scanner, /obj/item/device/flashlight, /obj/item/device/radio, /obj/item/weapon/tank/emergency_oxygen,/obj/item/device/rad_laser) + /obj/item/device/healthanalyzer, /obj/item/device/flashlight, /obj/item/device/radio, /obj/item/weapon/tank/emergency_oxygen,/obj/item/device/rad_laser) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 10) species_fit = list("Vox") sprite_sheets = list( @@ -22,7 +22,7 @@ icon_state = "brigphysician-vest" item_state = "brigphysician-vest" allowed = list(/obj/item/stack/medical, /obj/item/weapon/reagent_containers/dropper, /obj/item/weapon/reagent_containers/hypospray, /obj/item/weapon/reagent_containers/syringe, \ - /obj/item/device/healthanalyzer, /obj/item/device/antibody_scanner, /obj/item/device/flashlight, \ + /obj/item/device/healthanalyzer, /obj/item/device/flashlight, \ /obj/item/device/radio, /obj/item/weapon/tank/emergency_oxygen,/obj/item/device/rad_laser) armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) @@ -253,7 +253,7 @@ item_state = "fr_jacket_open" blood_overlay_type = "armor" allowed = list(/obj/item/stack/medical, /obj/item/weapon/reagent_containers/dropper, /obj/item/weapon/reagent_containers/hypospray, /obj/item/weapon/reagent_containers/syringe, \ - /obj/item/device/healthanalyzer, /obj/item/device/antibody_scanner, /obj/item/device/flashlight, /obj/item/device/radio, /obj/item/weapon/tank/emergency_oxygen,/obj/item/device/rad_laser) + /obj/item/device/healthanalyzer, /obj/item/device/flashlight, /obj/item/device/radio, /obj/item/weapon/tank/emergency_oxygen,/obj/item/device/rad_laser) ignore_suitadjust = 0 suit_adjusted = 1 action_button_name = "Button/Unbutton Jacket" diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 9f33b208d63..96065432f3d 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -7,7 +7,7 @@ suit_adjusted = 1 blood_overlay_type = "coat" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS - allowed = list(/obj/item/device/analyzer,/obj/item/device/antibody_scanner,/obj/item/stack/medical,/obj/item/weapon/dnainjector,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/hypospray,/obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/food/pill,/obj/item/weapon/storage/pill_bottle,/obj/item/weapon/paper,/obj/item/device/rad_laser) + allowed = list(/obj/item/device/analyzer,/obj/item/stack/medical,/obj/item/weapon/dnainjector,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/hypospray,/obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/food/pill,/obj/item/weapon/storage/pill_bottle,/obj/item/weapon/paper,/obj/item/device/rad_laser) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0) species_fit = list("Vox") sprite_sheets = list( diff --git a/code/modules/computer3/computers/medical.dm b/code/modules/computer3/computers/medical.dm index a2aba803e5d..b2c92149857 100644 --- a/code/modules/computer3/computers/medical.dm +++ b/code/modules/computer3/computers/medical.dm @@ -116,7 +116,6 @@ dat += text("\nPrint Record
\nBack
", src, src) if(5.0) dat += "
Virus Database
" - /* Advanced diseases is weak! Feeble! Glory to virus2! for(var/Dt in typesof(/datum/disease/)) var/datum/disease/Dis = new Dt(0) if(istype(Dis, /datum/disease/advance)) @@ -124,11 +123,6 @@ if(!Dis.desc) continue dat += "
[Dis.name]" - */ - for (var/ID in virusDB) - var/datum/data/record/v = virusDB[ID] - dat += "
[v.fields["name"]]" - dat += "
Back" if(6.0) dat += "
Medical Robot Monitor
" diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index c29d8add45d..448f8588b8c 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -151,7 +151,6 @@ var/list/event_last_fired = list() //new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 200, list(ASSIGNMENT_ENGINEER = 60)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 250, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_JANITOR = 150)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 0, list(ASSIGNMENT_MEDICAL = 50), 1), - 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, 40, list(ASSIGNMENT_SECURITY = 30), 1), @@ -179,7 +178,6 @@ var/list/event_last_fired = list() new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 1320), new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 3), 1), //new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station, 0, list(ASSIGNMENT_ANY = 5)), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Viral Infection", /datum/event/viral_infection, 0, list(ASSIGNMENT_MEDICAL = 30), 1), new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, 0, list(ASSIGNMENT_ENGINEER = 30), 1), new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 3), 1), new /datum/event_meta/alien(EVENT_LEVEL_MAJOR, "Alien Infestation", /datum/event/alien_infestation, 0, list(ASSIGNMENT_SECURITY = 30), 1), diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index 3bbcc875bb4..0f58955a2bf 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -651,13 +651,6 @@ datum/recipe/microwave/slimesandwich ) result = /obj/item/weapon/reagent_containers/food/snacks/sashimi -// Fuck Science! -/datum/recipe/microwave/ruinedvirusdish - items = list( - /obj/item/weapon/virusdish - ) - result = /obj/item/weapon/ruinedvirusdish - /datum/recipe/microwave/mashedtaters fruit = list("potato" = 1) reagents = list("gravy" = 5) diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 9da63146512..c305f712466 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -20,7 +20,7 @@ var/sheet_per_ore = 1 var/point_upgrade = 1 var/list/ore_values = list(("sand" = 1), ("iron" = 1), ("plasma" = 15), ("silver" = 16), ("gold" = 18), ("uranium" = 30), ("diamond" = 50), ("bananium" = 60), ("tranquillite" = 60)) - var/list/supply_consoles = list("Science", "Robotics", "Research Director's Desk", "Mechanic", "Engineering" = list("metal", "glass", "plasma"), "Chief Engineer's Desk" = list("metal", "glass", "plasma"), "Atmospherics" = list("metal", "glass", "plasma"), "Bar" = list("uranium", "plasma")) + var/list/supply_consoles = list("Science", "Robotics", "Research Director's Desk", "Mechanic", "Engineering" = list("metal", "glass", "plasma"), "Chief Engineer's Desk" = list("metal", "glass", "plasma"), "Atmospherics" = list("metal", "glass", "plasma"), "Bar" = list("uranium", "plasma"), "Virology" = list("uranium", "gold")) /obj/machinery/mineral/ore_redemption/New() ..() diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 100f9fc9d18..677b83fac58 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -92,6 +92,42 @@ #undef STOMACH_ATTACK_DELAY +/mob/living/carbon/proc/vomit(var/lost_nutrition = 10, var/blood = 0, var/stun = 1, var/distance = 0, var/message = 1) + if(src.is_muzzled()) + if(message) + src << "The muzzle prevents you from vomiting!" + return 0 + if(stun) + Stun(4) + if(nutrition < 100 && !blood) + if(message) + visible_message("[src] dry heaves!", \ + "You try to throw up, but there's nothing your stomach!") + if(stun) + Weaken(10) + else + if(message) + visible_message("[src] throws up!", \ + "You throw up!") + playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1) + var/turf/T = get_turf(src) + for(var/i=0 to distance) + if(blood) + if(T) + T.add_blood_floor(src) + if(stun) + adjustBruteLoss(3) + else + if(T) + T.add_vomit_floor(src) + nutrition -= lost_nutrition + if(stun) + adjustToxLoss(-3) + T = get_step(T, dir) + if (is_blocked_turf(T)) + break + return 1 + /mob/living/carbon/gib() for(var/obj/item/organ/internal/I in internal_organs) if(isturf(loc)) @@ -107,19 +143,6 @@ visible_message("[M] bursts out of [src]!") . = ..() - -/mob/living/carbon/attack_hand(mob/M as mob) - if(!istype(M, /mob/living/carbon)) return - if (ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] - if (H.hand) - temp = H.organs_by_name["l_hand"] - if(temp && !temp.is_usable()) - H << "\red You can't use your [temp.name]" - return - return - /mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, override = 0, tesla_shock = 0) if(status_flags & GODMODE) //godmode return 0 @@ -546,12 +569,12 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, /mob/living/carbon/show_inv(mob/user) user.set_machine(src) - + var/dat = {""} - + dat += "
Left Hand:[(l_hand && !(l_hand.flags&ABSTRACT)) ? l_hand : "Empty"]
Right Hand:[(r_hand && !(r_hand.flags&ABSTRACT)) ? r_hand : "Empty"]
 
Back:[(back && !(back.flags&ABSTRACT)) ? back : "Empty"]" if(istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/weapon/tank)) dat += " [internal ? "Disable Internals" : "Set Internals"]" diff --git a/code/modules/mob/living/carbon/carbon_defenses.dm b/code/modules/mob/living/carbon/carbon_defenses.dm index 0f37ff365ba..efebc58ffc1 100644 --- a/code/modules/mob/living/carbon/carbon_defenses.dm +++ b/code/modules/mob/living/carbon/carbon_defenses.dm @@ -23,4 +23,17 @@ for(var/datum/surgery/S in surgeries) if(S.next_step(user, src)) return 1 - ..() \ No newline at end of file + ..() + +/mob/living/carbon/attack_hand(mob/living/carbon/human/user) + if(!iscarbon(user)) + return + + for(var/datum/disease/D in viruses) + if(D.IsSpreadByTouch()) + user.ContractDisease(D) + + for(var/datum/disease/D in user.viruses) + if(D.IsSpreadByTouch()) + ContractDisease(D) + return 0 diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 033e8ddfb1c..07a6a0d28cd 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -4,7 +4,6 @@ var/list/stomach_contents = list() var/list/internal_organs = list() var/brain_op_stage = 0.0 - var/list/datum/disease2/disease/virus2 = list() var/antibodies = 0 var/last_eating = 0 //Not sure what this does... I found it hidden in food.dm diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 1e209c874cd..17d13a01c83 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -789,8 +789,6 @@ for(var/mob/M in range(location,aoe_range)) if (M.internal != null && M.wear_mask && (M.wear_mask.flags & AIRTIGHT)) continue - if(!airborne_can_reach(location,M,aoe_range)) - continue // Now, we don't have this: //new /obj/effects/fart_cloud(T,L) // But: diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index ad27272cd94..dd31d461d07 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -161,9 +161,6 @@ if(ismob(AM)) var/mob/tmob = AM - if(iscarbon(tmob) && prob(10)) - spread_disease_to(tmob, "Contact") - //BubbleWrap - Should stop you pushing a restrained person out of the way //i still don't get it, is this supposed to be 'bubblewrapping' or was it made by a guy named 'BubbleWrap' if(ishuman(tmob)) @@ -1246,44 +1243,6 @@ return 0 return 1 -/mob/living/carbon/human/proc/vomit(hairball=0) - if(stat==DEAD)return - - if(!check_has_mouth()) - return - - if(!lastpuke) - lastpuke = 1 - src << "You feel nauseous..." - spawn(150) //15 seconds until second warning - src << "You feel like you are about to throw up!" - spawn(100) //and you have 10 more for mad dash to the bucket - Stun(5) - - if(hairball) - src.visible_message("[src] hacks up a hairball!","You hack up a hairball!") - else - src.visible_message("[src] throws up!","You throw up!") - playsound(loc, 'sound/effects/splat.ogg', 50, 1) - - var/turf/location = loc - if (istype(location, /turf/simulated)) - location.add_vomit_floor(src, 1) - - var/stomach_len = src.stomach_contents.len - if (stomach_len) - var/content = src.stomach_contents[stomach_len] - if (istype(content, /atom/movable)) - var/atom/movable/AM = content - src.stomach_contents.Remove(AM) - AM.loc = location - - if(!hairball) - nutrition -= 40 - adjustToxLoss(-3) - spawn(350) //wait 35 seconds before next volley - lastpuke = 0 - /mob/living/carbon/human/proc/get_visible_gender() if(wear_suit && wear_suit.flags_inv & HIDEJUMPSUIT && ((head && head.flags_inv & HIDEMASK) || wear_mask)) @@ -1315,12 +1274,6 @@ H.brainmob.mind.transfer_to(src) qdel(H) - - - for (var/ID in virus2) - var/datum/disease2/disease/V = virus2[ID] - V.cure(src) - ..() /mob/living/carbon/human/proc/is_lung_ruptured() diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index fa4e557a200..5fb0e0e85bf 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -48,10 +48,6 @@ apply_effect(4, WEAKEN, armor_block) return - else - if(istype(M,/mob/living/carbon)) -// log_debug("No gloves, [M] is truing to infect [src]") - M.spread_disease_to(src, "Contact") var/datum/martial_art/attacker_style = M.martial_art diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 6fe1cae458d..f463f30b89c 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -64,8 +64,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc update_mutations() check_mutations=0 - handle_virus_updates() - handle_shock() handle_pain() handle_heartbeat() @@ -345,12 +343,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if(breath) loc.assume_air(breath) - //spread virus2 - if(virus2.len > 0) - if(prob(10) && get_infection_chance(src)) - for(var/mob/living/carbon/M in view(1,src)) - src.spread_disease_to(M) - // USED IN DEATHWHISPERS @@ -955,7 +947,23 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc // Puke if toxloss is too high if(!stat) if (getToxLoss() >= 45 && nutrition > 20) - vomit() + lastpuke ++ + if(lastpuke >= 25) // about 25 second delay I guess + Stun(5) + + visible_message("[src] throws up!", \ + "[src] throws up!") + playsound(loc, 'sound/effects/splat.ogg', 50, 1) + + var/turf/location = loc + if (istype(location, /turf/simulated)) + location.add_vomit_floor(src, 1) + + nutrition -= 20 + adjustToxLoss(-3) + + // make it so you can only puke so fast + lastpuke = 0 //0.1% chance of playing a scary sound to someone who's in complete darkness if(isturf(loc) && rand(1,1000) == 1) @@ -964,69 +972,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if(L && L.lum_r + L.lum_g + L.lum_b == 0) playsound_local(src,pick(scarySounds),50, 1, -1) - // Separate proc so we can jump out of it when we've succeeded in spreading disease. -/mob/living/carbon/human/proc/findAirborneVirii() - for(var/obj/effect/decal/cleanable/blood/B in get_turf(src)) - if(B.virus2.len) - for (var/ID in B.virus2) - var/datum/disease2/disease/V = B.virus2[ID] - if (infect_virus2(src,V)) - return 1 - - for(var/obj/effect/decal/cleanable/mucus/M in get_turf(src)) - if(M.virus2.len) - for (var/ID in M.virus2) - var/datum/disease2/disease/V = M.virus2[ID] - if (infect_virus2(src,V)) - return 1 - - for(var/obj/effect/decal/cleanable/poop/P in get_turf(src)) - if(P.virus2.len) - for (var/ID in P.virus2) - var/datum/disease2/disease/V = P.virus2[ID] - if (infect_virus2(src,V)) - return 1 - - - return 0 - -/mob/living/carbon/human/proc/handle_virus_updates() - if(status_flags & GODMODE) return 0 //godmode - if(bodytemperature > 406) - for (var/ID in virus2) - var/datum/disease2/disease/V = virus2[ID] - V.cure(src) - if(mob_master.current_cycle % 3) //don't spam checks over all objects in view every tick. - for(var/obj/effect/decal/cleanable/O in view(1,src)) - if(istype(O,/obj/effect/decal/cleanable/blood)) - var/obj/effect/decal/cleanable/blood/B = O - if(B.virus2.len) - for (var/ID in B.virus2) - var/datum/disease2/disease/V = B.virus2[ID] - infect_virus2(src,V.getcopy()) - - else if(istype(O,/obj/effect/decal/cleanable/mucus)) - var/obj/effect/decal/cleanable/mucus/M = O - if(M.virus2.len) - for (var/ID in M.virus2) - var/datum/disease2/disease/V = M.virus2[ID] - infect_virus2(src,V.getcopy()) - - - for (var/ID in virus2) - var/datum/disease2/disease/V = virus2[ID] - if(isnull(V)) // Trying to figure out a runtime error that keeps repeating - CRASH("virus2 nulled before calling activate()") - else - V.activate(src) - // activate may have deleted the virus - if(!V) continue - - // check if we're immune - if(V.antigen & src.antibodies) - V.dead = 1 - return - /mob/living/carbon/human/handle_changeling() if(mind) if(mind.changeling) @@ -1160,16 +1105,15 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc for(var/mob/living/carbon/human/H in range(decaylevel, src)) if(prob(5)) - if(airborne_can_reach(get_turf(src), get_turf(H))) - if(istype(loc,/obj/item/bodybag)) - return - var/obj/item/clothing/mask/M = H.wear_mask - if(M && (M.flags & MASKCOVERSMOUTH)) - return - if(H.species && H.species.flags & NO_BREATHE) - return //no puking if you can't smell! - H << "You smell something foul..." - H.fakevomit() + if(istype(loc,/obj/item/bodybag)) + return + var/obj/item/clothing/mask/M = H.wear_mask + if(M && (M.flags & MASKCOVERSMOUTH)) + return + if(H.species && H.species.flags & NO_BREATHE) + return //no puking if you can't smell! + H << "You smell something foul..." + H.fakevomit() /mob/living/carbon/human/proc/handle_heartbeat() var/client/C = src.client diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index ed46d5370e5..ef68dd1a97b 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -84,12 +84,7 @@ if(breath) loc.assume_air(breath) - //spread virus2 - if(virus2.len > 0) - if(prob(10) && get_infection_chance(src)) - for(var/mob/living/carbon/M in view(1,src)) - src.spread_disease_to(M) - + air_update_turf() //Third link in a breath chain, calls handle_breath_temperature() /mob/living/carbon/proc/check_breath(datum/gas_mixture/breath) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 569ac341811..df3c85e4feb 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -386,6 +386,9 @@ C.handcuffed = initial(C.handcuffed) C.heart_attack = 0 + for(var/datum/disease/D in C.viruses) + D.cure(0) + // restore all of the human's blood and reset their shock stage if(ishuman(src)) var/mob/living/carbon/human/human_mob = src diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index c124d316eed..f4ca8d58fba 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -6,6 +6,8 @@ hud_used = null if(mind && mind.current == src) spellremove(src) + for(var/infection in viruses) + qdel(infection) ghostize() for(var/mob/dead/observer/M in following_mobs) M.following = null @@ -1387,16 +1389,6 @@ mob/proc/yank_out_object() location.add_vomit_floor(src, 1) playsound(location, 'sound/effects/splat.ogg', 50, 1) -/mob/proc/fakepoop() //for aesthetic craps. Whyyyyy -Fox - if(stat==DEAD) - return - var/turf/location = loc - if (istype(location, /turf/simulated)) - src.visible_message("[src] has explosive diarrhea all over the floor!","You have explosive diarrhea all over the floor!") - location.add_poop_floor() - playsound(location, 'sound/effects/splat.ogg', 50, 1) - - /mob/proc/adjustEarDamage() return diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index a4142b41d49..88b48eb19f5 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -194,8 +194,8 @@ //List of active diseases - var/viruses = list() // replaces var/datum/disease/virus - + var/list/viruses = list() // replaces var/datum/disease/virus + var/list/resistances = list() mouse_drag_pointer = MOUSE_ACTIVE_POINTER diff --git a/code/modules/nano/modules/virus2_creator.dm b/code/modules/nano/modules/virus2_creator.dm deleted file mode 100644 index 40bf1480914..00000000000 --- a/code/modules/nano/modules/virus2_creator.dm +++ /dev/null @@ -1,142 +0,0 @@ -/datum/nano_module/virus2 - name = "Virus Creator" - - var/mob/virus_target = null - var/datum/disease2/disease/curr_virus = null - -/datum/nano_module/virus2/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = admin_state) - var/data[0] - - data["virus_target"] = virus_target - data["curr_virus"] = curr_virus ? curr_virus.uniqueID : null - if(curr_virus) - var/effects[0] - for(var/datum/disease2/effectholder/E in curr_virus.effects) - var/subeffect[0] - subeffect["name"] = E.effect.name - subeffect["stage"] = E.stage - subeffect["chance"] = E.chance - subeffect["multiplier"] = E.multiplier - subeffect["badness"] = E.effect.badness - - effects.Add(list(subeffect)) - data["virus_effects"] = effects - - var/virusstats[0] - virusstats["antigen"] = antigens2string(curr_virus.antigen) - virusstats["spreadType"] = curr_virus.spreadtype - virusstats["affectedSpecies"] = list2text(curr_virus.affected_species, ", ") - virusstats["speed"] = curr_virus.speed - data["virusStats"] = virusstats - - - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "virus2_creator.tmpl", "[src]", 800, 450, state = state) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) - -/datum/nano_module/virus2/Topic(href, href_list) - if(..()) - return 1 - - if(href_list["setTarget"]) - var/list/mob_list_l = list() - for(var/mob/living/carbon/human/H in mob_list) - mob_list_l += H - mob_list_l = sortList(mob_list_l) - mob_list_l += "Random" - - var/newTarget = input(usr, "Who do you want to infect?", "Infection", "Random") as null|anything in mob_list_l - if(newTarget) - if(newTarget == "Random") - virus_target = null - else - if(ismob(newTarget)) - virus_target = newTarget - return 1 - - if(href_list["createVirus"]) - if(curr_virus) - if(alert(usr, "Would you like to delete the current virus and generate a new one?", "Regenerate Virus", "Yes", "No") == "Yes") - qdel(curr_virus) - curr_virus = null - else - return 0 - - var/datum/disease2/disease/new_virus = new() - new_virus.makerandom() - curr_virus = new_virus - new_virus.affected_species = list("Human","Unathi","Skrell","Tajaran","Vox","Kidan","Slime People","Grey","Diona", "Vulpkanin") //restore to default - usr << "New virus generated: [new_virus.uniqueID]." - return 1 - - if(href_list["deleteCurrVirus"]) - if(curr_virus) - qdel(curr_virus) - curr_virus = null - return 1 - - if(href_list["changeEffect"]) - if(curr_virus) - var/stage = text2num(href_list["changeEffect"]) - if(stage) - var/list/L = list() - - for(var/effect in (subtypesof(/datum/disease2/effect))) - var/datum/disease2/effect/E = new effect - if(initial(E.stage) == stage) - L[initial(E.name)] = E - - var/datum/disease2/effectholder/holder = curr_virus.effects[stage] - if(holder) - var/datum/disease2/effect/current_effect = holder.effect - - var/C = input("Select effect for stage [stage]:", "Stage [stage]", current_effect.name) as null|anything in L - if(!C) - return 0 - - var/datum/disease2/effect/applied_effect = L[C] - if(istype(applied_effect)) - holder.effect = applied_effect - qdel(current_effect) - else - - return 1 - - if(href_list["changeStat"]) - if(curr_virus) - var/stat = href_list["changeStat"] - var/stage = text2num(href_list["cSEffect"]) - if(stat && stage) - switch(stat) - if("C") - var/C = input(usr, "What would you like to change the chance to? ", "Edit Chance", null) as null|num - if(C) - var/datum/disease2/effectholder/holder = curr_virus.effects[stage] - if(holder) - holder.chance = Clamp(C, 0, holder.effect.chance_maxm) - - if("M") - var/C = input(usr, "What would you like to change the multiplier to?", "Edit Multiplier", null) as null|num - if(C) - var/datum/disease2/effectholder/holder = curr_virus.effects[stage] - if(holder) - holder.multiplier = Clamp(C, 1, holder.effect.maxm) - return 1 - - if(href_list["spreadToTarget"]) - if(curr_virus) - if(virus_target) - infect_virus2(virus_target, curr_virus, 1) //no protection from gods - else //random - var/list/mob_list_l = list() - for(var/mob/living/carbon/human/H in mob_list) - if(H.client) - mob_list_l += H - - var/mob/living/carbon/human/H = pick(mob_list_l) - if(H && H.client) - infect_virus2(H, curr_virus, 1) //no protection from gods \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Colours.dm b/code/modules/reagents/Chemistry-Colours.dm index 0fcc50b6f4d..176ec99c4d4 100644 --- a/code/modules/reagents/Chemistry-Colours.dm +++ b/code/modules/reagents/Chemistry-Colours.dm @@ -12,7 +12,7 @@ var/vol_temp // see libs/IconProcs/IconProcs.dm for(var/datum/reagent/reagent in reagent_list) - if(reagent.id == "blood" && reagent.data["blood_colour"]) + if(reagent.id == "blood" && reagent.data && reagent.data["blood_colour"]) reagent_color = reagent.data["blood_colour"] else reagent_color = reagent.color diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index dada24d2bcc..b1fb226a209 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -304,13 +304,6 @@ var/const/INGEST = 2 if(!C.no_message) M << "\blue \icon[my_atom] [C.mix_message]" - /* if(istype(my_atom, /obj/item/slime_core)) - var/obj/item/slime_core/ME = my_atom - ME.Uses-- - if(ME.Uses <= 0) // give the notification that the slime core is dead - for(var/mob/M in viewers(4, get_turf(my_atom)) ) - M << "\blue \icon[my_atom] The innards begin to boil!" - */ if(istype(my_atom, /obj/item/slime_extract)) var/obj/item/slime_extract/ME2 = my_atom ME2.Uses-- @@ -435,6 +428,11 @@ var/const/INGEST = 2 else R.reaction_obj(A, R.volume+volume_modifier) return +/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15) + for(var/r_id in list_reagents) + var/amt = list_reagents[r_id] + add_reagent(r_id, amt, data) + /datum/reagents/proc/add_reagent(var/reagent, var/amount, var/list/data=null, var/reagtemp = 300) if(!isnum(amount)) return 1 update_total() @@ -449,33 +447,7 @@ var/const/INGEST = 2 R.volume += amount update_total() my_atom.on_reagent_change() -/* - // mix dem viruses - if(R.id == "blood" && reagent == "blood") - if(R.data && data) - - if(R.data["viruses"] || data["viruses"]) - - var/list/mix1 = R.data["viruses"] - var/list/mix2 = data["viruses"] - - // Stop issues with the list changing during mixing. - var/list/to_mix = list() - - for(var/datum/disease/advance/AD in mix1) - to_mix += AD - for(var/datum/disease/advance/AD in mix2) - to_mix += AD - - var/datum/disease/advance/AD = Advance_Mix(to_mix) - if(AD) - var/list/preserve = list(AD) - for(var/D in R.data["viruses"]) - if(!istype(D, /datum/disease/advance)) - preserve += D - R.data["viruses"] = preserve -*/ - + R.on_merge(data) handle_reactions() return 0 @@ -486,13 +458,10 @@ var/const/INGEST = 2 reagent_list += R R.holder = src R.volume = amount -// SetViruses(R, data) // Includes setting data - if(data) R.data = data - //debug - //world << "Adding data" - //for(var/D in R.data) - // world << "Container data: [D] = [R.data[D]]" - //debug + if(data) + R.data = data + R.on_new(data) + update_total() my_atom.on_reagent_change() handle_reactions() @@ -605,9 +574,9 @@ var/const/INGEST = 2 // Technically we should probably copy all data lists, but // that could possibly eat up a lot of memory needlessly // if most data lists are read-only. - if (trans_data["virus2"]) - var/list/v = trans_data["virus2"] - trans_data["virus2"] = v.Copy() + if(trans_data["viruses"]) + var/list/v = trans_data["viruses"] + trans_data["viruses"] = v.Copy() return trans_data diff --git a/code/modules/reagents/newchem/disease.dm b/code/modules/reagents/newchem/disease.dm index d89d61e3454..7039e7cb6ef 100644 --- a/code/modules/reagents/newchem/disease.dm +++ b/code/modules/reagents/newchem/disease.dm @@ -5,10 +5,188 @@ reagent_state = SOLID color = "#FFFFFF" -/datum/reagent/spider_eggs/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom +/datum/reagent/spider_eggs/on_mob_life(mob/living/M) if(volume > 2.5) if(iscarbon(M)) if(!M.get_int_organ(/obj/item/organ/internal/body_egg)) new/obj/item/organ/internal/body_egg/spider_eggs(M) //Yes, even Xenos can fall victim to the plague that is spider infestation. - ..() \ No newline at end of file + ..() + + +//virus food +/datum/reagent/virus_food + name = "Virus Food" + id = "virusfood" + description = "A mixture of water, milk, and oxygen. Virus cells can use this mixture to reproduce." + reagent_state = LIQUID + nutriment_factor = 2 * REAGENTS_METABOLISM + color = "#899613" // rgb: 137, 150, 19 + +/datum/reagent/virus_food/on_mob_life(mob/living/M) + M.nutrition += nutriment_factor * REAGENTS_EFFECT_MULTIPLIER + ..() + +/datum/reagent/mutagen/mutagenvirusfood + name = "mutagenic agar" + id = "mutagenvirusfood" + description = "mutates blood" + color = "#A3C00F" // rgb: 163,192,15 + +/datum/reagent/mutagen/mutagenvirusfood/sugar + name = "sucrose agar" + id = "sugarvirusfood" + color = "#41B0C0" // rgb: 65,176,192 + +/datum/reagent/diphenhydramine/diphenhydraminevirusfood + name = "virus rations" + id = "diphenhydraminevirusfood" + description = "mutates blood" + color = "#D18AA5" // rgb: 209,138,165 + +/datum/reagent/plasma/plasmavirusfood + name = "virus plasma" + id = "plasmavirusfood" + description = "mutates blood" + color = "#A69DA9" // rgb: 166,157,169 + +/datum/reagent/plasma/plasmavirusfood/weak + name = "weakened virus plasma" + id = "weakplasmavirusfood" + color = "#CEC3C6" // rgb: 206,195,198 + +//reactions +/datum/chemical_reaction/virus_food + name = "Virus Food" + id = "virusfood" + result = "virusfood" + required_reagents = list("water" = 1, "milk" = 1, "oxygen" = 1) + result_amount = 3 + +/datum/chemical_reaction/virus_food_mutagen + name = "mutagenic agar" + id = "mutagenvirusfood" + result = "mutagenvirusfood" + required_reagents = list("mutagen" = 1, "virusfood" = 1) + result_amount = 1 + +/datum/chemical_reaction/virus_food_diphenhydramine + name = "virus rations" + id = "diphenhydraminevirusfood" + result = "diphenhydraminevirusfood" + required_reagents = list("diphenhydramine" = 1, "virusfood" = 1) + result_amount = 1 + +/datum/chemical_reaction/virus_food_plasma + name = "virus plasma" + id = "plasmavirusfood" + result = "plasmavirusfood" + required_reagents = list("plasma" = 1, "virusfood" = 1) + result_amount = 1 + +/datum/chemical_reaction/virus_food_plasma_diphenhydramine + name = "weakened virus plasma" + id = "weakplasmavirusfood" + result = "weakplasmavirusfood" + required_reagents = list("diphenhydramine" = 1, "plasmavirusfood" = 1) + result_amount = 2 + +/datum/chemical_reaction/virus_food_mutagen_sugar + name = "sucrose agar" + id = "sugarvirusfood" + result = "sugarvirusfood" + required_reagents = list("sugar" = 1, "mutagenvirusfood" = 1) + result_amount = 2 + +/datum/chemical_reaction/virus_food_mutagen_salineglucose + name = "sucrose agar" + id = "salineglucosevirusfood" + result = "sugarvirusfood" + required_reagents = list("salglu_solution" = 1, "mutagenvirusfood" = 1) + result_amount = 2 + + +//mix virus +/datum/chemical_reaction/mix_virus + name = "Mix Virus" + id = "mixvirus" + required_reagents = list("virusfood" = 1) + required_catalysts = list("blood" = 1) + var/level_min = 0 + var/level_max = 2 + +/datum/chemical_reaction/mix_virus/on_reaction(datum/reagents/holder, created_volume) + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + if(B && B.data) + var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] + if(D) + D.Evolve(level_min, level_max) + + +/datum/chemical_reaction/mix_virus/mix_virus_2 + name = "Mix Virus 2" + id = "mixvirus2" + required_reagents = list("mutagen" = 1) + level_min = 2 + level_max = 4 + +/datum/chemical_reaction/mix_virus/mix_virus_3 + name = "Mix Virus 3" + id = "mixvirus3" + required_reagents = list("plasma" = 1) + level_min = 4 + level_max = 6 + +/datum/chemical_reaction/mix_virus/mix_virus_4 + name = "Mix Virus 4" + id = "mixvirus4" + required_reagents = list("uranium" = 1) + level_min = 5 + level_max = 6 + +/datum/chemical_reaction/mix_virus/mix_virus_5 + name = "Mix Virus 5" + id = "mixvirus5" + required_reagents = list("mutagenvirusfood" = 1) + level_min = 3 + level_max = 3 + +/datum/chemical_reaction/mix_virus/mix_virus_6 + name = "Mix Virus 6" + id = "mixvirus6" + required_reagents = list("sugarvirusfood" = 1) + level_min = 4 + level_max = 4 + +/datum/chemical_reaction/mix_virus/mix_virus_7 + name = "Mix Virus 7" + id = "mixvirus7" + required_reagents = list("weakplasmavirusfood" = 1) + level_min = 5 + level_max = 5 + +/datum/chemical_reaction/mix_virus/mix_virus_8 + name = "Mix Virus 8" + id = "mixvirus8" + required_reagents = list("plasmavirusfood" = 1) + level_min = 6 + level_max = 6 + +/datum/chemical_reaction/mix_virus/mix_virus_9 + name = "Mix Virus 9" + id = "mixvirus9" + required_reagents = list("diphenhydraminevirusfood" = 1) + level_min = 1 + level_max = 1 + +/datum/chemical_reaction/mix_virus/rem_virus + name = "Devolve Virus" + id = "remvirus" + required_reagents = list("diphenhydramine" = 1) + required_catalysts = list("blood" = 1) + +/datum/chemical_reaction/mix_virus/rem_virus/on_reaction(datum/reagents/holder, created_volume) + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + if(B && B.data) + var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] + if(D) + D.Devolve() \ No newline at end of file diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm index 468316eab15..0550813849c 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm @@ -1,20 +1,18 @@ -/datum/chemical_reaction/ - - hydrocodone +/datum/chemical_reaction/hydrocodone name = "Hydrocodone" id = "hydrocodone" result = "hydrocodone" required_reagents = list("morphine" = 1, "sacid" = 1, "water" = 1, "oil" = 1) result_amount = 2 - mitocholide +/datum/chemical_reaction/mitocholide name = "mitocholide" id = "mitocholide" result = "mitocholide" required_reagents = list("synthflesh" = 1, "cryoxadone" = 1, "plasma" = 1) result_amount = 3 - cryoxadone +/datum/chemical_reaction/cryoxadone name = "Cryoxadone" id = "cryoxadone" result = "cryoxadone" @@ -23,7 +21,7 @@ mix_message = "The solution bubbles softly." mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' - spaceacillin +/datum/chemical_reaction/spaceacillin name = "Spaceacillin" id = "spaceacillin" result = "spaceacillin" @@ -31,62 +29,16 @@ result_amount = 2 mix_message = "The solvent extracts an antibiotic compound from the fungus." - rezadone +/datum/chemical_reaction/rezadone name = "Rezadone" id = "rezadone" result = "rezadone" required_reagents = list("carpotoxin" = 1, "spaceacillin" = 1, "copper" = 1) result_amount = 3 - virus_food - name = "Virus Food" - id = "virusfood" - result = "virusfood" - required_reagents = list("water" = 1, "milk" = 1, "oxygen" = 1) - result_amount = 3 -/* - mix_virus - name = "Mix Virus" - id = "mixvirus" - result = "blood" - required_reagents = list("virusfood" = 5) - required_catalysts = list("blood") - var/level = 2 - - on_reaction(var/datum/reagents/holder, var/created_volume) - - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - if(B && B.data) - var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] - if(D) - D.Evolve(level - rand(0, 1)) - - - mix_virus_2 - - name = "Mix Virus 2" - id = "mixvirus2" - required_reagents = list("mutagen" = 5) - level = 4 - - rem_virus - - name = "Devolve Virus" - id = "remvirus" - required_reagents = list("synaptizine" = 5) - - on_reaction(var/datum/reagents/holder, var/created_volume) - - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - if(B && B.data) - var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] - if(D) - D.Devolve() -*/ - - sterilizine +/datum/chemical_reaction/sterilizine name = "Sterilizine" id = "sterilizine" result = "sterilizine" required_reagents = list("antihol" = 2, "chlorine" = 1) - result_amount = 3 \ No newline at end of file + result_amount = 3 diff --git a/code/modules/reagents/oldchem/reagents/_reagent_base.dm b/code/modules/reagents/oldchem/reagents/_reagent_base.dm index a4ce0bcb429..b134f974547 100644 --- a/code/modules/reagents/oldchem/reagents/_reagent_base.dm +++ b/code/modules/reagents/oldchem/reagents/_reagent_base.dm @@ -81,6 +81,10 @@ /datum/reagent/proc/on_update(var/atom/A) return +// Called after add_reagents creates a new reagent. +/datum/reagent/proc/on_new(data) + return + /datum/reagent/Destroy() . = ..() holder = null \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/reagents_admin.dm b/code/modules/reagents/oldchem/reagents/reagents_admin.dm index 187ffb2a27c..92cfbfd4c36 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_admin.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_admin.dm @@ -42,13 +42,9 @@ M.jitteriness = 0 if(istype(M,/mob/living/carbon)) // make sure to only use it on carbon mobs var/mob/living/carbon/C = M - if(C.virus2.len) - for (var/ID in C.virus2) - var/datum/disease2/disease/V = C.virus2[ID] - C.antibodies |= V.antigen + for(var/datum/disease/D in C.viruses) + D.cure(0) ..() - return - /datum/reagent/adminordrazine/nanites name = "Nanites" diff --git a/code/modules/reagents/oldchem/reagents/reagents_med.dm b/code/modules/reagents/oldchem/reagents/reagents_med.dm index bd86a3da18a..64e3b00936d 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_med.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_med.dm @@ -16,20 +16,6 @@ ..() return -/datum/reagent/virus_food - name = "Virus Food" - id = "virusfood" - description = "A mixture of water, milk, and oxygen. Virus cells can use this mixture to reproduce." - reagent_state = LIQUID - nutriment_factor = 2 * REAGENTS_METABOLISM - color = "#899613" // rgb: 137, 150, 19 - -/datum/reagent/virus_food/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.nutrition += nutriment_factor*REM - ..() - return - /datum/reagent/sterilizine name = "Sterilizine" id = "sterilizine" diff --git a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm index 69eb9780a32..6c3b4fa5002 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm @@ -98,33 +98,9 @@ reagent_state = LIQUID color = "#13BC5E" // rgb: 19, 188, 94 -/datum/reagent/aslimetoxin/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(istype(M, /mob/living/carbon) && M.stat != DEAD) - M << "\red Your flesh rapidly mutates!" - if(M.notransform) return - M.notransform = 1 - M.canmove = 0 - M.icon = null - M.overlays.Cut() - M.invisibility = 101 - for(var/obj/item/W in M) - if(istype(W, /obj/item/weapon/implant)) //TODO: Carn. give implants a dropped() or something - qdel(W) - continue - W.layer = initial(W.layer) - W.loc = M.loc - W.dropped(M) - var/mob/living/carbon/slime/new_mob = new /mob/living/carbon/slime(M.loc) - new_mob.a_intent = I_HARM - new_mob.universal_speak = 1 - if(M.mind) - M.mind.transfer_to(new_mob) - else - new_mob.key = M.key - qdel(M) - ..() - return +/datum/reagent/aslimetoxin/reaction_mob(mob/M, method=TOUCH, reac_volume) + if(method != TOUCH) + M.ForceContractDisease(new /datum/disease/transformation/slime(0)) /datum/reagent/mercury @@ -189,19 +165,7 @@ if(!M) M = holder.my_atom if(M.radiation < 80) M.apply_effect(4, IRRADIATE, negate_armor = 1) - // radium may increase your chances to cure a disease - if(istype(M,/mob/living/carbon)) // make sure to only use it on carbon mobs - var/mob/living/carbon/C = M - if(C.virus2.len) - for (var/ID in C.virus2) - var/datum/disease2/disease/V = C.virus2[ID] - if(prob(5)) - if(prob(50)) - M.apply_effect(50, IRRADIATE, negate_armor = 1) // curing it that way may kill you instead - M.adjustToxLoss(100) - C.antibodies |= V.antigen ..() - return /datum/reagent/radium/reaction_turf(var/turf/T, var/volume) src = null diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm index 3847a97d3bb..df9cdd6ade6 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_water.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm @@ -145,65 +145,103 @@ /datum/reagent/blood - data = new/list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"blood_colour"= "#A10808","resistances"=null,"trace_chem"=null, "antibodies" = null) + data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"blood_colour"="#A10808","resistances"=null,"trace_chem"=null, "antibodies" = null) name = "Blood" id = "blood" reagent_state = LIQUID color = "#C80000" // rgb: 200, 0, 0 -/datum/reagent/blood/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - var/datum/reagent/blood/self = src - src = null - if(self.data && self.data["virus2"] && istype(M, /mob/living/carbon))//infecting... - var/list/vlist = self.data["virus2"] - if (vlist.len) - for (var/ID in vlist) - var/datum/disease2/disease/V = vlist[ID] +/datum/reagent/blood/reaction_mob(mob/M, method=TOUCH, reac_volume) + if(data && data["viruses"]) + for(var/datum/disease/D in data["viruses"]) - if(method == TOUCH) - infect_virus2(M,V.getcopy()) - else - infect_virus2(M,V.getcopy(),1) //injected, force infection! - if(self.data && self.data["antibodies"] && istype(M, /mob/living/carbon))//... and curing - var/mob/living/carbon/C = M - C.antibodies |= self.data["antibodies"] + if(D.spread_flags & SPECIAL || D.spread_flags & NON_CONTAGIOUS) + continue -/datum/reagent/blood/on_merge(var/data) - if(data["blood_colour"]) - color = data["blood_colour"] - return ..() + if(method == TOUCH) + M.ContractDisease(D) + else //ingest, patch or inject + M.ForceContractDisease(D) + +/datum/reagent/blood/on_new(list/data) + if(istype(data)) + SetViruses(src, data) + +/datum/reagent/blood/on_merge(list/mix_data) + if(data && mix_data) + if(data["viruses"] || mix_data["viruses"]) + + var/list/mix1 = data["viruses"] + var/list/mix2 = mix_data["viruses"] + + // Stop issues with the list changing during mixing. + var/list/to_mix = list() + + for(var/datum/disease/advance/AD in mix1) + to_mix += AD + for(var/datum/disease/advance/AD in mix2) + to_mix += AD + + var/datum/disease/advance/AD = Advance_Mix(to_mix) + if(AD) + var/list/preserve = list(AD) + for(var/D in data["viruses"]) + if(!istype(D, /datum/disease/advance)) + preserve += D + data["viruses"] = preserve + + if(mix_data["blood_colour"]) + color = mix_data["blood_colour"] + return 1 /datum/reagent/blood/on_update(var/atom/A) if(data["blood_colour"]) color = data["blood_colour"] return ..() - - -/datum/reagent/blood/reaction_turf(var/turf/simulated/T, var/volume)//splash the blood all over the place - if(!istype(T)) return - var/datum/reagent/blood/self = src - src = null - var/big_splash = 1 - if(volume < 3) - big_splash = 0 - //var/datum/disease/D = self.data["virus"] - if(!self.data["donor"] || istype(self.data["donor"], /mob/living/carbon/human)) - blood_splatter(T, src, big_splash) +/datum/reagent/blood/reaction_turf(turf/simulated/T, reac_volume)//splash the blood all over the place + if(!istype(T)) + return + if(reac_volume < 3) + return + if(!data["donor"] || istype(data["donor"], /mob/living/carbon/human)) var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T //find some blood here + if(!blood_prop) //first blood! + blood_prop = new(T) + blood_prop.blood_DNA[data["blood_DNA"]] = data["blood_type"] - if(blood_prop) - blood_prop.blood_DNA[self.data["blood_DNA"]] = self.data["blood_type"] - if(self.data["virus2"]) - blood_prop.virus2 = virus_copylist(self.data["virus2"]) + for(var/datum/disease/D in data["viruses"]) + var/datum/disease/newVirus = D.Copy(1) + blood_prop.viruses += newVirus + newVirus.holder = blood_prop - else if(istype(self.data["donor"], /mob/living/carbon/alien)) + else if(istype(data["donor"], /mob/living/carbon/alien)) var/obj/effect/decal/cleanable/blood/xeno/blood_prop = locate() in T if(!blood_prop) blood_prop = new(T) blood_prop.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*" - return + for(var/datum/disease/D in data["viruses"]) + var/datum/disease/newVirus = D.Copy(1) + blood_prop.viruses += newVirus + newVirus.holder = blood_prop + +/datum/reagent/vaccine + //data must contain virus type + name = "Vaccine" + id = "vaccine" + color = "#C81040" // rgb: 200, 16, 64 + +/datum/reagent/vaccine/reaction_mob(mob/M, method=TOUCH, reac_volume) + if(islist(data) && (method == INGEST)) + for(var/datum/disease/D in M.viruses) + if(D.GetDiseaseID() in data) + D.cure() + M.resistances |= data + +/datum/reagent/vaccine/on_merge(list/data) + if(istype(data)) + src.data |= data.Copy() /datum/reagent/fishwater name = "Fish Water" @@ -350,28 +388,3 @@ var/t_loc = get_turf(O) qdel(O) new /obj/item/clothing/shoes/galoshes/dry(t_loc) - -/* -/datum/reagent/vaccine - //data must contain virus type - name = "Vaccine" - id = "vaccine" - reagent_state = LIQUID - color = "#C81040" // rgb: 200, 16, 64 - -/datum/reagent/vaccine/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - var/datum/reagent/vaccine/self = src - src = null - if(self.data&&method == INGEST) - for(var/datum/disease/D in M.viruses) - if(istype(D, /datum/disease/advance)) - var/datum/disease/advance/A = D - if(A.GetDiseaseID() == self.data) - D.cure() - else - if(D.type == self.data) - D.cure() - - M.resistances += self.data - return -*/ \ No newline at end of file diff --git a/code/modules/reagents/pandemic.dm b/code/modules/reagents/pandemic.dm new file mode 100644 index 00000000000..4ae8809b8f5 --- /dev/null +++ b/code/modules/reagents/pandemic.dm @@ -0,0 +1,295 @@ +/obj/machinery/computer/pandemic + name = "PanD.E.M.I.C 2200" + desc = "Used to work with viruses." + density = 1 + anchored = 1 + icon = 'icons/obj/chemical.dmi' + icon_state = "mixer0" + circuit = /obj/item/weapon/circuitboard/pandemic + use_power = 1 + idle_power_usage = 20 + var/temp_html = "" + var/wait = null + var/obj/item/weapon/reagent_containers/beaker = null + +/obj/machinery/computer/pandemic/New() + ..() + update_icon() + +/obj/machinery/computer/pandemic/set_broken() + icon_state = (beaker ? "mixer1_b" : "mixer0_b") + overlays.Cut() + stat |= BROKEN + +/obj/machinery/computer/pandemic/proc/GetVirusByIndex(index) + if(beaker && beaker.reagents) + if(beaker.reagents.reagent_list.len) + var/datum/reagent/blood/BL = locate() in beaker.reagents.reagent_list + if(BL) + if(BL.data && BL.data["viruses"]) + var/list/viruses = BL.data["viruses"] + return viruses[index] + return null + +/obj/machinery/computer/pandemic/proc/GetResistancesByIndex(index) + if(beaker && beaker.reagents) + if(beaker.reagents.reagent_list.len) + var/datum/reagent/blood/BL = locate() in beaker.reagents.reagent_list + if(BL) + if(BL.data && BL.data["resistances"]) + var/list/resistances = BL.data["resistances"] + return resistances[index] + return null + +/obj/machinery/computer/pandemic/proc/GetVirusTypeByIndex(index) + var/datum/disease/D = GetVirusByIndex(index) + if(D) + return D.GetDiseaseID() + return null + +/obj/machinery/computer/pandemic/proc/replicator_cooldown(waittime) + wait = 1 + update_icon() + spawn(waittime) + src.wait = null + update_icon() + playsound(src.loc, 'sound/machines/ping.ogg', 30, 1) + +/obj/machinery/computer/pandemic/update_icon() + if(stat & BROKEN) + icon_state = (beaker ? "mixer1_b" : "mixer0_b") + return + + icon_state = "mixer[(beaker)?"1":"0"][(powered()) ? "" : "_nopower"]" + + if(wait) + overlays.Cut() + else + overlays += "waitlight" + +/obj/machinery/computer/pandemic/Topic(href, href_list) + if(..()) + return + + usr.set_machine(src) + if(!beaker) return + + if (href_list["create_vaccine"]) + if(!src.wait) + var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc) + if(B) + B.pixel_x = rand(-3, 3) + B.pixel_y = rand(-3, 3) + var/path = GetResistancesByIndex(text2num(href_list["create_vaccine"])) + var/vaccine_type = path + var/vaccine_name = "Unknown" + + if(!ispath(vaccine_type)) + if(archive_diseases[path]) + var/datum/disease/D = archive_diseases[path] + if(D) + vaccine_name = D.name + vaccine_type = path + else if(vaccine_type) + var/datum/disease/D = new vaccine_type(0, null) + if(D) + vaccine_name = D.name + + if(vaccine_type) + + B.name = "[vaccine_name] vaccine bottle" + B.reagents.add_reagent("vaccine", 15, list(vaccine_type)) + replicator_cooldown(200) + else + src.temp_html = "The replicator is not ready yet." + src.updateUsrDialog() + return + else if (href_list["create_virus_culture"]) + if(!wait) + var/type = GetVirusTypeByIndex(text2num(href_list["create_virus_culture"]))//the path is received as string - converting + var/datum/disease/D = null + if(!ispath(type)) + D = GetVirusByIndex(text2num(href_list["create_virus_culture"])) + var/datum/disease/advance/A = archive_diseases[D.GetDiseaseID()] + if(A) + D = new A.type(0, A) + else if(type) + if(type in diseases) // Make sure this is a disease + D = new type(0, null) + if(!D) + return + var/name = stripped_input(usr,"Name:","Name the culture",D.name,MAX_NAME_LEN) + if(name == null || wait) + return + var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc) + B.icon_state = "bottle3" + B.pixel_x = rand(-3, 3) + B.pixel_y = rand(-3, 3) + replicator_cooldown(50) + var/list/data = list("viruses"=list(D)) + B.name = "[name] culture bottle" + B.desc = "A small bottle. Contains [D.agent] culture in synthblood medium." + B.reagents.add_reagent("blood",20,data) + src.updateUsrDialog() + else + src.temp_html = "The replicator is not ready yet." + src.updateUsrDialog() + return + else if (href_list["empty_beaker"]) + beaker.reagents.clear_reagents() + src.updateUsrDialog() + return + else if (href_list["eject"]) + beaker:loc = src.loc + beaker = null + icon_state = "mixer0" + src.updateUsrDialog() + return + else if(href_list["clear"]) + src.temp_html = "" + src.updateUsrDialog() + return + else if(href_list["name_disease"]) + var/new_name = stripped_input(usr, "Name the Disease", "New Name", "", MAX_NAME_LEN) + if(!new_name) + return + if(..()) + return + var/id = GetVirusTypeByIndex(text2num(href_list["name_disease"])) + if(archive_diseases[id]) + var/datum/disease/advance/A = archive_diseases[id] + A.AssignName(new_name) + for(var/datum/disease/advance/AD in disease_master.processing) + AD.Refresh() + src.updateUsrDialog() + + + else + usr << browse(null, "window=pandemic") + src.updateUsrDialog() + return + + src.add_fingerprint(usr) + return + +/obj/machinery/computer/pandemic/attack_hand(mob/user) + if(..()) + return + user.set_machine(src) + var/dat = "" + if(src.temp_html) + dat = "[src.temp_html]

Main Menu" + else if(!beaker) + dat += "Please insert beaker.
" + dat += "Close" + else + var/datum/reagents/R = beaker.reagents + var/datum/reagent/blood/Blood = null + for(var/datum/reagent/blood/B in R.reagent_list) + if(B) + Blood = B + break + if(!R.total_volume||!R.reagent_list.len) + dat += "The beaker is empty
" + else if(!Blood) + dat += "No blood sample found in beaker." + else if(!Blood.data) + dat += "No blood data found in beaker." + else + dat += "

Blood sample data:

" + dat += "Blood DNA: [(Blood.data["blood_DNA"]||"none")]
" + dat += "Blood Type: [(Blood.data["blood_type"]||"none")]
" + + + if(Blood.data["viruses"]) + var/list/vir = Blood.data["viruses"] + if(vir.len) + var/i = 0 + for(var/datum/disease/D in Blood.data["viruses"]) + i++ + if(!(D.visibility_flags & HIDDEN_PANDEMIC)) + + if(istype(D, /datum/disease/advance)) + + var/datum/disease/advance/A = D + D = archive_diseases[A.GetDiseaseID()] + if(D && D.name == "Unknown") + dat += "Name Disease
" + + if(!D) + CRASH("We weren't able to get the advance disease from the archive.") + + dat += "Disease Agent: [D?"[D.agent] - Create virus culture bottle":"none"]
" + dat += "Common name: [(D.name||"none")]
" + dat += "Description: [(D.desc||"none")]
" + dat += "Spread: [(D.spread_text||"none")]
" + dat += "Possible cure: [(D.cure_text||"none")]

" + + if(istype(D, /datum/disease/advance)) + var/datum/disease/advance/A = D + dat += "Symptoms: " + var/english_symptoms = list() + for(var/datum/symptom/S in A.symptoms) + english_symptoms += S.name + dat += english_list(english_symptoms) + + else + dat += "No detectable virus in the sample." + else + dat += "No detectable virus in the sample." + + dat += "
Contains antibodies to: " + if(Blood.data["resistances"]) + var/list/res = Blood.data["resistances"] + if(res.len) + dat += "
    " + var/i = 0 + for(var/type in Blood.data["resistances"]) + i++ + var/disease_name = "Unknown" + + if(!ispath(type)) + var/datum/disease/advance/A = archive_diseases[type] + if(A) + disease_name = A.name + else + var/datum/disease/D = new type(0, null) + disease_name = D.name + + dat += "
  • [disease_name] - Create vaccine bottle
  • " + dat += "

" + else + dat += "nothing
" + else + dat += "nothing
" + dat += "
Eject beaker[((R.total_volume&&R.reagent_list.len) ? "-- Empty beaker":"")]
" + dat += "Close" + + user << browse("[src.name]
[dat]", "window=pandemic;size=575x400") + onclose(user, "pandemic") + return + + +/obj/machinery/computer/pandemic/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/reagent_containers) && (I.flags & OPENCONTAINER)) + if(stat & (NOPOWER|BROKEN)) return + if(beaker) + user << "A beaker is already loaded into the machine!" + return + if(!user.drop_item()) + return + + beaker = I + beaker.loc = src + user << "You add the beaker to the machine." + src.updateUsrDialog() + icon_state = "mixer1" + + else if(istype(I, /obj/item/weapon/screwdriver)) + if(src.beaker) + beaker.loc = get_turf(src) + ..() + return + else + ..() + return diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 45df570eb07..1c1ea684f26 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -7,6 +7,9 @@ var/amount_per_transfer_from_this = 5 var/possible_transfer_amounts = list(5,10,15,25,30) var/volume = 30 + var/list/list_reagents = null + var/spawned_disease = null + var/disease_amount = 20 /obj/item/weapon/reagent_containers/verb/set_APTFT() //set amount_per_transfer_from_this set name = "Set transfer amount" @@ -30,6 +33,12 @@ reagents = R R.my_atom = src processing_objects.Add(src) + if(spawned_disease) + var/datum/disease/F = new spawned_disease(0) + var/list/data = list("viruses" = list(F), "blood_colour" = "#A10808") + reagents.add_reagent("blood", disease_amount, data) + if(list_reagents) + reagents.add_reagent_list(list_reagents) /obj/item/weapon/reagent_containers/process() if(reagents) diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/glass/bottle.dm index e550e2c1cd6..88b3f251507 100644 --- a/code/modules/reagents/reagent_containers/glass/bottle.dm +++ b/code/modules/reagents/reagent_containers/glass/bottle.dm @@ -299,4 +299,120 @@ New() ..() - reagents.add_reagent(pick("polonium","initropidril","concentrated_initro","pancuronium","sodium_thiopental","ketamine","sulfonal","amanitin","coniine","curare","sarin","histamine","venom","cyanide","spidereggs"), 40) \ No newline at end of file + reagents.add_reagent(pick("polonium","initropidril","concentrated_initro","pancuronium","sodium_thiopental","ketamine","sulfonal","amanitin","coniine","curare","sarin","histamine","venom","cyanide","spidereggs"), 40) + + +/obj/item/weapon/reagent_containers/glass/bottle/plasma + name = "liquid plasma bottle" + desc = "A small bottle of liquid plasma. Extremely toxic and reacts with micro-organisms inside blood." + icon_state = "bottle8" + list_reagents = list("plasma" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/diphenhydramine + name = "diphenhydramine bottle" + desc = "A small bottle of diphenhydramine." + icon_state = "bottle20" + list_reagents = list("diphenhydramine" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/flu_virion + name = "Flu virion culture bottle" + desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium." + icon_state = "bottle3" + spawned_disease = /datum/disease/advance/flu + +/obj/item/weapon/reagent_containers/glass/bottle/epiglottis_virion + name = "Epiglottis virion culture bottle" + desc = "A small bottle. Contains Epiglottis virion culture in synthblood medium." + icon_state = "bottle3" + spawned_disease = /datum/disease/advance/voice_change + +/obj/item/weapon/reagent_containers/glass/bottle/liver_enhance_virion + name = "Liver enhancement virion culture bottle" + desc = "A small bottle. Contains liver enhancement virion culture in synthblood medium." + icon_state = "bottle3" + spawned_disease = /datum/disease/advance/heal + +/obj/item/weapon/reagent_containers/glass/bottle/hullucigen_virion + name = "Hullucigen virion culture bottle" + desc = "A small bottle. Contains hullucigen virion culture in synthblood medium." + icon_state = "bottle3" + spawned_disease = /datum/disease/advance/hullucigen + +/obj/item/weapon/reagent_containers/glass/bottle/pierrot_throat + name = "Pierrot's Throat culture bottle" + desc = "A small bottle. Contains H0NI<42 virion culture in synthblood medium." + icon_state = "bottle3" + spawned_disease = /datum/disease/pierrot_throat + +/obj/item/weapon/reagent_containers/glass/bottle/cold + name = "Rhinovirus culture bottle" + desc = "A small bottle. Contains XY-rhinovirus culture in synthblood medium." + icon_state = "bottle3" + spawned_disease = /datum/disease/advance/cold + +/obj/item/weapon/reagent_containers/glass/bottle/retrovirus + name = "Retrovirus culture bottle" + desc = "A small bottle. Contains a retrovirus culture in a synthblood medium." + icon_state = "bottle3" + spawned_disease = /datum/disease/dna_retrovirus + +/obj/item/weapon/reagent_containers/glass/bottle/gbs + name = "GBS culture bottle" + desc = "A small bottle. Contains Gravitokinetic Bipotential SADS+ culture in synthblood medium."//Or simply - General BullShit + icon_state = "bottle3" + amount_per_transfer_from_this = 5 + spawned_disease = /datum/disease/gbs + +/obj/item/weapon/reagent_containers/glass/bottle/fake_gbs + name = "GBS culture bottle" + desc = "A small bottle. Contains Gravitokinetic Bipotential SADS- culture in synthblood medium."//Or simply - General BullShit + icon_state = "bottle3" + spawned_disease = /datum/disease/fake_gbs + +/obj/item/weapon/reagent_containers/glass/bottle/brainrot + name = "Brainrot culture bottle" + desc = "A small bottle. Contains Cryptococcus Cosmosis culture in synthblood medium." + icon_state = "bottle3" + spawned_disease = /datum/disease/brainrot + +/obj/item/weapon/reagent_containers/glass/bottle/magnitis + name = "Magnitis culture bottle" + desc = "A small bottle. Contains a small dosage of Fukkos Miracos." + icon_state = "bottle3" + spawned_disease = /datum/disease/magnitis + +/obj/item/weapon/reagent_containers/glass/bottle/wizarditis + name = "Wizarditis culture bottle" + desc = "A small bottle. Contains a sample of Rincewindus Vulgaris." + icon_state = "bottle3" + spawned_disease = /datum/disease/wizarditis + +/obj/item/weapon/reagent_containers/glass/bottle/anxiety + name = "Severe Anxiety culture bottle" + desc = "A small bottle. Contains a sample of Lepidopticides." + icon_state = "bottle3" + spawned_disease = /datum/disease/anxiety + +/obj/item/weapon/reagent_containers/glass/bottle/beesease + name = "Beesease culture bottle" + desc = "A small bottle. Contains a sample of invasive Apidae." + icon_state = "bottle3" + spawned_disease = /datum/disease/beesease + +/obj/item/weapon/reagent_containers/glass/bottle/fluspanish + name = "Spanish flu culture bottle" + desc = "A small bottle. Contains a sample of Inquisitius." + icon_state = "bottle3" + spawned_disease = /datum/disease/fluspanish + +/obj/item/weapon/reagent_containers/glass/bottle/tuberculosis + name = "Fungal Tuberculosis culture bottle" + desc = "A small bottle. Contains a sample of Fungal Tubercle bacillus." + icon_state = "bottle3" + spawned_disease = /datum/disease/tuberculosis + +/obj/item/weapon/reagent_containers/glass/bottle/tuberculosiscure + name = "BVAK bottle" + desc = "A small bottle containing Bio Virus Antidote Kit." + icon_state = "bottle5" + list_reagents = list("atropine" = 5, "epinephrine" = 5, "salbutamol" = 10, "spaceacillin" = 10) diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index b7c891370b0..b5071cda21f 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -31,12 +31,11 @@ /obj/machinery/bot/medbot, /obj/item/weapon/storage/secure/safe, /obj/machinery/iv_drip, - /obj/machinery/disease2/incubator, + /obj/machinery/computer/pandemic, /obj/machinery/disposal, /obj/machinery/apiary, /mob/living/simple_animal/cow, /mob/living/simple_animal/hostile/retaliate/goat, - /obj/machinery/computer/centrifuge, /obj/machinery/sleeper, /obj/machinery/smartfridge/, /obj/machinery/biogenerator, diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 67d7ca2b2fb..59328d31a5b 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -182,6 +182,16 @@ build_path = /obj/item/weapon/circuitboard/operating category = list("Computer Boards") +/datum/design/pandemic + name = "Computer Design (PanD.E.M.I.C. 2200)" + desc = "Allows for the construction of circuit boards used to build a PanD.E.M.I.C. 2200 console." + id = "pandemic" + req_tech = list("programming" = 2, "biotech" = 2) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/pandemic + category = list("Computer Boards") + /datum/design/powermonitor name = "Console Board (Power Monitor)" desc = "Allows for the construction of circuit boards used to build a new power monitor" diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index 29c8308c5d8..35c38d1b99b 100644 --- a/code/modules/surgery/organs/blood.dm +++ b/code/modules/surgery/organs/blood.dm @@ -23,6 +23,16 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 vessel.add_reagent(species.exotic_blood, max_blood) else vessel.add_reagent("blood", max_blood) + for(var/datum/reagent/blood/B in vessel.reagent_list) + if(B.id == "blood") + B.data = list( + "donor" = src, + "viruses" = null, + "blood_DNA" = dna.unique_enzymes, + "blood_colour" = species.blood_color, + "blood_type" = b_type, + "resistances" = null, + "trace_chem" = null) spawn(1) fixblood() @@ -30,9 +40,14 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 /mob/living/carbon/human/proc/fixblood() for(var/datum/reagent/blood/B in vessel.reagent_list) if(B.id == "blood") - B.data = list( "donor"=src,"viruses"=null,"blood_DNA"=dna.unique_enzymes,"blood_colour"= species.blood_color,"blood_type"=dna.b_type, \ - "resistances"=null,"trace_chem"=null, "virus2" = null, "antibodies" = null) - B.color = B.data["blood_colour"] + B.data = list( + "donor" = src, + "viruses" = null, + "blood_DNA" = dna.unique_enzymes, + "blood_colour" = species.blood_color, + "blood_type" = b_type, + "resistances" = null, + "trace_chem" = null) // Takes care blood loss and regeneration /mob/living/carbon/human/proc/handle_blood() @@ -196,10 +211,13 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 //set reagent data B.data["donor"] = src - if (!B.data["virus2"]) - B.data["virus2"] = list() - B.data["virus2"] |= virus_copylist(src.virus2) - B.data["antibodies"] = src.antibodies + B.data["viruses"] = list() + + for(var/datum/disease/D in viruses) + B.data["viruses"] += D.Copy() + if(resistances && resistances.len) + B.data["resistances"] = resistances.Copy() + B.data["blood_DNA"] = copytext(src.dna.unique_enzymes,1,0) B.data["blood_type"] = copytext(src.dna.b_type,1,0) @@ -242,14 +260,10 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 //Transfers blood from container ot vessels /mob/living/carbon/proc/inject_blood(obj/item/weapon/reagent_containers/container, var/amount) var/datum/reagent/blood/injected = get_blood(container.reagents) + if (!istype(injected)) return - var/list/sniffles = virus_copylist(injected.data["virus2"]) - for(var/ID in sniffles) - var/datum/disease2/disease/sniffle = sniffles[ID] - infect_virus2(src,sniffle,1) - if (injected.data["antibodies"] && prob(5)) - antibodies |= injected.data["antibodies"] + var/list/chems = list() chems = params2list(injected.data["trace_chem"]) for(var/C in chems) @@ -388,8 +402,4 @@ Large: Whether the splat should be big or not else B.blood_DNA[bld.data["blood_DNA"]] = "O+" - // Update virus information. - if(bld.data["virus2"]) - B.virus2 = virus_copylist(bld.data["virus2"]) - - return B \ No newline at end of file + return B diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 5ea3682a02f..000075febbe 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -352,22 +352,26 @@ organ_tag = "appendix" parent_organ = "groin" slot = "appendix" + var/inflamed = 0 - -/* -/obj/item/organ/internal/appendix/removed() - - if(owner) - var/inflamed = 0 - for(var/datum/disease/appendicitis/appendicitis in owner.viruses) - inflamed = 1 - appendicitis.cure() - owner.resistances += appendicitis - if(inflamed) - icon_state = "appendixinflamed" - name = "inflamed appendix" +/obj/item/organ/internal/appendix/remove(mob/living/carbon/M, special = 0) + for(var/datum/disease/appendicitis/A in M.viruses) + A.cure() + inflamed = 1 + update_icon() ..() -*/ + +/obj/item/organ/internal/appendix/insert(mob/living/carbon/M, special = 0) + ..() + if(inflamed) + M.AddDisease(new /datum/disease/appendicitis) + +/obj/item/organ/internal/appendix/prepare_eat() + var/obj/S = ..() + if(inflamed) + S.reagents.add_reagent("????", 5) + return S + //shadowling tumor /obj/item/organ/internal/shadowtumor name = "black tumor" diff --git a/code/modules/virus2/analyser.dm b/code/modules/virus2/analyser.dm deleted file mode 100644 index 770587eee70..00000000000 --- a/code/modules/virus2/analyser.dm +++ /dev/null @@ -1,68 +0,0 @@ -/obj/machinery/disease2/diseaseanalyser - name = "Disease Analyser" - icon = 'icons/obj/virology.dmi' - icon_state = "analyser" - anchored = 1 - density = 1 - - var/scanning = 0 - var/pause = 0 - - var/obj/item/weapon/virusdish/dish = null - -/obj/machinery/disease2/diseaseanalyser/attackby(var/obj/O as obj, var/mob/user as mob, params) - if(!istype(O,/obj/item/weapon/virusdish)) return - - if(dish) - user << "\The [src] is already loaded." - return - - dish = O - user.drop_item() - O.loc = src - - user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!") - -/obj/machinery/disease2/diseaseanalyser/process() - if(stat & (NOPOWER|BROKEN)) - return - - if(scanning) - scanning -= 1 - if(scanning == 0) - if (dish.virus2.addToDB()) - ping("\The [src] pings, \"New pathogen added to data bank.\"") - - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src.loc) - P.name = "paper - [dish.virus2.name()]" - - var/r = dish.virus2.get_info() - P.info = {" - [virology_letterhead("Post-Analysis Memo")] - [r] -
- Additional Notes:  -"} - dish.info = r - dish.analysed = 1 - dish.loc = src.loc - dish = null - - icon_state = "analyser" - src.state("\The [src] prints a sheet of paper.") - - else if(dish && !scanning && !pause) - if(dish.virus2 && dish.growth > 50) - dish.growth -= 10 - scanning = 5 - icon_state = "analyser_processing" - else - pause = 1 - spawn(25) - dish.loc = src.loc - dish = null - - src.state("\The [src] buzzes, \"Insufficient growth density to complete analysis.\"") - pause = 0 - return diff --git a/code/modules/virus2/antibodies.dm b/code/modules/virus2/antibodies.dm deleted file mode 100644 index 9d4c63ae2c5..00000000000 --- a/code/modules/virus2/antibodies.dm +++ /dev/null @@ -1,52 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 - -// reserving some numbers for later special antigens -var/global/const/ANTIGEN_A = 1 -var/global/const/ANTIGEN_B = 2 -var/global/const/ANTIGEN_RH = 4 -var/global/const/ANTIGEN_Q = 8 -var/global/const/ANTIGEN_U = 16 -var/global/const/ANTIGEN_V = 32 -var/global/const/ANTIGEN_X = 64 -var/global/const/ANTIGEN_Y = 128 -var/global/const/ANTIGEN_Z = 256 -var/global/const/ANTIGEN_M = 512 -var/global/const/ANTIGEN_N = 1024 -var/global/const/ANTIGEN_P = 2048 -var/global/const/ANTIGEN_O = 4096 - -var/global/list/ANTIGENS = list( -"[ANTIGEN_A]" = "A", -"[ANTIGEN_B]" = "B", -"[ANTIGEN_RH]" = "RH", -"[ANTIGEN_Q]" = "Q", -"[ANTIGEN_U]" = "U", -"[ANTIGEN_V]" = "V", -"[ANTIGEN_Z]" = "Z", -"[ANTIGEN_M]" = "M", -"[ANTIGEN_N]" = "N", -"[ANTIGEN_P]" = "P", -"[ANTIGEN_O]" = "O" -) - -// pure concentrated antibodies -datum/reagent/antibodies - data = list("antibodies"=0) - name = "Antibodies" - id = "antibodies" - reagent_state = LIQUID - color = "#0050F0" - - reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - if(istype(M,/mob/living/carbon)) - if(src.data && method == INGEST) - if(M:virus2) if(src.data["antibodies"] & M:virus2.antigen) - M:virus2.dead = 1 - M:antibodies |= src.data["antibodies"] - return - -// iterate over the list of antigens and see what matches -/proc/antigens2string(var/antigens) - var/code = "" - for(var/V in ANTIGENS) if(text2num(V) & antigens) code += ANTIGENS[V] - return code \ No newline at end of file diff --git a/code/modules/virus2/centrifuge.dm b/code/modules/virus2/centrifuge.dm deleted file mode 100644 index e215e9e6a8c..00000000000 --- a/code/modules/virus2/centrifuge.dm +++ /dev/null @@ -1,217 +0,0 @@ -/obj/machinery/computer/centrifuge - name = "isolation centrifuge" - desc = "Used to separate things with different weight. Spin 'em round, round, right round." - icon = 'icons/obj/virology.dmi' - icon_state = "centrifuge" - var/curing - var/isolating - - var/obj/item/weapon/reagent_containers/glass/beaker/vial/sample = null - var/datum/disease2/disease/virus2 = null - -/obj/machinery/computer/centrifuge/attackby(var/obj/O as obj, var/mob/user as mob, params) - if(istype(O, /obj/item/weapon/screwdriver)) - return ..(O,user) - - if(istype(O,/obj/item/weapon/reagent_containers/glass/beaker/vial)) - if(sample) - user << "\The [src] is already loaded." - return - - if(!user.drop_item()) - user << "\The [O] is stuck to you!" - return - - sample = O - O.forceMove(src) - - user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!") - nanomanager.update_uis(src) - - src.attack_hand(user) - -/obj/machinery/computer/centrifuge/update_icon() - ..() - if(! (stat & (BROKEN|NOPOWER)) && (isolating || curing)) - icon_state = "centrifuge_moving" - -/obj/machinery/computer/centrifuge/attack_hand(var/mob/user as mob) - if(..()) return - ui_interact(user) - -/obj/machinery/computer/centrifuge/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - user.set_machine(src) - - var/data[0] - data["antibodies"] = null - data["pathogens"] = null - data["is_antibody_sample"] = null - - if (curing) - data["busy"] = "Isolating antibodies..." - else if (isolating) - data["busy"] = "Isolating pathogens..." - else - data["sample_inserted"] = !!sample - - if (sample) - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list - if (B) - data["antibodies"] = B.data["antibodies"] ? antigens2string(B.data["antibodies"]) : null - - var/list/pathogens[0] - var/list/virus = B.data["virus2"] - for (var/ID in virus) - var/datum/disease2/disease/V = virus[ID] - pathogens.Add(list(list("name" = V.name(), "spread_type" = V.spreadtype, "reference" = "\ref[V]"))) - - if (pathogens.len > 0) - data["pathogens"] = pathogens - - else - var/datum/reagent/antibodies/A = locate(/datum/reagent/antibodies) in sample.reagents.reagent_list - data["antibodies"] = A && A.data["antibodies"] ? antigens2string(A.data["antibodies"]) : null - data["is_antibody_sample"] = 1 - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "isolation_centrifuge.tmpl", src.name, 400, 500) - ui.set_initial_data(data) - ui.open() - -/obj/machinery/computer/centrifuge/process() - ..() - if (stat & (NOPOWER|BROKEN)) return - - if (curing) - curing -= 1 - if (curing == 0) - cure() - - if (isolating) - isolating -= 1 - if(isolating == 0) - isolate() - -/obj/machinery/computer/centrifuge/Topic(href, href_list) - if (..()) return 0 - - var/mob/user = usr - var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main") - - src.add_fingerprint(user) - - if (href_list["close"]) - user.unset_machine() - ui.close() - return 0 - - if (href_list["print"]) - print(user) - return 1 - - if(href_list["isolate"]) - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list - if (B) - var/datum/disease2/disease/virus = locate(href_list["isolate"]) - virus2 = virus.getcopy() - isolating = 40 - update_icon() - return 1 - - switch(href_list["action"]) - if ("antibody") - var/delay = 20 - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list - if (!B) - state("\The [src] buzzes, \"No antibody carrier detected.\"", "blue") - return 1 - - var/has_toxins = locate(/datum/reagent/toxin) in sample.reagents.reagent_list - var/has_radium = sample.reagents.has_reagent("radium") - if (has_toxins || has_radium) - state("\The [src] beeps, \"Pathogen purging speed above nominal.\"", "blue") - if (has_toxins) - delay = delay/2 - if (has_radium) - delay = delay/2 - - curing = round(delay) - playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1) - update_icon() - return 1 - - if("sample") - if(sample) - sample.forceMove(src.loc) - sample = null - return 1 - - return 0 - -/obj/machinery/computer/centrifuge/proc/cure() - if (!sample) return - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list - if (!B) return - - var/list/data = list("antibodies" = B.data["antibodies"]) - var/amt= sample.reagents.get_reagent_amount("blood") - sample.reagents.remove_reagent("blood", amt) - sample.reagents.add_reagent("antibodies", amt, data) - - nanomanager.update_uis(src) - update_icon() - ping("\The [src] pings, \"Antibody isolated.\"") - -/obj/machinery/computer/centrifuge/proc/isolate() - if (!sample) return - var/obj/item/weapon/virusdish/dish = new/obj/item/weapon/virusdish(loc) - dish.virus2 = virus2 - virus2 = null - - nanomanager.update_uis(src) - update_icon() - ping("\The [src] pings, \"Pathogen isolated.\"") - -/obj/machinery/computer/centrifuge/proc/print(var/mob/user) - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc) - P.name = "paper - Pathology Report" - P.info = {" - [virology_letterhead("Pathology Report")] - Sample: [sample.name]
-"} - - if (user) - P.info += "Generated By: [user.name]
" - - P.info += "
" - - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in sample.reagents.reagent_list - if (B) - P.info += "Antibodies: " - P.info += B.data["antibodies"] ? antigens2string(B.data["antibodies"]) : "None" - P.info += "
" - - var/list/virus = B.data["virus2"] - P.info += "Pathogens:
" - if (virus.len > 0) - for (var/ID in virus) - var/datum/disease2/disease/V = virus[ID] - P.info += "[V.name()]
" - else - P.info += "None
" - - else - var/datum/reagent/antibodies/A = locate(/datum/reagent/antibodies) in sample.reagents.reagent_list - if (A) - P.info += "The following antibodies have been isolated from the blood sample: " - P.info += A.data["antibodies"] ? antigens2string(A.data["antibodies"]) : "None" - P.info += "
" - - P.info += {" -
- Additional Notes: -"} - - state("The nearby computer prints out a pathology report.") \ No newline at end of file diff --git a/code/modules/virus2/curer.dm b/code/modules/virus2/curer.dm deleted file mode 100644 index f298f8a3379..00000000000 --- a/code/modules/virus2/curer.dm +++ /dev/null @@ -1,107 +0,0 @@ -/obj/machinery/computer/curer - name = "cure research machine" - icon = 'icons/obj/computer.dmi' - icon_state = "dna" - circuit = /obj/item/weapon/circuitboard/curefab - var/curing - var/virusing - - var/obj/item/weapon/reagent_containers/container = null - -/obj/machinery/computer/curer/attackby(var/obj/I as obj, var/mob/user as mob, params) - if(istype(I,/obj/item/weapon/reagent_containers)) - var/mob/living/carbon/C = user - if(!container && C.drop_item()) - container = I - I.forceMove(src) - return - if(istype(I,/obj/item/weapon/virusdish)) - if(virusing) - user << "The pathogen materializer is still recharging.." - return - var/obj/item/weapon/reagent_containers/glass/beaker/product = new(src.loc) - - var/list/data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"virus2"=list(),"antibodies"=0) - data["virus2"] |= I:virus2 - product.reagents.add_reagent("blood",30,data) - - virusing = 1 - spawn(1200) virusing = 0 - - state("The [src.name] Buzzes", "blue") - return - ..() - return - -/obj/machinery/computer/curer/attack_ai(var/mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/computer/curer/attack_hand(var/mob/user as mob) - if(..()) - return - user.machine = src - var/dat - if(curing) - dat = "Antibody production in progress" - else if(virusing) - dat = "Virus production in progress" - else if(container) - // see if there's any blood in the container - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in container.reagents.reagent_list - - if(B) - dat = "Blood sample inserted." - var/code = "" - for(var/V in ANTIGENS) if(text2num(V) & B.data["antibodies"]) code += ANTIGENS[V] - dat += "
Antibodies: [code]" - dat += "
Begin antibody production" - else - dat += "
Please check container contents." - dat += "
Eject container" - else - dat = "Please insert a container." - - user << browse(dat, "window=computer;size=400x500") - onclose(user, "computer") - return - -/obj/machinery/computer/curer/process() - ..() - - if(stat & (NOPOWER|BROKEN)) - return - use_power(500) - - if(curing) - curing -= 1 - if(curing == 0) - if(container) - createcure(container) - return - -/obj/machinery/computer/curer/Topic(href, href_list) - if(..()) - return - usr.machine = src - - if (href_list["antibody"]) - curing = 10 - else if(href_list["eject"]) - container.forceMove(src.loc) - container = null - - src.add_fingerprint(usr) - src.updateUsrDialog() - return - - -/obj/machinery/computer/curer/proc/createcure(var/obj/item/weapon/reagent_containers/container) - var/obj/item/weapon/reagent_containers/glass/beaker/product = new(src.loc) - - var/datum/reagent/blood/B = locate() in container.reagents.reagent_list - - var/list/data = list() - data["antibodies"] = B.data["antibodies"] - product.reagents.add_reagent("antibodies",30,data) - - state("\The [src.name] buzzes", "blue") \ No newline at end of file diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm deleted file mode 100644 index d5a17a722af..00000000000 --- a/code/modules/virus2/disease2.dm +++ /dev/null @@ -1,268 +0,0 @@ -/datum/disease2/disease - var/infectionchance = 70 - var/speed = 1 - var/spreadtype = "Contact" // Can also be "Airborne" or "Injection" - var/stage = 1 - var/stageprob = 10 - var/dead = 0 - var/clicks = 0 - var/uniqueID = 0 - var/list/datum/disease2/effectholder/effects = list() - var/antigen = 0 // 16 bits describing the antigens, when one bit is set, a cure with that bit can dock here - var/max_stage = 4 - var/list/affected_species = list("Human","Unathi","Skrell","Tajaran","Vox","Kidan","Slime People","Grey","Diona", "Vulpkanin") //if this is changed, also change modules/nano/modules/virus2_creator.dm - //as you cannot use initial() with lists -/datum/disease2/disease/New() - uniqueID = rand(0,10000) - ..() - -/datum/disease2/disease/proc/makerandom(var/greater=0, var/allow_injection=0) - for(var/i=1 ; i <= max_stage ; i++ ) - var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder - holder.stage = i - if(greater) - holder.getrandomeffect(2) - else - holder.getrandomeffect() - effects += holder - uniqueID = rand(0,10000) - infectionchance = rand(60,90) - antigen |= text2num(pick(ANTIGENS)) - antigen |= text2num(pick(ANTIGENS)) - spreadtype = prob(70) ? "Airborne" : "Contact" - if(allow_injection) spreadtype = prob(20) ? spreadtype : "Injection" - - if(all_species.len) - affected_species = get_infectable_species() - -/proc/get_infectable_species() - var/list/meat = list() - var/list/res = list() - for (var/specie in all_species) - var/datum/species/S = all_species[specie] - if(!(S.virus_immune)) - meat += S.name - if(meat.len) - var/num = rand(1,meat.len) - for(var/i=0,i 50) -// if(prob(1)) -// majormutateinactivate(mob) - - //Space antibiotics stop disease completely - if(mob.reagents.has_reagent("spaceacillin")) - if(stage == 1 && prob(20)) - src.cure(mob) - return - - //Virus food speeds up disease progress - if(mob.reagents.has_reagent("virusfood")) - mob.reagents.remove_reagent("virusfood",0.1) - clicks += 10 - - //Moving to the next stage - if(clicks > stage*100 && prob(10)) - /*if(stage == max_stage) - src.cure(mob) - mob.antibodies |= src.antigen*/ //NO AUTOCURE FOR YOU - stage++ - clicks = 0 - //Do nasty effects - for(var/datum/disease2/effectholder/e in effects) - if(prob(33)) - e.runeffect(mob,stage) - - //Short airborne spread - if(src.spreadtype == "Airborne") - for(var/mob/living/carbon/M in oview(1,mob)) - if(airborne_can_reach(get_turf(mob), get_turf(M))) - infect_virus2(M,src) - - //fever - mob.bodytemperature = max(mob.bodytemperature, min(310+5*stage ,mob.bodytemperature+5*stage)) - clicks+=speed - -/datum/disease2/disease/proc/cure(var/mob/living/carbon/mob) - for(var/datum/disease2/effectholder/e in effects) - e.effect.deactivate(mob) - mob.virus2.Remove("[uniqueID]") - -/datum/disease2/disease/proc/minormutate() - //uniqueID = rand(0,10000) - var/datum/disease2/effectholder/holder = pick(effects) - holder.minormutate() - infectionchance = min(50,infectionchance + rand(0,10)) - -/datum/disease2/disease/proc/majormutate() - uniqueID = rand(0,10000) - var/datum/disease2/effectholder/holder = pick(effects) - holder.majormutate() - if (prob(5)) - antigen = text2num(pick(ANTIGENS)) - antigen |= text2num(pick(ANTIGENS)) - if (prob(5) && all_species.len) - affected_species = get_infectable_species() - -/datum/disease2/disease/proc/majormutateinactivate(var/mob/living/carbon/mob) //Bone White - Duplicate of majormutate() with adminlogs, for use only in activate() - var/oldID = uniqueID - uniqueID = rand(0,10000) - var/datum/disease2/effectholder/holder = pick(effects) - holder.majormutate() - if (prob(5)) - var/oldAntigen = antigen - antigen = text2num(pick(ANTIGENS)) - antigen |= text2num(pick(ANTIGENS)) - log_admin("Stamm #[oldID] ([oldAntigen]) mutated antigens in [mob.name] to Stamm #[uniqueID] ([antigen])") - message_admins("Stamm #[oldID] ([oldAntigen]) mutated antigens in [mob.name] to Stamm #[uniqueID] ([antigen])") - else if (prob(10) && all_species.len) - var/old_species = affected_species - affected_species = get_infectable_species() - log_admin("Stamm #[oldID] ([old_species]) mutated affected species in [mob.name] to Stamm #[uniqueID] ([affected_species])") - message_admins("Stamm #[oldID] ([old_species]) mutated affected species in [mob.name] to Stamm #[uniqueID] ([affected_species])") - else - log_admin("Stamm #[oldID] mutated in [mob.name] to Stamm #[uniqueID] ([antigen])") - message_admins("Stamm #[oldID] mutated in a [mob.name] to Stamm #[uniqueID] ([antigen])") - -/datum/disease2/disease/proc/getcopy() - var/datum/disease2/disease/disease = new /datum/disease2/disease - disease.infectionchance = infectionchance - disease.spreadtype = spreadtype - disease.stageprob = stageprob - disease.antigen = antigen - disease.uniqueID = uniqueID - disease.speed = speed - disease.clicks = clicks - disease.affected_species = affected_species.Copy() - for(var/datum/disease2/effectholder/holder in effects) - var/datum/disease2/effectholder/newholder = new /datum/disease2/effectholder - newholder.effect = new holder.effect.type - newholder.chance = holder.chance - newholder.cure = holder.cure - newholder.multiplier = holder.multiplier - newholder.happensonce = holder.happensonce - newholder.stage = holder.stage - disease.effects += newholder - return disease - -/datum/disease2/disease/proc/issame(var/datum/disease2/disease/disease) - var/list/types = list() - var/list/types2 = list() - for(var/datum/disease2/effectholder/d in effects) - types += d.effect.type - var/equal = 1 - - for(var/datum/disease2/effectholder/d in disease.effects) - types2 += d.effect.type - - for(var/type in types) - if(!(type in types2)) - equal = 0 - - if (antigen != disease.antigen) - equal = 0 - return equal - -/proc/virus_copylist(var/list/datum/disease2/disease/viruses) - var/list/res = list() - for (var/ID in viruses) - var/datum/disease2/disease/V = viruses[ID] - if(istype(V)) - res["[V.uniqueID]"] = V.getcopy() - else - testing("Got a NULL disease2 in virus_copylist!") - return res - - -var/global/list/virusDB = list() - -/datum/disease2/disease/proc/name() - .= "stamm #[add_zero("[uniqueID]", 4)]" - if ("[uniqueID]" in virusDB) - var/datum/data/record/V = virusDB["[uniqueID]"] - .= V.fields["name"] - -/datum/disease2/disease/proc/get_info() - var/r = {" -Analysis determined the existence of a GNAv2-based viral lifeform.
-Designation: [name()]
-Antigen: [antigens2string(antigen)]
-Transmitted By: [spreadtype]
-Rate of Progression: [stageprob * 10]
-Species Affected: [list2text(affected_species, ", ")]
-"} - - r += "Symptoms:
" - for(var/datum/disease2/effectholder/E in effects) - r += "([E.stage]) [E.effect.name] " - r += "Strength: [E.multiplier >= 3 ? "Severe" : E.multiplier > 1 ? "Above Average" : "Average"] " - r += "Verosity: [E.chance * 15]
" - - return r - -/datum/disease2/disease/proc/addToDB() - if ("[uniqueID]" in virusDB) - return 0 - var/datum/data/record/v = new() - v.fields["id"] = uniqueID - v.fields["name"] = name() - v.fields["description"] = get_info() - v.fields["antigen"] = antigens2string(antigen) - v.fields["spread type"] = spreadtype - virusDB["[uniqueID]"] = v - return 1 - -proc/virus2_lesser_infection() - var/list/candidates = list() //list of candidate keys - - for(var/mob/living/carbon/human/G in player_list) - if(G.client && G.stat != DEAD) - candidates += G - - if(!candidates.len) return - - candidates = shuffle(candidates) - - infect_mob_random_lesser(candidates[1]) - -proc/virus2_greater_infection() - var/list/candidates = list() //list of candidate keys - - for(var/mob/living/carbon/human/G in player_list) - if(G.client && G.stat != DEAD) - candidates += G - if(!candidates.len) return - - candidates = shuffle(candidates) - - infect_mob_random_greater(candidates[1]) - -proc/virology_letterhead(var/report_name) - return {" -

[report_name]

-
[station_name()] Virology Lab
-
-"} diff --git a/code/modules/virus2/diseasesplicer.dm b/code/modules/virus2/diseasesplicer.dm deleted file mode 100644 index 4129e77ecf6..00000000000 --- a/code/modules/virus2/diseasesplicer.dm +++ /dev/null @@ -1,180 +0,0 @@ -/obj/machinery/computer/diseasesplicer - name = "disease splicer console" - icon = 'icons/obj/computer.dmi' - icon_screen = "crew" - icon_keyboard = "med_key" - - var/datum/disease2/effectholder/memorybank = null - var/list/species_buffer = null - var/analysed = 0 - var/obj/item/weapon/virusdish/dish = null - var/burning = 0 - var/splicing = 0 - var/scanning = 0 - -/obj/machinery/computer/diseasesplicer/attackby(var/obj/I as obj, var/mob/user as mob, params) - if(istype(I, /obj/item/weapon/screwdriver)) - return ..(I,user) - - if(istype(I,/obj/item/weapon/virusdish)) - var/mob/living/carbon/c = user - if (dish) - user << "\The [src] is already loaded." - return - - dish = I - c.drop_item() - I.loc = src - - if(istype(I,/obj/item/weapon/diseasedisk)) - user << "You upload the contents of the disk onto the buffer." - memorybank = I:effect - species_buffer = I:species - analysed = I:analysed - - src.attack_hand(user) - -/obj/machinery/computer/diseasesplicer/attack_ai(var/mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/computer/diseasesplicer/attack_hand(var/mob/user as mob) - if(..()) return - ui_interact(user) - -/obj/machinery/computer/diseasesplicer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - user.set_machine(src) - - var/data[0] - data["dish_inserted"] = !!dish - data["growth"] = 0 - data["affected_species"] = null - - if (memorybank) - data["buffer"] = list("name" = (analysed ? memorybank.effect.name : "Unknown Symptom"), "stage" = memorybank.stage) - if (species_buffer) - data["species_buffer"] = analysed ? list2text(species_buffer, ", ") : "Unknown Species" - - if (splicing) - data["busy"] = "Splicing..." - else if (scanning) - data["busy"] = "Scanning..." - else if (burning) - data["busy"] = "Copying data to disk..." - else if (dish) - data["growth"] = min(dish.growth, 100) - - if (dish.virus2) - if (dish.virus2.affected_species) - data["affected_species"] = dish.analysed ? list2text(dish.virus2.affected_species, ", ") : "Unknown" - - if (dish.growth >= 50) - var/list/effects[0] - for (var/datum/disease2/effectholder/e in dish.virus2.effects) - effects.Add(list(list("name" = (dish.analysed ? e.effect.name : "Unknown"), "stage" = (e.stage), "reference" = "\ref[e]"))) - data["effects"] = effects - else - data["info"] = "Insufficient cell growth for gene splicing." - else - data["info"] = "No virus detected." - else - data["info"] = "No dish loaded." - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "disease_splicer.tmpl", src.name, 400, 600) - ui.set_initial_data(data) - ui.open() - -/obj/machinery/computer/diseasesplicer/process() - if(stat & (NOPOWER|BROKEN)) - return - - if(scanning) - scanning -= 1 - if(!scanning) - ping("\The [src] pings, \"Analysis complete.\"") - nanomanager.update_uis(src) - if(splicing) - splicing -= 1 - if(!splicing) - ping("\The [src] pings, \"Splicing operation complete.\"") - nanomanager.update_uis(src) - if(burning) - burning -= 1 - if(!burning) - var/obj/item/weapon/diseasedisk/d = new /obj/item/weapon/diseasedisk(src.loc) - d.analysed = analysed - if(analysed) - if (memorybank) - d.name = "[memorybank.effect.name] GNA disk (Stage: [memorybank.effect.stage])" - d.effect = memorybank - else if (species_buffer) - d.name = "[list2text(species_buffer, ", ")] GNA disk" - d.species = species_buffer - else - if (memorybank) - d.name = "Unknown GNA disk (Stage: [memorybank.effect.stage])" - d.effect = memorybank - else if (species_buffer) - d.name = "Unknown Species GNA disk" - d.species = species_buffer - - ping("\The [src] pings, \"Backup disk saved.\"") - nanomanager.update_uis(src) - -/obj/machinery/computer/diseasesplicer/Topic(href, href_list) - if(..()) return 0 - - var/mob/user = usr - var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main") - - src.add_fingerprint(user) - - if (href_list["close"]) - user.unset_machine() - ui.close() - return 0 - - if (href_list["grab"]) - if (dish) - memorybank = locate(href_list["grab"]) - species_buffer = null - analysed = dish.analysed - dish = null - scanning = 10 - return 1 - - if (href_list["affected_species"]) - if (dish) - memorybank = null - species_buffer = dish.virus2.affected_species - analysed = dish.analysed - dish = null - scanning = 10 - return 1 - - if(href_list["eject"]) - if (dish) - dish.loc = src.loc - dish = null - return 1 - - if(href_list["splice"]) - if(dish) - if (memorybank) - for(var/datum/disease2/effectholder/e in dish.virus2.effects) - if(e.stage == memorybank.stage) - e.effect = memorybank.effect - - if (species_buffer) - dish.virus2.affected_species = species_buffer - - splicing = 10 - dish.virus2.uniqueID = rand(0,10000) - return 1 - - if(href_list["disk"]) - burning = 10 - return 1 - - return 0 diff --git a/code/modules/virus2/dishincubator.dm b/code/modules/virus2/dishincubator.dm deleted file mode 100644 index 844528e7ed6..00000000000 --- a/code/modules/virus2/dishincubator.dm +++ /dev/null @@ -1,208 +0,0 @@ -/obj/machinery/disease2/incubator/ - name = "Pathogenic incubator" - density = 1 - anchored = 1 - icon = 'icons/obj/virology.dmi' - icon_state = "incubator" - var/obj/item/weapon/virusdish/dish - var/obj/item/weapon/reagent_containers/glass/beaker = null - var/radiation = 0 - - var/on = 0 - var/power = 0 - - var/foodsupply = 0 - var/toxins = 0 - -/obj/machinery/disease2/incubator/attackby(var/obj/O as obj, var/mob/user as mob, params) - if(istype(O, /obj/item/weapon/reagent_containers/glass) || istype(O,/obj/item/weapon/reagent_containers/syringe)) - - if(beaker) - user << "\The [src] is already loaded." - return - - if(!user.drop_item()) - user << "\The [O] is stuck to you!" - return - - beaker = O - O.forceMove(src) - - user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!") - nanomanager.update_uis(src) - - src.attack_hand(user) - return - - if(istype(O, /obj/item/weapon/virusdish)) - - if(dish) - user << "The dish tray is aleady full!" - return - - if(!user.drop_item()) - user << "\The [O] is stuck to you!" - return - dish = O - O.forceMove(src) - - user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!") - nanomanager.update_uis(src) - - src.attack_hand(user) - -/obj/machinery/disease2/incubator/attack_hand(mob/user as mob) - if(stat & (NOPOWER|BROKEN)) return - ui_interact(user) - -/obj/machinery/disease2/incubator/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - user.set_machine(src) - - var/data[0] - data["chemicals_inserted"] = !!beaker - data["dish_inserted"] = !!dish - data["food_supply"] = foodsupply - data["radiation"] = radiation - data["toxins"] = min(toxins, 100) - data["on"] = on - data["system_in_use"] = foodsupply > 0 || radiation > 0 || toxins > 0 - data["chemical_volume"] = beaker ? beaker.reagents.total_volume : 0 - data["max_chemical_volume"] = beaker ? beaker.volume : 1 - data["virus"] = dish ? dish.virus2 : null - data["growth"] = dish ? min(dish.growth, 100) : 0 - data["infection_rate"] = dish && dish.virus2 ? dish.virus2.infectionchance * 10 : 0 - data["analysed"] = dish && dish.analysed ? 1 : 0 - data["can_breed_virus"] = null - data["blood_already_infected"] = null - - if (beaker) - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in beaker.reagents.reagent_list - data["can_breed_virus"] = dish && dish.virus2 && B - - if (B) - if (!B.data["virus2"]) - B.data["virus2"] = list() - - var/list/virus = B.data["virus2"] - for (var/ID in virus) - data["blood_already_infected"] = virus[ID] - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "dish_incubator.tmpl", src.name, 400, 600) - ui.set_initial_data(data) - ui.open() - -/obj/machinery/disease2/incubator/process() - if(dish && on && dish.virus2) - use_power(50,EQUIP) - if(!powered(EQUIP)) - on = 0 - icon_state = "incubator" - - if(foodsupply) - if(dish.growth + 3 >= 100 && dish.growth < 100) - ping("\The [src] pings, \"Sufficient viral growth density achieved.\"") - - foodsupply -= 1 - dish.growth += 3 - nanomanager.update_uis(src) - - if(radiation) - if(radiation > 50 & prob(5)) - dish.virus2.majormutate() - if(dish.info) - dish.info = "OUTDATED : [dish.info]" - dish.analysed = 0 - ping("\The [src] pings, \"Mutant viral strain detected.\"") - else if(prob(5)) - dish.virus2.minormutate() - radiation -= 1 - nanomanager.update_uis(src) - if(toxins && prob(5)) - dish.virus2.infectionchance -= 1 - nanomanager.update_uis(src) - if(toxins > 50) - dish.growth = 0 - dish.virus2 = null - nanomanager.update_uis(src) - else if(!dish) - on = 0 - icon_state = "incubator" - nanomanager.update_uis(src) - - if(beaker) - if(!beaker.reagents.remove_reagent("virusfood",5)) - foodsupply += 10 - nanomanager.update_uis(src) - - if (locate(/datum/reagent/toxin) in beaker.reagents.reagent_list) - for(var/datum/reagent/toxin/T in beaker.reagents.reagent_list) - //toxins += max(T.toxpwr,1) - beaker.reagents.remove_reagent(T.id,1) - nanomanager.update_uis(src) - -/obj/machinery/disease2/incubator/Topic(href, href_list) - if (..()) return 0 - - var/mob/user = usr - var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main") - - src.add_fingerprint(user) - - if (href_list["close"]) - user.unset_machine() - ui.close() - return 0 - - if (href_list["ejectchem"]) - if(beaker) - beaker.forceMove(src.loc) - beaker = null - return 1 - - if (href_list["power"]) - if (dish) - on = !on - icon_state = on ? "incubator_on" : "incubator" - return 1 - - if (href_list["ejectdish"]) - if(dish) - dish.forceMove(src.loc) - dish = null - return 1 - - if (href_list["rad"]) - radiation += 10 - return 1 - - if (href_list["flush"]) - radiation = 0 - toxins = 0 - foodsupply = 0 - return 1 - - if(href_list["virus"]) - if (!dish) - return 1 - - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in beaker.reagents.reagent_list - if (!B) - return 1 - - if (!B.data["virus2"]) - B.data["virus2"] = list() - - var/list/virus = list("[dish.virus2.uniqueID]" = dish.virus2.getcopy()) - B.data["virus2"] += virus - - var/list/virus_effects - for(var/datum/disease2/effectholder/symptom in dish.virus2.effects) - virus_effects += "\[" + symptom.effect.name + "\]" - use_log += text("\[[time_stamp()]\] [user.name] ([user.ckey]) has transferred a virus containing [virus_effects] to a blood sample.") - - ping("\The [src] pings, \"Injection complete.\"") - return 1 - - return 0 \ No newline at end of file diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm deleted file mode 100644 index ffb90dc2c61..00000000000 --- a/code/modules/virus2/effect.dm +++ /dev/null @@ -1,982 +0,0 @@ -/datum/disease2/effectholder - var/name = "Holder" - var/datum/disease2/effect/effect - var/chance = 0 //Chance in percentage each tick - var/cure = "" //Type of cure it requires - var/happensonce = 0 - var/multiplier = 1 //The chance the effects are WORSE - var/stage = 0 - -/datum/disease2/effectholder/proc/runeffect(var/mob/living/carbon/human/mob,var/stage) - if(happensonce > -1 && effect.stage <= stage && prob(chance)) - effect.activate(mob,multiplier) - if(happensonce == 1) - happensonce = -1 - -/datum/disease2/effectholder/proc/getrandomeffect(var/badness = 1) - var/list/datum/disease2/effect/list = list() - for(var/e in subtypesof(/datum/disease2/effect) - /datum/disease2/effect/organs/vampire) - var/datum/disease2/effect/f = new e - if (f.badness > badness) //we don't want such strong effects - continue - if(f.stage == src.stage) - list += f - effect = pick(list) - chance = rand(0,effect.chance_maxm) - multiplier = rand(1,effect.maxm) - -/datum/disease2/effectholder/proc/minormutate() - switch(pick(1,2,3,4,5)) - if(1) - chance = rand(0,effect.chance_maxm) - if(2) - multiplier = rand(1,effect.maxm) - -/datum/disease2/effectholder/proc/majormutate() - getrandomeffect(2) - -//////////////////////////////////////////////////////////////// -////////////////////////EFFECTS///////////////////////////////// -//////////////////////////////////////////////////////////////// - -// Badness : 1 means can be a minor viral outbreak event symptom -// it can also be a major mutation -// 2 means can be a major or minor viral outbreak event symptom -// it can also be a major mutation -// 3 means it cannot be in a viral outbreak event -// it cannot be a major mutation - -/datum/disease2/effect - var/chance_maxm = 50 - var/name = "Blanking effect" - var/stage = 4 - var/maxm = 1 - var/badness = 1 - proc/activate(var/mob/living/carbon/mob,var/multiplier) - proc/deactivate(var/mob/living/carbon/mob) - -////////////////////////SPECIAL///////////////////////////////// -/datum/disease2/effect/alien - name = "Unidentified Foreign Body" - stage = 4 - badness = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob << "\red You feel something tearing its way out of your stomach..." - mob.adjustToxLoss(10) - mob.updatehealth() - if(prob(40)) - if(mob.client) - mob.client.mob = new/mob/living/carbon/alien/larva(mob.loc) - else - new/mob/living/carbon/alien/larva(mob.loc) - var/datum/disease2/disease/D = mob:virus2 - mob:gib() - qdel(D) - - -/datum/disease2/effect/invisible - name = "Waiting Syndrome" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - return - -// Bone White - Empty sypmtoms. There is a better way of handling this but this is much faster. - -/datum/disease2/effect/invisible_stage_two - name = "Patience Syndrome" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - return - -/datum/disease2/effect/invisible_stage_three - name = "Delayed Syndrome" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - return - -/datum/disease2/effect/invisible_stage_four - name = "Anticipation Syndrome" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - return - - - -////////////////////////STAGE 4///////////////////////////////// - -/datum/disease2/effect/borg - name = "Borgification Disorder" - stage = 4 - badness = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob << "You feel like beeping and booping..." - mob.adjustBruteLoss(10) - mob.updatehealth() - if(prob(40)) - if(mob.client) - if(!jobban_isbanned(mob, "Cyborg") && !jobban_isbanned(mob,"nonhumandept")) - var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(mob.loc)) - mob.mind.transfer_to(O) - else - new/mob/living/silicon/robot(get_turf(mob.loc)) - var/datum/disease2/disease/D = mob.virus2 - mob.gib() - qdel(D) - -/datum/disease2/effect/omnizine - name = "Panacea Effect" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - if (mob.reagents.get_reagent_amount("omnizine") < 2) - mob.reagents.add_reagent("omnizine", 2) - -/datum/disease2/effect/viralsputum_major - name = "Hemoptysis" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - if (prob(60)) - mob.say("*cough") - var/obj/effect/decal/cleanable/blood/viralsputum/D= locate(/obj/effect/decal/cleanable/blood/viralsputum) in get_turf(mob) - if(D==null) - D = new(get_turf(mob)) - D.virus2 |= virus_copylist(mob.virus2) - mob.reagents.remove_reagent("blood", 20) // Bone White - Blood loss when coughing up blood, experimental, may need adjusting. - else - -/datum/disease2/effect/gibbingtons - name = "Gibbingtons Syndrome" - stage = 4 - badness = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.gib() - -/datum/disease2/effect/radian - name = "Radian's Syndrome" - stage = 4 - maxm = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.apply_effect(2*multiplier,IRRADIATE,0) - -/datum/disease2/effect/deaf - name = "Dead Ear Syndrome" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.ear_deaf += 20 - -/datum/disease2/effect/monkey - name = "Monkism Syndrome" - stage = 4 - badness = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob,/mob/living/carbon/human)) - var/mob/living/carbon/human/h = mob - h.monkeyize() - -/datum/disease2/effect/suicide - name = "Suicidal Syndrome" - stage = 4 - badness = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - if (mob.suiciding == 0) - mob.suiciding = 1 - //instead of killing them instantly, just put them at -175 health and let 'em gasp for a while - viewers(mob) << "\red [mob.name] is holding \his breath. It looks like \he's trying to commit suicide." - mob.adjustOxyLoss(175 - mob.getToxLoss() - mob.getFireLoss() - mob.getBruteLoss() - mob.getOxyLoss()) - mob.updatehealth() - spawn(200) //in case they get revived by cryo chamber or something stupid like that, let them suicide again in 20 seconds - mob.suiciding = 0 - - -// === burn brute toxin clone brain damage symptoms - Bone White === - -/datum/disease2/effect/burn_major - name = "Blood Plasma Pyroclastia" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.take_overall_damage(0,15) - -/datum/disease2/effect/brute_major - name = "Exploding Cell Phenomenon" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.take_overall_damage(15,0) - -/datum/disease2/effect/toxin_major - name = "Acute Kidney Failure" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.adjustToxLoss(15*multiplier) - -/datum/disease2/effect/clone_major - name = "Reverse Pattern Syndrome" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.bodytemperature = max(mob.bodytemperature, 350) - scramble(0,mob,10) - mob.apply_damage(10, CLONE) - -/datum/disease2/effect/brain_major - name = "Cortical Liquification" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - var/obj/item/organ/internal/brain/B = H.get_int_organ(/obj/item/organ/internal/brain) - if (B.damage < B.min_broken_damage) - B.take_damage(5, 1) - else - mob.setBrainLoss(50) - - - -/datum/disease2/effect/organs - name = "Shutdown Syndrome" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - var/organ = pick(list("r_arm","l_arm","r_leg","r_leg")) - var/obj/item/organ/external/E = H.organs_by_name[organ] - if (!(E.status & ORGAN_DEAD) && !(E.status & ORGAN_ROBOT)) - E.status |= ORGAN_DEAD - H << "You can't feel your [E.name] anymore..." - for (var/obj/item/organ/external/C in E.children) - C.status |= ORGAN_DEAD - H.update_body(1) - if(multiplier < 1) multiplier = 1 - H.adjustToxLoss(10*multiplier) - vampire - stage = 3 - - deactivate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - for (var/obj/item/organ/external/E in H.organs) - if(!(E.status & ORGAN_ROBOT)) - E.status &= ~ORGAN_DEAD - for (var/obj/item/organ/external/C in E.children) - C.status &= ~ORGAN_DEAD - - -/datum/disease2/effect/immortal - name = "Longevity Syndrome" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - for (var/obj/item/organ/external/E in H.organs) - if (E.status & ORGAN_BROKEN && prob(30) && !(E.status & ORGAN_ROBOT)) - E.status ^= ORGAN_BROKEN - var/heal_amt = -5*multiplier - mob.apply_damages(heal_amt,heal_amt,heal_amt,heal_amt) - -/datum/disease2/effect/gmagnitis - name = "Greater Magnitis" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - for(var/obj/M in orange(6,mob)) - if(!M.anchored && (M.flags & CONDUCT)) - var/i - var/iter = rand(1,3) - for(i=0,i Your body burns as your cells break down." - shake_camera(mob,5*multiplier) - - -/datum/disease2/effect/necrosis - name = "Necrosis" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - // - var/mob/living/carbon/human/H = mob - // - var/inst = pick(1,2,3) - switch(inst) - if(1) - mob << "A chunk of meat falls off you!" - var/totalslabs = 1 - var/obj/item/weapon/reagent_containers/food/snacks/meat/allmeat[totalslabs] - if( istype(mob, /mob/living/carbon/human/) ) - // - var/sourcename = mob.real_name - var/sourcejob = mob.job - var/sourcenutriment = mob.nutrition / 15 - //var/sourcetotalreagents = mob.reagents.total_volume - for(var/i=1 to totalslabs) - var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new - newmeat.name = sourcename + newmeat.name - newmeat.subjectname = sourcename - newmeat.subjectjob = sourcejob - newmeat.reagents.add_reagent("nutriment", sourcenutriment / totalslabs) // Thehehe. Fat guys go first - //src.occupant.reagents.trans_to(newmeat, round (sourcetotalreagents / totalslabs, 1)) // Transfer all the reagents from the - allmeat[i] = newmeat - var/obj/item/meatslab = allmeat[i] - var/turf/Tx = locate(mob.x, mob.y, mob.z) - meatslab.loc = mob.loc - meatslab.throw_at(Tx,i,3) - if (!Tx.density) - new /obj/effect/decal/cleanable/blood/gibs(Tx,i) - if(2) - if(ishuman(mob)) - for (var/obj/item/organ/external/E in H.organs) - if(pick(1,0) && !(E.status & ORGAN_ROBOT)) - E.droplimb(0,DROPLIMB_EDGE) - if(3) - if(ishuman(mob)) - if(H.species.name != "Skeleton") - mob << " Your necrotic skin ruptures!" - for (var/obj/item/organ/external/E in H.organs) - if(pick(1,0) && !(E.status & ORGAN_ROBOT)) - E.createwound(CUT, pick(2,4)) - if(prob(30)) - if(H.species.name != "Skeleton") - if(H.set_species("Skeleton")) - mob << " A massive amount of flesh sloughs off your bones!" - H.regenerate_icons() - else - return - - -/datum/disease2/effect/plasma - name = "Toxin Sublimation" - stage = 4 - activate(var/mob/living/carbon/mob,var/multiplier) - //var/src = mob - var/hack = mob.loc - var/turf/simulated/T = get_turf(hack) - if(!T) - return - var/datum/gas_mixture/GM = new - if(prob(10)) - GM.toxins += 100 - //GM.temperature = 1500+T0C //should be enough to start a fire - mob << "\red You exhale a large plume of toxic gas!" - else - GM.toxins += 10 - GM.temperature = istype(T) ? T.air.temperature : T20C - mob << " A toxic gas emanates from your pores!" - T.assume_air(GM) - return - - -////////////////////////STAGE 3///////////////////////////////// - -/datum/disease2/effect/brain_regen - name = "Regenerative Synapse Effect" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - if (mob.reagents.get_reagent_amount("mannitol") < 10) - mob.reagents.add_reagent("mannitol", 10) - -/datum/disease2/effect/haloperidol - name = "Psyche Collapse Syndrome" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - if (mob.reagents.get_reagent_amount("haloperidol") < 10) - mob.reagents.add_reagent("haloperidol", 1) - -/datum/disease2/effect/pain_major - name = "Phantom Pain Syndrome" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - if (mob.staminaloss < 100) - mob << " You feel like your body is on fire. Make the pain stop!" - mob.apply_effect(20,STAMINA,0) - -// === burn brute toxin clone brain damage symptoms - Bone White === - -/datum/disease2/effect/burn - name = "Flammable inflammation" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.take_overall_damage(0,5) - -/datum/disease2/effect/brute - name = "Continuous Contusions" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.take_overall_damage(5,0) - -/datum/disease2/effect/toxin - name = "Hyperacidity" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.adjustToxLoss(15*multiplier) - -/datum/disease2/effect/clone - name = "DNA Breakdown Effect" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.bodytemperature = max(mob.bodytemperature, 350) - scramble(0,mob,5) - mob.apply_damage(5, CLONE) - -/datum/disease2/effect/brain - name = "Synapse Distancing" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - var/obj/item/organ/internal/brain/B = H.get_int_organ(/obj/item/organ/internal/brain) - if (B.damage < B.min_broken_damage) - B.take_damage(1, 1) - else - mob.setBrainLoss(10) - - -/datum/disease2/effect/lantern_major - name = "Lantern Syndrome" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.set_light(5) - mob << "You are glowing brightly!" - - -/datum/disease2/effect/cough_major - name = "Acute Tussis" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*cough") - for(var/mob/living/carbon/M in oview(3,mob)) - mob.spread_disease_to(M) - - -/datum/disease2/effect/bones - name = "Fragile Bones Syndrome" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - for (var/obj/item/organ/external/E in H.organs) - if(!(E.status & ORGAN_ROBOT)) - E.min_broken_damage = max(5, E.min_broken_damage - 30) - - deactivate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - for (var/obj/item/organ/external/E in H.organs) - if(!(E.status & ORGAN_ROBOT)) - E.min_broken_damage = initial(E.min_broken_damage) - -/datum/disease2/effect/shakey - name = "World Shaking Syndrome" - stage = 3 - maxm = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - shake_camera(mob,5*multiplier) - -/datum/disease2/effect/telepathic - name = "Telepathy Syndrome" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.dna.check_integrity() - mob.dna.SetSEState(REMOTETALKBLOCK,1) - domutcheck(mob, null) - -/datum/disease2/effect/hallucinations - name = "Hallucinational Syndrome" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.hallucination += 25 - -/datum/disease2/effect/deaf - name = "Hard of Hearing Syndrome" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.ear_deaf = 5 - -/datum/disease2/effect/giggle - name = "Uncontrolled Laughter Effect" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*giggle") - -/datum/disease2/effect/confusion - name = "Topographical Cretinism" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob << "You have trouble telling right and left apart all of a sudden." - mob.confused += 10 - -/datum/disease2/effect/groan - name = "Groaning Syndrome" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*groan") - -/datum/disease2/effect/lmagnitis - name = "Lesser Magnitis" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - for(var/obj/M in orange(4,mob)) - if(!M.anchored && (M.flags & CONDUCT)) - var/i - var/iter = rand(1,2) - for(i=0,iYou feel a little horse!" - - -/obj/item/clothing/mask/horsehead/magic - //flags_inv = null //so you can still see their face... no. How can you recognize someone when their face is completely different? - voicechange = 1 //NEEEEIIGHH - - dropped(mob/user as mob) - flags &= ~NODROP - ..() - - equipped(var/mob/user, var/slot) - if (slot == slot_wear_mask) - flags |= NODROP //curses! - ..() - -////////////////////////STAGE 2///////////////////////////////// - - -/datum/disease2/effect/pain - name = "Acute Muscle Ache" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - if (mob.staminaloss < 50) - mob << "You ache all over!" - mob.apply_effect(10,STAMINA,0) - -// === burn brute toxin clone brain damage symptoms - Bone White === - -/datum/disease2/effect/burn - name = "Prickly Heat Syndrome" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.take_overall_damage(0,2) - -/datum/disease2/effect/brute - name = "Continuous Contusions" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.take_overall_damage(2,0) - -/datum/disease2/effect/toxin - name = "White Blood Cell Putrification" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.adjustToxLoss(5*multiplier) - -/datum/disease2/effect/clone - name = "RNA Compound Corruption" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.bodytemperature = max(mob.bodytemperature, 350) - scramble(0,mob,5) - mob.apply_damage(5, CLONE) - -/datum/disease2/effect/brain - name = "Synapse Distancing" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - var/obj/item/organ/internal/brain/B = H.get_int_organ(/obj/item/organ/internal/brain) - if (B.damage < B.min_broken_damage) - B.take_damage(0.5, 1) - else - mob.setBrainLoss(5) - - -/datum/disease2/effect/scream - name = "Loudness Syndrome" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*scream") - -/datum/disease2/effect/drowsness - name = "Automated Sleeping Syndrome" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.drowsyness += 10 - -/datum/disease2/effect/sleepy - name = "Resting Syndrome" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*collapse") - -/datum/disease2/effect/blind - name = "Blackout Syndrome" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.eye_blind = max(mob.eye_blind, 4) - -/datum/disease2/effect/cough - name = "Anima Syndrome" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*cough") - for(var/mob/living/carbon/M in oview(2,mob)) - mob.spread_disease_to(M) - -/datum/disease2/effect/hungry - name = "Appetiser Effect" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.nutrition = max(0, mob.nutrition - 200) - -/datum/disease2/effect/fridge - name = "Refridgerator Syndrome" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*shiver") - -/datum/disease2/effect/hair - name = "Hair Loss" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - if(H.species.name == "Human" && !(H.h_style == "Bald") && !(H.h_style == "Balding Hair")) - H << "Your hair starts to fall out in clumps..." - spawn(50) - H.h_style = "Balding Hair" - H.update_hair() - -/datum/disease2/effect/stimulant_major - name = "Adrenal Overload" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - if (mob.reagents.get_reagent_amount("methamphetamine") < 5) - mob.reagents.add_reagent("methamphetamine", 4) - if (prob(30)) - mob << "You feel a rush of energy inside you!" - mob.jitteriness += 10 - -/datum/disease2/effect/drunk - name = "Glasgow Syndrome" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob << "You feel like you had one hell of a party!" - if (mob.reagents.get_reagent_amount("ethanol") < 325) - mob.reagents.add_reagent("ethanol", 5*multiplier) - -/datum/disease2/effect/gaben - name = "Gaben Syndrome" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob << "Your clothing fits a little tighter!!" - if (prob(10)) - mob.reagents.add_reagent("nutriment", 1000) - mob.overeatduration = 1000 - - -/datum/disease2/effect/beard - name = "Bearding" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - if(istype(mob, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mob - if(H.species.name == "Human" && !(H.f_style == "Full Beard")) - H << "Your chin and neck itch!." - spawn(50) - H.f_style = "Full Beard" - H.update_fhair() - -/datum/disease2/effect/bloodynose - name = "Intranasal Hemorrhage" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - if (prob(30)) - var/obj/effect/decal/cleanable/blood/D= locate(/obj/effect/decal/cleanable/blood) in get_turf(mob) - if(D==null) - D = new(get_turf(mob)) - D.virus2 |= virus_copylist(mob.virus2) - mob.reagents.remove_reagent("blood", 5) // Bone White - Blood loss when coughing up blood, experimental, may need adjusting. - - -/datum/disease2/effect/lantern - name = "Lantern Syndrome" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.set_light(4) - mob << "You are glowing!" - - -/datum/disease2/effect/optimistic - name = "Full Glass Syndrome" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - mob << " You feel optimistic!" - if (mob.reagents.get_reagent_amount("salglu_solution") < 1) - mob.reagents.add_reagent("salglu_solution", 1) - - -////////////////////////STAGE 1///////////////////////////////// - -/datum/disease2/effect/poop - name = "Uncontrollable Bowel Syndrome" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.fakepoop() - - -/datum/disease2/effect/vomit - name = "Projectile Vomit Syndrome" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.fakevomit() - -/datum/disease2/effect/pain_minor - name = "Heightened Sensitivity" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - if (mob.staminaloss < 20) - mob << "Your body aches." - mob.apply_effect(5,STAMINA,0) - -/datum/disease2/effect/stimulant - name = "Adrenaline Extra" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - if (mob.reagents.get_reagent_amount("ephedrine") < 10) - mob.reagents.add_reagent("ephedrine", 4) - if (prob(30)) - mob << "You feel a rush of energy inside you!" - mob.jitteriness += 10 - -/datum/disease2/effect/cough_minor - name = "Trachea Sensitivity" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*cough") - for(var/mob/living/carbon/M in oview(1,mob)) - mob.spread_disease_to(M) - -/datum/disease2/effect/sneeze - name = "Coldingtons Effect" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - if (prob(30)) - mob << "You feel like you are about to sneeze!" - sleep(5) - mob.say("*sneeze") - for(var/mob/living/carbon/M in get_step(mob,mob.dir)) - mob.spread_disease_to(M) - if (prob(50)) - var/obj/effect/decal/cleanable/mucus/M= locate(/obj/effect/decal/cleanable/mucus) in get_turf(mob) - if(M==null) - M = new(get_turf(mob)) - else - if(M.dry) - M.dry=0 - M.virus2 |= virus_copylist(mob.virus2) - -/datum/disease2/effect/gunck - name = "Flemmingtons" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - mob << " Mucous runs down the back of your throat." - -/datum/disease2/effect/drool - name = "Saliva Effect" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*drool") - -/datum/disease2/effect/twitch - name = "Twitcher" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.say("*twitch") - -/datum/disease2/effect/headache - name = "Headache" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - mob << " Your head hurts a bit" - -/datum/disease2/effect/itching - name = "Itching" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - mob << "Your skin itches!" - -/datum/disease2/effect/drained - name = "Drained Feeling" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - mob << "You feel drained." - -/datum/disease2/effect/eyewater - name = "Watery Eyes" - stage = 1 - activate(var/mob/living/carbon/human/mob,var/multiplier) - var/obj/item/organ/internal/eyes/E = mob.get_int_organ(/obj/item/organ/internal/eyes) - if(!istype(E) || (E.status & ORGAN_ROBOT)) // No eyes or robotic eyes? No problem! - return - mob << "Your eyes sting and water!" - -/datum/disease2/effect/wheeze - name = "Wheezing" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.custom_emote(1,"wheezes.") - - -/datum/disease2/effect/optimistic_minor - name = "Glass Half Full Syndrome" - stage = 1 - activate(var/mob/living/carbon/mob,var/multiplier) - mob << " You feel optimistic!" - -/datum/disease2/effect/anxiety - name = "Severe Anxiety" - stage = 2 - activate(var/mob/living/carbon/mob,var/multiplier) - if(prob(20)) - mob << "You feel anxious." - if(prob(15)) - mob << "You feel butterflies in your stomach." - if(prob(11)) - mob.visible_message("[mob] stumbles around in a panic.", \ - "You have a panic attack!") - mob.confused += (rand(6,8)) - mob.jitteriness += (rand(6,8)) - if(prob(10)) - mob.visible_message("[mob] coughs up butterflies!", \ - "You cough up butterflies!") - new /mob/living/simple_animal/butterfly(mob.loc) - new /mob/living/simple_animal/butterfly(mob.loc) - -/datum/disease2/effect/lycan - name = "Lycancoughy" - stage = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - if(prob(20)) - mob << "You feel itchy." - if(prob(15)) - mob << "You have the sudden urge for bacon.." - if(prob(11)) - mob.say(pick("WOOF!", "BARK!", "Bark.", "Woof?", "AUUUUUUUUUUUUU!!")) - if(prob(10)) - mob.visible_message("[mob] coughs up a dog!!", \ - "You cough up a DOG!!!") - //yes i KNOW foxes technically are not normal dogs...hush.... - var/randompup = pick(/mob/living/simple_animal/pet/corgi/puppy,/mob/living/simple_animal/pet/pug,/mob/living/simple_animal/pet/fox) - - new randompup(mob.loc) - mob.adjustBruteLoss(rand(1,5))//you just coughed up a CANINIE, you are taking brute loss... \ No newline at end of file diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm deleted file mode 100644 index 6efe54663f9..00000000000 --- a/code/modules/virus2/helpers.dm +++ /dev/null @@ -1,150 +0,0 @@ -//Returns 1 if mob can be infected, 0 otherwise. Checks his clothing. -proc/get_infection_chance(var/mob/living/carbon/M, var/vector = "Airborne") - var/score = 0 - if (!istype(M)) - return 0 - - var/mob/living/carbon/human/H = M - if(istype(H) && H.species.virus_immune) - return 0 - - if(istype(M, /mob/living/carbon/human)) - if (vector == "Airborne") - if(M.internal) //not breathing infected air helps greatly - score = 30 - if(M.wear_mask) - score += 5 - if(istype(M:wear_mask, /obj/item/clothing/mask/surgical) && !M.internal) - score += 10 - if(istype(M:wear_suit, /obj/item/clothing/suit/space) && istype(M:head, /obj/item/clothing/head/helmet/space)) - score += 20 - if(istype(M:wear_suit, /obj/item/clothing/suit/bio_suit) && istype(M:head, /obj/item/clothing/head/bio_hood)) - score += 30 - - - if (vector == "Contact") - if(M:gloves) score += 15 - if(istype(M:wear_suit, /obj/item/clothing/suit/space) && istype(M:head, /obj/item/clothing/head/helmet/space)) - score += 15 - if(istype(M:wear_suit, /obj/item/clothing/suit/bio_suit) && istype(M:head, /obj/item/clothing/head/bio_hood)) - score += 15 - - if (vector == "Injection") score = 30 // Makes sure Injection viruses cannot be caught normally - - -// log_debug("[M]'s resistance to [vector] viruses: [score]") - - if(score >= 30) - return 0 - else if(score == 25 && prob(99)) - return 0 - else if(score == 20 && prob(95)) - return 0 - else if(score == 15 && prob(75)) - return 0 - else if(score == 10 && prob(55)) - return 0 - else if(score == 5 && prob(35)) - return 0 - return 1 - -//Checks if table-passing table can reach target (5 tile radius) -proc/airborne_can_reach(turf/source, turf/target, var/radius=5) - var/obj/dummy = new(source) - dummy.pass_flags = PASSTABLE - - for(var/i=0, i 0) - for (var/ID in virus2) - log_debug("Attempting virus [ID]") - var/datum/disease2/disease/V = virus2[ID] - if(V.spreadtype != vector) continue - - if (vector == "Airborne") - if(airborne_can_reach(get_turf(src), get_turf(victim))) -// log_debug("In range, infecting") - infect_virus2(victim,V) -// else -// log_debug("Could not reach target") - - if (vector == "Contact") - if (in_range(src, victim)) -// log_debug("In range, infecting") - infect_virus2(victim,V) - -//contact goes both ways - if (victim.virus2.len > 0 && vector == "Contact") -// log_debug("Spreading [vector] diseases from [victim] to [src]") - var/nudity = 1 - - if (ishuman(victim)) - var/mob/living/carbon/human/H = victim - var/obj/item/organ/external/select_area = H.get_organ(src.zone_sel.selecting) - var/list/clothes = list(H.head, H.wear_mask, H.wear_suit, H.w_uniform, H.gloves, H.shoes) - for(var/obj/item/clothing/C in clothes ) - if(C && istype(C)) - if(C.body_parts_covered & select_area.body_part) - nudity = 0 - if (nudity) - for (var/ID in victim.virus2) - var/datum/disease2/disease/V = victim.virus2[ID] - if(V && V.spreadtype != vector) continue - infect_virus2(src,V) diff --git a/code/modules/virus2/isolator.dm b/code/modules/virus2/isolator.dm deleted file mode 100644 index 479b2c7b4d6..00000000000 --- a/code/modules/virus2/isolator.dm +++ /dev/null @@ -1,234 +0,0 @@ -// UI menu navigation -#define HOME "home" -#define LIST "list" -#define ENTRY "entry" - -/obj/machinery/disease2/isolator/ - name = "Pathogenic Isolator" - density = 1 - anchored = 1 - icon = 'icons/obj/virology.dmi' - icon_state = "isolator" - var/isolating = 0 - var/state = HOME - var/datum/disease2/disease/virus2 = null - var/datum/data/record/entry = null - var/obj/item/weapon/reagent_containers/syringe/sample = null - -/obj/machinery/disease2/isolator/update_icon() - if (stat & (BROKEN|NOPOWER)) - icon_state = "isolator" - return - - if (isolating) - icon_state = "isolator_processing" - else if (sample) - icon_state = "isolator_in" - else - icon_state = "isolator" - -/obj/machinery/disease2/isolator/attackby(var/obj/O as obj, var/mob/user, params) - if(!istype(O,/obj/item/weapon/reagent_containers/syringe)) return - var/obj/item/weapon/reagent_containers/syringe/S = O - - if(sample) - user << "\The [src] is already loaded." - return - - sample = S - user.drop_item() - S.loc = src - - user.visible_message("[user] adds \a [O] to \the [src]!", "You add \a [O] to \the [src]!") - nanomanager.update_uis(src) - update_icon() - - src.attack_hand(user) - -/obj/machinery/disease2/isolator/attack_hand(mob/user as mob) - if(stat & (NOPOWER|BROKEN)) return - ui_interact(user) - -/obj/machinery/disease2/isolator/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - user.set_machine(src) - - var/data[0] - data["syringe_inserted"] = !!sample - data["isolating"] = isolating - data["pathogen_pool"] = null - data["state"] = state - data["entry"] = entry - data["can_print"] = (state != HOME || sample) && !isolating - - switch (state) - if (HOME) - if (sample) - var/list/pathogen_pool[0] - for(var/datum/reagent/blood/B in sample.reagents.reagent_list) - var/list/virus = B.data["virus2"] - for (var/ID in virus) - var/datum/disease2/disease/V = virus[ID] - var/datum/data/record/R = null - if (ID in virusDB) - R = virusDB[ID] - - var/mob/living/carbon/human/D = B.data["donor"] - pathogen_pool.Add(list(list(\ - "name" = "[D.get_species()] [B.name]", \ - "dna" = B.data["blood_DNA"], \ - "unique_id" = V.uniqueID, \ - "reference" = "\ref[V]", \ - "is_in_database" = !!R, \ - "record" = "\ref[R]"))) - - if (pathogen_pool.len > 0) - data["pathogen_pool"] = pathogen_pool - - if (LIST) - var/list/db[0] - for (var/ID in virusDB) - var/datum/data/record/r = virusDB[ID] - db.Add(list(list("name" = r.fields["name"], "record" = "\ref[r]"))) - - if (db.len > 0) - data["database"] = db - - if (ENTRY) - if (entry) - var/desc = entry.fields["description"] - data["entry"] = list(\ - "name" = entry.fields["name"], \ - "description" = replacetext(desc, "\n", "")) - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "pathogenic_isolator.tmpl", src.name, 400, 500) - ui.set_initial_data(data) - ui.open() - -/obj/machinery/disease2/isolator/process() - if (isolating > 0) - isolating -= 1 - if (isolating == 0) - if (virus2) - var/obj/item/weapon/virusdish/d = new /obj/item/weapon/virusdish(src.loc) - d.virus2 = virus2.getcopy() - virus2 = null - ping("\The [src] pings, \"Viral strain isolated.\"") - - nanomanager.update_uis(src) - update_icon() - -/obj/machinery/disease2/isolator/Topic(href, href_list) - if (..()) return 0 - - var/mob/user = usr - var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main") - - src.add_fingerprint(user) - - if (href_list["close"]) - user.unset_machine() - ui.close() - return 0 - - if (href_list[HOME]) - state = HOME - return 1 - - if (href_list[LIST]) - state = LIST - return 1 - - if (href_list[ENTRY]) - if (istype(locate(href_list["view"]), /datum/data/record)) - entry = locate(href_list["view"]) - - state = ENTRY - return 1 - - if (href_list["print"]) - print(user) - return 1 - - if(!sample) return 1 - - if (href_list["isolate"]) - var/datum/disease2/disease/V = locate(href_list["isolate"]) - if (V) - virus2 = V - isolating = 20 - update_icon() - return 1 - - if (href_list["eject"]) - sample.loc = src.loc - sample = null - update_icon() - return 1 - -/obj/machinery/disease2/isolator/proc/print(var/mob/user) - playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc) - - switch (state) - if (HOME) - if (!sample) return - P.name = "paper - Patient Diagnostic Report" - P.info = {" - [virology_letterhead("Patient Diagnostic Report")] -
CONFIDENTIAL MEDICAL REPORT

- Sample: [sample.name]
-"} - - if (user) - P.info += "Generated By: [user.name]
" - - P.info += "
" - - for(var/datum/reagent/blood/B in sample.reagents.reagent_list) - var/mob/living/carbon/human/D = B.data["donor"] - P.info += "[D.get_species()] [B.name]:
[B.data["blood_DNA"]]
" - - var/list/virus = B.data["virus2"] - P.info += "Pathogens:
" - if (virus.len > 0) - for (var/ID in virus) - var/datum/disease2/disease/V = virus[ID] - P.info += "[V.name()]
" - else - P.info += "None
" - - P.info += {" -
- Additional Notes:  -"} - - if (LIST) - P.name = "paper - Virus List" - P.info = {" - [virology_letterhead("Virus List")] -"} - - var/i = 0 - for (var/ID in virusDB) - i++ - var/datum/data/record/r = virusDB[ID] - P.info += "[i]. " + r.fields["name"] - P.info += "
" - - P.info += {" -
- Additional Notes:  -"} - - if (ENTRY) - P.name = "paper - Viral Profile" - P.info = {" - [virology_letterhead("Viral Profile")] - [entry.fields["description"]] -
- Additional Notes:  -"} - - state("The nearby computer prints out a report.") diff --git a/code/modules/virus2/items_devices.dm b/code/modules/virus2/items_devices.dm deleted file mode 100644 index e56a99ea9a5..00000000000 --- a/code/modules/virus2/items_devices.dm +++ /dev/null @@ -1,104 +0,0 @@ -///////////////ANTIBODY SCANNER/////////////// - -/obj/item/device/antibody_scanner - name = "\improper Antibody Scanner" - desc = "Scans living beings for antibodies in their blood." - icon_state = "antibody" - w_class = 2.0 - item_state = "electronic" - flags = CONDUCT - -/obj/item/device/antibody_scanner/attack(mob/M as mob, mob/user as mob) - if(!istype(M,/mob/living/carbon/)) - report("Scan aborted: Incompatible target.", user) - return - - var/mob/living/carbon/C = M - if (istype(C,/mob/living/carbon/human/)) - var/mob/living/carbon/human/H = C - if(H.species && H.species.flags & NO_BLOOD) - report("Scan aborted: The target does not have blood.", user) - return - - if(!C.antibodies) - report("Scan Complete: No antibodies detected.", user) - return - - if (CLUMSY in user.mutations && prob(50)) - // I was tempted to be really evil and rot13 the output. - report("Antibodies detected: [reverse_text(antigens2string(C.antibodies))]", user) - else - report("Antibodies detected: [antigens2string(C.antibodies)]", user) - -/obj/item/device/antibody_scanner/proc/report(var/text, mob/user as mob) - user << "\blue \icon[src] \The [src] beeps, \"[text]\"" - -///////////////VIRUS DISH/////////////// - -/obj/item/weapon/virusdish - name = "virus containment/growth dish" - icon = 'icons/obj/items.dmi' - icon_state = "implantcase-b" - var/datum/disease2/disease/virus2 = null - var/growth = 0 - var/info = 0 - var/analysed = 0 - -/obj/item/weapon/virusdish/random - name = "virus sample" - -/obj/item/weapon/virusdish/random/New() - ..() - src.virus2 = new /datum/disease2/disease - src.virus2.makerandom(0, 1) // Virus dishes get minor effects only on creation, and have a chance of being injection type - growth = rand(5, 50) - -/obj/item/weapon/virusdish/attackby(var/obj/item/weapon/W as obj,var/mob/living/carbon/user as mob, params) - if(istype(W,/obj/item/weapon/hand_labeler) || istype(W,/obj/item/weapon/reagent_containers/syringe)) - return - ..() - if(prob(50)) - user << "\The [src] shatters!" - if(virus2.infectionchance > 0) - for(var/mob/living/carbon/target in view(1, get_turf(src))) - if(airborne_can_reach(get_turf(src), get_turf(target))) - if(get_infection_chance(target)) - infect_virus2(target,src.virus2) - qdel(src) - -/obj/item/weapon/virusdish/examine(mob/user) - user << "This is a virus containment dish." - if(src.info) - user << "It has the following information about its contents:" - user << src.info - -/obj/item/weapon/ruinedvirusdish - name = "ruined virus sample" - icon = 'icons/obj/items.dmi' - icon_state = "implantcase-b" - desc = "The bacteria in the dish are completely dead." - -/obj/item/weapon/ruinedvirusdish/attackby(var/obj/item/weapon/W as obj,var/mob/living/carbon/user as mob, params) - if(istype(W,/obj/item/weapon/hand_labeler) || istype(W,/obj/item/weapon/reagent_containers/syringe)) - return ..() - - if(prob(50)) - user << "\The [src] shatters!" - qdel(src) - -///////////////GNA DISK/////////////// - -/obj/item/weapon/diseasedisk - name = "blank GNA disk" - icon = 'icons/obj/cloning.dmi' - icon_state = "datadisk0" - var/datum/disease2/effectholder/effect = null - var/list/species = null - var/stage = 1 - var/analysed = 1 - -/obj/item/weapon/diseasedisk/premade/New() - name = "blank GNA disk (stage: [stage])" - effect = new /datum/disease2/effectholder - effect.effect = new /datum/disease2/effect/invisible - effect.stage = stage diff --git a/icons/effects/poop.dmi b/icons/effects/poop.dmi deleted file mode 100644 index 3c5b32e6543..00000000000 Binary files a/icons/effects/poop.dmi and /dev/null differ diff --git a/nano/templates/virus2_creator.tmpl b/nano/templates/virus2_creator.tmpl deleted file mode 100644 index bea02ed786a..00000000000 --- a/nano/templates/virus2_creator.tmpl +++ /dev/null @@ -1,82 +0,0 @@ - -
-
- Spread to: -
-
- {{:helper.link(data.virus_target ? data.virus_target : "Random", null, {"setTarget" : 1})}} -
-
- -{{:helper.link("Spread", null, {"spreadToTarget" : 1}, null, "notice")}} - -

Virus Creation

-
-
- Virus: -
-
- {{:helper.link(data.curr_virus ? data.curr_virus : "Create", null, {"createVirus" : 1})}} - {{:helper.link("Delete", null, {"deleteCurrVirus" : 1})}} -
-
- - - -{{if data.curr_virus}} -
-

Stats

-
-
- Antigen: -
-
- {{:data.virusStats.antigen}} -
-
- -
-
- Spread: -
-
- {{:data.virusStats.spreadType}} -
-
- -
-
- Speed: -
-
- {{:data.virusStats.speed}} -
-
- -
-
- Affected Species: -
-
- {{:data.virusStats.affectedSpecies}} -
-
-
-

Effects

- {{for data.virus_effects}} -
-
- {{:helper.link(value.name, null, {"changeEffect" : value.stage})}} -
-
- {{:helper.link("Stage: " + value.stage, null, null, null, "linkOff")}} - {{:helper.link("Chance: " + value.chance, null, {"changeStat" : "C", "cSEffect" : value.stage})}} - {{:helper.link("Multiplier: " + value.multiplier, null, {"changeStat" : "M", "cSEffect" : value.stage})}} - {{:helper.link("Badness: " + value.badness, null, null, null, "linkOff")}} -
-
- {{/for}} -{{/if}} \ No newline at end of file diff --git a/paradise.dme b/paradise.dme index f2e230118ac..5828f4e1f83 100644 --- a/paradise.dme +++ b/paradise.dme @@ -157,6 +157,7 @@ #include "code\controllers\Processes\air.dm" #include "code\controllers\Processes\alarm.dm" #include "code\controllers\Processes\bot.dm" +#include "code\controllers\Processes\diseases.dm" #include "code\controllers\Processes\event.dm" #include "code\controllers\Processes\garbage.dm" #include "code\controllers\Processes\inactivity.dm" @@ -201,6 +202,55 @@ #include "code\datums\cache\cache.dm" #include "code\datums\cache\crew.dm" #include "code\datums\cache\powermonitor.dm" +#include "code\datums\diseases\_disease.dm" +#include "code\datums\diseases\_MobProcs.dm" +#include "code\datums\diseases\anxiety.dm" +#include "code\datums\diseases\appendicitis.dm" +#include "code\datums\diseases\beesease.dm" +#include "code\datums\diseases\brainrot.dm" +#include "code\datums\diseases\cold.dm" +#include "code\datums\diseases\cold9.dm" +#include "code\datums\diseases\fake_gbs.dm" +#include "code\datums\diseases\flu.dm" +#include "code\datums\diseases\fluspanish.dm" +#include "code\datums\diseases\gbs.dm" +#include "code\datums\diseases\magnitis.dm" +#include "code\datums\diseases\pierrot_throat.dm" +#include "code\datums\diseases\retrovirus.dm" +#include "code\datums\diseases\rhumba_beat.dm" +#include "code\datums\diseases\transformation.dm" +#include "code\datums\diseases\tuberculosis.dm" +#include "code\datums\diseases\wizarditis.dm" +#include "code\datums\diseases\advance\advance.dm" +#include "code\datums\diseases\advance\presets.dm" +#include "code\datums\diseases\advance\symptoms\beard.dm" +#include "code\datums\diseases\advance\symptoms\choking.dm" +#include "code\datums\diseases\advance\symptoms\confusion.dm" +#include "code\datums\diseases\advance\symptoms\cough.dm" +#include "code\datums\diseases\advance\symptoms\damage_converter.dm" +#include "code\datums\diseases\advance\symptoms\deafness.dm" +#include "code\datums\diseases\advance\symptoms\dizzy.dm" +#include "code\datums\diseases\advance\symptoms\fever.dm" +#include "code\datums\diseases\advance\symptoms\fire.dm" +#include "code\datums\diseases\advance\symptoms\flesh_eating.dm" +#include "code\datums\diseases\advance\symptoms\hallucigen.dm" +#include "code\datums\diseases\advance\symptoms\headache.dm" +#include "code\datums\diseases\advance\symptoms\heal.dm" +#include "code\datums\diseases\advance\symptoms\itching.dm" +#include "code\datums\diseases\advance\symptoms\oxygen.dm" +#include "code\datums\diseases\advance\symptoms\sensory.dm" +#include "code\datums\diseases\advance\symptoms\shedding.dm" +#include "code\datums\diseases\advance\symptoms\shivering.dm" +#include "code\datums\diseases\advance\symptoms\skin.dm" +#include "code\datums\diseases\advance\symptoms\sneeze.dm" +#include "code\datums\diseases\advance\symptoms\stimulant.dm" +#include "code\datums\diseases\advance\symptoms\symptoms.dm" +#include "code\datums\diseases\advance\symptoms\viral.dm" +#include "code\datums\diseases\advance\symptoms\voice_change.dm" +#include "code\datums\diseases\advance\symptoms\vomit.dm" +#include "code\datums\diseases\advance\symptoms\weakness.dm" +#include "code\datums\diseases\advance\symptoms\weight.dm" +#include "code\datums\diseases\advance\symptoms\youth.dm" #include "code\datums\helper_datums\construction_datum.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\global_iterator.dm" @@ -1201,8 +1251,6 @@ #include "code\modules\events\tear.dm" #include "code\modules\events\undead.dm" #include "code\modules\events\vent_clog.dm" -#include "code\modules\events\viral_infection.dm" -#include "code\modules\events\viral_outbreak.dm" #include "code\modules\events\wallrot.dm" #include "code\modules\events\wormholes.dm" #include "code\modules\examine\examine.dm" @@ -1561,7 +1609,6 @@ #include "code\modules\nano\modules\law_manager.dm" #include "code\modules\nano\modules\nano_module.dm" #include "code\modules\nano\modules\power_monitor.dm" -#include "code\modules\nano\modules\virus2_creator.dm" #include "code\modules\ninja\energy_katana.dm" #include "code\modules\ninja\suit\gloves.dm" #include "code\modules\ninja\suit\head.dm" @@ -1689,6 +1736,7 @@ #include "code\modules\reagents\Chemistry-Readme.dm" #include "code\modules\reagents\dartgun.dm" #include "code\modules\reagents\grenade_launcher.dm" +#include "code\modules\reagents\pandemic.dm" #include "code\modules\reagents\reagent_containers.dm" #include "code\modules\reagents\reagent_dispenser.dm" #include "code\modules\reagents\newchem\Blob-Reagents.dm" @@ -1920,17 +1968,6 @@ #include "code\modules\vehicle\train\trains\cargo\cargo_subtypes\fourwheeler.dm" #include "code\modules\vehicle\train\trains\cargo\cargo_subtypes\motorcycle.dm" #include "code\modules\vehicle\train\trains\cargo\cargo_subtypes\sportscar.dm" -#include "code\modules\virus2\analyser.dm" -#include "code\modules\virus2\antibodies.dm" -#include "code\modules\virus2\centrifuge.dm" -#include "code\modules\virus2\curer.dm" -#include "code\modules\virus2\disease2.dm" -#include "code\modules\virus2\diseasesplicer.dm" -#include "code\modules\virus2\dishincubator.dm" -#include "code\modules\virus2\effect.dm" -#include "code\modules\virus2\helpers.dm" -#include "code\modules\virus2\isolator.dm" -#include "code\modules\virus2\items_devices.dm" #include "interface\interface.dm" #include "interface\stylesheet.dm" #include "interface\skin.dmf"